diff --git a/.gitmodules b/.gitmodules index edcd016..94f5f0c 100644 --- a/.gitmodules +++ b/.gitmodules
@@ -597,10 +597,6 @@ path = third_party/weston/src url = https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/weston gclient-condition = checkout_linux -[submodule "third_party/xdg-utils"] - path = third_party/xdg-utils - url = https://chromium.googlesource.com/chromium/deps/xdg-utils - gclient-condition = checkout_linux [submodule "third_party/xnnpack/src"] path = third_party/xnnpack/src url = https://chromium.googlesource.com/external/github.com/google/XNNPACK
diff --git a/DEPS b/DEPS index 1765bdd..80110bbb 100644 --- a/DEPS +++ b/DEPS
@@ -308,7 +308,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'src_internal_revision': '3783a27151702721726a47f6a17af7e9c437eb88', + 'src_internal_revision': '78245b2021f438403ac0f74682e9280be4228a42', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. @@ -316,7 +316,7 @@ # 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': '10ddc719896016bd984d3c44e068eb2c6d6dcde6', + 'v8_revision': '33e9c15f2a2674c85af2869b2d7f46245eff8ac1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. @@ -332,7 +332,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. - 'boringssl_revision': '6453bd80a9fe293c0adb8ae67d5d9c233100a7b9', + 'boringssl_revision': 'ba3de4d9b41906eb7e50d69edca140ef3cec053a', # 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. @@ -360,7 +360,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling HarfBuzz # and whatever else without interference from each other. - 'harfbuzz_revision': '5d4e96ad8d00fc871ffa17707b2ca08fa850e7d6', + 'harfbuzz_revision': '6f4c5cec306d31e6822303f5ba248a14293d588e', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Emoji Segmenter # and whatever else without interference from each other. @@ -376,7 +376,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling CrossBench # and whatever else without interference from each other. - 'crossbench_revision': '10384c766b97a26cba7e377782d8dddfc09ea2a0', + 'crossbench_revision': 'd9c5ce65781b65ea6146e212dc4b261bdb758b4c', # 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': 'c46eb27afb0da6a000fb250480ca2882f96b591f', + 'devtools_frontend_revision': '0130091731a000f009b98996620bb91c3dc304d8', # 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. @@ -524,11 +524,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling llvm-libc # and whatever else without interference from each other. - 'llvm_libc_revision': 'a96728b9a94a732ec71650710949851ddf114845', + 'llvm_libc_revision': '9b08b4a339fce4aaa79c30ec303eb8edeb198290', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling llvm-libc # and whatever else without interference from each other. - 'compiler_rt_revision': '59066a662511e1f9959b07a32c88906d7212b6a7', + 'compiler_rt_revision': '84bfdcd752cb00ccc8087aeb584d3c08e9da96ba', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling clusterfuzz-data # and whatever else without interference from each other. @@ -1194,7 +1194,7 @@ 'packages': [ { 'package': 'chromium/chrome/android/orderfiles/arm', - 'version': 'brFsDc26rlRVvVzAgkPoOMPtEMiv9mBWxrpwTo5O4lkC', + 'version': 'T1rabmpnN1gCgTvKd-W_VqmVu8LkONM3fyMChC7r2zsC', }, ], 'condition': 'checkout_android and non_git_source', @@ -1205,7 +1205,7 @@ 'packages': [ { 'package': 'chromium/chrome/android/orderfiles/arm64', - 'version': '6nI0u7ZzOVRNtd0Az_RqqmEhBKMKnT8LQAf_kqQC-p0C', + 'version': 'Jmw9-TE7JwHqRLW8N5vGHJ59GmYA21J4fQkhqzMkrYgC', }, ], 'condition': 'checkout_android and non_git_source', @@ -1216,7 +1216,7 @@ 'packages': [ { 'package': 'chromium/android_webview/tools/orderfiles/arm', - 'version': 'T0JzkLGsR-l0fmL-YV1zUiKeZcm0Yp5Dbie1NcEFcFMC', + 'version': 'R6jnu34ve0i9PdKqlUv8ZS-irTdvaAwjGMj3CIbuxr4C', }, ], 'condition': 'checkout_android and non_git_source', @@ -1227,7 +1227,7 @@ 'packages': [ { 'package': 'chromium/android_webview/tools/orderfiles/arm64', - 'version': '5YJmxizbO-CvqwTuI9S5PwOqtNY10zUPybIsmazvtV8C', + 'version': 'MPoW1k9GyIONR2ZM6RUj6kl7AjHbUt9ffc1DKic5YLoC', }, ], 'condition': 'checkout_android and non_git_source', @@ -1612,7 +1612,7 @@ 'packages': [ { 'package': 'chromium/chrome/test/data/variations/cipd', - 'version': 'JzKwGfXF_zx260rb_sjdy__OTrV_l8OtTD0XrygjxwoC', + 'version': 'InkaNoq0cQZ9mqslbfI-ER_BzCRMFXRRSxnbTtfjb58C', }, ], 'condition': 'non_git_source', @@ -1624,7 +1624,7 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - 'd507352a730c95af3d4ed1fa585904ea329a4685', + '0866e4d3a520fc4673b772866ceb510dd63ed6ac', 'condition': 'checkout_android and checkout_src_internal', }, @@ -1724,7 +1724,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': 'wzjBTMka_ZRUOzMrirBfHngiFx_liKeSqVeKtVlO7FwC', + 'version': '2cwc39P1Nuw60SuLSgzP-sHbXOgoHhlhS10ck26jV3QC', }, ], 'condition': 'checkout_android and non_git_source', @@ -2072,7 +2072,7 @@ Var('chromium_git') + '/external/github.com/jk-jeon/dragonbox.git' + '@' + 'beeeef91cf6fef89a4d4ba5e95d47ca64ccb3a44', 'src/third_party/eigen3/src': - Var('chromium_git') + '/external/gitlab.com/libeigen/eigen.git' + '@' + '3578883bb3616208b8f9bb6fa03dc1fda0a16a78', + Var('chromium_git') + '/external/gitlab.com/libeigen/eigen.git' + '@' + '821ab7d3e656e6928d342e289efaf208017d4274', 'src/third_party/emoji-metadata/src': { 'url': Var('chromium_git') + '/external/github.com/googlefonts/emoji-metadata' + '@' + '045f146fca682a836e01cd265171312bfb300e06', @@ -2620,7 +2620,7 @@ Var('pdfium_git') + '/pdfium.git' + '@' + Var('pdfium_revision'), 'src/third_party/perfetto': - Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + 'd2aaedff4b9e6fdb90edfdb57f02d79c87d23a73', + Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + 'b041e451767026d64f688b3767938c0222652b31', 'src/base/tracing/test/data': { 'bucket': 'perfetto', @@ -2947,9 +2947,9 @@ Var('chromium_git') + '/external/github.com/GoogleChromeLabs/text-fragments-polyfill.git' + '@' + 'c036420683f672d685e27415de0a5f5e85bdc23f', 'src/third_party/tflite/src': - Var('chromium_git') + '/external/github.com/tensorflow/tensorflow.git' + '@' + '67d816626bf264e3b142187768601a200cbe810d', + Var('chromium_git') + '/external/github.com/tensorflow/tensorflow.git' + '@' + '8cb40fbe19ed5eb65da26078b8667e31e52211e9', 'src/third_party/litert/src': - Var('chromium_git') + '/external/github.com/google-ai-edge/LiteRT.git' + '@' + '6933ef7f5d338fb7c75f542443af104b09e0849f', + Var('chromium_git') + '/external/github.com/google-ai-edge/LiteRT.git' + '@' + '2fe783de2df129accc5c3cc551722318ed2b1f65', 'src/third_party/turbine/cipd': { 'packages': [ { @@ -2961,16 +2961,16 @@ 'dep_type': 'cipd', }, - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@0d2e0efef5f244c9816fb2ef5cd1bcdbb4b69899', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@ac3b76d7237245c9c12e82e6d480de09dbd0428a', 'src/third_party/glslang/src': '{chromium_git}/external/github.com/KhronosGroup/glslang@09c541ee5b22bbac307987b50d86ec2b4f683d75', 'src/third_party/spirv-cross/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Cross@b8fcf307f1f347089e3c46eb4451d27f32ebc8d3', 'src/third_party/spirv-headers/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Headers@465055f6c9128772e20082e893d974146acf7a02', 'src/third_party/spirv-tools/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Tools@8a13595dd4ae5049ef42d0f30297d0c427db54b5', 'src/third_party/vulkan-headers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Headers@387259ecf4b0fe0cfac161b1d0b0a74e42796710', - 'src/third_party/vulkan-loader/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Loader@9e84f0b6a16647e99b190674db1916d9e9da41a6', + 'src/third_party/vulkan-loader/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Loader@7d65e28ca4401b0c2ecc25dae5537bfe40fd39d4', 'src/third_party/vulkan-tools/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Tools@734638ea758c82b65dc7e326ae790d797d375ae3', 'src/third_party/vulkan-utility-libraries/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@c15a1ac31670cb2ce61c235f070fb40ec6e42612', - 'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@d7f9d91e8480e859bc981dd9f41f43ade56e10a4', + 'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@15693db0dfc37a4e843f6208c67f52655613c03f', 'src/third_party/vulkan_memory_allocator': Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'cb0597213b0fcb999caa9ed08c2f88dc45eb7d50', @@ -3031,13 +3031,8 @@ 'condition': 'checkout_linux', }, - 'src/third_party/xdg-utils': { - 'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'cb54d9db2e535ee4ef13cc91b65a1e2741a94a44', - 'condition': 'checkout_linux', - }, - 'src/third_party/xnnpack/src': - Var('chromium_git') + '/external/github.com/google/XNNPACK.git' + '@' + '811d0bd388ba8f4853c5560b6e16a5af3e8b895a', + Var('chromium_git') + '/external/github.com/google/XNNPACK.git' + '@' + '4334fa7cbdf8e276db976792cd21d8614910d569', 'src/third_party/libei/cipd': { @@ -3168,7 +3163,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'b6u-5r_CoKZPPW9rlEc2srVPy0ZqP4MHHrY-FeiLn5oC', + 'version': 'DescYf00MYbZ7QnKifgJJP7eFV071tNLqFINRQ41BMUC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -3179,7 +3174,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'gKrrfsoAAzIf56hZlbSqwlyiD9PrpAL-h883Wv8stjYC', + 'version': 'GNJ0Mi4ZrzKe4EDwhTJUNNpQoPYwkgj5czgpXBJO4hQC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -3671,7 +3666,7 @@ }, 'src/chrome/services/speech/internal': { - 'url': Var('chrome_git') + '/chromeos/speech.git' + '@' + '6d89c858b875cd31e2e3f151453d54bb493c735f', + 'url': Var('chrome_git') + '/chromeos/speech.git' + '@' + 'b655c01655dd92e8050a92fd7b2d8c20ce2b45a1', 'condition': 'checkout_chromeos and checkout_src_internal', }, @@ -3796,7 +3791,7 @@ 'src/ios_internal': { 'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' + - '312ccd459040e4a89d019f85830d1d2528245fd8', + 'ef823a51a66f69c08e10e7d793e0463a694c23a2', 'condition': 'checkout_ios and checkout_src_internal', },
diff --git a/OWNERS b/OWNERS index 7b552ba..66608b5 100644 --- a/OWNERS +++ b/OWNERS
@@ -236,7 +236,6 @@ per-file third_party/widevine/test/license_server=* per-file third_party/wix=* per-file third_party/wuffs/src=* -per-file third_party/xdg-utils=* per-file third_party/xnnpack/src=* per-file third_party/zstd/src=* per-file tools/page_cycler/acid3=*
diff --git a/android_webview/browser/metrics/aw_metrics_service_client.cc b/android_webview/browser/metrics/aw_metrics_service_client.cc index d84a206a..655fe04 100644 --- a/android_webview/browser/metrics/aw_metrics_service_client.cc +++ b/android_webview/browser/metrics/aw_metrics_service_client.cc
@@ -362,6 +362,11 @@ } } +PrefService* AwMetricsServiceClient::GetPrefService() const { + CHECK(init_finished_); + return pref_service_; +} + void AwMetricsServiceClient::RegisterMetricsProvidersAndInitState() { CHECK(metrics::SubprocessMetricsProvider::GetInstance()); @@ -385,7 +390,7 @@ std::make_unique<metrics::AndroidMetricsProvider>()); metrics_service_->RegisterMetricsProvider( std::make_unique<metrics::DriveMetricsProvider>( - base::DIR_ANDROID_APP_DATA)); + base::DIR_ANDROID_APP_DATA, pref_service_)); metrics_service_->RegisterMetricsProvider( std::make_unique<metrics::GPUMetricsProvider>()); metrics_service_->RegisterMetricsProvider(
diff --git a/android_webview/browser/metrics/aw_metrics_service_client.h b/android_webview/browser/metrics/aw_metrics_service_client.h index 331219a..d45e396 100644 --- a/android_webview/browser/metrics/aw_metrics_service_client.h +++ b/android_webview/browser/metrics/aw_metrics_service_client.h
@@ -160,6 +160,8 @@ // was given). metrics::MetricsService* GetMetricsServiceIfStarted(); + // This should only be called after Initialize(). + PrefService* GetPrefService() const; // MetricsServiceClient: variations::SyntheticTrialRegistry* GetSyntheticTrialRegistry() override; metrics::MetricsService* GetMetricsService() override;
diff --git a/android_webview/browser/tracing/aw_background_tracing_metrics_provider.cc b/android_webview/browser/tracing/aw_background_tracing_metrics_provider.cc index 4f47e6f4..54d138ad 100644 --- a/android_webview/browser/tracing/aw_background_tracing_metrics_provider.cc +++ b/android_webview/browser/tracing/aw_background_tracing_metrics_provider.cc
@@ -39,9 +39,10 @@ tracing::kStartupFieldTracing.Get()); SetupFieldTracingFromFieldTrial(); + android_webview::AwMetricsServiceClient* aw_metrics_service_client = + android_webview::AwMetricsServiceClient::GetInstance(); metrics::MetricsService* metrics = - android_webview::AwMetricsServiceClient::GetInstance() - ->GetMetricsService(); + aw_metrics_service_client->GetMetricsService(); DCHECK(metrics); system_profile_providers_.emplace_back( @@ -49,7 +50,8 @@ metrics->GetSyntheticTrialRegistry(), std::string_view())); system_profile_providers_.emplace_back( std::make_unique<metrics::DriveMetricsProvider>( - base::DIR_ANDROID_APP_DATA)); + base::DIR_ANDROID_APP_DATA, + aw_metrics_service_client->GetPrefService())); system_profile_providers_.emplace_back( std::make_unique<metrics::NetworkMetricsProvider>( content::CreateNetworkConnectionTrackerAsyncGetter()));
diff --git a/android_webview/java/src/org/chromium/android_webview/AwWindowCoverageTracker.java b/android_webview/java/src/org/chromium/android_webview/AwWindowCoverageTracker.java index fa33a085..91291536 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwWindowCoverageTracker.java +++ b/android_webview/java/src/org/chromium/android_webview/AwWindowCoverageTracker.java
@@ -151,7 +151,7 @@ for (AwContents content : mAwContentsList) { Rect contentRect = content.getRectForWindowCoverage(); - if (contentRect == null) continue; + if (contentRect == null || contentRect.isEmpty()) continue; // If the intersect method returns true then it may have modified // contentRect. A Rect with area 0 will not intersect with anything.
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java index a5643ff..4a2c6335 100644 --- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java +++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -247,9 +247,6 @@ AutofillFeatures.AUTOFILL_ADDRESS_IMPROVE_BUILDING_NUMBER_REGEX, "Enables building number regex improvement."), Flag.baseFeature( - AutofillFeatures.AUTOFILL_AND_PASSWORDS_IN_SAME_SURFACE, - "Changes how password requests are passed to the embedder. Ideally a noop."), - Flag.baseFeature( AutofillFeatures.AUTOFILL_BETTER_LOCAL_HEURISTIC_PLACEHOLDER_SUPPORT, "Treats placeholders as a separate signal for Autofill local heuristics"), Flag.baseFeature(
diff --git a/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt b/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt index 907a4d0e..ac0c435 100644 --- a/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt +++ b/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt
@@ -2647,6 +2647,9 @@ setter scrollLeft setter scrollTop setter slot +interface ElementBehavior + attribute @@toStringTag + method constructor interface ElementInternals attribute @@toStringTag getter ariaActiveDescendantElement @@ -2701,6 +2704,7 @@ getter ariaValueNow getter ariaValueText getter ariaVirtualContent + getter behaviors getter form getter labels getter role
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index 475c74e..1678a750 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -5455,6 +5455,9 @@ <message name="IDS_ASH_IN_SESSION_AUTH_TITLE" desc="Text shown in the auth dialog to indicate authentication is needed."> Verify your identity </message> + <message name="IDS_ASH_IN_SESSION_AUTH_CONFIRM_TITLE" desc="Title for the in-session auth dialog to confirm the user's identity."> + Confirm it's you + </message> <message name="IDS_ASH_IN_SESSION_AUTH_ORIGIN_NAME_PROMPT" desc="Text shown in the auth dialog to indicate which website / app we are authenticating for."> <ph name="ORIGIN_NAME">$1<ex>example.com</ex></ph> would like to confirm it's you </message>
diff --git a/ash/ash_strings_grd/IDS_ASH_IN_SESSION_AUTH_CONFIRM_TITLE.png.sha1 b/ash/ash_strings_grd/IDS_ASH_IN_SESSION_AUTH_CONFIRM_TITLE.png.sha1 new file mode 100644 index 0000000..410f8122 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_IN_SESSION_AUTH_CONFIRM_TITLE.png.sha1
@@ -0,0 +1 @@ +c6ec8d2b11e52695512fa5096a6afe7119dfc209 \ No newline at end of file
diff --git a/ash/auth/active_session_auth_controller_impl.cc b/ash/auth/active_session_auth_controller_impl.cc index 5952c12..11e2a2e 100644 --- a/ash/auth/active_session_auth_controller_impl.cc +++ b/ash/auth/active_session_auth_controller_impl.cc
@@ -254,7 +254,13 @@ CHECK(!auth_request_); auth_request_ = std::move(auth_request); - title_ = l10n_util::GetStringUTF16(IDS_ASH_IN_SESSION_AUTH_TITLE); + if (auth_request_->GetAuthReason() == + AuthRequest::Reason::kPaymentsAutofill) { + title_ = l10n_util::GetStringUTF16(IDS_ASH_IN_SESSION_AUTH_CONFIRM_TITLE); + } else { + title_ = l10n_util::GetStringUTF16(IDS_ASH_IN_SESSION_AUTH_TITLE); + } + description_ = auth_request_->GetDescription(); auth_factor_editor_ = std::make_unique<AuthFactorEditor>(UserDataAuthClient::Get());
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index 76500174..2229c0c 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -1310,20 +1310,6 @@ // Enables a bugfix for devices with a null custom top row property. BASE_FEATURE(kNullTopRowFix, base::FEATURE_ENABLED_BY_DEFAULT); -// Feature Management flag for the Sys UI holdback experiment, used to avoid -// certain devices. -BASE_FEATURE(kFeatureManagementShouldExcludeFromSysUiHoldback, - base::FEATURE_DISABLED_BY_DEFAULT); - -// Enables a holdback experiment for Drive integration. -BASE_FEATURE(kSysUiShouldHoldbackDriveIntegration, - base::FEATURE_DISABLED_BY_DEFAULT); - -// Enables a holdback experiment for Task Management -// Glanceables. -BASE_FEATURE(kSysUiShouldHoldbackTaskManagement, - base::FEATURE_DISABLED_BY_DEFAULT); - // Enables the Night Light feature. BASE_FEATURE(kNightLight, base::FEATURE_ENABLED_BY_DEFAULT); @@ -2065,10 +2051,6 @@ // position their windows using only mouse and touch gestures. BASE_FEATURE(kWmMode, base::FEATURE_DISABLED_BY_DEFAULT); -// Enables an experimental feature that overrides the specific holdback -// experiments on the M-129. -BASE_FEATURE(kIgnoreM129Holdback, base::FEATURE_DISABLED_BY_DEFAULT); - // Enables or disables PSM CheckMembership for 28 day device active pings // on ChromeOS. BASE_FEATURE(kDeviceActiveClient28DayActiveCheckMembership, @@ -2807,14 +2789,6 @@ } bool IsGlanceablesTimeManagementTasksViewEnabled() { - const bool device_enrolled_in_holdback = - !base::FeatureList::IsEnabled( - kFeatureManagementShouldExcludeFromSysUiHoldback) && - base::FeatureList::IsEnabled(kSysUiShouldHoldbackTaskManagement); - if (device_enrolled_in_holdback) { - return false; - } - return base::FeatureList::IsEnabled(kGlanceablesTimeManagementTasksView); } @@ -2875,17 +2849,6 @@ } bool IsLauncherContinueSectionWithRecentsEnabled() { - // If the holdback feature flag is enabled, the feature should be disabled, - // but only if the device is eligible for the study. Exclusion happens - // via hardware overlay, so it needs to be checked separately from the finch - // controlled holdback feature flag. - const bool device_excluded_from_holdback_study = base::FeatureList::IsEnabled( - kFeatureManagementShouldExcludeFromSysUiHoldback); - if (IsSysUiShouldHoldbackDriveIntegrationEnabled() && - !device_excluded_from_holdback_study) { - return false; - } - return base::FeatureList::IsEnabled(kLauncherContinueSectionWithRecents) || base::FeatureList::IsEnabled( kLauncherContinueSectionWithRecentsRollout); @@ -3283,11 +3246,6 @@ return base::FeatureList::IsEnabled(kSystemTrayShadow); } -bool IsSysUiShouldHoldbackDriveIntegrationEnabled() { - return base::FeatureList::IsEnabled(kSysUiShouldHoldbackDriveIntegration) && - !base::FeatureList::IsEnabled(kIgnoreM129Holdback); -} - bool IsTetheringExperimentalFunctionalityEnabled() { return base::FeatureList::IsEnabled(kTetheringExperimentalFunctionality); }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h index cd5d54f..6bf4c78f 100644 --- a/ash/constants/ash_features.h +++ b/ash/constants/ash_features.h
@@ -593,12 +593,6 @@ COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kNearbyPresence); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kNotificationLimit); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kNullTopRowFix); -COMPONENT_EXPORT(ASH_CONSTANTS) -BASE_DECLARE_FEATURE(kFeatureManagementShouldExcludeFromSysUiHoldback); -COMPONENT_EXPORT(ASH_CONSTANTS) -BASE_DECLARE_FEATURE(kSysUiShouldHoldbackDriveIntegration); -COMPONENT_EXPORT(ASH_CONSTANTS) -BASE_DECLARE_FEATURE(kSysUiShouldHoldbackTaskManagement); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kNightLight); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kNotificationCenterController); @@ -977,9 +971,6 @@ COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kSmartDim); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kTPMFirmwareUpdate); -// TODO(http://b/367799751): Remove when the issue gets fixed. -COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kIgnoreM129Holdback); - // Keep alphabetized. COMPONENT_EXPORT(ASH_CONSTANTS) bool AreCaptureModeDemoToolsEnabled(); @@ -1309,8 +1300,6 @@ COMPONENT_EXPORT(ASH_CONSTANTS) bool IsSystemNudgeMigrationEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsSystemTrayShadowEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) -bool IsSysUiShouldHoldbackDriveIntegrationEnabled(); -COMPONENT_EXPORT(ASH_CONSTANTS) bool IsTetheringExperimentalFunctionalityEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsTilingWindowResizeEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsTimeOfDayScreenSaverEnabled();
diff --git a/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_impl_unittest.cc b/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_impl_unittest.cc index bcaf747..2de4b7f 100644 --- a/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_impl_unittest.cc +++ b/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_impl_unittest.cc
@@ -67,8 +67,8 @@ return fake_fast_pair_gatt_service_client; } - raw_ptr<FakeFastPairGattServiceClient, DanglingUntriaged> - fake_fast_pair_gatt_service_client_ = nullptr; + raw_ptr<FakeFastPairGattServiceClient> fake_fast_pair_gatt_service_client_ = + nullptr; }; class FastPairFakeDataEncryptorImplFactory @@ -95,8 +95,7 @@ void SetFailedRetrieval() { successful_retrieval_ = false; } private: - raw_ptr<FakeFastPairDataEncryptor, DanglingUntriaged> data_encryptor_ = - nullptr; + raw_ptr<FakeFastPairDataEncryptor> data_encryptor_ = nullptr; bool successful_retrieval_ = true; }; @@ -172,8 +171,11 @@ base::HistogramTester histogram_tester_; scoped_refptr<Device> device_; FakeFastPairGattServiceClientImplFactory gatt_service_client_factory_; - FastPairFakeDataEncryptorImplFactory data_encryptor_factory_; std::unique_ptr<FastPairHandshake> handshake_; + // Must be destroyed before `handshake_`: `data_encryptor_factory_` has a raw + // pointer to the last-created `DataEncryptor`, which is owned by + // `handshake_`. + FastPairFakeDataEncryptorImplFactory data_encryptor_factory_; std::optional<PairFailure> failure_ = std::nullopt; };
diff --git a/ash/quick_pair/keyed_service/quick_pair_metrics_logger_unittest.cc b/ash/quick_pair/keyed_service/quick_pair_metrics_logger_unittest.cc index c3b7fd0..dbc5f5a 100644 --- a/ash/quick_pair/keyed_service/quick_pair_metrics_logger_unittest.cc +++ b/ash/quick_pair/keyed_service/quick_pair_metrics_logger_unittest.cc
@@ -162,16 +162,18 @@ // Inject our own PrefServices for each user which enables us to setup the // desks restore data before the user signs in. auto user_prefs = std::make_unique<TestingPrefServiceSimple>(); - user_prefs_ = user_prefs.get(); - RegisterUserProfilePrefs(user_prefs_->registry(), /*country=*/"", + RegisterUserProfilePrefs(user_prefs->registry(), /*country=*/"", /*for_test=*/true); - SimulateUserLogin({kUserEmail}, - /*account_id=*/std::nullopt, std::move(user_prefs)); + AccountId account_id = + SimulateUserLogin({kUserEmail}, + /*account_id=*/std::nullopt, std::move(user_prefs)); - user_prefs_->registry()->RegisterBooleanPref( - ash::prefs::kUserPairedWithFastPair, - /*default_value=*/false); + static_cast<TestingPrefServiceSimple*>( + ash_test_helper()->prefs_provider()->GetUserPrefs(account_id)) + ->registry() + ->RegisterBooleanPref(ash::prefs::kUserPairedWithFastPair, + /*default_value=*/false); adapter_ = base::MakeRefCounted<FakeMetricBluetoothAdapter>(); device::BluetoothAdapterFactory::SetAdapterForTesting(adapter_); @@ -184,22 +186,6 @@ nearby::fastpair::DeviceType::TRUE_WIRELESS_HEADPHONES); fake_fast_pair_repository_->SetFakeMetadata(kValidModelId, metadata); - scanner_broker_ = std::make_unique<MockScannerBroker>(); - mock_scanner_broker_ = - static_cast<MockScannerBroker*>(scanner_broker_.get()); - - retroactive_pairing_detector_ = - std::make_unique<FakeRetroactivePairingDetector>(); - fake_retroactive_pairing_detector_ = - static_cast<FakeRetroactivePairingDetector*>( - retroactive_pairing_detector_.get()); - - pairer_broker_ = std::make_unique<MockPairerBroker>(); - mock_pairer_broker_ = static_cast<MockPairerBroker*>(pairer_broker_.get()); - - ui_broker_ = std::make_unique<MockUIBroker>(); - mock_ui_broker_ = static_cast<MockUIBroker*>(ui_broker_.get()); - initial_device_ = base::MakeRefCounted<Device>(kValidModelId, kTestAddress, Protocol::kFastPairInitial); subsequent_device_ = base::MakeRefCounted<Device>( @@ -214,19 +200,17 @@ /*default_value=*/true); metrics_logger_ = std::make_unique<QuickPairMetricsLogger>( - scanner_broker_.get(), pairer_broker_.get(), ui_broker_.get(), - retroactive_pairing_detector_.get()); + &scanner_broker_, &pairer_broker_, &ui_broker_, + &retroactive_pairing_detector_); } - void TearDown() override { NoSessionAshTestBase::TearDown(); } - void SimulateDiscoveryUiShown(Protocol protocol) { switch (protocol) { case Protocol::kFastPairInitial: - mock_scanner_broker_->NotifyDeviceFound(initial_device_); + scanner_broker_.NotifyDeviceFound(initial_device_); break; case Protocol::kFastPairSubsequent: - mock_scanner_broker_->NotifyDeviceFound(subsequent_device_); + scanner_broker_.NotifyDeviceFound(subsequent_device_); break; case Protocol::kFastPairRetroactive: break; @@ -236,12 +220,12 @@ void SimulateDiscoveryUiDismissed(Protocol protocol) { switch (protocol) { case Protocol::kFastPairInitial: - mock_ui_broker_->NotifyDiscoveryAction(initial_device_, - DiscoveryAction::kDismissedByOs); + ui_broker_.NotifyDiscoveryAction(initial_device_, + DiscoveryAction::kDismissedByOs); break; case Protocol::kFastPairSubsequent: - mock_ui_broker_->NotifyDiscoveryAction(subsequent_device_, - DiscoveryAction::kDismissedByOs); + ui_broker_.NotifyDiscoveryAction(subsequent_device_, + DiscoveryAction::kDismissedByOs); break; case Protocol::kFastPairRetroactive: break; @@ -251,12 +235,12 @@ void SimulateDiscoveryUiDismissedByUser(Protocol protocol) { switch (protocol) { case Protocol::kFastPairInitial: - mock_ui_broker_->NotifyDiscoveryAction( - initial_device_, DiscoveryAction::kDismissedByUser); + ui_broker_.NotifyDiscoveryAction(initial_device_, + DiscoveryAction::kDismissedByUser); break; case Protocol::kFastPairSubsequent: - mock_ui_broker_->NotifyDiscoveryAction( - subsequent_device_, DiscoveryAction::kDismissedByUser); + ui_broker_.NotifyDiscoveryAction(subsequent_device_, + DiscoveryAction::kDismissedByUser); break; case Protocol::kFastPairRetroactive: break; @@ -266,12 +250,12 @@ void SimulateDiscoveryUiDismissedByTimeout(Protocol protocol) { switch (protocol) { case Protocol::kFastPairInitial: - mock_ui_broker_->NotifyDiscoveryAction( - initial_device_, DiscoveryAction::kDismissedByTimeout); + ui_broker_.NotifyDiscoveryAction(initial_device_, + DiscoveryAction::kDismissedByTimeout); break; case Protocol::kFastPairSubsequent: - mock_ui_broker_->NotifyDiscoveryAction( - subsequent_device_, DiscoveryAction::kDismissedByTimeout); + ui_broker_.NotifyDiscoveryAction(subsequent_device_, + DiscoveryAction::kDismissedByTimeout); break; case Protocol::kFastPairRetroactive: break; @@ -281,12 +265,12 @@ void SimulateDiscoveryUiLearnMorePressed(Protocol protocol) { switch (protocol) { case Protocol::kFastPairInitial: - mock_ui_broker_->NotifyDiscoveryAction(initial_device_, - DiscoveryAction::kLearnMore); + ui_broker_.NotifyDiscoveryAction(initial_device_, + DiscoveryAction::kLearnMore); break; case Protocol::kFastPairSubsequent: - mock_ui_broker_->NotifyDiscoveryAction(subsequent_device_, - DiscoveryAction::kLearnMore); + ui_broker_.NotifyDiscoveryAction(subsequent_device_, + DiscoveryAction::kLearnMore); break; case Protocol::kFastPairRetroactive: break; @@ -296,12 +280,12 @@ void SimulateDiscoveryUiConnectPressed(Protocol protocol) { switch (protocol) { case Protocol::kFastPairInitial: - mock_ui_broker_->NotifyDiscoveryAction(initial_device_, - DiscoveryAction::kPairToDevice); + ui_broker_.NotifyDiscoveryAction(initial_device_, + DiscoveryAction::kPairToDevice); break; case Protocol::kFastPairSubsequent: - mock_ui_broker_->NotifyDiscoveryAction(subsequent_device_, - DiscoveryAction::kPairToDevice); + ui_broker_.NotifyDiscoveryAction(subsequent_device_, + DiscoveryAction::kPairToDevice); break; case Protocol::kFastPairRetroactive: break; @@ -311,17 +295,17 @@ void SimulatePairingFailed(Protocol protocol) { switch (protocol) { case Protocol::kFastPairInitial: - mock_pairer_broker_->NotifyPairFailure( + pairer_broker_.NotifyPairFailure( initial_device_, PairFailure::kKeyBasedPairingCharacteristicDiscovery); break; case Protocol::kFastPairSubsequent: - mock_pairer_broker_->NotifyPairFailure( + pairer_broker_.NotifyPairFailure( subsequent_device_, PairFailure::kKeyBasedPairingCharacteristicDiscovery); break; case Protocol::kFastPairRetroactive: - mock_pairer_broker_->NotifyPairFailure( + pairer_broker_.NotifyPairFailure( retroactive_device_, PairFailure::kKeyBasedPairingCharacteristicDiscovery); break; @@ -332,15 +316,15 @@ switch (protocol) { case Protocol::kFastPairInitial: initial_device_->set_classic_address(kTestAddress); - mock_pairer_broker_->NotifyDevicePaired(initial_device_); + pairer_broker_.NotifyDevicePaired(initial_device_); break; case Protocol::kFastPairSubsequent: subsequent_device_->set_classic_address(kTestAddress); - mock_pairer_broker_->NotifyDevicePaired(subsequent_device_); + pairer_broker_.NotifyDevicePaired(subsequent_device_); break; case Protocol::kFastPairRetroactive: retroactive_device_->set_classic_address(kTestAddress); - mock_pairer_broker_->NotifyDevicePaired(retroactive_device_); + pairer_broker_.NotifyDevicePaired(retroactive_device_); break; } } @@ -348,32 +332,32 @@ void SimulatePairingFlow(Protocol protocol) { switch (protocol) { case Protocol::kFastPairSubsequent: - mock_ui_broker_->NotifyDiscoveryAction(subsequent_device_, - DiscoveryAction::kPairToDevice); - mock_pairer_broker_->NotifyPairingStart(subsequent_device_); - mock_pairer_broker_->NotifyHandshakeComplete(subsequent_device_); - mock_pairer_broker_->NotifyDevicePaired(initial_device_); - mock_pairer_broker_->NotifyPairComplete(subsequent_device_); + ui_broker_.NotifyDiscoveryAction(subsequent_device_, + DiscoveryAction::kPairToDevice); + pairer_broker_.NotifyPairingStart(subsequent_device_); + pairer_broker_.NotifyHandshakeComplete(subsequent_device_); + pairer_broker_.NotifyDevicePaired(initial_device_); + pairer_broker_.NotifyPairComplete(subsequent_device_); break; case Protocol::kFastPairInitial: - mock_ui_broker_->NotifyDiscoveryAction(initial_device_, - DiscoveryAction::kPairToDevice); - mock_pairer_broker_->NotifyPairingStart(initial_device_); - mock_pairer_broker_->NotifyHandshakeComplete(initial_device_); - mock_pairer_broker_->NotifyDevicePaired(initial_device_); - mock_pairer_broker_->NotifyAccountKeyWrite(initial_device_, - /*error=*/std::nullopt); - mock_pairer_broker_->NotifyPairComplete(initial_device_); + ui_broker_.NotifyDiscoveryAction(initial_device_, + DiscoveryAction::kPairToDevice); + pairer_broker_.NotifyPairingStart(initial_device_); + pairer_broker_.NotifyHandshakeComplete(initial_device_); + pairer_broker_.NotifyDevicePaired(initial_device_); + pairer_broker_.NotifyAccountKeyWrite(initial_device_, + /*error=*/std::nullopt); + pairer_broker_.NotifyPairComplete(initial_device_); break; case Protocol::kFastPairRetroactive: - fake_retroactive_pairing_detector_->NotifyRetroactivePairFound( + retroactive_pairing_detector_.NotifyRetroactivePairFound( retroactive_device_); - mock_ui_broker_->NotifyAssociateAccountAction( + ui_broker_.NotifyAssociateAccountAction( retroactive_device_, AssociateAccountAction::kAssociateAccount); - mock_pairer_broker_->NotifyPairingStart(retroactive_device_); - mock_pairer_broker_->NotifyHandshakeComplete(retroactive_device_); - mock_pairer_broker_->NotifyAccountKeyWrite(retroactive_device_, - /*error=*/std::nullopt); + pairer_broker_.NotifyPairingStart(retroactive_device_); + pairer_broker_.NotifyHandshakeComplete(retroactive_device_); + pairer_broker_.NotifyAccountKeyWrite(retroactive_device_, + /*error=*/std::nullopt); break; } } @@ -381,11 +365,11 @@ void SimulateErrorUiDismissedByUser(Protocol protocol) { switch (protocol) { case Protocol::kFastPairInitial: - mock_ui_broker_->NotifyPairingFailedAction( + ui_broker_.NotifyPairingFailedAction( initial_device_, PairingFailedAction::kDismissedByUser); break; case Protocol::kFastPairSubsequent: - mock_ui_broker_->NotifyPairingFailedAction( + ui_broker_.NotifyPairingFailedAction( subsequent_device_, PairingFailedAction::kDismissedByUser); break; case Protocol::kFastPairRetroactive: @@ -396,12 +380,12 @@ void SimulateErrorUiDismissed(Protocol protocol) { switch (protocol) { case Protocol::kFastPairInitial: - mock_ui_broker_->NotifyPairingFailedAction( - initial_device_, PairingFailedAction::kDismissed); + ui_broker_.NotifyPairingFailedAction(initial_device_, + PairingFailedAction::kDismissed); break; case Protocol::kFastPairSubsequent: - mock_ui_broker_->NotifyPairingFailedAction( - subsequent_device_, PairingFailedAction::kDismissed); + ui_broker_.NotifyPairingFailedAction(subsequent_device_, + PairingFailedAction::kDismissed); break; case Protocol::kFastPairRetroactive: break; @@ -411,11 +395,11 @@ void SimulateErrorUiSettingsPressed(Protocol protocol) { switch (protocol) { case Protocol::kFastPairInitial: - mock_ui_broker_->NotifyPairingFailedAction( + ui_broker_.NotifyPairingFailedAction( initial_device_, PairingFailedAction::kNavigateToSettings); break; case Protocol::kFastPairSubsequent: - mock_ui_broker_->NotifyPairingFailedAction( + ui_broker_.NotifyPairingFailedAction( subsequent_device_, PairingFailedAction::kNavigateToSettings); break; case Protocol::kFastPairRetroactive: @@ -424,46 +408,44 @@ } void SimulateAssociateAccountUiShown() { - fake_retroactive_pairing_detector_->NotifyRetroactivePairFound( + retroactive_pairing_detector_.NotifyRetroactivePairFound( retroactive_device_); } void SimulateAssociateAccountUiDismissed() { - mock_ui_broker_->NotifyAssociateAccountAction( + ui_broker_.NotifyAssociateAccountAction( retroactive_device_, AssociateAccountAction::kDismissedByOs); } void SimulateAssociateAccountUiDismissedByUser() { - mock_ui_broker_->NotifyAssociateAccountAction( + ui_broker_.NotifyAssociateAccountAction( retroactive_device_, AssociateAccountAction::kDismissedByUser); } void SimulateAssociateAccountUiDismissedByTimeout() { - mock_ui_broker_->NotifyAssociateAccountAction( + ui_broker_.NotifyAssociateAccountAction( retroactive_device_, AssociateAccountAction::kDismissedByTimeout); } void SimulateAssociateAccountUiSavePressed() { - mock_ui_broker_->NotifyAssociateAccountAction( + ui_broker_.NotifyAssociateAccountAction( retroactive_device_, AssociateAccountAction::kAssociateAccount); } void SimulateAssociateAccountUiLearnMorePressed() { - mock_ui_broker_->NotifyAssociateAccountAction( - retroactive_device_, AssociateAccountAction::kLearnMore); + ui_broker_.NotifyAssociateAccountAction(retroactive_device_, + AssociateAccountAction::kLearnMore); } void SimulateAccountKeyWritten(Protocol protocol) { switch (protocol) { case Protocol::kFastPairInitial: - mock_pairer_broker_->NotifyAccountKeyWrite(initial_device_, - std::nullopt); + pairer_broker_.NotifyAccountKeyWrite(initial_device_, std::nullopt); break; case Protocol::kFastPairSubsequent: break; case Protocol::kFastPairRetroactive: - mock_pairer_broker_->NotifyAccountKeyWrite(retroactive_device_, - std::nullopt); + pairer_broker_.NotifyAccountKeyWrite(retroactive_device_, std::nullopt); break; } } @@ -471,13 +453,13 @@ void SimulateAccountKeyFailure(Protocol protocol) { switch (protocol) { case Protocol::kFastPairInitial: - mock_pairer_broker_->NotifyAccountKeyWrite( + pairer_broker_.NotifyAccountKeyWrite( initial_device_, AccountKeyFailure::kGattErrorFailed); break; case Protocol::kFastPairSubsequent: break; case Protocol::kFastPairRetroactive: - mock_pairer_broker_->NotifyAccountKeyWrite( + pairer_broker_.NotifyAccountKeyWrite( retroactive_device_, AccountKeyFailure::kGattErrorFailed); break; } @@ -487,7 +469,7 @@ auto fp_device = base::MakeRefCounted<Device>(kValidModelId, address, Protocol::kFastPairInitial); fp_device->set_classic_address(address); - mock_pairer_broker_->NotifyDevicePaired(fp_device); + pairer_broker_.NotifyDevicePaired(fp_device); } void PairFastPairDeviceWithClassicBluetooth(bool new_paired_status, @@ -519,19 +501,12 @@ std::unique_ptr<MockQuickPairBrowserDelegate> browser_delegate_; TestingPrefServiceSimple pref_service_; - raw_ptr<TestingPrefServiceSimple, DanglingUntriaged> user_prefs_; - - raw_ptr<MockScannerBroker, DanglingUntriaged> mock_scanner_broker_ = nullptr; - raw_ptr<MockPairerBroker, DanglingUntriaged> mock_pairer_broker_ = nullptr; - raw_ptr<MockUIBroker, DanglingUntriaged> mock_ui_broker_ = nullptr; - raw_ptr<FakeRetroactivePairingDetector, DanglingUntriaged> - fake_retroactive_pairing_detector_ = nullptr; std::unique_ptr<FakeFastPairRepository> fake_fast_pair_repository_; - std::unique_ptr<ScannerBroker> scanner_broker_; - std::unique_ptr<RetroactivePairingDetector> retroactive_pairing_detector_; - std::unique_ptr<PairerBroker> pairer_broker_; - std::unique_ptr<UIBroker> ui_broker_; + MockScannerBroker scanner_broker_; + FakeRetroactivePairingDetector retroactive_pairing_detector_; + MockPairerBroker pairer_broker_; + MockUIBroker ui_broker_; std::unique_ptr<QuickPairMetricsLogger> metrics_logger_; };
diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb index b6afc2ba..f87dc86 100644 --- a/ash/strings/ash_strings_af.xtb +++ b/ash/strings/ash_strings_af.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Huidige batteryvlak <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> oor</translation> <translation id="1178581264944972037">Laat wag</translation> <translation id="1179776263021875437">Hou op om op hierdie taak te fokus</translation> +<translation id="1180117276105724040">Stel tans vensters van jou vorige sessie terug …</translation> <translation id="1181037720776840403">Verwyder</translation> <translation id="1182225749592316782">Dit gee toegang vir alle apps en webwerwe met die kamera- en mikrofoontoestemming</translation> <translation id="1182876754474670069">tuis</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Wissel oudiobron?</translation> <translation id="1505542291183484463">Verander grootte van geteëlde venster afwaarts</translation> <translation id="1510238584712386396">Lanseerder</translation> +<translation id="1519090060276706457">Terugstel van vensters neem langer as verwag</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Wys kennisgewinginstellings. Kennisgewings is af vir 'n app}other{Wys kennisgewinginstellings. Kennisgewings is af vir # apps}}</translation> <translation id="1521655867290435174">Google Blaaie</translation> <translation id="1523032696246003">Battery <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> tot vol</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Wissel tussen die maksimum of huidige grootte van die prent-in-prent-venster</translation> <translation id="1787955149152357925">Af</translation> <translation id="1796561540704213354">Webwerwe insluitend bladsye wat jy besoek het en oop bladsye</translation> +<translation id="1799852120691957794">Kan nie vensters van jou vorige sessie terugstel nie</translation> <translation id="1805407494113167797">Kon nie Fokus-klanke speel nie</translation> <translation id="181103072419391116">Seinsterkte <ph name="SIGNAL_STRENGTH" />, deur jou administrateur bestuur</translation> <translation id="1815039896005206046">Afduim sal die terugvoer gee dat jy nie van hierdie voorgestelde groep hou nie</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Neem vensterskermkiekie</translation> <translation id="2598725286293895280">Ongesteunde programme in lessenaar</translation> <translation id="2607678425161541573">Aanlyn aanmelding word vereis</translation> +<translation id="2611702650078660078">’n Fout het voorgekom</translation> <translation id="2612072250312279703">aktiwiteitmonitor</translation> <translation id="261210853165551493">Kopieer met formatering</translation> <translation id="2612614436418177118">Skuif 'n appikoon binne approoster</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Druk Enter om volle skermskoot vas te vang</translation> <translation id="2849936225196189499">Kritiek</translation> <translation id="2850207700020959936">Apps kan toegang tot kamera kry</translation> +<translation id="2852045827873867442">Internetverbinding is nodig.</translation> <translation id="2860184359326882502">Beste passing</translation> <translation id="2865888419503095837">Netwerkinligting</translation> <translation id="2869095047958348710">Hierdie afgelope <ph name="DAY_OF_WEEK" /></translation> @@ -1216,6 +1221,7 @@ <translation id="4776917500594043016">Wagwoord vir <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Winkel</translation> <translation id="4778095205580009397">Die Google Assistent is nie in 'n demonstrasiesessie beskikbaar nie.</translation> +<translation id="4781633367688946589">Gaan voort na nuwe sessie</translation> <translation id="4785412405516449976">Slegs jou kontakte met ’n Google-rekening</translation> <translation id="4789348252524569426">Kan nie spraaklêers installeer nie. Jou toestel moet opgedateer word. Herbegin jou toestel en probeer weer.</translation> <translation id="478959186716341421">Saai tans uit</translation> @@ -1604,6 +1610,7 @@ <translation id="595202126637698455">Prestasie-nasporing geaktiveer</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Gebruiker onder toesig</translation> +<translation id="5959471481388474538">Netwerk nie beskikbaar nie</translation> <translation id="596035801491797438">Skakel gesigbeheer af</translation> <translation id="5960410286721553511">Bekyk jou foon se onlangse foto's en media</translation> <translation id="5965524703725988602">Wissel Donkertema. <ph name="STATE_TEXT" />.</translation> @@ -2253,6 +2260,7 @@ <translation id="7945357288295809525">Wys toeganklikheidsinstellings, “<ph name="ENABLED_FEATURES" />” is geaktiveer.</translation> <translation id="7946681191253332687">Uitgebreide sekuriteitopdaterings is beskikbaar</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> wil jou <ph name="DEVICE_NAME" /> gebruik</translation> +<translation id="7948239795436419268">Moenie vensters terugstel nie</translation> <translation id="7951630946012935453">Demp sleutelbord</translation> <translation id="7953176344218790168">HOOFLETTERS</translation> <translation id="7953994493035617347">Bevestig nuwe resolusie?</translation>
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb index f1ae40cb..03309d2 100644 --- a/ash/strings/ash_strings_am.xtb +++ b/ash/strings/ash_strings_am.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">የአሁን ባትሪ ደረጃ <ph name="BATTERY_PERCENTAGE" />%፣ <ph name="TIME" /> ይቀራል</translation> <translation id="1178581264944972037">ለአፍታ አቁም</translation> <translation id="1179776263021875437">በተግባር ላይ ትኩረት ማድረግ አቁም</translation> +<translation id="1180117276105724040">ከቀዳሚ ክፍለ ጊዜዎ መስኮቶችን ወደነበሩበት በመመለስ ላይ...</translation> <translation id="1181037720776840403">አስወግድ</translation> <translation id="1182225749592316782">ይህ የካሜራ እና የማይክሮፎን ፈቃዶች ላሏቸው ለሁሉም መተግበሪያዎች እና ድር ጣቢያዎች መዳረሻ ይፈቅዳል</translation> <translation id="1182876754474670069">መነሻ</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">የኦዲዮ ምንጭ ይቀየር?</translation> <translation id="1505542291183484463">የባለጡብ መስኮት መጠንን ወደ ታች ቀይር</translation> <translation id="1510238584712386396">ማስጀመሪያ</translation> +<translation id="1519090060276706457">መስኮቶችን ወደነበሩበት መመለስ ከተጠበቀው ጊዜ በላይ ጊዜ እየወሰደ ነው</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{የማሳወቂያ ቅንብሮችን አሳይ። ማሳወቂያዎች ለአንድ መተግበሪያ ጠፍተዋል}one{የማሳወቂያ ቅንብሮችን አሳይ። ማሳወቂያዎች ለ# መተግበሪያዎች ጠፍተዋል}other{የማሳወቂያ ቅንብሮችን አሳይ። ማሳወቂያዎች ለ# መተግበሪያዎች ጠፍተዋል}}</translation> <translation id="1521655867290435174">Google ሉሆች</translation> <translation id="1523032696246003">ባትሪ <ph name="BATTERY_PERCENTAGE" />% | እስከሚሞላ ድረስ <ph name="TIME" /></translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">የሥዕል-ላይ-ሥዕል መስኮቱ በፍተኛው ወይም በአሁኑ መጠን መካከል ይቀያይሩ</translation> <translation id="1787955149152357925">አጥፋ</translation> <translation id="1796561540704213354">የጎበኟቸውን ገፆች እና የተከፈቱ ገፆችን የሚያካትቱ ድር ጣቢያዎች</translation> +<translation id="1799852120691957794">ከቀዳሚ ክፍለ ጊዜው መስኮቶችን ወደነበሩበት መመለስ አይቻልም</translation> <translation id="1805407494113167797">የትኩረት ድምፆችን ማጫወት አልተቻለም</translation> <translation id="181103072419391116">የሲግናል ጥንካሬ <ph name="SIGNAL_STRENGTH" />፣ በየእርስዎ አስተዳዳሪ የሚተዳደር</translation> <translation id="1815039896005206046">ደባሪ ነው ይህን የተጠቆመ ቡድን እንዳልወደዱ ግብረመልስ ያስገባል</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">የመስኮት ቅጽበታዊ ገፅ እይታን ያንሱ</translation> <translation id="2598725286293895280">በዴስክ ውስጥ የማይደገፉ መተግበሪያዎች</translation> <translation id="2607678425161541573">በመስመር ላይ መግባት ያስፈልጋል</translation> +<translation id="2611702650078660078">ስህተት ተከስቷል</translation> <translation id="2612072250312279703">የእንቅስቃሴ መከታተያ</translation> <translation id="261210853165551493">በቅርጸት ከመስራት ጋር ቅዳ</translation> <translation id="2612614436418177118">የመተግበሪያ አዶን የመተግበሪያ ፍርግርግ ውስጥ ያንቀሳቅሳል</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">ሙሉ ገፅ ዕይታን ለመቅረጽ አስገባን ይጫኑ</translation> <translation id="2849936225196189499">ዋነኛ</translation> <translation id="2850207700020959936">መተግበሪያዎች ካሜራን መድረስ ይችላሉ</translation> +<translation id="2852045827873867442">የበይነመረብ ግንኙነት ያስፈልጋል።</translation> <translation id="2860184359326882502">ምርጥ ተዛማጅ</translation> <translation id="2865888419503095837">የአውታረ መረብ መረጃ</translation> <translation id="2869095047958348710">ያለፈው <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">የ<ph name="USER_EMAIL_ADDRESS" /> ይለፍ ቃል</translation> <translation id="4777825441726637019">Play መደብር</translation> <translation id="4778095205580009397">የGoogle ረዳቱ በማሳያ ክፍለ-ጊዜ ውስጥ አይገኝም።</translation> +<translation id="4781633367688946589">ወደ አዲስ ክፍለ ጊዜ ቀጥል</translation> <translation id="4785412405516449976">የGoogle መለያ ያላቸው ዕውቂያዎችዎ ብቻ</translation> <translation id="4789348252524569426">የንግግር ፋይሎችን መጫን አልተቻለም። መሣሪያዎ መዘመን አለበት። መሣሪያዎን ዳግም ያስጀምሩት እና እንደገና ይሞክሩ።</translation> <translation id="478959186716341421">Cast በማድረግ ላይ</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">አፈጻጸም መከታተያ ነቅቷል</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">ክትትል የሚደረግበት ተጠቃሚ</translation> +<translation id="5959471481388474538">አውታረ መረብ አይገኝም</translation> <translation id="596035801491797438">የፊት መቆጣጠሪያ አጥፋ</translation> <translation id="5960410286721553511">የስልክዎን የቅርብ ጊዜ ፎቶዎች እና ሚዲያ ይመልከቱ</translation> <translation id="5965524703725988602">ጠቆር ያለ ገጽታን ቀያይር። <ph name="STATE_TEXT" />።</translation> @@ -2253,6 +2260,7 @@ <translation id="7945357288295809525">የተደራሽነት ቅንብሮችን አሳይ፣ «<ph name="ENABLED_FEATURES" />» ነቅቷል።</translation> <translation id="7946681191253332687">የተራዘሙ የደህንነት ዝማኔዎች ይገኛሉ</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> የእርስዎን <ph name="DEVICE_NAME" /> መጠቀም ይፈልጋል</translation> +<translation id="7948239795436419268">መስኮቶችን ወደነበሩበት አትመልስ</translation> <translation id="7951630946012935453">የቁልፍ ሰሌዳን አደብዝዝ</translation> <translation id="7953176344218790168">አቢይ ሆሄ</translation> <translation id="7953994493035617347">አዲሱ ጥራት ይረጋገጥ?</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb index 3dd1154..ae135483 100644 --- a/ash/strings/ash_strings_ar.xtb +++ b/ash/strings/ash_strings_ar.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">مستوى شحن البطارية الحالي %<ph name="BATTERY_PERCENTAGE" />، ويتبقّى <ph name="TIME" />.</translation> <translation id="1178581264944972037">الإيقاف مؤقتًا</translation> <translation id="1179776263021875437">إيقاف التركيز على المهمة</translation> +<translation id="1180117276105724040">جارٍ استعادة النوافذ من الجلسة السابقة…</translation> <translation id="1181037720776840403">إزالة</translation> <translation id="1182225749592316782">يتيح هذا الإجراء السماح لجميع التطبيقات والمواقع الإلكترونية بالوصول إلى الكاميرا والميكروفون.</translation> <translation id="1182876754474670069">مفتاح Home</translation> @@ -167,6 +168,7 @@ <translation id="1501946871587957338">هل تريد تبديل مصدر الصوت؟</translation> <translation id="1505542291183484463">تغيير حجم النافذة المنقسمة بسحب حافتها للأسفل</translation> <translation id="1510238584712386396">مشغِّل التطبيقات</translation> +<translation id="1519090060276706457">تستغرق عملية استعادة النوافذ وقتًا أطول من المتوقع</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{عرض إعدادات الإشعارات. تم إيقاف الإشعارات لتطبيق واحد}zero{عرض إعدادات الإشعارات. تم إيقاف الإشعارات لـ # تطبيق}two{عرض إعدادات الإشعارات. تم إيقاف الإشعارات لتطبيقين (#)}few{عرض إعدادات الإشعارات. تم إيقاف الإشعارات لـ # تطبيقات}many{عرض إعدادات الإشعارات. تم إيقاف الإشعارات لـ # تطبيقًا}other{عرض إعدادات الإشعارات. تم إيقاف الإشعارات لـ # تطبيق}}</translation> <translation id="1521655867290435174">جداول بيانات Google</translation> <translation id="1523032696246003">مستوى شحن البطارية: %<ph name="BATTERY_PERCENTAGE" /> | الوقت المتبقي على اكتمال الشحن: <ph name="TIME" /></translation> @@ -261,6 +263,7 @@ <translation id="1786487376942610288">التبديل بين الحد الأقصى أو الحجم الحالي للنافذة المفتوحة بميزة "نافذة ضمن النافذة"</translation> <translation id="1787955149152357925">غير مُفعَّل</translation> <translation id="1796561540704213354">المواقع الإلكترونية بما في ذلك الصفحات التي سبقَت زيارتها والصفحات المفتوحة الآن</translation> +<translation id="1799852120691957794">تتعذّر استعادة النوافذ من الجلسة السابقة</translation> <translation id="1805407494113167797">تعذَّر تشغيل المقاطع الصوتية التي تساعد على التركيز</translation> <translation id="181103072419391116">قوة الإشارة <ph name="SIGNAL_STRENGTH" />، يديرها المشرف</translation> <translation id="1815039896005206046">يؤدي النقر على رمز عدم الإعجاب إلى إرسال ملاحظات بأنّ هذه المجموعة المقترَحة لا تعجبك</translation> @@ -492,6 +495,7 @@ <translation id="2596078834055697711">أخذ لقطة شاشة للنافذة</translation> <translation id="2598725286293895280">يتضمّن سطح المكتب تطبيقات غير متوافقة</translation> <translation id="2607678425161541573">يجب تسجيل الدخول على الإنترنت</translation> +<translation id="2611702650078660078">حدث خطأ</translation> <translation id="2612072250312279703">أداة رصد النشاط</translation> <translation id="261210853165551493">نسخ مع الحفاظ على التنسيق</translation> <translation id="2612614436418177118">نقل رمز تطبيق داخل شبكة التطبيقات</translation> @@ -574,6 +578,7 @@ <translation id="2848120746144143659">اضغط على المفتاح Enter لالتقاط صورة للشاشة بأكملها</translation> <translation id="2849936225196189499">مهمة</translation> <translation id="2850207700020959936">يمكن للتطبيقات الوصول إلى الكاميرا</translation> +<translation id="2852045827873867442">يجب توفُّر اتصال بالإنترنت.</translation> <translation id="2860184359326882502">أفضل نتيجة مطابقة</translation> <translation id="2865888419503095837">معلومات الشبكة</translation> <translation id="2869095047958348710">يوم <ph name="DAY_OF_WEEK" /> الماضي</translation> @@ -1213,6 +1218,7 @@ <translation id="4776917500594043016">كلمة مرور <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">متجر Play</translation> <translation id="4778095205580009397">لا يتوفَّر "مساعد Google" في جلسة تجريبية.</translation> +<translation id="4781633367688946589">المتابعة إلى جلسة جديدة</translation> <translation id="4785412405516449976">جهات الاتصال التي لديها حساب على Google فقط</translation> <translation id="4789348252524569426">يتعذّر تثبيت ملفات التعرّف على الكلام. يجب تحديث جهازك. أعِد تشغيل الجهاز وحاوِل مجددًا.</translation> <translation id="478959186716341421">إرسال</translation> @@ -1601,6 +1607,7 @@ <translation id="595202126637698455">تم تفعيل تتبع مستوى الأداء</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">مستخدم يخضع للإدارة</translation> +<translation id="5959471481388474538">الشبكة غير متاحة</translation> <translation id="596035801491797438">إيقاف ميزة "التحكّم بالوجه"</translation> <translation id="5960410286721553511">عرض الصور والوسائط الحديثة على هاتفك</translation> <translation id="5965524703725988602">إيقاف/تفعيل المظهر الداكن: <ph name="STATE_TEXT" /></translation> @@ -2251,6 +2258,7 @@ <translation id="7945357288295809525">عرض إعدادات تسهيل الاستخدام، الميزة المفعَّلة حاليًا: <ph name="ENABLED_FEATURES" /></translation> <translation id="7946681191253332687">تتوفّر تحديثات أمان ممتدة</translation> <translation id="7947798320695032612">"<ph name="APP_NAME" />" بحاجة إلى استخدام <ph name="DEVICE_NAME" />.</translation> +<translation id="7948239795436419268">عدم استعادة النوافذ</translation> <translation id="7951630946012935453">تعتيم لوحة المفاتيح</translation> <translation id="7953176344218790168">استخدام أحرف كبيرة</translation> <translation id="7953994493035617347">هل تريد تأكيد درجة الدقة الجديدة؟</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb index 71d24bf..d73e9496 100644 --- a/ash/strings/ash_strings_as.xtb +++ b/ash/strings/ash_strings_as.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">বৰ্তমানৰ বেটাৰীৰ স্তৰ <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> বাকী</translation> <translation id="1178581264944972037">পজ কৰক</translation> <translation id="1179776263021875437">কাৰ্যত ফ’কাছ কৰাটো বন্ধ কৰক</translation> +<translation id="1180117276105724040">আপোনাৰ পূৰ্বৱৰ্তী ছেশ্বন পৰা ৱিণ্ড’ পুনঃস্থাপন কৰি থকা হৈছে...</translation> <translation id="1181037720776840403">আঁতৰাওক</translation> <translation id="1182225749592316782">এইটোৱে কেমেৰা আৰু মাইক্ৰ’ফ’নৰ অনুমতি থকা আটাইবোৰ এপ্ আৰু ৱেবছাইটৰ বাবে এক্সেছৰ অনুমতি দিয়ে</translation> <translation id="1182876754474670069">হ’ম</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">অডিঅ’ৰ উৎস সলনি কৰিবনে?</translation> <translation id="1505542291183484463">টাইল কৰা ৱিণ্ড’ৰ আকাৰ তলৰ ফালে সলনি কৰা</translation> <translation id="1510238584712386396">লঞ্চাৰ</translation> +<translation id="1519090060276706457">ৱিণ্ড’ পুনঃস্থাপন কৰাটোৱে আশা কৰাতকৈ অধিক সময় লৈছে</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{জাননীৰ ছেটিংসমূহ দেখুৱাওক। কোনো এপৰ বাবে জাননী বন্ধ কৰা আছে}one{জাননীৰ ছেটিংসমূহ দেখুৱাওক। #টা এপৰ বাবে জাননী অফ কৰা আছে}other{জাননীৰ ছেটিংসমূহ দেখুৱাওক। #টা এপৰ বাবে জাননী অফ কৰা আছে}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">বেটাৰী <ph name="BATTERY_PERCENTAGE" />% | সম্পূৰ্ণ হ'বলৈ <ph name="TIME" /> সময় বাকী আছে</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">picture-in-picture ৱিণ্ডৰ সর্বাধিক বা বর্তমানৰ আকাৰৰ মাজত সালসলনি কৰক</translation> <translation id="1787955149152357925">অফ আছে</translation> <translation id="1796561540704213354">আপুনি চোৱা আৰু খোলা পৃষ্ঠাসমূহকে ধৰি ৱেবছাইটসমূহ</translation> +<translation id="1799852120691957794">আপোনাৰ পূৰ্বৱৰ্তী ছেশ্বনৰ পৰা ৱিণ্ড’ পুনঃস্থাপন কৰিব নোৱাৰি</translation> <translation id="1805407494113167797">Focus ধ্বনি প্লে’ কৰিব পৰা নগ’ল</translation> <translation id="181103072419391116">ছিগনেলৰ ক্ষমতা <ph name="SIGNAL_STRENGTH" />, আপোনাৰ প্ৰশাসকে পৰিচালনা কৰে</translation> <translation id="1815039896005206046">থাম্বছ ডাউন চিহ্নটোৱে আপুনি ই পৰামৰ্শিত গোটটো পচন্দ নাই কৰা বুলি দাখিল কৰিব</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">ৱিণ্ড’ৰ স্ক্রীণশ্বট লওক</translation> <translation id="2598725286293895280">ডেস্কত সমৰ্থন নকৰা এপ্ আছে</translation> <translation id="2607678425161541573">অনলাইন ছাইন ইনৰ আৱশ্যক</translation> +<translation id="2611702650078660078">কিবা আসোঁৱাহ হ’ল</translation> <translation id="2612072250312279703">কাৰ্যকলাপ পৰ্যবেক্ষক</translation> <translation id="261210853165551493">ফৰ্মেটিঙৰ জৰিয়তে প্ৰতিলিপি কৰক</translation> <translation id="2612614436418177118">এপৰ গ্ৰিডৰ ভিতৰত এটা এপৰ চিহ্ন স্থানান্তৰ কৰক</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">সম্পূৰ্ণ স্ক্ৰীনৰ স্ক্ৰীনশ্বট ল’বলৈ এণ্টাৰ টিপক</translation> <translation id="2849936225196189499">জটিল</translation> <translation id="2850207700020959936">এপ্সমূহে কেমেৰা এক্সেছ কৰিব পাৰে</translation> +<translation id="2852045827873867442">ইণ্টাৰনেট সংযোগৰ প্ৰয়োজন।</translation> <translation id="2860184359326882502">আটাইতকৈ ভালদৰে মিলা</translation> <translation id="2865888419503095837">নেটৱৰ্কৰ তথ্য</translation> <translation id="2869095047958348710">যোৱা <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" />ৰ পাছৱর্ড</translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">Google Assistant ডেম’ ছেশ্বনত উপলব্ধ নহয়।</translation> +<translation id="4781633367688946589">নতুন ছেশ্বনলৈ অব্যাহত ৰাখক</translation> <translation id="4785412405516449976">কেৱল Google একাউণ্ট থকা আপোনাৰ সম্পৰ্ক</translation> <translation id="4789348252524569426">কথনৰ ফাইল ইনষ্টল কৰিব নোৱাৰি। আপোনাৰ ডিভাইচটো আপডে’ট কৰাৰ প্ৰয়োজন। আপোনাৰ ডিভাইচটো ৰিষ্টাৰ্ট কৰক আৰু পুনৰ চেষ্টা কৰক।</translation> <translation id="478959186716341421">কাষ্টিং</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">কার্যদক্ষতা ট্ৰে’চ কৰাটো সক্ষম কৰা হৈছে</translation> <translation id="5955304353782037793">এপ্</translation> <translation id="5958529069007801266">নিৰীক্ষণত থকা ব্যৱহাৰকাৰী</translation> +<translation id="5959471481388474538">নেটৱৰ্ক উপলব্ধ নহয়</translation> <translation id="596035801491797438">মুখাৱয়বৰ নিয়ন্ত্ৰণ অফ কৰক</translation> <translation id="5960410286721553511">আপোনাৰ ফ’নটোৰ শেহতীয়া ফট’ আৰু মিডিয়া চাওক</translation> <translation id="5965524703725988602">গাঢ় ৰঙৰ থীম ট’গল কৰক। <ph name="STATE_TEXT" />।</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">সাধ্য সুবিধাৰ ছেটিং দেখুৱাওক, "<ph name="ENABLED_FEATURES" />" সক্ষম কৰা হৈছে।</translation> <translation id="7946681191253332687">সুৰক্ষা সম্পৰ্কীয় বৰ্ধিত আপডে’ট উপলব্ধ</translation> <translation id="7947798320695032612"><ph name="APP_NAME" />এ আপোনাৰ <ph name="DEVICE_NAME" /> ব্যৱহাৰ কৰিব বিচাৰে</translation> +<translation id="7948239795436419268">ৱিণ্ড’ পুনঃস্থাপন নকৰিব</translation> <translation id="7951630946012935453">কীব’ৰ্ডৰ পোহৰ কমাওক</translation> <translation id="7953176344218790168">বৰফলা</translation> <translation id="7953994493035617347">নতুন ৰিজ’লিউছন নিশ্চিত কৰিবনে?</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb index d8b1958..ec138b7 100644 --- a/ash/strings/ash_strings_az.xtb +++ b/ash/strings/ash_strings_az.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Cari batareya səviyyəsi: <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> qalıb</translation> <translation id="1178581264944972037">Durdurun</translation> <translation id="1179776263021875437">Tapşırıqda fokuslu qalın</translation> +<translation id="1180117276105724040">Əvvəlki sessiyanızdan pəncərələr bərpa edilir...</translation> <translation id="1181037720776840403">Silin</translation> <translation id="1182225749592316782">Bu, kamera və mikrofon icazələri olan bütün tətbiq və vebsaytlara giriş icazəsi verir</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Audio mənbəyi dəyişdirilsin?</translation> <translation id="1505542291183484463">Ölçüsü dəyişdirilən mozaik pəncərəni aşağı köçürün</translation> <translation id="1510238584712386396">Başladıcı</translation> +<translation id="1519090060276706457">Pəncərələrin bərpası gözləniləndən çox vaxt aparır</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Bildiriş ayarlarını göstərin. Bildirişlər tətbiqdə deaktivdir}other{Bildiriş ayarlarını göstərin. Bildirişlər # tətbiqdə deaktivdir}}</translation> <translation id="1521655867290435174">Google Cədvəl</translation> <translation id="1523032696246003">Batareya <ph name="BATTERY_PERCENTAGE" />% | tam dolmasına <ph name="TIME" /> qalıb</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Şəkildə şəkil pəncərəsinin maksimum və ya cari ölçüsü arasında keçid edin</translation> <translation id="1787955149152357925">Deaktiv</translation> <translation id="1796561540704213354">Ziyarət etdiyiniz və açıq səhifələr daxil olmaqla veb-saytlar</translation> +<translation id="1799852120691957794">Əvvəlki sessiyanızdan pəncərələri bərpa etmək olmur</translation> <translation id="1805407494113167797">Fokus səslərini oxutmaq alınmadı</translation> <translation id="181103072419391116">Siqnal Gücü <ph name="SIGNAL_STRENGTH" />, Administratorunuz tərəfindən idarə olunur</translation> <translation id="1815039896005206046">Baş barmaq aşağı düyməsi bu təklif edilən qrupu bəyənmədiyinizi bildirən rəy göndərəcək</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Pəncərənin skrinşotunu çəkin</translation> <translation id="2598725286293895280">Masada dəstəklənməyən tətbiqlər</translation> <translation id="2607678425161541573">Onlayn giriş tələb olunur</translation> +<translation id="2611702650078660078">Xəta baş verdi</translation> <translation id="2612072250312279703">fəaliyyət monitoru</translation> <translation id="261210853165551493">Formatlama ilə kopiyalayın</translation> <translation id="2612614436418177118">Tətbiq ikonasını tətbiq torunda hərəkət etdirin</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Tam ekran skrinşot çəkmək üçün enter düyməsini basın</translation> <translation id="2849936225196189499">Kritik</translation> <translation id="2850207700020959936">Tətbiqlər kameraya daxil ola bilir</translation> +<translation id="2852045827873867442">İnternet bağlantısı tələb olunur.</translation> <translation id="2860184359326882502">Ən Uyğun Nəticə</translation> <translation id="2865888419503095837">Şəbəkə haqqında məlumat</translation> <translation id="2869095047958348710">Keçən <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> üçün parol</translation> <translation id="4777825441726637019">Play Market</translation> <translation id="4778095205580009397">Google Assistent demo sessiyasında əlçatan deyil.</translation> +<translation id="4781633367688946589">Yeni sessiyaya davam edin</translation> <translation id="4785412405516449976">Yalnız Google Hesabı olan kontaktlarınız</translation> <translation id="4789348252524569426">Nitq fayllarını quraşdırmaq olmur. Cihazınız güncəllənməlidir. Cihazı yenidən başladıb təkrar cəhd edin.</translation> <translation id="478959186716341421">Yayım</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Fəaliyyət izləməsi aktiv edildi</translation> <translation id="5955304353782037793">tətbiq</translation> <translation id="5958529069007801266">Nəzarət olunan istifadəçi</translation> +<translation id="5959471481388474538">Şəbəkə mövcud deyil</translation> <translation id="596035801491797438">Mimika ilə idarəetməni söndürün</translation> <translation id="5960410286721553511">Telefonunuzun son fotolarına və mediasına baxın.</translation> <translation id="5965524703725988602">Tünd temanı dəyişdirin. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Əlçatımlıq ayarlarını göstərin. "<ph name="ENABLED_FEATURES" />" aktivləşdirilib.</translation> <translation id="7946681191253332687">Genişləndirilmiş təhlükəsizlik güncəlləmələri mövcuddur</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> <ph name="DEVICE_NAME" /> istifadə etmək istəyir</translation> +<translation id="7948239795436419268">Pəncərələri bərpa etməyin</translation> <translation id="7951630946012935453">Klaviatura parlaqlığını azaldın</translation> <translation id="7953176344218790168">BÖYÜK HƏRF</translation> <translation id="7953994493035617347">Yeni ayırdetmə dəqiqliyi təsdiq edilsin?</translation>
diff --git a/ash/strings/ash_strings_be.xtb b/ash/strings/ash_strings_be.xtb index 04b230f..286a513 100644 --- a/ash/strings/ash_strings_be.xtb +++ b/ash/strings/ash_strings_be.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Бягучы ўзровень зараду акумулятара <ph name="BATTERY_PERCENTAGE" />%, застаецца <ph name="TIME" /></translation> <translation id="1178581264944972037">Прыпыніць</translation> <translation id="1179776263021875437">Спыніць канцэнтрацыю ўвагі на задачы</translation> +<translation id="1180117276105724040">Ідзе аднаўленне акон з папярэдняга сеанса…</translation> <translation id="1181037720776840403">Выдаліць</translation> <translation id="1182225749592316782">Доступ атрымаюць усе праграмы і вэб-сайты, якія маюць дазволы выкарыстоўваць мікрафон і камеру</translation> <translation id="1182876754474670069">Home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Пераключыць крыніцу аўдыя?</translation> <translation id="1505542291183484463">Размясціць акно ў ніжняй частцы экрана</translation> <translation id="1510238584712386396">Панэль запуску</translation> +<translation id="1519090060276706457">Аднаўленне акон займае больш часу, чым чакалася</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Паказаць налады апавяшчэнняў. Апавяшчэнні выключаны для адной праграмы}one{Паказаць налады апавяшчэнняў. Апавяшчэнні выключаны для # праграмы}few{Паказаць налады апавяшчэнняў. Апавяшчэнні выключаны для # праграм}many{Паказаць налады апавяшчэнняў. Апавяшчэнні выключаны для # праграм}other{Паказаць налады апавяшчэнняў. Апавяшчэнні выключаны для # праграмы}}</translation> <translation id="1521655867290435174">Табліцы Google</translation> <translation id="1523032696246003">Акумулятар зараджаны на <ph name="BATTERY_PERCENTAGE" />% | Да поўнай зарадкі застаецца <ph name="TIME" /></translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Пераключыцца з максімальнага на бягучы памер акна "відарыс у відарысе"</translation> <translation id="1787955149152357925">Выключана</translation> <translation id="1796561540704213354">Вэб-сайты, у тым ліку наведаныя і адкрытыя вамі старонкі</translation> +<translation id="1799852120691957794">Не ўдалося аднавіць вокны з папярэдняга сеанса</translation> <translation id="1805407494113167797">Не ўдалося прайграць гукі функцыі канцэнтрацыі ўвагі</translation> <translation id="181103072419391116">Магутнасць сігналу – <ph name="SIGNAL_STRENGTH" />; сетка знаходзіцца пад кіраваннем адміністратара</translation> <translation id="1815039896005206046">Націскаючы "Не падабаецца", вы адпраўляеце водгук пра тое, што вам не спадабалася гэта прапанаваная група</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Зрабіць здымак акна</translation> <translation id="2598725286293895280">На працоўным стале ёсць праграмы, якія не падтрымліваюцца</translation> <translation id="2607678425161541573">Неабходна выканаць уваход праз інтэрнэт</translation> +<translation id="2611702650078660078">Адбылася памылка</translation> <translation id="2612072250312279703">маніторынг дзеянняў</translation> <translation id="261210853165551493">Скапіраваць з фармаціраваннем</translation> <translation id="2612614436418177118">Перамясціць значок праграмы ў сетцы праграм</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Каб зрабіць здымак усяго экрана, націсніце Увод</translation> <translation id="2849936225196189499">Крытычна важнае</translation> <translation id="2850207700020959936">Праграмы маюць доступ да камеры</translation> +<translation id="2852045827873867442">Патрабуецца падключэнне да інтэрнэту.</translation> <translation id="2860184359326882502">Найлепшае супадзенне</translation> <translation id="2865888419503095837">Інфармацыя аб сетцы</translation> <translation id="2869095047958348710"><ph name="DAY_OF_WEEK" /> (мінулы дзень)</translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Пароль карыстальніка <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Крама Play</translation> <translation id="4778095205580009397">Памочнік Google недаступны ў дэманстрацыйным сеансе.</translation> +<translation id="4781633367688946589">Перайсці да новага сеанса</translation> <translation id="4785412405516449976">Толькі вашы кантакты, якія маюць Уліковы запіс Google</translation> <translation id="4789348252524569426">Не ўдалося ўсталяваць файлы для распазнавання маўлення. Неабходна абнавіць прыладу. Перазапусціце яе і паўтарыце спробу.</translation> <translation id="478959186716341421">Ідзе трансляцыя</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Уключана трасіроўка прадукцыйнасці</translation> <translation id="5955304353782037793">праграма</translation> <translation id="5958529069007801266">Падкантрольны карыстальнік</translation> +<translation id="5959471481388474538">Сетка недаступная</translation> <translation id="596035801491797438">Выключыць функцыю кіравання тварам</translation> <translation id="5960410286721553511">Праглядайце нядаўнія медыяфайлы і фота з тэлефона</translation> <translation id="5965524703725988602">Уключыць або выключыць цёмную тэму. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Паказаць налады спецыяльных магчымасцей, уключана: "<ph name="ENABLED_FEATURES" />".</translation> <translation id="7946681191253332687">Даступныя пашыраныя абнаўленні сістэмы бяспекі</translation> <translation id="7947798320695032612">Праграма "<ph name="APP_NAME" />" спрабуе выкарыстаць наступную прыладу: <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Не аднаўляць вокны</translation> <translation id="7951630946012935453">Паменшыць яркасць клавіятуры</translation> <translation id="7953176344218790168">ВЕРХНІ РЭГІСТР</translation> <translation id="7953994493035617347">Пацвердзіць новую раздзяляльнасць?</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb index 9b3c8f1..ce06395 100644 --- a/ash/strings/ash_strings_bg.xtb +++ b/ash/strings/ash_strings_bg.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Текущо ниво на батерията: <ph name="BATTERY_PERCENTAGE" />%. Оставащо време: <ph name="TIME" /></translation> <translation id="1178581264944972037">Пауза</translation> <translation id="1179776263021875437">Край на сесията за концентрация над задачата</translation> +<translation id="1180117276105724040">Прозорците от предходната ви сесия се възстановяват...</translation> <translation id="1181037720776840403">Премахване</translation> <translation id="1182225749592316782">Това разрешава достъп на всички приложения и уебсайтове, които имат разрешения за камерата и микрофона</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Да се превключи ли аудиоизточникът?</translation> <translation id="1505542291183484463">Преоразмеряване на фиксиран прозорец надолу</translation> <translation id="1510238584712386396">Стартов панел</translation> +<translation id="1519090060276706457">Възстановяването на прозорците отнема повече време от очакваното</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Показване на настройките за известия. Известията са изключени за едно приложение}other{Показване на настройките за известия. Известията са изключени за # приложения}}</translation> <translation id="1521655867290435174">Google Таблици</translation> <translation id="1523032696246003">Батерия: <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> до пълно зареждане</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Превключване между максималния и текущия размер на прозореца в режим „Картина в картината“</translation> <translation id="1787955149152357925">Изкл.</translation> <translation id="1796561540704213354">Уебсайтове, включително посетените от вас и отворените страници</translation> +<translation id="1799852120691957794">Прозорците от предходната ви сесия не могат да бъдат възстановени</translation> <translation id="1805407494113167797">Звуците за „Концентрация“ не бяха възпроизведени</translation> <translation id="181103072419391116">Сила на сигнала <ph name="SIGNAL_STRENGTH" />, управлява се от администратора ви</translation> <translation id="1815039896005206046">Чрез бутона „Не ми харесва“ отбелязвате, че не харесвате тази предложена група</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Правене на екранна снимка на прозореца</translation> <translation id="2598725286293895280">Работният кът съдържа неподдържани приложения</translation> <translation id="2607678425161541573">Изисква се онлайн вход</translation> +<translation id="2611702650078660078">Възникна грешка</translation> <translation id="2612072250312279703">наблюдение на активността</translation> <translation id="261210853165551493">Копиране с форматирането</translation> <translation id="2612614436418177118">Преместване на икона на приложение в решетката с приложения</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Натиснете Enter за създаване на екранна снимка на целия екран</translation> <translation id="2849936225196189499">Критично</translation> <translation id="2850207700020959936">Приложенията могат да осъществяват достъп до камерата</translation> +<translation id="2852045827873867442">Изисква се връзка с интернет.</translation> <translation id="2860184359326882502">Най-добро съответствие</translation> <translation id="2865888419503095837">Информация за мрежата</translation> <translation id="2869095047958348710">Миналият/миналата <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Парола за <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Google Play Магазин</translation> <translation id="4778095205580009397">Google Асистент не е налице по време на демонстрационна сесия.</translation> +<translation id="4781633367688946589">Продължаване към нова сесия</translation> <translation id="4785412405516449976">Само контактите ви с профил в Google</translation> <translation id="4789348252524569426">Инсталирането на файловете с говора не е възможно. Устройството ви трябва да бъде актуализирано. Рестартирайте го и опитайте отново.</translation> <translation id="478959186716341421">Предава се</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Проследяването на ефективността е активирано</translation> <translation id="5955304353782037793">приложение</translation> <translation id="5958529069007801266">Контролиран потребител</translation> +<translation id="5959471481388474538">Мрежата не е налице</translation> <translation id="596035801491797438">Изключване на управлението с лице</translation> <translation id="5960410286721553511">Преглед на скорошните снимки и мултимедийни файлове на телефона ви</translation> <translation id="5965524703725988602">Превключване на тъмната тема. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Показване на настройките за достъпност: функцията „<ph name="ENABLED_FEATURES" />“ е активирана.</translation> <translation id="7946681191253332687">Налице са удължени актуализации за сигурност</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> иска да използва <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Без възстановяване на прозорците</translation> <translation id="7951630946012935453">Затъмняване на клавиатурата</translation> <translation id="7953176344218790168">ГЛАВНИ БУКВИ</translation> <translation id="7953994493035617347">Искате ли да потвърдите новата разделителна способност?</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index 42507f6..e0383bc 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">বর্তমান ব্যাটারি লেভেল <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> বাকি</translation> <translation id="1178581264944972037">বিরতি</translation> <translation id="1179776263021875437">টাস্কে ফোকাস করা বন্ধ করুন</translation> +<translation id="1180117276105724040">আপনার পূর্ববর্তী সেশন থেকে উইন্ডোগুলি ফেরানো হচ্ছে...</translation> <translation id="1181037720776840403">সরান</translation> <translation id="1182225749592316782">এটি ক্যামেরা ও মাইক্রোফোন ব্যবহার করার অনুমতির মাধ্যমে সব অ্যাপ ও ওয়েবসাইট অ্যাক্সেস করার অনুমতি দেয়</translation> <translation id="1182876754474670069">বাড়ি</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">অডিও সোর্স পরিবর্তন করতে চান?</translation> <translation id="1505542291183484463">নিচের দিকে সাইজ ছোট বড় করার উইন্ডো টাইল করুন</translation> <translation id="1510238584712386396">লঞ্চার</translation> +<translation id="1519090060276706457">উইন্ডোগুলি ফিরিয়ে আনার জন্য প্রত্যাশিত সময়ের চেয়ে বেশি সময় লাগছে</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{বিজ্ঞপ্তির সেটিংস দেখান। একটি অ্যাপের জন্য বিজ্ঞপ্তির নোটিফিকেশন বন্ধ আছে}one{বিজ্ঞপ্তির সেটিংস দেখান। #টি অ্যাপের জন্য নোটিফিকেশন বন্ধ আছে}other{বিজ্ঞপ্তির সেটিংস দেখান। #টি অ্যাপের জন্য নোটিফিকেশন বন্ধ আছে}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">ব্যাটারি <ph name="BATTERY_PERCENTAGE" />% | সম্পূর্ণ চার্জ হতে <ph name="TIME" /> বাকি আছে</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">ছবির-মধ্যে-ছবি উইন্ডোর সর্বাধিক বা বর্তমান সাইজের মধ্যে পাল্টে নিন</translation> <translation id="1787955149152357925">বন্ধ আছে</translation> <translation id="1796561540704213354">যেসব ওয়েবসাইটের পৃষ্ঠা আপনি ঘুরে দেখেছেন ও পৃষ্ঠা খোলা রয়েছে, সেগুলি সহ</translation> +<translation id="1799852120691957794">আপনার পূর্ববর্তী সেশন থেকে উইন্ডোগুলি ফেরানো যাচ্ছে না</translation> <translation id="1805407494113167797">ফোকাস সাউন্ড প্লে করা যায়নি</translation> <translation id="181103072419391116">সিগন্যাল: <ph name="SIGNAL_STRENGTH" />, আপনার অ্যাডমিনিস্ট্রেটর ম্যানেজ করে</translation> <translation id="1815039896005206046">'থাম্বস-ডাউন' আইকন বেছে নেওয়ার অর্থ হল, আপনি এই সাজেস্ট করা গ্রুপ পছন্দ করেননি</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">উইন্ডো স্ক্রিনশট নিন</translation> <translation id="2598725286293895280">কাজ করে না এমন অ্যাপ ডেস্কে রয়েছে</translation> <translation id="2607678425161541573">অনলাইন সাইন-ইন প্রয়োজন</translation> +<translation id="2611702650078660078">কোনও সমস্যা হয়েছে</translation> <translation id="2612072250312279703">অ্যাক্টিভিটি মনিটর</translation> <translation id="261210853165551493">ফর্ম্যাটিং সহ কপি করুন</translation> <translation id="2612614436418177118">অ্যাপ গ্রিডে একটি অ্যাপ আইকন সরান</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">ফুল স্ক্রিন স্ক্রিনশট ক্যাপচার করার জন্য Enter প্রেস করুন</translation> <translation id="2849936225196189499">জটিল</translation> <translation id="2850207700020959936">অ্যাপ, ক্যামেরা অ্যাক্সেস করতে পারবে</translation> +<translation id="2852045827873867442">ইন্টারনেট কানেকশন প্রয়োজন।</translation> <translation id="2860184359326882502">সেরা মিল</translation> <translation id="2865888419503095837">নেটওয়ার্ক তথ্য</translation> <translation id="2869095047958348710">গত <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" />-এর জন্য পাসওয়ার্ড</translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">একটি ডেমো সেশনে Google অ্যাসিস্ট্যান্ট উপলভ্য নয়।</translation> +<translation id="4781633367688946589">নতুন সেশন চালিয়ে যান</translation> <translation id="4785412405516449976">শুধুমাত্র আপনার যেসব পরিচিতির Google অ্যাকাউন্ট রয়েছে</translation> <translation id="4789348252524569426">স্পিচ ফাইল ইনস্টল করা যাচ্ছে না। আপনার ডিভাইস আপডেট করতে হবে। ডিভাইস রিস্টার্ট করে আবার চেষ্টা করুন।</translation> <translation id="478959186716341421">কাস্ট করা হচ্ছে</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">কার্য-সম্পাদনা ট্রেস করা সক্ষম রয়েছে</translation> <translation id="5955304353782037793">অ্যাপ</translation> <translation id="5958529069007801266">তত্ত্বাবধানে থাকা ব্যবহারকারী</translation> +<translation id="5959471481388474538">নেটওয়ার্ক উপলব্ধ নয়</translation> <translation id="596035801491797438">ফেস কন্ট্রোল বন্ধ করুন</translation> <translation id="5960410286721553511">আপনার ফোনের সাম্প্রতিক ফটো এবং মিডিয়া দেখুন</translation> <translation id="5965524703725988602">ডার্ক থিম টগল করুন। <ph name="STATE_TEXT" />।</translation> @@ -2253,6 +2260,7 @@ <translation id="7945357288295809525">অ্যাক্সেসিবিলিটি সেটিংস দেখুন, "<ph name="ENABLED_FEATURES" />" চালু করা আছে।</translation> <translation id="7946681191253332687">এক্সটেন্ডেড নিরাপত্তা আপডেট উপলভ্য</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> আপনার <ph name="DEVICE_NAME" /> ব্যবহার করতে চায়</translation> +<translation id="7948239795436419268">উইন্ডোগুলি ফেরাতে হবে না</translation> <translation id="7951630946012935453">ডিম কীবোর্ড</translation> <translation id="7953176344218790168">বড় হাতের অক্ষর</translation> <translation id="7953994493035617347">নতুন রেজোলিউশন কনফার্ম করবেন?</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb index fa69878..28db3a5 100644 --- a/ash/strings/ash_strings_bs.xtb +++ b/ash/strings/ash_strings_bs.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Trenutno je baterija napunjena <ph name="BATTERY_PERCENTAGE" />%, još <ph name="TIME" /></translation> <translation id="1178581264944972037">Pauziraj</translation> <translation id="1179776263021875437">Zaustavljanje fokusiranja na zadatak</translation> +<translation id="1180117276105724040">Vraćanje prozora iz prethodne sesije…</translation> <translation id="1181037720776840403">Ukloni</translation> <translation id="1182225749592316782">Ovo dozvoljava pristup kameri i mikrofonu za sve aplikacije i web lokacije s odobrenjima za njih</translation> <translation id="1182876754474670069">Home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Promijeniti izvor zvuka?</translation> <translation id="1505542291183484463">Promjena veličine prozora s karticama nadolje</translation> <translation id="1510238584712386396">Pokretač</translation> +<translation id="1519090060276706457">Vraćanje prozora traje duže od očekivanog</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Prikaži postavke obavještenja. Obavještenja aplikacije su isključena.}one{Prikaži postavke obavještenja. Obavještenja za # aplikaciju su isključena.}few{Prikaži postavke obavještenja. Obavještenja za # aplikacije su isključena.}other{Prikaži postavke obavještenja. Obavještenja za # aplikacija su isključena.}}</translation> <translation id="1521655867290435174">Google Tabele</translation> <translation id="1523032696246003">Baterija je napunjena <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> do potpune napunjenosti</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Prebacivanje između prozora slike u slici u maksimalnoj ili trenutnoj veličini</translation> <translation id="1787955149152357925">Isključeno</translation> <translation id="1796561540704213354">Web lokacije uključujući posjećene i otvorene stranice</translation> +<translation id="1799852120691957794">Nije moguće vratiti prozore iz prethodne sesije</translation> <translation id="1805407494113167797">Reprodukcija Zvukova fokusiranja nije uspjela</translation> <translation id="181103072419391116">Jačina signala <ph name="SIGNAL_STRENGTH" />, upravlja vaš administrator</translation> <translation id="1815039896005206046">Oznaka "Ne sviđa mi se" šalje povratne informacije o tome da vam se ne sviđa ova predložena grupa</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Napravite snimak ekrana prozora</translation> <translation id="2598725286293895280">Na radnoj površini ima aplikacija koje nisu podržane</translation> <translation id="2607678425161541573">Potrebna je online prijava</translation> +<translation id="2611702650078660078">Došlo je do greške</translation> <translation id="2612072250312279703">praćenje aktivnosti</translation> <translation id="261210853165551493">Kopiraj s formatiranjem</translation> <translation id="2612614436418177118">Premjestite ikonu aplikacije unutar mreže aplikacije</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Pritisnite Enter za snimak cijelog ekrana</translation> <translation id="2849936225196189499">Kritična</translation> <translation id="2850207700020959936">Aplikacije mogu pristupati kameri</translation> +<translation id="2852045827873867442">Potrebna je internetska veza.</translation> <translation id="2860184359326882502">Najbolje podudaranje</translation> <translation id="2865888419503095837">Informacije o mreži</translation> <translation id="2869095047958348710">Prošli/a <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Lozinka za račun <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play trgovina</translation> <translation id="4778095205580009397">Google Asistent nije dostupan u demo sesiji.</translation> +<translation id="4781633367688946589">Nastavi na novu sesiju</translation> <translation id="4785412405516449976">Samo vaši kontakti s Google računom</translation> <translation id="4789348252524569426">Nije moguće instalirati fajlove za govor. Potrebno je ažurirati uređaj. Ponovo pokrenite uređaj i pokušajte ponovo.</translation> <translation id="478959186716341421">Emitiranje</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Praćenje performansi je omogućeno</translation> <translation id="5955304353782037793">apl</translation> <translation id="5958529069007801266">Korisnik pod nadzorom</translation> +<translation id="5959471481388474538">Mreža nije dostupna</translation> <translation id="596035801491797438">Isključivanje upravljanja licem</translation> <translation id="5960410286721553511">Pregledajte nedavne fotografije i medijski sadržaj telefona</translation> <translation id="5965524703725988602">Uključite/isključite tamnu temu <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Prikaži postavke pristupačnosti, omogućeno "<ph name="ENABLED_FEATURES" />".</translation> <translation id="7946681191253332687">Dostupna su proširena sigurnosna ažuriranja</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> želi koristiti uređaj <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Nemoj vraćati prozore</translation> <translation id="7951630946012935453">Zatamnjivanje tastature</translation> <translation id="7953176344218790168">VELIKA SLOVA</translation> <translation id="7953994493035617347">Potvrditi novu rezoluciju?</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index e65b056..1336107 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Nivell de bateria actual: <ph name="BATTERY_PERCENTAGE" />%; temps restant: <ph name="TIME" /></translation> <translation id="1178581264944972037">Posa en pausa</translation> <translation id="1179776263021875437">Vull deixar de concentrar-me en la tasca</translation> +<translation id="1180117276105724040">S'estan restaurant les finestres de la sessió anterior...</translation> <translation id="1181037720776840403">Suprimeix</translation> <translation id="1182225749592316782">Permet l'accés a totes les aplicacions i tots els llocs web amb permisos per accedir a la càmera i al micròfon.</translation> <translation id="1182876754474670069">Inici</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Vols canviar la font d'àudio?</translation> <translation id="1505542291183484463">Finestra redimensionada en mosaic cap avall</translation> <translation id="1510238584712386396">Menú d'aplicacions</translation> +<translation id="1519090060276706457">La restauració de les finestres està tardant més del previst</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Mostra la configuració de les notificacions. Les notificacions estan desactivades per a una aplicació.}other{Mostra la configuració de les notificacions. Les notificacions estan desactivades per a # aplicacions.}}</translation> <translation id="1521655867290435174">Fulls de càlcul de Google</translation> <translation id="1523032696246003">Bateria: <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> per completar la càrrega</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Canvia entre la mida màxima o l'actual de la finestra d'imatge sobre imatge</translation> <translation id="1787955149152357925">Desactivat</translation> <translation id="1796561540704213354">Llocs web que inclouen les pàgines que has visitat i les pàgines obertes</translation> +<translation id="1799852120691957794">No es poden restaurar les finestres de la sessió anterior</translation> <translation id="1805407494113167797">No s'han pogut reproduir els sons de Concentració</translation> <translation id="181103072419391116"><ph name="SIGNAL_STRENGTH" /> d'intensitat del senyal, xarxa gestionada per l'administrador</translation> <translation id="1815039896005206046">El botó No m'agrada indica que aquest grup suggerit no t'agrada</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Fes una captura de pantalla de la finestra</translation> <translation id="2598725286293895280">Hi ha aplicacions no admeses a l'escriptori</translation> <translation id="2607678425161541573">Cal iniciar la sessió en línia</translation> +<translation id="2611702650078660078">S'ha produït un error</translation> <translation id="2612072250312279703">monitor d'activitat</translation> <translation id="261210853165551493">Copia amb format</translation> <translation id="2612614436418177118">Mou la icona d'una aplicació a la quadrícula d'aplicacions</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Prem Retorn per fer una captura de pantalla completa</translation> <translation id="2849936225196189499">Crítica</translation> <translation id="2850207700020959936">Les aplicacions poden accedir a la càmera</translation> +<translation id="2852045827873867442">Cal tenir connexió a Internet.</translation> <translation id="2860184359326882502">Millor coincidència</translation> <translation id="2865888419503095837">Informació de la xarxa</translation> <translation id="2869095047958348710">El <ph name="DAY_OF_WEEK" /> passat</translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Contrasenya per a <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">L'Assistent de Google no està disponible en les sessions de demostració.</translation> +<translation id="4781633367688946589">Continua a la sessió nova</translation> <translation id="4785412405516449976">Només els teus contactes amb un Compte de Google</translation> <translation id="4789348252524569426">No es poden instal·lar els fitxers de parla. Cal actualitzar el dispositiu. Reinicia'l i torna-ho a provar.</translation> <translation id="478959186716341421">S'està emetent</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Traça del rendiment activada</translation> <translation id="5955304353782037793">aplicació</translation> <translation id="5958529069007801266">Usuari supervisat</translation> +<translation id="5959471481388474538">Xarxa no disponible</translation> <translation id="596035801491797438">Desactiva el control amb gestos facials</translation> <translation id="5960410286721553511">Consulta els fitxers multimèdia i les fotos recents del telèfon</translation> <translation id="5965524703725988602">Commuta el tema fosc. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Mostra la configuració d'accessibilitat, "<ph name="ENABLED_FEATURES" />" activada.</translation> <translation id="7946681191253332687">Actualitzacions de seguretat ampliades disponibles</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> vol utilitzar <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">No restauris les finestres</translation> <translation id="7951630946012935453">Atenua el teclat</translation> <translation id="7953176344218790168">MAJÚSCULES</translation> <translation id="7953994493035617347">Vols confirmar la nova resolució?</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb index 2204a37..39d0d3b6 100644 --- a/ash/strings/ash_strings_cs.xtb +++ b/ash/strings/ash_strings_cs.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Aktuální stav baterie: <ph name="BATTERY_PERCENTAGE" /> %, zbývá: <ph name="TIME" /></translation> <translation id="1178581264944972037">Pozastavit</translation> <translation id="1179776263021875437">Přestat se soustředit na úkol</translation> +<translation id="1180117276105724040">Obnovování oken z předchozí relace…</translation> <translation id="1181037720776840403">Odebrat</translation> <translation id="1182225749592316782">Tímto povolíte přístup všem aplikacím a webům, které mají oprávnění používat kameru a mikrofon.</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Přepnout zdroj zvuku?</translation> <translation id="1505542291183484463">Roztáhnout dlaždicové okno dolů</translation> <translation id="1510238584712386396">Spouštěč</translation> +<translation id="1519090060276706457">Obnovení oken trvá neočekávaně dlouho</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Zobrazit nastavení oznámení. U jedné aplikace jsou oznámení vypnutá}few{Zobrazit nastavení oznámení. U # aplikací jsou oznámení vypnutá}many{Zobrazit nastavení oznámení. U # aplikace jsou oznámení vypnutá}other{Zobrazit nastavení oznámení. U # aplikací jsou oznámení vypnutá}}</translation> <translation id="1521655867290435174">Tabulky Google</translation> <translation id="1523032696246003">Baterie: <ph name="BATTERY_PERCENTAGE" /> % | <ph name="TIME" /> do úplného nabití</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Přepnout mezi maximální a aktuální velikostí okna obrazu v obraze</translation> <translation id="1787955149152357925">Vyp</translation> <translation id="1796561540704213354">Weby, včetně navštívených a otevřených stránek</translation> +<translation id="1799852120691957794">Okna z předchozí relace nelze obnovit</translation> <translation id="1805407494113167797">Zvuky k soustředění nelze přehrát</translation> <translation id="181103072419391116">Síla signálu: <ph name="SIGNAL_STRENGTH" />, spravováno vaším administrátorem</translation> <translation id="1815039896005206046">Palec dolů odešle zpětnou vazbu, že se vám tato navrhovaná skupina nelíbí</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Pořídit snímek obrazovky okna</translation> <translation id="2598725286293895280">Na ploše jsou nepodporované aplikace</translation> <translation id="2607678425161541573">Je vyžadováno online přihlášení</translation> +<translation id="2611702650078660078">Došlo k chybě</translation> <translation id="2612072250312279703">sledování aktivity</translation> <translation id="261210853165551493">Zkopírovat s formátováním</translation> <translation id="2612614436418177118">Přesunout ikonu aplikace v mřížce aplikace</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Stisknutím klávesy Enter zachytíte snímek celé obrazovky</translation> <translation id="2849936225196189499">Kritické</translation> <translation id="2850207700020959936">Aplikace mají přístup k fotoaparátu</translation> +<translation id="2852045827873867442">Je vyžadováno připojení k internetu.</translation> <translation id="2860184359326882502">Nejlepší shoda</translation> <translation id="2865888419503095837">Informace o síti</translation> <translation id="2869095047958348710">Poslední <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Heslo pro účet <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Obchod Play</translation> <translation id="4778095205580009397">Asistent Google není v ukázkové relaci k dispozici.</translation> +<translation id="4781633367688946589">Pokračovat k nové relaci</translation> <translation id="4785412405516449976">Pouze vaše kontakty s účtem Google</translation> <translation id="4789348252524569426">Řečové soubory nelze nainstalovat. Zařízení je třeba aktualizovat. Restartujte zařízení a zkuste to znovu.</translation> <translation id="478959186716341421">Odesílání</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Sledování výkonu aktivováno</translation> <translation id="5955304353782037793">aplik</translation> <translation id="5958529069007801266">Dozorovaný uživatel</translation> +<translation id="5959471481388474538">Síť není k dispozici</translation> <translation id="596035801491797438">Vypnout ovládání obličejem</translation> <translation id="5960410286721553511">Zobrazovat nejnovější fotky a média z telefonu</translation> <translation id="5965524703725988602">Přepnout tmavý motiv. <ph name="STATE_TEXT" />.</translation> @@ -2251,6 +2258,7 @@ <translation id="7945357288295809525">Zobrazit nastavení přístupnosti. Zapnuté funkce: <ph name="ENABLED_FEATURES" />.</translation> <translation id="7946681191253332687">K dispozici jsou rozšířené aktualizace zabezpečení</translation> <translation id="7947798320695032612">Aplikace <ph name="APP_NAME" /> chce použít tuto hardwarovou komponentu: <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Neobnovovat okna</translation> <translation id="7951630946012935453">Ztlumit klávesnici</translation> <translation id="7953176344218790168">VELKÁ PÍSMENA</translation> <translation id="7953994493035617347">Potvrdit nové rozlišení?</translation>
diff --git a/ash/strings/ash_strings_cy.xtb b/ash/strings/ash_strings_cy.xtb index de6adf6..526ef4a 100644 --- a/ash/strings/ash_strings_cy.xtb +++ b/ash/strings/ash_strings_cy.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Lefel batri bresennol <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> ar ôl</translation> <translation id="1178581264944972037">Seibio</translation> <translation id="1179776263021875437">Stopio ffocysu ar dasg</translation> +<translation id="1180117276105724040">Wrthi'n adfer ffenestri o'ch sesiwn flaenorol...</translation> <translation id="1181037720776840403">Dileu</translation> <translation id="1182225749592316782">Mae hyn yn caniatáu mynediad ar gyfer pob ap a gwefan gyda chaniatadau camera a meicroffon.</translation> <translation id="1182876754474670069">cartref</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Newid ffynhonnell sain?</translation> <translation id="1505542291183484463">Ffenestr teilsen newid maint i lawr</translation> <translation id="1510238584712386396">Lansiwr</translation> +<translation id="1519090060276706457">Mae'n cymryd mwy o amser na'r disgwyl i adfer ffenestri</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Dangos gosodiadau hysbysiadau. Mae hysbysiadau wedi'u diffodd ar gyfer ap}zero{Dangos gosodiadau hysbysiadau. Mae hysbysiadau wedi'u diffodd ar gyfer # ap}two{Dangos gosodiadau hysbysiadau. Mae hysbysiadau wedi'u diffodd ar gyfer # ap}few{Dangos gosodiadau hysbysiadau. Mae hysbysiadau wedi'u diffodd ar gyfer # ap}many{Dangos gosodiadau hysbysiadau. Mae hysbysiadau wedi'u diffodd ar gyfer # ap}other{Dangos gosodiadau hysbysiadau. Mae hysbysiadau wedi'u diffodd ar gyfer # ap}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">Batri <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> nes yn llawn</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Newid rhwng maint mwyaf neu faint presennol y ffenestr llun-mewn-llun</translation> <translation id="1787955149152357925">Diffodd</translation> <translation id="1796561540704213354">Gwefannau gan gynnwys tudalennau rydych wedi ymweld â nhw a thudalennau agored</translation> +<translation id="1799852120691957794">Methu adfer ffenestri o'ch sesiwn flaenorol</translation> <translation id="1805407494113167797">Methu â chwarae synau Canolbwyntio</translation> <translation id="181103072419391116">Cryfder Signal <ph name="SIGNAL_STRENGTH" />, Rheolir gan eich Gweinyddwr</translation> <translation id="1815039896005206046">Byddai bodiau i lawr yn cyflwyno'r adborth nad ydych yn hoffi'r grŵp hwn a awgrymir</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Tynnu sgrinlun o'r ffenestr</translation> <translation id="2598725286293895280">Mae apiau sydd heb eu cefnogi yn y ddesg</translation> <translation id="2607678425161541573">Mae angen fewngofnodi ar-lein</translation> +<translation id="2611702650078660078">Bu gwall</translation> <translation id="2612072250312279703">monitor gweithgarwch</translation> <translation id="261210853165551493">Copi gyda fformatio</translation> <translation id="2612614436418177118">Symud eicon ap o fewn y grid apiau</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Pwyswch Enter i dynnu sgrinlun sgrîn lawn</translation> <translation id="2849936225196189499">Critigol</translation> <translation id="2850207700020959936">Gall apiau gael mynediad at gamera</translation> +<translation id="2852045827873867442">Mae angen cysylltiad rhyngrwyd.</translation> <translation id="2860184359326882502">Y Canlyniad Mwyaf Perthnasol</translation> <translation id="2865888419503095837">Gwybodaeth am y rhwydwaith</translation> <translation id="2869095047958348710"><ph name="DAY_OF_WEEK" /> diwethaf yma</translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Cyfrinair ar gyfer <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">Nid yw Google Assistant ar gael mewn sesiwn ddemo.</translation> +<translation id="4781633367688946589">Parhau i sesiwn newydd</translation> <translation id="4785412405516449976">Dim ond eich cysylltiadau sydd â Chyfrif Google</translation> <translation id="4789348252524569426">Methu â gosod ffeiliau llais. Mae angen diweddaru eich dyfais. Ailgychwynnwch eich dyfais a rhowch gynnig arall arni.</translation> <translation id="478959186716341421">Castio</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Mae olrhain perfformiad wedi'i alluogi</translation> <translation id="5955304353782037793">ap</translation> <translation id="5958529069007801266">Defnyddiwr dan oruchwyliaeth</translation> +<translation id="5959471481388474538">Nid yw'r rhwydwaith ar gael</translation> <translation id="596035801491797438">Diffodd Rheoli ag wyneb</translation> <translation id="5960410286721553511">Gweld lluniau a chyfryngau diweddar eich ffôn</translation> <translation id="5965524703725988602">Toglo'r Thema dywyll <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Dangos gosodiadau hygyrchedd, '<ph name="ENABLED_FEATURES" />' wedi'i alluogi.</translation> <translation id="7946681191253332687">Mae diweddariadau diogelwch estynedig ar gael</translation> <translation id="7947798320695032612">Mae <ph name="APP_NAME" /> am ddefnyddio eich <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Peidio ag adfer ffenestri</translation> <translation id="7951630946012935453">Bysellfwrdd pylu</translation> <translation id="7953176344218790168">PRIF LYTHRENNAU</translation> <translation id="7953994493035617347">Cadarnhau'r eglurdeb newydd?</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index c26bab0..494a043 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Aktuelt batteriniveau <ph name="BATTERY_PERCENTAGE" /> %, <ph name="TIME" /> tilbage</translation> <translation id="1178581264944972037">Pause</translation> <translation id="1179776263021875437">Stop med at fokusere på opgaven</translation> +<translation id="1180117276105724040">Gendanner vinduer fra din tidligere session…</translation> <translation id="1181037720776840403">Fjern</translation> <translation id="1182225749592316782">Dette giver alle apps og websites, der har kamera- og mikrofontilladelserne, adgang</translation> <translation id="1182876754474670069">Home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Vil du skifte lydkilde?</translation> <translation id="1505542291183484463">Tilpas vinduesfelt nedad</translation> <translation id="1510238584712386396">Appliste</translation> +<translation id="1519090060276706457">Det tager længere tid end forventet at gendanne vinduer</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Vis indstillinger for notifikationer. Notifikationer er slået fra for en app}one{Vis indstillinger for notifikationer. Notifikationer er slået fra for # app}other{Vis indstillinger for notifikationer. Notifikationer er slået fra for # apps}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">Batteri <ph name="BATTERY_PERCENTAGE" /> % | <ph name="TIME" /> indtil fuldt opladet</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Skift mellem den maksimale eller aktuelle størrelse på vinduet med integreret billede</translation> <translation id="1787955149152357925">Fra</translation> <translation id="1796561540704213354">Websites, der omfatter sider, du har besøgt, og åbne sider</translation> +<translation id="1799852120691957794">Vinduerne fra din forrige session kan ikke gendannes</translation> <translation id="1805407494113167797">Fokuslydene kunne ikke afspilles</translation> <translation id="181103072419391116">Signalstyrke <ph name="SIGNAL_STRENGTH" />, administreret af din administrator</translation> <translation id="1815039896005206046">Hvis du giver et dislike, indsendes der feedback om, at du ikke kan lide denne foreslåede gruppe</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Tag screenshot af vinduet</translation> <translation id="2598725286293895280">Der er ikke-understøttede apps på skrivebordet</translation> <translation id="2607678425161541573">Onlinelogin er påkrævet</translation> +<translation id="2611702650078660078">Der opstod en fejl</translation> <translation id="2612072250312279703">aktivitetsovervågning</translation> <translation id="261210853165551493">Kopiér med formatering</translation> <translation id="2612614436418177118">Flyt et appikon inden for appgitteret</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Tryk på Enter for at tage et screenshot i fuld skærm</translation> <translation id="2849936225196189499">Kritisk</translation> <translation id="2850207700020959936">Apps har adgang til kameraet</translation> +<translation id="2852045827873867442">Dette kræver internetforbindelse.</translation> <translation id="2860184359326882502">Bedste match</translation> <translation id="2865888419503095837">Netværksoplysninger</translation> <translation id="2869095047958348710">Sidste <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Adgangskode for <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Butik</translation> <translation id="4778095205580009397">Google Assistent er ikke tilgængelig i en demosession.</translation> +<translation id="4781633367688946589">Fortsæt til ny session</translation> <translation id="4785412405516449976">Kun kontakter med en Google-konto</translation> <translation id="4789348252524569426">Talefilerne kan ikke installeres Din enhed skal opdateres. Genstart din enhed, og prøv igen.</translation> <translation id="478959186716341421">Caster</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Sporing af ydelsen er aktiveret</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Overvåget bruger</translation> +<translation id="5959471481388474538">Netværket er ikke tilgængeligt</translation> <translation id="596035801491797438">Deaktiver ansigtsstyring</translation> <translation id="5960410286721553511">Se de seneste billeder og mediefiler fra din telefon</translation> <translation id="5965524703725988602">Slå Mørkt tema til/fra. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Vis indstillinger for hjælpefunktioner, "<ph name="ENABLED_FEATURES" />" er aktiveret.</translation> <translation id="7946681191253332687">Udvidede sikkerhedsopdateringer er tilgængelige</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> vil bruge <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Gendan ikke vinduer</translation> <translation id="7951630946012935453">Dæmp tastaturets lys</translation> <translation id="7953176344218790168">STORE BOGSTAVER</translation> <translation id="7953994493035617347">Vil du bekræfte den nye opløsning?</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb index 6fb7d8b..b963b0d 100644 --- a/ash/strings/ash_strings_de.xtb +++ b/ash/strings/ash_strings_de.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Aktueller Akkustand: <ph name="BATTERY_PERCENTAGE" /> %, <ph name="TIME" /> verbleibend</translation> <translation id="1178581264944972037">Pause</translation> <translation id="1179776263021875437">Nicht mehr auf diese Aufgabe konzentrieren</translation> +<translation id="1180117276105724040">Fenster aus der vorherigen Sitzung werden wiederhergestellt…</translation> <translation id="1181037720776840403">Entfernen</translation> <translation id="1182225749592316782">Dies erlaubt den Zugriff für alle Apps und Websites mit Kamera- und Mikrofonberechtigung</translation> <translation id="1182876754474670069">Pos1</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Audioquelle wechseln?</translation> <translation id="1505542291183484463">Angepasste Fensterkachel nach unten</translation> <translation id="1510238584712386396">Launcher</translation> +<translation id="1519090060276706457">Das Wiederherstellen von Fenstern dauert länger als erwartet</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Benachrichtigungseinstellungen anzeigen. Benachrichtigungen sind für eine App deaktiviert.}other{Benachrichtigungseinstellungen anzeigen. Benachrichtigungen sind für # Apps deaktiviert.}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">Akku <ph name="BATTERY_PERCENTAGE" /> % | Vollständig geladen in <ph name="TIME" /></translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Zwischen der maximalen und der aktuellen Größe des „Bild im Bild“-Fensters wechseln</translation> <translation id="1787955149152357925">Aus</translation> <translation id="1796561540704213354">Websites, einschließlich besuchter und derzeit geöffneter Seiten</translation> +<translation id="1799852120691957794">Fenster aus der vorherigen Sitzung können nicht wiederhergestellt werden</translation> <translation id="1805407494113167797">Die Sounds für mehr Konzentration konnten nicht abgespielt werden</translation> <translation id="181103072419391116">Signalstärke bei <ph name="SIGNAL_STRENGTH" />, von deinem Administrator verwaltet</translation> <translation id="1815039896005206046">Mit „Mag ich nicht“ gibst du an, dass dir diese vorgeschlagene Gruppe nicht gefällt</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Screenshot von Fenster erstellen</translation> <translation id="2598725286293895280">Desktop enthält nicht unterstützte Apps</translation> <translation id="2607678425161541573">Online-Anmeldung erforderlich</translation> +<translation id="2611702650078660078">Ein Fehler ist aufgetreten</translation> <translation id="2612072250312279703">Aktivitätsmonitor</translation> <translation id="261210853165551493">Mit Formatierung kopieren</translation> <translation id="2612614436418177118">App-Symbol im App-Raster verschieben</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Eingabetaste drücken, um einen Screenshot vom ganzen Bildschirm aufzunehmen</translation> <translation id="2849936225196189499">Kritisch</translation> <translation id="2850207700020959936">Apps können auf die Kamera zugreifen</translation> +<translation id="2852045827873867442">Eine Internetverbindung ist erforderlich.</translation> <translation id="2860184359326882502">Beste Ergebnisse</translation> <translation id="2865888419503095837">Netzwerkinformationen</translation> <translation id="2869095047958348710">Letzter <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Passwort für <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Google Play Store</translation> <translation id="4778095205580009397">In Demositzungen ist Google Assistant nicht verfügbar.</translation> +<translation id="4781633367688946589">Mit neuer Sitzung fortfahren</translation> <translation id="4785412405516449976">Nur meine Kontakte mit einem Google-Konto</translation> <translation id="4789348252524569426">Sprachdateien können nicht installiert werden. Dein Gerät muss aktualisiert werden. Starte das Gerät neu und versuche es noch einmal.</translation> <translation id="478959186716341421">Wird gestreamt</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Leistungsnachverfolgung aktiviert</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Betreuter Nutzer</translation> +<translation id="5959471481388474538">Netzwerk nicht verfügbar</translation> <translation id="596035801491797438">Mimik-Steuerung deaktivieren</translation> <translation id="5960410286721553511">Die letzten Fotos und Medien von deinem Smartphone abrufen</translation> <translation id="5965524703725988602">Dunkles Design aktivieren/deaktivieren. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Einstellungen für Bedienungshilfen anzeigen, „<ph name="ENABLED_FEATURES" />“ aktiviert.</translation> <translation id="7946681191253332687">Erweiterte Sicherheitsupdates verfügbar</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> möchte dein Gerät „<ph name="DEVICE_NAME" />“ verwenden.</translation> +<translation id="7948239795436419268">Fenster nicht wiederherstellen</translation> <translation id="7951630946012935453">Tastatur dimmen</translation> <translation id="7953176344218790168">GROẞSCHREIBUNG</translation> <translation id="7953994493035617347">Neue Auflösung bestätigen?</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb index 44e1230..fa0dbe0c 100644 --- a/ash/strings/ash_strings_el.xtb +++ b/ash/strings/ash_strings_el.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Τρέχον επίπεδο μπαταρίας <ph name="BATTERY_PERCENTAGE" />%, απομένουν <ph name="TIME" /></translation> <translation id="1178581264944972037">Παύση</translation> <translation id="1179776263021875437">Διακοπή συγκέντρωσης για την εργασία</translation> +<translation id="1180117276105724040">Επαναφορά παραθύρων από την προηγούμενη περίοδο λειτουργίας…</translation> <translation id="1181037720776840403">Κατάργηση</translation> <translation id="1182225749592316782">Αυτό επιτρέπει την πρόσβαση για όλες τις εφαρμογές και τους ιστοτόπους με τις άδειες κάμερας και μικροφώνου.</translation> <translation id="1182876754474670069">σπίτι</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Εναλλαγή πηγής ήχου;</translation> <translation id="1505542291183484463">Αλλαγή μεγέθους παραθύρου σε παράθεση προς τα κάτω</translation> <translation id="1510238584712386396">Λειτουργία εκκίνησης</translation> +<translation id="1519090060276706457">Η επαναφορά των παραθύρων διαρκεί περισσότερο από το αναμενόμενο</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Εμφάνιση ρυθμίσεων ειδοποιήσεων. Έχουν απενεργοποιηθεί οι ειδοποιήσεις για κάποια εφαρμογή.}other{Εμφάνιση ρυθμίσεων ειδοποιήσεων. Έχουν απενεργοποιηθεί οι ειδοποιήσεις για # εφαρμογές.}}</translation> <translation id="1521655867290435174">Υπολογιστικά φύλλα Google</translation> <translation id="1523032696246003">Μπαταρία <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> για πλήρη φόρτιση</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Εναλλαγή μεταξύ του μέγιστου ή του τρέχοντος μεγέθους του παραθύρου picture-in-picture</translation> <translation id="1787955149152357925">Ανενεργό</translation> <translation id="1796561540704213354">Ιστότοποι, συμπεριλαμβανομένων σελίδων που έχετε επισκεφτεί και ανοικτών σελίδων</translation> +<translation id="1799852120691957794">Δεν είναι δυνατή η επαναφορά των παραθύρων από την προηγούμενη περίοδο λειτουργίας</translation> <translation id="1805407494113167797">Δεν ήταν δυνατή η αναπαραγωγή ήχων Εστίασης</translation> <translation id="181103072419391116">Ισχύς σήματος <ph name="SIGNAL_STRENGTH" />, Διαχειριζόμενο από τον διαχειριστή σας</translation> <translation id="1815039896005206046">Με την επιλογή "Δεν εγκρίνω" θα υποβληθεί ένα σχόλιο ότι δεν σας αρέσει αυτή η προτεινόμενη ομάδα</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Λήψη στιγμιότυπου οθόνης παραθύρου</translation> <translation id="2598725286293895280">Μη υποστηριζόμενες εφαρμογές στο γραφείο</translation> <translation id="2607678425161541573">Απαιτείται σύνδεση στο διαδίκτυο</translation> +<translation id="2611702650078660078">Προέκυψε σφάλμα</translation> <translation id="2612072250312279703">παρακολούθηση δραστηριότητας</translation> <translation id="261210853165551493">Αντιγραφή με μορφοποίηση</translation> <translation id="2612614436418177118">Μετακίνηση εικονιδίου εφαρμογής στο πλέγμα εφαρμογής</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Πατήστε Enter για λήψη στιγμιότυπου πλήρους οθόνης</translation> <translation id="2849936225196189499">Κρίσιμη</translation> <translation id="2850207700020959936">Οι εφαρμογές μπορούν να αποκτήσουν πρόσβαση στην κάμερα</translation> +<translation id="2852045827873867442">Απαιτείται σύνδεση στο διαδίκτυο.</translation> <translation id="2860184359326882502">Βέλτιστη αντιστοίχιση</translation> <translation id="2865888419503095837">Πληροφορίες δικτύου</translation> <translation id="2869095047958348710"><ph name="DAY_OF_WEEK" /> που πέρασε</translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Κωδικός πρόσβασης για <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">Ο Βοηθός Google δεν είναι διαθέσιμος σε περίοδο λειτουργίας επίδειξης.</translation> +<translation id="4781633367688946589">Συνέχεια σε νέα περίοδο λειτουργίας</translation> <translation id="4785412405516449976">Μόνο οι επαφές σας με Λογαριασμό Google</translation> <translation id="4789348252524569426">Δεν είναι δυνατή η εγκατάσταση αρχείων ομιλίας. Η συσκευή σας πρέπει να ενημερωθεί. Επανεκκινήστε τη συσκευή και δοκιμάστε ξανά.</translation> <translation id="478959186716341421">Μετάδοση</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Η παρακολούθηση απόδοσης έχει ενεργοποιηθεί</translation> <translation id="5955304353782037793">εφαρμογή</translation> <translation id="5958529069007801266">Εποπτευόμενος χρήστης</translation> +<translation id="5959471481388474538">Το δίκτυο δεν είναι διαθέσιμο</translation> <translation id="596035801491797438">Απενεργοποίηση Ελέγχου με το πρόσωπο</translation> <translation id="5960410286721553511">Προβολή των πρόσφατων φωτογραφιών και μέσων του τηλεφώνου σας</translation> <translation id="5965524703725988602">Εναλλαγή Σκούρου θέματος. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Εμφάνιση ρυθμίσεων προσβασιμότητας, η λειτουργία <ph name="ENABLED_FEATURES" /> είναι ενεργοποιημένη.</translation> <translation id="7946681191253332687">Διαθέσιμες εκτεταμένες ενημερώσεις ασφάλειας</translation> <translation id="7947798320695032612">Η εφαρμογή <ph name="APP_NAME" /> θέλει να χρησιμοποιήσει τη συσκευή <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Να μην γίνει επαναφορά των παραθύρων</translation> <translation id="7951630946012935453">Μείωση φωτεινότητας πληκτρολογίου</translation> <translation id="7953176344218790168">ΚΕΦΑΛΑΙΑ</translation> <translation id="7953994493035617347">Επιβεβαίωση νέας ανάλυσης;</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index e97105b..5d1b98f 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Current battery level <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> left</translation> <translation id="1178581264944972037">Pause</translation> <translation id="1179776263021875437">Stop focusing on task</translation> +<translation id="1180117276105724040">Restoring windows from your previous session…</translation> <translation id="1181037720776840403">Remove</translation> <translation id="1182225749592316782">This allows access for all apps and websites with the camera and microphone permissions</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Switch audio source?</translation> <translation id="1505542291183484463">Tiled resize window downwards</translation> <translation id="1510238584712386396">Launcher</translation> +<translation id="1519090060276706457">Restoring windows is taking longer than expected</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Show notification settings. Notifications are off for an app}other{Show notification settings. Notifications are off for # apps}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">Battery <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> until full</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Switch between the maximum or current size of the picture-in-picture window</translation> <translation id="1787955149152357925">Off</translation> <translation id="1796561540704213354">Websites including pages you've visited and open pages</translation> +<translation id="1799852120691957794">Can't restore windows from your previous session</translation> <translation id="1805407494113167797">Couldn't play Focus sounds</translation> <translation id="181103072419391116">Signal strength <ph name="SIGNAL_STRENGTH" />, managed by your administrator</translation> <translation id="1815039896005206046">Thumbs down would submit the feedback that you dislike this suggested group</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Take window screenshot</translation> <translation id="2598725286293895280">Unsupported apps in desk</translation> <translation id="2607678425161541573">Online sign-in required</translation> +<translation id="2611702650078660078">An error occurred</translation> <translation id="2612072250312279703">activity monitor</translation> <translation id="261210853165551493">Copy with formatting</translation> <translation id="2612614436418177118">Move an app icon within app grid</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Press enter to capture full-screen screenshot</translation> <translation id="2849936225196189499">Critical</translation> <translation id="2850207700020959936">Apps can access camera</translation> +<translation id="2852045827873867442">Internet connection is required.</translation> <translation id="2860184359326882502">Best match</translation> <translation id="2865888419503095837">Network info</translation> <translation id="2869095047958348710">This past <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Password for <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">The Google Assistant is not available in a demo session.</translation> +<translation id="4781633367688946589">Continue to new session</translation> <translation id="4785412405516449976">Only your contacts with a Google Account</translation> <translation id="4789348252524569426">Can't install speech files. Your device needs to be updated. Restart your device and try again.</translation> <translation id="478959186716341421">Casting</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Performance tracing enabled</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Supervised user</translation> +<translation id="5959471481388474538">Network not available</translation> <translation id="596035801491797438">Turn off face control</translation> <translation id="5960410286721553511">View your phone's recent photos and media</translation> <translation id="5965524703725988602">Toggle Dark theme. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Show accessibility settings, '<ph name="ENABLED_FEATURES" />' enabled.</translation> <translation id="7946681191253332687">Extended security updates available</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> wants to use your <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Don't restore windows</translation> <translation id="7951630946012935453">Dim keyboard</translation> <translation id="7953176344218790168">UPPER CASE</translation> <translation id="7953994493035617347">Confirm the new resolution?</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb index b282d48e..6e19b9da 100644 --- a/ash/strings/ash_strings_es-419.xtb +++ b/ash/strings/ash_strings_es-419.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Nivel de batería actual <ph name="BATTERY_PERCENTAGE" />%, quedan <ph name="TIME" /></translation> <translation id="1178581264944972037">Detener</translation> <translation id="1179776263021875437">Dejar de concentrarse en la tarea</translation> +<translation id="1180117276105724040">Restableciendo ventanas de tu sesión anterior…</translation> <translation id="1181037720776840403">Quitar</translation> <translation id="1182225749592316782">Esto permite el acceso a todas las apps y sitios web con los permisos de cámara y micrófono</translation> <translation id="1182876754474670069">Inicio</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">¿Quieres cambiar la fuente de audio?</translation> <translation id="1505542291183484463">Ajustar el tamaño de la ventana del mosaico hacia abajo</translation> <translation id="1510238584712386396">Selector</translation> +<translation id="1519090060276706457">El restablecimiento de las ventanas está tardando más de lo esperado</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Mostrar la configuración de las notificaciones: Están desactivadas para una app}other{Mostrar la configuración de las notificaciones: Están desactivadas para # apps}}</translation> <translation id="1521655867290435174">Hojas de cálculo de Google</translation> <translation id="1523032696246003"><ph name="BATTERY_PERCENTAGE" />% de batería | <ph name="TIME" /> para completar</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Cambiar entre el tamaño máximo o actual de la ventana de pantalla en pantalla</translation> <translation id="1787955149152357925">No</translation> <translation id="1796561540704213354">Sitios web que incluyen las páginas que visitaste y las páginas abiertas</translation> +<translation id="1799852120691957794">No se pueden restablecer las ventanas de tu sesión anterior</translation> <translation id="1805407494113167797">No se pudo reproducir los sonidos de Concentración</translation> <translation id="181103072419391116">Intensidad de la señal: <ph name="SIGNAL_STRENGTH" />, administrada por tu administrador</translation> <translation id="1815039896005206046">La opción No me gusta enviará comentarios que indican que no te gusta este grupo sugerido</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Tomar captura de pantalla de la ventana</translation> <translation id="2598725286293895280">Hay apps no compatibles en el escritorio</translation> <translation id="2607678425161541573">Se requiere acceso en línea</translation> +<translation id="2611702650078660078">Se produjo un error</translation> <translation id="2612072250312279703">control de actividad</translation> <translation id="261210853165551493">Copiar con formato</translation> <translation id="2612614436418177118">Mover el ícono de una app dentro de la cuadrícula de apps</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Presiona intro para tomar una captura de pantalla completa</translation> <translation id="2849936225196189499">Crítico</translation> <translation id="2850207700020959936">Las apps pueden acceder a la cámara</translation> +<translation id="2852045827873867442">Se requiere una conexión a Internet.</translation> <translation id="2860184359326882502">Mejor coincidencia</translation> <translation id="2865888419503095837">Información de red</translation> <translation id="2869095047958348710">El <ph name="DAY_OF_WEEK" /> pasado</translation> @@ -1216,6 +1221,7 @@ <translation id="4776917500594043016">Contraseña para <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">El Asistente de Google no está disponible en la sesión de demostración.</translation> +<translation id="4781633367688946589">Continuar a la nueva sesión</translation> <translation id="4785412405516449976">Solo tus contactos con una Cuenta de Google</translation> <translation id="4789348252524569426">No se pueden instalar los archivos de voz. Debes actualizar el dispositivo. Reinicia el dispositivo y vuelve a intentarlo.</translation> <translation id="478959186716341421">Transmitiendo</translation> @@ -1604,6 +1610,7 @@ <translation id="595202126637698455">Seguimiento de rendimiento habilitado</translation> <translation id="5955304353782037793">apl</translation> <translation id="5958529069007801266">Usuario supervisado</translation> +<translation id="5959471481388474538">Red no disponible</translation> <translation id="596035801491797438">Desactivar el Control con gestos faciales</translation> <translation id="5960410286721553511">Mira las fotos y el contenido multimedia recientes del teléfono</translation> <translation id="5965524703725988602">Activar o desactivar el Tema oscuro. <ph name="STATE_TEXT" />.</translation> @@ -2253,6 +2260,7 @@ <translation id="7945357288295809525">Mostrar la configuración de accesibilidad; funciones habilitadas: "<ph name="ENABLED_FEATURES" />".</translation> <translation id="7946681191253332687">Actualizaciones de seguridad extendidas disponibles</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> quiere usar tu <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">No restablecer ventanas</translation> <translation id="7951630946012935453">Atenuar el teclado</translation> <translation id="7953176344218790168">MAYÚSCULA</translation> <translation id="7953994493035617347">¿Confirmas la nueva resolución?</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb index 24ae688..c54e9ca 100644 --- a/ash/strings/ash_strings_es.xtb +++ b/ash/strings/ash_strings_es.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Nivel de batería actual: <ph name="BATTERY_PERCENTAGE" /> % (tiempo restante: <ph name="TIME" />)</translation> <translation id="1178581264944972037">Pausar</translation> <translation id="1179776263021875437">Dejar de concentrarse en la tarea</translation> +<translation id="1180117276105724040">Restaurando ventanas de tu sesión anterior...</translation> <translation id="1181037720776840403">Quitar</translation> <translation id="1182225749592316782">Esto permite el acceso a todas las aplicaciones y sitios web con los permisos de cámara y micrófono</translation> <translation id="1182876754474670069">Inicio</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">¿Cambiar fuente de audio?</translation> <translation id="1505542291183484463">Ventana redimensionada en recuadro hacia abajo</translation> <translation id="1510238584712386396">Menú de aplicaciones</translation> +<translation id="1519090060276706457">Se está tardando más de lo esperado en restaurar las ventanas</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Muestra la configuración de notificaciones. Las notificaciones están desactivadas para una aplicación.}other{Muestra la configuración de notificaciones. Las notificaciones están desactivadas para # aplicaciones.}}</translation> <translation id="1521655867290435174">Hojas de cálculo de Google</translation> <translation id="1523032696246003">Batería: <ph name="BATTERY_PERCENTAGE" /> % | <ph name="TIME" /> para completar la carga</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Cambiar entre el tamaño máximo o actual de la ventana de imagen en imagen</translation> <translation id="1787955149152357925">No</translation> <translation id="1796561540704213354">Sitios web, incluidas las páginas que has visitado y las páginas abiertas</translation> +<translation id="1799852120691957794">No se pueden restaurar las ventanas de tu sesión anterior</translation> <translation id="1805407494113167797">No se han podido reproducir los sonidos de Concentración</translation> <translation id="181103072419391116">Intensidad de la señal: <ph name="SIGNAL_STRENGTH" />, gestionada por el administrador</translation> <translation id="1815039896005206046">No me gusta indica que este grupo sugerido no te ha gustado</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Hacer una captura de pantalla de la ventana</translation> <translation id="2598725286293895280">Aplicaciones no compatibles en el escritorio</translation> <translation id="2607678425161541573">Se requiere inicio de sesión online</translation> +<translation id="2611702650078660078">Se ha producido un error</translation> <translation id="2612072250312279703">monitor de actividad</translation> <translation id="261210853165551493">Copiar con formato</translation> <translation id="2612614436418177118">Mueve el icono de una aplicación en la cuadrícula de aplicaciones</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Pulsa Intro para hacer una captura de toda la pantalla</translation> <translation id="2849936225196189499">Crítica</translation> <translation id="2850207700020959936">Las aplicaciones pueden acceder a la cámara</translation> +<translation id="2852045827873867442">Se necesita conexión a Internet.</translation> <translation id="2860184359326882502">Mejor coincidencia</translation> <translation id="2865888419503095837">Información de red</translation> <translation id="2869095047958348710">El <ph name="DAY_OF_WEEK" /> pasado</translation> @@ -1216,6 +1221,7 @@ <translation id="4776917500594043016">Contraseña de <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">El Asistente de Google no está disponible en las sesiones de demostración.</translation> +<translation id="4781633367688946589">Continuar a una nueva sesión</translation> <translation id="4785412405516449976">Solo tus contactos con una cuenta de Google</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="478959186716341421">Enviando contenido</translation> @@ -1604,6 +1610,7 @@ <translation id="595202126637698455">Se ha habilitado el control del rendimiento</translation> <translation id="5955304353782037793">aplic</translation> <translation id="5958529069007801266">Usuario supervis.</translation> +<translation id="5959471481388474538">Red no disponible</translation> <translation id="596035801491797438">Desactivar control con gestos faciales</translation> <translation id="5960410286721553511">Consulta las fotos y el contenido multimedia recientes de tu teléfono</translation> <translation id="5965524703725988602">Activar o desactivar tema oscuro. <ph name="STATE_TEXT" />.</translation> @@ -2253,6 +2260,7 @@ <translation id="7945357288295809525">Mostrar configuración de accesibilidad, "<ph name="ENABLED_FEATURES" />" habilitado.</translation> <translation id="7946681191253332687">Actualizaciones de seguridad ampliadas disponibles</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> quiere usar tu <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">No restaurar ventanas</translation> <translation id="7951630946012935453">Atenuar la luz del teclado</translation> <translation id="7953176344218790168">MAYÚSCULA</translation> <translation id="7953994493035617347">¿Confirmar la nueva resolución?</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb index a13ac6a..4d33ef6 100644 --- a/ash/strings/ash_strings_et.xtb +++ b/ash/strings/ash_strings_et.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Praegune aku laetuse tase <ph name="BATTERY_PERCENTAGE" />%, jäänud <ph name="TIME" /></translation> <translation id="1178581264944972037">Peata</translation> <translation id="1179776263021875437">Lõpeta ülesandele keskendumine</translation> +<translation id="1180117276105724040">Akende taastamine teie eelmisest seansist…</translation> <translation id="1181037720776840403">Eemalda</translation> <translation id="1182225749592316782">Sisselülitamisel antakse juurdepääsuluba kõikidele kaamerale ja mikrofonile juurdepääsemise loaga rakendustele ning veebisaitidele</translation> <translation id="1182876754474670069">avaekraan</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Kas vahetada heliallikat?</translation> <translation id="1505542291183484463">Paanidega muudetava suurusega aken allapoole</translation> <translation id="1510238584712386396">Käivitaja</translation> +<translation id="1519090060276706457">Akende taastamine võtab oodatust kauem aega</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Kuvab märguandeseaded. Märguanded on rakenduse jaoks välja lülitatud}other{Kuvab märguandeseaded. Märguanded on # rakenduse jaoks välja lülitatud}}</translation> <translation id="1521655867290435174">Google'i arvutustabelid</translation> <translation id="1523032696246003">Aku laetuse tase: <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> kuni aku saab täis</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Vaheta pilt pildis aknas maksimumsuuruse ja praeguse suuruse vahel</translation> <translation id="1787955149152357925">Väljas</translation> <translation id="1796561540704213354">Veebisaidid, mis hõlmavad teie külastatud lehti ja avatud lehti</translation> +<translation id="1799852120691957794">Eelmise seansi aknaid ei saa taastada</translation> <translation id="1805407494113167797">Ei saanud keskendumise funktsiooni helisid esitada</translation> <translation id="181103072419391116">Signaali tugevus: <ph name="SIGNAL_STRENGTH" />, võrku haldab teie administraator</translation> <translation id="1815039896005206046">Nupu Ei meeldi vajutamisel esitatakse tagasiside, et see soovitatud grupp ei meeldi teile</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Jäädvustab aknast kuvatõmmise</translation> <translation id="2598725286293895280">Töölaual on toetamata rakendused</translation> <translation id="2607678425161541573">Veebis sisselogimine on nõutav</translation> +<translation id="2611702650078660078">Ilmnes viga</translation> <translation id="2612072250312279703">tegevuse jälgimine</translation> <translation id="261210853165551493">Kopeeri koos vormindusega</translation> <translation id="2612614436418177118">Rakenduste ruudustikus rakenduse ikooni teisaldamine</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Vajutage täisekraani jäädvustamiseks sisestusklahvi</translation> <translation id="2849936225196189499">Kriitiline</translation> <translation id="2850207700020959936">Rakendused pääsevad kaamerale juurde</translation> +<translation id="2852045827873867442">Vaja on internetiühendust.</translation> <translation id="2860184359326882502">Parim vaste</translation> <translation id="2865888419503095837">Võrguteave</translation> <translation id="2869095047958348710">Eelmine <ph name="DAY_OF_WEEK" /></translation> @@ -1216,6 +1221,7 @@ <translation id="4776917500594043016">Kasutaja <ph name="USER_EMAIL_ADDRESS" /> parool</translation> <translation id="4777825441726637019">Play pood</translation> <translation id="4778095205580009397">Google'i assistent ei ole demoseansi puhul saadaval.</translation> +<translation id="4781633367688946589">Jätka uues seansis</translation> <translation id="4785412405516449976">Ainult teie kontaktid, kellel on Google'i konto</translation> <translation id="4789348252524569426">Kõnefaile ei saa installida. Teie seadet on vaja värskendada. Taaskäivitage seade ja proovige uuesti.</translation> <translation id="478959186716341421">Ülekandmine</translation> @@ -1604,6 +1610,7 @@ <translation id="595202126637698455">Toimivuse jälgimine on lubatud</translation> <translation id="5955304353782037793">rak</translation> <translation id="5958529069007801266">Järelevalvega kasutaja</translation> +<translation id="5959471481388474538">Võrk ei ole saadaval</translation> <translation id="596035801491797438">Lülita näoga juhtimine välja</translation> <translation id="5960410286721553511">Vaadake oma telefoni hiljutisi fotosid ja meediat</translation> <translation id="5965524703725988602">Tumeda teema oleku sisse-/väljalülitamine. <ph name="STATE_TEXT" />.</translation> @@ -2253,6 +2260,7 @@ <translation id="7945357288295809525">Kuvatakse juurdepääsetavuse seaded, „<ph name="ENABLED_FEATURES" />“ on lubatud.</translation> <translation id="7946681191253332687">Pikendatud turvavärskendused on saadaval</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> soovib kasutada teie seadet <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Ära taasta aknaid</translation> <translation id="7951630946012935453">Hämarda klaviatuur</translation> <translation id="7953176344218790168">SUURTÄHED</translation> <translation id="7953994493035617347">Kas kinnitada uus eraldusvõime?</translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb index 7746a99..69a5fb0 100644 --- a/ash/strings/ash_strings_eu.xtb +++ b/ash/strings/ash_strings_eu.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Oraingo bateria-maila: % <ph name="BATTERY_PERCENTAGE" />. <ph name="TIME" /> geratzen dira.</translation> <translation id="1178581264944972037">Pausatu</translation> <translation id="1179776263021875437">Utzi zereginean kontzentratzeari</translation> +<translation id="1180117276105724040">Aurreko gailuko leihoak leheneratzen…</translation> <translation id="1181037720776840403">Kendu</translation> <translation id="1182225749592316782">Mikrofonoa eta kamera erabiltzeko baimena aktibatzen du halakorik baduten aplikazio eta webgune guztietan</translation> <translation id="1182876754474670069">hasiera tekla</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Audio-iturburua aldatu nahi duzu?</translation> <translation id="1505542291183484463">Aldatu leiho-lauzaren tamaina beherantz</translation> <translation id="1510238584712386396">Abiarazlea</translation> +<translation id="1519090060276706457">Espero baino gehiago ari da luzatzen leihoak leheneratzeko prozesua</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Erakutsi jakinarazpen-ezarpenak. Aplikazio batean desaktibatuta daude jakinarazpenak.}other{Erakutsi jakinarazpen-ezarpenak. # aplikaziotan desaktibatuta daude jakinarazpenak.}}</translation> <translation id="1521655867290435174">Google Kalkulu-orriak</translation> <translation id="1523032696246003">Bateria: % <ph name="BATTERY_PERCENTAGE" /> | <ph name="TIME" /> guztiz kargatu arte</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Aldatu pantaila txiki gainjarriaren gehieneko tamainaren eta oraingoaren artean</translation> <translation id="1787955149152357925">Desaktibatuta</translation> <translation id="1796561540704213354">Bisitatu dituzun orrialdeak eta irekitako orriak dituzten webguneak</translation> +<translation id="1799852120691957794">Ezin dira leheneratu aurreko saioko leihoak</translation> <translation id="1805407494113167797">Ezin izan dira erreproduzitu kontzentratzeko eginbidearen soinuak</translation> <translation id="181103072419391116">Seinalearen indarra: <ph name="SIGNAL_STRENGTH" />. Administratzaileak kudeatua.</translation> <translation id="1815039896005206046">"Ez zait gustatu" sakatuta, iradokitako talde hau gustatu ez zaizula esaten duen ohar bat bidaliko da</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Atera leihoaren pantaila-argazkia</translation> <translation id="2598725286293895280">Lan-eremuko aplikazio bat ez da bateragarria</translation> <translation id="2607678425161541573">Saioa hasi behar da sarean</translation> +<translation id="2611702650078660078">Errore bat gertatu da</translation> <translation id="2612072250312279703">jarduera-gainbegiralea</translation> <translation id="261210853165551493">Kopiatu formatuarekin</translation> <translation id="2612614436418177118">Mugitu aplikazio baten ikonoa aplikazioen saretaren barnean</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Pantaila osoaren pantaila-argazki bat ateratzeko, sakatu Sartu</translation> <translation id="2849936225196189499">Ezinbestekoa</translation> <translation id="2850207700020959936">Aplikazioek kamera erabil dezakete</translation> +<translation id="2852045827873867442">Internetera konektatuta egon behar duzu.</translation> <translation id="2860184359326882502">Emaitzarik onenak</translation> <translation id="2865888419503095837">Sarearen informazioa</translation> <translation id="2869095047958348710">Joan den <ph name="DAY_OF_WEEK" /></translation> @@ -1216,6 +1221,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> erabiltzaile-kontuko pasahitza</translation> <translation id="4777825441726637019">Google Play Store</translation> <translation id="4778095205580009397">Google-ren Laguntzailea ez dago erabilgarri demo saioetan.</translation> +<translation id="4781633367688946589">Egin aurrera saio berrira</translation> <translation id="4785412405516449976">Google-ko kontu bat duten kontaktuak soilik</translation> <translation id="4789348252524569426">Ezin dira instalatu hizketa-fitxategiak. Gailua eguneratu behar da. Berrabiarazi gailua eta saiatu berriro.</translation> <translation id="478959186716341421">Igortzen</translation> @@ -1604,6 +1610,7 @@ <translation id="595202126637698455">Errendimenduaren jarraipena egiteko aukera gaitu da</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Erabiltzaile gainbegiratua</translation> +<translation id="5959471481388474538">Sarea ez dago erabilgarri</translation> <translation id="596035801491797438">Desaktibatu Aurpegi-keinuen bidez kontrolatzea</translation> <translation id="5960410286721553511">Ikusi telefonoko azkenaldiko argazkiak eta multimedia-elementuak</translation> <translation id="5965524703725988602">Aktibatu/Desaktibatu gai iluna. <ph name="STATE_TEXT" />.</translation> @@ -2253,6 +2260,7 @@ <translation id="7945357288295809525">Erakutsi erabilerraztasun-ezarpenak, "<ph name="ENABLED_FEATURES" />" gaituta.</translation> <translation id="7946681191253332687">Segurtasun-eguneratze hedatuak daude erabilgarri</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> aplikazioak <ph name="DEVICE_NAME" /> erabili nahi du</translation> +<translation id="7948239795436419268">Ez leheneratu leihoak</translation> <translation id="7951630946012935453">Ilundu teklatua</translation> <translation id="7953176344218790168">MAIUSKULAK</translation> <translation id="7953994493035617347">Bereizmen berria berretsi nahi duzu?</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index 535b7260..1bd02b93 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -21,6 +21,11 @@ <translation id="1059120031266247284">همرسانیشده با شما</translation> <translation id="1060847216467038176"><ph name="ITEM_LABEL" /> با دکمه حذف</translation> <translation id="1062407476771304334">جایگزین کردن</translation> +<translation id="1065931689816135472"><ph name="BEGIN_PARAGRAPH1" />در Google Drive پشتیبانگیری کنید. بهآسانی دادههای خود را بازیابی کنید یا هرزمان خواستید دستگاهتان را عوض کنید. نسخه پشتیبان شما حاوی دادههای برنامه است.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />نسخههای پشتیبان در Google بارگذاری میشود و بااستفاده از گذرواژه «حساب Google» رمزگذاری میشود.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />دادههای برنامه میتوانند هر دادهای باشند که برنامه (براساس تنظیمات توسعهدهنده) ذخیره کرده است، ازجمله دادههایی مانند مخاطبین، پیامها، و عکسها.<ph name="END_PARAGRAPH3" /> + <ph name="BEGIN_PARAGRAPH4" />دادههای پشتیبانگیریشده جزو سهمیه فضای ذخیرهسازی Drive شما به حساب نمیآیند.<ph name="END_PARAGRAPH4" /> + <ph name="BEGIN_PARAGRAPH5" />میتوانید این سرویس را در «تنظیمات» خاموش کنید.<ph name="END_PARAGRAPH5" /></translation> <translation id="1073899992769346247">باتری را تعویض یا مجدداً شارژ کنید</translation> <translation id="1081015718268701546">درحالحاضر، از برنامههای Linux پشتیبانی نمیشود. دیگر برنامهها ذخیره خواهند شد.</translation> <translation id="108486256082349153">دستگاه تلفن همراه: <ph name="ADDRESS" /></translation> @@ -52,6 +57,7 @@ <translation id="1175944128323889279">میزان شارژ فعلی باتری <ph name="BATTERY_PERCENTAGE" />٪، <ph name="TIME" /> باقیمانده</translation> <translation id="1178581264944972037">مکث</translation> <translation id="1179776263021875437">توقف تمرکز روی تکلیف</translation> +<translation id="1180117276105724040">درحال بازیابی پنجرهها از جلسه قبلیتان…</translation> <translation id="1181037720776840403">برداشتن</translation> <translation id="1182225749592316782">با این کار، دسترسی برای همه برنامهها و وبسایتهای دارای اجازه دوربین و میکروفون مجاز میشود</translation> <translation id="1182876754474670069">صفحه اصلی</translation> @@ -166,6 +172,7 @@ <translation id="1501946871587957338">منبع صوتی تغییر کند؟</translation> <translation id="1505542291183484463">تغییر اندازه کاشی پنجره بهسمت پایین</translation> <translation id="1510238584712386396">راهانداز</translation> +<translation id="1519090060276706457">بازیابی پنجرهها بیشاز انتظار طول کشیده است</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{نشان دادن تنظیمات اعلان. اعلانهای یک برنامه خاموش است}one{نشان دادن تنظیمات اعلان. اعلانهای # برنامه خاموش است}other{نشان دادن تنظیمات اعلان. اعلانهای # برنامه خاموش است}}</translation> <translation id="1521655867290435174">کاربرگنگار Google</translation> <translation id="1523032696246003">باتری <ph name="BATTERY_PERCENTAGE" />٪ | <ph name="TIME" /> مانده تا شارژ کامل</translation> @@ -260,6 +267,7 @@ <translation id="1786487376942610288">جابهجایی بین اندازه بیشینه یا اندازه فعلی پنجره تصویر در تصویر</translation> <translation id="1787955149152357925">خاموش</translation> <translation id="1796561540704213354">وبسایتها شامل صفحههای که از آنها بازدید کردهاید و صفحههای باز میشود</translation> +<translation id="1799852120691957794">پنجرههای جلسه قبلیتان بازیابی نشد</translation> <translation id="1805407494113167797">«صداهای تمرکز» پخش نشد</translation> <translation id="181103072419391116">قدرت سیگنال <ph name="SIGNAL_STRENGTH" />، تحتمدیریت سرپرست</translation> <translation id="1815039896005206046">«رأی مخالف» بازخوردی با این معنا ارسال میکند که شما این گروه پیشنهادی را نمیپسندید</translation> @@ -491,6 +499,7 @@ <translation id="2596078834055697711">گرفتن عکس از پنجره صفحهنمایش</translation> <translation id="2598725286293895280">برنامههای پشتیبانینشده در میز کار</translation> <translation id="2607678425161541573">ورود به سیستم آنلاین لازم است</translation> +<translation id="2611702650078660078">خطایی رخ داد</translation> <translation id="2612072250312279703">پایشگر فعالیت</translation> <translation id="261210853165551493">کپی کردن با قالببندی</translation> <translation id="2612614436418177118">جابهجایی نماد برنامه در جدول برنامه</translation> @@ -575,6 +584,7 @@ <translation id="2848120746144143659">برای ضبط نماگرفت از تمام صفحه، کلید «ورود» را فشار دهید</translation> <translation id="2849936225196189499">مهم</translation> <translation id="2850207700020959936">برنامهها میتوانند به دوربین دسترسی داشته باشند</translation> +<translation id="2852045827873867442">به اتصال اینترنت نیاز است.</translation> <translation id="2860184359326882502">بهترین انطباق</translation> <translation id="2865888419503095837">اطلاعات شبکه</translation> <translation id="2869095047958348710">همین <ph name="DAY_OF_WEEK" /> گذشته</translation> @@ -769,6 +779,10 @@ <translation id="3470502288861289375">در حال کپی کردن...</translation> <translation id="347117769229524881"><ph name="MODIFIER_ONE" /><ph name="MODIFIER_TWO" /><ph name="KEY_ONE" /> سپس <ph name="KEY_TWO" /> یا <ph name="KEY_THREE" /></translation> <translation id="3477079411857374384">Control-Shift-Space</translation> +<translation id="3484174798079475132"><ph name="BEGIN_PARAGRAPH1" />وقتی «دقت مکان» روشن است، از اطلاعات مربوط به سیگنالهای بیسیم، مثل نقاط دسترسی Wi-Fi و دکلهای شبکه تلفن همراه و همچنین دادههای حسگر دستگاه مثل شتابسنج و ژیروسکوپ برای تخمین دقیقتر مکان دستگاه استفاده میشود، و برنامهها و سرویسهای Android از این مکان تخمینی برای ارائه ویژگیهای مکانمبنا استفاده میکنند. برای انجام این کار، Google بهطور دورهای اطلاعاتی درباره حسگرهای دستگاه و سیگنالهای بیسیم نزدیک شما جمعآوری میکند تا در مکانهای سیگنال بیسیم انبوهسپاریشده مشارکت کند.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Google بدون شناسایی شما، از این اطلاعات برای بهبود دقت مکان و خدمات مکانمبنا و به طور کلی بهبود، ارائه، و حفظ سرویسهای Google استفاده میکند. ما این اطلاعات را براساس منافع مشروع Google و اشخاص ثالث بهمنظور برآورده کردن نیازهای کاربران پردازش میکنیم.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />هرزمان بخواهید میتوانید «دقت مکان» را در تنظیمات مکان دستگاهتان خاموش کنید («تنظیمات» > «حریم خصوصی و امنیت» > «کنترلهای حریم خصوصی» > «دسترسی به مکان» > «تنظیمات پیشرفته مکان»). اگر «دقت مکان» خاموش باشد، دادههای «دقت مکان» جمعآوری نخواهد شد. برای برنامهها و سرویسهای Android، درصورت وجود فقط از نشانی IP برای تعیین مکان دستگاهتان استفاده میشود که ممکن است بر دردسترس بودن و دقت مکان برای برنامهها و سرویسهای Android مثل Google Maps تأثیر بگذارد.<ph name="END_PARAGRAPH3" /> + <ph name="BEGIN_PARAGRAPH4" /><ph name="LINK_BEGIN" />درباره «دقت مکان» بیشتر بدانید<ph name="LINK_END" /><ph name="END_PARAGRAPH4" /></translation> <translation id="3485319357743610354"><ph name="SECURITY_STATUS" />، <ph name="CONNECTION_STATUS" />، قدرت سیگنال <ph name="SIGNAL_STRENGTH" /></translation> <translation id="348799646910989694">پنهان شدن خودکار قفسه</translation> <translation id="3496797737329654668">بیایید بازی کنیم</translation> @@ -873,6 +887,9 @@ <translation id="3742055079367172538">نماگرفت گرفته شد</translation> <translation id="3743775386021959186">«تمرکز» روشن است، <ph name="REMAINING_TIME" /> باقی مانده است</translation> <translation id="3750403286520637847">پنهان کردن پیشنهاد آبوهوا</translation> +<translation id="3755239467337474637"><ph name="BEGIN_PARAGRAPH1" />دادههای برنامه میتوانند هر دادهای باشند که برنامه (براساس تنظیمات توسعهدهنده) ذخیره کرده است، ازجمله دادههایی مانند مخاطبین، پیامها، و عکسها.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />دادههای پشتیبانگیریشده جزو سهمیه فضای ذخیرهسازی Drive فرزندتان حساب نمیشود.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />میتوانید این سرویس را در «تنظیمات» خاموش کنید.<ph name="END_PARAGRAPH3" /></translation> <translation id="3756485814916578707">درحال پخش محتوای صفحهنمایش</translation> <translation id="3765841382945324995">میانبر <ph name="SIX_PACK_KEY_NAME" /> از <ph name="OLD_SHORTCUT" /> به <ph name="NEW_SHORTCUT" /> تغییر کرده است</translation> <translation id="3765841986579723851">امروز ویرایش شده است</translation> @@ -1215,6 +1232,7 @@ <translation id="4776917500594043016">گذرواژه <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">فروشگاه Play</translation> <translation id="4778095205580009397">«دستیار Google» در جلسه نمایشی در دسترس نیست.</translation> +<translation id="4781633367688946589">ادامه دادن در جلسه جدید</translation> <translation id="4785412405516449976">فقط مخاطبینی که «حساب Google» دارند</translation> <translation id="4789348252524569426">فایلهای گفتار نصب نشد. دستگاهتان باید بهروزرسانی شود. دستگاه را بازراهاندازی کنید و دوباره امتحان کنید.</translation> <translation id="478959186716341421">در حال فرستادن</translation> @@ -1338,6 +1356,10 @@ <translation id="5147567197700016471">قفلنشده</translation> <translation id="5150070631291639005">تنظیمات حریم خصوصی</translation> <translation id="5155897006997040331">سرعت خواندن</translation> +<translation id="5161445389876829235"><ph name="BEGIN_PARAGRAPH1" />این اطلاعاتی کلی درباره دستگاه شما و نحوه استفاده از آن است (برای مثال سطح شارژ باتری، فعالیتها در برنامه و سیستم، و خطاها). از این دادهها برای بهبود Android استفاده خواهد شد و بعضیاز اطلاعات تجمیعشده نیز به برنامههای Google و شریکان، مانند توسعهدهندگان Android کمک خواهد کرد برنامهها و محصولاتشان را بهتر کنند.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />خاموش کردن این ویژگی بر توانایی دستگاه برای ارسال اطلاعات موردنیاز سرویسهای ضروری مانند امنیت و بهروزرسانیهای سیستم تأثیر نمیگذارد.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />مالک میتواند این ویژگی را در «تنظیمات > پیشرفته > ارسال خودکار دادههای تشخیصی و میزان استفاده به Google» کنترل کند.<ph name="END_PARAGRAPH3" /> + <ph name="BEGIN_PARAGRAPH4" />اگر تنظیم «دیگر فعالیتها در وب و برنامه» روشن باشد، ممکن است این دادهها در «حساب Google» شما ذخیره شود. میتوانید در account.google.com، دادههایتان را ببینید، حذف کنید، و تنظیمات حسابتان را تغییر دهید.<ph name="END_PARAGRAPH4" /></translation> <translation id="5163434717504750796">سلامت باتری <ph name="BATTERY_HEALTH_PERCENTAGE" />٪ | تعداد چرخه <ph name="CYCLE_COUNT" /></translation> <translation id="5166007464919321363">ذخیره میز کار بهعنوان الگو</translation> <translation id="5168181903108465623">دستگاههای فرستادن موجود هستند</translation> @@ -1596,6 +1618,10 @@ <translation id="5916646100036936191">اعلان جدید، <ph name="NOTIFICATION_COUNT" /> مورد در مجموع</translation> <translation id="5916664084637901428">روشن</translation> <translation id="5920710855273935292">میکروفون صامت است.</translation> +<translation id="5923808736819114609"><ph name="BEGIN_PARAGRAPH1" />وقتی «دقت مکان» روشن است، از اطلاعات مربوط به سیگنالهای بیسیم، مثل نقاط دسترسی Wi-Fi و دکلهای شبکه تلفن همراه و همچنین دادههای حسگر دستگاه مثل شتابسنج و ژیروسکوپ برای تخمین دقیقتر مکان دستگاه استفاده میشود، و برنامهها و سرویسهای Android از این مکان تخمینی برای ارائه ویژگیهای مکانمبنا استفاده میکنند. برای انجام این کار، Google بهصورت دورهای اطلاعات مربوط به حسگرهای دستگاه و سیگنالهای بیسیم نزدیک این دستگاه را برای انبوهسپاری مکانهای سیگنال بیسیم جمعآوری میکند.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Google از اطلاعات جمعآوریشده از این دستگاه برای بهبود دقت مکان و خدمات مکانمبنا، و به طور کلی بهبود، ارائه، و حفظ سرویسهای Google استفاده میکند. ما این اطلاعات را براساس منافع مشروع Google و اشخاص ثالث بهمنظور برآورده کردن نیازهای کاربران پردازش میکنیم. این اطلاعات برای شناسایی هیچ فردی استفاده نمیشود.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />هرزمان بخواهید میتوانید «دقت مکان» را در تنظیمات مکان این دستگاه خاموش کنید («تنظیمات» > «حریم خصوصی و امنیت» > «کنترلهای حریم خصوصی» > «دسترسی به مکان» > «تنظیمات پیشرفته مکان»). اگر «دقت مکان» خاموش باشد، دادههای «دقت مکان» جمعآوری نخواهد شد. برای برنامهها و سرویسهای Android، درصورت وجود فقط از نشانی IP برای تعیین مکان این دستگاه استفاده میشود که ممکن است بر دردسترس بودن و دقت مکان برای برنامهها و سرویسهای Android مثل Google Maps تأثیر بگذارد.<ph name="END_PARAGRAPH3" /> + <ph name="BEGIN_PARAGRAPH4" /><ph name="LINK_BEGIN" />درباره «دقت مکان» بیشتر بدانید<ph name="LINK_END" /><ph name="END_PARAGRAPH4" /></translation> <translation id="5928083197428724029"><ph name="MANAGER" /> بهروزرسانی را الزامی کرده است</translation> <translation id="5939518447894949180">بازنشانی</translation> <translation id="5946788582095584774"><ph name="FEATURE_NAME" /> روشن است.</translation> @@ -1603,6 +1629,7 @@ <translation id="595202126637698455">ردیابی عملکرد فعال شد</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">کاربر نظارتشده</translation> +<translation id="5959471481388474538">شبکه در دسترس نیست</translation> <translation id="596035801491797438">خاموش کردن «کنترل چهره»</translation> <translation id="5960410286721553511">مشاهده رسانه و عکسهای جدید تلفن</translation> <translation id="5965524703725988602">روشن/خاموش کردن «زمینه تاریک». <ph name="STATE_TEXT" />.</translation> @@ -1641,6 +1668,10 @@ <translation id="6045629311476491587"><ph name="APP_COUNT" /> برنامه از آن استفاده کردهاند</translation> <translation id="6045998054441862242">روشن کردن حالت کنتراست بالا</translation> <translation id="6047696787498798094">زمانی که به یک کاربر دیگر جابهجا میشوید، همرسانی صفحهنمایش متوقف میشود. میخواهید ادامه دهید؟</translation> +<translation id="6051212890006277572"><ph name="BEGIN_PARAGRAPH1" />این اطلاعاتی کلی درباره این دستگاه و نحوه استفاده از آن است (مانند سطح شارژ باتری، فعالیت سیستم و برنامه، و خطاها). از این دادهها برای بهبود Android استفاده خواهد شد و بعضیاز اطلاعات تجمیعشده نیز به برنامههای Google و شریکان، مانند توسعهدهندگان Android کمک خواهد کرد برنامهها و محصولاتشان را بهتر کنند.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />خاموش کردن این ویژگی توانایی این دستگاه را برای ارسال اطلاعات موردنیاز برای سرویسهای ضروری، مانند امنیت و بهروزرسانیهای سیستم تحتتأثیر قرار نمیدهد.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />مالک میتواند این ویژگی را در «تنظیمات > پیشرفته > ارسال خودکار دادههای تشخیصی و میزان استفاده به Google» کنترل کند.<ph name="END_PARAGRAPH3" /> + <ph name="BEGIN_PARAGRAPH4" />اگر تنظیم «دیگر فعالیتها در وب و برنامه» برای فرزندتان روشن باشد، ممکن است این دادهها در «حساب Google» او ذخیره شود. در families.google.com، درباره این تنظیمات و نحوه تغییر آنها بیشتر بدانید.<ph name="END_PARAGRAPH4" /></translation> <translation id="6052614013050385269">راست کلیک یک پیوند</translation> <translation id="6054305421211936131">ورود به سیستم با کارت هوشمند</translation> <translation id="6059276912018042191">برگههای اخیر Chrome</translation> @@ -1749,6 +1780,8 @@ <translation id="639644700271529076">CAPS LOCK خاموش است</translation> <translation id="6406458002328242616">ویرایش زمانسنج. <ph name="FOCUS_DURATION" />.</translation> <translation id="6406704438230478924">دگرساز راست</translation> +<translation id="6407887725738521027"><ph name="BEGIN_PARAGRAPH1" />«خدمات مکان Google» از منابعی مانند Wi-Fi، شبکههای تلفن همراه، و حسگرها برای کمک به تخمین مکان دستگاهتان استفاده میکند.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />میتوانید با خاموش کردن تنظیم اصلی «مکان» در دستگاهتان، «مکان» را خاموش کنید. میتوانید در تنظیمات مکان، استفاده از Wi-Fi، شبکههای تلفن همراه، و حسگرها را هم برای مکان خاموش کنید.<ph name="END_PARAGRAPH2" /></translation> <translation id="6414618057231176439">انتخاب کنید کدام نسخه <ph name="VM_NAME" /> نصب شود.</translation> <translation id="641469293210305670">نصب بهروزرسانیها و برنامهها</translation> <translation id="6417265370957905582">دستیار Google</translation> @@ -2252,6 +2285,7 @@ <translation id="7945357288295809525">نمایش تنظیمات دسترسپذیری، «<ph name="ENABLED_FEATURES" />» فعال است.</translation> <translation id="7946681191253332687">بهروزرسانی امنیتی تمدیدشده دردسترس است</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> میخواهد از <ph name="DEVICE_NAME" /> شما استفاده کند</translation> +<translation id="7948239795436419268">پنجرهها بازیابی نشوند</translation> <translation id="7951630946012935453">کم کردن نور صفحهکلید</translation> <translation id="7953176344218790168">حروف بزرگ</translation> <translation id="7953994493035617347">وضوح جدید را تأیید میکنید؟</translation> @@ -2413,6 +2447,8 @@ <translation id="8481187309597259238">تأیید مجوز USB</translation> <translation id="8487660088084188539">وقتی این ویژگیها را روشن میکنید، ممکن است نوشتار، محتوای سند، و نشانی صفحه وب واردشده به سرورهای Google ارسال شود. از این اطلاعات مطابق با <ph name="LINK_TO_SERVICE_TERMS" />، برای تولید پیشنهاد نوشتاری، تولید خلاصه، پاسخ به سؤالات، و بهبود محصول استفاده میشود. اطلاعات شخصی، حساس، یا محرمانه را وارد نکنید.</translation> <translation id="8487699605742506766">نقطه اتصال</translation> +<translation id="8488561391784577756"><ph name="BEGIN_PARAGRAPH1" />«خدمات مکان Google» از منابعی مانند Wi-Fi، شبکههای تلفن همراه، و حسگرها برای کمک به تخمین مکان این دستگاه استفاده میکند.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />میتوانید با خاموش کردن تنظیم اصلی «مکان» در این دستگاه، «مکان» را خاموش کنید. میتوانید در تنظیمات مکان، استفاده از Wi-Fi، شبکههای تلفن همراه، و حسگرها را هم برای مکان خاموش کنید.<ph name="END_PARAGRAPH2" /></translation> <translation id="8490896350101740396">برنامههای کیوسک زیر «<ph name="UPDATED_APPS" />» بهروز شدهاند. لطفاً برای تکمیل فرآیند بهروزرسانی دستگاه را مجدداً راهاندازی کنید.</translation> <translation id="8491237443345908933">باز کردن پیوند در زبانه جدید</translation> <translation id="8492573885090281069"><ph name="DISPLAY_NAME" /> از <ph name="SPECIFIED_RESOLUTION" /> پشتیبانی نمیکند. وضوح به <ph name="FALLBACK_RESOLUTION" /> تغییر کرد. برای حفظ تغییرات، روی تأیید کلیک کنید. تنظیمات قبلی <ph name="TIMEOUT_SECONDS" /> دیگر بازیابی خواهد شد.</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb index 651bb79..9eed5626 100644 --- a/ash/strings/ash_strings_fi.xtb +++ b/ash/strings/ash_strings_fi.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Akun varaustaso <ph name="BATTERY_PERCENTAGE" /> %, <ph name="TIME" /> jäljellä</translation> <translation id="1178581264944972037">Tauko</translation> <translation id="1179776263021875437">Lopeta tehtävään keskittyminen</translation> +<translation id="1180117276105724040">Palautetaan edellisen istunnon ikkunoita…</translation> <translation id="1181037720776840403">Poista</translation> <translation id="1182225749592316782">Sallii pääsyn kaikille sovelluksille ja verkkosivustoille, joilla on kamera- ja mikrofonilupa</translation> <translation id="1182876754474670069">koti</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Vaihdetaanko audiolähdettä?</translation> <translation id="1505542291183484463">Laattamuotoisen ikkunan koon siirtäminen alaspäin</translation> <translation id="1510238584712386396">Käynnistysohjelma</translation> +<translation id="1519090060276706457">Ikkunoiden palauttaminen kestää odotettua kauemmin</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Näytä ilmoitusasetukset. Ilmoitukset on poistettu 1 sovelluksen käytöstä.}other{Näytä ilmoitusasetukset. Ilmoitukset on poistettu # sovelluksen käytöstä.}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">Akku <ph name="BATTERY_PERCENTAGE" /> % | <ph name="TIME" /> täyteen lataukseen</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Vaihda pikkuruutu-ikkunan maksimikoon tai tämänhetkisen koon välillä</translation> <translation id="1787955149152357925">Pois päältä</translation> <translation id="1796561540704213354">Verkkosivustot, esimerkiksi aiemmin avaamasi sivut ja avoinna olevat sivut</translation> +<translation id="1799852120691957794">Edellisen istunnon ikkunoita ei voi palauttaa</translation> <translation id="1805407494113167797">Keskittymisääniä ei voitu toistaa</translation> <translation id="181103072419391116">Signaalin vahvuus <ph name="SIGNAL_STRENGTH" />, järjestelmänvalvojan hallinnoima</translation> <translation id="1815039896005206046">En tykkää ‑painike kertoo, ettet pidä tästä ehdotetusta ryhmästä</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Ota kuvakaappaus</translation> <translation id="2598725286293895280">Työpöydällä on ei-tuettuja sovelluksia</translation> <translation id="2607678425161541573">Edellyttää kirjautumista verkossa</translation> +<translation id="2611702650078660078">Tapahtui virhe</translation> <translation id="2612072250312279703">toimintojen seuranta</translation> <translation id="261210853165551493">Kopioi muotoilulla</translation> <translation id="2612614436418177118">Siirrä sovelluksen kuvaketta sovellusruudukossa</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Ota koko näytön kuvakaappaus painamalla Enter</translation> <translation id="2849936225196189499">Kriittinen</translation> <translation id="2850207700020959936">Sovelluksilla on pääsy kameraan</translation> +<translation id="2852045827873867442">Edellyttää internetyhteyttä.</translation> <translation id="2860184359326882502">Paras osuma</translation> <translation id="2865888419503095837">Verkon tiedot</translation> <translation id="2869095047958348710">Viime <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Osoitteen <ph name="USER_EMAIL_ADDRESS" /> salasana</translation> <translation id="4777825441726637019">Play Kauppa</translation> <translation id="4778095205580009397">Google Assistantia ei voi käyttää demo-käyttökerralla.</translation> +<translation id="4781633367688946589">Jatka uuteen istuntoon</translation> <translation id="4785412405516449976">Vain kontaktisi, joilla on Google-tili</translation> <translation id="4789348252524569426">Puhetiedostojen asentaminen ei onnistu. Laite on päivitettävä. Käynnistä laite uudelleen ja yritä sitten.</translation> <translation id="478959186716341421">Suoratoistetaan</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Tehokkuuden seuranta on käytössä</translation> <translation id="5955304353782037793">sov.</translation> <translation id="5958529069007801266">Valvottu käyttäjä</translation> +<translation id="5959471481388474538">Verkko ei käytettävissä</translation> <translation id="596035801491797438">Laita kasvo-ohjaus pois päältä</translation> <translation id="5960410286721553511">Katsele puhelimesi viimeisimpiä kuvia ja mediaa</translation> <translation id="5965524703725988602">Tumma teema päälle/pois. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Näytä saavutettavuusasetukset, <ph name="ENABLED_FEATURES" /> käytössä.</translation> <translation id="7946681191253332687">Laajempia tietoturvapäivityksiä saatavilla</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> haluaa käyttää tätä: <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Älä palauta ikkunoita</translation> <translation id="7951630946012935453">Himmennä näppäimistö</translation> <translation id="7953176344218790168">ISOT KIRJAIMET</translation> <translation id="7953994493035617347">Vahvistetaanko uusi resoluutio?</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb index cb5fa50..fa5e0e2e7 100644 --- a/ash/strings/ash_strings_fil.xtb +++ b/ash/strings/ash_strings_fil.xtb
@@ -21,6 +21,11 @@ <translation id="1059120031266247284">Naka-share sa iyo</translation> <translation id="1060847216467038176"><ph name="ITEM_LABEL" /> na may button na alisin</translation> <translation id="1062407476771304334">Palitan</translation> +<translation id="1065931689816135472"><ph name="BEGIN_PARAGRAPH1" />I-back up sa Google Drive. Madaling i-restore ang iyong data o magpalit ng device anumang oras. Kasama sa iyong backup ang data ng app.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Ina-upload ang mga backup mo sa Google at ine-encrypt ang mga ito gamit ang password ng iyong Google Account.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />Ang data ng app ay puwedeng anumang data na na-save ng isang app (batay sa mga setting ng developer), kasama ang data gaya ng mga contact, mensahe, at larawan.<ph name="END_PARAGRAPH3" /> + <ph name="BEGIN_PARAGRAPH4" />Hindi bibilangin ang data ng backup sa quota ng storage ng Drive mo.<ph name="END_PARAGRAPH4" /> + <ph name="BEGIN_PARAGRAPH5" />Puwede mong i-off ang serbisyong ito sa Mga Setting.<ph name="END_PARAGRAPH5" /></translation> <translation id="1073899992769346247">Palitan o i-recharge ang baterya</translation> <translation id="1081015718268701546">Hindi sinusuportahan sa kasalukuyan ang mga Linux app. Mase-save ang iba pang app.</translation> <translation id="108486256082349153">Cellular: <ph name="ADDRESS" /></translation> @@ -52,6 +57,7 @@ <translation id="1175944128323889279">Kasalukuyang level ng baterya <ph name="BATTERY_PERCENTAGE" />%, may natitira pang <ph name="TIME" /></translation> <translation id="1178581264944972037">I-pause</translation> <translation id="1179776263021875437">Ihinto ang pag-focus sa gawain</translation> +<translation id="1180117276105724040">Nire-restore ang mga window mula sa iyong nakaraang session...</translation> <translation id="1181037720776840403">Alisin</translation> <translation id="1182225749592316782">Pinapayagan nito ang access para sa lahat ng app at website na may mga pahintulot sa camera at mikropono</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +172,7 @@ <translation id="1501946871587957338">Palitan ang source ng audio?</translation> <translation id="1505542291183484463">I-resize ang naka-tile na window pababa</translation> <translation id="1510238584712386396">Launcher</translation> +<translation id="1519090060276706457">Mas matagal kaysa sa inaasahan ang pag-restore ng mga window</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Ipakita ang mga setting ng notification. Naka-off ang mga notification para sa isang app}one{Ipakita ang mga setting ng notification. Naka-off ang mga notification para sa # app}other{Ipakita ang mga setting ng notification. Naka-off ang mga notification para sa # na app}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003"><ph name="BATTERY_PERCENTAGE" />% ng baterya | <ph name="TIME" /> bago mapuno</translation> @@ -260,6 +267,7 @@ <translation id="1786487376942610288">Magpalipat-lipat sa maximum o kasalukuyang laki ng picture-in-picture na window</translation> <translation id="1787955149152357925">Naka-off</translation> <translation id="1796561540704213354">Mga website kasama ang mga page na binisita mo at nakabukas na page</translation> +<translation id="1799852120691957794">Hindi ma-restore ang mga window mula sa iyong nakaraang session</translation> <translation id="1805407494113167797">Hindi ma-play ang Mga tunog para sa pag-focus</translation> <translation id="181103072419391116">Lakas ng Signal <ph name="SIGNAL_STRENGTH" />, Pinapamahalaan ng iyong Administrator</translation> <translation id="1815039896005206046">Sa pag-thumbs down, magsusumite ng feedback na hindi mo gusto ang iminumungkahing grupo na ito</translation> @@ -491,6 +499,7 @@ <translation id="2596078834055697711">Kumuha ng screenshot ng window</translation> <translation id="2598725286293895280">Mga hindi sinusuportahang app sa desk</translation> <translation id="2607678425161541573">Kailangang mag-sign in online</translation> +<translation id="2611702650078660078">Nagka-error</translation> <translation id="2612072250312279703">activity monitor</translation> <translation id="261210853165551493">Kopyahin kasama ang pag-format</translation> <translation id="2612614436418177118">Ilipat ang icon ng isang app sa grid ng app</translation> @@ -575,6 +584,7 @@ <translation id="2848120746144143659">Pindutin ang enter para mag-capture screenshot ng full screen</translation> <translation id="2849936225196189499">Kritikal</translation> <translation id="2850207700020959936">Maa-access ng mga app ang camera</translation> +<translation id="2852045827873867442">Nire-require ang koneksyon sa internet.</translation> <translation id="2860184359326882502">Pinakatumutugma</translation> <translation id="2865888419503095837">Impormasyon ng network</translation> <translation id="2869095047958348710">Nitong nakalipas na <ph name="DAY_OF_WEEK" /></translation> @@ -769,6 +779,10 @@ <translation id="3470502288861289375">Kinokopya...</translation> <translation id="347117769229524881"><ph name="MODIFIER_ONE" /><ph name="MODIFIER_TWO" /><ph name="KEY_ONE" /> pagkatapos ay <ph name="KEY_TWO" /> o <ph name="KEY_THREE" /></translation> <translation id="3477079411857374384">Control-Shift-Space</translation> +<translation id="3484174798079475132"><ph name="BEGIN_PARAGRAPH1" />Kapag naka-on ang Katumpakan ng Lokasyon, gagamitin ang impormasyon tungkol sa mga wireless na signal, gaya ng mga access point ng Wi-Fi at tower ng cellular network, pati ang data ng sensor ng device, gaya ng accelerometer at gyroscope, para matantya ang mas tumpak na lokasyon ng device, na ginagamit ng mga app at serbisyo ng Android para magbigay ng mga feature na batay sa lokasyon. Para magawa ito, pana-panahong kinokolekta ng Google ang impormasyon tungkol sa mga sensor ng device at wireless na signal na malapit sa iyo para mag-ambag sa mga na-crowdsource na lokasyon ng wireless na signal.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Ginagamit ng Google ang impormasyong ito nang hindi ibinibigay ang iyong pagkakakilanlan para: mapahusay ang katumpakan ng lokasyon at mga serbisyong batay sa lokasyon; at mapahusay, maibigay, at mapanatili sa pangkalahatan ang mga serbisyo ng Google. Pinoproseso namin ang impormasyong ito batay sa mga lehitimong interes ng Google at mga third party para tugunan ang mga pangangailangan ng mga user.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />Puwede mong i-off ang Katumpakan ng Lokasyon sa anumang oras sa mga setting ng lokasyon ng iyong device sa ilalim ng Mga Setting > Privacy at seguridad > Mga kontrol sa privacy > Access sa lokasyon > Mga advanced na setting ng lokasyon. Kung naka-off ang Katumpakan ng Lokasyon, hindi mangongolekta ng data ng Katumpakan ng Lokasyon. Para sa mga app at serbisyo ng Android, ang IP address lang ang ginagamit, kung available, para tukuyin ang lokasyon ng iyong device, na puwedeng makaapekto sa availability at katumpakan ng mga lokasyon para sa mga app at serbisyo ng Android gaya ng Google Maps.<ph name="END_PARAGRAPH3" /> + <ph name="BEGIN_PARAGRAPH4" /><ph name="LINK_BEGIN" />Matuto pa tungkol sa Katumpakan ng Lokasyon<ph name="LINK_END" /><ph name="END_PARAGRAPH4" /></translation> <translation id="3485319357743610354"><ph name="SECURITY_STATUS" />, <ph name="CONNECTION_STATUS" />, Lakas ng Signal <ph name="SIGNAL_STRENGTH" /></translation> <translation id="348799646910989694">Awtomatikong itinago ang shelf</translation> <translation id="3496797737329654668">Maglaro na tayo</translation> @@ -873,6 +887,9 @@ <translation id="3742055079367172538">Nakakuha na ng screenshot</translation> <translation id="3743775386021959186">Naka-on ang Pag-focus, may <ph name="REMAINING_TIME" /> pa</translation> <translation id="3750403286520637847">I-hide ang suhestyon sa lagay ng panahon</translation> +<translation id="3755239467337474637"><ph name="BEGIN_PARAGRAPH1" />Ang data ng app ay puwedeng anumang data na na-save ng isang app (batay sa mga setting ng developer), kasama ang data gaya ng mga contact, mensahe, at larawan.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Hindi bibilangin ang data ng backup sa quota ng storage ng Drive ng iyong anak.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />Puwede mong i-off ang serbisyong ito sa Mga Setting.<ph name="END_PARAGRAPH3" /></translation> <translation id="3756485814916578707">Kina-cast ang screen</translation> <translation id="3765841382945324995">Na-update ang shortcut para sa <ph name="SIX_PACK_KEY_NAME" /> sa <ph name="NEW_SHORTCUT" /> mula sa dating <ph name="OLD_SHORTCUT" /></translation> <translation id="3765841986579723851">Na-edit ngayon</translation> @@ -1215,6 +1232,7 @@ <translation id="4776917500594043016">Password para sa <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">Hindi available ang Google Assistant sa demo session.</translation> +<translation id="4781633367688946589">Magpatuloy sa bagong session</translation> <translation id="4785412405516449976">Mga contact mo lang na may Google Account</translation> <translation id="4789348252524569426">Hindi ma-install ang mga file ng speech. Kailangang i-update ang iyong device. I-restart ang iyong device at subukan ulit.</translation> <translation id="478959186716341421">Nagka-cast</translation> @@ -1338,6 +1356,10 @@ <translation id="5147567197700016471">Na-unlock na</translation> <translation id="5150070631291639005">Mga setting ng privacy</translation> <translation id="5155897006997040331">Bilis ng pagbabasa</translation> +<translation id="5161445389876829235"><ph name="BEGIN_PARAGRAPH1" />Pangkalahatang impormasyon ito tungkol sa iyong device at kung paano mo ito ginagamit (gaya ng level ng baterya, aktibidad ng system at app, at mga error). Gagamitin ang data para pahusayin ang Android, at makakatulong din ang ilang pinagsama-samang impormasyon sa mga app at partner ng Google, gaya ng mga developer ng Android, na pahusayin ang kanilang mga app at produkto.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Ang pag-off sa feature na ito ay hindi nakakaapekto sa kakayahan ng iyong device na ipadala ang impormasyong kinakailangan para sa mahahalagang serbisyo tulad ng mga update sa system at seguridad.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />Puwedeng konrolin ng may-ari ang feature na ito mula sa Mga Setting > Advanced > Awtomatikong magpadala ng data ng diagnostic at paggamit sa Google.<ph name="END_PARAGRAPH3" /> + <ph name="BEGIN_PARAGRAPH4" />Kung naka-on ang iyong setting na karagdagang Aktibidad sa Web at App, posibleng ma-save ang data na ito sa Google Account mo. Puwede mong makita ang iyong data, i-delete ito, at baguhin ang mga setting ng account mo sa account.google.com.<ph name="END_PARAGRAPH4" /></translation> <translation id="5163434717504750796">Kalagayan ng baterya <ph name="BATTERY_HEALTH_PERCENTAGE" />% | Bilang ng cycle <ph name="CYCLE_COUNT" /></translation> <translation id="5166007464919321363">I-save ang bilang template</translation> <translation id="5168181903108465623">I-cast ang mga available na device</translation> @@ -1596,6 +1618,10 @@ <translation id="5916646100036936191">Bagong notification, <ph name="NOTIFICATION_COUNT" /> sa kabuuan</translation> <translation id="5916664084637901428">Naka-on</translation> <translation id="5920710855273935292">Naka-mute ang mikropono.</translation> +<translation id="5923808736819114609"><ph name="BEGIN_PARAGRAPH1" />Kapag naka-on ang Katumpakan ng Lokasyon, gagamitin ang impormasyon tungkol sa mga wireless na signal, gaya ng mga access point ng Wi-Fi at tower ng cellular network, pati ang data ng sensor ng device, gaya ng accelerometer at gyroscope, para matantya ang mas tumpak na lokasyon ng device, na ginagamit ng mga app at serbisyo ng Android para magbigay ng mga feature na batay sa lokasyon. Para magawa ito, pana-panahong kinokolekta ng Google ang impormasyon tungkol sa mga sensor ng device at wireless na signal na malapit sa device na ito para mag-ambag sa mga na-crowdsource na lokasyon ng wireless na signal.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Ginagamit ng Google ang impormasyong ito na kinolekta mula sa device na ito para: mapahusay ang katumpakan ng lokasyon at mga serbisyong batay sa lokasyon; at mapahusay, maibigay, at mapanatili sa pangkalahatan ang mga serbisyo ng Google. Pinoproseso namin ang impormasyong ito batay sa mga lehitimong interes ng Google at mga third party para tugunan ang mga pangangailangan ng mga user. Hindi ginagamit ang impormasyong ito para tumukoy ng sinumang indibidwal.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />Puwede mong i-off ang Katumpakan ng Lokasyon sa anumang oras sa mga setting ng lokasyon ng device na ito sa ilalim ng Mga Setting > Privacy at seguridad > Mga kontrol sa privacy > Access sa lokasyon > Mga advanced na setting ng lokasyon. Kung naka-off ang Katumpakan ng Lokasyon, hindi mangongolekta ng data ng Katumpakan ng Lokasyon. Para sa mga app at serbisyo ng Android, ang IP address lang ang ginagamit, kung available, para tukuyin ang lokasyon ng device na ito, na puwedeng makaapekto sa availability at katumpakan ng mga lokasyon para sa mga app at serbisyo ng Android gaya ng Google Maps.<ph name="END_PARAGRAPH3" /> + <ph name="BEGIN_PARAGRAPH4" /><ph name="LINK_BEGIN" />Matuto pa tungkol sa Katumpakan ng Lokasyon<ph name="LINK_END" /><ph name="END_PARAGRAPH4" /></translation> <translation id="5928083197428724029">Nire-require ng <ph name="MANAGER" /> ang pag-update</translation> <translation id="5939518447894949180">I-reset</translation> <translation id="5946788582095584774">Naka-on ang <ph name="FEATURE_NAME" />.</translation> @@ -1603,6 +1629,7 @@ <translation id="595202126637698455">Naka-enable ang pagte-trace sa pagganap</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Pinangangasiwaang user</translation> +<translation id="5959471481388474538">Hindi available ang network</translation> <translation id="596035801491797438">I-off ang Pagkontrol gamit ang mukha</translation> <translation id="5960410286721553511">Tingnan ang mga pinakabagong larawan at media ng iyong telepono</translation> <translation id="5965524703725988602">I-toggle ang Madilim na tema. <ph name="STATE_TEXT" />.</translation> @@ -1641,6 +1668,10 @@ <translation id="6045629311476491587">Ginagamit ng <ph name="APP_COUNT" /> (na) app</translation> <translation id="6045998054441862242">I-on ang high contrast mode</translation> <translation id="6047696787498798094">Matitigil ang screen sharing kapag nagpalit ka ng user. Gusto mo bang magpatuloy?</translation> +<translation id="6051212890006277572"><ph name="BEGIN_PARAGRAPH1" />Pangkalahatang impormasyon ito tungkol sa device na ito at kung paano ito ginagamit (gaya ng level ng baterya, aktibidad ng system at app, at mga error). Gagamitin ang data para pahusayin ang Android, at makakatulong din ang ilang pinagsama-samang impormasyon sa mga app at partner ng Google, gaya ng mga developer ng Android, na pahusayin ang kanilang mga app at produkto.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Ang pag-off sa feature na ito ay hindi nakakaapekto sa kakayahan ng device na ito na ipadala ang impormasyong kinakailangan para sa mahahalagang serbisyo tulad ng mga update sa system at seguridad.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />Puwedeng konrolin ng may-ari ang feature na ito mula sa Mga Setting > Advanced > Awtomatikong magpadala ng data ng diagnostic at paggamit sa Google.<ph name="END_PARAGRAPH3" /> + <ph name="BEGIN_PARAGRAPH4" />Kung naka-on ang setting na karagdagang Aktibidad sa Web at App para sa iyong anak, posibleng ma-save ang data na ito sa kanyang Google Account. Matuto pa tungkol sa mga setting na ito at kung paano i-adjust ang mga ito sa families.google.com.<ph name="END_PARAGRAPH4" /></translation> <translation id="6052614013050385269">Mag-right click ng link</translation> <translation id="6054305421211936131">Mag-sign in gamit ang smart card</translation> <translation id="6059276912018042191">Mga kamakailang tab ng Chrome</translation> @@ -1749,6 +1780,8 @@ <translation id="639644700271529076">Naka-off ang CAPS LOCK</translation> <translation id="6406458002328242616">I-edit ang orasan. <ph name="FOCUS_DURATION" />.</translation> <translation id="6406704438230478924">altgr</translation> +<translation id="6407887725738521027"><ph name="BEGIN_PARAGRAPH1" />Gumagamit ang serbisyo sa lokasyon ng Google ng mga source tulad ng Wi-Fi, mga mobile network, at mga sensor para makatulong na tantyahin ang lokasyon ng iyong device.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Puwede mong i-off ang Lokasyon sa pamamagitan ng pag-off sa pangunahing setting ng Lokasyon sa iyong device. Puwede mo ring i-off ang paggamit ng Wi-Fi, mga mobile network, at mga sensor para sa lokasyon sa mga setting ng lokasyon.<ph name="END_PARAGRAPH2" /></translation> <translation id="6414618057231176439">Piliin kung aling bersyon ng <ph name="VM_NAME" /> ang ii-install.</translation> <translation id="641469293210305670">Mag-install ng Mga Update at App</translation> <translation id="6417265370957905582">Google Assistant</translation> @@ -2251,6 +2284,7 @@ <translation id="7945357288295809525">Ipakita ang mga setting ng accessibility, naka-enable ang "<ph name="ENABLED_FEATURES" />."</translation> <translation id="7946681191253332687">Available ang mga pinalawig na update sa seguridad</translation> <translation id="7947798320695032612">Gustong gamitin ng <ph name="APP_NAME" /> ang iyong <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Huwag i-restore ang mga window</translation> <translation id="7951630946012935453">I-dim ang keyboard</translation> <translation id="7953176344218790168">UPPERCASE</translation> <translation id="7953994493035617347">Kumpirmahin ang bagong resolution?</translation> @@ -2412,6 +2446,8 @@ <translation id="8481187309597259238">Kumpirmahin ang Pahintulot sa USB</translation> <translation id="8487660088084188539">Kapag na-on mo ang mga feature na ito, puwedeng ipadala ang text ng input, content ng dokumento, at URL ng web page sa mga server ng Google. Ginagamit ang impormasyong ito para bumuo ng mga writing suggestion, bumuo ng mga buod, sumagot ng mga tanong, at pahusayin ang produkto, nang napapailalim sa <ph name="LINK_TO_SERVICE_TERMS" />. Huwag maglagay ng kahit anong personal, sensitibo, o kumpidensyal.</translation> <translation id="8487699605742506766">Hotspot</translation> +<translation id="8488561391784577756"><ph name="BEGIN_PARAGRAPH1" />Ang serbisyo sa lokasyon ng Google ay gumagamit ng mga source gaya ng Wi-Fi, mga mobile network, at mga sensor para makatulong na tantyahin ang lokasyon ng device na ito.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Puwede mong i-off ang Lokasyon sa pamamagitan ng pag-off sa pangunahing setting ng Lokasyon sa device na ito. Puwede mo ring i-off ang paggamit ng Wi-Fi, mga mobile network, at mga sensor para sa lokasyon sa mga setting ng lokasyon.<ph name="END_PARAGRAPH2" /></translation> <translation id="8490896350101740396">Na-update ang mga sumusunod na kiosk app "<ph name="UPDATED_APPS" />." Mangyaring i-reboot ang device upang makumpleto ang proseso ng pag-update.</translation> <translation id="8491237443345908933">Buksan ang link sa bagong tab</translation> <translation id="8492573885090281069">Hindi sinusuportahan ng <ph name="DISPLAY_NAME" /> ang <ph name="SPECIFIED_RESOLUTION" />. Ginawang <ph name="FALLBACK_RESOLUTION" /> ang resolution. I-click ang kumpirmahin para panatilihin ang mga pagbabago. Ire-restore ang mga dating setting pagkalipas ng <ph name="TIMEOUT_SECONDS" />.</translation>
diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb index e0a17e2..b661c84 100644 --- a/ash/strings/ash_strings_fr-CA.xtb +++ b/ash/strings/ash_strings_fr-CA.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Niveau actuel de charge de la pile à <ph name="BATTERY_PERCENTAGE" /> %, il reste <ph name="TIME" /></translation> <translation id="1178581264944972037">Interrompre</translation> <translation id="1179776263021875437">Arrêter de se concentrer sur la tâche</translation> +<translation id="1180117276105724040">Restauration des fenêtres de votre session précédente en cours…</translation> <translation id="1181037720776840403">Supprimer</translation> <translation id="1182225749592316782">Cela autorise l'accès à toutes les applications et à tous les sites Web disposant des autorisations de caméra et de microphone</translation> <translation id="1182876754474670069">début</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Changer la source audio?</translation> <translation id="1505542291183484463">Fenêtre de redimensionnement en tuile vers le bas</translation> <translation id="1510238584712386396">Lanceur</translation> +<translation id="1519090060276706457">La restauration des fenêtres prend plus de temps que prévu</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Afficher les paramètres de notification. Les notifications sont désactivées pour une application}one{Afficher les paramètres de notification. Les notifications sont désactivées pour # application}other{Afficher les paramètres de notification. Les notifications sont désactivées pour # applications}}</translation> <translation id="1521655867290435174">Google Feuilles de calcul</translation> <translation id="1523032696246003">Pile à <ph name="BATTERY_PERCENTAGE" /> % | Recharge complète dans <ph name="TIME" /></translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Basculer entre la taille maximale et la taille actuelle de la fenêtre d'incrustation d'image</translation> <translation id="1787955149152357925">Désactivé</translation> <translation id="1796561540704213354">Sites Web comprenant les pages que vous avez visitées et les pages ouvertes</translation> +<translation id="1799852120691957794">Impossible de restaurer les fenêtres de votre session précédente</translation> <translation id="1805407494113167797">Impossible de faire jouer les sons Sans distractions</translation> <translation id="181103072419391116">Force du signal : <ph name="SIGNAL_STRENGTH" />, géré par votre administrateur</translation> <translation id="1815039896005206046">La mention Je n'aime pas indique que vous n'aimez pas le groupe suggéré.</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Faire une capture d'écran de la fenêtre</translation> <translation id="2598725286293895280">Applications non compatibles dans le bureau</translation> <translation id="2607678425161541573">Connexion en ligne requise</translation> +<translation id="2611702650078660078">Une erreur s'est produite</translation> <translation id="2612072250312279703">moniteur d'activité</translation> <translation id="261210853165551493">Copier avec le formatage</translation> <translation id="2612614436418177118">Déplacer une icône d'application dans la grille d'applications</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Appuyez sur Entrée pour effectuer une capture plein écran</translation> <translation id="2849936225196189499">Essentielle</translation> <translation id="2850207700020959936">Les applis peuvent accéder à l'appareil photo</translation> +<translation id="2852045827873867442">Une connexion Internet est requise.</translation> <translation id="2860184359326882502">Meilleures correspondances</translation> <translation id="2865888419503095837">Information réseau</translation> <translation id="2869095047958348710"><ph name="DAY_OF_WEEK" /> dernier</translation> @@ -1214,6 +1219,7 @@ <translation id="4776917500594043016">Mot de passe pour <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">L'Assistant Google n'est pas disponible dans une session de démonstration.</translation> +<translation id="4781633367688946589">Continuer vers une nouvelle session</translation> <translation id="4785412405516449976">Seulement vos contacts qui ont un compte Google</translation> <translation id="4789348252524569426">Impossible d'installer les fichiers vocaux. Votre appareil doit être mis à jour. Redémarrez votre appareil et réessayez.</translation> <translation id="478959186716341421">Diffusion en cours…</translation> @@ -1602,6 +1608,7 @@ <translation id="595202126637698455">Suivi des performances activé</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Utilis. supervisé</translation> +<translation id="5959471481388474538">Le réseau n'est pas accessible</translation> <translation id="596035801491797438">Désactiver la commande par le visage</translation> <translation id="5960410286721553511">Affichez les photos et les fichiers multimédias récents de votre téléphone</translation> <translation id="5965524703725988602">Activer/désactiver le thème sombre. <ph name="STATE_TEXT" />.</translation> @@ -2251,6 +2258,7 @@ <translation id="7945357288295809525">Afficher les paramètres d'accessibilité, « <ph name="ENABLED_FEATURES" /> » activé.</translation> <translation id="7946681191253332687">Mises à jour de sécurité étendues accessibles</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> souhaite utiliser votre <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Ne pas restaurer les fenêtres</translation> <translation id="7951630946012935453">Assombrir le clavier</translation> <translation id="7953176344218790168">MAJUSCULES</translation> <translation id="7953994493035617347">Confirmer la nouvelle résolution?</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb index 8c76fcdc..73fab5b 100644 --- a/ash/strings/ash_strings_fr.xtb +++ b/ash/strings/ash_strings_fr.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Niveau de batterie actuel : <ph name="BATTERY_PERCENTAGE" /> %. Temps restant :<ph name="TIME" /></translation> <translation id="1178581264944972037">Suspendre</translation> <translation id="1179776263021875437">Arrêter de se concentrer sur la tâche</translation> +<translation id="1180117276105724040">Restauration des fenêtres de votre session précédente...</translation> <translation id="1181037720776840403">Supprimer</translation> <translation id="1182225749592316782">L'accès est accordé à l'ensemble des sites Web et applis ayant l'autorisation d'accéder à l'appareil photo et au micro</translation> <translation id="1182876754474670069">Accueil</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Changer de source audio ?</translation> <translation id="1505542291183484463">Redimensionner la fenêtre en mosaïque vers le bas</translation> <translation id="1510238584712386396">Lanceur d'applications</translation> +<translation id="1519090060276706457">La restauration des fenêtres prend plus de temps que prévu</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Afficher les paramètres de notification. Les notifications sont désactivées pour une application}one{Afficher les paramètres de notification. Les notifications sont désactivées pour # application}other{Afficher les paramètres de notification. Les notifications sont désactivées pour # applications}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003"><ph name="BATTERY_PERCENTAGE" /> % de batterie | <ph name="TIME" /> avant la charge complète</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Alterner entre la taille maximale et la taille actuelle de la fenêtre Picture-in-picture</translation> <translation id="1787955149152357925">Désactivé</translation> <translation id="1796561540704213354">Sites Web, y compris les pages que vous avez consultées et celles que vous avez ouvertes</translation> +<translation id="1799852120691957794">Impossible de restaurer les fenêtres de votre session précédente</translation> <translation id="1805407494113167797">Impossible de lire les sons pour se concentrer</translation> <translation id="181103072419391116">Force du signal : <ph name="SIGNAL_STRENGTH" />, géré par votre administrateur</translation> <translation id="1815039896005206046">Je n'aime pas indique que ce groupe suggéré ne vous convient pas</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Faire une capture de la fenêtre</translation> <translation id="2598725286293895280">Applis non compatibles dans le bureau</translation> <translation id="2607678425161541573">Connexion en ligne requise</translation> +<translation id="2611702650078660078">Une erreur s'est produite</translation> <translation id="2612072250312279703">moniteur d'activité</translation> <translation id="261210853165551493">Copier avec la mise en forme</translation> <translation id="2612614436418177118">Déplacer une icône d'application dans la grille d'applications</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Appuyez sur Entrée pour faire une capture de tout l'écran</translation> <translation id="2849936225196189499">Essentielle</translation> <translation id="2850207700020959936">Les applis peuvent accéder à la caméra</translation> +<translation id="2852045827873867442">Une connexion Internet est requise.</translation> <translation id="2860184359326882502">Meilleure correspondance</translation> <translation id="2865888419503095837">Informations réseau</translation> <translation id="2869095047958348710"><ph name="DAY_OF_WEEK" /> dernier</translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Mot de passe de <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">L'Assistant Google n'est pas disponible dans une session de démonstration.</translation> +<translation id="4781633367688946589">Accéder à une nouvelle session</translation> <translation id="4785412405516449976">Seulement vos contacts disposant d'un compte Google</translation> <translation id="4789348252524569426">Impossible d'installer les fichiers vocaux. Votre appareil doit être mis à jour. Redémarrez-le et réessayez.</translation> <translation id="478959186716341421">Diffusion en cours…</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Suivi des performances activé</translation> <translation id="5955304353782037793">application</translation> <translation id="5958529069007801266">Utilis. supervisé</translation> +<translation id="5959471481388474538">Réseau indisponible</translation> <translation id="596035801491797438">Désactiver la commande par le visage</translation> <translation id="5960410286721553511">Afficher les photos et contenus multimédias récents de votre téléphone</translation> <translation id="5965524703725988602">Activer/Désactiver le thème sombre. <ph name="STATE_TEXT" />.</translation> @@ -2253,6 +2260,7 @@ <translation id="7945357288295809525">Afficher les paramètres d'accessibilité, "<ph name="ENABLED_FEATURES" />" activé(e).</translation> <translation id="7946681191253332687">Mises à jour de sécurité étendues disponibles</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> souhaite utiliser votre <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Ne pas restaurer les fenêtres</translation> <translation id="7951630946012935453">Réduire la luminosité du clavier</translation> <translation id="7953176344218790168">MAJUSCULES</translation> <translation id="7953994493035617347">Confirmer la nouvelle résolution ?</translation>
diff --git a/ash/strings/ash_strings_gl.xtb b/ash/strings/ash_strings_gl.xtb index a26b2aa..bb1abe3 100644 --- a/ash/strings/ash_strings_gl.xtb +++ b/ash/strings/ash_strings_gl.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Nivel actual da batería: <ph name="BATTERY_PERCENTAGE" /> %. Tempo restante: <ph name="TIME" /></translation> <translation id="1178581264944972037">Pausar</translation> <translation id="1179776263021875437">Deixar de concentrarse na tarefa</translation> +<translation id="1180117276105724040">Restaurando ventás da sesión anterior...</translation> <translation id="1181037720776840403">Eliminar</translation> <translation id="1182225749592316782">Desta forma, terán acceso todas as aplicacións e sitios web con permiso de acceso á cámara e ao micrófono</translation> <translation id="1182876754474670069">inicio</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Queres cambiar a fonte de audio?</translation> <translation id="1505542291183484463">Colocar ventá de cambio de tamaño de mosaico cara abaixo</translation> <translation id="1510238584712386396">Menú de aplicacións</translation> +<translation id="1519090060276706457">A restauración das ventás está tardando máis do esperado</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Mostrar a configuración de notificacións. Están desactivadas para unha aplicación}other{Mostrar a configuración de notificacións. Están desactivadas para # aplicacións}}</translation> <translation id="1521655867290435174">Follas de cálculo de Google</translation> <translation id="1523032696246003">Batería: <ph name="BATTERY_PERCENTAGE" /> % | <ph name="TIME" /> para completar a carga</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Cambiar entre o tamaño máximo e o actual da ventá da pantalla superposta</translation> <translation id="1787955149152357925">Desactivado</translation> <translation id="1796561540704213354">Sitios web que inclúen as páxinas que visitaches e as abertas</translation> +<translation id="1799852120691957794">Non se poden restaurar as ventás da sesión anterior</translation> <translation id="1805407494113167797">Non se puideron reproducir os sons do modo Sen distraccións</translation> <translation id="181103072419391116">Intensidade do sinal do <ph name="SIGNAL_STRENGTH" />, xestionada polo teu administrador</translation> <translation id="1815039896005206046">Co botón Non me gusta indicas que non che gusta este grupo suxerido</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Fai unha captura de pantalla da ventá</translation> <translation id="2598725286293895280">O escritorio contén aplicacións non compatibles</translation> <translation id="2607678425161541573">É necesario iniciar sesión en liña</translation> +<translation id="2611702650078660078">Produciuse un erro</translation> <translation id="2612072250312279703">monitor de actividade</translation> <translation id="261210853165551493">Copiar con formato</translation> <translation id="2612614436418177118">Move a icona dunha aplicación dentro da grade de aplicacións</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Premer Introducir para facer captura de pantalla completa</translation> <translation id="2849936225196189499">Esencial</translation> <translation id="2850207700020959936">As aplicacións poden acceder á cámara</translation> +<translation id="2852045827873867442">Cómpre ter conexión a Internet.</translation> <translation id="2860184359326882502">Do mellor resultado ao peor</translation> <translation id="2865888419503095837">Información da rede</translation> <translation id="2869095047958348710">O <ph name="DAY_OF_WEEK" /> pasado</translation> @@ -1216,6 +1221,7 @@ <translation id="4776917500594043016">Contrasinal de <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">O Asistente de Google non está dispoñible cando se utiliza unha sesión de demostración.</translation> +<translation id="4781633367688946589">Continuar na nova sesión</translation> <translation id="4785412405516449976">Só os contactos que teñan unha Conta de Google</translation> <translation id="4789348252524569426">Non se puideron instalar os ficheiros de voz. Cómpre actualizar o teu dispositivo. Reinicia o dispositivo e téntao de novo.</translation> <translation id="478959186716341421">Emitindo</translation> @@ -1604,6 +1610,7 @@ <translation id="595202126637698455">Seguimento do rendemento activado</translation> <translation id="5955304353782037793">aplicación</translation> <translation id="5958529069007801266">Usuario supervisado</translation> +<translation id="5959471481388474538">Rede non dispoñible</translation> <translation id="596035801491797438">Desactivar control facial</translation> <translation id="5960410286721553511">Accede ao contido multimedia e ás fotos recentes do teu teléfono</translation> <translation id="5965524703725988602">Activar/desactivar o tema escuro. <ph name="STATE_TEXT" />.</translation> @@ -2253,6 +2260,7 @@ <translation id="7945357288295809525">Mostrar a configuración de accesibilidade. Funcións activadas: <ph name="ENABLED_FEATURES" />.</translation> <translation id="7946681191253332687">Hai actualizacións de seguranza ampliadas dispoñibles</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> quere usar o dispositivo <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Non restaurar ventás</translation> <translation id="7951630946012935453">Atenuar luz do teclado</translation> <translation id="7953176344218790168">MAIÚSCULAS</translation> <translation id="7953994493035617347">Queres confirmar a nova resolución?</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb index 43837d8f..731eab0f 100644 --- a/ash/strings/ash_strings_gu.xtb +++ b/ash/strings/ash_strings_gu.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">બૅટરીનું વર્તમાન લેવલ <ph name="BATTERY_PERCENTAGE" />%, ચાર્જ થવામાં <ph name="TIME" /> બાકી</translation> <translation id="1178581264944972037">થોભો</translation> <translation id="1179776263021875437">કાર્ય પર ફોકસ કરવાનું રોકો</translation> +<translation id="1180117276105724040">તમારા અગાઉના સત્રમાંથી વિન્ડો રિસ્ટોર કરી રહ્યાં છીએ...</translation> <translation id="1181037720776840403">કાઢી નાખો</translation> <translation id="1182225749592316782">આમ કરવાથી કૅમેરા અને માઇક્રોફોનની પરવાનગીઓ ધરાવતી બધી ઍપ તથા વેબસાઇટ માટે, ઍક્સેસની મંજૂરી આપવામાં આવે છે</translation> <translation id="1182876754474670069">હોમ</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">ઑડિયો સૉર્સ સ્વિચ કરીએ?</translation> <translation id="1505542291183484463">windowના કદમાં વધઘટ કરીને નીચેની તરફ ટાઇલ કરી</translation> <translation id="1510238584712386396">લૉન્ચર</translation> +<translation id="1519090060276706457">વિન્ડો રિસ્ટોર કરવામાં અપેક્ષા કરતાં વધુ સમય લાગી રહ્યો છે</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{નોટિફિકેશનની સેટિંગ બતાવો. ઍપ માટે નોટિફિકેશન બંધ છે}one{નોટિફિકેશનની સેટિંગ બતાવો. # ઍપ માટે નોટિફિકેશન બંધ છે}other{નોટિફિકેશનની સેટિંગ બતાવો. # ઍપ માટે નોટિફિકેશન બંધ છે}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">બૅટરી <ph name="BATTERY_PERCENTAGE" />% | પૂર્ણ ચાર્જ થવા માટે <ph name="TIME" /> બાકી</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">ચિત્ર-માં-ચિત્ર વિન્ડોના મહત્તમ અથવા વર્તમાન કદ વચ્ચે સ્વિચ કરો</translation> <translation id="1787955149152357925">બંધ છે</translation> <translation id="1796561540704213354">વેબસાઇટ જેમાં તમે મુલાકાત લીધેલા પેજ અને ખોલેલા પેજ શામેલ છે</translation> +<translation id="1799852120691957794">તમારા અગાઉના સત્રમાંની વિન્ડો રિસ્ટોર કરી શકતા નથી</translation> <translation id="1805407494113167797">ફોકસના સાઉન્ડ ચલાવી શક્યાં નથી</translation> <translation id="181103072419391116">સિગ્નલની સશક્તતા <ph name="SIGNAL_STRENGTH" />, તમારા વ્યવસ્થાપક દ્વારા મેનેજ કરવામાં આવે છે</translation> <translation id="1815039896005206046">તમે આ સૂચવેલું ગ્રૂપ નાપસંદ કરો છો, થમ્બ્સ ડાઉન પસંદ કરવાથી આ પ્રતિસાદ સબમિટ થશે</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">વિંડો સ્ક્રીનશૉટ લો</translation> <translation id="2598725286293895280">ડેસ્કમાં અનસપોર્ટેડ ઍપ</translation> <translation id="2607678425161541573">ઑનલાઇન સાઇન-ઇન કરવું આવશ્યક છે</translation> +<translation id="2611702650078660078">ભૂલ આવી છે</translation> <translation id="2612072250312279703">ઍક્ટિવિટી મૉનિટર</translation> <translation id="261210853165551493">ફૉર્મેટિંગ સાથે કૉપિ કરો</translation> <translation id="2612614436418177118">ઍપ ગ્રિડની અંદર ઍપનું આઇકન ખસેડો</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">પૂર્ણ સ્ક્રીનનો સ્ક્રીનશૉટ કૅપ્ચર કરવા માટે Enter કી દબાવો</translation> <translation id="2849936225196189499">ટીકાત્મક</translation> <translation id="2850207700020959936">ઍપ કૅમેરાને ઍક્સેસ કરી શકે છે</translation> +<translation id="2852045827873867442">ઇન્ટરનેટ કનેક્શન આવશ્યક છે.</translation> <translation id="2860184359326882502">શ્રેષ્ઠ મેળ</translation> <translation id="2865888419503095837">નેટવર્ક માહિતી</translation> <translation id="2869095047958348710">આ ગત <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> માટેનો પાસવર્ડ </translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">ડેમો સત્રમાં Google Assistant ઉપલબ્ધ નથી.</translation> +<translation id="4781633367688946589">નવા સત્રમાં આગળ વધો</translation> <translation id="4785412405516449976">માત્ર Google એકાઉન્ટમાંના તમારા સંપર્કો</translation> <translation id="4789348252524569426">સ્પીચ માટેની ફાઇલો ઇન્સ્ટૉલ કરી શકતા નથી. તમારા ડિવાઇસને અપડેટ કરવાની જરૂર છે. તમારું ડિવાઇસ ફરી શરૂ કરો અને ફરી પ્રયાસ કરો.</translation> <translation id="478959186716341421">કાસ્ટ કરી રહ્યાં છે</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">ભજવણી ટ્રેસિંગ સક્ષમ</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">નિરીક્ષણ કરેલ વપરાશકર્તા</translation> +<translation id="5959471481388474538">નેટવર્ક ઉપલબ્ધ નથી</translation> <translation id="596035801491797438">ફેસ કન્ટ્રોલ બંધ કરો</translation> <translation id="5960410286721553511">તમારા ફોનના તાજેતરના ફોટા અને મીડિયા જુઓ</translation> <translation id="5965524703725988602">ઘેરી થીમ ટૉગલ કરો. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">ઍક્સેસિબિલિટી સેટિંગ બતાવો, "<ph name="ENABLED_FEATURES" />" ચાલુ કર્યું.</translation> <translation id="7946681191253332687">વધારેલી સુરક્ષા અપડેટ ઉપલબ્ધ છે</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> તમારા <ph name="DEVICE_NAME" />નો ઉપયોગ કરવા માગે છે</translation> +<translation id="7948239795436419268">વિન્ડો રિસ્ટોર કરશો નહીં</translation> <translation id="7951630946012935453">ડિમ કીબોર્ડ</translation> <translation id="7953176344218790168">અપરકેસ</translation> <translation id="7953994493035617347">નવું રિઝોલ્યુશન કન્ફર્મ કરીએ?</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb index b082df6..fbb81aa 100644 --- a/ash/strings/ash_strings_hi.xtb +++ b/ash/strings/ash_strings_hi.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">बैटरी का मौजूदा लेवल <ph name="BATTERY_PERCENTAGE" />% है, बैटरी पूरी चार्ज होने में <ph name="TIME" /> बचे हैं</translation> <translation id="1178581264944972037">रोकें</translation> <translation id="1179776263021875437">टास्क पर फ़ोकस करना बंद करें</translation> +<translation id="1180117276105724040">आपके पिछले सेशन की विंडो वापस लाई जा रही हैं...</translation> <translation id="1181037720776840403">हटाएं</translation> <translation id="1182225749592316782">इससे सभी ऐप्लिकेशन और वेबसाइटों को कैमरा और माइक्रोफ़ोन को इस्तेमाल करने का ऐक्सेस मिलता है</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">क्या आपको ऑडियो सोर्स बदलना है?</translation> <translation id="1505542291183484463">नीचे की ओर से विंडो की टाइल का साइज़ बदलें</translation> <translation id="1510238584712386396">लॉन्चर</translation> +<translation id="1519090060276706457">विंडो को वापस लाने में उम्मीद से ज़्यादा समय लग रहा है</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{सूचना सेटिंग दिखाएं. किसी एक ऐप्लिकेशन के लिए सूचनाएं बंद हैं}one{सूचना सेटिंग दिखाएं. # ऐप्लिकेशन के लिए सूचनाएं बंद हैं}other{सूचना सेटिंग दिखाएं. # ऐप्लिकेशन के लिए सूचनाएं बंद हैं}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003"><ph name="BATTERY_PERCENTAGE" />% चार्ज है | पूरी तरह चार्ज होने में <ph name="TIME" /> लगेंगे</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">पिक्चर में पिक्चर विंडो को, इसके ज़्यादा से ज़्यादा साइज़ या मौजूदा साइज़ में इस्तेमाल करें</translation> <translation id="1787955149152357925">बंद करें</translation> <translation id="1796561540704213354">वेबसाइटों की कैटगरी में वे पेज दिखाए जाते हैं जिन्हें आपने देखा या खोला होता है</translation> +<translation id="1799852120691957794">आपके पिछले सेशन वाली विंडो वापस नहीं लाई जा सकतीं</translation> <translation id="1805407494113167797">फ़ोकस मोड के लिए उपलब्ध साउंड नहीं चलाए जा सके</translation> <translation id="181103072419391116">सिग्नल की क्षमता <ph name="SIGNAL_STRENGTH" />, आपका एडमिन प्रबंधित करता है</translation> <translation id="1815039896005206046">'नापसंद करें' आइकॉन को चुनने का मतलब है कि आपको सुझाया गया यह टैब ग्रुप पसंद नहीं आया</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">विंडो का स्क्रीनशॉट लें</translation> <translation id="2598725286293895280">डेस्क में ऐसे ऐप्लिकेशन मौजूद हैं जो काम नहीं करते</translation> <translation id="2607678425161541573">ऑनलाइन साइन इन करना ज़रूरी है</translation> +<translation id="2611702650078660078">कोई गड़बड़ी हुई</translation> <translation id="2612072250312279703">एक्टिविटी मॉनिटर</translation> <translation id="261210853165551493">फ़ॉर्मैटिंग के साथ कॉपी करें</translation> <translation id="2612614436418177118">किसी ऐप्लिकेशन आइकॉन को ऐप्लिकेशन ग्रिड में ले जाने के लिए</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">पूरी स्क्रीन का स्क्रीनशॉट लेने के लिए, Enter दबाएं</translation> <translation id="2849936225196189499">महत्वपूर्ण</translation> <translation id="2850207700020959936">ऐप्लिकेशन, कैमरे का इस्तेमाल कर सकते हैं</translation> +<translation id="2852045827873867442">इंटरनेट कनेक्शन होना ज़रूरी है.</translation> <translation id="2860184359326882502">सबसे ज़्यादा मिलते-जुलते नतीजे</translation> <translation id="2865888419503095837">नेटवर्क जानकारी</translation> <translation id="2869095047958348710">पिछला <ph name="DAY_OF_WEEK" /></translation> @@ -1216,6 +1221,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> के लिए पासवर्ड</translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">डेमो सत्र में Google Assistant मौजूद नहीं है.</translation> +<translation id="4781633367688946589">नए सेशन में जारी रखें</translation> <translation id="4785412405516449976">सिर्फ़ Google खाते में सेव किए गए संपर्क</translation> <translation id="4789348252524569426">बोली पहचानने वाली फ़ाइलों को इंस्टॉल नहीं किया जा सका. इसके लिए, आपको अपने डिवाइस को अपडेट करना होगा. डिवाइस को रीस्टार्ट करके, फिर से कोशिश करें.</translation> <translation id="478959186716341421">कास्ट किया जा रहा है</translation> @@ -1604,6 +1610,7 @@ <translation id="595202126637698455">निष्पादन ट्रेसिंग सक्षम है</translation> <translation id="5955304353782037793">ऐप्लिकेशन</translation> <translation id="5958529069007801266">निगरानी में रखा गया उपयोगकर्ता</translation> +<translation id="5959471481388474538">नेटवर्क उपलब्ध नहीं</translation> <translation id="596035801491797438">फ़ेस कंट्रोल की सुविधा बंद करें</translation> <translation id="5960410286721553511">फ़ोन में मौजूद हाल ही की फ़ोटो और मीडिया देखें</translation> <translation id="5965524703725988602">गहरे रंग वाली थीम को टॉगल करें. <ph name="STATE_TEXT" />.</translation> @@ -2253,6 +2260,7 @@ <translation id="7945357288295809525">सुलभता सेटिंग में दिखाएं कि "<ph name="ENABLED_FEATURES" />" चालू है.</translation> <translation id="7946681191253332687">ज़्यादा समय तक मिलने वाले सुरक्षा से जुड़े अपडेट उपलब्ध हैं</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> को आपका <ph name="DEVICE_NAME" /> इस्तेमाल करना है</translation> +<translation id="7948239795436419268">विंडो को वापस न लाएं</translation> <translation id="7951630946012935453">कीबोर्ड की बैकलाइट कम करें</translation> <translation id="7953176344218790168">अपरकेस</translation> <translation id="7953994493035617347">क्या आपको नया रिज़ॉल्यूशन इस्तेमाल करना है?</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb index 0693c1d..8ea4135 100644 --- a/ash/strings/ash_strings_hr.xtb +++ b/ash/strings/ash_strings_hr.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Trenutačna razina napunjenosti baterije je <ph name="BATTERY_PERCENTAGE" />%, preostalo je <ph name="TIME" /></translation> <translation id="1178581264944972037">Pauziraj</translation> <translation id="1179776263021875437">Zaustavite koncentraciju na zadatak</translation> +<translation id="1180117276105724040">Vraćanje prozora iz prethodne sesije...</translation> <translation id="1181037720776840403">Ukloni</translation> <translation id="1182225749592316782">To omogućuje pristup svim aplikacijama i web-lokacijama s dopuštenjem za kameru i mikrofon</translation> <translation id="1182876754474670069">početna</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Želite li promijeniti audioizvor?</translation> <translation id="1505542291183484463">Promjena veličine prozora u pločicama povlačenjem prema dolje</translation> <translation id="1510238584712386396">Pokretač</translation> +<translation id="1519090060276706457">Vraćanje prozora traje dulje od očekivanog</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Prikaz postavki obavijesti. Obavijesti su isključene za jednu aplikaciju}one{Prikaz postavki obavijesti. Obavijesti su isključene za # aplikaciju}few{Prikaz postavki obavijesti. Obavijesti su isključene za # aplikacije}other{Prikaz postavki obavijesti. Obavijesti su isključene za # aplikacija}}</translation> <translation id="1521655867290435174">Google tablice</translation> <translation id="1523032696246003">Baterija <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> do napunjenosti</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Prebacivanje između maksimalne ili trenutačne veličine prozora slike u slici</translation> <translation id="1787955149152357925">Isključeno</translation> <translation id="1796561540704213354">Web-lokacije uključujući stranice koje ste posjetili i otvorene stranice</translation> +<translation id="1799852120691957794">Nije moguće vratiti prozore iz prethodne sesije</translation> <translation id="1805407494113167797">Zvuci za Fokus nisu se mogli reproducirati</translation> <translation id="181103072419391116">Jačina signala <ph name="SIGNAL_STRENGTH" />, upravlja administrator</translation> <translation id="1815039896005206046">Palac dolje poslao bi povratne informacije da vam se ta predložena grupa ne sviđa</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Snimanje snimke zaslona prozora</translation> <translation id="2598725286293895280">Nepodržane aplikacije na radnoj površini</translation> <translation id="2607678425161541573">Potrebna je online prijava</translation> +<translation id="2611702650078660078">Došlo je do pogreške</translation> <translation id="2612072250312279703">praćenje aktivnosti</translation> <translation id="261210853165551493">Kopiraj s formatiranjem</translation> <translation id="2612614436418177118">Premještanje ikone aplikacije unutar rešetke aplikacije</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Pritisnite Enter za snimanje snimke cijelog zaslona</translation> <translation id="2849936225196189499">Kritično</translation> <translation id="2850207700020959936">Aplikacije mogu pristupiti kameri</translation> +<translation id="2852045827873867442">Potrebna je internetska veza.</translation> <translation id="2860184359326882502">Najbolje podudaranje</translation> <translation id="2865888419503095837">Podaci o mreži</translation> <translation id="2869095047958348710">Prošli/prošlu: <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Zaporka za adresu <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Trgovina Play</translation> <translation id="4778095205580009397">Google asistent nije dostupan u demosesiji.</translation> +<translation id="4781633367688946589">Nastavi do nove sesije</translation> <translation id="4785412405516449976">Samo vaši kontakti s Google računom</translation> <translation id="4789348252524569426">Nije moguće instalirati govorne datoteke. Uređaj se treba ažurirati. Ponovno pokrenite uređaj i pokušajte opet.</translation> <translation id="478959186716341421">Emitiranje</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Omogućeno je praćenje izvedbe</translation> <translation id="5955304353782037793">apl</translation> <translation id="5958529069007801266">Nadzirani korisnik</translation> +<translation id="5959471481388474538">Mreža nije dostupna</translation> <translation id="596035801491797438">Isključite upravljanje licem</translation> <translation id="5960410286721553511">Pregledajte nedavne fotografije i medije telefona</translation> <translation id="5965524703725988602">Prebacite tamnu temu. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Prikaži postavke pristupačnosti, omogućeno: <ph name="ENABLED_FEATURES" />.</translation> <translation id="7946681191253332687">Dostupna su proširena sigurnosna ažuriranja</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> želi upotrijebiti vaš uređaj <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Ne vraćaj prozore</translation> <translation id="7951630946012935453">Zatamnjenje tipkovnice</translation> <translation id="7953176344218790168">VELIKA SLOVA</translation> <translation id="7953994493035617347">Želite li potvrditi novu razlučivost?</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb index cf26b18..a5760cf 100644 --- a/ash/strings/ash_strings_hu.xtb +++ b/ash/strings/ash_strings_hu.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Jelenlegi akkumulátorszint: <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> van hátra</translation> <translation id="1178581264944972037">Szünet</translation> <translation id="1179776263021875437">A feladatra való összpontosítás leállítása</translation> +<translation id="1180117276105724040">Ablakok visszaállítása az előző munkamenetből…</translation> <translation id="1181037720776840403">Eltávolítás</translation> <translation id="1182225749592316782">Ezzel engedélyezi a hozzáférést a kamera- és mikrofonengedéllyel rendelkező összes alkalmazás és webhely számára.</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Hangforrást szeretne váltani?</translation> <translation id="1505542291183484463">Ablak mozaikszerű átméretezése lefelé</translation> <translation id="1510238584712386396">Indító</translation> +<translation id="1519090060276706457">Az ablakok visszaállítása a vártnál tovább tart</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Értesítési beállítások megjelenítése. Az értesítések egyetlen alkalmazásnál vannak kikapcsolva}other{Értesítési beállítások megjelenítése. Az értesítések # alkalmazásnál ki vannak kapcsolva}}</translation> <translation id="1521655867290435174">Google Táblázatok</translation> <translation id="1523032696246003">Akkumulátor <ph name="BATTERY_PERCENTAGE" />%-on | <ph name="TIME" /> a teljes feltöltésig</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Váltás a „kép a képben” ablak maximális és aktuális mérete között</translation> <translation id="1787955149152357925">Ki</translation> <translation id="1796561540704213354">Webhelyek, például a felkeresett oldalak és a megnyitott oldalak</translation> +<translation id="1799852120691957794">Nem lehet visszaállítani ablakokat az előző munkamenetből</translation> <translation id="1805407494113167797">Nem sikerült lejátszani az összpontosítást segítő hangokat</translation> <translation id="181103072419391116">Jelerősség: <ph name="SIGNAL_STRENGTH" />, a rendszergazdája kezeli</translation> <translation id="1815039896005206046">A „Nem tetszik” értékeléssel azt a visszajelzést küldi, hogy nem tetszik Önnek ez a javasolt csoport</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Képernyőkép készítése az ablakról</translation> <translation id="2598725286293895280">Nem támogatott alkalmazások vannak az asztalon</translation> <translation id="2607678425161541573">Online bejelentkezés szükséges</translation> +<translation id="2611702650078660078">Hiba történt</translation> <translation id="2612072250312279703">tevékenységfigyelő</translation> <translation id="261210853165551493">Másolás a formázás megtartásával</translation> <translation id="2612614436418177118">Egy alkalmazásikon áthelyezése az alkalmazásrácson belül</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Nyomja le az Entert, ha a teljes képernyő tartalmáról szeretne képernyőképet készíteni</translation> <translation id="2849936225196189499">Fontos</translation> <translation id="2850207700020959936">Az alkalmazások hozzáférhetnek a kamerához</translation> +<translation id="2852045827873867442">Internetkapcsolat szükséges.</translation> <translation id="2860184359326882502">Legjobb találat</translation> <translation id="2865888419503095837">Hálózatinformáció</translation> <translation id="2869095047958348710">Az előző <ph name="DAY_OF_WEEK" /></translation> @@ -1216,6 +1221,7 @@ <translation id="4776917500594043016">A(z) <ph name="USER_EMAIL_ADDRESS" /> fiókhoz tartozó jelszó</translation> <translation id="4777825441726637019">Play Áruház</translation> <translation id="4778095205580009397">A Google Segéd nem áll rendelkezésre bemutató munkamenetben.</translation> +<translation id="4781633367688946589">Folytatás új munkamenetben</translation> <translation id="4785412405516449976">Csak az Ön Google-fiókkal rendelkező ismerősei</translation> <translation id="4789348252524569426">Nem sikerült telepíteni a beszédfájlokat. Szükség van az eszköz frissítésére. Indítsa újra az eszközt, és próbálkozzon újra.</translation> <translation id="478959186716341421">Átküldés folyamatban</translation> @@ -1604,6 +1610,7 @@ <translation id="595202126637698455">Teljesítménykövetés engedélyezve</translation> <translation id="5955304353782037793">alk</translation> <translation id="5958529069007801266">Felügyelt felhasználó</translation> +<translation id="5959471481388474538">A hálózat nem érhető el</translation> <translation id="596035801491797438">Arcalapú vezérlés kikapcsolása</translation> <translation id="5960410286721553511">A telefonon található friss fotók és médiatartalmak megtekintése</translation> <translation id="5965524703725988602">Sötét téma be-/kikapcsolása. <ph name="STATE_TEXT" />.</translation> @@ -2253,6 +2260,7 @@ <translation id="7945357288295809525">Kisegítő beállítások megjelenítése, „<ph name="ENABLED_FEATURES" />” engedélyezve.</translation> <translation id="7946681191253332687">Kiterjesztett biztonsági frissítések állnak rendelkezésre</translation> <translation id="7947798320695032612">A(z) <ph name="APP_NAME" /> használni szeretné a következőt: <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Ne legyenek visszaállítva az ablakok</translation> <translation id="7951630946012935453">A billentyűzet fényerejének csökkentése</translation> <translation id="7953176344218790168">NAGYBETŰS</translation> <translation id="7953994493035617347">Megerősíti az új felbontást?</translation>
diff --git a/ash/strings/ash_strings_hy.xtb b/ash/strings/ash_strings_hy.xtb index d94fa129..e902129 100644 --- a/ash/strings/ash_strings_hy.xtb +++ b/ash/strings/ash_strings_hy.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Մարտկոցի լիցքի ներկայիս մակարդակը՝ <ph name="BATTERY_PERCENTAGE" />%, մնացել է <ph name="TIME" /></translation> <translation id="1178581264944972037">Դադար</translation> <translation id="1179776263021875437">Դադարեցնել առաջադրանքի վրա կենտրոնացումը</translation> +<translation id="1180117276105724040">Պատուհանները վերականգնվում են ձեր նախորդ աշխատաշրջանից…</translation> <translation id="1181037720776840403">Ջնջել</translation> <translation id="1182225749592316782">Սա օգտագործման թույլտվություն է տրամադրում բոլոր հավելվածներին ու կայքերին, որոնք ունեն խոսափողի և տեսախցիկի օգտագործման թույլտվություն</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Փոխե՞լ աուդիո աղբյուրը</translation> <translation id="1505542291183484463">Սալիկապատված չափափոխման պատուհանը դեպի ներքև</translation> <translation id="1510238584712386396">Գործարկիչ</translation> +<translation id="1519090060276706457">Պատուհանների վերականգնումը սովորականից երկար է տևում</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Ցուցադրել ծանուցումների կարգավորումները: Ծանուցումներն անջատված են մեկ հավելվածի համար:}one{Ցուցադրել ծանուցումների կարգավորումները: Ծանուցումներն անջատված են # հավելվածի համար:}other{Ցուցադրել ծանուցումների կարգավորումները: Ծանուցումներն անջատված են # հավելվածի համար:}}</translation> <translation id="1521655867290435174">Google Աղյուսակներ</translation> <translation id="1523032696246003">Մարտկոցի լիցքը՝ <ph name="BATTERY_PERCENTAGE" />% | Լրիվ լիցքավորմանը մնացել է <ph name="TIME" /></translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Օգտագործեք «Նկար նկարի մեջ» պատուհանը առավելագույն կամ ընթացիկ չափսով</translation> <translation id="1787955149152357925">Անջատված է</translation> <translation id="1796561540704213354">Վեբ կայքերը՝ ներառյալ էջերը, որոնք այցելել եք, և բացված էջերը</translation> +<translation id="1799852120691957794">Հնարավոր չէ վերականգնել նախորդ աշխատաշրջանի պատուհանները</translation> <translation id="1805407494113167797">Չհաջողվեց նվագարկել Focus ռեժիմի ձայները</translation> <translation id="181103072419391116">Ազդանշանի ուժգնությունը՝ <ph name="SIGNAL_STRENGTH" />, կառավարվում է ձեր ադմինիստրատորի կողմից</translation> <translation id="1815039896005206046">«Վատն է» կոճակի սեղմումը բացասական կարծիք կուղարկի այս առաջարկվող խմբի մասին</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Ստանալ պատուհանի պատկեր</translation> <translation id="2598725286293895280">Չաջակցվող հավելվածներ աշխատասեղանում</translation> <translation id="2607678425161541573">Անհրաժեշտ է առցանց մուտք գործել</translation> +<translation id="2611702650078660078">Սխալ առաջացավ</translation> <translation id="2612072250312279703">գործողությունների մոնիտոր</translation> <translation id="261210853165551493">Պատճենել ձևաչափումով</translation> <translation id="2612614436418177118">Տեղաշարժել հավելվածի պատկերակը հավելվածների ցանցում</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Սեղմեք Enter՝ ամբողջ էկրանի սքրինշոթ անելու համար</translation> <translation id="2849936225196189499">Վճռական</translation> <translation id="2850207700020959936">Տեսախցիկը հասանելի է հավելվածներին</translation> +<translation id="2852045827873867442">Ինտերնետ կապ է պահանջվում։</translation> <translation id="2860184359326882502">Լավագույն համընկնումը</translation> <translation id="2865888419503095837">Տեղեկություններ ցանցի մասին</translation> <translation id="2869095047958348710">Անցած <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Գաղտնաբառ <ph name="USER_EMAIL_ADDRESS" />-ի համար</translation> <translation id="4777825441726637019">Play Խանութ</translation> <translation id="4778095205580009397">Google Օգնականը հասանելի չէ դեմո աշխատաշրջանում։</translation> +<translation id="4781633367688946589">Սկսել նոր աշխատաշրջան</translation> <translation id="4785412405516449976">Միայն Google հաշիվ ունեցող ձեր կոնտակտները</translation> <translation id="4789348252524569426">Չհաջողվեց տեղադրել խոսքի ֆայլերը։ Ձեր սարքը թարմացման կարիք ունի։ Վերագործարկեք սարքը և նորից փորձեք։</translation> <translation id="478959186716341421">Հեռարձակվում է</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Կատարողականության հետագծումը միացված է</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Վերահսկվող պրոֆիլ</translation> +<translation id="5959471481388474538">Ցանցը մատչելի չէ</translation> <translation id="596035801491797438">Անջատել դեմքով կառավարումը</translation> <translation id="5960410286721553511">Դիտեք վերջերս ձեր հեռախոսում ավելացված լուսանկարները և մեդիա ֆայլերը</translation> <translation id="5965524703725988602">Միացնել/անջատել մուգ թեման։ <ph name="STATE_TEXT" />։</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Ցույց տալ հատուկ գործառույթների կարգավորումները, միացված գործառույթներ՝ «<ph name="ENABLED_FEATURES" />»։</translation> <translation id="7946681191253332687">Անվտանգության ընդլայնված թարմացումները հասանելի են</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> հավելվածն ուզում է օգտագործել ձեր <ph name="DEVICE_NAME" />ը</translation> +<translation id="7948239795436419268">Չվերականգնել պատուհանները</translation> <translation id="7951630946012935453">Նվազեցնել ստեղնաշարի հետնալույսի պայծառությունը</translation> <translation id="7953176344218790168">ՄԵԾԱՏԱՌ</translation> <translation id="7953994493035617347">Հաստատե՞լ նոր լուծաչափը</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb index 5f02256..a799c57 100644 --- a/ash/strings/ash_strings_id.xtb +++ b/ash/strings/ash_strings_id.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Level baterai saat ini <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> lagi</translation> <translation id="1178581264944972037">Jeda</translation> <translation id="1179776263021875437">Berhenti berfokus pada tugas</translation> +<translation id="1180117276105724040">Memulihkan jendela dari sesi sebelumnya...</translation> <translation id="1181037720776840403">Hapus</translation> <translation id="1182225749592316782">Tindakan ini akan mengizinkan akses untuk semua aplikasi dan situs yang memiliki izin kamera dan mikrofon</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Ganti sumber audio?</translation> <translation id="1505542291183484463">Mengubah ukuran jendela bersusun ke bawah</translation> <translation id="1510238584712386396">Peluncur</translation> +<translation id="1519090060276706457">Pemulihan jendela memerlukan waktu lebih lama dari yang diperkirakan</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Tampilkan setelan notifikasi. Notifikasi nonaktif untuk satu aplikasi}other{Tampilkan setelan notifikasi. Notifikasi nonaktif untuk # aplikasi}}</translation> <translation id="1521655867290435174">Google Spreadsheet</translation> <translation id="1523032696246003">Baterai <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> sampai penuh</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Beralih antara ukuran jendela picture-in-picture maksimum atau saat ini</translation> <translation id="1787955149152357925">Nonaktif</translation> <translation id="1796561540704213354">Situs, termasuk halaman yang telah Anda kunjungi dan halaman yang dibuka</translation> +<translation id="1799852120691957794">Tidak dapat memulihkan jendela dari sesi sebelumnya</translation> <translation id="1805407494113167797">Tidak dapat memutar suara Fokus</translation> <translation id="181103072419391116">Kekuatan Sinyal <ph name="SIGNAL_STRENGTH" />, Dikelola oleh Administrator Anda</translation> <translation id="1815039896005206046">Memberi tanda Tidak suka akan mengirimkan masukan bahwa Anda tidak menyukai saran grup ini</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Mengambil screenshot jendela</translation> <translation id="2598725286293895280">Aplikasi tidak didukung di desktop</translation> <translation id="2607678425161541573">Perlu login online</translation> +<translation id="2611702650078660078">Terjadi error</translation> <translation id="2612072250312279703">pemantauan aktivitas</translation> <translation id="261210853165551493">Salin dengan pemformatan</translation> <translation id="2612614436418177118">Pindahkan ikon aplikasi dalam petak aplikasi</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Tekan Enter untuk mengambil screenshot layar penuh</translation> <translation id="2849936225196189499">Kritis</translation> <translation id="2850207700020959936">Aplikasi dapat mengakses kamera</translation> +<translation id="2852045827873867442">Memerlukan koneksi internet.</translation> <translation id="2860184359326882502">Paling Cocok</translation> <translation id="2865888419503095837">Info jaringan</translation> <translation id="2869095047958348710"><ph name="DAY_OF_WEEK" /> yang lalu</translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Sandi untuk <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">Asisten Google tidak tersedia dalam sesi demo.</translation> +<translation id="4781633367688946589">Lanjutkan ke sesi baru</translation> <translation id="4785412405516449976">Hanya kontak Anda yang memiliki Akun Google</translation> <translation id="4789348252524569426">Tidak dapat menginstal file ucapan. Perangkat perlu diupdate. Mulai ulang perangkat lalu coba lagi.</translation> <translation id="478959186716341421">Mentransmisi</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Kinerja pelacakan aktif</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Pengguna yang diawasi</translation> +<translation id="5959471481388474538">Jaringan tidak tersedia</translation> <translation id="596035801491797438">Nonaktifkan Kontrol dengan wajah</translation> <translation id="5960410286721553511">Lihat media dan foto terbaru dari ponsel Anda</translation> <translation id="5965524703725988602">Tombol Tema gelap. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Tampilkan setelan aksesibilitas, "<ph name="ENABLED_FEATURES" />" diaktifkan.</translation> <translation id="7946681191253332687">Update keamanan yang diperpanjang tersedia</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> ingin menggunakan <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Jangan pulihkan jendela</translation> <translation id="7951630946012935453">Redupkan keyboard</translation> <translation id="7953176344218790168">HURUF BESAR</translation> <translation id="7953994493035617347">Konfirmasi resolusi baru?</translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb index 6e28d22..76488c3 100644 --- a/ash/strings/ash_strings_is.xtb +++ b/ash/strings/ash_strings_is.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Núverandi rafhleðsla: <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> eftir</translation> <translation id="1178581264944972037">Gera hlé</translation> <translation id="1179776263021875437">Hætta að einbeita mér að verkefni</translation> +<translation id="1180117276105724040">Endurheimtir glugga úr fyrri lotu...</translation> <translation id="1181037720776840403">Fjarlægja</translation> <translation id="1182225749592316782">Þetta veitir öllum forritum og vefsvæðum með myndavélar- og hljóðnemaheimildir aðgang</translation> <translation id="1182876754474670069">heim</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Skipta um hljóðgjafa?</translation> <translation id="1505542291183484463">Stærð gluggaramma breytt niður</translation> <translation id="1510238584712386396">Ræsiforrit</translation> +<translation id="1519090060276706457">Það tekur lengri tíma en búist var við að endurheimta glugga</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Sýna tilkynningastillingar. Slökkt er á tilkynningum fyrir forrit}one{Sýna tilkynningastillingar. Slökkt er á tilkynningum fyrir # forrit}other{Sýna tilkynningastillingar. Slökkt er á tilkynningum fyrir # forrit}}</translation> <translation id="1521655867290435174">Google töflureiknar</translation> <translation id="1523032696246003">Rafhlaða <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> að fullri hleðslu</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Skiptu á milli hámarksstærð eða núverandi stærðar af mynd í mynd-glugganum</translation> <translation id="1787955149152357925">Slökkt</translation> <translation id="1796561540704213354">Vefsvæði að meðtöldum síðum sem þú hefur heimsótt og opnar síður</translation> +<translation id="1799852120691957794">Ekki tókst að endurheimta glugga úr fyrri lotu</translation> <translation id="1805407494113167797">Ekki tókst að spila einbeitingarhljóð</translation> <translation id="181103072419391116"><ph name="SIGNAL_STRENGTH" /> sendistyrkur, stjórnað af kerfisstjóra</translation> <translation id="1815039896005206046">„Þumall niður“ myndi senda inn þau viðbrögð að þér líki ekki við hópinn sem stungið er upp á</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Taka skjámynd af glugga</translation> <translation id="2598725286293895280">Óstudd forrit í skrifborði</translation> <translation id="2607678425161541573">Innskráningar á netinu er krafist</translation> +<translation id="2611702650078660078">Villa kom upp</translation> <translation id="2612072250312279703">virknieftirlit</translation> <translation id="261210853165551493">Afrita með sniði</translation> <translation id="2612614436418177118">Færa forritatákn innan forritatöflu</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Ýttu á Enter til að taka skjámynd af öllum skjánum</translation> <translation id="2849936225196189499">Hætta</translation> <translation id="2850207700020959936">Forrit hafa aðgang að myndavél</translation> +<translation id="2852045827873867442">Nettengingar er krafist.</translation> <translation id="2860184359326882502">Besta samsvörun</translation> <translation id="2865888419503095837">Upplýsingar um net</translation> <translation id="2869095047958348710">Síðasti <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Aðgangsorð fyrir <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">Google-hjálparinn er ekki í boði í prufuútgáfu.</translation> +<translation id="4781633367688946589">Halda áfram í næstu lotu</translation> <translation id="4785412405516449976">Aðeins tengiliðir þínir með Google-reikning</translation> <translation id="4789348252524569426">Ekki er hægt að setja upp raddskrár. Þú þarft að uppfæra tækið. Endurræstu tækið og reyndu aftur.</translation> <translation id="478959186716341421">Sendir út</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Kveikt á afkastarakningu</translation> <translation id="5955304353782037793">forrit</translation> <translation id="5958529069007801266">Stýrður notandi</translation> +<translation id="5959471481388474538">Netið er ekki tiltækt</translation> <translation id="596035801491797438">Slökkva á andlitsstýringu</translation> <translation id="5960410286721553511">Skoðaðu nýlegar myndir og margmiðlunarefni símans</translation> <translation id="5965524703725988602">Kveikja/slökkva á dökku þema. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Sýna aðgengisstillingar, kveikt er á „<ph name="ENABLED_FEATURES" />“.</translation> <translation id="7946681191253332687">Framlengdar öryggisuppfærslur í boði</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> vill nota <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Ekki endurheimta glugga</translation> <translation id="7951630946012935453">Myrkva lyklaborð</translation> <translation id="7953176344218790168">HÁSTAFIR</translation> <translation id="7953994493035617347">Staðfesta nýja upplausn?</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb index 7c43d957..ede78d9 100644 --- a/ash/strings/ash_strings_it.xtb +++ b/ash/strings/ash_strings_it.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Livello attuale della batteria: <ph name="BATTERY_PERCENTAGE" />%, tempo rimanente: <ph name="TIME" /></translation> <translation id="1178581264944972037">Pausa</translation> <translation id="1179776263021875437">Smetti di concentrarti sull'attività</translation> +<translation id="1180117276105724040">Ripristino delle finestre dalla sessione precedente in corso…</translation> <translation id="1181037720776840403">Rimuovi</translation> <translation id="1182225749592316782">Consente l'accesso per tutti i siti web e tutte le app che dispongono delle autorizzazioni di accesso al microfono e alla fotocamera</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Vuoi cambiare la sorgente audio?</translation> <translation id="1505542291183484463">Allinea in basso finestra ridimensionata a riquadro</translation> <translation id="1510238584712386396">Avvio app</translation> +<translation id="1519090060276706457">Il ripristino delle finestre sta richiedendo più tempo del previsto</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Mostra impostazioni di notifica. Le notifiche sono disattivate per un'app}other{Mostra impostazioni di notifica. Le notifiche sono disattivate per # app}}</translation> <translation id="1521655867290435174">Fogli Google</translation> <translation id="1523032696246003">Batteria: <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> alla ricarica completa</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Passa dalla dimensione massima a quella corrente e viceversa della finestra Picture in picture</translation> <translation id="1787955149152357925">Off</translation> <translation id="1796561540704213354">Siti web che includono le pagine che hai visitato e le pagine aperte</translation> +<translation id="1799852120691957794">Impossibile ripristinare le finestre della sessione precedente</translation> <translation id="1805407494113167797">Impossibile riprodurre i suoni della modalità Niente distrazioni</translation> <translation id="181103072419391116">Intensità del segnale <ph name="SIGNAL_STRENGTH" />, gestita dall'amministratore</translation> <translation id="1815039896005206046">L'opzione Non mi piace invia un feedback che indica che non ti piace questo gruppo suggerito</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Consente di acquisire uno screenshot della finestra</translation> <translation id="2598725286293895280">App non supportate nella scrivania</translation> <translation id="2607678425161541573">Accesso online richiesto</translation> +<translation id="2611702650078660078">Si è verificato un errore</translation> <translation id="2612072250312279703">monitoraggio dell'attività</translation> <translation id="261210853165551493">Copia con formattazione</translation> <translation id="2612614436418177118">Sposta l'icona di un'app all'interno della griglia delle app</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Premi invio per acquisire uno screenshot a schermo intero</translation> <translation id="2849936225196189499">Critica</translation> <translation id="2850207700020959936">Le app possono accedere alla fotocamera</translation> +<translation id="2852045827873867442">È necessaria una connessione a internet.</translation> <translation id="2860184359326882502">Risultato migliore</translation> <translation id="2865888419503095837">Informazioni di rete</translation> <translation id="2869095047958348710">Lo scorso <ph name="DAY_OF_WEEK" /></translation> @@ -1212,6 +1217,7 @@ <translation id="4776917500594043016">Password per <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">L'Assistente Google non è disponibile in una sessione demo.</translation> +<translation id="4781633367688946589">Continua alla nuova sessione</translation> <translation id="4785412405516449976">Solo i tuoi contatti con un Account Google</translation> <translation id="4789348252524569426">Impossibile installare file di contenuti vocali. Il dispositivo deve essere aggiornato. Riavvialo e riprova.</translation> <translation id="478959186716341421">Trasmissione</translation> @@ -1600,6 +1606,7 @@ <translation id="595202126637698455">Rilevamento del rendimento attivo</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Utente supervis.</translation> +<translation id="5959471481388474538">Rete non disponibile</translation> <translation id="596035801491797438">Disattiva i controlli con il volto</translation> <translation id="5960410286721553511">Visualizza le foto e i contenuti multimediali recenti del tuo telefono</translation> <translation id="5965524703725988602">Attiva/disattiva il tema scuro. <ph name="STATE_TEXT" />.</translation> @@ -2249,6 +2256,7 @@ <translation id="7945357288295809525">Mostra impostazioni di accessibilità, funzionalità "<ph name="ENABLED_FEATURES" />" attivata.</translation> <translation id="7946681191253332687">Aggiornamenti della sicurezza estesi disponibili</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> vuole usare <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Non ripristinare le finestre</translation> <translation id="7951630946012935453">Attenua la luminosità della tastiera</translation> <translation id="7953176344218790168">LETTERE MAIUSCOLE</translation> <translation id="7953994493035617347">Confermare la nuova risoluzione?</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb index c27a0ab5..c41b9dd 100644 --- a/ash/strings/ash_strings_iw.xtb +++ b/ash/strings/ash_strings_iw.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">רמת הטעינה הנוכחית של הסוללה: %<ph name="BATTERY_PERCENTAGE" />, הזמן שנותר: <ph name="TIME" /></translation> <translation id="1178581264944972037">השהיה</translation> <translation id="1179776263021875437">הפסקת ההתרכזות במשימה</translation> +<translation id="1180117276105724040">מתבצע שחזור של חלונות מהסשן הקודם…</translation> <translation id="1181037720776840403">הסרה</translation> <translation id="1182225749592316782">כך ניתן לגשת לכל האפליקציות והאתרים שיש להם הרשאות גישה למצלמה ולמיקרופון</translation> <translation id="1182876754474670069">מקש Home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">להחליף את מקור האודיו?</translation> <translation id="1505542291183484463">Tiled resize window downward</translation> <translation id="1510238584712386396">מרכז האפליקציות</translation> +<translation id="1519090060276706457">שחזור החלונות נמשך יותר זמן מהצפוי</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{צפייה בהגדרות של הודעות. ההודעות מושבתות באפליקציה אחת}one{צפייה בהגדרות של הודעות. ההודעות מושבתות ב-# אפליקציות}two{צפייה בהגדרות של הודעות. ההודעות מושבתות ב-# אפליקציות}other{צפייה בהגדרות של הודעות. ההודעות מושבתות ב-# אפליקציות}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">סוללה: %<ph name="BATTERY_PERCENTAGE" /> | הזמן שנותר לטעינה מלאה: <ph name="TIME" /></translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">מעבר בין הגודל המרבי לגודל הנוכחי של חלון התמונה בתוך תמונה</translation> <translation id="1787955149152357925">כבוי</translation> <translation id="1796561540704213354">אתרים, כולל דפים שביקרת בהם ודפים פתוחים</translation> +<translation id="1799852120691957794">אי אפשר לשחזר חלונות מהסשן הקודם</translation> <translation id="1805407494113167797">לא ניתן להשמיע את הצלילים של מצב הריכוז</translation> <translation id="181103072419391116">עוצמת האות: <ph name="SIGNAL_STRENGTH" />, הרשת מנוהלת על ידי מנהל המערכת שלך</translation> <translation id="1815039896005206046">אם סימנת "לא אהבתי", יישלח אלינו משוב שלא אהבת את הקבוצה המוצעת הזו</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">צילום מסך של חלון</translation> <translation id="2598725286293895280">בשולחן העבודה יש אפליקציות שלא נתמכות</translation> <translation id="2607678425161541573">נדרשת כניסה אונליין</translation> +<translation id="2611702650078660078">קרתה שגיאה</translation> <translation id="2612072250312279703">מעקב אחר הפעילות</translation> <translation id="261210853165551493">העתקה עם העיצוב</translation> <translation id="2612614436418177118">העברה של סמל אפליקציה בתצוגת האפליקציות</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">כדי לצלם את המסך המלא, מקישים על Enter</translation> <translation id="2849936225196189499">קריטי</translation> <translation id="2850207700020959936">לאפליקציות יש גישה למצלמה</translation> +<translation id="2852045827873867442">צריך חיבור לאינטרנט.</translation> <translation id="2860184359326882502">ההתאמה הטובה ביותר</translation> <translation id="2865888419503095837">פרטי רשת</translation> <translation id="2869095047958348710">ביום <ph name="DAY_OF_WEEK" /> האחרון</translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">סיסמה עבור <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">חנות Play</translation> <translation id="4778095205580009397">Google Assistant לא זמינה בסשן הדגמה.</translation> +<translation id="4781633367688946589">המשך לסשן חדש</translation> <translation id="4785412405516449976">רק אנשי הקשר שלך שיש להם חשבון Google</translation> <translation id="4789348252524569426">לא ניתן להתקין את קובצי זיהוי הדיבור. צריך לעדכן את המכשיר. כדאי להפעיל מחדש את המכשיר ולנסות שוב.</translation> <translation id="478959186716341421">מעביר</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">מעקב אחר הביצועים מופעל</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">משתמש בפיקוח</translation> +<translation id="5959471481388474538">הרשת לא זמינה</translation> <translation id="596035801491797438">השבתת התכונה "שליטה באמצעות תנועות הפנים"</translation> <translation id="5960410286721553511">הצגה של המדיה והתמונות שבטלפון מהזמן האחרון</translation> <translation id="5965524703725988602">הפעלה או השבתה של עיצוב כהה. <ph name="STATE_TEXT" />.</translation> @@ -2254,6 +2261,7 @@ <translation id="7945357288295809525">הצגת ההגדרות בנושא נגישות, התכונה '<ph name="ENABLED_FEATURES" />' מופעלת.</translation> <translation id="7946681191253332687">יש עדכוני אבטחה מורחבים</translation> <translation id="7947798320695032612">האפליקציה <ph name="APP_NAME" /> מבקשת להשתמש ב<ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">לא לשחזר חלונות</translation> <translation id="7951630946012935453">עמעום המקלדת</translation> <translation id="7953176344218790168">אותיות גדולות</translation> <translation id="7953994493035617347">לאשר את הרזולוציה החדשה?</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb index e6e3919..bb6a7a39 100644 --- a/ash/strings/ash_strings_ja.xtb +++ b/ash/strings/ash_strings_ja.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">現在のバッテリー残量 <ph name="BATTERY_PERCENTAGE" />%、残り時間 <ph name="TIME" /></translation> <translation id="1178581264944972037">一時停止</translation> <translation id="1179776263021875437">タスクの選択を解除</translation> +<translation id="1180117276105724040">前回のセッションからウィンドウを復元しています...</translation> <translation id="1181037720776840403">削除</translation> <translation id="1182225749592316782">カメラとマイクへのアクセス権を持つすべてのアプリとウェブサイトに対して、アクセスを許可します</translation> <translation id="1182876754474670069">Home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">オーディオ ソースを切り替えますか?</translation> <translation id="1505542291183484463">タイル表示のウィンドウを下方向にサイズ変更</translation> <translation id="1510238584712386396">ランチャー</translation> +<translation id="1519090060276706457">ウィンドウの復元に通常より時間がかかっています</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{通知設定を表示します。1 件のアプリで通知がオフになっています}other{通知設定を表示します。# 件のアプリで通知がオフになっています}}</translation> <translation id="1521655867290435174">Google スプレッドシート</translation> <translation id="1523032696246003">バッテリー残量 <ph name="BATTERY_PERCENTAGE" />% | 充電完了まで <ph name="TIME" /></translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">ピクチャー イン ピクチャー ウィンドウの最大サイズと現在のサイズを切り替えます</translation> <translation id="1787955149152357925">オフ</translation> <translation id="1796561540704213354">アクセスしたページ、開いているページなどのウェブサイト</translation> +<translation id="1799852120691957794">前回のセッションからウィンドウを復元できません</translation> <translation id="1805407494113167797">フォーカス モード用のサウンドを再生できませんでした</translation> <translation id="181103072419391116">信号強度 <ph name="SIGNAL_STRENGTH" />、管理者によって管理</translation> <translation id="1815039896005206046">低く評価すると、この提案グループが気に入らなかったというフィードバックが送信されます</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">ウィンドウのスクリーンショットを撮影する</translation> <translation id="2598725286293895280">サポートされていないアプリがデスクにあります</translation> <translation id="2607678425161541573">オンライン ログインが必要です</translation> +<translation id="2611702650078660078">エラーが発生しました</translation> <translation id="2612072250312279703">アクティビティ モニター</translation> <translation id="261210853165551493">書式設定付きでコピー</translation> <translation id="2612614436418177118">アプリグリッド内でアプリアイコンを移動します</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">全画面のスクリーンショットを撮影するには Enter キーを押してください</translation> <translation id="2849936225196189499">重要</translation> <translation id="2850207700020959936">アプリはカメラにアクセスできます</translation> +<translation id="2852045827873867442">インターネット接続が必要です。</translation> <translation id="2860184359326882502">ベストマッチ</translation> <translation id="2865888419503095837">ネットワーク情報</translation> <translation id="2869095047958348710">前の <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> のパスワード</translation> <translation id="4777825441726637019">Play ストア</translation> <translation id="4778095205580009397">Google アシスタントは、デモセッションではご利用いただけません。</translation> +<translation id="4781633367688946589">新しいセッションに進む</translation> <translation id="4785412405516449976">Google アカウントを利用している連絡先のみ</translation> <translation id="4789348252524569426">音声ファイルをインストールできません。デバイスを更新する必要があります。デバイスを再起動してもう一度お試しください。</translation> <translation id="478959186716341421">キャスト中</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">パフォーマンス追跡機能が有効です</translation> <translation id="5955304353782037793">アプリ</translation> <translation id="5958529069007801266">監視対象ユーザー</translation> +<translation id="5959471481388474538">ネットワークは利用できません</translation> <translation id="596035801491797438">フェイスナビをオフにする</translation> <translation id="5960410286721553511">スマートフォンの最近の写真やメディアを表示します</translation> <translation id="5965524703725988602">ダークモードのオンとオフを切り替えます。<ph name="STATE_TEXT" />。</translation> @@ -2253,6 +2260,7 @@ <translation id="7945357288295809525">ユーザー補助設定を表示します。「<ph name="ENABLED_FEATURES" />」が有効になっています。</translation> <translation id="7946681191253332687">セキュリティ アップデートを延長可能</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> が <ph name="DEVICE_NAME" /> の使用をリクエストしています</translation> +<translation id="7948239795436419268">ウィンドウを復元しない</translation> <translation id="7951630946012935453">キーボードを暗くする</translation> <translation id="7953176344218790168">大文字</translation> <translation id="7953994493035617347">新しい解像度を確定しますか?</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb index 348f84d..3ea9d78 100644 --- a/ash/strings/ash_strings_ka.xtb +++ b/ash/strings/ash_strings_ka.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">ბატარეის ამჟამინდელი დონეა <ph name="BATTERY_PERCENTAGE" />%, დარჩენილია <ph name="TIME" /></translation> <translation id="1178581264944972037">პაუზა</translation> <translation id="1179776263021875437">ამოცანაზე ფოკუსირების შეწყვეტა</translation> +<translation id="1180117276105724040">მიმდინარეობს ფანჯრების აღდგენა წინა სესიიდან...</translation> <translation id="1181037720776840403">ამოშლა</translation> <translation id="1182225749592316782">წვდომა მიენიჭება ყველა აპსა და ვებსაიტს, რომლებსაც კამერისა და მიკროფონის გამოყენების ნებართვა აქვს</translation> <translation id="1182876754474670069">მთავარი</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">გადართავთ აუდიოს წყაროს?</translation> <translation id="1505542291183484463">ფანჯრის ზომის შეცვლა მოზაიკურად ქვემო მიმართულებით</translation> <translation id="1510238584712386396">გამშვები</translation> +<translation id="1519090060276706457">ფანრების აღდგენას დაგეგმილზე მეტი დრო სჭირდება</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{შეტყობინების პარამეტრების ჩვენება. შეტყობინებები გამორთულია აპისთვის}other{შეტყობინების პარამეტრების ჩვენება. შეტყობინებები გამორთულია # აპისთვის}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">ბატარეა <ph name="BATTERY_PERCENTAGE" />%-ზეა | სრულ დატენამდე დარჩა <ph name="TIME" /></translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">ეკრანი ეკრანში ფანჯრის მაქსიმალურ და მიმდინარე ზომებს შორის გადართვა</translation> <translation id="1787955149152357925">გამორთვა</translation> <translation id="1796561540704213354">ვებსაიტები, მათ შორის, თქვენ მიერ მონახულებული გვერდები და გახსნილი გვერდები</translation> +<translation id="1799852120691957794">წინა სესიიდან ფანჯრების აღდგენა შეუძლებელია</translation> <translation id="1805407494113167797">ფოკუსის ხმების დაკვრა ვერ მოხერხდა</translation> <translation id="181103072419391116">სიგნალის სიძლიერე: <ph name="SIGNAL_STRENGTH" />, მართავს თქვენი ადმინისტრატორი</translation> <translation id="1815039896005206046">ქვევით დაწეული ცერის ღილაკზე დაჭერით გაგზავნით გამოხმაურებას, რომ ეს შემოთავაზებული ჯგუფი არ მოგწონთ</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">ფანჯრის ანაბეჭდის გადაღება</translation> <translation id="2598725286293895280">სამუშაო მაგიდაზე მხარდაუჭერელი აპებია</translation> <translation id="2607678425161541573">საჭიროა სიტემაში ონლაინ შესვლა</translation> +<translation id="2611702650078660078">მოხდა შეცდომა</translation> <translation id="2612072250312279703">აქტივობის მონიტორინგი</translation> <translation id="261210853165551493">ფორმატირებით დაკოპირება</translation> <translation id="2612614436418177118">აპის ხატულას გადაადგილება აპების ბადეში</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">ეკრანის სრული ანაბეჭდის აღსაბეჭდად დააჭირეთ Enter-ს</translation> <translation id="2849936225196189499">კრიტიკული</translation> <translation id="2850207700020959936">აპებს აქვს კამერაზე წვდომა</translation> +<translation id="2852045827873867442">საჭიროა ინტერნეტ-კავშირი.</translation> <translation id="2860184359326882502">საუკეთესო დამთხვევა</translation> <translation id="2865888419503095837">ქსელის ინფორმაცია</translation> <translation id="2869095047958348710">გასული <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">პაროლი <ph name="USER_EMAIL_ADDRESS" />-თვის</translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">Google ასისტენტი მიუწვდომელია დემო-სესიაში.</translation> +<translation id="4781633367688946589">ახალი სესიით გაგრძელება</translation> <translation id="4785412405516449976">მხოლოდ თქვენს კონტაქტებს, Google ანგარიშით</translation> <translation id="4789348252524569426">მეტყველების ფაილების ინსტალაცია ვერ მოხერხდა. საჭიროა თქვენი მოწყობილობის განახლება. გადატვირთეთ მოწყობილობა და ცადეთ ხელახლა.</translation> <translation id="478959186716341421">ტრანსლირება</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">ეფექტურობის ტრასირება ჩართულია</translation> <translation id="5955304353782037793">პროგრამა</translation> <translation id="5958529069007801266">კონტროლის ქვეშ მყოფი მომხმარებელი</translation> +<translation id="5959471481388474538">ქსელი მიუწვდომელია</translation> <translation id="596035801491797438">სახით მართვის გამორთვა</translation> <translation id="5960410286721553511">ნახეთ თქვენი ტელეფონის ბოლოდროინდელი ფოტოები და მედიაფაილები</translation> <translation id="5965524703725988602">მუქი თემის გადართვა. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">მარტივი წვდომის პარამეტრების ჩვენება, „<ph name="ENABLED_FEATURES" />“ ჩართულია.</translation> <translation id="7946681191253332687">ხელმისაწვდომია უსაფრთხოების გაფართოებული განახლებები</translation> <translation id="7947798320695032612"><ph name="APP_NAME" />-ს სურს, გამოიყენოს თქვენი <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">არ აღდგეს ფანჯრები</translation> <translation id="7951630946012935453">კლავიატურის ჩაბნელება</translation> <translation id="7953176344218790168">ზედა რეგისტრი</translation> <translation id="7953994493035617347">დადასტურდეს ახალი გარჩევადობა?</translation>
diff --git a/ash/strings/ash_strings_kk.xtb b/ash/strings/ash_strings_kk.xtb index 54f5936..8b04608 100644 --- a/ash/strings/ash_strings_kk.xtb +++ b/ash/strings/ash_strings_kk.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Қазіргі батарея деңгейі: <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> қалды</translation> <translation id="1178581264944972037">Кідірту</translation> <translation id="1179776263021875437">Тапсырмаға зейін қоюды тоқтату</translation> +<translation id="1180117276105724040">Алдыңғы сеанс терезелері қалпына келтіріліп жатыр...</translation> <translation id="1181037720776840403">Өшіру</translation> <translation id="1182225749592316782">Бұл камера мен микрофон рұқсаттары бар барлық қолданба мен веб-сайтқа кіруге мүмкіндік береді</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Аудио дереккөзін ауыстыру қажет пе?</translation> <translation id="1505542291183484463">Терезе өлшемін төмен қарай қабаттастырмай өзгерту</translation> <translation id="1510238584712386396">Іске қосу құрылғысы</translation> +<translation id="1519090060276706457">Терезелерді қалпына келтіру әдеттегіден ұзаққа созылып жатыр</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Хабарландыру параметрлерін көрсету. Қолданбаның хабарландырулары өшірулі}other{Хабарландыру параметрлерін көрсету. # қолданбаның хабарландырулары өшірулі}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">Батарея заряды: <ph name="BATTERY_PERCENTAGE" />% | Толуға <ph name="TIME" /> қалды</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">"Суреттегі сурет" режимі терезесінің максималды немесе қазіргі өлшемі арасында ауыстыру</translation> <translation id="1787955149152357925">Өшірулі</translation> <translation id="1796561540704213354">Веб-сайттар, соның ішінде сіз кірген беттер мен ашылған беттер</translation> +<translation id="1799852120691957794">Алдыңғы сеанс терезелері қалпына келмеді</translation> <translation id="1805407494113167797">Зейін қою дыбыстары ойнатылмады</translation> <translation id="181103072419391116">Сигнал күші – <ph name="SIGNAL_STRENGTH" />, Әкімші басқарады</translation> <translation id="1815039896005206046">"Ұнамайды" белгішесін бассаңыз, сізге осы ұсынылған топ ұнамағанын білдіресіз.</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Терезенің скриншотын жасау</translation> <translation id="2598725286293895280">Жұмыс үстелінде қолдау көрсетілмейтін қолданбалар бар</translation> <translation id="2607678425161541573">Онлайн кіру қажет</translation> +<translation id="2611702650078660078">Қате орын алды.</translation> <translation id="2612072250312279703">әрекет мониторы</translation> <translation id="261210853165551493">Форматтаумен бірге көшіру</translation> <translation id="2612614436418177118">Қолданба белгішесін қолданбалар торында жылжыту</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Толық экранды скриншот түсіру үшін "Enter" пернесін басыңыз</translation> <translation id="2849936225196189499">Маңызды</translation> <translation id="2850207700020959936">Қолданбалар камераны пайдалана алады.</translation> +<translation id="2852045827873867442">Интернет байланысы қажет.</translation> <translation id="2860184359326882502">Үздік сәйкестік</translation> <translation id="2865888419503095837">Желі ақпараты</translation> <translation id="2869095047958348710">Осы аптадағы өткен <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> құпия сөзі</translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">Google Assistant демо сеанста қолжетімді емес.</translation> +<translation id="4781633367688946589">Жаңа сеанста жалғастыру</translation> <translation id="4785412405516449976">Google аккаунты бар контактілеріңіз ғана</translation> <translation id="4789348252524569426">Дыбыс тану файлдарын орнату мүмкін емес. Құрылғыны жаңарту қажет. Құрылғыны өшіріп қосып, әрекетті қайталаңыз.</translation> <translation id="478959186716341421">Трансляциялануда</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Өнімділікті бақылау қосылған</translation> <translation id="5955304353782037793">қолданба</translation> <translation id="5958529069007801266">Бақылаудағы пайдаланушы</translation> +<translation id="5959471481388474538">Желі қолжетімсіз</translation> <translation id="596035801491797438">Бетпен басқаруды өшіру</translation> <translation id="5960410286721553511">Телефондағы соңғы фотосуреттер мен медиафайлдарды көріңіз.</translation> <translation id="5965524703725988602">Қараңғы режимді ауыстыру. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Арнайы мүмкіндіктердің параметрлерін көрсету, "<ph name="ENABLED_FEATURES" />" қосулы.</translation> <translation id="7946681191253332687">Кеңейтілген қауіпсіздік жаңартулары қолжетімді</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> қолданбасы <ph name="DEVICE_NAME" /> құрылғысын пайдалануды қалайды.</translation> +<translation id="7948239795436419268">Терезелерді қалпына келтірмеу</translation> <translation id="7951630946012935453">Күңгірт пернетақта</translation> <translation id="7953176344218790168">БАРЛЫҚ СӨЗДІ БАС ӘРІППЕН ЖАЗУ</translation> <translation id="7953994493035617347">Жаңа ажыратымдылықты растау қажет пе?</translation>
diff --git a/ash/strings/ash_strings_km.xtb b/ash/strings/ash_strings_km.xtb index 1e6fcf25..727d491 100644 --- a/ash/strings/ash_strings_km.xtb +++ b/ash/strings/ash_strings_km.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">កម្រិតថ្មបច្ចុប្បន្ន <ph name="BATTERY_PERCENTAGE" />%, អាចប្រើបាន <ph name="TIME" />ទៀត</translation> <translation id="1178581264944972037">ផ្អាក</translation> <translation id="1179776263021875437">ឈប់ផ្ដោតអារម្មណ៍លើកិច្ចការ</translation> +<translation id="1180117276105724040">កំពុងស្ដារវិនដូពីវគ្គមុនរបស់អ្នក...</translation> <translation id="1181037720776840403">ដកចេញ</translation> <translation id="1182225749592316782">ការធ្វើបែបនេះផ្ដល់សិទ្ធិចូលប្រើប្រាស់ដល់គ្រប់កម្មវិធី និងគេហទំព័រដែលមានការអនុញ្ញាតឱ្យប្រើកាមេរ៉ា និងមីក្រូហ្វូន</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">ប្ដូរប្រភពសំឡេងឬ?</translation> <translation id="1505542291183484463">ប្ដូរទំហំវិនដូជាប្រអប់ចុះក្រោម</translation> <translation id="1510238584712386396">ឡាន់ឆ័រ</translation> +<translation id="1519090060276706457">ការស្ដារវិនដូកំពុងចំណាយពេលយូរជាងការរំពឹងទុក</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{បង្ហាញការកំណត់ការជូនដំណឹង។ ការជូនដំណឹងត្រូវបានបិទសម្រាប់កម្មវិធីមួយ}other{បង្ហាញការកំណត់ការជូនដំណឹង។ ការជូនដំណឹងត្រូវបានបិទសម្រាប់កម្មវិធី #}}</translation> <translation id="1521655867290435174">Google បញ្ជី</translation> <translation id="1523032696246003">ថ្ម <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" />ទៀតទើបពេញ</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">ប្ដូររវាងទំហំអតិបរមា ឬទំហំបច្ចុប្បន្ននៃវិនដូរូបក្នុងរូប</translation> <translation id="1787955149152357925">បិទ</translation> <translation id="1796561540704213354">គេហទំព័រ រួមទាំងទំព័រដែលអ្នកបានចូលមើល និងទំព័រដែលបើក</translation> +<translation id="1799852120691957794">មិនអាចស្ដារវិនដូពីវគ្គមុនរបស់អ្នកបានទេ</translation> <translation id="1805407494113167797">មិនអាចចាក់សំឡេងមុខងារផ្ដោតអារម្មណ៍បានទេ</translation> <translation id="181103072419391116">កម្លាំងរលកសញ្ញា <ph name="SIGNAL_STRENGTH" />, គ្រប់គ្រងដោយអ្នកគ្រប់គ្រងរបស់អ្នក</translation> <translation id="1815039896005206046">ការឱ្យមេដៃចុះនឹងដាក់បញ្ជូនមតិកែលម្អដែលប្រាប់ថា អ្នកមិនចូលចិត្តក្រុមដែលបានណែនាំនេះទេ</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">ថតរូបថតអេក្រង់វិនដូ</translation> <translation id="2598725286293895280">កម្មវិធីដែលមិនអាចប្រើនៅក្នុងតុ</translation> <translation id="2607678425161541573">តម្រូវឱ្យចូលគណនីលើអ៊ីនធឺណិត</translation> +<translation id="2611702650078660078">មានបញ្ហាបានកើតឡើង</translation> <translation id="2612072250312279703">កម្មវិធីតាមដានសកម្មភាព</translation> <translation id="261210853165551493">ចម្លងអក្សរដែលមានការកំណត់ទម្រង់</translation> <translation id="2612614436418177118">ផ្លាស់ទីរូបកម្មវិធីនៅក្នុងក្រឡាកម្មវិធី</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">ចុច enter ដើម្បីថតរូបអេក្រង់ពេញអេក្រង់</translation> <translation id="2849936225196189499">សំខាន់</translation> <translation id="2850207700020959936">កម្មវិធីអាចចូលប្រើកាមេរ៉ាបាន</translation> +<translation id="2852045827873867442">តម្រូវឱ្យមានការតភ្ជាប់អ៊ីនធឺណិត។</translation> <translation id="2860184359326882502">ត្រូវគ្នាបំផុត</translation> <translation id="2865888419503095837">ព័ត៌មានបណ្តាញ</translation> <translation id="2869095047958348710">កាលពីថ្ងៃ<ph name="DAY_OF_WEEK" />កន្លងទៅនេះ</translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">ពាក្យសម្ងាត់សម្រាប់ <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">Google ជំនួយការមិនអាចប្រើនៅក្នុងរយៈពេលចូលប្រើសាកល្បងបានទេ។</translation> +<translation id="4781633367688946589">បន្តទៅវគ្គថ្មី</translation> <translation id="4785412405516449976">មានតែទំនាក់ទំនងរបស់អ្នកដែលប្រើគណនី Google ប៉ុណ្ណោះ</translation> <translation id="4789348252524569426">មិនអាចដំឡើងឯកសារនៃការនិយាយបានទេ។ ឧបករណ៍របស់អ្នកត្រូវការធ្វើបច្ចុប្បន្នភាព។ សូមចាប់ផ្ដើមឧបករណ៍របស់អ្នកឡើងវិញ រួចព្យាយាមម្ដងទៀត។</translation> <translation id="478959186716341421">កំពុងខាស</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">ការតាមដានប្រតិបត្តិការបានបើកដំណើរការ</translation> <translation id="5955304353782037793">កម្មវិធី</translation> <translation id="5958529069007801266">អ្នកប្រើដែលបានចាត់</translation> +<translation id="5959471481388474538">បណ្តាញមិនមានទេ</translation> <translation id="596035801491797438">បិទការគ្រប់គ្រងដោយប្រើមុខ</translation> <translation id="5960410286721553511">មើលរូបថត និងមេឌៀថ្មីៗរបស់ទូរសព្ទអ្នក</translation> <translation id="5965524703725988602">បិទ/បើកទម្រង់រចនាងងឹត។ <ph name="STATE_TEXT" />។</translation> @@ -2251,6 +2258,7 @@ <translation id="7945357288295809525">បង្ហាញការកំណត់ភាពងាយស្រួល, បានបើក "<ph name="ENABLED_FEATURES" />"។</translation> <translation id="7946681191253332687">មានការធ្វើបច្ចុប្បន្នភាពផ្នែកសុវត្ថិភាពបន្ថែម</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> ចង់ប្រើ<ph name="DEVICE_NAME" />របស់អ្នក</translation> +<translation id="7948239795436419268">កុំស្ដារវិនដូ</translation> <translation id="7951630946012935453">បន្ថយពន្លឺក្ដារចុច</translation> <translation id="7953176344218790168">អក្សរធំ</translation> <translation id="7953994493035617347">បញ្ជាក់កម្រិតគុណភាពថ្មីឬ?</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb index b94d4a00a..bc9b29d 100644 --- a/ash/strings/ash_strings_kn.xtb +++ b/ash/strings/ash_strings_kn.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">ಪ್ರಸ್ತುತ ಬ್ಯಾಟರಿ <ph name="BATTERY_PERCENTAGE" />% ರಷ್ಟಿದೆ, <ph name="TIME" /> ಉಳಿದಿದೆ</translation> <translation id="1178581264944972037">ವಿರಾಮ</translation> <translation id="1179776263021875437">ಕಾರ್ಯದ ಮೇಲೆ ಫೋಕಸ್ ಮಾಡುವುದನ್ನು ನಿಲ್ಲಿಸಿ</translation> +<translation id="1180117276105724040">ನಿಮ್ಮ ಹಿಂದಿನ ಸೇಶನ್ನಿಂದ ವಿಂಡೋಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="1181037720776840403">ತೆಗೆದುಹಾಕು</translation> <translation id="1182225749592316782">ಇದು ಕ್ಯಾಮರಾ ಮತ್ತು ಮೈಕ್ರೊಫೋನ್ ಅನುಮತಿಗಳನ್ನು ಹೊಂದಿರುವ ಎಲ್ಲಾ ಆ್ಯಪ್ಗಳು ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳಿಗೆ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ನೀಡುತ್ತದೆ</translation> <translation id="1182876754474670069">ಹೋಮ್</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">ಆಡಿಯೋ ಮೂಲವನ್ನು ಬದಲಿಸಬೇಕೆ?</translation> <translation id="1505542291183484463">ಟೈಲ್ಡ್ ವಿಂಡೋವನ್ನು ಕೆಳಕ್ಕೆ ಮರುಗಾತ್ರಗೊಳಿಸಿ</translation> <translation id="1510238584712386396">ಲಾಂಚರ್</translation> +<translation id="1519090060276706457">ವಿಂಡೋಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸುವುದು ನಿರೀಕ್ಷೆಗಿಂತ ಹೆಚ್ಚು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುತ್ತಿದೆ</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{ನೋಟಿಫಿಕೇಶನ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೋರಿಸಿ. ಒಂದು ಆ್ಯಪ್ಗೆ ನೋಟಿಫಿಕೇಶನ್ಗಳನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ}one{ನೋಟಿಫಿಕೇಶನ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೋರಿಸಿ. # ಆ್ಯಪ್ಗಳಿಗೆ ನೋಟಿಫಿಕೇಶನ್ಗಳನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ}other{ನೋಟಿಫಿಕೇಶನ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೋರಿಸಿ. # ಆ್ಯಪ್ಗಳಿಗೆ ನೋಟಿಫಿಕೇಶನ್ಗಳನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">ಬ್ಯಾಟರಿ ಮಟ್ಟ <ph name="BATTERY_PERCENTAGE" />% | ಬ್ಯಾಟರಿ ಚಾರ್ಜಿಂಗ್ ಪೂರ್ಣಗೊಳ್ಳುವುದಕ್ಕೆ ಬೇಕಾದ ಸಮಯ <ph name="TIME" /></translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">ಪಿಕ್ಚರ್-ಇನ್-ಪಿಕ್ಚರ್ ವಿಂಡೋದ ಗರಿಷ್ಠ ಅಥವಾ ಪ್ರಸ್ತುತ ಗಾತ್ರದ ನಡುವೆ ಬದಲಿಸಿ</translation> <translation id="1787955149152357925">ಆಫ್</translation> <translation id="1796561540704213354">ನೀವು ಭೇಟಿ ನೀಡಿದ ಪುಟಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ವೆಬ್ಸೈಟ್ಗಳು ಮತ್ತು ಪುಟಗಳನ್ನು ತೆರೆಯಿರಿ</translation> +<translation id="1799852120691957794">ನಿಮ್ಮ ಹಿಂದಿನ ಸೆಶನ್ನಿಂದ ವಿಂಡೋಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="1805407494113167797">ಫೋಕಸ್ ಸೌಂಡ್ಗಳನ್ನು ಪ್ಲೇ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</translation> <translation id="181103072419391116">ಸಿಗ್ನಲ್ ಸಾಮರ್ಥ್ಯ <ph name="SIGNAL_STRENGTH" />, ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿರ್ವಹಿಸಿದ್ದಾರೆ</translation> <translation id="1815039896005206046">ಈ ಸೂಚಿಸಲಾದ ಗುಂಪು ನಿಮಗೆ ಇಷ್ಟವಾಗಿಲ್ಲ ಎಂಬ ಫೀಡ್ಬ್ಯಾಕ್ ಅನ್ನು ಥಂಬ್ಸ್ ಡೌನ್ ಸಲ್ಲಿಸುತ್ತದೆ</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">ವಿಂಡೋ ಸ್ಕ್ರೀನ್ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಿ</translation> <translation id="2598725286293895280">ಡೆಸ್ಕ್ನಲ್ಲಿ ಬೆಂಬಲವಿಲ್ಲದ ಆ್ಯಪ್ಗಳಿವೆ</translation> <translation id="2607678425161541573">ಆನ್ಲೈನ್ ಸೈನ್ ಇನ್ನ ಅಗತ್ಯವಿದೆ</translation> +<translation id="2611702650078660078">ದೋಷ ಸಂಭವಿಸಿದೆ</translation> <translation id="2612072250312279703">ಚಟುವಟಿಕೆ ಮಾನಿಟರ್</translation> <translation id="261210853165551493">ಫಾರ್ಮ್ಯಾಟಿಂಗ್ ಮೂಲಕ ಕಾಪಿ ಮಾಡಿ</translation> <translation id="2612614436418177118">ಆ್ಯಪ್ ಗ್ರಿಡ್ನಲ್ಲಿ ಆ್ಯಪ್ ಐಕಾನ್ ಅನ್ನು ಸರಿಸಿ</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">ಪೂರ್ಣ ಸ್ಕ್ರೀನ್ ಸ್ಕ್ರೀನ್ಶಾಟ್ ಸೆರೆಹಿಡಿಯಲು Enter ಒತ್ತಿರಿ</translation> <translation id="2849936225196189499">ಗಂಭೀರ</translation> <translation id="2850207700020959936">ಆ್ಯಪ್ಗಳು ಕ್ಯಾಮರಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದು</translation> +<translation id="2852045827873867442">ಇಂಟರ್ನೆಟ್ ಕನೆಕ್ಷನ್ ಅಗತ್ಯವಿದೆ.</translation> <translation id="2860184359326882502">ಅತ್ಯುತ್ತಮ ಹೊಂದಾಣಿಕೆ</translation> <translation id="2865888419503095837">ನೆಟ್ವರ್ಕ್ ಮಾಹಿತಿ</translation> <translation id="2869095047958348710">ಕಳೆದ <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> ಗಾಗಿ ಪಾಸ್ವರ್ಡ್</translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">Google Assistant ಡೆಮೊ ಸೆಶನ್ನಲ್ಲಿ ಲಭ್ಯವಿಲ್ಲ.</translation> +<translation id="4781633367688946589">ಹೊಸ ಸೆಶನ್ಗೆ ಮುಂದುವರಿಯಿರಿ</translation> <translation id="4785412405516449976">Google ಖಾತೆಯನ್ನು ಹೊಂದಿರುವ ನಿಮ್ಮ ಸಂಪರ್ಕಗಳು ಮಾತ್ರ</translation> <translation id="4789348252524569426">ಧ್ವನಿ ಫೈಲ್ಗಳನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮ್ಮ ಸಾಧನವನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಬೇಕಾಗಿದೆ. ನಿಮ್ಮ ಸಾಧನವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ ಹಾಗೂ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="478959186716341421">ಬಿತ್ತರಿಸಲಾಗುತ್ತಿದೆ</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">ಪರ್ಫಾರ್ಮೆನ್ಸ್ ಟ್ರೇಸಿಂಗ್ ಸಕ್ರಿಯಗೊಂಡಿದೆ</translation> <translation id="5955304353782037793">ಅಪ್ಲಿಕೇಶನ್</translation> <translation id="5958529069007801266">ಮೇಲ್ವಿಚಾರಣೆಗೊಳಪಟ್ಟ ಬಳಕೆದಾರರು</translation> +<translation id="5959471481388474538">ನೆಟ್ವರ್ಕ್ ಲಭ್ಯವಿಲ್ಲ</translation> <translation id="596035801491797438">ಫೇಸ್ ಕಂಟ್ರೋಲ್ ಆಫ್ ಮಾಡಿ</translation> <translation id="5960410286721553511">ನಿಮ್ಮ ಫೋನ್ನ ಇತ್ತೀಚಿನ ಫೋಟೋಗಳು ಮತ್ತು ಮೀಡಿಯಾವನ್ನು ವೀಕ್ಷಿಸಿ</translation> <translation id="5965524703725988602">ಡಾರ್ಕ್ ಥೀಮ್ ಅನ್ನು ಟಾಗಲ್ ಮಾಡಿ. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">ಆ್ಯಕ್ಸೆಸ್ಸಿಬಿಲಿಟಿ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೋರಿಸಿ, "<ph name="ENABLED_FEATURES" />" ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.</translation> <translation id="7946681191253332687">ವಿಸ್ತೃತ ಭದ್ರತಾ ಅಪ್ಡೇಟ್ಗಳು ಲಭ್ಯವಿವೆ</translation> <translation id="7947798320695032612"><ph name="APP_NAME" />, ನಿಮ್ಮ <ph name="DEVICE_NAME" /> ಬಳಸಲು ಬಯಸುತ್ತಿದೆ</translation> +<translation id="7948239795436419268">ವಿಂಡೋಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸಬೇಡಿ</translation> <translation id="7951630946012935453">ಕೀಬೋರ್ಡ್ ಡಿಮ್ ಮಾಡಿ</translation> <translation id="7953176344218790168">ದೊಡ್ಡ ಅಕ್ಷರ</translation> <translation id="7953994493035617347">ಹೊಸ ರೆಸಲ್ಯೂಷನ್ ಅನ್ನು ಖಚಿತಪಡಿಸಬೇಕೆ?</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb index 1fbb404..49fd9726 100644 --- a/ash/strings/ash_strings_ko.xtb +++ b/ash/strings/ash_strings_ko.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">현재 배터리 잔량 <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> 남음</translation> <translation id="1178581264944972037">일시중지</translation> <translation id="1179776263021875437">할 일 집중 모드 중지</translation> +<translation id="1180117276105724040">이전 세션의 창을 복원 중…</translation> <translation id="1181037720776840403">삭제</translation> <translation id="1182225749592316782">카메라 및 마이크 권한이 있는 모든 앱과 웹사이트에 액세스 권한이 부여됩니다.</translation> <translation id="1182876754474670069">Home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">오디오 소스를 전환할까요?</translation> <translation id="1505542291183484463">아래쪽으로 창 크기 조절</translation> <translation id="1510238584712386396">런처</translation> +<translation id="1519090060276706457">창 복원이 예상보다 오래 걸림</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{알림 설정을 표시합니다. 앱 1개의 알림이 사용 중지되어 있습니다.}other{알림 설정을 표시합니다. 앱 #개의 알림이 사용 중지되어 있습니다.}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">배터리 <ph name="BATTERY_PERCENTAGE" />% | 충전 완료까지 <ph name="TIME" /> 남음</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">PIP 모드 창의 최대 크기 또는 현재 크기 간에 전환</translation> <translation id="1787955149152357925">꺼짐</translation> <translation id="1796561540704213354">방문한 페이지 및 열린 페이지를 포함한 웹사이트</translation> +<translation id="1799852120691957794">이전 세션의 창을 복원할 수 없음</translation> <translation id="1805407494113167797">집중 모드 사운드를 재생할 수 없음</translation> <translation id="181103072419391116">신호 강도 <ph name="SIGNAL_STRENGTH" />, 관리자가 관리함</translation> <translation id="1815039896005206046">싫어요를 누르면 이 추천 그룹이 마음에 들지 않는다는 의견이 제출됩니다.</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">창 스크린샷 찍기</translation> <translation id="2598725286293895280">데스크에 지원되지 않는 앱 있음</translation> <translation id="2607678425161541573">온라인 로그인 필요</translation> +<translation id="2611702650078660078">오류가 발생했습니다</translation> <translation id="2612072250312279703">활동 모니터링</translation> <translation id="261210853165551493">서식을 포함하여 복사</translation> <translation id="2612614436418177118">앱 그리드 내에서 앱 아이콘 이동</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">전체 화면 스크린샷을 캡처하려면 Enter를 누르세요</translation> <translation id="2849936225196189499">중요</translation> <translation id="2850207700020959936">앱이 카메라에 액세스할 수 있음</translation> +<translation id="2852045827873867442">인터넷 연결이 필요합니다</translation> <translation id="2860184359326882502">가장 일치하는 결과</translation> <translation id="2865888419503095837">네트워크 정보</translation> <translation id="2869095047958348710">지난 <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" />의 비밀번호</translation> <translation id="4777825441726637019">Play 스토어</translation> <translation id="4778095205580009397">데모 세션에서는 Google 어시스턴트를 사용할 수 없습니다.</translation> +<translation id="4781633367688946589">새 세션으로 계속</translation> <translation id="4785412405516449976">내 주소록에 있는 Google 계정 사용자만</translation> <translation id="4789348252524569426">음성 파일을 설치할 수 없습니다. 기기를 업데이트해야 합니다. 기기를 재시작한 후 다시 시도해 보세요.</translation> <translation id="478959186716341421">전송</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">성능 추적 사용 중</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">관리 대상 사용자</translation> +<translation id="5959471481388474538">네트워크에 연결할 수 없음</translation> <translation id="596035801491797438">페이스 컨트롤 사용 중지</translation> <translation id="5960410286721553511">휴대전화의 최신 사진 및 미디어를 봅니다.</translation> <translation id="5965524703725988602">어두운 테마를 전환합니다. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">접근성 설정 표시, "<ph name="ENABLED_FEATURES" />" 사용 설정됨</translation> <translation id="7946681191253332687">보안 업데이트 연장 사용 가능</translation> <translation id="7947798320695032612"><ph name="APP_NAME" />에서 <ph name="DEVICE_NAME" /> 사용할 권한 요청함</translation> +<translation id="7948239795436419268">창 복원 안함</translation> <translation id="7951630946012935453">키보드 어둡게</translation> <translation id="7953176344218790168">대문자</translation> <translation id="7953994493035617347">새 해상도를 확인하시겠습니까?</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb index 746817c..76a57708 100644 --- a/ash/strings/ash_strings_ky.xtb +++ b/ash/strings/ash_strings_ky.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Батареянын учурдагы деңгээли: <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> калды</translation> <translation id="1178581264944972037">Бир азга токтотуу</translation> <translation id="1179776263021875437">Жасалчу ишти бүтүрүү</translation> +<translation id="1180117276105724040">Мурунку сеансыңыздагы терезелер калыбына келтирилүүдө...</translation> <translation id="1181037720776840403">Алып салуу</translation> <translation id="1182225749592316782">Уруксаты бар колдонмолордун жана вебсайттардын баарына камера менен микрофонду пайдалануу мүмкүнчүлүгү берилет</translation> <translation id="1182876754474670069">Home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Башка аудио булакка которуласызбы?</translation> <translation id="1505542291183484463">Көп терезе режиминде терезени ылдый тартуу</translation> <translation id="1510238584712386396">Жүргүзгүч</translation> +<translation id="1519090060276706457">Терезелерди калыбына келтирүү күтүлгөндөн узакка созулуп жатат</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Билдирмелердин параметрлерин көрсөтүү. Колдонмонун билдирмелери өчүк}other{Билдирмелердин параметрлерин көрсөтүү. # колдонмонун билдирмелери өчүк}}</translation> <translation id="1521655867290435174">Google Таблицалары</translation> <translation id="1523032696246003">Батареянын кубаты: <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> кийин толот</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Сүрөттөгү сүрөт терезесинин максималдуу жана учурдагы өлчөмдөрүнүн ортосунда которулуу</translation> <translation id="1787955149152357925">Өчүк</translation> <translation id="1796561540704213354">Вебсайттар, анын ичинде сиз баш баккан жана ачык барактар</translation> +<translation id="1799852120691957794">Мурунку сеансыңыздагы терезелерди калыбына келтирүү мүмкүн эмес</translation> <translation id="1805407494113167797">Focus добуштары ойнотулган жок</translation> <translation id="181103072419391116">Сигналдын күчү <ph name="SIGNAL_STRENGTH" />, Администраторуңуз башкарат</translation> <translation id="1815039896005206046">Жаккан жок баскычы бул сунушталган топту жактырбаганыңызды билдирет</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Терезенин скриншотун тартып алуу</translation> <translation id="2598725286293895280">Иш тактада колдоого алынбаган колдонмолор бар</translation> <translation id="2607678425161541573">Онлайн аккаунтка кирүү талап кылынат</translation> +<translation id="2611702650078660078">Ката кетти</translation> <translation id="2612072250312279703">аракеттерге көз салуу</translation> <translation id="261210853165551493">Форматтоо менен көчүрүү</translation> <translation id="2612614436418177118">Колдонмонун сүрөтчөсүн колдонмонун торчосунда жылдыруу</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Толук экрандын скриншотун тартып алуу үчүн "Enter" баскычын басыңыз</translation> <translation id="2849936225196189499">Олуттуу</translation> <translation id="2850207700020959936">Колдонмолор камераны колдоно алышат</translation> +<translation id="2852045827873867442">Интернет байланышы талап кылынат.</translation> <translation id="2860184359326882502">Дал келди</translation> <translation id="2865888419503095837">Тармак маалыматы</translation> <translation id="2869095047958348710">Өткөн <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> үчүн сырсөз</translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">Google Жардамчысы демо сеанста жеткиликсиз.</translation> +<translation id="4781633367688946589">Жаңы сеансты баштоо</translation> <translation id="4785412405516449976">Google аккаунту бар байланыштарыңыз гана</translation> <translation id="4789348252524569426">Кеп файлдары орнотулбай жатат. Түзмөгүңүздү жаңыртуу талап кылынат. Түзмөктү өчүрүп күйгүзүп, кайталап көрүңүз.</translation> <translation id="478959186716341421">Тышкы экранга чыгарылууда</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Иштин майнаптуулугуна көз салуу аракети иштетилди</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Көзөмөлдөнгөн колдонуучу</translation> +<translation id="5959471481388474538">Тармак жок</translation> <translation id="596035801491797438">Жүз менен бүтүрүүнү өчүрүү</translation> <translation id="5960410286721553511">Телефонуңуздагы соңку сүрөттөрдү жана медианы көрөсүз</translation> <translation id="5965524703725988602">Караңгы теманы өчүрүү/күйгүзүү. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Атайын мүмкүнчүлүктөрдү тууралоону көрсөтүү, "<ph name="ENABLED_FEATURES" />" иштетилди.</translation> <translation id="7946681191253332687">Кеңейтилген коопсуздук тутум жаңыртуулары жеткиликтүү</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> төмөнкүнү колдонгону жатат: <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Терезелер калыбына келтирилбесин</translation> <translation id="7951630946012935453">Баскычтопту караңгылатуу</translation> <translation id="7953176344218790168">БАШ ТАМГАЛАР</translation> <translation id="7953994493035617347">Жаңы дааналыкты ырастайсызбы?</translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb index 9780775..077e026 100644 --- a/ash/strings/ash_strings_lo.xtb +++ b/ash/strings/ash_strings_lo.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">ລະດັບແບັດເຕີຣີປັດຈຸບັນ <ph name="BATTERY_PERCENTAGE" />%, ເຫຼືອ <ph name="TIME" /></translation> <translation id="1178581264944972037">ຢຸດຊົ່ວຄາວ</translation> <translation id="1179776263021875437">ຢຸດການໂຟກັສໃສ່ໜ້າວຽກ</translation> +<translation id="1180117276105724040">ກຳລັງກູ້ຄືນໜ້າຈໍຈາກເຊດຊັນກ່ອນໜ້າຂອງທ່ານ...</translation> <translation id="1181037720776840403">ລຶບອອກ</translation> <translation id="1182225749592316782">ນີ້ຈະອະນຸຍາດໃຫ້ແອັບ ແລະ ເວັບໄຊທັງໝົດເຂົ້າເຖິງກ້ອງຖ່າຍຮູບ ແລະ ໄມໂຄຣໂຟນໄດ້</translation> <translation id="1182876754474670069">ໜ້າຫຼັກ</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">ປ່ຽນແຫຼ່ງທີ່ມາຂອງສຽງບໍ?</translation> <translation id="1505542291183484463">ປັບຂະໜາດໜ້າຈໍແບບຮຽງຕໍ່ກັນລົງລຸ່ມ</translation> <translation id="1510238584712386396">ຕົວເປີດໃຊ້</translation> +<translation id="1519090060276706457">ການກູ້ຄືນໜ້າຈໍໃຊ້ເວລາດົນກວ່າທີ່ຄາດໄວ້</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{ສະແດງການຕັ້ງຄ່າການແຈ້ງເຕືອນ. ການແຈ້ງເຕືອນປິດຢູ່ສຳລັບໜຶ່ງແອັບ}other{ສະແດງການຕັ້ງຄ່າການແຈ້ງເຕືອນ. ການແຈ້ງເຕືອນປິດຢູ່ສຳລັບ # ແອັບ}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">ແບັດເຕີຣີ <ph name="BATTERY_PERCENTAGE" />% | ອີກ <ph name="TIME" /> ຈະເຕັມ</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">ສະຫຼັບລະຫວ່າງຂະໜາດສູງສຸດ ຫຼື ຂະໜາດປັດຈຸບັນຂອງໜ້າຈໍການສະແດງຜົນຊ້ອນກັນ</translation> <translation id="1787955149152357925">ປິດ</translation> <translation id="1796561540704213354">ເວັບໄຊຮວມມີໜ້າຕ່າງໆທີ່ທ່ານເຄີຍເຂົ້າ ແລະ ໜ້າທີ່ເປີດໄວ້</translation> +<translation id="1799852120691957794">ບໍ່ສາມາດກູ້ຄືນໜ້າຈໍຈາກເຊດຊັນກ່ອນໜ້າຂອງທ່ານໄດ້</translation> <translation id="1805407494113167797">ບໍ່ສາມາດຫຼິ້ນສຽງໂໝດໂຟກັສໄດ້</translation> <translation id="181103072419391116">ຄວາມແຮງສັນຍານ <ph name="SIGNAL_STRENGTH" />, ຈັດການໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ</translation> <translation id="1815039896005206046">ບໍ່ມັກຈະສົ່ງຄໍາຕິຊົມທີ່ທ່ານບໍ່ຖືກໃຈກຸ່ມແນະນຳນີ້</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">ຖ່າຍພາບໜ້າຈໍ</translation> <translation id="2598725286293895280">ແອັບທີ່ບໍ່ຮອງຮັບໃນໂຕະ</translation> <translation id="2607678425161541573">ຕ້ອງເຂົ້າສູ່ລະບົບອອນລາຍ</translation> +<translation id="2611702650078660078">ເກີດຂໍ້ຜິດພາດ</translation> <translation id="2612072250312279703">ເຄື່ອງມືກວດສອບກິດຈະກຳ</translation> <translation id="261210853165551493">ສຳເນົາພ້ອມການຈັດຮູບແບບ</translation> <translation id="2612614436418177118">ຍ້າຍໄອຄອນແອັບພາຍໃນຕາຕະລາງແອັບ</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">ກົດ enter ເພື່ອບັນທຶກຮູບໜ້າຈໍແບບເຕັມຈໍ</translation> <translation id="2849936225196189499">ສໍາຄັນ</translation> <translation id="2850207700020959936">ແອັບສາມາດເຂົ້າເຖິງກ້ອງໄດ້</translation> +<translation id="2852045827873867442">ຕ້ອງມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ.</translation> <translation id="2860184359326882502">ກົງກັນທີ່ສຸດ</translation> <translation id="2865888419503095837">ຂໍ້ມູນເຄືອຂ່າຍ</translation> <translation id="2869095047958348710"><ph name="DAY_OF_WEEK" /> ທີ່ຜ່ານມານີ້</translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">ລະຫັດຜ່ານສໍາລັບ <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">ຜູ້ຊ່ວຍ Google ບໍ່ສາມາດໃຊ້ໄດ້ໃນເຊດຊັນສາທິດ.</translation> +<translation id="4781633367688946589">ດຳເນີນການຕໍ່ໄປຫາເຊດຊັນໃໝ່</translation> <translation id="4785412405516449976">ສະເພາະລາຍຊື່ຜູ້ຕິດຕໍ່ຂອງທ່ານທີ່ມີບັນຊີ Google</translation> <translation id="4789348252524569426">ບໍ່ສາມາດຕິດຕັ້ງໄຟລ໌ສຽງເວົ້າໄດ້. ຕ້ອງອັບເດດອຸປະກອນຂອງທ່ານ. ກະລຸນາຣີສະຕາດອຸປະກອນຂອງທ່ານແລ້ວລອງໃໝ່.</translation> <translation id="478959186716341421">ກຳລັງຄາສທ໌</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">ການຕິດຕາມການປະຕິບັດເປີດໃຊ້ງານແລ້ວ</translation> <translation id="5955304353782037793">ແອັບ</translation> <translation id="5958529069007801266">ຜູ້ໃຊ້ທີ່ມີການຄວບຄຸມດູແລ</translation> +<translation id="5959471481388474538">ບໍ່ມີເຄືອຂ່າຍຢູ່</translation> <translation id="596035801491797438">ປິດການຄວບຄຸມດ້ວຍໃບໜ້າ</translation> <translation id="5960410286721553511">ເບິ່ງຮູບພາບ ແລະ ມີເດຍຫຼ້າສຸດຂອງໂທລະສັບທ່ານ</translation> <translation id="5965524703725988602">ສະຫຼັບຮູບແບບສີສັນມືດ. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">ສະແດງການຕັ້ງຄ່າການຊ່ວຍເຂົ້າເຖິງ, ເປີດການນຳໃຊ້ "<ph name="ENABLED_FEATURES" />" ແລ້ວ.</translation> <translation id="7946681191253332687">ມີການອັບເດດການຮັກສາຄວາມປອດໄພເພີ່ມເຕີມທີ່ພ້ອມໃຫ້ບໍລິການ</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> ຕ້ອງການໃຊ້ <ph name="DEVICE_NAME" /> ຂອງທ່ານ</translation> +<translation id="7948239795436419268">ບໍ່ຕ້ອງກູ້ຄືນໜ້າຈໍ</translation> <translation id="7951630946012935453">ຫຼຸດແສງໄຟແປ້ນພິມ</translation> <translation id="7953176344218790168">ຕົວພິມໃຫຍ່</translation> <translation id="7953994493035617347">ຢືນຢັນຄວາມລະອຽດໃໝ່ບໍ?</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index f8d0e76..ad644a0 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Dabartinis akumuliatoriaus įkrovos lygis: <ph name="BATTERY_PERCENTAGE" /> %, liko <ph name="TIME" /></translation> <translation id="1178581264944972037">Pristabdyti</translation> <translation id="1179776263021875437">Sustabdyti dėmesio sutelkimą į užduotį</translation> +<translation id="1180117276105724040">Atkuriami langai iš ankstesnio seanso...</translation> <translation id="1181037720776840403">Pašalinti</translation> <translation id="1182225749592316782">Suteikiama prieiga visoms programoms ir svetainėms, turinčioms fotoaparato ir mikrofono leidimus</translation> <translation id="1182876754474670069">klavišas „Home“</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Perjungti garso šaltinį?</translation> <translation id="1505542291183484463">Išklotinės dydžio keitimo langas apačioje</translation> <translation id="1510238584712386396">Paleidimo priemonė</translation> +<translation id="1519090060276706457">Langų atkūrimas trunka ilgiau, nei tikėtasi</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Rodyti pranešimų nustatymus. Programos pranešimai išjungti}one{Rodyti pranešimų nustatymus. # programos pranešimai išjungti}few{Rodyti pranešimų nustatymus. # programų pranešimai išjungti}many{Rodyti pranešimų nustatymus. # programos pranešimai išjungti}other{Rodyti pranešimų nustatymus. # programų pranešimai išjungti}}</translation> <translation id="1521655867290435174">„Google“ skaičiuoklės</translation> <translation id="1523032696246003">Akumuliatoriaus įkrovimo lygis: <ph name="BATTERY_PERCENTAGE" /> % | <ph name="TIME" /> iki visiško įkrovimo</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Perjungti maksimalų arba dabartinį vaizdo vaizde lango dydį</translation> <translation id="1787955149152357925">Išjungta</translation> <translation id="1796561540704213354">Svetainės, įskaitant puslapius, kuriuose lankėtės, ir atidarytus puslapius</translation> +<translation id="1799852120691957794">Nepavyko atkurti langų iš ankstesnio seanso</translation> <translation id="1805407494113167797">Nepavyko paleisti „Focus“ garsų</translation> <translation id="181103072419391116">Signalo stiprumas <ph name="SIGNAL_STRENGTH" />, tvarko administratorius</translation> <translation id="1815039896005206046">Mygtuku „Nepatinka“ pateiksite atsiliepimą, kad jums nepatinka ši siūloma grupė</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Sukurti lango ekrano kopiją</translation> <translation id="2598725286293895280">Nepalaikomos programos darbalaukyje</translation> <translation id="2607678425161541573">Reikia prisijungti internete</translation> +<translation id="2611702650078660078">Įvyko klaida</translation> <translation id="2612072250312279703">veiklos stebėjimo priemonė</translation> <translation id="261210853165551493">Kopijuoti su formatavimu</translation> <translation id="2612614436418177118">Perkelti programos piktogramą į programų tinklelį</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Paspauskite „Enter“, kad užfiksuotumėte viso ekrano kopiją</translation> <translation id="2849936225196189499">Kritinis</translation> <translation id="2850207700020959936">Programos gali pasiekti vaizdo kamerą</translation> +<translation id="2852045827873867442">Reikalingas interneto ryšys.</translation> <translation id="2860184359326882502">Geriausia atitiktis</translation> <translation id="2865888419503095837">Tinklo informacija</translation> <translation id="2869095047958348710">Praėjęs <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> slaptažodis</translation> <translation id="4777825441726637019">„Play“ parduotuvė</translation> <translation id="4778095205580009397">„Google“ padėjėjas nepasiekiamas demonstracinėje sesijoje.</translation> +<translation id="4781633367688946589">Tęsti naują seansą</translation> <translation id="4785412405516449976">Tik jūsų kontaktai su „Google“ paskyra</translation> <translation id="4789348252524569426">Nepavyko įdiegti kalbos failų. Reikia atnaujinti įrenginį. Paleiskite įrenginį iš naujo ir bandykite dar kartą.</translation> <translation id="478959186716341421">Perduodama</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Įgalintas našumo stebėjimas</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Prižiūrimas naudotojas</translation> +<translation id="5959471481388474538">Tinklas negalimas</translation> <translation id="596035801491797438">Išjungti valdymą veidu</translation> <translation id="5960410286721553511">Peržiūrėkite telefono naujausias nuotraukas ir mediją</translation> <translation id="5965524703725988602">Perjungti Tamsiąją temą. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Rodyti pritaikomumo nustatymus, funkcija „<ph name="ENABLED_FEATURES" />“ įgalinta.</translation> <translation id="7946681191253332687">Pasiekiami išplėstiniai saugos naujiniai</translation> <translation id="7947798320695032612">„<ph name="APP_NAME" />“ nori naudoti jūsų <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Neatkurti langų</translation> <translation id="7951630946012935453">Pritemdyti klaviatūrą</translation> <translation id="7953176344218790168">DIDŽIOSIOS RAIDĖS</translation> <translation id="7953994493035617347">Patvirtinti naują skyrą?</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb index ba778befc..87cdb5ad 100644 --- a/ash/strings/ash_strings_lv.xtb +++ b/ash/strings/ash_strings_lv.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Pašreizējais akumulatora uzlādes līmenis: <ph name="BATTERY_PERCENTAGE" />%, atlikušais laiks: <ph name="TIME" /></translation> <translation id="1178581264944972037">Pauzēt</translation> <translation id="1179776263021875437">Pārtraukt fokusa režīma lietošanu uzdevumam</translation> +<translation id="1180117276105724040">Notiek logu atjaunošana no iepriekšējās sesijas…</translation> <translation id="1181037720776840403">Noņemt</translation> <translation id="1182225749592316782">Tādējādi piekļuve tiek atļauta visām lietotnēm un vietnēm, kurām ir kameras un mikrofona atļauja.</translation> <translation id="1182876754474670069">sākumlapa</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Vai mainīt audio avotu?</translation> <translation id="1505542291183484463">Loga izmēra mainīšana mozaīkas skatā — uz leju</translation> <translation id="1510238584712386396">Lietojumprogrammu palaidējs</translation> +<translation id="1519090060276706457">Logu atjaunošana aizņem ilgāku laiku, nekā paredzēts</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Rādīt paziņojumu iestatījumus. Paziņojumi lietotnei ir izslēgti}zero{Rādīt paziņojumu iestatījumus. Paziņojumi ir izslēgti # lietotnēm}one{Rādīt paziņojumu iestatījumus. Paziņojumi ir izslēgti # lietotnei}other{Rādīt paziņojumu iestatījumus. Paziņojumi ir izslēgti # lietotnēm}}</translation> <translation id="1521655867290435174">Google izklājlapas</translation> <translation id="1523032696246003">Akumulatora uzlādes līmenis: <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> līdz pilnai uzlādei</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Pārslēgt funkcijas “Attēls attēlā” loga izmēru starp maksimālo un pašreizējo</translation> <translation id="1787955149152357925">Izslēgts</translation> <translation id="1796561540704213354">Tīmekļa vietnes, tostarp iepriekš apmeklētās un pašlaik atvērtās lapas</translation> +<translation id="1799852120691957794">Nevar atjaunot logus no iepriekšējās sesijas</translation> <translation id="1805407494113167797">Nevarēja atskaņot funkcijas Fokuss skaņas.</translation> <translation id="181103072419391116">Signāla stiprums: <ph name="SIGNAL_STRENGTH" />, pārvalda jūsu administrators</translation> <translation id="1815039896005206046">Noklikšķinot uz ikonas “Nepatīk”, varat norādīt, ka jums nepatīk šī ieteiktā grupa.</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Uzņemt loga ekrānuzņēmumu</translation> <translation id="2598725286293895280">Neatbalstītas lietotnes darbvietā</translation> <translation id="2607678425161541573">Nepieciešama pierakstīšanās tiešsaistē</translation> +<translation id="2611702650078660078">Radās kļūda</translation> <translation id="2612072250312279703">darbību uzraugs</translation> <translation id="261210853165551493">Kopēt arī formatējumu</translation> <translation id="2612614436418177118">Lietotņu režģī pārvietot lietotnes ikonu</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Lai uzņemtu visa ekrāna ekrānuzņēmumu, nospiediet taustiņu Enter</translation> <translation id="2849936225196189499">Kritisks</translation> <translation id="2850207700020959936">Lietotnes var piekļūt kamerai.</translation> +<translation id="2852045827873867442">Ir nepieciešams interneta savienojums.</translation> <translation id="2860184359326882502">Precīzākā atbilstība</translation> <translation id="2865888419503095837">Tīkla informācija</translation> <translation id="2869095047958348710">Pagājusī <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Parole e-pasta adresei <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play veikals</translation> <translation id="4778095205580009397">Google asistents nav pieejams demonstrācijas sesijā.</translation> +<translation id="4781633367688946589">Turpināt jaunā sesijā</translation> <translation id="4785412405516449976">Tikai jūsu kontaktpersonas, kurām ir Google konts</translation> <translation id="4789348252524569426">Nevar instalēt runas failus. Jums ir jāatjaunina ierīce. Restartējiet ierīci un mēģiniet vēlreiz.</translation> <translation id="478959186716341421">Notiek apraide</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Veiktspējas izsekošana ir iespējota</translation> <translation id="5955304353782037793">lietojumprogramma</translation> <translation id="5958529069007801266">Uzraudzīts lietotājs</translation> +<translation id="5959471481388474538">Tīkls nav pieejams.</translation> <translation id="596035801491797438">Izslēgt sejas kontroli</translation> <translation id="5960410286721553511">Skatiet tālruņa jaunākos fotoattēlus un multivides saturu.</translation> <translation id="5965524703725988602">Pārslēgt tumšo motīvu. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Rādīt pieejamības iestatījumus; iespējotas šādas funkcijas: <ph name="ENABLED_FEATURES" />.</translation> <translation id="7946681191253332687">Pieejami paplašinātie drošības atjauninājumi</translation> <translation id="7947798320695032612">Lietotne <ph name="APP_NAME" /> pieprasa atļauju izmantot šo ierīci: <ph name="DEVICE_NAME" />.</translation> +<translation id="7948239795436419268">Neatjaunot logus</translation> <translation id="7951630946012935453">Aptumšot tastatūru</translation> <translation id="7953176344218790168">LIELIE BURTI</translation> <translation id="7953994493035617347">Vai apstiprināt jauno izšķirtspēju?</translation>
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb index d11c318..a4f9627 100644 --- a/ash/strings/ash_strings_mk.xtb +++ b/ash/strings/ash_strings_mk.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Тековно ниво на батеријата: <ph name="BATTERY_PERCENTAGE" /> %, преостанато време: <ph name="TIME" /></translation> <translation id="1178581264944972037">Пауза</translation> <translation id="1179776263021875437">Сопрете го концентрирањето на задача</translation> +<translation id="1180117276105724040">Се враќаат прозорците од претходната сесија…</translation> <translation id="1181037720776840403">Отстрани</translation> <translation id="1182225749592316782">Ова дозволува пристап за сите апликации и веб-сајтови со дозволи за камерата и микрофонот</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Да се смени изворот на аудио?</translation> <translation id="1505542291183484463">Прозорец за променување големина со плочки надолу</translation> <translation id="1510238584712386396">Стартер</translation> +<translation id="1519090060276706457">Враќањето на прозорците трае подолго од очекуваното</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Прикажи ги поставките за известувања. Известувањата се исклучени за една апликација}one{Прикажи ги поставките за известувања. Известувањата се исклучени за # апликација}other{Прикажи ги поставките за известувања. Известувањата се исклучени за # апликации}}</translation> <translation id="1521655867290435174">Табели на Google</translation> <translation id="1523032696246003">Батерија: <ph name="BATTERY_PERCENTAGE" /> % | <ph name="TIME" /> до полна батерија</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Менувај меѓу максималната и тековната големина на прозорецот за „Слика во слика“</translation> <translation id="1787955149152357925">Исклучено</translation> <translation id="1796561540704213354">Веб-сајтовите, заедно со страниците што сте ги посетиле, како и отворените страници</translation> +<translation id="1799852120691957794">Не може да се вратат прозорците од претходната сесија</translation> <translation id="1805407494113167797">Не можеше да ги пушти звуците за „Режим за концентрација“</translation> <translation id="181103072419391116">Јачина на сигналот: <ph name="SIGNAL_STRENGTH" />, управувана од администраторот</translation> <translation id="1815039896005206046">„Не ми се допаѓа“ ќе ги испрати повратните информации дека не ви се допаѓа предложенава група</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Прави слика од екранот</translation> <translation id="2598725286293895280">Неподдржани апликации во работната површина</translation> <translation id="2607678425161541573">Задолжително е најавување онлајн</translation> +<translation id="2611702650078660078">Се јави грешка</translation> <translation id="2612072250312279703">следач на активност</translation> <translation id="261210853165551493">Копирај со форматирање</translation> <translation id="2612614436418177118">Преместувајте икона за апликација во мрежа со апликации</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Притиснете Enter за да снимите слика од целиот екран</translation> <translation id="2849936225196189499">Критична</translation> <translation id="2850207700020959936">Апликациите може да пристапуваат до камерата</translation> +<translation id="2852045827873867442">Интернет‑врската е задолжителна.</translation> <translation id="2860184359326882502">Најдобро совпаѓање</translation> <translation id="2865888419503095837">Информации за мрежа</translation> <translation id="2869095047958348710">Минатиов/ва <ph name="DAY_OF_WEEK" /></translation> @@ -1216,6 +1221,7 @@ <translation id="4776917500594043016">Лозинка за <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">„Помошникот на Google“ не е достапен во сесија за демонстрација.</translation> +<translation id="4781633367688946589">Продолжи во нова сесија</translation> <translation id="4785412405516449976">Само вашите контакти со сметка на Google</translation> <translation id="4789348252524569426">Не може да се инсталираат датотеки за говор. Треба да го ажурирате уредот. Рестартирајте го уредот и обидете се повторно.</translation> <translation id="478959186716341421">Се емитува</translation> @@ -1604,6 +1610,7 @@ <translation id="595202126637698455">Овозможено е следење на изведбата</translation> <translation id="5955304353782037793">апликација</translation> <translation id="5958529069007801266">Надгледуван корисник</translation> +<translation id="5959471481388474538">Мрежата не е достапна</translation> <translation id="596035801491797438">Исклучи „Контрола со лик“</translation> <translation id="5960410286721553511">Прегледувајте ги неодамнешните фотографии и аудиовизуелните содржини од телефонот</translation> <translation id="5965524703725988602">Вклучете/исклучете ја темната тема. <ph name="STATE_TEXT" />.</translation> @@ -2253,6 +2260,7 @@ <translation id="7945357288295809525">Прикажи ги поставките за пристапност, овозможено: „<ph name="ENABLED_FEATURES" />“.</translation> <translation id="7946681191253332687">Достапни се проширени безбедносни ажурирања</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> сака да користи <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Не враќај ги прозорците</translation> <translation id="7951630946012935453">Затемнување тастатура</translation> <translation id="7953176344218790168">ГОЛЕМИ БУКВИ</translation> <translation id="7953994493035617347">Да се потврди новата резолуција?</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb index 32406e9..a792742 100644 --- a/ash/strings/ash_strings_ml.xtb +++ b/ash/strings/ash_strings_ml.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">നിലവിലെ ബാറ്ററി നില <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> ശേഷിക്കുന്നു</translation> <translation id="1178581264944972037">താൽക്കാലികമായി നിർത്തുക</translation> <translation id="1179776263021875437">ടാസ്ക്കിൽ ഫോക്കസ് ചെയ്യുന്നത് നിർത്തുക</translation> +<translation id="1180117276105724040">നിങ്ങളുടെ മുമ്പത്തെ സെഷനിൽ നിന്ന് വിൻഡോകൾ പുനഃസ്ഥാപിക്കുന്നു...</translation> <translation id="1181037720776840403">നീക്കംചെയ്യൂ</translation> <translation id="1182225749592316782">ക്യാമറ, മൈക്രോഫോൺ എന്നിവ ആക്സസ് ചെയ്യാൻ അനുമതിയുള്ള എല്ലാ ആപ്പുകൾക്കും വെബ്സൈറ്റുകൾക്കും ഇത് ആക്സസ് അനുവദിക്കുന്നു</translation> <translation id="1182876754474670069">വീട്</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">ഓഡിയോ ഉറവിടം മാറണോ?</translation> <translation id="1505542291183484463">ടൈൽ ചെയ്ത, വലുപ്പം മാറ്റിയ വിൻഡോ താഴേക്ക് നീക്കുക</translation> <translation id="1510238584712386396">ലോഞ്ചർ</translation> +<translation id="1519090060276706457">വിൻഡോകൾ പുനഃസ്ഥാപിക്കുന്നതിന് പ്രതീക്ഷിച്ചതിലും കൂടുതൽ സമയമെടുക്കുന്നു</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{അറിയിപ്പ് ക്രമീകരണം കാണിക്കുക. ഒരു ആപ്പിന് അറിയിപ്പുകൾ ഓഫാണ്}other{അറിയിപ്പ് ക്രമീകരണം കാണിക്കുക. # ആപ്പുകൾക്ക് അറിയിപ്പുകൾ ഓഫാണ്}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003"><ph name="BATTERY_PERCENTAGE" />% ബാറ്ററി | ഫുൾ ആവാൻ <ph name="TIME" /> എടുക്കും</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">'ചിത്രത്തിനുള്ളിൽ ചിത്രം' വിൻഡോയുടെ പരമാവധി വലുപ്പം അല്ലെങ്കിൽ നിലവിലെ വലുപ്പം എന്നിവയ്ക്കിടയിൽ മാറുക</translation> <translation id="1787955149152357925">ഓഫാണ്</translation> <translation id="1796561540704213354">നിങ്ങൾ സന്ദർശിച്ച പേജുകളും തുറന്ന പേജുകളും ഉൾപ്പെടെയുള്ള വെബ്സൈറ്റുകൾ</translation> +<translation id="1799852120691957794">നിങ്ങളുടെ മുമ്പത്തെ സെഷനിൽ നിന്ന് വിൻഡോകൾ പുനഃസ്ഥാപിക്കാൻ കഴിയുന്നില്ല</translation> <translation id="1805407494113167797">ഫോക്കസ് ശബ്ദങ്ങൾ പ്ലേ ചെയ്യാനാകുന്നില്ല</translation> <translation id="181103072419391116">സിഗ്നൽ ശക്തി <ph name="SIGNAL_STRENGTH" />, നിങ്ങളുടെ അഡ്മിൻ മാനേജ് ചെയ്യുന്നത്</translation> <translation id="1815039896005206046">തംബ്സ് ഡൗൺ, നിർദ്ദേശിച്ച ഈ ഗ്രൂപ്പ് നിങ്ങൾ ഡിസ്ലൈക്ക് ചെയ്യുന്നു എന്ന ഫീഡ്ബാക്ക് സമർപ്പിക്കും</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">വിൻഡോ സ്ക്രീൻഷോട്ട് എടുക്കുക</translation> <translation id="2598725286293895280">ഡെസ്കിൽ പിന്തുണയില്ലാത്ത ആപ്പുകളുണ്ട്</translation> <translation id="2607678425161541573">ഓൺലൈനായി സൈൻ ഇൻ ചെയ്യേണ്ടതുണ്ട്</translation> +<translation id="2611702650078660078">പിശക് സംഭവിച്ചു</translation> <translation id="2612072250312279703">ആക്റ്റിവിറ്റി മോണിറ്റർ</translation> <translation id="261210853165551493">ഫോർമാറ്റിംഗ് ഉപയോഗിച്ച് പകർത്തുക</translation> <translation id="2612614436418177118">ആപ്പ് ഗ്രിഡിനുള്ളിൽ ഒരു ആപ്പ് ഐക്കൺ നീക്കുക</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">പൂർണ്ണ സ്ക്രീൻ സ്ക്രീൻഷോട്ട് എടുക്കാൻ Enter അമർത്തുക</translation> <translation id="2849936225196189499">ഗുരുതരം</translation> <translation id="2850207700020959936">ആപ്പുകൾക്ക് ക്യാമറ ആക്സസ് ചെയ്യാം</translation> +<translation id="2852045827873867442">ഇന്റർനെറ്റ് കണക്ഷൻ ആവശ്യമാണ്.</translation> <translation id="2860184359326882502">മികച്ച പൊരുത്തം</translation> <translation id="2865888419503095837">നെറ്റ്വർക്ക് വിവരം</translation> <translation id="2869095047958348710">ഇക്കഴിഞ്ഞ <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> എന്നതിനായുള്ള പാസ്വേഡ്</translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">ഡെമോ സെഷനിൽ Google അസിസ്റ്റന്റ് ലഭ്യമല്ല.</translation> +<translation id="4781633367688946589">പുതിയ സെഷനിലേക്ക് തുടരുക</translation> <translation id="4785412405516449976">Google Account ഉള്ള നിങ്ങളുടെ കോൺടാക്റ്റുകൾക്ക് മാത്രം</translation> <translation id="4789348252524569426">സംഭാഷണ ഫയലുകൾ ഇൻസ്റ്റാൾ ചെയ്യാനാകുന്നില്ല. നിങ്ങളുടെ ഉപകരണം അപ്ഡേറ്റ് ചെയ്യേണ്ടതുണ്ട്. നിങ്ങളുടെ ഉപകരണം റീസ്റ്റാർട്ട് ചെയ്ത് വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="478959186716341421">കാസ്റ്റുചെയ്യുന്നു</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">പ്രകടനം പിന്തുടരൽ പ്രവർത്തനക്ഷമമാക്കി</translation> <translation id="5955304353782037793">ആപ്പ്</translation> <translation id="5958529069007801266">മേൽനോട്ടത്തിലുള്ള ഉപയോക്താവ്</translation> +<translation id="5959471481388474538">നെറ്റ്വർക്ക് ലഭ്യമല്ല</translation> <translation id="596035801491797438">ഫെയ്സ് കൺട്രോൾ ഓഫാക്കുക</translation> <translation id="5960410286721553511">നിങ്ങളുടെ ഫോണിലെ പുതിയ ഫോട്ടോകളും മീഡിയയും കാണുക</translation> <translation id="5965524703725988602">ഡാർക്ക് തീം മാറ്റുക. <ph name="STATE_TEXT" />.</translation> @@ -2253,6 +2260,7 @@ <translation id="7945357288295809525">ഉപയോഗസഹായി ക്രമീകരണം കാണിക്കുക, "<ph name="ENABLED_FEATURES" />" പ്രവർത്തനക്ഷമമാക്കി.</translation> <translation id="7946681191253332687">വിപുലീകരിച്ച സുരക്ഷാ അപ്ഡേറ്റുകൾ ലഭ്യമാണ്</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> നിങ്ങളുടെ <ph name="DEVICE_NAME" /> ഉപയോഗിക്കാൻ ആഗ്രഹിക്കുന്നു</translation> +<translation id="7948239795436419268">വിൻഡോകൾ പുനഃസ്ഥാപിക്കരുത്</translation> <translation id="7951630946012935453">കീബോർഡ് മങ്ങിക്കുക</translation> <translation id="7953176344218790168">വലിയക്ഷരം</translation> <translation id="7953994493035617347">പുതിയ റെസല്യൂഷൻ സ്ഥിരീകരിക്കണോ?</translation>
diff --git a/ash/strings/ash_strings_mn.xtb b/ash/strings/ash_strings_mn.xtb index 15118fe..565da4ad 100644 --- a/ash/strings/ash_strings_mn.xtb +++ b/ash/strings/ash_strings_mn.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Одоогийн батарейн түвшин <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> үлдлээ</translation> <translation id="1178581264944972037">Түр зогсоох</translation> <translation id="1179776263021875437">Ажилд төвлөрөхөө болих</translation> +<translation id="1180117276105724040">Таны өмнөх харилцан үйлдлээс цонхнуудыг сэргээж байна...</translation> <translation id="1181037720776840403">Хасах</translation> <translation id="1182225749592316782">Энэ нь камер ба микрофоны зөвшөөрөлтэй бүх апп болон вебсайтад хандалтыг зөвшөөрнө</translation> <translation id="1182876754474670069">үндсэн нүүр</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Аудио эх сурвалжийг сэлгэх үү?</translation> <translation id="1505542291183484463">Хавтан болгосон цонхны хэмжээг доош татаж өөрчлөх</translation> <translation id="1510238584712386396">Launcher</translation> +<translation id="1519090060276706457">Цонхыг сэргээхэд тооцоолсноос удаж байна</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Мэдэгдлийн тохиргоог харуулна уу. Аппын мэдэгдлийг унтраасан байна}other{Мэдэгдлийн тохиргоог харуулна уу. # аппын мэдэгдлийг унтраасан байна}}</translation> <translation id="1521655867290435174">Google Хүснэгт</translation> <translation id="1523032696246003">Батарей <ph name="BATTERY_PERCENTAGE" />% | Бүрэн цэнэглэх хүртэл <ph name="TIME" /></translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Дэлгэц доторх дэлгэц цонхны дээд эсвэл одоогийн хэмжээний хооронд сэлгэх</translation> <translation id="1787955149152357925">Унтраалттай</translation> <translation id="1796561540704213354">Таны зочилсон хуудас болон нээлттэй хуудаснуудыг оруулсан вебсайтууд</translation> +<translation id="1799852120691957794">Таны өмнөх харилцан үйлдлээс цонх сэргээх боломжгүй</translation> <translation id="1805407494113167797">Төвлөрөх дуу чимээг тоглуулж чадсангүй</translation> <translation id="181103072419391116">Дохионы хүч <ph name="SIGNAL_STRENGTH" />, таны администратор удирддаг</translation> <translation id="1815039896005206046">Муу тэмдэглэгээ нь танд энэ санал болгосон бүлэг таалагдаагүй гэсэн санал хүсэлтийг илгээнэ</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Цонхны дэлгэцийн зургийг дарах</translation> <translation id="2598725286293895280">Дэлгэц дээрх дэмжигдээгүй аппууд</translation> <translation id="2607678425161541573">Онлайнаар нэвтрэх шаардлагатай</translation> +<translation id="2611702650078660078">Алдаа гарлаа</translation> <translation id="2612072250312279703">үйл ажиллагааны монитор</translation> <translation id="261210853165551493">Форматтайгаар хуулах</translation> <translation id="2612614436418177118">Аппын дүрс тэмдгийг аппын хүснэгт дотор зөөх</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Бүтэн дэлгэцийн агшин авахын тулд enter дээр дарна уу</translation> <translation id="2849936225196189499">Аюултай</translation> <translation id="2850207700020959936">Аппууд камерт хандах боломжтой</translation> +<translation id="2852045827873867442">Интернэтэд холбогдох шаардлагатай.</translation> <translation id="2860184359326882502">Хамгийн сайн тохирол</translation> <translation id="2865888419503095837">Сүлжээний мэдээлэл</translation> <translation id="2869095047958348710">Энэ өнгөрсөн <ph name="DAY_OF_WEEK" /></translation> @@ -1216,6 +1221,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" />-ийн нууц үг</translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">Google Туслах туршилтын харилцан үйлдэлд боломжгүй байна.</translation> +<translation id="4781633367688946589">Шинэ харилцан үйлдэл рүү үргэлжлүүлэх</translation> <translation id="4785412405516449976">Зөвхөн таны Google Бүртгэлтэй харилцагчид</translation> <translation id="4789348252524569426">Ярианы файлуудыг суулгах боломжгүй. Та төхөөрөмжөө шинэчлэх шаардлагатай. Төхөөрөмжөө дахин эхлүүлээд, дахин оролдоно уу.</translation> <translation id="478959186716341421">Каст хийх</translation> @@ -1604,6 +1610,7 @@ <translation id="595202126637698455">Гүйцэтгэлийн ажиглалтыг идэвхжүүлсэн</translation> <translation id="5955304353782037793">аппликейшн</translation> <translation id="5958529069007801266">Хяналттай хэрэглэгч</translation> +<translation id="5959471481388474538">Сүлжээг ажиллахгүй байна.</translation> <translation id="596035801491797438">Царайн хяналтыг унтраах</translation> <translation id="5960410286721553511">Утасныхаа саяхны зураг болон медиаг харна уу</translation> <translation id="5965524703725988602">Бараан загварыг асаана уу/унтраана уу. <ph name="STATE_TEXT" />.</translation> @@ -2253,6 +2260,7 @@ <translation id="7945357288295809525">Хүртээмжтэй тохиргоог харуулах, "<ph name="ENABLED_FEATURES" />" идэвхжүүлсэн.</translation> <translation id="7946681191253332687">Аюулгүй байдлын өргөтгөсөн шинэчлэлт боломжтой</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> таны <ph name="DEVICE_NAME" />-г ашиглах хүсэлтэй байна</translation> +<translation id="7948239795436419268">Цонхыг бүү сэргээ</translation> <translation id="7951630946012935453">Гарын гэрлийг бүдгэрүүлэх</translation> <translation id="7953176344218790168">ТОМ ҮСГЭЭР</translation> <translation id="7953994493035617347">Шинэ нягтралыг баталгаажуулах уу?</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb index 99c37c9..ef53b270 100644 --- a/ash/strings/ash_strings_mr.xtb +++ b/ash/strings/ash_strings_mr.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">बॅटरीची सद्य पातळी <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> शिल्लक आहे</translation> <translation id="1178581264944972037">विराम द्या</translation> <translation id="1179776263021875437">टास्कवर फोकस करणे थांबवा</translation> +<translation id="1180117276105724040">तुमच्या मागील सेशनमधून विंडो रिस्टोअर करत आहे...</translation> <translation id="1181037720776840403">काढून टाका</translation> <translation id="1182225749592316782">हे कॅमेरा आणि मायक्रोफोन परवानग्यांसह सर्व अॅप्स आणि वेबसाइट अॅक्सेस करण्यास अनुमती देते</translation> <translation id="1182876754474670069">होम</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">ऑडिओ स्रोत स्विच करायचा आहे का?</translation> <translation id="1505542291183484463">विंडोच्या टाइलचा आकार खालच्या दिशेने बदला</translation> <translation id="1510238584712386396">लाँचर</translation> +<translation id="1519090060276706457">विंडो रिस्टोअर करण्यासाठी अपेक्षेहून अधिक वेळ लागत आहे</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{सूचना सेटिंग्ज दाखवा. ॲपसाठी सूचना बंद आहेत}other{सूचना सेटिंग्ज दाखवा. # ॲप्ससाठी सूचना बंद आहेत}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">बॅटरी <ph name="BATTERY_PERCENTAGE" />% | पूर्ण होण्यासाठी <ph name="TIME" /></translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">चित्रात-चित्र विंडोच्या कमाल किंवा सध्याच्या आकारादरम्यान स्विच करा</translation> <translation id="1787955149152357925">बंद करा</translation> <translation id="1796561540704213354">तुम्ही भेट दिलेल्या आणि उघडलेल्या पेजसह वेबसाइट</translation> +<translation id="1799852120691957794">तुमच्या खाजगी सेशनमधील विंडो रिस्टोअर करू शकत नाही</translation> <translation id="1805407494113167797">फोकस मोडसंबंधित आवाज प्ले करता आले नाहीत</translation> <translation id="181103072419391116">सिग्नल क्षमता <ph name="SIGNAL_STRENGTH" />, तुमच्या अॅडमिनिस्ट्रेटरने व्यवस्थापित केलेले</translation> <translation id="1815039896005206046">थंब्स डाउन हे तुम्हाला हा सुचवलेला गट आवडला नाही असा फीडबॅक सबमिट करेल</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">विंडो स्क्रीनशॉट घ्या</translation> <translation id="2598725286293895280">डेस्कमधील सपोर्ट नसलेली अॅप्स</translation> <translation id="2607678425161541573">ऑनलाइन साइन इन करणे आवश्यक आहे</translation> +<translation id="2611702650078660078">एरर आली:</translation> <translation id="2612072250312279703">अॅक्टिव्हिटी मॉनिटर</translation> <translation id="261210853165551493">फॉरमॅटिंगसह कॉपी करा</translation> <translation id="2612614436418177118">अॅप आयकन हा अॅप ग्रिडमध्ये हलवा</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">फुल स्क्रीन स्क्रीनशॉट कॅप्चर करण्यासाठी एंटर प्रेस करा</translation> <translation id="2849936225196189499">गंभीर</translation> <translation id="2850207700020959936">ॲप्स कॅमेरा ॲक्सेस करू शकतात</translation> +<translation id="2852045827873867442">इंटरनेट कनेक्शन आवश्यक आहे.</translation> <translation id="2860184359326882502">सर्वोत्तम जुळणी</translation> <translation id="2865888419503095837">नेटवर्क माहिती</translation> <translation id="2869095047958348710">मागील <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> साठी पासवर्ड</translation> <translation id="4777825441726637019">Play स्टोअर</translation> <translation id="4778095205580009397">डेमो सेशनमध्ये Google असिस्टंट उपलब्ध नाही.</translation> +<translation id="4781633367688946589">नवीन सेशनमध्ये पुढे सुरू ठेवा</translation> <translation id="4785412405516449976">फक्त Google खाते असलेले तुमचे संपर्क</translation> <translation id="4789348252524569426">स्पीच फाइल इंस्टॉल करू शकत नाही. तुमचे डिव्हाइस अपडेट करणे आवश्यक आहे. तुमचे डिव्हाइस रीस्टार्ट करा आणि पुन्हा प्रयत्न करा.</translation> <translation id="478959186716341421">कास्ट करीत आहे</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">कार्यप्रदर्शन ट्रेसिंग सक्षम केले</translation> <translation id="5955304353782037793">अॅप</translation> <translation id="5958529069007801266">पर्यवेक्षित वापरकर्ता</translation> +<translation id="5959471481388474538">नेटवर्क उपलब्ध नाही</translation> <translation id="596035801491797438">चेहरा नियंत्रण बंद करा</translation> <translation id="5960410286721553511">तुमच्या फोनमधील अलीकडील फोटो आणि मीडिया पहा</translation> <translation id="5965524703725988602">गडद थीम टॉगल करा. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">अॅक्सेसिबिलिटी सेटिंग्ज दाखवा, "<ph name="ENABLED_FEATURES" />" सुरू केले आहे.</translation> <translation id="7946681191253332687">विस्तारित सुरक्षा अपडेट उपलब्ध आहेत</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> ला तुमचे <ph name="DEVICE_NAME" /> वापरायचे आहे</translation> +<translation id="7948239795436419268">विंडो रिस्टोअर करू नका</translation> <translation id="7951630946012935453">कीबोर्ड डिम करा</translation> <translation id="7953176344218790168">अप्परकेस</translation> <translation id="7953994493035617347">नवीन रेझोल्यूशन कन्फर्म करायचे आहे का?</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb index 995f572a..d8d83499 100644 --- a/ash/strings/ash_strings_ms.xtb +++ b/ash/strings/ash_strings_ms.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Paras kuasa bateri semasa <ph name="BATTERY_PERCENTAGE" />%, tinggal <ph name="TIME" /></translation> <translation id="1178581264944972037">Jeda</translation> <translation id="1179776263021875437">Berhenti memfokuskan pada tugasan</translation> +<translation id="1180117276105724040">Memulihkan tetingkap daripada sesi anda sebelum ini...</translation> <translation id="1181037720776840403">Alih keluar</translation> <translation id="1182225749592316782">Tindakan ini akan membenarkan akses kepada semua apl dan laman web dengan kebenaran kamera dan mikrofon</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Tukar sumber audio?</translation> <translation id="1505542291183484463">Tetingkap ubah saiz berjubin ke bawah</translation> <translation id="1510238584712386396">Pelancar</translation> +<translation id="1519090060276706457">Pemulihan tetingkap mengambil masa lebih lama daripada jangkaan</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Tunjukkan tetapan pemberitahuan. Pemberitahuan dimatikan untuk satu apl}other{Tunjukkan tetapan pemberitahuan. Pemberitahuan dimatikan untuk # apl}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">Bateri <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> sehingga penuh</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Beralih antara saiz tetingkap gambar dalam gambar maksimum atau semasa</translation> <translation id="1787955149152357925">Mati</translation> <translation id="1796561540704213354">Laman web termasuk halaman yang anda lawati dan halaman terbuka</translation> +<translation id="1799852120691957794">Tidak dapat memulihkan tetingkap daripada sesi anda sebelum ini</translation> <translation id="1805407494113167797">Tidak dapat memainkan Bunyi fokus</translation> <translation id="181103072419391116">Kekuatan Isyarat <ph name="SIGNAL_STRENGTH" />, Diurus oleh Pentadbir anda</translation> <translation id="1815039896005206046">Isyarat tidak menyukai akan menghantar maklum balas yang menunjukkan bahawa anda tidak menyukai kumpulan yang dicadangkan ini</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Ambil tangkapan skrin tetingkap</translation> <translation id="2598725286293895280">Apl tidak disokong dalam meja</translation> <translation id="2607678425161541573">Log masuk dalam talian diperlukan</translation> +<translation id="2611702650078660078">Ralat telah berlaku</translation> <translation id="2612072250312279703">pemantau aktiviti</translation> <translation id="261210853165551493">Salin dengan pemformatan</translation> <translation id="2612614436418177118">Alihkan apl ikon dalam grid apl</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Tekan kekunci enter untuk menangkap tangkapan skrin bagi skrin penuh</translation> <translation id="2849936225196189499">Kritikal</translation> <translation id="2850207700020959936">Apl dapat mengakses kamera</translation> +<translation id="2852045827873867442">Sambungan Internet diperlukan.</translation> <translation id="2860184359326882502">Padanan Terbaik</translation> <translation id="2865888419503095837">Maklumat rangkaian</translation> <translation id="2869095047958348710"><ph name="DAY_OF_WEEK" /> yang lalu</translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Kata laluan untuk <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">Google Assistant tidak tersedia dalam sesi tunjuk cara.</translation> +<translation id="4781633367688946589">Teruskan kepada sesi baharu</translation> <translation id="4785412405516449976">Hanya kenalan anda yang mempunyai Google Account</translation> <translation id="4789348252524569426">Tidak boleh memasang fail pertuturan. Peranti anda perlu dikemas kini. Mulakan semula peranti anda dan cuba lagi.</translation> <translation id="478959186716341421">Menghantar</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Penjejakan prestasi didayakan</translation> <translation id="5955304353782037793">apl</translation> <translation id="5958529069007801266">Pengguna diselia</translation> +<translation id="5959471481388474538">Rangkaian tak tersedia</translation> <translation id="596035801491797438">Matikan Kawalan wajah</translation> <translation id="5960410286721553511">Lihat foto dan media baru-baru ini pada telefon anda</translation> <translation id="5965524703725988602">Togol tema Gelap. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Memaparkan tetapan kebolehaksesan, "<ph name="ENABLED_FEATURES" />" didayakan.</translation> <translation id="7946681191253332687">Kemaskinian keselamatan lanjutan tersedia</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> mahu menggunakan <ph name="DEVICE_NAME" /> anda</translation> +<translation id="7948239795436419268">Jangan pulihkan tetingkap</translation> <translation id="7951630946012935453">Malapkan papan kekunci</translation> <translation id="7953176344218790168">HURUF BESAR</translation> <translation id="7953994493035617347">Sahkan peleraian baharu?</translation>
diff --git a/ash/strings/ash_strings_my.xtb b/ash/strings/ash_strings_my.xtb index 06978d9c..3d61dc0d 100644 --- a/ash/strings/ash_strings_my.xtb +++ b/ash/strings/ash_strings_my.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">လက်ရှိဘက်ထရီအဆင့် <ph name="BATTERY_PERCENTAGE" />%၊ <ph name="TIME" /> လို</translation> <translation id="1178581264944972037">ဆိုင်းငံ့ထားရန်</translation> <translation id="1179776263021875437">လုပ်ဆောင်စရာတွင် ပြနေခြင်းကို ရပ်ရန်</translation> +<translation id="1180117276105724040">သင်၏ ယခင်စက်ရှင်မှ ဝင်းဒိုးများ ပြန်ယူနေသည်…</translation> <translation id="1181037720776840403">ဖယ်ရှားရန်</translation> <translation id="1182225749592316782">၎င်းက ကင်မရာနှင့် မိုက်ခရိုဖုန်း ခွင့်ပြုချက်များပါသည့် အက်ပ်နှင့် ဝဘ်ဆိုက်အားလုံးကို သုံးခွင့်ပေးသည်</translation> <translation id="1182876754474670069">Home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">အသံရင်းမြစ်ကို ပြောင်းမလား။</translation> <translation id="1505542291183484463">လေးထောင့်ကွက်ဝင်းဒိုး၏ အောက်ဘက်တွင် အရွယ်ပြင်ရန်</translation> <translation id="1510238584712386396">Launcher</translation> +<translation id="1519090060276706457">ဝင်းဒိုးများ ပြန်ယူခြင်းသည် မျှော်မှန်းထားသည်ထက် ပိုကြာနေသည်</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{အကြောင်းကြားချက်ဆက်တင်များကို ပြရန်။ အက်ပ်တစ်ခုအတွက် အကြောင်းကြားချက်များကို ပိတ်ထားသည်}other{အကြောင်းကြားချက်ဆက်တင်များကို ပြရန်။ အက်ပ် # ခုအတွက် အကြောင်းကြားချက်များကို ပိတ်ထားသည်}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">ဘက်ထရီ <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> အကြာတွင် အားပြည့်မည်</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">နှစ်ခုထပ်၍ ကြည့်သည့် ဝင်းဒိုး၏ အကြီးဆုံး (သို့) လက်ရှိ အရွယ်အစားကြား ပြောင်းရန်</translation> <translation id="1787955149152357925">ပိတ်</translation> <translation id="1796561540704213354">သင်ဝင်ကြည့်ထားသော စာမျက်နှာများနှင့် ဖွင့်ထားသော စာမျက်နှာများ ပါဝင်သော ဝဘ်ဆိုက်များ</translation> +<translation id="1799852120691957794">ယခင်စက်ရှင်မှ ဝင်းဒိုးများကို ပြန်ယူ၍မရပါ</translation> <translation id="1805407494113167797">‘အာရုံစိုက်ခြင်း အသံ’ ဖွင့်၍မရလိုက်ပါ</translation> <translation id="181103072419391116">လိုင်းဆွဲအား <ph name="SIGNAL_STRENGTH" />၊ သင့် 'ကြီးကြပ်သူ' က စီမံထားပါသည်</translation> <translation id="1815039896005206046">လက်မအောက်စိုက်ခြင်းဖြင့် ဤအကြံပြုထားသည့်အုပ်စုကို သင်မကြိုက်ကြောင်း ပို့မည်</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">ဝင်းဒိုး မျက်နှာပြင်ပုံ ရိုက်ရန်</translation> <translation id="2598725286293895280">မျက်နှာပြင်ရှိ ပံ့ပိုးမထားသော အက်ပ်များ</translation> <translation id="2607678425161541573">အွန်လိုင်း လက်မှတ်ထိုးဝင်ခြင်း လိုအပ်သည်</translation> +<translation id="2611702650078660078">အမှားဖြစ်သွားသည်</translation> <translation id="2612072250312279703">လုပ်ဆောင်ချက် စောင့်ကြည့်စစ်ဆေးမှု</translation> <translation id="261210853165551493">ဖော်မက်လုပ်ခြင်းဖြင့် မိတ္တူကူးရန်</translation> <translation id="2612614436418177118">အက်ပ်သင်္ကေတတစ်ခုကို အက်ပ်ဇယားအတွင်းရွှေ့ရန်</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">စခရင်အပြည့် ဖန်သားပြင်ပုံ ရိုက်ကူးရန် Enter နှိပ်ပါ</translation> <translation id="2849936225196189499">အရေးကြီး</translation> <translation id="2850207700020959936">အက်ပ်များက ကင်မရာသုံးနိုင်သည်</translation> +<translation id="2852045827873867442">အင်တာနက်ချိတ်ဆက်မှု လိုအပ်သည်။</translation> <translation id="2860184359326882502">အနီးစပ်ဆုံး</translation> <translation id="2865888419503095837">ကွန်ရက် အချက်အလက်</translation> <translation id="2869095047958348710">ပြီးခဲ့သည့် <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" />အတွက် စကားဝှက်</translation> <translation id="4777825441726637019">Play စတိုး</translation> <translation id="4778095205580009397">သရုပ်ပြစက်ရှင်တွင် Google Assistant မရနိုင်ပါ။</translation> +<translation id="4781633367688946589">စက်ရှင်အသစ်သို့ ဆက်သွားရန်</translation> <translation id="4785412405516449976">Google Account ရှိသော သင့်အဆက်အသွယ်များသာ</translation> <translation id="4789348252524569426">စကားပြောဖိုင်များ ထည့်သွင်း၍မရပါ။ သင့်စက်ကို အပ်ဒိတ်လုပ်ရမည်။ သင့်စက်ကို ပြန်စပြီး ထပ်စမ်းကြည့်ပါ။</translation> <translation id="478959186716341421">ကာစ်တ်လုပ်ခြင်း</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">ဆောင်ရွက်ချက်များကို ခြေရာခံနေသည်။</translation> <translation id="5955304353782037793">အက်ပ်</translation> <translation id="5958529069007801266">ကြီးကြပ်မှုခံ အသုံးပြုသူ</translation> +<translation id="5959471481388474538">ကွန်ရက်ကို ရှာမရ</translation> <translation id="596035801491797438">အမူအရာဖြင့် ထိန်းချုပ်ခြင်းကို ပိတ်ရန်</translation> <translation id="5960410286721553511">သင့်ဖုန်းရှိ မကြာသေးမီက ဓာတ်ပုံနှင့် မီဒီယာများကို ကြည့်နိုင်သည်</translation> <translation id="5965524703725988602">အမှောင်နောက်ခံ ပြောင်းရန်။ <ph name="STATE_TEXT" />။</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">သုံးနိုင်မှု ဆက်တင်များ ပြရန်၊ “<ph name="ENABLED_FEATURES" />” ဖွင့်ထားသည်။</translation> <translation id="7946681191253332687">ထပ်တိုးထားသော လုံခြုံရေးအပ်ဒိတ်များ ရပါပြီ</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> က သင့် <ph name="DEVICE_NAME" /> ကို သုံးလိုပါသည်</translation> +<translation id="7948239795436419268">ဝင်းဒိုးများ ပြန်မယူပါနှင့်</translation> <translation id="7951630946012935453">keyboard အလင်းမှိန်ရန်</translation> <translation id="7953176344218790168">စာလုံးကြီး</translation> <translation id="7953994493035617347">ပုံရိပ်ပြတ်သားကိန်းအသစ် အတည်ပြုမလား။</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb index 56946bd..71c471c0 100644 --- a/ash/strings/ash_strings_ne.xtb +++ b/ash/strings/ash_strings_ne.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">अहिलेको ब्याट्रीको स्तर <ph name="BATTERY_PERCENTAGE" />% छ भने ब्याट्री फुल चार्ज हुन <ph name="TIME" /> लाग्छ</translation> <translation id="1178581264944972037">पज गर्नुहोस्</translation> <translation id="1179776263021875437">कार्यमा फोकस गर्न छाड्नुहोस्</translation> +<translation id="1180117276105724040">तपाईंको पछिल्लो सत्रबाट विन्डोहरू रिस्टोर गरिँदै छ...</translation> <translation id="1181037720776840403">हटाउनुहोस्</translation> <translation id="1182225749592316782">तपाईंले यसो गर्नुभयो भने क्यामेरा र माइक्रोफोन प्रयोग गर्ने अनुमति भएका सबै एप तथा वेबसाइटहरूलाई क्यामेरा र माइक्रोफोन प्रयोग गर्ने अनुमति दिन्छ</translation> <translation id="1182876754474670069">होम की</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">अडियोको स्रोत बदल्ने हो?</translation> <translation id="1505542291183484463">विन्डोको टाइलको आकार तलतिरबाट बदल्नुहोस्</translation> <translation id="1510238584712386396">लन्चर</translation> +<translation id="1519090060276706457">विन्डोहरू रिस्टोर गर्न अपेक्षा गरिएभन्दा बढी समय लागिरहेको छ</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{सूचनासम्बन्धी सेटिङहरू देखाउनुहोस्। एउटा एपका लागि सूचनाहरू निष्क्रिय छन्}other{सूचनासम्बन्धी सेटिङहरू देखाउनुहोस्। # एपका लागि सूचनाहरू निष्क्रिय छन्}}</translation> <translation id="1521655867290435174">Google पाना</translation> <translation id="1523032696246003"><ph name="BATTERY_PERCENTAGE" />% ब्याट्री बाँकी छ | पूरा चार्ज हुन <ph name="TIME" /> लाग्छ</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Picture-in-picture विन्डोको अधिकतम वा हालको आकारका बिचमा अदलबदल गर्नुहोस्</translation> <translation id="1787955149152357925">अफ छ</translation> <translation id="1796561540704213354">तपाईंले हेर्नुभएका पेज र हाल खोलिएका पेजलगायतका वेबसाइटहरू</translation> +<translation id="1799852120691957794">तपाईंको पछिल्लो सत्रका विन्डोहरू रिस्टोर गर्न सकिएन</translation> <translation id="1805407494113167797">फोकस साउन्डहरू प्ले गर्न सकिएन</translation> <translation id="181103072419391116">सिग्नलको क्षमता <ph name="SIGNAL_STRENGTH" />, तपाईंका प्रशासकले व्यवस्थित गर्नुभएको छ</translation> <translation id="1815039896005206046">तपाईंले थम्ज डाउन बटनमा क्लिक गर्नुभयो भने तपाईंलाई सुझाइएको यो समूह मन परेन भन्ने अर्थ लाग्छ</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">विन्डोको स्क्रिनसट लिनुहोस्</translation> <translation id="2598725286293895280">यो डेस्कमा प्रयोग गर्न नमिल्ने एपहरू छन्</translation> <translation id="2607678425161541573">अनलाइन मार्फत साइन इन गर्नु पर्ने हुन्छ</translation> +<translation id="2611702650078660078">कुनै त्रुटि भयो</translation> <translation id="2612072250312279703">एक्टिभिटी मनिटर</translation> <translation id="261210853165551493">फर्म्याटिङसहित कपी गर्नुहोस्</translation> <translation id="2612614436418177118">एप ग्रिडभित्र कुनै एपको आइकन सार्नुहोस्</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">पूरै स्क्रिनको स्क्रिनसट खिच्न इन्टर थिच्नुहोस्</translation> <translation id="2849936225196189499">नाजुक</translation> <translation id="2850207700020959936">एपहरूले क्यामेरा एक्सेस गर्न सक्छन्</translation> +<translation id="2852045827873867442">इन्टरनेट कनेक्सन चाहिन्छ।</translation> <translation id="2860184359326882502">सबैभन्दा मिल्दोजुल्दो</translation> <translation id="2865888419503095837">नेटवर्क सम्बन्धी जानकारी</translation> <translation id="2869095047958348710">गएको <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> को लागि लागि पासवर्ड</translation> <translation id="4777825441726637019">Play स्टोर</translation> <translation id="4778095205580009397">Google सहायक डेमो सत्रमा उपलब्ध छैन।</translation> +<translation id="4781633367688946589">नयाँ सत्रमा जारी राख्नुहोस्</translation> <translation id="4785412405516449976">Google खाता भएका तपाईंका कन्ट्याक्टहरू मात्र</translation> <translation id="4789348252524569426">वाक् पहिचानसम्बन्धी फाइलहरू इन्स्टल गर्न सकिएन। तपाईंको डिभाइस अपडेट गर्नु पर्ने हुन्छ। आफ्नो डिभाइस रिस्टार्ट गर्नुहोस् र फेरि प्रयास गर्नुहोस्।</translation> <translation id="478959186716341421">Cast गर्दै</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">प्रदर्शन ट्रेसिङ सक्षम गरियो</translation> <translation id="5955304353782037793">एप</translation> <translation id="5958529069007801266">सुपरिवेक्षित प्रयोगकर्ता</translation> +<translation id="5959471481388474538">नेटवर्क उपलब्ध छैन</translation> <translation id="596035801491797438">फेस कन्ट्रोल अफ गर्नुहोस्</translation> <translation id="5960410286721553511">आफ्नो फोनका हालसालैका फोटो तथा मिडिया हेर्नुहोस्</translation> <translation id="5965524703725988602">अँध्यारो थिम टगल गर्नुहोस्। <ph name="STATE_TEXT" />।</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">एक्सेसिबिलिटी सेटिङ देखाउनुहोस्, "<ph name="ENABLED_FEATURES" />" अन गरिएको छ।</translation> <translation id="7946681191253332687">"सुरक्षासम्बन्धी विस्तारित अपडेट" उपलब्ध छ</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> ले <ph name="DEVICE_NAME" /> प्रयोग गर्ने अनुमति माग्दै छ</translation> +<translation id="7948239795436419268">विन्डोहरू रिस्टोर नगर्नुहोस्</translation> <translation id="7951630946012935453">किबोर्डको चमक घटाउनुहोस्</translation> <translation id="7953176344218790168">अपरकेस</translation> <translation id="7953994493035617347">नयाँ रिजोल्युसन पुष्टि गर्ने हो?</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb index 112a536..da4a8e3 100644 --- a/ash/strings/ash_strings_nl.xtb +++ b/ash/strings/ash_strings_nl.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Huidig batterijniveau <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> resterend</translation> <translation id="1178581264944972037">Onderbreken</translation> <translation id="1179776263021875437">Focussen op taak stoppen</translation> +<translation id="1180117276105724040">Vensters van je vorige sessie herstellen...</translation> <translation id="1181037720776840403">Verwijderen</translation> <translation id="1182225749592316782">Hiermee geef je toegang aan alle apps en websites met camera- en microfoonrechten</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Audiobron wisselen?</translation> <translation id="1505542291183484463">Venster met tegels voor formaat aanpassen naar beneden verplaatsen</translation> <translation id="1510238584712386396">Launcher</translation> +<translation id="1519090060276706457">Het herstellen van vensters duurt langer dan verwacht</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Instellingen voor meldingen tonen. Meldingen staan uit voor een app}other{Instellingen voor meldingen tonen. Meldingen staan uit voor # apps}}</translation> <translation id="1521655867290435174">Google Spreadsheets</translation> <translation id="1523032696246003">Batterij: <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> tot vol</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Schakelen tussen het maximale of huidige formaat van het scherm-in-scherm-venster</translation> <translation id="1787955149152357925">Uit</translation> <translation id="1796561540704213354">Websites, waaronder pagina's die je hebt bezocht en geopende pagina's</translation> +<translation id="1799852120691957794">Kan vensters van je vorige sessie niet herstellen</translation> <translation id="1805407494113167797">Kan Focusgeluiden niet afspelen</translation> <translation id="181103072419391116">Signaalsterkte <ph name="SIGNAL_STRENGTH" />, beheerd door je beheerder</translation> <translation id="1815039896005206046">Met Niet leuk stuur je feedback dat je deze voorgestelde groep niet leuk vindt</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Een screenshot van het venster maken</translation> <translation id="2598725286293895280">Niet-ondersteunde apps in bureau</translation> <translation id="2607678425161541573">Online inloggen vereist</translation> +<translation id="2611702650078660078">Er is een fout opgetreden</translation> <translation id="2612072250312279703">activiteitsmonitor</translation> <translation id="261210853165551493">Kopiëren met opmaak</translation> <translation id="2612614436418177118">Een app-icoon verplaatsen binnen het app-raster</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Druk op Enter om een screenshot van het volledige scherm te maken</translation> <translation id="2849936225196189499">Kritiek</translation> <translation id="2850207700020959936">Apps hebben toegang tot de camera</translation> +<translation id="2852045827873867442">Internetverbinding vereist.</translation> <translation id="2860184359326882502">Beste resultaat</translation> <translation id="2865888419503095837">Netwerkinfo</translation> <translation id="2869095047958348710">Afgelopen <ph name="DAY_OF_WEEK" /></translation> @@ -745,7 +750,7 @@ <translation id="3409584356742878290">Developer Tools-inspector tonen of verbergen</translation> <translation id="3410336247007142655">Instellingen voor donker thema bekijken</translation> <translation id="3413817803639110246">Er is nog niets te zien</translation> -<translation id="3417835166382867856">Tabbladen doorzoeken</translation> +<translation id="3417835166382867856">Tabbladen zoeken</translation> <translation id="3426253816581969877">Houd <ph name="MODIFIER_1" /> + <ph name="MODIFIER_2" /> ingedrukt en tik op <ph name="KEY" /> totdat het venster verschijnt dat je wilt openen. Laat de toetsen dan los.</translation> <translation id="3428447136709161042">Verbinding met <ph name="NETWORK_NAME" /> verbreken</translation> <translation id="3430396595145920809">Swipe vanaf de rechterkant om terug te gaan</translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Wachtwoord voor <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">De Google Assistent is niet beschikbaar in een demosessie.</translation> +<translation id="4781633367688946589">Doorgaan naar nieuwe sessie</translation> <translation id="4785412405516449976">Alleen je contacten met een Google-account</translation> <translation id="4789348252524569426">Kan spraakbestanden niet installeren. Je apparaat moet worden geüpdatet. Start het apparaat opnieuw op en probeer het nogmaals.</translation> <translation id="478959186716341421">Casten</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Bijhouden van prestaties staat aan</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Gelimiteerde gebruiker</translation> +<translation id="5959471481388474538">Netwerk niet beschikbaar</translation> <translation id="596035801491797438">Gezichtsbediening uitzetten</translation> <translation id="5960410286721553511">Recente foto's en media van je telefoon bekijken</translation> <translation id="5965524703725988602">Donker thema aan- of uitzetten. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Toegankelijkheidsinstellingen tonen, '<ph name="ENABLED_FEATURES" />' aangezet.</translation> <translation id="7946681191253332687">Uitgebreide beveiligingsupdates beschikbaar</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> wil je <ph name="DEVICE_NAME" /> gebruiken</translation> +<translation id="7948239795436419268">Vensters niet herstellen</translation> <translation id="7951630946012935453">Toetsenbord dimmen</translation> <translation id="7953176344218790168">HOOFDLETTERS</translation> <translation id="7953994493035617347">Nieuwe resolutie bevestigen?</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index fee72a4d..a8476d2 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb
@@ -21,6 +21,11 @@ <translation id="1059120031266247284">Delt med deg</translation> <translation id="1060847216467038176"><ph name="ITEM_LABEL" /> med fjern-knapp</translation> <translation id="1062407476771304334">Erstatt</translation> +<translation id="1065931689816135472"><ph name="BEGIN_PARAGRAPH1" />Sikkerhetskopier til Google Disk. Gjenopprett dataene dine enkelt eller bytt enhet når som helst. Sikkerhetskopien din inkluderer appdata.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Sikkerhetskopiene dine lastes opp til Google og krypteres med passordet for Google-kontoen din.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />Appdata kan være alle slags data som er lagret i en app (basert på utviklerinnstillingene), inkludert data som kontakter, meldinger og bilder.<ph name="END_PARAGRAPH3" /> + <ph name="BEGIN_PARAGRAPH4" />De sikkerhetskopierte dataene teller ikke med i Disk-lagringskvoten din.<ph name="END_PARAGRAPH4" /> + <ph name="BEGIN_PARAGRAPH5" />Du kan slå av denne tjenesten i Innstillinger.<ph name="END_PARAGRAPH5" /></translation> <translation id="1073899992769346247">Bytt eller lad batteriet</translation> <translation id="1081015718268701546">Linux-apper støttes ikke for øyeblikket. Andre apper blir lagret.</translation> <translation id="108486256082349153">Mobil: <ph name="ADDRESS" /></translation> @@ -52,6 +57,7 @@ <translation id="1175944128323889279">Nåværende batterinivå: <ph name="BATTERY_PERCENTAGE" /> %. <ph name="TIME" /> igjen</translation> <translation id="1178581264944972037">Stans midlertidig</translation> <translation id="1179776263021875437">Slutt å fokusere på gjøremålet</translation> +<translation id="1180117276105724040">Gjenoppretter vinduer fra forrige økt …</translation> <translation id="1181037720776840403">Fjern</translation> <translation id="1182225749592316782">Dette gir tilgang til alle apper og nettsteder som har kamera- og mikrofontillatelsen</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +172,7 @@ <translation id="1501946871587957338">Vil du bytte lydkilde?</translation> <translation id="1505542291183484463">Endre vindusstørrelse feltvis nedover</translation> <translation id="1510238584712386396">Appoversikt</translation> +<translation id="1519090060276706457">Det tar lengre tid enn forventet å gjenopprette vinduer</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Vis innstillinger for varsler. Varsler er slått av for en app}other{Vis innstillinger for varsler. Varsler er slått av for # apper}}</translation> <translation id="1521655867290435174">Google Regneark</translation> <translation id="1523032696246003">Batteri <ph name="BATTERY_PERCENTAGE" /> % | <ph name="TIME" /> til batteriet er fullt</translation> @@ -260,6 +267,7 @@ <translation id="1786487376942610288">Bytt mellom maksimal og gjeldende størrelse på bilde-i-bilde-vinduet</translation> <translation id="1787955149152357925">Av</translation> <translation id="1796561540704213354">Nettsteder, inkludert sider du har besøkt, og åpne sider</translation> +<translation id="1799852120691957794">Kan ikke gjenopprette vinduer fra forrige økt</translation> <translation id="1805407494113167797">Kunne ikke spille av fokuslyder</translation> <translation id="181103072419391116">Signalstyrke <ph name="SIGNAL_STRENGTH" /> – administreres av administratoren din</translation> <translation id="1815039896005206046">Tommel ned sender tilbakemelding om at du ikke liker denne foreslåtte gruppen</translation> @@ -491,6 +499,7 @@ <translation id="2596078834055697711">Ta et skjermbilde av vinduet</translation> <translation id="2598725286293895280">Skrivebordet inneholder apper som ikke støttes</translation> <translation id="2607678425161541573">Nettbasert pålogging kreves</translation> +<translation id="2611702650078660078">Det oppstod en feil:</translation> <translation id="2612072250312279703">aktivitetsmåler</translation> <translation id="261210853165551493">Kopier med formatering</translation> <translation id="2612614436418177118">Flytt et appikon i apprutenettet</translation> @@ -575,6 +584,7 @@ <translation id="2848120746144143659">Trykk på Enter for å ta et skjermbilde av hele skjermen</translation> <translation id="2849936225196189499">Kritisk</translation> <translation id="2850207700020959936">Apper har tilgang til kameraet</translation> +<translation id="2852045827873867442">Internettilkobling er nødvendig.</translation> <translation id="2860184359326882502">Beste treff</translation> <translation id="2865888419503095837">Nettverksinformasjon</translation> <translation id="2869095047958348710">Forrige <ph name="DAY_OF_WEEK" /></translation> @@ -769,6 +779,10 @@ <translation id="3470502288861289375">Kopierer ...</translation> <translation id="347117769229524881"><ph name="MODIFIER_ONE" /><ph name="MODIFIER_TWO" /><ph name="KEY_ONE" />, deretter <ph name="KEY_TWO" /> eller <ph name="KEY_THREE" /></translation> <translation id="3477079411857374384">Ctrl+Shift+Mellomrom</translation> +<translation id="3484174798079475132"><ph name="BEGIN_PARAGRAPH1" />Når Posisjonsnøyaktighet er på, brukes informasjon om trådløse signaler, for eksempel fra wifi-tilgangspunkter og mobilmaster, sammen med sensordata fra enheten, for eksempel fra akselerometeret og gyroskopet, for å anslå en mer nøyaktig enhetsposisjon. Android-apper og -tjenester bruker denne for å levere posisjonsbaserte funksjoner. For å gjøre dette samler Google jevnlig inn informasjon om enhetssensorer og trådløse signaler i nærheten av deg for å bidra til crowdsourcing av posisjonene til trådløse signaler.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Google bruker denne informasjonen uten å identifisere deg for å forbedre posisjonsnøyaktigheten og posisjonsbaserte tjenester og generelt forbedre, levere og vedlikeholde Googles tjenester. Vi behandler denne informasjonen basert på Googles og tredjeparters berettigede interesser i å oppfylle brukernes behov.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />Du kan når som helst slå av Posisjonsnøyaktighet i posisjonsinnstillingene for enheten din under Innstillinger > Personvern og sikkerhet > Personverninnstillinger > Posisjonstilgang > Avanserte posisjonsinnstillinger. Hvis Posisjonsnøyaktighet er slått av, blir det ikke samlet inn data om posisjonsnøyaktighet. For Android-apper og -tjenester brukes bare IP-adressen (hvis den er tilgjengelig) for å fastslå posisjonen til enheten din, noe som kan påvirke tilgjengeligheten og nøyaktigheten til posisjoner for Android-apper og -tjenester, for eksempel Google Maps.<ph name="END_PARAGRAPH3" /> + <ph name="BEGIN_PARAGRAPH4" /><ph name="LINK_BEGIN" />Finn ut mer om Posisjonsnøyaktighet<ph name="LINK_END" /><ph name="END_PARAGRAPH4" /></translation> <translation id="3485319357743610354"><ph name="SECURITY_STATUS" /> – <ph name="CONNECTION_STATUS" /> – signalstyrke <ph name="SIGNAL_STRENGTH" /></translation> <translation id="348799646910989694">Hyllen skjules automatisk</translation> <translation id="3496797737329654668">La oss spille</translation> @@ -873,6 +887,9 @@ <translation id="3742055079367172538">Skjermbilde tatt</translation> <translation id="3743775386021959186">Fokus er på. <ph name="REMAINING_TIME" /> gjenstår</translation> <translation id="3750403286520637847">Skjul værforslag</translation> +<translation id="3755239467337474637"><ph name="BEGIN_PARAGRAPH1" />Appdata kan være alle slags data som er lagret i en app (basert på utviklerinnstillingene), inkludert data som kontakter, meldinger og bilder.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />De sikkerhetskopierte dataene teller ikke med i Disk-lagringskvoten til barnet ditt.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />Du kan slå av denne tjenesten i Innstillinger.<ph name="END_PARAGRAPH3" /></translation> <translation id="3756485814916578707">Caster skjermen</translation> <translation id="3765841382945324995"><ph name="SIX_PACK_KEY_NAME" />-hurtigtasten er endret til <ph name="NEW_SHORTCUT" /> fra <ph name="OLD_SHORTCUT" /></translation> <translation id="3765841986579723851">Redigert i dag</translation> @@ -1215,6 +1232,7 @@ <translation id="4776917500594043016">Passord for <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Butikk</translation> <translation id="4778095205580009397">Google-assistenten er ikke tilgjengelig under demonstrasjonsøkter.</translation> +<translation id="4781633367688946589">Fortsett til en ny økt</translation> <translation id="4785412405516449976">Bare kontaktene dine med Google-konto</translation> <translation id="4789348252524569426">Kan ikke installere talefiler. Enheten må oppdateres. Start enheten på nytt, og prøv igjen.</translation> <translation id="478959186716341421">Caster</translation> @@ -1338,6 +1356,10 @@ <translation id="5147567197700016471">Ulåst</translation> <translation id="5150070631291639005">Personverninnstillinger</translation> <translation id="5155897006997040331">Lesehastighet</translation> +<translation id="5161445389876829235"><ph name="BEGIN_PARAGRAPH1" />Dette er generell informasjon om enheten din og hvordan du bruker den (for eksempel batterinivå, system- og appaktivitet og feil). Dataene brukes til å gjøre Android bedre, og noe samlet informasjon hjelper også Google-apper og -partnere, for eksempel Android-utviklere, med å gjøre apper og produkter bedre.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Enhetens evne til å sende informasjonen som kreves for nødvendige tjenester, for eksempel systemoppdateringer og sikkerhet, påvirkes ikke hvis du slår av denne funksjonen.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />Eieren kan styre denne funksjonen under Innstillinger > Avansert > Send diagnostikk og bruksdata til Google automatisk.<ph name="END_PARAGRAPH3" /> + <ph name="BEGIN_PARAGRAPH4" />Hvis du har slått på innstillingen for annen nett- og appaktivitet, kan disse dataene bli lagret i Google-kontoen din. Du kan se og slette dataene dine samt endre kontoinnstillingene dine på account.google.com.<ph name="END_PARAGRAPH4" /></translation> <translation id="5163434717504750796">Batteritilstand <ph name="BATTERY_HEALTH_PERCENTAGE" /> % | Syklusantall <ph name="CYCLE_COUNT" /></translation> <translation id="5166007464919321363">Lagre skrivebordet som en mal</translation> <translation id="5168181903108465623">Cast-enheter er tilgjengelige</translation> @@ -1596,6 +1618,10 @@ <translation id="5916646100036936191">Nytt varsel, <ph name="NOTIFICATION_COUNT" /> totalt</translation> <translation id="5916664084637901428">På</translation> <translation id="5920710855273935292">Lyden for mikrofonen er kuttet.</translation> +<translation id="5923808736819114609"><ph name="BEGIN_PARAGRAPH1" />Når Posisjonsnøyaktighet er på, brukes informasjon om trådløse signaler, for eksempel fra wifi-tilgangspunkter og mobilmaster, sammen med sensordata fra enheten, for eksempel fra akselerometeret og gyroskopet, for å anslå en mer nøyaktig enhetsposisjon. Android-apper og -tjenester bruker denne for å levere posisjonsbaserte funksjoner. For å gjøre dette samler Google jevnlig inn informasjon om enhetssensorer og trådløse signaler i nærheten av denne enheten for å bidra til crowdsourcing av posisjonene til trådløse signaler.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Google bruker denne informasjonen som er samlet inn fra denne enheten, til å forbedre posisjonsnøyaktigheten og posisjonsbaserte tjenester og generelt forbedre, levere og vedlikeholde Googles tjenester. Vi behandler denne informasjonen basert på Googles og tredjeparters berettigede interesser i å oppfylle brukernes behov. Denne informasjonen brukes ikke til å identifisere enkeltpersoner.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />Du kan når som helst slå av Posisjonsnøyaktighet i posisjonsinnstillingene for denne enheten under Innstillinger > Personvern og sikkerhet > Personverninnstillinger > Posisjonstilgang > Avanserte posisjonsinnstillinger. Hvis Posisjonsnøyaktighet er slått av, blir det ikke samlet inn data om posisjonsnøyaktighet. For Android-apper og -tjenester brukes bare IP-adressen (hvis den er tilgjengelig) for å fastslå posisjonen til denne enheten, noe som kan påvirke tilgjengeligheten og nøyaktigheten til posisjoner for Android-apper og -tjenester, for eksempel Google Maps.<ph name="END_PARAGRAPH3" /> + <ph name="BEGIN_PARAGRAPH4" /><ph name="LINK_BEGIN" />Finn ut mer om Posisjonsnøyaktighet<ph name="LINK_END" /><ph name="END_PARAGRAPH4" /></translation> <translation id="5928083197428724029">Oppdatering kreves av <ph name="MANAGER" /></translation> <translation id="5939518447894949180">Tilbakestill</translation> <translation id="5946788582095584774"><ph name="FEATURE_NAME" /> er på.</translation> @@ -1603,6 +1629,7 @@ <translation id="595202126637698455">Ytelsessporing er aktivert</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Administrert bruker</translation> +<translation id="5959471481388474538">Nettverket er utilgjengelig</translation> <translation id="596035801491797438">Slå av ansiktskontroll</translation> <translation id="5960410286721553511">Se nylige bilder og medier fra telefonen din</translation> <translation id="5965524703725988602">Slå av/på mørkt tema. <ph name="STATE_TEXT" />.</translation> @@ -1641,6 +1668,10 @@ <translation id="6045629311476491587">Brukt av <ph name="APP_COUNT" /> apper</translation> <translation id="6045998054441862242">Slå på høykontrastmodus</translation> <translation id="6047696787498798094">Skjermdelingen stopper hvis du bytter til en annen bruker.</translation> +<translation id="6051212890006277572"><ph name="BEGIN_PARAGRAPH1" />Dette er generell informasjon om denne enheten og hvordan den brukes (for eksempel batterinivå, system- og appaktivitet og feil). Dataene brukes til å gjøre Android bedre, og noe samlet informasjon hjelper også Google-apper og -partnere, for eksempel Android-utviklere, med å gjøre apper og produkter bedre.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Enhetens evne til å sende informasjonen som kreves for nødvendige tjenester, for eksempel systemoppdateringer og sikkerhet, påvirkes ikke hvis du slår av denne funksjonen.<ph name="END_PARAGRAPH2" /> + <ph name="BEGIN_PARAGRAPH3" />Eieren kan styre denne funksjonen under Innstillinger > Avansert > Send diagnostikk og bruksdata til Google automatisk.<ph name="END_PARAGRAPH3" /> + <ph name="BEGIN_PARAGRAPH4" />Hvis du har slått på innstillingen for annen nett- og appaktivitet for barnet ditt, kan disse dataene bli lagret i barnets Google-konto. Finn ut mer om disse innstillingene og hvordan du endrer dem, på families.google.com.<ph name="END_PARAGRAPH4" /></translation> <translation id="6052614013050385269">Høyreklikk på en link</translation> <translation id="6054305421211936131">Logg på med smartkort</translation> <translation id="6059276912018042191">Nylige Chrome-faner</translation> @@ -1749,6 +1780,8 @@ <translation id="639644700271529076">CAPS LOCK er av</translation> <translation id="6406458002328242616">Endre nedtellingen. <ph name="FOCUS_DURATION" />.</translation> <translation id="6406704438230478924">alt gr</translation> +<translation id="6407887725738521027"><ph name="BEGIN_PARAGRAPH1" />Googles posisjonstjeneste bruker kilder som Wi-Fi, mobilnettverk og sensorer til å estimere posisjonen til enheten din.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Du kan slå av Posisjon ved å slå av enhetens hovedinnstilling for Posisjon. Du kan også slå av bruken av Wi-Fi, mobilnettverk og sensorer for posisjon i posisjonsinnstillingene.<ph name="END_PARAGRAPH2" /></translation> <translation id="6414618057231176439">Velg hvilken versjon av <ph name="VM_NAME" /> du vil installere.</translation> <translation id="641469293210305670">Installer oppdateringer og apper</translation> <translation id="6417265370957905582">Google Assistent</translation> @@ -2252,6 +2285,7 @@ <translation id="7945357288295809525">Vis tilgjengelighetsinnstillinger. «<ph name="ENABLED_FEATURES" />» er aktivert.</translation> <translation id="7946681191253332687">Du har forlenget tilgang til sikkerhetsoppdateringer</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> vil bruke <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Ikke gjenopprett vinduer</translation> <translation id="7951630946012935453">Gjør tastaturet mørkere</translation> <translation id="7953176344218790168">STORE BOKSTAVER</translation> <translation id="7953994493035617347">Vil du bekrefte den nye oppløsningen?</translation> @@ -2413,6 +2447,8 @@ <translation id="8481187309597259238">Bekreft USB-tillatelse</translation> <translation id="8487660088084188539">Når du slår på disse funksjonene, kan inndatateksten, dokumentinnholdet og nettadressen til nettsiden bli sendt til Googles tjenere. Denne informasjonen brukes til å generere skriveforslag, generere sammendrag, svare på spørsmål og forbedre produktet, i henhold til <ph name="LINK_TO_SERVICE_TERMS" />. Ikke ta med noe som er personlig, sensitivt eller konfidensielt.</translation> <translation id="8487699605742506766">Wifi-sone</translation> +<translation id="8488561391784577756"><ph name="BEGIN_PARAGRAPH1" />Googles posisjonstjeneste bruker kilder som Wi-Fi, mobilnettverk og sensorer til å estimere posisjonen til enheten.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Du kan slå av Posisjon ved å slå av enhetens hovedinnstilling for Posisjon. Du kan også slå av bruken av Wi-Fi, mobilnettverk og sensorer for posisjon i posisjonsinnstillingene.<ph name="END_PARAGRAPH2" /></translation> <translation id="8490896350101740396">Kioskappene «<ph name="UPDATED_APPS" />» er oppdatert. Start opp enheten på nytt for å fullføre oppdateringsprosessen.</translation> <translation id="8491237443345908933">Åpne link i en ny fane</translation> <translation id="8492573885090281069"><ph name="DISPLAY_NAME" /> støtter ikke <ph name="SPECIFIED_RESOLUTION" />. Oppløsningen ble endret til <ph name="FALLBACK_RESOLUTION" />. Klikk på bekreft for å beholde endringene. De forrige innstillingene blir gjenopprettet om <ph name="TIMEOUT_SECONDS" />.</translation>
diff --git a/ash/strings/ash_strings_or.xtb b/ash/strings/ash_strings_or.xtb index 3f40746..563e2422 100644 --- a/ash/strings/ash_strings_or.xtb +++ b/ash/strings/ash_strings_or.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">ବର୍ତ୍ତମାନର ବେଟେରୀ ଲେଭେଲ <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> ବାକି ଅଛି</translation> <translation id="1178581264944972037">ବିରତି</translation> <translation id="1179776263021875437">ଟାସ୍କ ଉପରେ ଫୋକସ କରିବା ବନ୍ଦ କରନ୍ତୁ</translation> +<translation id="1180117276105724040">ଆପଣଙ୍କ ପୂର୍ବ ସେସନରୁ ୱିଣ୍ଡୋଗୁଡ଼ିକୁ ରିଷ୍ଟୋର କରାଯାଉଛି…</translation> <translation id="1181037720776840403">କାଢ଼ି ଦିଅନ୍ତୁ</translation> <translation id="1182225749592316782">ଏହା କେମେରା ଏବଂ ମାଇକ୍ରୋଫୋନ ଅନୁମତି ଥିବା ସମସ୍ତ ଆପ୍ସ ଓ ୱେବସାଇଟ ପାଇଁ ଆକ୍ସେସକୁ ଅନୁମତି ଦିଏ</translation> <translation id="1182876754474670069">ହୋମ</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">ଅଡିଓ ସୋର୍ସ ସୁଇଚ କରିବେ?</translation> <translation id="1505542291183484463">ଟାଇଲ ଥିବା ୱିଣ୍ଡୋକୁ ତଳ ଆଡ଼କୁ ରିସାଇଜ କରନ୍ତୁ</translation> <translation id="1510238584712386396">ଲଞ୍ଚର୍</translation> +<translation id="1519090060276706457">ୱିଣ୍ଡୋଗୁଡ଼ିକୁ ରିଷ୍ଟୋର କରିବା ପାଇଁ ଆଶା କରାଯାଉଥିବା ସମୟଠାରୁ ଅଧିକ ସମୟ ଲାଗୁଛି</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{ବିଜ୍ଞପ୍ତି ସେଟିଂସ୍ ଦେଖାନ୍ତୁ। ଗୋଟିଏ ଆପ୍ ପାଇଁ ବିଜ୍ଞପ୍ତି ବନ୍ଦ ଅଛି}other{ବିଜ୍ଞପ୍ତି ସେଟିଂସ୍ ଦେଖାନ୍ତୁ। #ଟି ଆପ୍ ପାଇଁ ବିଜ୍ଞପ୍ତି ବନ୍ଦ ଅଛି}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">ବେଟେରୀ <ph name="BATTERY_PERCENTAGE" />% | ପୂର୍ଣ୍ଣ ହେବା ପାଇଁ <ph name="TIME" /></translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">ପିକଚର-ଇନ-ପିକଚର ୱିଣ୍ଡୋର ସର୍ବାଧିକ କିମ୍ବା ବର୍ତ୍ତମାନର ସାଇଜ ମଧ୍ଯରେ ସୁଇଚ କରନ୍ତୁ</translation> <translation id="1787955149152357925">ବନ୍ଦ ଅଛି</translation> <translation id="1796561540704213354">ଆପଣ ଭିଜିଟ କରିଥିବା ପୃଷ୍ଠା ଏବଂ ଖୋଲା ଥିବା ପୃଷ୍ଠା ସମେତ ୱେବସାଇଟଗୁଡ଼ିକ</translation> +<translation id="1799852120691957794">ଆପଣଙ୍କ ପୂର୍ବ ସେସନରୁ ୱିଣ୍ଡୋଗୁଡ଼ିକୁ ରିଷ୍ଟୋର କରାଯାଇପାରିବ ନାହିଁ</translation> <translation id="1805407494113167797">ଫୋକସ ସାଉଣ୍ଡ ପ୍ଲେ କରାଯାଇପାରିଲା ନାହିଁ</translation> <translation id="181103072419391116">ସିଗ୍ନାଲ୍ର କ୍ଷମତା <ph name="SIGNAL_STRENGTH" />, ଆପଣଙ୍କର ଆଡ୍ମିନିଷ୍ଟ୍ରେଟର୍ଙ୍କ ଦ୍ୱାରା ପରିଚାଳିତ</translation> <translation id="1815039896005206046">ଆପଣ ଏହି ପ୍ରସ୍ତାବିତ ଗୋଷ୍ଠୀକୁ ନାପସନ୍ଦ କରନ୍ତି ବୋଲି ଥମ୍ବସ ଡାଉନ ମତାମତ ଦାଖଲ କରିବ</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">ୱିଣ୍ଡୋ ସ୍କ୍ରିନ୍ସଟ୍ ନିଅନ୍ତୁ</translation> <translation id="2598725286293895280">ଡେସ୍କରେ ଅସମର୍ଥିତ ଆପ୍ସ ଅଛି</translation> <translation id="2607678425161541573">ଅନଲାଇନ୍ ସାଇନ୍ ଇନ୍ କରିବା ଆବଶ୍ୟକ</translation> +<translation id="2611702650078660078">ଏକ ତ୍ରୁଟି ହୋଇଛି</translation> <translation id="2612072250312279703">କାର୍ଯ୍ୟକଳାପ ମନିଟର</translation> <translation id="261210853165551493">ଫର୍ମାଟିଂ ସହ କପି କରନ୍ତୁ</translation> <translation id="2612614436418177118">ଆପ ଗ୍ରିଡ ମଧ୍ୟରେ ଥିବା ଏକ ଆପ ଆଇକନକୁ ମୁଭ କରନ୍ତୁ</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ ସ୍କ୍ରିନସଟ କ୍ୟାପଚର କରିବା ପାଇଁ Enter ଦବାନ୍ତୁ</translation> <translation id="2849936225196189499">ଜଟିଳ</translation> <translation id="2850207700020959936">ଆପ୍ସ କେମେରାକୁ ଆକ୍ସେସ କରିପାରିବ</translation> +<translation id="2852045827873867442">ଇଣ୍ଟର୍ନେଟ କନେକ୍ସନ ଆବଶ୍ୟକ।</translation> <translation id="2860184359326882502">ସର୍ବୋତ୍ତମ ମେଳ</translation> <translation id="2865888419503095837">ନେଟ୍ୱାର୍କ ସୂଚନା</translation> <translation id="2869095047958348710">ଗତ <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" />ଙ୍କ ପାଇଁ ପାସ୍ୱାର୍ଡ</translation> <translation id="4777825441726637019">Play ଷ୍ଟୋର୍</translation> <translation id="4778095205580009397">ଏକ ଡେମୋ ସମୟ ଅବଧିରେ Google ଆସିଷ୍ଟାଣ୍ଟ ଉପଲବ୍ଧ ନାହିଁ।</translation> +<translation id="4781633367688946589">ନୂଆ ସେସନରେ ଜାରି ରଖନ୍ତୁ</translation> <translation id="4785412405516449976">କେବଳ ଏକ Google ଆକାଉଣ୍ଟ ଥିବା ଆପଣଙ୍କ କଣ୍ଟାକ୍ଟ</translation> <translation id="4789348252524569426">ସ୍ପିଚ ଫାଇଲଗୁଡ଼ିକୁ ଇନଷ୍ଟଲ କରାଯାଇପାରିବ ନାହିଁ। ଆପଣଙ୍କ ଡିଭାଇସକୁ ଅପଡେଟ କରାଯିବ ଆବଶ୍ୟକ। ଆପଣଙ୍କ ଡିଭାଇସକୁ ରିଷ୍ଟାର୍ଟ କରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="478959186716341421">କାଷ୍ଟ କରାଯାଉଛି</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">କାର୍ଯ୍ୟଦକ୍ଷତା ଟ୍ରେସିଂ ସକ୍ଷମ କରାଯାଇଛି</translation> <translation id="5955304353782037793">ଆପ୍</translation> <translation id="5958529069007801266">ନିରୀକ୍ଷିତ ୟୁଜର</translation> +<translation id="5959471481388474538">ନେଟ୍ୱାର୍କ ଉପଲବ୍ଧ ନାହିଁ</translation> <translation id="596035801491797438">ଫେସ ନିୟନ୍ତ୍ରଣ ବନ୍ଦ କରନ୍ତୁ</translation> <translation id="5960410286721553511">ଆପଣଙ୍କ ଫୋନରେ ଥିବା ବର୍ତ୍ତମାନର ଫଟୋ ଏବଂ ମିଡିଆ ଦେଖନ୍ତୁ</translation> <translation id="5965524703725988602">ଡାର୍କ ଥିମ ଟୋଗଲ କରନ୍ତୁ। <ph name="STATE_TEXT" />।</translation> @@ -2251,6 +2258,7 @@ <translation id="7945357288295809525">ଆକ୍ସେସିବିଲିଟୀ ସେଟିଂସ ଦେଖାନ୍ତୁ, "<ph name="ENABLED_FEATURES" />" ସକ୍ଷମ କରାଯାଇଛି।</translation> <translation id="7946681191253332687">ବର୍ଦ୍ଧିତ ସୁରକ୍ଷା ଅପଡେଟ ଉପଲବ୍ଧ ଅଛି</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> ଆପଣଙ୍କ <ph name="DEVICE_NAME" /> ବ୍ୟବହାର କରିବାକୁ ଚାହେଁ</translation> +<translation id="7948239795436419268">ୱିଣ୍ଡୋଗୁଡ଼ିକୁ ରିଷ୍ଟୋର କରନ୍ତୁ ନାହିଁ</translation> <translation id="7951630946012935453">କୀବୋର୍ଡକୁ ଡିମ କରନ୍ତୁ</translation> <translation id="7953176344218790168">ବଡ଼ ଅକ୍ଷର</translation> <translation id="7953994493035617347">ନୂଆ ରିଜୋଲ୍ୟୁସନକୁ ସୁନିଶ୍ଚିତ କରିବେ?</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb index 44e1519..d0ff3ce 100644 --- a/ash/strings/ash_strings_pa.xtb +++ b/ash/strings/ash_strings_pa.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">ਮੌਜੂਦਾ ਬੈਟਰੀ ਪੱਧਰ <ph name="BATTERY_PERCENTAGE" />%, ਪੂਰੀ ਤਰ੍ਹਾਂ ਖਾਲੀ ਹੋਣ ਵਿੱਚ <ph name="TIME" /> ਬਾਕੀ</translation> <translation id="1178581264944972037">ਰੋਕੋ</translation> <translation id="1179776263021875437">ਕਾਰਜ 'ਤੇ ਫੋਕਸ ਕਰਨਾ ਬੰਦ ਕਰੋ</translation> +<translation id="1180117276105724040">ਤੁਹਾਡੇ ਪਿਛਲੇ ਸੈਸ਼ਨ ਤੋਂ ਵਿੰਡੋ ਨੂੰ ਮੁੜ-ਬਹਾਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation> <translation id="1181037720776840403">ਹਟਾਓ</translation> <translation id="1182225749592316782">ਇਸ ਨਾਲ ਉਨ੍ਹਾਂ ਸਾਰੀਆਂ ਐਪਾਂ ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਨੂੰ ਪਹੁੰਚ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ, ਜਿਨ੍ਹਾਂ ਕੋਲ ਕੈਮਰਾ ਅਤੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਇਜਾਜ਼ਤਾਂ ਹਨ</translation> <translation id="1182876754474670069">ਹੋਮ</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">ਕੀ ਆਡੀਓ ਸਰੋਤ ਨੂੰ ਸਵਿੱਚ ਕਰਨਾ ਹੈ?</translation> <translation id="1505542291183484463">ਟਾਇਲਡ ਮੁੜ-ਆਕਾਰ ਵਾਲੀ ਵਿੰਡੋ ਹੇਠਾਂ ਵੱਲ</translation> <translation id="1510238584712386396">ਲੌਂਚਰ</translation> +<translation id="1519090060276706457">ਵਿੰਡੋ ਨੂੰ ਮੁੜ-ਬਹਾਲ ਕਰਨ ਨਾਲ ਉਮੀਦ ਨਾਲੋਂ ਵੱਧ ਸਮਾਂ ਲੱਗ ਰਿਹਾ ਹੈ</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{ਸੂਚਨਾ ਸੈਟਿੰਗਾਂ ਦਿਖਾਓ। ਇੱਕ ਐਪ ਲਈ ਸੂਚਨਾਵਾਂ ਬੰਦ ਹਨ}one{ਸੂਚਨਾ ਸੈਟਿੰਗਾਂ ਦਿਖਾਓ। # ਐਪ ਲਈ ਸੂਚਨਾਵਾਂ ਬੰਦ ਹਨ}other{ਸੂਚਨਾ ਸੈਟਿੰਗਾਂ ਦਿਖਾਓ। # ਐਪਾਂ ਲਈ ਸੂਚਨਾਵਾਂ ਬੰਦ ਹਨ}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">ਬੈਟਰੀ <ph name="BATTERY_PERCENTAGE" />% | ਪੂਰੀ ਤਰ੍ਹਾਂ ਚਾਰਜ ਹੋਣ ਵਿੱਚ <ph name="TIME" /> ਬਾਕੀ</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">ਤਸਵੀਰ-ਵਿੱਚ-ਤਸਵੀਰ ਵਿੰਡੋ ਦੇ ਵੱਧੋ-ਵੱਧ ਜਾਂ ਮੌਜੂਦਾ ਆਕਾਰ ਵਿਚਾਲੇ ਸਵਿੱਚ ਕਰੋ</translation> <translation id="1787955149152357925">ਬੰਦ ਹੈ</translation> <translation id="1796561540704213354">ਵੈੱਬਸਾਈਟਾਂ ਦੀ ਸ਼੍ਰੇਣੀ ਵਿੱਚ ਤੁਹਾਡੇ ਵੱਲੋਂ ਦੇਖੇ ਗਏ ਪੰਨੇ ਅਤੇ ਖੋਲ੍ਹੇ ਗਏ ਪੰਨੇ ਦਿਖਾਏ ਜਾਂਦੇ ਹਨ</translation> +<translation id="1799852120691957794">ਤੁਹਾਡੇ ਪਿਛਲੇ ਸੈਸ਼ਨ ਤੋਂ ਵਿੰਡੋਆਂ ਨੂੰ ਮੁੜ-ਬਹਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ</translation> <translation id="1805407494113167797">ਫੋਕਸ ਧੁਨੀਆਂ ਨੂੰ ਚਲਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ</translation> <translation id="181103072419391116">ਸਿਗਨਲ ਦੀ ਤੀਬਰਤਾ <ph name="SIGNAL_STRENGTH" />, ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਪ੍ਰਬੰਧਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ</translation> <translation id="1815039896005206046">'ਨਾ ਸਲਾਹੋ' ਪ੍ਰਤੀਕ ਨਾਲ ਇਹ ਵਿਚਾਰ ਸਪੁਰਦ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਕਿ ਤੁਸੀਂ ਇਸ ਸੁਝਾਏ ਗਏ ਗਰੁੱਪ ਨੂੰ ਨਾਪਸੰਦ ਕੀਤਾ ਹੈ</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">ਵਿੰਡੋ ਦਾ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਓ</translation> <translation id="2598725286293895280">ਡੈਸਕ ਵਿੱਚ ਅਸਮਰਥਿਤ ਐਪਾਂ</translation> <translation id="2607678425161541573">ਆਨਲਾਈਨ ਸਾਈਨ-ਇਨ ਕਰਨਾ ਲੋੜੀਂਦਾ ਹੈ</translation> +<translation id="2611702650078660078">ਕੋਈ ਗੜਬੜ ਹੋ ਗਈ</translation> <translation id="2612072250312279703">ਸਰਗਰਮੀ ਮਾਨੀਟਰ</translation> <translation id="261210853165551493">ਫਾਰਮੈਟਿੰਗ ਨਾਲ ਕਾਪੀ ਕਰੋ</translation> <translation id="2612614436418177118">ਐਪ ਪ੍ਰਤੀਕ ਨੂੰ ਐਪ ਗਰਿੱਡ ਦੇ ਅੰਦਰ ਲਿਜਾਓ</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">ਪੂਰੀ ਸਕ੍ਰੀਨ ਦਾ ਸਕ੍ਰੀਨਸ਼ਾਟ ਕੈਪਚਰ ਕਰਨ ਲਈ Enter ਦਬਾਓ</translation> <translation id="2849936225196189499">ਆਲੋਚਨਾਤਮਿਕ</translation> <translation id="2850207700020959936">ਐਪਾਂ ਕੈਮਰੇ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀਆਂ ਹਨ</translation> +<translation id="2852045827873867442">ਇੰਟਰਨੈੱਟ ਕਨੈਕਸ਼ਨ ਲੋੜੀਂਦਾ ਹੈ।</translation> <translation id="2860184359326882502">ਬਿਹਤਰੀਨ ਮਿਲਾਨ</translation> <translation id="2865888419503095837">ਨੈੱਟਵਰਕ ਜਾਣਕਾਰੀ</translation> <translation id="2869095047958348710">ਇਸ ਪਿਛਲੇ <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> ਲਈ ਪਾਸਵਰਡ</translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">ਡੈਮੋ ਸੈਸ਼ਨ ਵਿੱਚ Google Assistant ਉਪਲਬਧ ਨਹੀਂ ਹੁੰਦਾ ਹੈ।</translation> +<translation id="4781633367688946589">ਨਵੇਂ ਸੈਸ਼ਨ 'ਤੇ ਜਾਰੀ ਰੱਖੋ</translation> <translation id="4785412405516449976">ਸਿਰਫ਼ ਤੁਹਾਡੇ ਉਹ ਸੰਪਰਕ, ਜਿਨ੍ਹਾਂ ਕੋਲ Google ਖਾਤਾ ਹੋਵੇ</translation> <translation id="4789348252524569426">ਬੋਲੀ ਫ਼ਾਈਲਾਂ ਨੂੰ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। ਆਪਣੇ ਡੀਵਾਈਸ ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰ ਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="478959186716341421">ਕਾਸਟ ਕਰਨਾ</translation> @@ -1604,6 +1610,7 @@ <translation id="595202126637698455">ਪ੍ਰਦਰਸ਼ਨ ਟ੍ਰੇਸਿੰਗ ਸਮਰਥਿਤ</translation> <translation id="5955304353782037793">ਐਪ</translation> <translation id="5958529069007801266">ਨਿਗਰਾਨੀ ਅਧੀਨ ਵਰਤੋਂਕਾਰ</translation> +<translation id="5959471481388474538">ਨੈੱਟਵਰਕ ਉਪਲਬਧ ਨਹੀਂ</translation> <translation id="596035801491797438">ਫ਼ੇਸ ਕੰਟਰੋਲ ਬੰਦ ਕਰੋ</translation> <translation id="5960410286721553511">ਆਪਣੇ ਫ਼ੋਨ ਦੀਆਂ ਹਾਲੀਆ ਫ਼ੋਟੋਆਂ ਅਤੇ ਮੀਡੀਆ ਦੇਖੋ</translation> <translation id="5965524703725988602">ਗੂੜ੍ਹੇ ਥੀਮ ਨੂੰ ਟੌਗਲ ਕਰੋ। <ph name="STATE_TEXT" />.</translation> @@ -2253,6 +2260,7 @@ <translation id="7945357288295809525">ਪਹੁੰਚਯੋਗਤਾ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਦਿਖਾਓ ਕਿ "<ph name="ENABLED_FEATURES" />" ਚਾਲੂ ਹੈ।</translation> <translation id="7946681191253332687">ਵਿਸਤ੍ਰਿਤ ਸੁਰੱਖਿਆ ਅੱਪਡੇਟ ਉਪਲਬਧ ਹਨ</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> ਐਪ <ph name="DEVICE_NAME" /> ਦੀ ਵਰਤੋਂ ਕਰਨਾ ਚਾਹੁੰਦੀ ਹੈ</translation> +<translation id="7948239795436419268">ਵਿੰਡੋ ਨੂੰ ਮੁੜ-ਬਹਾਲ ਨਾ ਕਰੋ</translation> <translation id="7951630946012935453">ਕੀ-ਬੋਰਡ ਦੀ ਚਮਕ ਘਟਾਓ</translation> <translation id="7953176344218790168">ਵੱਡੇ-ਅੱਖਰ</translation> <translation id="7953994493035617347">ਕੀ ਨਵੇਂ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਦੀ ਤਸਦੀਕ ਕਰਨੀ ਹੈ?</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index 83c915a2..18573f3 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Aktualny poziom naładowania baterii: <ph name="BATTERY_PERCENTAGE" />%, pozostało: <ph name="TIME" /></translation> <translation id="1178581264944972037">Wstrzymaj</translation> <translation id="1179776263021875437">Przestań skupiać się na zadaniu</translation> +<translation id="1180117276105724040">Przywracam okna z poprzedniej sesji…</translation> <translation id="1181037720776840403">Usuń</translation> <translation id="1182225749592316782">Zezwala na dostęp wszystkim aplikacjom i stronom internetowym, które mają uprawnienia do korzystania z kamery i mikrofonu.</translation> <translation id="1182876754474670069">Home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Przełączyć źródło dźwięku?</translation> <translation id="1505542291183484463">Zmień rozmiar okna kafelkowego w dół</translation> <translation id="1510238584712386396">Menu z aplikacjami</translation> +<translation id="1519090060276706457">Przywracanie okien trwa dłużej niż zwykle</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Pokaż ustawienia powiadomień. Jedna aplikacja ma wyłączone powiadomienia.}few{Pokaż ustawienia powiadomień. # aplikacje mają wyłączone powiadomienia.}many{Pokaż ustawienia powiadomień. # aplikacji ma wyłączone powiadomienia.}other{Pokaż ustawienia powiadomień. # aplikacji ma wyłączone powiadomienia.}}</translation> <translation id="1521655867290435174">Arkusze Google</translation> <translation id="1523032696246003">Bateria: <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> do pełnego naładowania</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Przełączanie między maksymalnym a bieżącym rozmiarem okna obrazu w obrazie</translation> <translation id="1787955149152357925">Wyłączono</translation> <translation id="1796561540704213354">Strony internetowe, w tym strony odwiedzone i otwarte</translation> +<translation id="1799852120691957794">Nie można przywrócić okien z poprzedniej sesji</translation> <translation id="1805407494113167797">Nie udało się odtworzyć dźwięków trybu pełnej koncentracji</translation> <translation id="181103072419391116">Siła sygnału: <ph name="SIGNAL_STRENGTH" />, zarządzana przez administratora</translation> <translation id="1815039896005206046">Opcja Nie lubię spowoduje przesłanie opinii, że ta sugerowana grupa Ci się nie podoba</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Zrób zrzut ekranu okna</translation> <translation id="2598725286293895280">Nieobsługiwane aplikacje w biurku</translation> <translation id="2607678425161541573">Wymagane jest zalogowanie w trybie online</translation> +<translation id="2611702650078660078">Wystąpił błąd</translation> <translation id="2612072250312279703">monitor aktywności</translation> <translation id="261210853165551493">Kopiuj z formatowaniem</translation> <translation id="2612614436418177118">Przenieś ikonę aplikacji w siatce aplikacji</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Aby zrobić zrzut całego ekranu, naciśnij Enter</translation> <translation id="2849936225196189499">Krytyczne</translation> <translation id="2850207700020959936">Aplikacje mają dostęp do kamery</translation> +<translation id="2852045827873867442">Wymagane jest połączenie z internetem.</translation> <translation id="2860184359326882502">Najlepsze dopasowanie</translation> <translation id="2865888419503095837">Informacje o sieci</translation> <translation id="2869095047958348710">Ostatni(a) <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Hasło dla <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Sklep Play</translation> <translation id="4778095205580009397">Asystent Google jest niedostępny w sesji demonstracyjnej.</translation> +<translation id="4781633367688946589">Przejdź do nowej sesji</translation> <translation id="4785412405516449976">Tylko Twoje kontakty z kontem Google</translation> <translation id="4789348252524569426">Nie udało się zainstalować plików z mową. Urządzenie wymaga aktualizacji. Uruchom je ponownie i spróbuj jeszcze raz.</translation> <translation id="478959186716341421">Przesyłanie</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Śledzenie wydajności jest włączone</translation> <translation id="5955304353782037793">aplikacja</translation> <translation id="5958529069007801266">Użytkownik nadzorowany</translation> +<translation id="5959471481388474538">Sieć niedostępna</translation> <translation id="596035801491797438">Wyłącz sterowanie za pomocą twarzy</translation> <translation id="5960410286721553511">Wyświetlaj najnowsze zdjęcia i pliki multimedialne z telefonu</translation> <translation id="5965524703725988602">Przełącz ciemny motyw. <ph name="STATE_TEXT" />.</translation> @@ -2251,6 +2258,7 @@ <translation id="7945357288295809525">Pokaż ustawienia ułatwień dostępu, włączono „<ph name="ENABLED_FEATURES" />”.</translation> <translation id="7946681191253332687">Dostępne są rozszerzone aktualizacje zabezpieczeń</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> chce użyć urządzenia <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Nie przywracaj okien</translation> <translation id="7951630946012935453">Przyciemnij klawiaturę</translation> <translation id="7953176344218790168">WIELKIE LITERY</translation> <translation id="7953994493035617347">Potwierdzić nową rozdzielczość?</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb index 158d460..d79b7fed 100644 --- a/ash/strings/ash_strings_pt-BR.xtb +++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Nível atual da bateria: <ph name="BATTERY_PERCENTAGE" />%. Tempo restante: <ph name="TIME" /></translation> <translation id="1178581264944972037">Pausar</translation> <translation id="1179776263021875437">Parar de focar na tarefa</translation> +<translation id="1180117276105724040">Restaurando as janelas da sessão anterior…</translation> <translation id="1181037720776840403">Remover</translation> <translation id="1182225749592316782">Esta ação libera o acesso para todos os apps e sites com essas permissões</translation> <translation id="1182876754474670069">início</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Trocar a fonte de áudio?</translation> <translation id="1505542291183484463">Redimensionar janela em mosaico para baixo</translation> <translation id="1510238584712386396">Iniciador</translation> +<translation id="1519090060276706457">A restauração das janelas está demorando mais do que o esperado</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Mostrar configurações de notificação. As notificações estão desativadas para um app}one{Mostrar configurações de notificação. As notificações estão desativadas para # app}other{Mostrar configurações de notificação. As notificações estão desativadas para # apps}}</translation> <translation id="1521655867290435174">Google Planilhas</translation> <translation id="1523032696246003">Bateria em <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> até a carga completa</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Alternar entre o tamanho máximo e o atual da janela picture-in-picture</translation> <translation id="1787955149152357925">Desativado</translation> <translation id="1796561540704213354">Sites que incluem páginas visitadas e páginas abertas</translation> +<translation id="1799852120691957794">Não foi possível restaurar as janelas da sessão anterior</translation> <translation id="1805407494113167797">Não foi possível tocar os sons de foco</translation> <translation id="181103072419391116"><ph name="SIGNAL_STRENGTH" /> de intensidade de sinal , gerenciada pelo seu administrador</translation> <translation id="1815039896005206046">O botão "Não gostei" envia feedback informando que você não gostou do grupo sugerido</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Fazer captura de tela da janela</translation> <translation id="2598725286293895280">Apps sem suporte no espaço de trabalho</translation> <translation id="2607678425161541573">É necessário fazer login on-line</translation> +<translation id="2611702650078660078">Ocorreu um erro</translation> <translation id="2612072250312279703">monitor de atividade</translation> <translation id="261210853165551493">Copiar com formatação</translation> <translation id="2612614436418177118">Mover um ícone de app na grade de apps</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Pressione "Enter" para fazer uma captura de tela cheia</translation> <translation id="2849936225196189499">Crítico</translation> <translation id="2850207700020959936">Os apps podem acessar a câmera</translation> +<translation id="2852045827873867442">É necessário ter uma conexão de Internet.</translation> <translation id="2860184359326882502">Melhor correspondência</translation> <translation id="2865888419503095837">Informações de rede</translation> <translation id="2869095047958348710"><ph name="DAY_OF_WEEK" /> anterior</translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Senha para <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">O Google Assistente não está disponível para uma sessão de demonstração.</translation> +<translation id="4781633367688946589">Continuar para a nova sessão</translation> <translation id="4785412405516449976">Apenas seus contatos com uma Conta do Google</translation> <translation id="4789348252524569426">Não foi possível instalar arquivos de fala. Seu dispositivo precisa ser atualizado. Reinicie o dispositivo e tente novamente.</translation> <translation id="478959186716341421">Transmitindo</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Rastreamento de desempenho ativado</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Usuário supervisionado</translation> +<translation id="5959471481388474538">Rede não disponível</translation> <translation id="596035801491797438">Desativar o controle facial</translation> <translation id="5960410286721553511">Ver as fotos e mídias recentes do smartphone</translation> <translation id="5965524703725988602">Alternar tema escuro. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Mostrar configurações de acessibilidade: recurso "<ph name="ENABLED_FEATURES" />" ativado.</translation> <translation id="7946681191253332687">Atualizações de segurança estendidas disponíveis</translation> <translation id="7947798320695032612">O app <ph name="APP_NAME" /> quer usar seu dispositivo <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Não restaurar janelas</translation> <translation id="7951630946012935453">Escurecer o teclado</translation> <translation id="7953176344218790168">LETRAS MAIÚSCULAS</translation> <translation id="7953994493035617347">Confirmar nova resolução?</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb index 038591ef..b92b289 100644 --- a/ash/strings/ash_strings_pt-PT.xtb +++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Nível da bateria atual: <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> restante</translation> <translation id="1178581264944972037">Pausa</translation> <translation id="1179776263021875437">Parar de focar na tarefa</translation> +<translation id="1180117276105724040">A restaurar as janelas da sua sessão anterior…</translation> <translation id="1181037720776840403">Remover</translation> <translation id="1182225749592316782">Isto permite o acesso para todas as apps e Websites com as autorizações da câmara e do microfone</translation> <translation id="1182876754474670069">início</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Mudar de origem de áudio?</translation> <translation id="1505542291183484463">Janela de redimensionamento em mosaico para baixo</translation> <translation id="1510238584712386396">Iniciador</translation> +<translation id="1519090060276706457">A restauração de janelas está a demorar mais do que o esperado</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Mostrar definições de notificação. As notificações estão desativadas para uma aplicação}other{Mostrar definições de notificação. As notificações estão desativadas para # aplicações}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">Bateria: <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> até ficar completa</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Alternar entre o tamanho máximo ou atual da janela de ecrã no ecrã</translation> <translation id="1787955149152357925">Desativado</translation> <translation id="1796561540704213354">Websites, incluindo páginas que visitou e páginas abertas</translation> +<translation id="1799852120691957794">Não é possível restaurar as janelas da sua sessão anterior</translation> <translation id="1805407494113167797">Não foi possível tocar os sons do Modo sem distrações</translation> <translation id="181103072419391116">Intensidade do sinal: <ph name="SIGNAL_STRENGTH" />, gerida pelo administrador</translation> <translation id="1815039896005206046">A opção Não gosto envia feedback a indicar que não gosta deste grupo sugerido</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Criar uma captura de ecrã da janela</translation> <translation id="2598725286293895280">Apps não suportadas no espaço de trabalho</translation> <translation id="2607678425161541573">É necessário iniciar sessão online</translation> +<translation id="2611702650078660078">Ocorreu um erro</translation> <translation id="2612072250312279703">monitor de atividade</translation> <translation id="261210853165551493">Copiar com formatação</translation> <translation id="2612614436418177118">Mover um ícone da app na grelha de apps</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Prima Enter para fazer uma captura de ecrã inteiro</translation> <translation id="2849936225196189499">Crítica</translation> <translation id="2850207700020959936">As apps podem aceder à câmara</translation> +<translation id="2852045827873867442">É necessária ligação à Internet.</translation> <translation id="2860184359326882502">Melhor correspondência</translation> <translation id="2865888419503095837">Informações da rede</translation> <translation id="2869095047958348710"><ph name="DAY_OF_WEEK" /> que passou</translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Palavra-passe para <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">O Assistente Google não está disponível numa sessão de demonstração.</translation> +<translation id="4781633367688946589">Continuar para nova sessão</translation> <translation id="4785412405516449976">Apenas os seus contactos com uma Conta Google</translation> <translation id="4789348252524569426">Não é possível instalar os ficheiros de voz. É preciso atualizar o dispositivo. Reinicie o dispositivo e tente novamente.</translation> <translation id="478959186716341421">A transmitir</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Rastreio do desempenho ativado</translation> <translation id="5955304353782037793">aplicação</translation> <translation id="5958529069007801266">Utilizador supervisionado</translation> +<translation id="5959471481388474538">Rede não disponível</translation> <translation id="596035801491797438">Desativar controlo facial</translation> <translation id="5960410286721553511">Veja as fotos e os conteúdos multimédia recentes do telemóvel</translation> <translation id="5965524703725988602">Ative/desative o tema escuro. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Mostrar definições de acessibilidade, funcionalidade "<ph name="ENABLED_FEATURES" />" ativada.</translation> <translation id="7946681191253332687">Atualizações de segurança alargadas disponíveis</translation> <translation id="7947798320695032612">A app <ph name="APP_NAME" /> quer usar o(a) <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Não restaurar janelas</translation> <translation id="7951630946012935453">Escurecer o teclado</translation> <translation id="7953176344218790168">MAIÚSCULAS</translation> <translation id="7953994493035617347">Confirmar a nova resolução?</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb index c4399ea..6e23179 100644 --- a/ash/strings/ash_strings_ro.xtb +++ b/ash/strings/ash_strings_ro.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Nivelul actual al bateriei: <ph name="BATTERY_PERCENTAGE" /> %, timp rămas: <ph name="TIME" /></translation> <translation id="1178581264944972037">Întrerupe</translation> <translation id="1179776263021875437">Nu te mai concentra asupra activității</translation> +<translation id="1180117276105724040">Se restabilesc ferestrele din sesiunea anterioară...</translation> <translation id="1181037720776840403">Elimină</translation> <translation id="1182225749592316782">Astfel, se permite accesul pentru toate aplicațiile și site-urile cu permisiuni pentru camera foto și microfon</translation> <translation id="1182876754474670069">acasă</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Schimbi sursa audio?</translation> <translation id="1505542291183484463">Redimensionează ferestrele sub formă de dale în jos</translation> <translation id="1510238584712386396">Lansator</translation> +<translation id="1519090060276706457">Restabilirea ferestrelor durează mai mult decât s-a estimat</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Afișează setările pentru notificări. Notificările sunt dezactivate pentru o aplicație}few{Afișează setările pentru notificări. Notificările sunt dezactivate pentru # aplicații}other{Afișează setările pentru notificări. Notificările sunt dezactivate pentru # de aplicații}}</translation> <translation id="1521655867290435174">Foi de calcul Google</translation> <translation id="1523032696246003">Baterie <ph name="BATTERY_PERCENTAGE" /> % | <ph name="TIME" /> până la încărcare completă</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Comută între dimensiunea maximă și cea actuală a ferestrei picture-in-picture</translation> <translation id="1787955149152357925">Dezactivată</translation> <translation id="1796561540704213354">Site-urile, inclusiv paginile pe care le-ai accesat și paginile deschise</translation> +<translation id="1799852120691957794">Nu se pot restabili ferestrele din sesiunea anterioară</translation> <translation id="1805407494113167797">Nu se pot reda sunetele pentru Focus</translation> <translation id="181103072419391116">Puterea semnalului: <ph name="SIGNAL_STRENGTH" />, gestionată de administratorul tău</translation> <translation id="1815039896005206046">Dacă alegi Nu îmi place, trimiți ca feedback faptul că nu îți place acest grup sugerat</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Realizează o captură de ecran a ferestrei</translation> <translation id="2598725286293895280">Aplicații neacceptate pe desktop</translation> <translation id="2607678425161541573">Este necesară conectarea online</translation> +<translation id="2611702650078660078">A apărut o eroare</translation> <translation id="2612072250312279703">instrument de monitorizare a activităților</translation> <translation id="261210853165551493">Copiază cu formatare</translation> <translation id="2612614436418177118">Mută o pictogramă de aplicație în grila de aplicații</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Apasă pe Enter pentru a realiza o captură de ecran completă</translation> <translation id="2849936225196189499">Critic</translation> <translation id="2850207700020959936">Aplicațiile pot accesa camera</translation> +<translation id="2852045827873867442">Este necesară o conexiune la internet.</translation> <translation id="2860184359326882502">Cea mai bună potrivire</translation> <translation id="2865888419503095837">Informații despre rețea</translation> <translation id="2869095047958348710"><ph name="DAY_OF_WEEK" /> trecută</translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Parolă pentru <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Magazin Play</translation> <translation id="4778095205580009397">Asistentul Google nu este disponibil într-o sesiune demonstrativă.</translation> +<translation id="4781633367688946589">Continuă cu noua sesiune</translation> <translation id="4785412405516449976">Doar persoanele de contact cu Cont Google</translation> <translation id="4789348252524569426">Nu se pot instala fișierele pentru recunoaștere vocală. Dispozitivul trebuie actualizat. Repornește dispozitivul și încearcă din nou.</translation> <translation id="478959186716341421">Se proiectează</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Urmărirea performanței este activată</translation> <translation id="5955304353782037793">aplicație</translation> <translation id="5958529069007801266">Utilizator monitorizat</translation> +<translation id="5959471481388474538">Rețea indisponibilă</translation> <translation id="596035801491797438">Dezactivează comenzile faciale</translation> <translation id="5960410286721553511">Vezi fotografiile și elementele media recente ale telefonului</translation> <translation id="5965524703725988602">Activează / dezactivează Tema întunecată. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Afișează setările de accesibilitate, <ph name="ENABLED_FEATURES" /> este activată.</translation> <translation id="7946681191253332687">Sunt disponibile actualizări de securitate extinse</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> vrea să folosească <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Nu restabili ferestrele</translation> <translation id="7951630946012935453">Redu luminozitatea tastaturii</translation> <translation id="7953176344218790168">MAJUSCULE</translation> <translation id="7953994493035617347">Confirmi noua rezoluție?</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb index 6b5ee187..5fe8f08 100644 --- a/ash/strings/ash_strings_ru.xtb +++ b/ash/strings/ash_strings_ru.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Текущий уровень заряда батареи: <ph name="BATTERY_PERCENTAGE" /> %. Оставшееся время работы: <ph name="TIME" />.</translation> <translation id="1178581264944972037">Пауза</translation> <translation id="1179776263021875437">Перестать фокусироваться на задаче</translation> +<translation id="1180117276105724040">Восстановление окон из предыдущего сеанса…</translation> <translation id="1181037720776840403">Удалить</translation> <translation id="1182225749592316782">Доступ будет предоставлен всем приложениям и сайтам с разрешениями "Камера" и "Микрофон".</translation> <translation id="1182876754474670069">Home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Переключиться на другой источник звука?</translation> <translation id="1505542291183484463">Растянуть окно в многооконном режиме вниз</translation> <translation id="1510238584712386396">Панель запуска</translation> +<translation id="1519090060276706457">Восстановление окон занимает больше времени, чем обычно</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Показать настройки уведомлений. Уведомления отключены для одного приложения.}one{Показать настройки уведомлений. Уведомления отключены для # приложения.}few{Показать настройки уведомлений. Уведомления отключены для # приложений.}many{Показать настройки уведомлений. Уведомления отключены для # приложений.}other{Показать настройки уведомлений. Уведомления отключены для # приложения.}}</translation> <translation id="1521655867290435174">Google Таблицы</translation> <translation id="1523032696246003">Батарея: <ph name="BATTERY_PERCENTAGE" /> % | <ph name="TIME" /> до полного заряда</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Переключиться между максимальным и текущим размером окна "картинка в картинке"</translation> <translation id="1787955149152357925">Отключено</translation> <translation id="1796561540704213354">Сайты, включая открытые и посещенные вами страницы</translation> +<translation id="1799852120691957794">Не удалось восстановить окна из предыдущего сеанса</translation> <translation id="1805407494113167797">Не удалось воспроизвести звуки режима "Концентрация".</translation> <translation id="181103072419391116">Уровень сигнала – <ph name="SIGNAL_STRENGTH" />, под управлением администратора</translation> <translation id="1815039896005206046">Поставить предлагаемой группе отметку "Не нравится"</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Сделать скриншот окна</translation> <translation id="2598725286293895280">На рабочем столе есть неподдерживаемые приложения</translation> <translation id="2607678425161541573">Войдите в аккаунт в режиме онлайн</translation> +<translation id="2611702650078660078">Произошла ошибка.</translation> <translation id="2612072250312279703">мониторинг системы</translation> <translation id="261210853165551493">Скопировать с форматированием</translation> <translation id="2612614436418177118">Переместить значок приложения в сетке</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Нажмите Ввод, чтобы сделать скриншот всего экрана</translation> <translation id="2849936225196189499">Критическое</translation> <translation id="2850207700020959936">У приложений есть доступ к камере.</translation> +<translation id="2852045827873867442">Требуется подключение к интернету.</translation> <translation id="2860184359326882502">Лучшие результаты</translation> <translation id="2865888419503095837">Информация о сети</translation> <translation id="2869095047958348710">Прошедший день недели: <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Пароль для адреса электронной почты <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Маркет</translation> <translation id="4778095205580009397">Google Ассистент в демонстрационном сеансе недоступен</translation> +<translation id="4781633367688946589">Начать новый сеанс</translation> <translation id="4785412405516449976">Только ваши контакты, у которых есть аккаунт Google</translation> <translation id="4789348252524569426">Невозможно установить файлы для распознавания речи. Обновите операционную систему и перезапустите устройство, затем повторите попытку.</translation> <translation id="478959186716341421">Трансляция...</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Включено отслеживание эффективности</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Контролируемый профиль</translation> +<translation id="5959471481388474538">Сеть недоступна</translation> <translation id="596035801491797438">Отключить управление мимикой</translation> <translation id="5960410286721553511">Просматривайте недавно добавленные на телефон фотографии и медиафайлы.</translation> <translation id="5965524703725988602">Включить или отключить тёмную тему. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Открыть настройки специальных возможностей. Включенные функции: <ph name="ENABLED_FEATURES" />.</translation> <translation id="7946681191253332687">Доступна расширенная поддержка обновлений системы безопасности</translation> <translation id="7947798320695032612">Приложению "<ph name="APP_NAME" />" требуется разрешение (<ph name="DEVICE_NAME" />)</translation> +<translation id="7948239795436419268">Не восстанавливать окна</translation> <translation id="7951630946012935453">Уменьшить яркость подсветки клавиатуры</translation> <translation id="7953176344218790168">ВЕРХНИЙ РЕГИСТР</translation> <translation id="7953994493035617347">Подтвердите изменение</translation>
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb index 8e46b0d..3640dbe2 100644 --- a/ash/strings/ash_strings_si.xtb +++ b/ash/strings/ash_strings_si.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">වත්මන් බැටරි මට්ටම <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> ක් ඉතුරුයි</translation> <translation id="1178581264944972037">විරාමය</translation> <translation id="1179776263021875437">කාර්යය මත අවධානය යොමු කිරීම නවත්වන්න</translation> +<translation id="1180117276105724040">ඔබගේ පෙර සැසියෙන් කවුළු ප්රතිසාධනය කරමින්...</translation> <translation id="1181037720776840403">ඉවත් කරන්න</translation> <translation id="1182225749592316782">මෙය කැමරා සහ මයික්රෆෝන අවසර සහිත සියලු යෙදුම් සහ වෙබ් අඩවි සඳහා ප්රවේශ වීමට ඉඩ දෙයි</translation> <translation id="1182876754474670069">නිවස</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">ශ්රව්ය මූලාශ්රය මාරු කරන්න ද?</translation> <translation id="1505542291183484463">පහළට කැට කරන ලද ප්රතිප්රමාණ කවුළුව</translation> <translation id="1510238584712386396">දියත්කරණය</translation> +<translation id="1519090060276706457">කවුළු ප්රතිසාධනය කිරීමට බලාපොරොත්තු වූවාට වඩා වැඩි කාලයක් ගතවේ.</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{දැනුම් දීම් සැකසීම් පෙන්වන්න. යෙදුමක් සඳහා දැනුම්දීම් ක්රියාවිරහිතයි}one{දැනුම් දීම් සැකසීම් පෙන්වන්න. යෙදුම් # ක් සඳහා දැනුම්දීම් ක්රියාවිරහිතයි}other{දැනුම් දීම් සැකසීම් පෙන්වන්න. යෙදුම් # ක් සඳහා දැනුම්දීම් ක්රියාවිරහිතයි}}</translation> <translation id="1521655867290435174">Google පත්ර</translation> <translation id="1523032696246003">බැටරිය <ph name="BATTERY_PERCENTAGE" />% | සම්පූර්ණ වන තෙක් <ph name="TIME" /></translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">පින්තූරය-තුළ-පින්තූර කවුළුවේ උපරිම හෝ වත්මන් තරම අතර මාරු වන්න</translation> <translation id="1787955149152357925">ක්රියාවිරහිතයි</translation> <translation id="1796561540704213354">ඔබ පිවිසි පිටු සහ විවෘත පිටු ඇතුළු වෙබ් අඩවි</translation> +<translation id="1799852120691957794">ඔබේ පෙර සැසියෙන් කවුළු ප්රතිස්ථාපනය කළ නොහැක</translation> <translation id="1805407494113167797">නාභිගත ශබ්ද වාදනය කළ නොහැකි විය</translation> <translation id="181103072419391116">සංඥා ප්රබලතාව <ph name="SIGNAL_STRENGTH" />, ඔබේ පරිපාලකයා විසින් කළමනාකරණය කරයි</translation> <translation id="1815039896005206046">මෙම යෝජිත සමූහයට ඔබ අකමැති බවට ප්රතිපෝෂණය, මහපටැඟිල්ල පහළට යොමු කරනු ඇත</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">කවුළුවේ තිර රුවක් ලබා ගන්න</translation> <translation id="2598725286293895280">මේසය තුළ සහාය නොදක්වන යෙදුම්</translation> <translation id="2607678425161541573">සබැඳි පිරීම අවශ්යයි</translation> +<translation id="2611702650078660078">දෝෂයක් ඇති විය</translation> <translation id="2612072250312279703">ක්රියාකාරකම් මොනිටරය</translation> <translation id="261210853165551493">හැඩතල ගැන්වීම සමග පිටපත් කරන්න</translation> <translation id="2612614436418177118">යෙදුම් ජාලකය තුළ යෙදුම් නිරූපකය ගෙන යන්න</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">පූර්ණ තිර රුවක් ලබා ගැනීමට Enter ඔබන්න</translation> <translation id="2849936225196189499">තීරණාත්මක</translation> <translation id="2850207700020959936">යෙදුම්වලට කැමරාවට ප්රවේශ විය හැක</translation> +<translation id="2852045827873867442">අන්තර්ජාල සම්බන්ධතාවය අවශ්යයි.</translation> <translation id="2860184359326882502">හොඳම ගැළපීම</translation> <translation id="2865888419503095837">ජාල තොරතුරු</translation> <translation id="2869095047958348710">මෙම පසු වූ <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> සඳහා රහස්වචනය</translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">ආදර්ශන සැසියකදී Google සහකරු නොලැබේ.</translation> +<translation id="4781633367688946589">නව සැසියට ඉදිරියට යන්න</translation> <translation id="4785412405516449976">Google ගිණුමක් සහිත ඔබේ සම්බන්ධතා පමණි</translation> <translation id="4789348252524569426">කථන ගොනු ස්ථාපනය කළ නොහැක. ඔබේ උපාංගය යාවත්කාලීන කිරීමට අවශ්යයි. ඔබේ උපාංගය යළි අරඹා නැවත උත්සාහ කරන්න.</translation> <translation id="478959186716341421">විකාශය කරමින්</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">ක්රියාකරිත්ව හඹායෑම සබල කෙරිණි</translation> <translation id="5955304353782037793">යෙදුම</translation> <translation id="5958529069007801266">අධීක්ෂණය කරන ලද භාවිතකරු</translation> +<translation id="5959471481388474538">ජාලය ලද නොහැක</translation> <translation id="596035801491797438">මුහුණු පාලනය ක්රියාවිරහිත කරන්න</translation> <translation id="5960410286721553511">ඔබගේ දුරකථනයේ මෑත ඡායාරූප සහ මාධ්ය බලන්න</translation> <translation id="5965524703725988602">අඳුරු තේමාව ටොගල් කරන්න. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">ප්රවේශ්යතා සැකසීම් පෙන්වන්න, "<ph name="ENABLED_FEATURES" />" සබල කර ඇත.</translation> <translation id="7946681191253332687">දීර්ඝ කළ ආරක්ෂක යාවත්කාලීන ලැබේ</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> හට ඔබේ <ph name="DEVICE_NAME" /> භාවිතා කිරීමට අවශ්යයි</translation> +<translation id="7948239795436419268">කවුළු ප්රතිසාධනය නොකරන්න</translation> <translation id="7951630946012935453">යතුරු පුවරුව අඳුරු කරන්න</translation> <translation id="7953176344218790168">සියල්ල කැපිටල් අකුරු</translation> <translation id="7953994493035617347">නව විභේදනය තහවුරු කරන්න ද?</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index d3fa7d3..d1bfb19 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Aktuálna úroveň batérie: <ph name="BATTERY_PERCENTAGE" /> %, zostávajúci čas: <ph name="TIME" /></translation> <translation id="1178581264944972037">Pozastaviť</translation> <translation id="1179776263021875437">Zrušiť zameranie na úlohu</translation> +<translation id="1180117276105724040">Obnovujú sa okná z predchádzajúcej relácie…</translation> <translation id="1181037720776840403">Odstrániť</translation> <translation id="1182225749592316782">Týmto povolíte prístup všetkým aplikáciám a webom s povoleniami používať kameru a mikrofón</translation> <translation id="1182876754474670069">home (na začiatok)</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Chcete prepnúť zdroj zvuku?</translation> <translation id="1505542291183484463">Okno veľkosti dlaždice dole</translation> <translation id="1510238584712386396">Spúšťač</translation> +<translation id="1519090060276706457">Obnova okien trvá dlhšie, ako sa očakávalo</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Zobraziť nastavenia upozornení. Upozornenia sú pre aplikáciu vypnuté}few{Zobraziť nastavenia upozornení. Upozornenia sú vypnuté pre # aplikácie}many{Show notification settings. Notifications are off for # apps}other{Zobraziť nastavenia upozornení. Upozornenia sú vypnuté pre # aplikácií}}</translation> <translation id="1521655867290435174">Tabuľky Google</translation> <translation id="1523032696246003">Batéria: <ph name="BATTERY_PERCENTAGE" /> % | <ph name="TIME" /> do úplného nabitia</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Prepínanie medzi maximálnou alebo aktuálnou veľkosťou okna obrazu v obraze</translation> <translation id="1787955149152357925">Vypnuté</translation> <translation id="1796561540704213354">Weby vrátane stránok, ktoré ste navštívili, a tých, ktoré sú otvorené</translation> +<translation id="1799852120691957794">Okná z predchádzajúcej relácie sa nedajú obnoviť</translation> <translation id="1805407494113167797">Zvuky na sústredenie sa nepodarilo prehrať</translation> <translation id="181103072419391116">Sila signálu <ph name="SIGNAL_STRENGTH" />, ovládané správcom</translation> <translation id="1815039896005206046">Tlačidlom s palcom dole odošlete spätnú väzbu, že sa vám táto navrhovaná skupina nepáči</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Vytvorenie snímky obrazovky okna</translation> <translation id="2598725286293895280">Nepodporované aplikácie na ploche</translation> <translation id="2607678425161541573">Vyžaduje sa prihlásenie online</translation> +<translation id="2611702650078660078">Vyskytla sa chyba</translation> <translation id="2612072250312279703">monitor aktivity</translation> <translation id="261210853165551493">Kopírovať s formátom</translation> <translation id="2612614436418177118">Presunutie ikony aplikácie v mriežke aplikácií</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Snímku celej obrazovky vytvoríte stlačením klávesa Enter</translation> <translation id="2849936225196189499">Kritické</translation> <translation id="2850207700020959936">Aplikácie majú prístup ku kamere</translation> +<translation id="2852045827873867442">Vyžaduje sa internetové pripojenie.</translation> <translation id="2860184359326882502">Najlepšia zhoda</translation> <translation id="2865888419503095837">Informácie o sieti</translation> <translation id="2869095047958348710">Tento posledný deň: <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Heslo pre účet <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Obchod Play</translation> <translation id="4778095205580009397">Asistent Google nie je k dispozícii v relácii ukážky.</translation> +<translation id="4781633367688946589">Pokračovať v novej relácii</translation> <translation id="4785412405516449976">Iba vaše kontakty s účtom Google</translation> <translation id="4789348252524569426">Rečové súbory sa nedajú nainštalovať. Zariadenie je potrebné aktualizovať. Reštartujte zariadenie a skúste to znova.</translation> <translation id="478959186716341421">Prenáša sa</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Sledovanie výkonnosti je povolené</translation> <translation id="5955304353782037793">aplikácia</translation> <translation id="5958529069007801266">Kontrolovaný používateľ</translation> +<translation id="5959471481388474538">Sieť je nedostupná</translation> <translation id="596035801491797438">Vypnúť ovládanie tvárou</translation> <translation id="5960410286721553511">Pozrite si najnovšie fotky a médiá z telefónu</translation> <translation id="5965524703725988602">Prepnúť tmavý motív. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Zobraziť nastavenia dostupnosti, funkcie <ph name="ENABLED_FEATURES" /> sú povolené.</translation> <translation id="7946681191253332687">K dispozícii sú rozšírené bezpečnostné aktualizácie</translation> <translation id="7947798320695032612">Aplikácia <ph name="APP_NAME" /> chce použiť vaše zariadenie <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Neobnovovať okná</translation> <translation id="7951630946012935453">Stmavenie klávesnice</translation> <translation id="7953176344218790168">VEĽKÉ PÍSMENÁ</translation> <translation id="7953994493035617347">Chcete potvrdiť nové rozlíšenie?</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index 0273f86e..b2a6153 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Trenutna raven napolnjenosti baterije je <ph name="BATTERY_PERCENTAGE" /> %, še <ph name="TIME" /></translation> <translation id="1178581264944972037">Prekini</translation> <translation id="1179776263021875437">Prekinite osredotočanje na opravilo</translation> +<translation id="1180117276105724040">Obnavljanje oken iz prejšnje seje …</translation> <translation id="1181037720776840403">Odstrani</translation> <translation id="1182225749592316782">To omogoča dostop za vse aplikacije in spletna mesta, ki imajo dovoljenje za kamero in mikrofon.</translation> <translation id="1182876754474670069">tipka home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Želite preklopiti vir zvoka?</translation> <translation id="1505542291183484463">Razpostavljeno okno za spreminjanje velikosti okna navzdol</translation> <translation id="1510238584712386396">Zaganjalnik</translation> +<translation id="1519090060276706457">Obnovitev oken traja dlje, kot je pričakovano</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Prikaz nastavitev obvestil. Obvestila so izklopljena za eno aplikacijo.}one{Prikaz nastavitev obvestil. Obvestila so izklopljena za # aplikacijo.}two{Prikaz nastavitev obvestil. Obvestila so izklopljena za # aplikaciji.}few{Prikaz nastavitev obvestil. Obvestila so izklopljena za # aplikacije.}other{Prikaz nastavitev obvestil. Obvestila so izklopljena za # aplikacij.}}</translation> <translation id="1521655867290435174">Google Preglednice</translation> <translation id="1523032696246003"><ph name="BATTERY_PERCENTAGE" /> % baterije | <ph name="TIME" /> do napolnjenosti</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Preklop med največjo ali trenutno velikostjo okna slike v sliki</translation> <translation id="1787955149152357925">Izklopljeno</translation> <translation id="1796561540704213354">Spletna mesta, vključno s stranmi, ki ste jih obiskali, in odprtimi stranmi</translation> +<translation id="1799852120691957794">Oken iz prejšnje seje ni mogoče obnoviti</translation> <translation id="1805407494113167797">Zvokov načina Osredotočenosti ni bilo mogoče predvajati</translation> <translation id="181103072419391116">Moč signala je <ph name="SIGNAL_STRENGTH" />, upravlja ga vaš skrbnik</translation> <translation id="1815039896005206046">S palcem dol pošljete povratne informacije, da vam ta predlagana skupina ni všeč</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Ustvarjanje posnetka okna</translation> <translation id="2598725286293895280">Nepodprte aplikacije na namizju</translation> <translation id="2607678425161541573">Obvezna je spletna prijava</translation> +<translation id="2611702650078660078">Prišlo je do napake</translation> <translation id="2612072250312279703">nadzornik dejavnosti</translation> <translation id="261210853165551493">Kopiraj z oblikovanjem</translation> <translation id="2612614436418177118">Premikanje ikone aplikacije znotraj mreže aplikacij</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Pritisnite Enter, če želite zajeti posnetek zaslona v celozaslonskem načinu</translation> <translation id="2849936225196189499">Kritično</translation> <translation id="2850207700020959936">Aplikacije imajo dostop do kamere</translation> +<translation id="2852045827873867442">Potrebna je internetna povezava.</translation> <translation id="2860184359326882502">Najboljše ujemanje</translation> <translation id="2865888419503095837">Podatki o omrežju</translation> <translation id="2869095047958348710">Pretekli/-a <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Geslo za <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Trgovina Play</translation> <translation id="4778095205580009397">Pomočnik Google ni na voljo v predstavitveni seji.</translation> +<translation id="4781633367688946589">Nadaljuj v novi seji</translation> <translation id="4785412405516449976">Samo stiki z računom Google</translation> <translation id="4789348252524569426">Datotek za govor ni mogoče namestiti. Napravo je treba posodobiti. Znova zaženite napravo in poskusite znova.</translation> <translation id="478959186716341421">Predvajanje</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Sledenje učinkovitosti delovanja je omogočeno</translation> <translation id="5955304353782037793">prog</translation> <translation id="5958529069007801266">Nadzorovani uporabnik</translation> +<translation id="5959471481388474538">Omrežje ni na voljo</translation> <translation id="596035801491797438">Izklopi upravljanje z obrazom</translation> <translation id="5960410286721553511">Oglejte si nedavne fotografije in predstavnost telefona.</translation> <translation id="5965524703725988602">Preklop temne teme. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Prikaz nastavitev dostopnosti, funkcija »<ph name="ENABLED_FEATURES" />« je omogočena.</translation> <translation id="7946681191253332687">Na voljo so razširjene varnostne posodobitve</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> želi uporabljati napravo <ph name="DEVICE_NAME" />.</translation> +<translation id="7948239795436419268">Ne obnovi oken</translation> <translation id="7951630946012935453">Zatemnitev tipkovnice</translation> <translation id="7953176344218790168">VELIKE ČRKE</translation> <translation id="7953994493035617347">Želite potrditi novo ločljivost?</translation>
diff --git a/ash/strings/ash_strings_sq.xtb b/ash/strings/ash_strings_sq.xtb index 1adc2665..607062d 100644 --- a/ash/strings/ash_strings_sq.xtb +++ b/ash/strings/ash_strings_sq.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Niveli aktual i baterisë <ph name="BATTERY_PERCENTAGE" />%, koha e mbetur <ph name="TIME" /></translation> <translation id="1178581264944972037">Pauzë</translation> <translation id="1179776263021875437">Ndalo fokusimin në një detyrë</translation> +<translation id="1180117276105724040">Po restaurohen dritaret nga seanca jote e mëparshme...</translation> <translation id="1181037720776840403">Hiq</translation> <translation id="1182225749592316782">Kjo lejon qasjen për të gjitha aplikacionet dhe uebsajtet që kanë lejen për kamerën dhe mikrofonin</translation> <translation id="1182876754474670069">tasti Home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Të ndryshohet burimi i audios?</translation> <translation id="1505542291183484463">Ndrysho përmasat e dritares me pllakëza në drejtimin poshtë</translation> <translation id="1510238584712386396">Nisësi</translation> +<translation id="1519090060276706457">Restaurimi i dritareve po zgjat më shumë nga sa pritej</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Shfaq cilësimet e njoftimeve. Njoftimet janë joaktive për një aplikacion}other{Shfaq cilësimet e njoftimeve. Njoftimet janë joaktive për # aplikacione}}</translation> <translation id="1521655867290435174">Fletët e Google</translation> <translation id="1523032696246003">Bateria <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> deri në karikimin e plotë</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Ndërro mes madhësisë maksimale ose aktuale të dritares në modalitetin "figurë brenda figurës"</translation> <translation id="1787955149152357925">Joaktive</translation> <translation id="1796561540704213354">Uebsajtet duke përfshirë faqet që ke vizituar dhe faqet e hapura</translation> +<translation id="1799852120691957794">Dritaret nga seanca jote e mëparshme nuk mund të restaurohen</translation> <translation id="1805407494113167797">Tingujt e "Fokusit" nuk mund të luheshin</translation> <translation id="181103072419391116">Fuqia e sinjalit <ph name="SIGNAL_STRENGTH" />, menaxhuar nga administratori yt</translation> <translation id="1815039896005206046">Opsioni i gishtave poshtë do të tregojë se nuk të pëlqen ky grup i sugjeruar</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Nxirr një pamje ekrani për dritaren</translation> <translation id="2598725286293895280">Aplikacione të pambështetura në tavolinën e punës</translation> <translation id="2607678425161541573">Kërkohet identifikim online</translation> +<translation id="2611702650078660078">Ndodhi një gabim</translation> <translation id="2612072250312279703">monitori i aktivitetit</translation> <translation id="261210853165551493">Kopjo me formatimin</translation> <translation id="2612614436418177118">Zhvendos një ikonë aplikacioni në rrjetën e aplikacioneve</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Shtyp "Enter" për të nxjerrë pamjen e ekranit në ekran të plotë</translation> <translation id="2849936225196189499">Vendimtar</translation> <translation id="2850207700020959936">Aplikacionet nuk mund të qasen te kamera</translation> +<translation id="2852045827873867442">Kërkohet lidhja e internetit.</translation> <translation id="2860184359326882502">Përputhja më e mirë</translation> <translation id="2865888419503095837">Informacioni i rrjetit</translation> <translation id="2869095047958348710">Ditën <ph name="DAY_OF_WEEK" /> të kaluar</translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Fjalëkalimi për <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Dyqani i Play</translation> <translation id="4778095205580009397">"Asistenti i Google" nuk ofrohet në një sesion demonstrimi.</translation> +<translation id="4781633367688946589">Vazhdo te seanca e re</translation> <translation id="4785412405516449976">Vetëm kontaktet e tua me një "Llogari të Google"</translation> <translation id="4789348252524569426">Skedarët e ligjërimit nuk mund të instalohen. Pajisja jote ka nevojë që të përditësohet. Rinise pajisjen dhe provo përsëri.</translation> <translation id="478959186716341421">Po transmeton</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Gjurmimi i rendimentit u aktivizua</translation> <translation id="5955304353782037793">aplikacion</translation> <translation id="5958529069007801266">Përdorues i mbikëqyrur</translation> +<translation id="5959471481388474538">Rrjeti nuk ofrohet</translation> <translation id="596035801491797438">Çaktivizo "Kontrollin me anë të fytyrës"</translation> <translation id="5960410286721553511">Shiko fotografitë dhe mediat më të fundit të telefonit tënd</translation> <translation id="5965524703725988602">Aktivizo/çaktivizo "Temën e errët". <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Shfaq cilësimet e qasshmërisë, "<ph name="ENABLED_FEATURES" />" u aktivizua.</translation> <translation id="7946681191253332687">Ofrohen përditësime të sigurisë për një periudhë të zgjatur</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> dëshiron të përdorë <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Mos i restauro dritaret</translation> <translation id="7951630946012935453">Errëso tastierën</translation> <translation id="7953176344218790168">SHKRONJA KAPITALE</translation> <translation id="7953994493035617347">Të konfirmohet rezolucioni i ri?</translation>
diff --git a/ash/strings/ash_strings_sr-Latn.xtb b/ash/strings/ash_strings_sr-Latn.xtb index f710508..2cf69b6 100644 --- a/ash/strings/ash_strings_sr-Latn.xtb +++ b/ash/strings/ash_strings_sr-Latn.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Aktuelni nivo baterije je <ph name="BATTERY_PERCENTAGE" />%, preostalo još <ph name="TIME" /></translation> <translation id="1178581264944972037">Pauziraj</translation> <translation id="1179776263021875437">Prestanite da se fokusirate na zadatak</translation> +<translation id="1180117276105724040">Vraćaju se prozori iz prethodne sesije…</translation> <translation id="1181037720776840403">Ukloni</translation> <translation id="1182225749592316782">Ovo omogućava pristup svim aplikacijama i veb-sajtovima koji imaju dozvole za kameru i mikrofon</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Želite da promenite izvor zvuka?</translation> <translation id="1505542291183484463">Pomerite prozor promenljive veličine u obliku pločice nadole</translation> <translation id="1510238584712386396">Pokretač</translation> +<translation id="1519090060276706457">Vraćanje prozora traje duže nego što je očekivano</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Pregledajte podešavanja obaveštenja. Obaveštenja su isključena za jednu aplikaciju}one{Pregledajte podešavanja obaveštenja. Obaveštenja su isključena za # aplikaciju}few{Pregledajte podešavanja obaveštenja. Obaveštenja su isključena za # aplikacije}other{Pregledajte podešavanja obaveštenja. Obaveštenja su isključena za # aplikacija}}</translation> <translation id="1521655867290435174">Google tabele</translation> <translation id="1523032696246003">Baterija <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> do kraja punjenja</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Prebacujte između maksimalne ili aktuelne veličine prozora slike u slici</translation> <translation id="1787955149152357925">Isključeno</translation> <translation id="1796561540704213354">Veb-sajtovi, uključujući stranice koje ste posetili i otvorili</translation> +<translation id="1799852120691957794">Vraćanje prozora iz prethodne sesije nije uspelo</translation> <translation id="1805407494113167797">Puštanje Fokus zvukova nije uspelo</translation> <translation id="181103072419391116">Jačina signala <ph name="SIGNAL_STRENGTH" />, upravlja administrator</translation> <translation id="1815039896005206046">Opcija Ne sviđa mi se šalje povratne informacije da vam se ova predložena grupa ne sviđa</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Napravite snimak ekrana prozora</translation> <translation id="2598725286293895280">Nepodržane aplikacije na radnoj površini</translation> <translation id="2607678425161541573">Onlajn prijavljivanje je obavezno</translation> +<translation id="2611702650078660078">Došlo je do greške</translation> <translation id="2612072250312279703">nadgledanje aktivnosti</translation> <translation id="261210853165551493">Kopiraj sa formatiranjem</translation> <translation id="2612614436418177118">Premestite ikonu aplikacije unutar mreže aplikacije</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Pritisnite Enter da biste napravili snimak celog ekrana</translation> <translation id="2849936225196189499">Od presudne važnosti</translation> <translation id="2850207700020959936">Aplikacije mogu da pristupaju kameri</translation> +<translation id="2852045827873867442">Treba vam internet veza.</translation> <translation id="2860184359326882502">Najbolje podudaranje</translation> <translation id="2865888419503095837">Informacije o mreži</translation> <translation id="2869095047958348710">Prošlog/prošle: <ph name="DAY_OF_WEEK" /></translation> @@ -1216,6 +1221,7 @@ <translation id="4776917500594043016">Lozinka za <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play prodavnica</translation> <translation id="4778095205580009397">Google pomoćnik nije dostupan u sesiji demonstracije.</translation> +<translation id="4781633367688946589">Pređi na novu sesiju</translation> <translation id="4785412405516449976">Samo kontakti sa Google nalogom</translation> <translation id="4789348252524569426">Instaliranje fajlova za govor nije uspelo. Uređaj treba da se ažurira. Restartujte uređaj i probajte ponovo.</translation> <translation id="478959186716341421">Prebacuje se</translation> @@ -1604,6 +1610,7 @@ <translation id="595202126637698455">Praćenje učinka je omogućeno</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Korisnik pod nadzorom</translation> +<translation id="5959471481388474538">Mreža nije dostupna</translation> <translation id="596035801491797438">Isključite Upravljanje licem</translation> <translation id="5960410286721553511">Pregledajte nedavne slike i medijski sadržaj sa telefona</translation> <translation id="5965524703725988602">Uključite/isključite tamnu temu. <ph name="STATE_TEXT" />.</translation> @@ -2254,6 +2261,7 @@ <translation id="7945357288295809525">Prikažite podešavanja pristupačnosti, „<ph name="ENABLED_FEATURES" />“ je omogućeno.</translation> <translation id="7946681191253332687">Dostupna su proširena bezbednosna ažuriranja</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> želi da koristi uređaj <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Ne vraćaj prozore</translation> <translation id="7951630946012935453">Zatamni tastaturu</translation> <translation id="7953176344218790168">VELIKA SLOVA</translation> <translation id="7953994493035617347">Želite da potvrdite novu rezoluciju?</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb index 50fd22e..37e8082 100644 --- a/ash/strings/ash_strings_sr.xtb +++ b/ash/strings/ash_strings_sr.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Актуелни ниво батерије је <ph name="BATTERY_PERCENTAGE" />%, преостало још <ph name="TIME" /></translation> <translation id="1178581264944972037">Паузирај</translation> <translation id="1179776263021875437">Престаните да се фокусирате на задатак</translation> +<translation id="1180117276105724040">Враћају се прозори из претходне сесије…</translation> <translation id="1181037720776840403">Уклони</translation> <translation id="1182225749592316782">Ово омогућава приступ свим апликацијама и веб-сајтовима који имају дозволе за камеру и микрофон</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Желите да промените извор звука?</translation> <translation id="1505542291183484463">Померите прозор променљиве величине у облику плочице надоле</translation> <translation id="1510238584712386396">Покретач</translation> +<translation id="1519090060276706457">Враћање прозора траје дуже него што је очекивано</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Прегледајте подешавања обавештења. Обавештења су искључена за једну апликацију}one{Прегледајте подешавања обавештења. Обавештења су искључена за # апликацију}few{Прегледајте подешавања обавештења. Обавештења су искључена за # апликације}other{Прегледајте подешавања обавештења. Обавештења су искључена за # апликација}}</translation> <translation id="1521655867290435174">Google табеле</translation> <translation id="1523032696246003">Батерија <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> до краја пуњења</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Пребацујте између максималне или актуелне величине прозора слике у слици</translation> <translation id="1787955149152357925">Искључено</translation> <translation id="1796561540704213354">Веб-сајтови, укључујући странице које сте посетили и отворили</translation> +<translation id="1799852120691957794">Враћање прозора из претходне сесије није успело</translation> <translation id="1805407494113167797">Пуштање Фокус звукова није успело</translation> <translation id="181103072419391116">Јачина сигнала <ph name="SIGNAL_STRENGTH" />, управља администратор</translation> <translation id="1815039896005206046">Опција Не свиђа ми се шаље повратне информације да вам се ова предложена група не свиђа</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Направите снимак екрана прозора</translation> <translation id="2598725286293895280">Неподржане апликације на радној површини</translation> <translation id="2607678425161541573">Онлајн пријављивање је обавезно</translation> +<translation id="2611702650078660078">Дошло је до грешке</translation> <translation id="2612072250312279703">надгледање активности</translation> <translation id="261210853165551493">Копирај са форматирањем</translation> <translation id="2612614436418177118">Преместите икону апликације унутар мреже апликације</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Притисните Enter да бисте направили снимак целог екрана</translation> <translation id="2849936225196189499">Од пресудне важности</translation> <translation id="2850207700020959936">Апликације могу да приступају камери</translation> +<translation id="2852045827873867442">Треба вам интернет веза.</translation> <translation id="2860184359326882502">Најбоље подударање</translation> <translation id="2865888419503095837">Информације о мрежи</translation> <translation id="2869095047958348710">Прошлог/прошле: <ph name="DAY_OF_WEEK" /></translation> @@ -1216,6 +1221,7 @@ <translation id="4776917500594043016">Лозинка за <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play продавница</translation> <translation id="4778095205580009397">Google помоћник није доступан у сесији демонстрације.</translation> +<translation id="4781633367688946589">Пређи на нову сесију</translation> <translation id="4785412405516449976">Само контакти са Google налогом</translation> <translation id="4789348252524569426">Инсталирање фајлова за говор није успело. Уређај треба да се ажурира. Рестартујте уређај и пробајте поново.</translation> <translation id="478959186716341421">Пребацује се</translation> @@ -1604,6 +1610,7 @@ <translation id="595202126637698455">Праћење учинка је омогућено</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Корисник под надзором</translation> +<translation id="5959471481388474538">Мрежа није доступна</translation> <translation id="596035801491797438">Искључите Управљање лицем</translation> <translation id="5960410286721553511">Прегледајте недавне слике и медијски садржај са телефона</translation> <translation id="5965524703725988602">Укључите/искључите тамну тему. <ph name="STATE_TEXT" />.</translation> @@ -2254,6 +2261,7 @@ <translation id="7945357288295809525">Прикажите подешавања приступачности, „<ph name="ENABLED_FEATURES" />“ је омогућено.</translation> <translation id="7946681191253332687">Доступна су проширена безбедносна ажурирања</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> жели да користи уређај <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Не враћај прозоре</translation> <translation id="7951630946012935453">Затамни тастатуру</translation> <translation id="7953176344218790168">ВЕЛИКА СЛОВА</translation> <translation id="7953994493035617347">Желите да потврдите нову резолуцију?</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb index 1bd0b8c1..c1ef69b 100644 --- a/ash/strings/ash_strings_sv.xtb +++ b/ash/strings/ash_strings_sv.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Aktuell batterinivå: <ph name="BATTERY_PERCENTAGE" /> %, <ph name="TIME" /> kvar</translation> <translation id="1178581264944972037">Paus</translation> <translation id="1179776263021875437">Sluta fokusera på uppgiften</translation> +<translation id="1180117276105724040">Återställer fönster från din senaste session …</translation> <translation id="1181037720776840403">Ta bort</translation> <translation id="1182225749592316782">Detta ger åtkomst för alla appar och webbplatser med kamera- och mikrofonbehörighet</translation> <translation id="1182876754474670069">hem</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Vill du byta ljudkälla?</translation> <translation id="1505542291183484463">Flytta storleksändrat rutat fönster nedåt</translation> <translation id="1510238584712386396">Starttangent</translation> +<translation id="1519090060276706457">Det tar längre tid än väntat att återställa fönster</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Visa aviseringsinställningar. Aviseringar har inaktiverats för 1 app}other{Visa aviseringsinställningar. Aviseringar har inaktiverats för # appar}}</translation> <translation id="1521655867290435174">Google Kalkylark</translation> <translation id="1523032696246003">Batteri <ph name="BATTERY_PERCENTAGE" /> % | <ph name="TIME" /> tills batteriet är fulladdat</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Växla mellan största tillåtna och aktuell storlek på bild-i-bild-fönstret</translation> <translation id="1787955149152357925">Av</translation> <translation id="1796561540704213354">Webbplatser, inklusive sidor som du har besökt och öppna sidor</translation> +<translation id="1799852120691957794">Det gick inte att återställa fönster från din senaste session</translation> <translation id="1805407494113167797">Det gick inte att spela upp fokusljud</translation> <translation id="181103072419391116">Signalstyrka <ph name="SIGNAL_STRENGTH" />, hanteras av administratören</translation> <translation id="1815039896005206046">Om du trycker på Gillar inte skickar du feedback om att du inte gillar den här föreslagna gruppen</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Ta en skärmbild av fönstret</translation> <translation id="2598725286293895280">Det finns appar som inte stöds på skrivbordet</translation> <translation id="2607678425161541573">Onlineinloggning krävs</translation> +<translation id="2611702650078660078">Något gick fel</translation> <translation id="2612072250312279703">aktivitetskontroll</translation> <translation id="261210853165551493">Kopiera med formatering</translation> <translation id="2612614436418177118">Flytta en appikon i rutnätet för appar</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Tryck på retur för att ta en skärmbild av hela skärmen</translation> <translation id="2849936225196189499">Kritiskt</translation> <translation id="2850207700020959936">Appar har åtkomst till kameran</translation> +<translation id="2852045827873867442">Internetanslutning krävs.</translation> <translation id="2860184359326882502">Bästa träffen</translation> <translation id="2865888419503095837">Nätverksinformation</translation> <translation id="2869095047958348710">I <ph name="DAY_OF_WEEK" />s</translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Lösenord för <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Butik</translation> <translation id="4778095205580009397">Google Assistent är inte tillgänglig i en demosession.</translation> +<translation id="4781633367688946589">Fortsätt till ny session</translation> <translation id="4785412405516449976">Endast kontakter med ett Google-konto</translation> <translation id="4789348252524569426">Det gick inte att installera ljudfiler. Enheten måste uppdateras. Starta om enheten och försök igen.</translation> <translation id="478959186716341421">Castar</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Resultatspårning aktiverat</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Kontrollerad användare</translation> +<translation id="5959471481388474538">Nätverket är inte tillgängligt</translation> <translation id="596035801491797438">Inaktivera ansiktsstyrning</translation> <translation id="5960410286721553511">Visa de senaste bilderna och mediefilerna från telefonen</translation> <translation id="5965524703725988602">Aktivera och inaktivera Mörkt tema. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Visa tillgänglighetsinställningar. <ph name="ENABLED_FEATURES" /> har aktiverats.</translation> <translation id="7946681191253332687">Utökade säkerhetsuppdateringar är tillgängliga</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> vill använda din <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Återställ inte fönster</translation> <translation id="7951630946012935453">Gör tangentbordets belysning svagare</translation> <translation id="7953176344218790168">VERSALER</translation> <translation id="7953994493035617347">Vill du bekräfta den nya upplösningen?</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index 08dbd86..457cae6 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Kiwango cha sasa cha betri ni asilimia <ph name="BATTERY_PERCENTAGE" />, zimesalia <ph name="TIME" /></translation> <translation id="1178581264944972037">Sitisha</translation> <translation id="1179776263021875437">Acha kuangazia jukumu</translation> +<translation id="1180117276105724040">Inarejesha madirisha kutoka kwenye kipindi chako cha awali...</translation> <translation id="1181037720776840403">Ondoa</translation> <translation id="1182225749592316782">Hatua hii huruhusu ufikiaji wa programu na tovuti zote zilizo na ruhusa za kamera na maikrofoni</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Ungependa kubadilisha chanzo cha sauti?</translation> <translation id="1505542291183484463">Imefunika dirisha la kubadilisha ukubwa katika upande wa chini</translation> <translation id="1510238584712386396">Kizindua</translation> +<translation id="1519090060276706457">Hatua ya kurejesha madirisha inachukua muda mrefu zaidi kuliko inavyotarajiwa</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Onyesha mipangilio ya arifa. Umezima arifa katika programu moja}other{Onyesha mipangilio ya arifa. Umezima arifa katika programu #}}</translation> <translation id="1521655867290435174">Majedwali ya Google</translation> <translation id="1523032696246003">Chaji ni <ph name="BATTERY_PERCENTAGE" />% | zimesalia <ph name="TIME" /> ijae</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Badilisha kati ya ukubwa wa sasa na wa juu zaidi unaoruhusiwa wa dirisha la kupachika picha ndani ya picha nyingine</translation> <translation id="1787955149152357925">Yamezimwa</translation> <translation id="1796561540704213354">Tovuti zinajumuisha kurasa ulizotembelea na kurasa zilizofunguliwa</translation> +<translation id="1799852120691957794">Imeshindwa kurejesha madirisha kutoka kwenye kipindi chako cha awali</translation> <translation id="1805407494113167797">Imeshindwa kucheza sauti za hali ya Kumakinika</translation> <translation id="181103072419391116">Uthabiti wa Mtandao <ph name="SIGNAL_STRENGTH" />, Unadhibitiwa na Msimamizi wako</translation> <translation id="1815039896005206046">Kubonyeza Sijakipenda kutatuma maoni kuwa hujapenda kikundi hiki kilichopendekezwa</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Piga picha ya skrini ya dirisha</translation> <translation id="2598725286293895280">Programu zisizotumika katika eneokazi</translation> <translation id="2607678425161541573">Unahitaji kuingia katika akaunti mtandaoni</translation> +<translation id="2611702650078660078">Hitilafu fulani imetokea</translation> <translation id="2612072250312279703">kifuatilia shughuli</translation> <translation id="261210853165551493">Nakili ikiwa na muundo</translation> <translation id="2612614436418177118">Sogeza aikoni ya programu katika gridi ya programu</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Bonyeza enter ili upige picha ya skrini nzima</translation> <translation id="2849936225196189499">Muhimu</translation> <translation id="2850207700020959936">Programu zinaweza kufikia kamera</translation> +<translation id="2852045827873867442">Muunganisho wa intaneti unahitajika.</translation> <translation id="2860184359326882502">Inayolingana Zaidi</translation> <translation id="2865888419503095837">Maelezo ya mtandao</translation> <translation id="2869095047958348710"><ph name="DAY_OF_WEEK" /> hii iliyopita</translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Nenosiri la <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Duka la Google Play</translation> <translation id="4778095205580009397">Programu ya Mratibu wa Google haipatikani katika kipindi cha onyesho.</translation> +<translation id="4781633367688946589">Endelea kwenye kipindi kipya</translation> <translation id="4785412405516449976">Unaowasiliana nao pekee walio na Akaunti ya Google</translation> <translation id="4789348252524569426">Imeshindwa kusakinisha faili za matamshi. Unahitaji kusasisha kifaa chako. Zima kisha uwashe kifaa chako na ujaribu tena.</translation> <translation id="478959186716341421">Inatuma</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Ufuatiliaji wa utendaji umewashwa</translation> <translation id="5955304353782037793">programu</translation> <translation id="5958529069007801266">Mtumiaji anayesimamiwa</translation> +<translation id="5959471481388474538">Mtandao haupatikani</translation> <translation id="596035801491797438">Zima kipengele cha Kutumia kwa uso</translation> <translation id="5960410286721553511">Tazama picha na maudhui ya hivi karibuni ya simu yako</translation> <translation id="5965524703725988602">Zima au uwashe Mandhari meusi. <ph name="STATE_TEXT" />.</translation> @@ -2253,6 +2260,7 @@ <translation id="7945357288295809525">Onyesha mipangilio ya ufikivu, "<ph name="ENABLED_FEATURES" />" imewashwa.</translation> <translation id="7946681191253332687">Masasisho ya kina ya usalama yanapatikana</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> inataka kutumia <ph name="DEVICE_NAME" /> yako</translation> +<translation id="7948239795436419268">Usirejeshe madirisha</translation> <translation id="7951630946012935453">Fifisha kibodi</translation> <translation id="7953176344218790168">HERUFI KUBWA</translation> <translation id="7953994493035617347">Ungependa kuthibitisha ubora mwingine?</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb index 38fce83..bab5420 100644 --- a/ash/strings/ash_strings_ta.xtb +++ b/ash/strings/ash_strings_ta.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">தற்போதைய பேட்டரி நிலை <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> இல் காலியாகிவிடும்</translation> <translation id="1178581264944972037">இடைநிறுத்து</translation> <translation id="1179776263021875437">பணியில் கவனம் செலுத்துவதை நிறுத்தும்</translation> +<translation id="1180117276105724040">உங்களின் முந்தைய அமர்வில் இருந்து சாளரங்களை மீட்டெடுக்கிறது...</translation> <translation id="1181037720776840403">அகற்று</translation> <translation id="1182225749592316782">கேமரா, மைக்ரோஃபோனைப் பயன்படுத்த அனுமதி கேட்கும் ஆப்ஸ் மற்றும் இணையதளங்கள் அனைத்திற்கும் அணுகலை இது வழங்கும்</translation> <translation id="1182876754474670069">முகப்பு</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">ஆடியோ சாதனத்தை மாற்றவா?</translation> <translation id="1505542291183484463">கட்டக் காட்சிச் சாளரத்தைக் கீழ்ப்புறம் இழுக்க</translation> <translation id="1510238584712386396">துவக்கி</translation> +<translation id="1519090060276706457">சாளரங்களை மீட்டெடுக்க எதிர்பார்த்ததைவிட அதிக நேரம் எடுக்கிறது</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{அறிவிப்பு அமைப்புகளைக் காண்பிக்கும். ஒரு ஆப்ஸுக்கு அறிவிப்புகள் முடக்கப்பட்டுள்ளன}other{அறிவிப்பு அமைப்புகளைக் காண்பிக்கும். # ஆப்ஸுக்கு அறிவிப்புகள் முடக்கப்பட்டுள்ளன}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">பேட்டரி <ph name="BATTERY_PERCENTAGE" />% | முழுமையாகச் சார்ஜ் ஆக <ph name="TIME" /> ஆகும்</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">பிக்ச்சர்-இன்-பிக்ச்சர் சாளரத்தின் அதிகபட்ச அளவுக்கும் தற்போதைய அளவுக்கும் இடையே மாறலாம்</translation> <translation id="1787955149152357925">முடக்கு</translation> <translation id="1796561540704213354">நீங்கள் பார்வையிட்ட பக்கங்கள் மற்றும் திறந்துள்ள பக்கங்களை உள்ளடக்கிய இணையதளங்கள்</translation> +<translation id="1799852120691957794">உங்களின் முந்தைய அமர்வில் இருந்து சாளரங்களை மீட்டெடுக்க முடியவில்லை</translation> <translation id="1805407494113167797">ஃபோகஸ் பயன்முறைக்கான ஒலிகளைப் பிளே முடியவில்லை</translation> <translation id="181103072419391116">சிக்னல் வலிமை: <ph name="SIGNAL_STRENGTH" />, உங்கள் நிர்வாகி நிர்வகிக்கிறார்</translation> <translation id="1815039896005206046">தம்ஸ்-டவுன் வழங்குவதால் இந்தக் குழுப் பரிந்துரையை நீங்கள் விரும்பவில்லை என்று கருத்து தெரிவிக்கப்படும்</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">சாளரத்தை ஸ்கிரீன்ஷாட் எடுக்கும்</translation> <translation id="2598725286293895280">டெஸ்க்கில் ஆதரிக்கப்படாத ஆப்ஸ் உள்ளன</translation> <translation id="2607678425161541573">ஆன்லைன் உள்நுழைவு அவசியம்</translation> +<translation id="2611702650078660078">பிழை ஏற்பட்டது</translation> <translation id="2612072250312279703">செயல்பாட்டுக் கண்காணிப்பு</translation> <translation id="261210853165551493">வடிவமைப்புடன் நகலெடு</translation> <translation id="2612614436418177118">ஆப்ஸ் கட்டக் காட்சியில் ஆப்ஸ் ஐகானை நகர்த்தும்</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">முழுத்திரையை ஸ்கிரீன்ஷாட் எடுக்க Enter பட்டனை அழுத்தவும்</translation> <translation id="2849936225196189499">சிக்கலான</translation> <translation id="2850207700020959936">ஆப்ஸால் கேமராவை அணுக முடியும்</translation> +<translation id="2852045827873867442">இணைய இணைப்பு தேவை.</translation> <translation id="2860184359326882502">சிறப்பாகப் பொருந்துபவை</translation> <translation id="2865888419503095837">நெட்வொர்க் தகவல்</translation> <translation id="2869095047958348710">கடந்த <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> க்கான கடவுச்சொல்</translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">டெமோ அமர்வில் Google அசிஸ்டண்ட்டைப் பயன்படுத்த முடியாது.</translation> +<translation id="4781633367688946589">புதிய அமர்விற்குச் செல்லுங்கள்</translation> <translation id="4785412405516449976">Google கணக்கு வைத்திருக்கும் உங்கள் தொடர்புகளுக்கு மட்டும்</translation> <translation id="4789348252524569426">பேச்சு அறிதல் ஃபைல்களை நிறுவ முடியவில்லை. உங்கள் சாதனத்தைப் புதுப்பிக்க வேண்டும். சாதனத்தை மீண்டும் தொடங்கி மறுபடியும் முயலவும்.</translation> <translation id="478959186716341421">அனுப்புகிறது</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">செயல்திறனைத் தடமறிதல் இயக்கப்பட்டுள்ளது</translation> <translation id="5955304353782037793">ஆப்ஸ்</translation> <translation id="5958529069007801266">மேற்பார்வையிடப்படும் பயனர்</translation> +<translation id="5959471481388474538">நெட்வொர்க் கிடைக்கவில்லை</translation> <translation id="596035801491797438">முகக் கட்டுப்பாட்டை முடக்கு</translation> <translation id="5960410286721553511">மொபைலில் உள்ள சமீபத்திய படங்களையும் மீடியாவையும் பார்க்கலாம்</translation> <translation id="5965524703725988602">டார்க் தீமினை இயக்கும்/முடக்கும். <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">அணுகல்தன்மை அமைப்புகளைக் காட்டும், "<ph name="ENABLED_FEATURES" />" இயக்கப்பட்டுள்ளது.</translation> <translation id="7946681191253332687">நீட்டிக்கப்பட்ட பாதுகாப்புப் புதுப்பிப்புகள் உள்ளன</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> ஆப்ஸ் உங்கள் <ph name="DEVICE_NAME" /> ஐப் பயன்படுத்த விரும்புகிறது</translation> +<translation id="7948239795436419268">சாளரங்களை மீட்டெடுக்க வேண்டாம்</translation> <translation id="7951630946012935453">கீபோர்டு வெளிச்சத்தைக் குறை</translation> <translation id="7953176344218790168">பேரெழுத்து</translation> <translation id="7953994493035617347">புதிய தெளிவுத்திறனை உறுதிப்படுத்தவா?</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb index 0be5eea..50e1185 100644 --- a/ash/strings/ash_strings_te.xtb +++ b/ash/strings/ash_strings_te.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">ప్రస్తుత బ్యాటరీ స్థాయి <ph name="BATTERY_PERCENTAGE" />%, ఛార్జ్ పూర్తిగా అయిపోవడానికి <ph name="TIME" /> మిగిలి ఉంది</translation> <translation id="1178581264944972037">పాజ్ చేయి</translation> <translation id="1179776263021875437">టాస్క్ మీద ఫోకస్ చేయడం మానేయండి</translation> +<translation id="1180117276105724040">మీ మునుపటి సెషన్ నుండి విండోలను రీస్టోర్ చేస్తోంది...</translation> <translation id="1181037720776840403">తీసివేయండి</translation> <translation id="1182225749592316782">కెమెరా, మైక్రోఫోన్ అనుమతులతో ఇది అన్ని యాప్లు, వెబ్సైట్లకు యాక్సెస్ను అనుమతిస్తుంది</translation> <translation id="1182876754474670069">వర్చువల్ హోమ్</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">ఆడియో సోర్స్ను మార్చాలా?</translation> <translation id="1505542291183484463">కింది వైపు నుండి విండో టైల్ సైజ్ మార్చండి</translation> <translation id="1510238584712386396">లాంచర్</translation> +<translation id="1519090060276706457">విండోలను రీస్టోర్ చేయడానికి ఊహించిన దానికంటే ఎక్కువ సమయం పడుతోంది</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{ నోటిఫికేషన్ సెట్టింగ్లను చూపుతుంది. యాప్ కోసం నోటిఫికేషన్లు ఆఫ్ చేయబడి ఉన్నాయి}other{ నోటిఫికేషన్ సెట్టింగ్లను చూపుతుంది. # యాప్ల కోసం నోటిఫికేషన్లు ఆఫ్ చేయబడి ఉన్నాయి}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">బ్యాటరీ <ph name="BATTERY_PERCENTAGE" />% | పూర్తిగా ఛార్జ్ అవ్వడానికి <ph name="TIME" /> సమయం మిగిలి ఉంది</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">పిక్చర్-ఇన్-పిక్చర్ విండో గరిష్ఠ సైజ్ లేదా ప్రస్తుతం ఉన్న సైజ్ మధ్య మారండి</translation> <translation id="1787955149152357925">ఆఫ్ చేయి</translation> <translation id="1796561540704213354">వెబ్సైట్లలో మీరు బ్రౌజ్ చేసిన, తెరిచిన పేజీలు ఉంటాయి</translation> +<translation id="1799852120691957794">మీ మునుపటి సెషన్ నుండి విండోలను రీస్టోర్ చేయడం సాధ్యం కాలేదు</translation> <translation id="1805407494113167797">ఫోకస్ సౌండ్లను ప్లే చేయడం సాధ్యం కాలేదు</translation> <translation id="181103072419391116">సిగ్నల్ సామర్థ్యం <ph name="SIGNAL_STRENGTH" />, మీ అడ్మినిస్ట్రేటర్ ద్వారా నిర్వహించబడుతుంది</translation> <translation id="1815039896005206046">సూచించిన గ్రూప్ను మీరు డిస్లైక్ చేస్తున్నారు అనే ఫీడ్బ్యాక్ను 'బాగా లేదు' ఆప్షన్ సబ్మిట్ చేస్తుంది</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">విండో స్క్రీన్షాట్ తీయండి</translation> <translation id="2598725286293895280">డెస్క్లో సపోర్ట్ చేయని యాప్లు</translation> <translation id="2607678425161541573">ఆన్లైన్ సైన్ ఇన్ అవసరం</translation> +<translation id="2611702650078660078">ఎర్రర్ ఏర్పడింది</translation> <translation id="2612072250312279703">యాక్టివిటీ మానిటర్</translation> <translation id="261210853165551493">ఫార్మాటింగ్తో కాపీ అయింది</translation> <translation id="2612614436418177118">యాప్ గ్రిడ్ లోపల యాప్ చిహ్నాన్ని తరలించండి</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">ఫుల్ స్క్రీన్షాట్ను క్యాప్చర్ చేయడానికి enterను నొక్కండి</translation> <translation id="2849936225196189499">క్లిష్టమైన</translation> <translation id="2850207700020959936">యాప్లు కెమెరాను యాక్సెస్ చేయగలవు</translation> +<translation id="2852045827873867442">ఇంటర్నెట్ కనెక్షన్ అవసరం.</translation> <translation id="2860184359326882502">బాగా మ్యాచ్ అయ్యే సెర్చ్ ఫలితాలు</translation> <translation id="2865888419503095837">నెట్వర్క్ సమాచారం</translation> <translation id="2869095047958348710">గత <ph name="DAY_OF_WEEK" /></translation> @@ -1216,6 +1221,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> కోసం పాస్వర్డ్</translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">Google Assistant డెమో సెషన్లో అందుబాటులో లేదు.</translation> +<translation id="4781633367688946589">కొత్త సెషన్ను కొనసాగించండి</translation> <translation id="4785412405516449976">Google ఖాతాతో ఉన్న మీ కాంటాక్ట్లు మాత్రమే కనెక్ట్ అవుతాయి</translation> <translation id="4789348252524569426">స్పీచ్ ఫైల్స్ను ఇన్స్టాల్ చేయడం సాధ్యం కాదు. మీ డివైజ్ను అప్డేట్ చేయాలి. మీ డివైజ్ను రీస్టార్ట్ చేసి, ఆపై మళ్లీ ట్రై చేయండి.</translation> <translation id="478959186716341421">ప్రసారం చేస్తున్నాము</translation> @@ -1604,6 +1610,7 @@ <translation id="595202126637698455">పనితీరుని గుర్తించడం ప్రారంభించబడింది</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">పర్యవేక్షించబడే వినియోగదారు</translation> +<translation id="5959471481388474538">నెట్వర్క్ అందుబాటులో లేదు</translation> <translation id="596035801491797438">ఫేస్ కంట్రోల్ను ఆఫ్ చేయండి</translation> <translation id="5960410286721553511">మీ ఫోన్లోని తాజా ఫోటోలు, మీడియాను చూడండి</translation> <translation id="5965524703725988602">ముదురు రంగు రూపాన్ని టోగుల్ చేయండి. <ph name="STATE_TEXT" />.</translation> @@ -2253,6 +2260,7 @@ <translation id="7945357288295809525">యాక్సెసిబిలిటీ సెట్టింగ్లను చూపించండి, "<ph name="ENABLED_FEATURES" />" ఎనేబుల్ చేయబడింది.</translation> <translation id="7946681191253332687">ఎక్స్టెండ్ సెక్యూరిటీ అప్డేట్లు అందుబాటులో ఉన్నాయి</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> యాప్ మీ <ph name="DEVICE_NAME" />ను ఉపయోగించాలనుకుంటుంది</translation> +<translation id="7948239795436419268">విండోలను రీస్టోర్ చేయవద్దు</translation> <translation id="7951630946012935453">కీబోర్డ్ బ్రైట్నెస్ కాంతిని తగ్గించండి</translation> <translation id="7953176344218790168">అప్పర్ కేస్</translation> <translation id="7953994493035617347">కొత్త రిజల్యూషన్ను నిర్ధారించాలా?</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb index 07616ca..d3f9b0ea 100644 --- a/ash/strings/ash_strings_th.xtb +++ b/ash/strings/ash_strings_th.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">ระดับแบตเตอรี่ปัจจุบัน <ph name="BATTERY_PERCENTAGE" />% ใช้ได้อีก <ph name="TIME" /></translation> <translation id="1178581264944972037">หยุดชั่วคราว</translation> <translation id="1179776263021875437">หยุดการโฟกัสงาน</translation> +<translation id="1180117276105724040">กำลังคืนค่าหน้าต่างจากเซสชันก่อนหน้า...</translation> <translation id="1181037720776840403">นำออก</translation> <translation id="1182225749592316782">การดำเนินการนี้ช่วยให้แอปและเว็บไซต์ทั้งหมดที่มีสิทธิ์สามารถเข้าถึงกล้องและไมโครโฟนได้</translation> <translation id="1182876754474670069">Home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">เปลี่ยนแหล่งที่มาของเสียงไหม</translation> <translation id="1505542291183484463">ปรับขนาดหน้าต่างแบบเรียงต่อกันลงด้านล่าง</translation> <translation id="1510238584712386396">ตัวเรียกใช้งาน</translation> +<translation id="1519090060276706457">การคืนค่าหน้าต่างใช้เวลานานกว่าที่คาดไว้</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{แสดงการตั้งค่าการแจ้งเตือน ปิดการแจ้งเตือนไว้สำหรับ 1 แอป}other{แสดงการตั้งค่าการแจ้งเตือน ปิดการแจ้งเตือนไว้สำหรับ # แอป}}</translation> <translation id="1521655867290435174">Google ชีต</translation> <translation id="1523032696246003">แบตเตอรี่ <ph name="BATTERY_PERCENTAGE" />% | อีก <ph name="TIME" /> จะเต็ม</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">สลับระหว่างขนาดสูงสุดหรือขนาดปัจจุบันของหน้าต่างการแสดงภาพซ้อนภาพ</translation> <translation id="1787955149152357925">ปิด</translation> <translation id="1796561540704213354">เว็บไซต์จะรวมหน้าเว็บที่คุณเคยเข้าชมและหน้าเว็บที่เคยเปิด</translation> +<translation id="1799852120691957794">กู้คืนหน้าต่างจากเซสชันก่อนหน้าไม่ได้</translation> <translation id="1805407494113167797">เล่นเสียงโหมดโฟกัสไม่ได้</translation> <translation id="181103072419391116">ความแรงสัญญาณ <ph name="SIGNAL_STRENGTH" />, จัดการโดยผู้ดูแลระบบ</translation> <translation id="1815039896005206046">ปุ่ม "ไม่ชอบ" จะส่งความคิดเห็นว่าคุณไม่ชอบกลุ่มที่แนะนำนี้</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">ถ่ายภาพหน้าจอของหน้าต่าง</translation> <translation id="2598725286293895280">แอปที่ไม่รองรับในเดสก์</translation> <translation id="2607678425161541573">ต้องลงชื่อเข้าใช้ออนไลน์</translation> +<translation id="2611702650078660078">เกิดข้อผิดพลาด</translation> <translation id="2612072250312279703">เครื่องมือตรวจสอบกิจกรรม</translation> <translation id="261210853165551493">คัดลอกพร้อมการจัดรูปแบบ</translation> <translation id="2612614436418177118">ย้ายไอคอนแอปภายในตารางกริดสำหรับแอป</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">กด Enter เพื่อจับภาพแบบเต็มหน้าจอ</translation> <translation id="2849936225196189499">สำคัญ</translation> <translation id="2850207700020959936">แอปเข้าถึงกล้องได้</translation> +<translation id="2852045827873867442">ต้องมีการเชื่อมต่ออินเทอร์เน็ต</translation> <translation id="2860184359326882502">ตรงที่สุด</translation> <translation id="2865888419503095837">ข้อมูลเครือข่าย</translation> <translation id="2869095047958348710"><ph name="DAY_OF_WEEK" />ที่ผ่านมานี้</translation> @@ -1210,6 +1215,7 @@ <translation id="4776917500594043016">รหัสผ่านของ <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">Google Assistant ไม่พร้อมใช้งานในเซสชันสาธิต</translation> +<translation id="4781633367688946589">ดำเนินการต่อไปยังเซสชันใหม่</translation> <translation id="4785412405516449976">เฉพาะรายชื่อติดต่อที่มีบัญชี Google</translation> <translation id="4789348252524569426">ติดตั้งไฟล์คำพูดไม่ได้ คุณต้องอัปเดตอุปกรณ์ รีสตาร์ทอุปกรณ์และลองอีกครั้ง</translation> <translation id="478959186716341421">กำลังแคสต์</translation> @@ -1598,6 +1604,7 @@ <translation id="595202126637698455">เปิดใช้งานการติดตามการปฏิบัติงานแล้ว</translation> <translation id="5955304353782037793">แอป</translation> <translation id="5958529069007801266">ผู้ใช้ภายใต้การควบคุมดูแล</translation> +<translation id="5959471481388474538">เครือข่ายไม่สามารถใช้งานได้</translation> <translation id="596035801491797438">ปิดการควบคุมด้วยใบหน้า</translation> <translation id="5960410286721553511">ดูรูปภาพและสื่อล่าสุดของโทรศัพท์</translation> <translation id="5965524703725988602">เปิด/ปิดธีมมืด <ph name="STATE_TEXT" /></translation> @@ -2247,6 +2254,7 @@ <translation id="7945357288295809525">แสดงการตั้งค่าการช่วยเหลือพิเศษที่เปิดใช้ "<ph name="ENABLED_FEATURES" />"</translation> <translation id="7946681191253332687">มีการอัปเดตความปลอดภัยเพิ่มเติม</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> ต้องการใช้ <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">ไม่คืนค่าหน้าต่าง</translation> <translation id="7951630946012935453">หรี่แสงแป้นพิมพ์</translation> <translation id="7953176344218790168">ตัวพิมพ์ใหญ่</translation> <translation id="7953994493035617347">ยืนยันความละเอียดใหม่ไหม</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb index bf816a6a1..8c4af22 100644 --- a/ash/strings/ash_strings_tr.xtb +++ b/ash/strings/ash_strings_tr.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Mevcut pil seviyesi %<ph name="BATTERY_PERCENTAGE" />, <ph name="TIME" /> kaldı</translation> <translation id="1178581264944972037">Duraklat</translation> <translation id="1179776263021875437">Göreve odaklanmayı bırak</translation> +<translation id="1180117276105724040">Önceki oturumunuzdaki pencereler geri yükleniyor...</translation> <translation id="1181037720776840403">Kaldır</translation> <translation id="1182225749592316782">Bu işlem, kamera ve mikrofon izni olan tüm uygulamaların ve web sitelerinin erişmesine izin verir</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Ses kaynağı değiştirilsin mi?</translation> <translation id="1505542291183484463">Kutu içindeki yeniden boyutlandırma penceresini aşağı taşı</translation> <translation id="1510238584712386396">Başlatıcı</translation> +<translation id="1519090060276706457">Pencerelerin geri yüklenmesi beklenenden uzun sürüyor</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Bildirim ayarlarını göster. Bildirimler bir uygulama için kapalı}other{Bildirim ayarlarını göster. Bildirimler # uygulama için kapalı}}</translation> <translation id="1521655867290435174">Google E-Tablolar</translation> <translation id="1523032696246003">Pil seviyesi %<ph name="BATTERY_PERCENTAGE" /> | Tamamen dolmasına <ph name="TIME" /> kaldı</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Pencere içinde pencerenin maksimum veya mevcut boyutu arasında geçiş yapın</translation> <translation id="1787955149152357925">Kapalı</translation> <translation id="1796561540704213354">Ziyaret ettiğiniz ve açık sayfaların da dahil olduğu web siteleri</translation> +<translation id="1799852120691957794">Önceki oturumunuzdaki pencereler geri yüklenemiyor</translation> <translation id="1805407494113167797">Odaklanma sesleri çalınamadı</translation> <translation id="181103072419391116"><ph name="SIGNAL_STRENGTH" /> Sinyal Gücü, Yöneticiniz tarafından yönetiliyor</translation> <translation id="1815039896005206046">Beğenmeme düğmesini tıkladığınızda bu önerilen grubun hoşunuza gitmediğine dair geri bildirim gönderilir</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Pencerenin ekran görüntüsünü alır</translation> <translation id="2598725286293895280">Masada desteklenmeyen uygulamalar</translation> <translation id="2607678425161541573">Online oturum açma gerekli</translation> +<translation id="2611702650078660078">Bir hata oluştu</translation> <translation id="2612072250312279703">etkinlik izleme</translation> <translation id="261210853165551493">Biçimlendirmeyle kopyala</translation> <translation id="2612614436418177118">Uygulama simgesini uygulama tablosu içinde taşıyın</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Tam ekran görüntüsü almak için enter tuşuna basın</translation> <translation id="2849936225196189499">Önemli</translation> <translation id="2850207700020959936">Uygulamalar kameraya erişebilir</translation> +<translation id="2852045827873867442">İnternet bağlantısı gereklidir.</translation> <translation id="2860184359326882502">En İyi Eşleşme</translation> <translation id="2865888419503095837">Ağ bilgisi</translation> <translation id="2869095047958348710">Geçtiğimiz <ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> için şifre</translation> <translation id="4777825441726637019">Play Store</translation> <translation id="4778095205580009397">Google Asistan, demo oturumunda kullanılamaz.</translation> +<translation id="4781633367688946589">Yeni oturuma devam et</translation> <translation id="4785412405516449976">Yalnızca Google Hesabı olan kişileriniz</translation> <translation id="4789348252524569426">Konuşma dosyaları yüklenemiyor. Cihazınızın güncellenmesi gerekiyor. Cihazınızı yeniden başlatıp işlemi tekrar deneyin.</translation> <translation id="478959186716341421">Yayınlanıyor</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Performans izleme etkin</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Denetlenen kullanıcı</translation> +<translation id="5959471481388474538">Ağ kullanılamıyor</translation> <translation id="596035801491797438">Yüzle kumandayı kapat</translation> <translation id="5960410286721553511">Telefonunuzdaki son fotoğrafları ve medya içeriklerini görün</translation> <translation id="5965524703725988602">Koyu temayı aç/kapat. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Erişilebilirlik ayarlarını göster, "<ph name="ENABLED_FEATURES" />" etkin.</translation> <translation id="7946681191253332687">Genişletilmiş güvenlik güncellemeleri mevcut</translation> <translation id="7947798320695032612"><ph name="APP_NAME" />, <ph name="DEVICE_NAME" /> kullanmak istiyor</translation> +<translation id="7948239795436419268">Pencereler geri yüklenmesin</translation> <translation id="7951630946012935453">Klavyenin ışığını kısın</translation> <translation id="7953176344218790168">TÜMÜ BÜYÜK HARF</translation> <translation id="7953994493035617347">Yeni çözünürlük onaylansın mı?</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb index d00abeff..9d03f51 100644 --- a/ash/strings/ash_strings_uk.xtb +++ b/ash/strings/ash_strings_uk.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Поточний рівень заряду акумулятора: <ph name="BATTERY_PERCENTAGE" />%, залишилося: <ph name="TIME" /></translation> <translation id="1178581264944972037">Пауза</translation> <translation id="1179776263021875437">Припинити концентруватися на завданні</translation> +<translation id="1180117276105724040">Відновлення вікон із попереднього сеансу…</translation> <translation id="1181037720776840403">Видалити</translation> <translation id="1182225749592316782">Буде надано доступ для всіх додатків і веб-сайтів, які мають дозволи на доступ до камери й мікрофона</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Змінити джерело аудіо?</translation> <translation id="1505542291183484463">Зміна розміру вікна витягуванням униз у мозаїчному макеті</translation> <translation id="1510238584712386396">Панель запуску</translation> +<translation id="1519090060276706457">Відновлення вікон триває довше, ніж очікувалося</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Показати налаштування сповіщень. Сповіщення вимкнено для додатка}one{Показати налаштування сповіщень. Сповіщення вимкнено для # додатка}few{Показати налаштування сповіщень. Сповіщення вимкнено для # додатків}many{Показати налаштування сповіщень. Сповіщення вимкнено для # додатків}other{Показати налаштування сповіщень. Сповіщення вимкнено для # додатка}}</translation> <translation id="1521655867290435174">Google Таблиці</translation> <translation id="1523032696246003">Рівень заряду акумулятора: <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> до повного заряду</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Змінити розмір вікна в режимі "картинка в картинці" на максимальний або поточний</translation> <translation id="1787955149152357925">Вимкнено</translation> <translation id="1796561540704213354">Веб-сайти, зокрема відвідані й відкриті сторінки</translation> +<translation id="1799852120691957794">Не вдалося відновити вікна з попереднього сеансу</translation> <translation id="1805407494113167797">Не вдалося відтворити звуки для концентрації уваги</translation> <translation id="181103072419391116">Рівень сигналу – <ph name="SIGNAL_STRENGTH" />. Мережею керує адміністратор</translation> <translation id="1815039896005206046">За допомогою позначки "Не подобається" можна надіслати негативний відгук про запропоновану групу</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Зробити знімок екрана вікна</translation> <translation id="2598725286293895280">Непідтримувані додатки на робочому столі</translation> <translation id="2607678425161541573">Необхідно ввійти в режимі онлайн</translation> +<translation id="2611702650078660078">Сталася помилка</translation> <translation id="2612072250312279703">відстеження дій</translation> <translation id="261210853165551493">Копіювати з форматуванням</translation> <translation id="2612614436418177118">Перемістити значок додатка в сітці</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Щоб зробити знімок усього екрана, натисніть клавішу Enter</translation> <translation id="2849936225196189499">Вирішальні</translation> <translation id="2850207700020959936">Додатки мають доступ до камери</translation> +<translation id="2852045827873867442">Потрібне інтернет-з’єднання.</translation> <translation id="2860184359326882502">Найвідповідніші</translation> <translation id="2865888419503095837">Інформація про мережу</translation> <translation id="2869095047958348710"><ph name="DAY_OF_WEEK" /> цього тижня</translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Пароль користувача <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Play Маркет</translation> <translation id="4778095205580009397">Google Асистент недоступний у демонстраційному сеансі.</translation> +<translation id="4781633367688946589">Почати новий сеанс</translation> <translation id="4785412405516449976">Лише контакти, які мають обліковий запис Google</translation> <translation id="4789348252524569426">Не вдається встановити файли для розпізнавання мовлення. Потрібно оновити пристрій. Перезапустіть пристрій і повторіть спробу.</translation> <translation id="478959186716341421">Трансляція</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Відстеження ефективності ввімкнено</translation> <translation id="5955304353782037793">додаток</translation> <translation id="5958529069007801266">Контрольований користувач</translation> +<translation id="5959471481388474538">Мережа не доступна</translation> <translation id="596035801491797438">Вимкнути керування мімікою</translation> <translation id="5960410286721553511">Переглядайте останні фотографії та медіафайли з телефона</translation> <translation id="5965524703725988602">Увімкнути або вимкнути темну тему. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Показати налаштування функцій доступності; функцію "<ph name="ENABLED_FEATURES" />" увімкнено.</translation> <translation id="7946681191253332687">Доступні розширені оновлення системи безпеки</translation> <translation id="7947798320695032612">Додаток <ph name="APP_NAME" /> хоче використовувати цей пристрій: <ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">Не відновлювати вікна</translation> <translation id="7951630946012935453">Зменшити яскравість клавіатури</translation> <translation id="7953176344218790168">ВЕРХНІЙ РЕГІСТР</translation> <translation id="7953994493035617347">Підтвердити нову роздільну здатність?</translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb index 78a5f2d..c8ebe852 100644 --- a/ash/strings/ash_strings_ur.xtb +++ b/ash/strings/ash_strings_ur.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">موجودہ بیٹری لیول <ph name="BATTERY_PERCENTAGE" />فیصد، <ph name="TIME" /> باقی ہے</translation> <translation id="1178581264944972037">موقوف کریں</translation> <translation id="1179776263021875437">ٹاسک پر فوکس کرنا روکیں</translation> +<translation id="1180117276105724040">آپ کے پچھلے سیشن سے ونڈوز کو بحال کیا جا رہا ہے...</translation> <translation id="1181037720776840403">ہٹائیں</translation> <translation id="1182225749592316782">اس سے کیمرے اور مائیکروفون کی اجازتوں کے ساتھ تمام ایپس اور ویب سائٹس تک رسائی کی اجازت ملتی ہے</translation> <translation id="1182876754474670069">گھر</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">آڈیو سورس سوئچ کریں؟</translation> <translation id="1505542291183484463">ٹائل شدہ ونڈو کا سائز نیچے کی طرف بدلیں</translation> <translation id="1510238584712386396">لانچر</translation> +<translation id="1519090060276706457">ونڈوز کو بحال کرنے میں توقع سے زیادہ وقت لگ رہا ہے</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{اطلاع کی ترتیبات دکھائیں۔ اطلاعات ایک ایپ کے لیے آف ہیں}other{اطلاع کی ترتیبات دکھائیں۔ اطلاعات # ایپس کے لیے آف ہیں}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">بیٹری %<ph name="BATTERY_PERCENTAGE" /> | مکمل ہونے میں <ph name="TIME" /> باقی</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">تصویر میں تصویر ونڈو کو اس کے زیادہ سے زیادہ یا موجودہ سائز کے درمیان سوئچ کریں</translation> <translation id="1787955149152357925">آف</translation> <translation id="1796561540704213354">ویب سائٹس بشمول وہ صفحات جن کا آپ نے ملاحظہ کیا ہے اور وہ صفحات جنہیں آپ نے کھولا ہے</translation> +<translation id="1799852120691957794">آپ کے گزشتہ سیشن سے ونڈوز کو بحال نہیں کیا جا سکتا</translation> <translation id="1805407494113167797">فوکس کی آوازیں خصوصیت نہیں چلا سکے</translation> <translation id="181103072419391116">سگنل کی مضبوطی <ph name="SIGNAL_STRENGTH" />، آپ کے منتظم کے زیر انتظام ہے</translation> <translation id="1815039896005206046">اظہار ناپسندیدگی یہ تاثرات جمع کرائے گا کہ آپ کو یہ تجویز کردہ گروپ پسند نہیں ہے</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">ونڈو اسکرین شاٹ لیں</translation> <translation id="2598725286293895280">ڈیسک میں غیر تعاون یافتہ ایپس</translation> <translation id="2607678425161541573">آن لائن سائن ان کی ضرورت ہے</translation> +<translation id="2611702650078660078">ایک خرابی پیش آ گئی</translation> <translation id="2612072250312279703">سرگرمی کی نگرانی</translation> <translation id="261210853165551493">فارمیٹنگ کے ساتھ کاپی کریں</translation> <translation id="2612614436418177118">ایپ گرڈ کے اندر ایپ آئیکن منتقل کریں</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">پوری اسکرین کا اسکرین شاٹ لینے کے لیے اینٹر دبائیں</translation> <translation id="2849936225196189499">اہم</translation> <translation id="2850207700020959936">ایپس کیمرا تک رسائی حاصل کر سکتی ہیں</translation> +<translation id="2852045827873867442">انٹرنیٹ کنکشن درکار ہے۔</translation> <translation id="2860184359326882502">بہترین مماثلت</translation> <translation id="2865888419503095837">نیٹ ورک کی معلومات</translation> <translation id="2869095047958348710">اس پچھلے <ph name="DAY_OF_WEEK" /> کو</translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> کیلئے پاس ورڈ</translation> <translation id="4777825441726637019">Play اسٹور</translation> <translation id="4778095205580009397">ڈیمو سیشن میں Google اسسٹنٹ دستیاب نہیں ہے۔</translation> +<translation id="4781633367688946589">نئے سیشن میں جاری رکھیں</translation> <translation id="4785412405516449976">صرف Google اکاؤنٹ والے آپ کے رابطے</translation> <translation id="4789348252524569426">اسپیچ فائلز کو انسٹال نہیں کیا جا سکتا۔ آپ کے آلے کو اپ ڈیٹ کرنے کی ضرورت ہے۔ اپنا آلہ ری سٹارٹ کریں اور دوبارہ کوشش کریں۔</translation> <translation id="478959186716341421">کاسٹ کیا جا رہا ہے</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">کارکردگی کی ٹریسنگ فعال کر دی گئی</translation> <translation id="5955304353782037793">ایپ</translation> <translation id="5958529069007801266">تحفظ یافتہ صارف</translation> +<translation id="5959471481388474538">نیٹ ورک دستیاب نہیں ہے</translation> <translation id="596035801491797438">چہرے سے کنٹرول کو آف کریں</translation> <translation id="5960410286721553511">اپنے فون کی حالیہ تصاویر اور میڈیا دیکھیں</translation> <translation id="5965524703725988602">گہری تھیم کو ٹوگل کریں۔ <ph name="STATE_TEXT" />۔</translation> @@ -2251,6 +2258,7 @@ <translation id="7945357288295809525">ایکسیسبیلٹی کی ترتیبات دکھائیں، "<ph name="ENABLED_FEATURES" />" فعال ہے۔</translation> <translation id="7946681191253332687">توسیعی سیکیورٹی اپ ڈیٹس دستیاب ہیں</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> آپ کا <ph name="DEVICE_NAME" /> استعمال کرنا چاہتی ہے</translation> +<translation id="7948239795436419268">ونڈوز کو بحال نہ کریں</translation> <translation id="7951630946012935453">مدھم کی بورڈ</translation> <translation id="7953176344218790168">بڑے حروف</translation> <translation id="7953994493035617347">نئی ریزولیوشن کی تصدیق کریں؟</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb index c931ec6..a9898910 100644 --- a/ash/strings/ash_strings_uz.xtb +++ b/ash/strings/ash_strings_uz.xtb
@@ -57,6 +57,7 @@ <translation id="1175944128323889279">Joriy batareya quvvati: <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> qoldi</translation> <translation id="1178581264944972037">Pauza</translation> <translation id="1179776263021875437">Fokus maqsadini toʻxtatish</translation> +<translation id="1180117276105724040">Avvalgi seans oynalari tiklanmoqda...</translation> <translation id="1181037720776840403">Olib tashlash</translation> <translation id="1182225749592316782">Kamera va mikrofon ruxsatiga ega barcha ilova va saytlarga kirish imkonini beradi</translation> <translation id="1182876754474670069">home</translation> @@ -171,6 +172,7 @@ <translation id="1501946871587957338">Audio manasi almashtirilsinmi?</translation> <translation id="1505542291183484463">Oyna oʻlchamini pastga oʻzgartiradigan katakcha</translation> <translation id="1510238584712386396">Ishga tushirish paneli</translation> +<translation id="1519090060276706457">Oynalarni tiklash kutilganidan ortiq vaqt olmoqda</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Bildirishnoma sozlamalarini ochish. Ilova uchun bildirishnomalar yoqilmagan}other{Bildirishnoma sozlamalarini ochish. # ta ilova uchun bildirishnomalar yoqilmagan}}</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1523032696246003">Batareya: <ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> da toʻladi</translation> @@ -265,6 +267,7 @@ <translation id="1786487376942610288">Tasvir ustida tasvir oynasining joriy va maksimal oʻlchamini almashtirish</translation> <translation id="1787955149152357925">Oʻchiq</translation> <translation id="1796561540704213354">Saytlar, jumladan siz tashrif buyurgan va ochilgan sahifalar</translation> +<translation id="1799852120691957794">Avvalgi seans oynalarini tiklash imkonsiz</translation> <translation id="1805407494113167797">Fokus tovushlari ijro etilmadi</translation> <translation id="181103072419391116">Signal darajasi: <ph name="SIGNAL_STRENGTH" />, Administrator boshqaruvida</translation> <translation id="1815039896005206046">Salbiy baho – bu taklif etilgan guruh yoqmaganini anglatadi</translation> @@ -496,6 +499,7 @@ <translation id="2596078834055697711">Oynadan skrinshot olish</translation> <translation id="2598725286293895280">Ish stolida mos kelmaydigan ilovalar bor</translation> <translation id="2607678425161541573">Onlayn kirish zarur</translation> +<translation id="2611702650078660078">Xatolik yuz berdi</translation> <translation id="2612072250312279703">tizim monitoringi</translation> <translation id="261210853165551493">Formati bilan nusxalash</translation> <translation id="2612614436418177118">Ilova ikonkasini ilovalar jadvaliga joylash</translation> @@ -580,6 +584,7 @@ <translation id="2848120746144143659">Butun ekranni rasmga olish uchun Enter tugmasini bosing</translation> <translation id="2849936225196189499">Jiddiy</translation> <translation id="2850207700020959936">Ilovalar kameradan foydalanishi mumkin</translation> +<translation id="2852045827873867442">Internet aloqasi zarur.</translation> <translation id="2860184359326882502">Eng mosi</translation> <translation id="2865888419503095837">Tarmoq ma’lumoti</translation> <translation id="2869095047958348710">Oʻtgan <ph name="DAY_OF_WEEK" /></translation> @@ -1227,6 +1232,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> e-pochtasi paroli</translation> <translation id="4777825441726637019">Play Market</translation> <translation id="4778095205580009397">Google Assistenti demo seansda ishlamaydi</translation> +<translation id="4781633367688946589">Yangi seansda davom ettirish</translation> <translation id="4785412405516449976">Faqat Google hisobi bor kontaktlarga</translation> <translation id="4789348252524569426">Nutq fayllari oʻrnatilmadi. Qurilma yangilanishi lozim. Qurilmani qayta ishga tushirib, yana urining.</translation> <translation id="478959186716341421">Translatsiya qilinmoqda</translation> @@ -1623,6 +1629,7 @@ <translation id="595202126637698455">Unumdorlik kuzatuvi yoniq</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Boshqariladigan profil</translation> +<translation id="5959471481388474538">Tarmoq ish faoliyatida emas</translation> <translation id="596035801491797438">Yuz bilan boshqaruvni oʻchirish</translation> <translation id="5960410286721553511">Telefoningizdagi oxirgi mediafayl va suratlarni oching</translation> <translation id="5965524703725988602">Tungi mavzuni yoqish/oʻchirish <ph name="STATE_TEXT" />.</translation> @@ -2278,6 +2285,7 @@ <translation id="7945357288295809525">Maxsus imkoniyatlar sozlamalarini koʻrsatish, “<ph name="ENABLED_FEATURES" />” yoqildi.</translation> <translation id="7946681191253332687">Kengaytirilgan xavfsizlik yangilanishi chiqdi</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> ilovasi <ph name="DEVICE_NAME" /> ishlatmoqchi</translation> +<translation id="7948239795436419268">Oynalar tiklanmasin</translation> <translation id="7951630946012935453">Klaviaturani xiralashtirish</translation> <translation id="7953176344218790168">KATTA HARFLAR</translation> <translation id="7953994493035617347">Ekran aniqlik darajasi oʻzgardi</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index 1f79e34..07e42fd 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Mức pin hiện tại: <ph name="BATTERY_PERCENTAGE" />%, còn <ph name="TIME" /></translation> <translation id="1178581264944972037">Tạm dừng</translation> <translation id="1179776263021875437">Ngừng tập trung vào việc cần làm</translation> +<translation id="1180117276105724040">Đang khôi phục cửa sổ từ phiên trước đó...</translation> <translation id="1181037720776840403">Xoá</translation> <translation id="1182225749592316782">Điều này cho phép truy cập máy ảnh và micrô đối với tất cả ứng dụng và trang web có quyền truy cập máy ảnh và micrô</translation> <translation id="1182876754474670069">home</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Chuyển nguồn âm thanh?</translation> <translation id="1505542291183484463">Đổi kích thước cửa sổ trong bố cục ô xếp hướng xuống dưới</translation> <translation id="1510238584712386396">Trình chạy</translation> +<translation id="1519090060276706457">Quá trình khôi phục cửa sổ mất nhiều thời gian hơn dự kiến</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Hiển thị tùy chọn cài đặt thông báo. Các thông báo hiện đang tắt cho một ứng dụng}other{Hiển thị tùy chọn cài đặt thông báo. Các thông báo hiện đang tắt cho # ứng dụng}}</translation> <translation id="1521655867290435174">Google Trang tính</translation> <translation id="1523032696246003"><ph name="BATTERY_PERCENTAGE" />% pin | Còn <ph name="TIME" /> cho đến khi pin đầy</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Chuyển đổi giữa kích thước tối đa hoặc kích thước hiện tại của cửa sổ hình trong hình</translation> <translation id="1787955149152357925">Tắt</translation> <translation id="1796561540704213354">Trang web, bao gồm các trang bạn đã truy cập và các trang đang mở</translation> +<translation id="1799852120691957794">Không thể khôi phục cửa sổ từ phiên trước đó</translation> <translation id="1805407494113167797">Không thể phát Âm thanh tăng khả năng tập trung</translation> <translation id="181103072419391116">Cường độ tín hiệu <ph name="SIGNAL_STRENGTH" />, Do quản trị viên của bạn quản lý</translation> <translation id="1815039896005206046">Nút Không thích sẽ gửi phản hồi cho biết bạn không thích nhóm được đề xuất này</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Chụp ảnh màn hình cửa sổ</translation> <translation id="2598725286293895280">Ứng dụng không được hỗ trợ trong không gian làm việc</translation> <translation id="2607678425161541573">Yêu cầu đăng nhập trực tuyến</translation> +<translation id="2611702650078660078">Đã xảy ra lỗi</translation> <translation id="2612072250312279703">giám sát hoạt động</translation> <translation id="261210853165551493">Sao chép cùng với định dạng</translation> <translation id="2612614436418177118">Di chuyển một biểu tượng ứng dụng trong lưới ứng dụng</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Nhấn phím Enter để chụp ảnh toàn màn hình</translation> <translation id="2849936225196189499">Quan trọng</translation> <translation id="2850207700020959936">Các ứng dụng có thể truy cập camera</translation> +<translation id="2852045827873867442">Cần có kết nối Internet.</translation> <translation id="2860184359326882502">Kết quả phù hợp nhất</translation> <translation id="2865888419503095837">Thông tin mạng</translation> <translation id="2869095047958348710"><ph name="DAY_OF_WEEK" /> vừa rồi</translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Mật khẩu cho <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">Cửa hàng Play</translation> <translation id="4778095205580009397">Bạn không thể sử dụng Trợ lý Google trong phiên minh họa.</translation> +<translation id="4781633367688946589">Tiếp tục với phiên mới</translation> <translation id="4785412405516449976">Chỉ những người liên hệ có Tài khoản Google</translation> <translation id="4789348252524569426">Không cài đặt được tệp lời nói. Bạn cần cập nhật thiết bị. Hãy khởi động lại thiết bị rồi thử lại.</translation> <translation id="478959186716341421">Đang truyền</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Đã bật theo dõi hoạt động</translation> <translation id="5955304353782037793">app</translation> <translation id="5958529069007801266">Người dùng được giám sát</translation> +<translation id="5959471481388474538">Không có mạng</translation> <translation id="596035801491797438">Tắt tính năng Điều khiển bằng khuôn mặt</translation> <translation id="5960410286721553511">Xem nội dung phương tiện và ảnh mới đây trên điện thoại</translation> <translation id="5965524703725988602">Bật/tắt Giao diện tối. <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Hiển thị chế độ cài đặt hỗ trợ tiếp cận, "<ph name="ENABLED_FEATURES" />" đã bật.</translation> <translation id="7946681191253332687">Hiện đã có bản cập nhật bảo mật mở rộng</translation> <translation id="7947798320695032612"><ph name="APP_NAME" /> muốn sử dụng <ph name="DEVICE_NAME" /> của bạn</translation> +<translation id="7948239795436419268">Không khôi phục cửa sổ</translation> <translation id="7951630946012935453">Giảm độ sáng bàn phím</translation> <translation id="7953176344218790168">VIẾT HOA</translation> <translation id="7953994493035617347">Bạn có muốn xác nhận độ phân giải mới không?</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb index 9e8e231..9c7d665c 100644 --- a/ash/strings/ash_strings_zh-CN.xtb +++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">当前电池电量为 <ph name="BATTERY_PERCENTAGE" />%,还可使用 <ph name="TIME" /></translation> <translation id="1178581264944972037">暂停</translation> <translation id="1179776263021875437">停止专注于此任务</translation> +<translation id="1180117276105724040">正在恢复上一次会话中的窗口…</translation> <translation id="1181037720776840403">移除</translation> <translation id="1182225749592316782">这将允许所有具有摄像头和麦克风使用权限的应用和网站使用摄像头和麦克风</translation> <translation id="1182876754474670069">光标移至行首</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">要切换音频源吗?</translation> <translation id="1505542291183484463">将平铺窗口向下调整大小</translation> <translation id="1510238584712386396">启动器</translation> +<translation id="1519090060276706457">恢复窗口所用时间超出预期</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{显示通知设置。针对 1 个应用关闭通知}other{显示通知设置。针对 # 个应用关闭通知}}</translation> <translation id="1521655867290435174">Google 表格</translation> <translation id="1523032696246003">电池电量为 <ph name="BATTERY_PERCENTAGE" />% | 还需 <ph name="TIME" />才能充满</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">将画中画窗口最大化或还原为当前大小</translation> <translation id="1787955149152357925">关闭</translation> <translation id="1796561540704213354">一系列网站,包含您访问过的网页和打开的网页</translation> +<translation id="1799852120691957794">无法恢复上一次会话中的窗口</translation> <translation id="1805407494113167797">无法播放专注模式音乐</translation> <translation id="181103072419391116">信号强度为 <ph name="SIGNAL_STRENGTH" />,由您的管理员管理</translation> <translation id="1815039896005206046">选择“不喜欢”将提交您不喜欢这条分组建议的反馈</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">截取窗口屏幕截图</translation> <translation id="2598725286293895280">该桌面中含有不受支持的应用</translation> <translation id="2607678425161541573">需要在线登录</translation> +<translation id="2611702650078660078">发生了错误</translation> <translation id="2612072250312279703">活动监视器</translation> <translation id="261210853165551493">复制带格式的文本</translation> <translation id="2612614436418177118">在应用网格内移动某个应用图标</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">按 Enter 键即可截取整个屏幕</translation> <translation id="2849936225196189499">关键</translation> <translation id="2850207700020959936">应用可以使用摄像头</translation> +<translation id="2852045827873867442">需要联网。</translation> <translation id="2860184359326882502">最匹配</translation> <translation id="2865888419503095837">网络信息</translation> <translation id="2869095047958348710">上个<ph name="DAY_OF_WEEK" /></translation> @@ -1214,6 +1219,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> 的密码</translation> <translation id="4777825441726637019">Play 商店</translation> <translation id="4778095205580009397">无法在演示会话中使用 Google 助理。</translation> +<translation id="4781633367688946589">继续新会话</translation> <translation id="4785412405516449976">仅限有 Google 账号的联系人</translation> <translation id="4789348252524569426">无法安装语音文件。您的设备需要更新。请重启设备,然后重试。</translation> <translation id="478959186716341421">正在投放</translation> @@ -1601,6 +1607,7 @@ <translation id="595202126637698455">已启用性能跟踪</translation> <translation id="5955304353782037793">应用</translation> <translation id="5958529069007801266">受监管用户</translation> +<translation id="5959471481388474538">网络不可用</translation> <translation id="596035801491797438">关闭人脸操控</translation> <translation id="5960410286721553511">查看手机中近期拍摄的照片和播放的媒体</translation> <translation id="5965524703725988602">开启/关闭深色主题。<ph name="STATE_TEXT" />。</translation> @@ -2250,6 +2257,7 @@ <translation id="7945357288295809525">显示无障碍设置,“<ph name="ENABLED_FEATURES" />”已启用。</translation> <translation id="7946681191253332687">有可用的延长安全更新</translation> <translation id="7947798320695032612"><ph name="APP_NAME" />想使用您的<ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">不恢复窗口</translation> <translation id="7951630946012935453">调暗键盘</translation> <translation id="7953176344218790168">大写</translation> <translation id="7953994493035617347">确认使用新分辨率?</translation>
diff --git a/ash/strings/ash_strings_zh-HK.xtb b/ash/strings/ash_strings_zh-HK.xtb index ae719947..1900207 100644 --- a/ash/strings/ash_strings_zh-HK.xtb +++ b/ash/strings/ash_strings_zh-HK.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">目前電量 <ph name="BATTERY_PERCENTAGE" />%,仲可以用多 <ph name="TIME" /></translation> <translation id="1178581264944972037">暫停</translation> <translation id="1179776263021875437">停止專心處理工作</translation> +<translation id="1180117276105724040">正在還原上一個工作階段的視窗…</translation> <translation id="1181037720776840403">移除</translation> <translation id="1182225749592316782">此操作會允許所有獲得相機和麥克風存取權的應用程式和網站存取這些裝置</translation> <translation id="1182876754474670069">Home 鍵</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">要切換音訊來源嗎?</translation> <translation id="1505542291183484463">向下調整並排視窗大小</translation> <translation id="1510238584712386396">啟動器</translation> +<translation id="1519090060276706457">還原視窗的時間比預期長</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{顯示通知設定。已關閉 1 個應用程式的通知}other{顯示通知設定。已關閉 # 個應用程式的通知}}</translation> <translation id="1521655867290435174">Google 試算表</translation> <translation id="1523032696246003">電量:<ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" />後便完成充電</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">將畫中畫視窗最大化或還原為目前大小</translation> <translation id="1787955149152357925">關閉</translation> <translation id="1796561540704213354">網站,包括你瀏覽過的網頁和目前開啟的頁面</translation> +<translation id="1799852120691957794">無法從上一個工作階段還原視窗</translation> <translation id="1805407494113167797">無法播放「專注模式」音效</translation> <translation id="181103072419391116">訊號強度係 <ph name="SIGNAL_STRENGTH" />,由管理員管理</translation> <translation id="1815039896005206046">按一下不喜歡就可以給負評予這個建議群組</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">擷取視窗螢幕畫面</translation> <translation id="2598725286293895280">桌面不支援的應用程式</translation> <translation id="2607678425161541573">需要網上登入</translation> +<translation id="2611702650078660078">發生錯誤</translation> <translation id="2612072250312279703">活動監視器</translation> <translation id="261210853165551493">連同格式複製</translation> <translation id="2612614436418177118">在應用程式網格中移動應用程式圖示</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">㩒 Enter 掣就可以擷取全螢幕截圖</translation> <translation id="2849936225196189499">重要</translation> <translation id="2850207700020959936">應用程式可以取用鏡頭</translation> +<translation id="2852045827873867442">需要互聯網連線。</translation> <translation id="2860184359326882502">最符合的項目</translation> <translation id="2865888419503095837">網絡資訊</translation> <translation id="2869095047958348710">剛過去的<ph name="DAY_OF_WEEK" /></translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> 的密碼</translation> <translation id="4777825441726637019">Play 商店</translation> <translation id="4778095205580009397">「Google 助理」不適用於示範工作階段。</translation> +<translation id="4781633367688946589">繼續新工作階段</translation> <translation id="4785412405516449976">只限你的聯絡人 (必須擁有 Google 帳戶)</translation> <translation id="4789348252524569426">無法安裝語音檔案,裝置需要更新。請重新開機,然後再試一次。</translation> <translation id="478959186716341421">投放中</translation> @@ -1602,6 +1608,7 @@ <translation id="595202126637698455">效能追蹤已啟用</translation> <translation id="5955304353782037793">應用程式</translation> <translation id="5958529069007801266">受管使用者</translation> +<translation id="5959471481388474538">網絡無法使用</translation> <translation id="596035801491797438">關閉「人臉操控」</translation> <translation id="5960410286721553511">查看手機最近的相片和媒體</translation> <translation id="5965524703725988602">切換深色主題。<ph name="STATE_TEXT" />。</translation> @@ -2250,6 +2257,7 @@ <translation id="7945357288295809525">顯示無障礙設定,<ph name="ENABLED_FEATURES" />功能已啟用。</translation> <translation id="7946681191253332687">有可用的延長安全更新</translation> <translation id="7947798320695032612">「<ph name="APP_NAME" />」要求使用您的<ph name="DEVICE_NAME" /></translation> +<translation id="7948239795436419268">不要還原視窗</translation> <translation id="7951630946012935453">校暗鍵盤</translation> <translation id="7953176344218790168">大楷</translation> <translation id="7953994493035617347">要確認新解像度嗎?</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb index 6e021729..14b02da 100644 --- a/ash/strings/ash_strings_zh-TW.xtb +++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">目前電池電量:<ph name="BATTERY_PERCENTAGE" />%;剩餘可用時間:<ph name="TIME" /></translation> <translation id="1178581264944972037">暫停</translation> <translation id="1179776263021875437">停止專心處理這項工作</translation> +<translation id="1180117276105724040">正在還原上一個工作階段中的視窗...</translation> <translation id="1181037720776840403">移除</translation> <translation id="1182225749592316782">這將允許具有攝影機和麥克風權限的所有應用程式和網站存取</translation> <translation id="1182876754474670069">home 鍵</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">要切換音訊來源嗎?</translation> <translation id="1505542291183484463">向下調整並排視窗的大小</translation> <translation id="1510238584712386396">啟動器</translation> +<translation id="1519090060276706457">還原視窗的時間過長</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{顯示通知設定。已關閉一個應用程式的通知}other{顯示通知設定。已關閉 # 個應用程式的通知}}</translation> <translation id="1521655867290435174">Google 試算表</translation> <translation id="1523032696246003">電池電量:<ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" />後充飽</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">將子母畫面視窗最大化或還原目前大小</translation> <translation id="1787955149152357925">關閉</translation> <translation id="1796561540704213354">網站,包括你造訪過的網頁和目前開啟的頁面</translation> +<translation id="1799852120691957794">無法還原上一個工作階段中的視窗</translation> <translation id="1805407494113167797">無法播放專注模式音效</translation> <translation id="181103072419391116">訊號強度 <ph name="SIGNAL_STRENGTH" />,由系統管理員管理</translation> <translation id="1815039896005206046">按倒讚可給予這個建議群組負面評價</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">擷取視窗螢幕畫面</translation> <translation id="2598725286293895280">桌面不支援的應用程式</translation> <translation id="2607678425161541573">需要線上登入</translation> +<translation id="2611702650078660078">發生錯誤</translation> <translation id="2612072250312279703">活動監測工具</translation> <translation id="261210853165551493">一併複製格式</translation> <translation id="2612614436418177118">在應用程式排列顯示畫面中移動應用程式圖示</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">按下 Enter 鍵以擷取全螢幕截圖</translation> <translation id="2849936225196189499">重要</translation> <translation id="2850207700020959936">應用程式可存取相機</translation> +<translation id="2852045827873867442">必須連上網際網路。</translation> <translation id="2860184359326882502">最符合的項目</translation> <translation id="2865888419503095837">網路資訊</translation> <translation id="2869095047958348710">剛過去的<ph name="DAY_OF_WEEK" /></translation> @@ -1212,6 +1217,7 @@ <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> 的密碼</translation> <translation id="4777825441726637019">Play 商店</translation> <translation id="4778095205580009397">Google 助理不適用於示範工作階段。</translation> +<translation id="4781633367688946589">繼續進入新工作階段</translation> <translation id="4785412405516449976">僅限擁有 Google 帳戶的聯絡人</translation> <translation id="4789348252524569426">無法安裝語音檔案,必須更新裝置。請重新啟動裝置,然後再試一次。</translation> <translation id="478959186716341421">投放中</translation> @@ -1600,6 +1606,7 @@ <translation id="595202126637698455">效能追蹤已啟用</translation> <translation id="5955304353782037793">應用程式</translation> <translation id="5958529069007801266">受監管的使用者</translation> +<translation id="5959471481388474538">網路無法使用</translation> <translation id="596035801491797438">關閉人臉操控功能</translation> <translation id="5960410286721553511">查看手機上最近的相片和媒體</translation> <translation id="5965524703725988602">切換深色主題。<ph name="STATE_TEXT" />。</translation> @@ -2248,6 +2255,7 @@ <translation id="7945357288295809525">顯示無障礙設定,<ph name="ENABLED_FEATURES" />功能已啟用。</translation> <translation id="7946681191253332687">有可用的延長安全性更新</translation> <translation id="7947798320695032612">「<ph name="APP_NAME" />」想要使用「<ph name="DEVICE_NAME" />」</translation> +<translation id="7948239795436419268">不要還原視窗</translation> <translation id="7951630946012935453">調暗鍵盤</translation> <translation id="7953176344218790168">大寫</translation> <translation id="7953994493035617347">要確認新的解析度嗎?</translation>
diff --git a/ash/strings/ash_strings_zu.xtb b/ash/strings/ash_strings_zu.xtb index ccfd1b3..e15a5666 100644 --- a/ash/strings/ash_strings_zu.xtb +++ b/ash/strings/ash_strings_zu.xtb
@@ -52,6 +52,7 @@ <translation id="1175944128323889279">Ileveli yebhethri yamanje <ph name="BATTERY_PERCENTAGE" />%, <ph name="TIME" /> esele</translation> <translation id="1178581264944972037">Misa isikhashana</translation> <translation id="1179776263021875437">Yeka ukugxila emsebenzini</translation> +<translation id="1180117276105724040">Ibuyisela amawindi avela kuseshini yakho yangaphambilini...</translation> <translation id="1181037720776840403">Susa</translation> <translation id="1182225749592316782">Lokhu kuvumela ukufinyelela kwawo wonke ama-app namawebhusayithi anemvume yekhamera nemakrofoni</translation> <translation id="1182876754474670069">ikhaya</translation> @@ -166,6 +167,7 @@ <translation id="1501946871587957338">Shintsha umthombo womsindo?</translation> <translation id="1505542291183484463">Ukushintsha usayizi wewindi eliyithayela libheke phansi</translation> <translation id="1510238584712386396">Isiqalisi</translation> +<translation id="1519090060276706457">Ukubuyisela amawindi kuthatha isikhathi eside kunokulindelekile</translation> <translation id="1520303207432623762">{NUM_APPS,plural, =1{Bonisa izilungiselelo zesaziso. Izaziso zivalekile kuhlelo lokusebenza}one{Bonisa izilungiselelo zesaziso. Izaziso zivaliwe kuzinhlelo zokusebenza ezingu-#}other{Bonisa izilungiselelo zesaziso. Izaziso zivaliwe kuzinhlelo zokusebenza ezingu-#}}</translation> <translation id="1521655867290435174">Amashidi we-Google</translation> <translation id="1523032696246003">Ibhethri ngu-<ph name="BATTERY_PERCENTAGE" />% | ngu-<ph name="TIME" /> ukuze ligcwale</translation> @@ -260,6 +262,7 @@ <translation id="1786487376942610288">Shintsha phakathi kobukhulu noma usayizi wamanje wewindi lesithombe-esithombeni</translation> <translation id="1787955149152357925">Valiwe</translation> <translation id="1796561540704213354">Amawebhusayithi ahlanganisa amakhasi owavakashele kanye namakhasi avulekile</translation> +<translation id="1799852120691957794">Ayikwazi ukubuyisela amawindi avela kuseshini yakho yangaphambilini</translation> <translation id="1805407494113167797">Ayikwazanga ukudlala imisindo Yokugxila</translation> <translation id="181103072419391116">Amandla esignali <ph name="SIGNAL_STRENGTH" />, Kuphethwe umlawuli wakho</translation> <translation id="1815039896005206046">Isithupha esibheke phansi sizothumela impendulo ethi awulithandi iqembu eliphakanyisiwe</translation> @@ -491,6 +494,7 @@ <translation id="2596078834055697711">Thatha isithombe-skrini sewindi</translation> <translation id="2598725286293895280">Ama-app angasekelwa kutafula</translation> <translation id="2607678425161541573">Ukungena ngemvume ku-inthanethi kuyadingeka</translation> +<translation id="2611702650078660078">Kuvele iphutha</translation> <translation id="2612072250312279703">isiqaphi somsebenzi</translation> <translation id="261210853165551493">Kopisha nefomethi</translation> <translation id="2612614436418177118">Hambisa isithonjana se-app ngaphakathi kwegridi ye-app</translation> @@ -575,6 +579,7 @@ <translation id="2848120746144143659">Cindezela u-enter ukuze uthathe isithombe-skrini sesikrini esigcwele</translation> <translation id="2849936225196189499">Bucayi</translation> <translation id="2850207700020959936">Ama-app ayakwazi ukufinyelela ikhamera</translation> +<translation id="2852045827873867442">Kudingeka ukuxhumeka kwe-inthanethi.</translation> <translation id="2860184359326882502">Okufana kahle</translation> <translation id="2865888419503095837">Ulwazi lwenethiwekhi</translation> <translation id="2869095047958348710">Ngalo <ph name="DAY_OF_WEEK" /> odlule</translation> @@ -1215,6 +1220,7 @@ <translation id="4776917500594043016">Iphasiwedi ye-<ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="4777825441726637019">I-Google Play Isitolo</translation> <translation id="4778095205580009397">Umsizi we-Google akatholakali kuseshini yedemo.</translation> +<translation id="4781633367688946589">Qhubekela kuseshini entsha</translation> <translation id="4785412405516449976">Oxhumana nabo kuphela abaneGoogle Account</translation> <translation id="4789348252524569426">Ayikwazi ukufaka amafayela enkulumo Idivayisi yakho idinga ukubuyekezwa. Qala kabusha idivayisi yakho uphinde uzame futhi.</translation> <translation id="478959186716341421">Ukusakaza</translation> @@ -1603,6 +1609,7 @@ <translation id="595202126637698455">Ukulandelela ukusebenza kunikwe amandla</translation> <translation id="5955304353782037793">uhlelo lokusebenza</translation> <translation id="5958529069007801266">Umsebenzisi ogadiwe</translation> +<translation id="5959471481388474538">Inethiwekhi ayitholakali</translation> <translation id="596035801491797438">Vala ukulawula Ngobuso</translation> <translation id="5960410286721553511">Buka izithombe zakamuva zefoni yakho nemidiya</translation> <translation id="5965524703725988602">Guqula Itimu Emnyama <ph name="STATE_TEXT" />.</translation> @@ -2252,6 +2259,7 @@ <translation id="7945357288295809525">Ibonisa amasethingi okungena, "<ph name="ENABLED_FEATURES" />" kuvuliwe.</translation> <translation id="7946681191253332687">Izibuyekezo zokuvikeleka ezinwetshiwe ziyatholakala</translation> <translation id="7947798320695032612">I-<ph name="APP_NAME" /> ifuna ukusebenzisa i-<ph name="DEVICE_NAME" /> yakho</translation> +<translation id="7948239795436419268">Ungabuyiseli amawindi</translation> <translation id="7951630946012935453">Shintshela olimini lokugcina olukhethiwe</translation> <translation id="7953176344218790168">OFELEBA</translation> <translation id="7953994493035617347">Qinisekisa ukucaca okusha?</translation>
diff --git a/base/README.md b/base/README.md index ef5a259b..7eb4171 100644 --- a/base/README.md +++ b/base/README.md
@@ -85,3 +85,20 @@ Regressions in these benchmarks can generally by caused by 1) operating system changes, 2) compiler version or flag changes or 3) changes in //base code itself. + +## Rust code +Rust code in base should be organized into very small crates, split up by +function. Merging crates is sometimes unavoidable (due to dependency cycles or +the orphaning rule). + +Rust files should live near the equivalent C++ files (if any), and use the +same naming scheme (for example, `run_loop.rs`, not `run_loop_rust.rs`). + +When adding FFI shims, prefer separate `_shim.h` files rather than adding code +to existing C++ files. This helps avoid circular dependencies with the `//base` +target. It also avoids adding code to commonly-used headers, which can increase +compile size by a lot. + +Crates which you expect to be widely used should be added to the +`public_deps` of the `//base:base_rust` target, so that developers can simply +depend on `//base:base_rust` the same way they do with `//base`. \ No newline at end of file
diff --git a/base/android/scoped_java_ref_unittest.cc b/base/android/scoped_java_ref_unittest.cc index 3bbbde631..0c5dccf3 100644 --- a/base/android/scoped_java_ref_unittest.cc +++ b/base/android/scoped_java_ref_unittest.cc
@@ -187,6 +187,26 @@ str.Reset(); } +TEST_F(ScopedJavaRefTest, DuplicateRefs) { + JNIEnv* env = AttachCurrentThread(); + ScopedJavaLocalRef<jstring> str; + // The ConvertJavaStringToUTF8 below creates a new string that would normally + // return a local ref. We simulate that by starting the g_local_refs count at + // 1. + g_local_refs = 1; + str.Reset(ConvertUTF8ToJavaString(env, "string")); + EXPECT_EQ(1, g_local_refs); + EXPECT_EQ(0, g_global_refs); + { + ScopedJavaGlobalRef<jstring> global_str(str); + ScopedJavaGlobalRef<jstring> global_str1(str); + EXPECT_EQ(1, g_local_refs); + + // Each global ref should be counted separately. + EXPECT_EQ(2, g_global_refs); + } +} + TEST_F(ScopedJavaRefTest, RefCounts) { JNIEnv* env = AttachCurrentThread(); ScopedJavaLocalRef<jstring> str;
diff --git a/base/feature_list.cc b/base/feature_list.cc index 9dc4844..0bd9114 100644 --- a/base/feature_list.cc +++ b/base/feature_list.cc
@@ -1013,9 +1013,8 @@ // When `replace_use_default_overrides` is true, if an `OVERRIDE_USE_DEFAULT` // entry exists, it should be replaced. - std::string feature_name_str(feature_name); if (replace_use_default_overrides) { - auto found = overrides_.find(feature_name_str); + auto found = overrides_.find(feature_name); if (found != overrides_.end() && found->second.overridden_state == OVERRIDE_USE_DEFAULT) { // Also, keep the existing trial if a null trial was passed. @@ -1028,8 +1027,7 @@ // Note: The semantics of try_emplace() is that it does not overwrite the // entry if one already exists for the key. Thus, only the first override for // a given feature name takes effect. - overrides_.try_emplace(std::move(feature_name_str), overridden_state, - field_trial); + overrides_.try_emplace(feature_name, overridden_state, field_trial); } void FeatureList::GetFeatureOverridesImpl(std::string* enable_overrides,
diff --git a/base/message_loop/message_pump_win.cc b/base/message_loop/message_pump_win.cc index 4e20010..6403b8f9 100644 --- a/base/message_loop/message_pump_win.cc +++ b/base/message_loop/message_pump_win.cc
@@ -184,14 +184,27 @@ return true; } -void MessagePumpForUI::AddObserver(Observer* observer) { +void MessagePumpForUI::RegisterNativeEventObserver( + NativeEventObserver* observer) { DCHECK_CALLED_ON_VALID_THREAD(bound_thread_); - observers_.AddObserver(observer); + CHECK(!native_event_observer_); + native_event_observer_ = observer; } -void MessagePumpForUI::RemoveObserver(Observer* observer) { +void MessagePumpForUI::UnregisterNativeEventObserver( + NativeEventObserver* observer) { DCHECK_CALLED_ON_VALID_THREAD(bound_thread_); - observers_.RemoveObserver(observer); + CHECK_EQ(native_event_observer_, observer); + native_event_observer_ = nullptr; +} + +MessagePumpForUI::NativeEventObserver* +MessagePumpForUI::ResetNativeEventObserverForTesting( + NativeEventObserver* observer) { + DCHECK_CALLED_ON_VALID_THREAD(bound_thread_); + NativeEventObserver* old_observer = native_event_observer_; + native_event_observer_ = observer; + return old_observer; } //----------------------------------------------------------------------------- @@ -621,13 +634,15 @@ ->set_message_id(msg.message); }); - for (Observer& observer : observers_) { - observer.WillDispatchMSG(msg); + if (native_event_observer_) { + native_event_observer_->WillRunNativeEvent( + reinterpret_cast<uintptr_t>(&msg)); } ::TranslateMessage(&msg); ::DispatchMessage(&msg); - for (Observer& observer : observers_) { - observer.DidDispatchMSG(msg); + if (native_event_observer_) { + native_event_observer_->DidRunNativeEvent( + reinterpret_cast<uintptr_t>(&msg)); } return true;
diff --git a/base/message_loop/message_pump_win.h b/base/message_loop/message_pump_win.h index b0f14da..aecdcd2 100644 --- a/base/message_loop/message_pump_win.h +++ b/base/message_loop/message_pump_win.h
@@ -5,6 +5,8 @@ #ifndef BASE_MESSAGE_LOOP_MESSAGE_PUMP_WIN_H_ #define BASE_MESSAGE_LOOP_MESSAGE_PUMP_WIN_H_ +#include <stdint.h> + #include <atomic> #include <memory> #include <optional> @@ -146,14 +148,20 @@ // An observer interface to give the scheduler an opportunity to log // information about MSGs before and after they are dispatched. - class BASE_EXPORT Observer { + // There is at most one observer at a time. + class BASE_EXPORT NativeEventObserver { public: - virtual void WillDispatchMSG(const MSG& msg) = 0; - virtual void DidDispatchMSG(const MSG& msg) = 0; + virtual void WillRunNativeEvent(uintptr_t identifier) = 0; + virtual void DidRunNativeEvent(uintptr_t identifier) = 0; }; - void AddObserver(Observer* observer); - void RemoveObserver(Observer* obseerver); + void RegisterNativeEventObserver(NativeEventObserver* observer); + void UnregisterNativeEventObserver(NativeEventObserver* observer); + + // For testing only, allows overriding the current observer. + // Returns the previous observer. + NativeEventObserver* ResetNativeEventObserverForTesting( + NativeEventObserver* observer); private: bool MessageCallback(UINT message, @@ -207,7 +215,7 @@ // `kInactive` at construction, but set to `kRunning` on entry to DoRunLoop(). WakeupState wakeup_state_ = WakeupState::kInactive; - ObserverList<Observer>::Unchecked observers_; + raw_ptr<NativeEventObserver> native_event_observer_ = nullptr; }; //-----------------------------------------------------------------------------
diff --git a/base/task/current_thread.cc b/base/task/current_thread.cc index 97b9355..76d1098 100644 --- a/base/task/current_thread.cc +++ b/base/task/current_thread.cc
@@ -186,14 +186,20 @@ #endif // BUILDFLAG(IS_ANDROID) #if BUILDFLAG(IS_WIN) -void CurrentUIThread::AddMessagePumpObserver( - MessagePumpForUI::Observer* observer) { - GetMessagePumpForUI()->AddObserver(observer); +void CurrentUIThread::RegisterNativeEventObserver( + MessagePumpForUI::NativeEventObserver* observer) { + GetMessagePumpForUI()->RegisterNativeEventObserver(observer); } -void CurrentUIThread::RemoveMessagePumpObserver( - MessagePumpForUI::Observer* observer) { - GetMessagePumpForUI()->RemoveObserver(observer); +void CurrentUIThread::UnregisterNativeEventObserver( + MessagePumpForUI::NativeEventObserver* observer) { + GetMessagePumpForUI()->UnregisterNativeEventObserver(observer); +} + +MessagePumpForUI::NativeEventObserver* +CurrentUIThread::ResetNativeEventObserverForTesting( + MessagePumpForUI::NativeEventObserver* observer) { + return GetMessagePumpForUI()->ResetNativeEventObserverForTesting(observer); } #endif // BUILDFLAG(IS_WIN)
diff --git a/base/task/current_thread.h b/base/task/current_thread.h index ffd90d2..3ea0df2 100644 --- a/base/task/current_thread.h +++ b/base/task/current_thread.h
@@ -282,8 +282,15 @@ #endif #if BUILDFLAG(IS_WIN) - void AddMessagePumpObserver(MessagePumpForUI::Observer* observer); - void RemoveMessagePumpObserver(MessagePumpForUI::Observer* observer); + void RegisterNativeEventObserver( + MessagePumpForUI::NativeEventObserver* observer); + void UnregisterNativeEventObserver( + MessagePumpForUI::NativeEventObserver* observer); + + // For testing only, allows overriding the current observer. + // Returns the previous observer. + MessagePumpForUI::NativeEventObserver* ResetNativeEventObserverForTesting( + MessagePumpForUI::NativeEventObserver* observer); #endif private:
diff --git a/base/test/fuzztest_support.h b/base/test/fuzztest_support.h index 051e93b2..ab0f70d9 100644 --- a/base/test/fuzztest_support.h +++ b/base/test/fuzztest_support.h
@@ -71,46 +71,58 @@ fuzztest::Arbitrary<std::vector<uint8_t>>()); } -auto ArbitraryValueList(fuzztest::Domain<base::Value> entry_domain) { +auto ArbitraryList(fuzztest::Domain<base::Value> entry_domain) { return fuzztest::ReversibleMap( [](std::vector<base::Value> values) { auto list = base::ListValue::with_capacity(values.size()); for (auto& value : values) { list.Append(std::move(value)); } - return base::Value(std::move(list)); + return list; }, - [](const base::Value& value) { - auto maybe_list = base::optional_ref(value.GetIfList()); - return maybe_list.has_value() - ? std::make_optional(std::tuple{ - base::ToVector(*maybe_list, &base::Value::Clone)}) - : std::nullopt; + [](const base::ListValue& list) { + return std::optional{ + std::tuple{base::ToVector(list, &base::Value::Clone)}}; }, fuzztest::ContainerOf<std::vector<base::Value>>(entry_domain)); } -auto ArbitraryValueDict(fuzztest::Domain<base::Value> value_domain) { +auto ArbitraryValueList(fuzztest::Domain<base::Value> entry_domain) { + return fuzztest::ReversibleMap( + [](base::ListValue list) { return base::Value(std::move(list)); }, + [](const base::Value& value) { + const auto* list = value.GetIfList(); + return list ? std::optional{std::tuple{list->Clone()}} : std::nullopt; + }, + ArbitraryList(entry_domain)); +} + +auto ArbitraryDict(fuzztest::Domain<base::Value> value_domain) { return fuzztest::ReversibleMap( [](std::vector<std::pair<std::string, base::Value>> e) { - return base::Value(base::DictValue(std::make_move_iterator(e.begin()), - std::make_move_iterator(e.end()))); + return base::DictValue(std::make_move_iterator(e.begin()), + std::make_move_iterator(e.end())); }, - [](const base::Value& value) { - auto maybe_dict = base::optional_ref(value.GetIfDict()); - return maybe_dict.has_value() - ? std::make_optional(std::tuple{base::ToVector( - *maybe_dict, - [](const auto& entry) { - return std::make_pair(entry.first, - entry.second.Clone()); - })}) - : std::nullopt; + [](const base::DictValue& dict) { + return std::optional{ + std::tuple{base::ToVector(dict, [](const auto& entry) { + return std::make_pair(entry.first, entry.second.Clone()); + })}}; }, fuzztest::ContainerOf<std::vector<std::pair<std::string, base::Value>>>( fuzztest::PairOf(fuzztest::Utf8String(), value_domain))); } +auto ArbitraryValueDict(fuzztest::Domain<base::Value> value_domain) { + return fuzztest::ReversibleMap( + [](base::DictValue dict) { return base::Value(std::move(dict)); }, + [](const base::Value& value) { + const auto* dict = value.GetIfDict(); + return dict ? std::optional{std::tuple{dict->Clone()}} : std::nullopt; + }, + ArbitraryDict(value_domain)); +} + fuzztest::Domain<base::Value> ArbitraryValue() { fuzztest::DomainBuilder builder; builder.Set<base::Value>( @@ -134,35 +146,18 @@ template <> class fuzztest::internal::ArbitraryImpl<base::DictValue> - : public fuzztest::internal::ReversibleMapImpl< - base::DictValue (*)(std::vector<std::pair<std::string, base::Value>>), - std::optional< - std::tuple<std::vector<std::pair<std::string, base::Value>>>> (*)( - const base::DictValue&), - fuzztest::internal::ArbitraryImpl< - std::vector<std::pair<std::string, base::Value>>>> { + : public fuzztest::Domain<base::DictValue> { public: ArbitraryImpl() - : fuzztest::internal::ReversibleMapImpl< - base::DictValue (*)( - std::vector<std::pair<std::string, base::Value>>), - std::optional<std::tuple< - std::vector<std::pair<std::string, base::Value>>>> (*)( - const base::DictValue&), - fuzztest::internal::ArbitraryImpl< - std::vector<std::pair<std::string, base::Value>>>>( - [](std::vector<std::pair<std::string, base::Value>> e) { - return base::DictValue(std::make_move_iterator(e.begin()), - std::make_move_iterator(e.end())); - }, - [](const base::DictValue& value) { - return std::make_optional( - std::tuple{base::ToVector(value, [](const auto& entry) { - return std::make_pair(entry.first, entry.second.Clone()); - })}); - }, - fuzztest::internal::ArbitraryImpl< - std::vector<std::pair<std::string, base::Value>>>()) {} + : fuzztest::Domain<base::DictValue>(ArbitraryDict(ArbitraryValue())) {} +}; + +template <> +class fuzztest::internal::ArbitraryImpl<base::ListValue> + : public fuzztest::Domain<base::ListValue> { + public: + ArbitraryImpl() + : fuzztest::Domain<base::ListValue>(ArbitraryList(ArbitraryValue())) {} }; #endif // BASE_TEST_FUZZTEST_SUPPORT_H_
diff --git a/base/threading/thread.cc b/base/threading/thread.cc index 84efab9..34fbc5a 100644 --- a/base/threading/thread.cc +++ b/base/threading/thread.cc
@@ -143,6 +143,7 @@ stack_size = std::move(other.stack_size); thread_type = std::move(other.thread_type); joinable = std::move(other.joinable); + sequence_manager_settings = std::move(other.sequence_manager_settings); task_observer = std::move(other.task_observer); other.moved_from = true;
diff --git a/base/time/time.h b/base/time/time.h index 332fef26..b9c97f6 100644 --- a/base/time/time.h +++ b/base/time/time.h
@@ -738,18 +738,6 @@ // This is provided for testing only, and is not tracked in a thread-safe // way. static bool IsHighResolutionTimerInUse(); - - // The following two functions are used to report the fraction of elapsed time - // that the high resolution timer is activated. - // ResetHighResolutionTimerUsage() resets the cumulative usage and starts the - // measurement interval and GetHighResolutionTimerUsage() returns the - // percentage of time since the reset that the high resolution timer was - // activated. - // ResetHighResolutionTimerUsage() must be called at least once before calling - // GetHighResolutionTimerUsage(); otherwise the usage result would be - // undefined. - static void ResetHighResolutionTimerUsage(); - static double GetHighResolutionTimerUsage(); #endif // BUILDFLAG(IS_WIN) // Converts an exploded structure representing either the local time or UTC
diff --git a/base/time/time_win.cc b/base/time/time_win.cc index 9ab5a2f..fcdcb819 100644 --- a/base/time/time_win.cc +++ b/base/time/time_win.cc
@@ -106,15 +106,6 @@ bool g_high_res_timer_enabled = false; // How many times the high resolution timer has been called. uint32_t g_high_res_timer_count = 0; -// Start time of the high resolution timer usage monitoring. This is needed -// to calculate the usage as percentage of the total elapsed time. -TimeTicks g_high_res_timer_usage_start; -// The cumulative time the high resolution timer has been in use since -// |g_high_res_timer_usage_start| moment. -TimeDelta g_high_res_timer_usage; -// Timestamp of the last activation change of the high resolution timer. This -// is used to calculate the cumulative usage. -TimeTicks g_high_res_timer_last_activation; // The lock to control access to the above set of variables. Lock* GetHighResLock() { static auto* lock = new Lock(); @@ -156,16 +147,11 @@ return; } if (g_last_interval_requested_ms) { - // Record how long the timer interrupt frequency was raised. - g_high_res_timer_usage += subtle::TimeTicksNowIgnoringOverride() - - g_high_res_timer_last_activation; // Reset the timer interrupt back to the default. timeEndPeriod(g_last_interval_requested_ms); } g_last_interval_requested_ms = new_interval; if (g_last_interval_requested_ms) { - // Record when the timer interrupt was raised. - g_high_res_timer_last_activation = subtle::TimeTicksNowIgnoringOverride(); timeBeginPeriod(g_last_interval_requested_ms); } } @@ -311,35 +297,7 @@ return g_last_interval_requested_ms == kMinTimerIntervalHighResMs; } -// static -void Time::ResetHighResolutionTimerUsage() { - AutoLock lock(*GetHighResLock()); - g_high_res_timer_usage = TimeDelta(); - g_high_res_timer_usage_start = subtle::TimeTicksNowIgnoringOverride(); - if (g_high_res_timer_count > 0) { - g_high_res_timer_last_activation = g_high_res_timer_usage_start; - } -} -// static -double Time::GetHighResolutionTimerUsage() { - AutoLock lock(*GetHighResLock()); - TimeTicks now = subtle::TimeTicksNowIgnoringOverride(); - TimeDelta elapsed_time = now - g_high_res_timer_usage_start; - if (elapsed_time.is_zero()) { - // This is unexpected but possible if TimeTicks resolution is low and - // GetHighResolutionTimerUsage() is called promptly after - // ResetHighResolutionTimerUsage(). - return 0.0; - } - TimeDelta used_time = g_high_res_timer_usage; - if (g_high_res_timer_count > 0) { - // If currently activated add the remainder of time since the last - // activation. - used_time += now - g_high_res_timer_last_activation; - } - return used_time / elapsed_time * 100; -} // static bool Time::FromExploded(bool is_local, const Exploded& exploded, Time* time) {
diff --git a/base/time/time_win_unittest.cc b/base/time/time_win_unittest.cc index 1b6e910..3a58c6f1 100644 --- a/base/time/time_win_unittest.cc +++ b/base/time/time_win_unittest.cc
@@ -430,39 +430,4 @@ EXPECT_EQ(100, time_delta.ToWinrtTimeSpan().Duration); } -TEST(HighResolutionTimer, GetUsage) { - Time::ResetHighResolutionTimerUsage(); - - // 0% usage since the timer isn't activated regardless of how much time has - // elapsed. - EXPECT_EQ(0.0, Time::GetHighResolutionTimerUsage()); - Sleep(10); - EXPECT_EQ(0.0, Time::GetHighResolutionTimerUsage()); - - Time::ActivateHighResolutionTimer(true); - Time::ResetHighResolutionTimerUsage(); - - Sleep(20); - // 100% usage since the timer has been activated entire time. - EXPECT_EQ(100.0, Time::GetHighResolutionTimerUsage()); - - Time::ActivateHighResolutionTimer(false); - Sleep(20); - double usage1 = Time::GetHighResolutionTimerUsage(); - // usage1 should be about 50%. - EXPECT_LT(usage1, 100.0); - EXPECT_GT(usage1, 0.0); - - Time::ActivateHighResolutionTimer(true); - Sleep(10); - Time::ActivateHighResolutionTimer(false); - double usage2 = Time::GetHighResolutionTimerUsage(); - // usage2 should be about 60%. - EXPECT_LT(usage2, 100.0); - EXPECT_GT(usage2, usage1); - - Time::ResetHighResolutionTimerUsage(); - EXPECT_EQ(0.0, Time::GetHighResolutionTimerUsage()); -} - } // namespace base
diff --git a/base/timer/hi_res_timer_manager.h b/base/timer/hi_res_timer_manager.h index c25dc07..668033c 100644 --- a/base/timer/hi_res_timer_manager.h +++ b/base/timer/hi_res_timer_manager.h
@@ -7,16 +7,12 @@ #include "base/base_export.h" #include "base/power_monitor/power_observer.h" -#include "base/timer/timer.h" -#include "build/build_config.h" namespace base { // Ensures that the Windows high resolution timer is only used // when not running on battery power. -class BASE_EXPORT HighResolutionTimerManager - : public base::PowerSuspendObserver, - public base::PowerStateObserver { +class BASE_EXPORT HighResolutionTimerManager : public base::PowerStateObserver { public: HighResolutionTimerManager(); @@ -29,9 +25,6 @@ // base::PowerStateObserver methods. void OnBatteryPowerStatusChange( PowerStateObserver::BatteryPowerStatus battery_power_status) override; - // base::PowerSuspendObserver methods. - void OnSuspend() override; - void OnResume() override; // Returns true if the hi resolution clock could be used right now. bool hi_res_clock_available() const { return hi_res_clock_available_; } @@ -41,11 +34,6 @@ void UseHiResClock(bool use); bool hi_res_clock_available_; - -#if BUILDFLAG(IS_WIN) - // Timer for polling the high resolution timer usage. - base::RepeatingTimer timer_; -#endif }; } // namespace base
diff --git a/base/timer/hi_res_timer_manager_posix.cc b/base/timer/hi_res_timer_manager_posix.cc index f82f353..c8c378f 100644 --- a/base/timer/hi_res_timer_manager_posix.cc +++ b/base/timer/hi_res_timer_manager_posix.cc
@@ -16,10 +16,6 @@ void HighResolutionTimerManager::OnBatteryPowerStatusChange( PowerStateObserver::BatteryPowerStatus battery_power_status) {} -void HighResolutionTimerManager::OnSuspend() {} - -void HighResolutionTimerManager::OnResume() {} - void HighResolutionTimerManager::UseHiResClock(bool use) {} } // namespace base
diff --git a/base/timer/hi_res_timer_manager_win.cc b/base/timer/hi_res_timer_manager_win.cc index 80dd28e0..eb0630ea 100644 --- a/base/timer/hi_res_timer_manager_win.cc +++ b/base/timer/hi_res_timer_manager_win.cc
@@ -4,11 +4,8 @@ #include "base/timer/hi_res_timer_manager.h" -#include <algorithm> - #include "base/base_switches.h" #include "base/command_line.h" -#include "base/metrics/histogram_macros.h" #include "base/power_monitor/power_monitor.h" #include "base/time/time.h" @@ -16,15 +13,6 @@ namespace { -constexpr TimeDelta kUsageSampleInterval = Minutes(10); - -void ReportHighResolutionTimerUsage() { - UMA_HISTOGRAM_PERCENTAGE("Windows.HighResolutionTimerUsage", - Time::GetHighResolutionTimerUsage()); - // Reset usage for the next interval. - Time::ResetHighResolutionTimerUsage(); -} - bool HighResolutionTimerAllowed() { return !CommandLine::ForCurrentProcess()->HasSwitch( switches::kDisableHighResTimer); @@ -41,23 +29,16 @@ if (HighResolutionTimerAllowed()) { auto* power_monitor = base::PowerMonitor::GetInstance(); DCHECK(power_monitor->IsInitialized()); - power_monitor->AddPowerSuspendObserver(this); const bool on_battery = power_monitor->AddPowerStateObserverAndReturnBatteryPowerStatus(this) == PowerStateObserver::BatteryPowerStatus::kBatteryPower; UseHiResClock(!on_battery); - - // Start polling the high resolution timer usage. - Time::ResetHighResolutionTimerUsage(); - timer_.Start(FROM_HERE, kUsageSampleInterval, - BindRepeating(&ReportHighResolutionTimerUsage)); } } HighResolutionTimerManager::~HighResolutionTimerManager() { if (HighResolutionTimerAllowed()) { auto* power_monitor = base::PowerMonitor::GetInstance(); - power_monitor->RemovePowerSuspendObserver(this); power_monitor->RemovePowerStateObserver(this); UseHiResClock(false); } @@ -70,19 +51,6 @@ PowerStateObserver::BatteryPowerStatus::kBatteryPower); } -void HighResolutionTimerManager::OnSuspend() { - DCHECK(HighResolutionTimerAllowed()); - // Stop polling the usage to avoid including the standby time. - timer_.Stop(); -} - -void HighResolutionTimerManager::OnResume() { - DCHECK(HighResolutionTimerAllowed()); - // Resume polling the usage. - Time::ResetHighResolutionTimerUsage(); - timer_.Reset(); -} - void HighResolutionTimerManager::UseHiResClock(bool use) { DCHECK(HighResolutionTimerAllowed()); if (use == hi_res_clock_available_) {
diff --git a/base/values.cc b/base/values.cc index 22a7882..41d80d24 100644 --- a/base/values.cc +++ b/base/values.cc
@@ -356,8 +356,9 @@ DictValue::DictValue(flat_map<std::string, std::unique_ptr<Value>> storage) : storage_(std::move(storage)) { - DCHECK(std::ranges::all_of(storage_, - [](const auto& entry) { return !!entry.second; })); + DCHECK(std::ranges::all_of(storage_, [](const auto& entry) { + return !!entry.second && IsStringUTF8AllowingNoncharacters(entry.first); + })); } DictValue::DictValue(PassKey<internal::JSONParser>,
diff --git a/base/values.h b/base/values.h index 3624cfda..35a0e2d8 100644 --- a/base/values.h +++ b/base/values.h
@@ -1078,10 +1078,13 @@ }); } -template <class IteratorType> -DictValue::DictValue(std::move_iterator<IteratorType> first, - std::move_iterator<IteratorType> last) { - // Need to move into a vector first, since `storage_` currently uses +namespace detail { + +template <typename IteratorType> +flat_map<std::string, std::unique_ptr<Value>> MakeDictStorageFromIterators( + std::move_iterator<IteratorType> first, + std::move_iterator<IteratorType> last) { + // Need to move into a vector first, since DictValue's storage currently uses // unique_ptrs. std::vector<std::pair<std::string, std::unique_ptr<Value>>> values; values.reserve(static_cast<size_t>(std::distance(first, last))); @@ -1093,9 +1096,16 @@ values.emplace_back(std::move(value.first), std::make_unique<Value>(std::move(value.second))); } - storage_ = flat_map<std::string, std::unique_ptr<Value>>(std::move(values)); + return flat_map<std::string, std::unique_ptr<Value>>(std::move(values)); } +} // namespace detail + +template <class IteratorType> +DictValue::DictValue(std::move_iterator<IteratorType> first, + std::move_iterator<IteratorType> last) + : DictValue(detail::MakeDictStorageFromIterators(first, last)) {} + } // namespace base #endif // BASE_VALUES_H_
diff --git a/base/values_unittest.cc b/base/values_unittest.cc index f6a8ffe..31ffd81 100644 --- a/base/values_unittest.cc +++ b/base/values_unittest.cc
@@ -450,12 +450,77 @@ values.emplace_back("Int", 123); Value blank; - blank = Value(DictValue(std::make_move_iterator(values.begin()), - std::make_move_iterator(values.end()))); + blank = Value(DictValue(std::move_iterator(values.begin()), + std::move_iterator(values.end()))); EXPECT_EQ(Value::Type::DICT, blank.type()); EXPECT_EQ(123, blank.GetDict().Find("Int")->GetInt()); } +TEST(ValuesTest, InvalidUtf8KeyDchecks) { + static constexpr std::string_view kInvalidUtf8 = "\xff"; + static constexpr std::string_view kInvalidUtf8Path = "a.\xff.b"; + + // Constructors. + std::vector<std::pair<std::string, Value>> values; + values.emplace_back(kInvalidUtf8, 123); + EXPECT_DCHECK_DEATH(DictValue(std::move_iterator(values.begin()), + std::move_iterator(values.end()))); + + // Setters. + DictValue dict; + + EXPECT_DCHECK_DEATH(dict.Set(kInvalidUtf8, Value())); + EXPECT_DCHECK_DEATH(dict.Set(kInvalidUtf8, true)); + EXPECT_DCHECK_DEATH(dict.Set(kInvalidUtf8, 123)); + EXPECT_DCHECK_DEATH(dict.Set(kInvalidUtf8, 1.23)); + EXPECT_DCHECK_DEATH(dict.Set(kInvalidUtf8, "value")); + EXPECT_DCHECK_DEATH(dict.Set(kInvalidUtf8, u"value")); + EXPECT_DCHECK_DEATH(dict.Set(kInvalidUtf8, std::string("value"))); + EXPECT_DCHECK_DEATH(dict.Set(kInvalidUtf8, BlobStorage())); + EXPECT_DCHECK_DEATH(dict.Set(kInvalidUtf8, DictValue())); + EXPECT_DCHECK_DEATH(dict.Set(kInvalidUtf8, ListValue())); + + EXPECT_DCHECK_DEATH(dict.Set_HintAtEnd(kInvalidUtf8, Value())); + + EXPECT_DCHECK_DEATH(DictValue().Set(kInvalidUtf8, Value())); + EXPECT_DCHECK_DEATH(DictValue().Set(kInvalidUtf8, true)); + EXPECT_DCHECK_DEATH(DictValue().Set(kInvalidUtf8, 123)); + EXPECT_DCHECK_DEATH(DictValue().Set(kInvalidUtf8, 1.23)); + EXPECT_DCHECK_DEATH(DictValue().Set(kInvalidUtf8, "value")); + EXPECT_DCHECK_DEATH(DictValue().Set(kInvalidUtf8, u"value")); + EXPECT_DCHECK_DEATH(DictValue().Set(kInvalidUtf8, std::string("value"))); + EXPECT_DCHECK_DEATH(DictValue().Set(kInvalidUtf8, BlobStorage())); + EXPECT_DCHECK_DEATH(DictValue().Set(kInvalidUtf8, DictValue())); + EXPECT_DCHECK_DEATH(DictValue().Set(kInvalidUtf8, ListValue())); + + EXPECT_DCHECK_DEATH(dict.SetByDottedPath(kInvalidUtf8Path, Value())); + EXPECT_DCHECK_DEATH(dict.SetByDottedPath(kInvalidUtf8Path, true)); + EXPECT_DCHECK_DEATH(dict.SetByDottedPath(kInvalidUtf8Path, 123)); + EXPECT_DCHECK_DEATH(dict.SetByDottedPath(kInvalidUtf8Path, 1.23)); + EXPECT_DCHECK_DEATH(dict.SetByDottedPath(kInvalidUtf8Path, "value")); + EXPECT_DCHECK_DEATH(dict.SetByDottedPath(kInvalidUtf8Path, u"value")); + EXPECT_DCHECK_DEATH( + dict.SetByDottedPath(kInvalidUtf8Path, std::string("value"))); + EXPECT_DCHECK_DEATH(dict.SetByDottedPath(kInvalidUtf8Path, BlobStorage())); + EXPECT_DCHECK_DEATH(dict.SetByDottedPath(kInvalidUtf8Path, DictValue())); + EXPECT_DCHECK_DEATH(dict.SetByDottedPath(kInvalidUtf8Path, ListValue())); + + EXPECT_DCHECK_DEATH(DictValue().SetByDottedPath(kInvalidUtf8Path, Value())); + EXPECT_DCHECK_DEATH(DictValue().SetByDottedPath(kInvalidUtf8Path, true)); + EXPECT_DCHECK_DEATH(DictValue().SetByDottedPath(kInvalidUtf8Path, 123)); + EXPECT_DCHECK_DEATH(DictValue().SetByDottedPath(kInvalidUtf8Path, 1.23)); + EXPECT_DCHECK_DEATH(DictValue().SetByDottedPath(kInvalidUtf8Path, "value")); + EXPECT_DCHECK_DEATH(DictValue().SetByDottedPath(kInvalidUtf8Path, u"value")); + EXPECT_DCHECK_DEATH( + DictValue().SetByDottedPath(kInvalidUtf8Path, std::string("value"))); + EXPECT_DCHECK_DEATH( + DictValue().SetByDottedPath(kInvalidUtf8Path, BlobStorage())); + EXPECT_DCHECK_DEATH( + DictValue().SetByDottedPath(kInvalidUtf8Path, DictValue())); + EXPECT_DCHECK_DEATH( + DictValue().SetByDottedPath(kInvalidUtf8Path, ListValue())); +} + TEST(ValuesTest, MoveList) { ListValue list; list.Append(123);
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index c383672..389ccfe 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -2365,7 +2365,7 @@ # `config("rustc_revision")` - a custom `--cfg` flag is used to force # rebuilding of all `.rs` files (which as a side-effect should also trigger # a Clippy check if `enable_rust_clippy = true`). - "--cfg=cr_clippy_revision=\"2026-03-16\"", + "--cfg=cr_clippy_revision=\"2026-03-17\"", # Treat all default Clippy lints as warnings. # See also `config("treat_warnings_as_errors")`.
diff --git a/build/config/compiler/pgo/pgo.gni b/build/config/compiler/pgo/pgo.gni index 30db2ed..d27e10a 100644 --- a/build/config/compiler/pgo/pgo.gni +++ b/build/config/compiler/pgo/pgo.gni
@@ -25,9 +25,6 @@ # bad compile times. chrome_pgo_phase = 0 if (!is_cronet_build && !dcheck_always_on && is_official_build && - # TODO(crbug.com/1336055): Update this now-outdated condition with regard - # to chromecast and determine whether chromeos_is_browser_only is - # obsolete. (is_high_end_android || is_win || is_mac || is_fuchsia || (is_linux && !is_castos) || (is_ios && use_blink && target_environment == "device"))) {
diff --git a/cc/base/features.cc b/cc/base/features.cc index f1f914b1..2ffbbc8 100644 --- a/cc/base/features.cc +++ b/cc/base/features.cc
@@ -23,10 +23,6 @@ BASE_FEATURE(kComputeRasterTranslateForExternalScale, base::FEATURE_ENABLED_BY_DEFAULT); -// Whether the compositor should attempt to sync with the scroll handlers before -// submitting a frame. -BASE_FEATURE(kSynchronizedScrolling, base::FEATURE_DISABLED_BY_DEFAULT); - BASE_FEATURE(kDeferImplInvalidation, base::FEATURE_ENABLED_BY_DEFAULT); // TODO(crbug.com/446920991): Reduce back to 1 frame delay once we have a
diff --git a/cc/base/features.h b/cc/base/features.h index 560be36..6753a88 100644 --- a/cc/base/features.h +++ b/cc/base/features.h
@@ -15,7 +15,6 @@ namespace features { CC_BASE_EXPORT BASE_DECLARE_FEATURE(kComputeRasterTranslateForExternalScale); -CC_BASE_EXPORT BASE_DECLARE_FEATURE(kSynchronizedScrolling); // When enabled, the scheduler will allow deferring impl invalidation frames // for N frames (default 1) to reduce contention with main frames, allowing
diff --git a/cc/scheduler/headless_scheduler_state_machine_unittest.cc b/cc/scheduler/headless_scheduler_state_machine_unittest.cc index 81656de..60593c8b 100644 --- a/cc/scheduler/headless_scheduler_state_machine_unittest.cc +++ b/cc/scheduler/headless_scheduler_state_machine_unittest.cc
@@ -205,9 +205,7 @@ // Even with SMOOTHNESS_TAKES_PRIORITY, we don't prioritize impl thread and we // should wait for main frame. - state.SetTreePrioritiesAndScrollState( - SMOOTHNESS_TAKES_PRIORITY, - ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER, false); + state.SetTreePrioritiesAndScrollState(SMOOTHNESS_TAKES_PRIORITY, false); EXPECT_EQ(SchedulerStateMachine::BeginImplFrameDeadlineMode::BLOCKED, state.CurrentBeginImplFrameDeadlineMode());
diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc index 8db9f6b..49080fd 100644 --- a/cc/scheduler/scheduler.cc +++ b/cc/scheduler/scheduler.cc
@@ -226,10 +226,9 @@ void Scheduler::SetTreePrioritiesAndScrollState( TreePriority tree_priority, - ScrollHandlerState scroll_handler_state, bool is_current_scroll_main_painted) { state_machine_->SetTreePrioritiesAndScrollState( - tree_priority, scroll_handler_state, is_current_scroll_main_painted); + tree_priority, is_current_scroll_main_painted); ProcessScheduledActions(); }
diff --git a/cc/scheduler/scheduler.h b/cc/scheduler/scheduler.h index ddc48f3..548df8fdb 100644 --- a/cc/scheduler/scheduler.h +++ b/cc/scheduler/scheduler.h
@@ -194,7 +194,6 @@ void DidReceiveCompositorFrameAck(); void SetTreePrioritiesAndScrollState(TreePriority tree_priority, - ScrollHandlerState scroll_handler_state, bool is_current_scroll_main_painted); // Commit step happens after the main thread has completed updating for a
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc index b505475c..b89a6ba 100644 --- a/cc/scheduler/scheduler_state_machine.cc +++ b/cc/scheduler/scheduler_state_machine.cc
@@ -179,20 +179,6 @@ NOTREACHED(); } -perfetto::protos::pbzero::ChromeCompositorStateMachineV2::MinorStateV2:: - ScrollHandlerState - ScrollHandlerStateToProtozeroEnum(ScrollHandlerState state) { - using pbzeroMinorStateV2 = - perfetto::protos::pbzero::ChromeCompositorStateMachineV2::MinorStateV2; - switch (state) { - case ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER: - return pbzeroMinorStateV2::SCROLL_AFFECTS_SCROLL_HANDLER; - case ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER: - return pbzeroMinorStateV2::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER; - } - NOTREACHED(); -} - perfetto::protos::pbzero::ChromeCompositorSchedulerActionV2 SchedulerStateMachine::ActionToProtozeroEnum(Action action) { using pbzeroSchedulerAction = @@ -282,8 +268,6 @@ minor_state->set_did_create_and_initialize_first_layer_tree_frame_sink( did_create_and_initialize_first_layer_tree_frame_sink_); minor_state->set_tree_priority(TreePriorityToProtozeroEnum(tree_priority_)); - minor_state->set_scroll_handler_state( - ScrollHandlerStateToProtozeroEnum(scroll_handler_state_)); minor_state->set_critical_begin_main_frame_to_activate_is_fast( critical_begin_main_frame_to_activate_is_fast_); minor_state->set_main_thread_missed_last_deadline( @@ -1567,10 +1551,8 @@ void SchedulerStateMachine::SetTreePrioritiesAndScrollState( TreePriority tree_priority, - ScrollHandlerState scroll_handler_state, bool is_current_scroll_main_painted) { tree_priority_ = tree_priority; - scroll_handler_state_ = scroll_handler_state; is_current_scroll_main_painted_ = is_current_scroll_main_painted; } @@ -1580,14 +1562,11 @@ } bool SchedulerStateMachine::ImplLatencyTakesPriority() const { - // Attempt to synchronize with the main thread if it has a scroll listener - // and is fast. - if (ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER == - scroll_handler_state_ && - critical_begin_main_frame_to_activate_is_fast_) - return false; - // Don't wait for the main thread if we are prioritizing smoothness. + // We do not attempt to synchronize with the main thread for scroll handlers. + // Even when `critical_begin_main_frame_to_activate_is_fast_` the threshold + // for that calculation does not account for GPU process time required. Due to + // this we end up having significant scroll jank when synchronizing. if (SMOOTHNESS_TAKES_PRIORITY == tree_priority_) return true;
diff --git a/cc/scheduler/scheduler_state_machine.h b/cc/scheduler/scheduler_state_machine.h index 7038702..7c228ed 100644 --- a/cc/scheduler/scheduler_state_machine.h +++ b/cc/scheduler/scheduler_state_machine.h
@@ -18,11 +18,6 @@ namespace cc { -enum class ScrollHandlerState { - SCROLL_AFFECTS_SCROLL_HANDLER, - SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER, -}; - // The SchedulerStateMachine decides how to coordinate main thread activites // like painting/running javascript with rendering and input activities on the // impl thread. @@ -256,7 +251,6 @@ // Indicates whether to prioritize impl thread latency (i.e., animation // smoothness) over new content activation. void SetTreePrioritiesAndScrollState(TreePriority tree_priority, - ScrollHandlerState scroll_handler_state, bool is_current_scroll_main_painted); // Indicates if the main thread will likely respond within 1 vsync. @@ -496,8 +490,6 @@ bool active_tree_needs_first_draw_ = false; bool did_create_and_initialize_first_layer_tree_frame_sink_ = false; TreePriority tree_priority_ = NEW_CONTENT_TAKES_PRIORITY; - ScrollHandlerState scroll_handler_state_ = - ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER; bool is_current_scroll_main_painted_ = false; bool critical_begin_main_frame_to_activate_is_fast_ = true; bool main_thread_missed_last_deadline_ = false;
diff --git a/cc/scheduler/scheduler_state_machine_unittest.cc b/cc/scheduler/scheduler_state_machine_unittest.cc index 1e5070e36..c04e0a7 100644 --- a/cc/scheduler/scheduler_state_machine_unittest.cc +++ b/cc/scheduler/scheduler_state_machine_unittest.cc
@@ -1192,9 +1192,7 @@ state.FrameIntervalUpdated(base::Hertz(120)); state.AdvanceTimeBy(base::Seconds(1280)); // Start at an arbitrary point. // Main thread scrolling. - state.SetTreePrioritiesAndScrollState( - SMOOTHNESS_TAKES_PRIORITY, - ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, true); + state.SetTreePrioritiesAndScrollState(SMOOTHNESS_TAKES_PRIORITY, true); int begin_main_frame_count = 0; for (int i = 0; i < 10; i++) { @@ -1208,9 +1206,7 @@ EXPECT_EQ(begin_main_frame_count, 10); // Non-passive scroll handler, but not blocking. - state.SetTreePrioritiesAndScrollState( - SMOOTHNESS_TAKES_PRIORITY, - ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, false); + state.SetTreePrioritiesAndScrollState(SMOOTHNESS_TAKES_PRIORITY, false); begin_main_frame_count = 0; for (int i = 0; i < 10; i++) { state.SetNeedsBeginMainFrame(false); @@ -2595,9 +2591,7 @@ SET_UP_STATE(state); // Set smoothness priority (used while scrolling). - state.SetTreePrioritiesAndScrollState( - SMOOTHNESS_TAKES_PRIORITY, - ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER, false); + state.SetTreePrioritiesAndScrollState(SMOOTHNESS_TAKES_PRIORITY, false); // Impl-side invalidation creates a pending tree which is not yet activated. bool needs_first_draw_on_activation = true; @@ -3407,9 +3401,7 @@ // Verify the deadline is not triggered early until we enter // prefer impl latency mode. EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); - state.SetTreePrioritiesAndScrollState( - SMOOTHNESS_TAKES_PRIORITY, - ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER, false); + state.SetTreePrioritiesAndScrollState(SMOOTHNESS_TAKES_PRIORITY, false); EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); // Trigger the deadline. @@ -3513,9 +3505,7 @@ DisableFrameRateLimitSchedulerStateMachineTests::SetUp(); SET_UP_STATE(state); state.set_is_scrolling(true); - state.SetTreePrioritiesAndScrollState( - SMOOTHNESS_TAKES_PRIORITY, - ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER, false); + state.SetTreePrioritiesAndScrollState(SMOOTHNESS_TAKES_PRIORITY, false); } // Tests that when we should wait for scroll events, that we do not send
diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc index f7514f3..49deb09 100644 --- a/cc/scheduler/scheduler_unittest.cc +++ b/cc/scheduler/scheduler_unittest.cc
@@ -626,7 +626,7 @@ void BeginFramesNotFromClient(BeginFrameSourceType bfs_type); void BeginFramesNotFromClient_IsDrawThrottled(BeginFrameSourceType bfs_type); bool BeginMainFrameOnCriticalPath(TreePriority tree_priority, - ScrollHandlerState scroll_handler_state, + bool is_current_scroll_main_painted, base::TimeDelta durations); scoped_refptr<SchedulerTestTaskRunner> task_runner_; @@ -1722,9 +1722,7 @@ TEST_P(SchedulerTest, MainFrameNotSkippedAfterLateCommitInPreferImplLatencyMode) { SetUpScheduler(EXTERNAL_BFS); - scheduler_->SetTreePrioritiesAndScrollState( - SMOOTHNESS_TAKES_PRIORITY, - ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER, false); + scheduler_->SetTreePrioritiesAndScrollState(SMOOTHNESS_TAKES_PRIORITY, false); fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); EXPECT_SCOPED(CheckMainFrameNotSkippedAfterLateCommit()); @@ -3164,36 +3162,18 @@ TEST_P(SchedulerTest, ImplLatencyTakesPriority) { SetUpScheduler(THROTTLED_BFS); - scheduler_->SetTreePrioritiesAndScrollState( - SMOOTHNESS_TAKES_PRIORITY, - ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER, false); - scheduler_->SetCriticalBeginMainFrameToActivateIsFast(true); - EXPECT_TRUE(scheduler_->ImplLatencyTakesPriority()); - scheduler_->SetCriticalBeginMainFrameToActivateIsFast(false); + scheduler_->SetTreePrioritiesAndScrollState(SMOOTHNESS_TAKES_PRIORITY, false); EXPECT_TRUE(scheduler_->ImplLatencyTakesPriority()); - scheduler_->SetTreePrioritiesAndScrollState( - SMOOTHNESS_TAKES_PRIORITY, - ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, true); - scheduler_->SetCriticalBeginMainFrameToActivateIsFast(true); - EXPECT_FALSE(scheduler_->ImplLatencyTakesPriority()); - scheduler_->SetCriticalBeginMainFrameToActivateIsFast(false); + scheduler_->SetTreePrioritiesAndScrollState(SMOOTHNESS_TAKES_PRIORITY, true); EXPECT_TRUE(scheduler_->ImplLatencyTakesPriority()); - scheduler_->SetTreePrioritiesAndScrollState( - SAME_PRIORITY_FOR_BOTH_TREES, - ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER, false); - scheduler_->SetCriticalBeginMainFrameToActivateIsFast(true); - EXPECT_FALSE(scheduler_->ImplLatencyTakesPriority()); - scheduler_->SetCriticalBeginMainFrameToActivateIsFast(false); + scheduler_->SetTreePrioritiesAndScrollState(SAME_PRIORITY_FOR_BOTH_TREES, + false); EXPECT_FALSE(scheduler_->ImplLatencyTakesPriority()); - scheduler_->SetTreePrioritiesAndScrollState( - SAME_PRIORITY_FOR_BOTH_TREES, - ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, true); - scheduler_->SetCriticalBeginMainFrameToActivateIsFast(true); - EXPECT_FALSE(scheduler_->ImplLatencyTakesPriority()); - scheduler_->SetCriticalBeginMainFrameToActivateIsFast(false); + scheduler_->SetTreePrioritiesAndScrollState(SAME_PRIORITY_FOR_BOTH_TREES, + true); EXPECT_FALSE(scheduler_->ImplLatencyTakesPriority()); } @@ -3305,15 +3285,13 @@ // durations: F = fast durations; S = slow durations bool SchedulerTest::BeginMainFrameOnCriticalPath( TreePriority tree_priority, - ScrollHandlerState scroll_handler_state, + bool is_current_scroll_main_painted, base::TimeDelta durations) { SetUpScheduler(EXTERNAL_BFS); fake_compositor_timing_history_->SetAllEstimatesTo(durations); client_->Reset(); - scheduler_->SetTreePrioritiesAndScrollState( - tree_priority, scroll_handler_state, - scroll_handler_state == - ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER); + scheduler_->SetTreePrioritiesAndScrollState(tree_priority, + is_current_scroll_main_painted); scheduler_->SetNeedsBeginMainFrame(); EXPECT_FALSE(client_->last_begin_main_frame_args().IsValid()); EXPECT_SCOPED(AdvanceFrame()); @@ -3322,55 +3300,43 @@ } TEST_P(SchedulerTest, BeginMainFrameOnCriticalPath_BNF) { - EXPECT_TRUE(BeginMainFrameOnCriticalPath( - SAME_PRIORITY_FOR_BOTH_TREES, - ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER, - kFastDuration)); + EXPECT_TRUE(BeginMainFrameOnCriticalPath(SAME_PRIORITY_FOR_BOTH_TREES, false, + kFastDuration)); } TEST_P(SchedulerTest, BeginMainFrameOnCriticalPath_BNS) { - EXPECT_TRUE(BeginMainFrameOnCriticalPath( - SAME_PRIORITY_FOR_BOTH_TREES, - ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER, - kSlowDuration)); + EXPECT_TRUE(BeginMainFrameOnCriticalPath(SAME_PRIORITY_FOR_BOTH_TREES, false, + kSlowDuration)); } TEST_P(SchedulerTest, BeginMainFrameOnCriticalPath_BHF) { - EXPECT_TRUE(BeginMainFrameOnCriticalPath( - SAME_PRIORITY_FOR_BOTH_TREES, - ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kFastDuration)); + EXPECT_TRUE(BeginMainFrameOnCriticalPath(SAME_PRIORITY_FOR_BOTH_TREES, true, + kFastDuration)); } TEST_P(SchedulerTest, BeginMainFrameOnCriticalPath_BHS) { - EXPECT_TRUE(BeginMainFrameOnCriticalPath( - SAME_PRIORITY_FOR_BOTH_TREES, - ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kSlowDuration)); + EXPECT_TRUE(BeginMainFrameOnCriticalPath(SAME_PRIORITY_FOR_BOTH_TREES, true, + kSlowDuration)); } TEST_P(SchedulerTest, BeginMainFrameOnCriticalPath_ANF) { - EXPECT_FALSE(BeginMainFrameOnCriticalPath( - SMOOTHNESS_TAKES_PRIORITY, - ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER, - kFastDuration)); + EXPECT_FALSE(BeginMainFrameOnCriticalPath(SMOOTHNESS_TAKES_PRIORITY, false, + kFastDuration)); } TEST_P(SchedulerTest, BeginMainFrameOnCriticalPath_ANS) { - EXPECT_FALSE(BeginMainFrameOnCriticalPath( - SMOOTHNESS_TAKES_PRIORITY, - ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER, - kSlowDuration)); + EXPECT_FALSE(BeginMainFrameOnCriticalPath(SMOOTHNESS_TAKES_PRIORITY, false, + kSlowDuration)); } TEST_P(SchedulerTest, BeginMainFrameOnCriticalPath_AHF) { - EXPECT_TRUE(BeginMainFrameOnCriticalPath( - SMOOTHNESS_TAKES_PRIORITY, - ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kFastDuration)); + EXPECT_FALSE(BeginMainFrameOnCriticalPath(SMOOTHNESS_TAKES_PRIORITY, true, + kFastDuration)); } TEST_P(SchedulerTest, BeginMainFrameOnCriticalPath_AHS) { - EXPECT_FALSE(BeginMainFrameOnCriticalPath( - SMOOTHNESS_TAKES_PRIORITY, - ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kSlowDuration)); + EXPECT_FALSE(BeginMainFrameOnCriticalPath(SMOOTHNESS_TAKES_PRIORITY, true, + kSlowDuration)); } TEST_P(SchedulerTest, BeginFrameAckForFinishedImplFrame) { @@ -3581,9 +3547,7 @@ // If we have a scroll handler but the critical main frame is slow, we should // still prioritize impl thread latency. - scheduler_->SetTreePrioritiesAndScrollState( - SMOOTHNESS_TAKES_PRIORITY, - ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, true); + scheduler_->SetTreePrioritiesAndScrollState(SMOOTHNESS_TAKES_PRIORITY, true); scheduler_->SetNeedsRedraw(); // An interval of 2ms makes sure that the main frame is considered slow. base::TimeDelta interval = base::Milliseconds(2); @@ -3601,7 +3565,8 @@ // Set an interval of 10ms. The bmf_to_activate_interval should be 1*4 = 4ms, // to account for queue + main_frame + pending_tree + activation durations. // With a draw time of 1ms and fudge factor of 1ms, the interval available for - // the main frame to be activated is 8ms, so it should be considered fast. + // the main frame to be activated is 8ms, but it should still be considered + // slow because we prioritize impl latency during smoothness. scheduler_->SetNeedsRedraw(); interval = base::Milliseconds(10); task_runner_->AdvanceMockTickClock(interval); @@ -3610,7 +3575,7 @@ task_runner_->NowTicks() + interval, interval, viz::BeginFrameArgs::NORMAL); fake_external_begin_frame_source_->TestOnBeginFrame(args); - EXPECT_FALSE(scheduler_->ImplLatencyTakesPriority()); + EXPECT_TRUE(scheduler_->ImplLatencyTakesPriority()); task_runner_->RunPendingTasks(); // Run posted deadline to finish the frame. ASSERT_FALSE(client_->IsInsideBeginImplFrame()); @@ -3754,8 +3719,7 @@ SetUpScheduler(EXTERNAL_BFS); scheduler_->SetNeedsBeginMainFrame(); scheduler_->SetTreePrioritiesAndScrollState( - TreePriority::SMOOTHNESS_TAKES_PRIORITY, - ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER, false); + TreePriority::SMOOTHNESS_TAKES_PRIORITY, false); fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); fake_compositor_timing_history_ ->SetBeginMainFrameQueueDurationNotCriticalEstimate(kSlowDuration);
diff --git a/cc/trees/commit_state.cc b/cc/trees/commit_state.cc index 830e4f8..5871e8f 100644 --- a/cc/trees/commit_state.cc +++ b/cc/trees/commit_state.cc
@@ -24,6 +24,7 @@ bottom_controls_shown_ratio(prev.bottom_controls_shown_ratio), device_scale_factor(prev.device_scale_factor), external_page_scale_factor(prev.external_page_scale_factor), + page_scale_factor_limits_set(prev.page_scale_factor_limits_set), max_page_scale_factor(prev.max_page_scale_factor), min_page_scale_factor(prev.min_page_scale_factor), page_scale_factor(prev.page_scale_factor),
diff --git a/cc/trees/commit_state.h b/cc/trees/commit_state.h index cc8dd6d..ed4cdcfe 100644 --- a/cc/trees/commit_state.h +++ b/cc/trees/commit_state.h
@@ -93,6 +93,7 @@ float bottom_controls_shown_ratio = 0.f; float device_scale_factor = 1.f; float external_page_scale_factor = 1.f; + bool page_scale_factor_limits_set = false; float max_page_scale_factor = 1.f; float min_page_scale_factor = 1.f; float page_scale_factor = 1.f;
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc index 4825926..e868cf4e 100644 --- a/cc/trees/layer_tree_host.cc +++ b/cc/trees/layer_tree_host.cc
@@ -1542,10 +1542,19 @@ void LayerTreeHost::SetPageScaleFactorAndLimits(float page_scale_factor, float min_page_scale_factor, float max_page_scale_factor) { - if (pending_commit_state()->page_scale_factor == page_scale_factor && + if (pending_commit_state()->page_scale_factor_limits_set && + pending_commit_state()->page_scale_factor == page_scale_factor && pending_commit_state()->min_page_scale_factor == min_page_scale_factor && - pending_commit_state()->max_page_scale_factor == max_page_scale_factor) + pending_commit_state()->max_page_scale_factor == max_page_scale_factor) { return; + } + if (page_scale_factor <= 0) { + page_scale_factor = 1; + } + if (min_page_scale_factor <= 0) { + min_page_scale_factor = page_scale_factor; + } + DCHECK_GE(max_page_scale_factor, min_page_scale_factor); DCHECK_GE(page_scale_factor, min_page_scale_factor); DCHECK_LE(page_scale_factor, max_page_scale_factor); // We should never process non-unit page_scale_delta for an OOPIF subframe. @@ -1557,6 +1566,7 @@ << pending_commit_state()->page_scale_factor << ", new psf = " << page_scale_factor; + pending_commit_state()->page_scale_factor_limits_set = true; pending_commit_state()->page_scale_factor = page_scale_factor; pending_commit_state()->min_page_scale_factor = min_page_scale_factor; pending_commit_state()->max_page_scale_factor = max_page_scale_factor;
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index f8b8276..e2257f25 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -377,7 +377,6 @@ } void LayerTreeHostImpl::DidStartScroll() { - scroll_affects_scroll_handler_ = active_tree()->have_scroll_event_handlers(); if (!settings().single_thread_proxy_scheduler) { client_->SetHasActiveThreadedScroll(true); } @@ -392,8 +391,6 @@ prioritize_new_content_due_to_checkerboarding_ = false; } - scroll_affects_scroll_handler_ = false; - if (!settings().single_thread_proxy_scheduler) { client_->SetHasActiveThreadedScroll(false); client_->SetWaitingForScrollEvent(false); @@ -4135,14 +4132,6 @@ return input_delegate_ && input_delegate_->IsCurrentScrollMainRepainted(); } -bool LayerTreeHostImpl::ScrollAffectsScrollHandler() const { - if (!input_delegate_) { - return false; - } - return settings_.enable_synchronized_scrolling && - scroll_affects_scroll_handler_; -} - void LayerTreeHostImpl::SetExternalPinchGestureActive(bool active) { DCHECK(input_delegate_ || !active); if (input_delegate_) {
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h index 73643c3..ca7e56d 100644 --- a/cc/trees/layer_tree_host_impl.h +++ b/cc/trees/layer_tree_host_impl.h
@@ -671,7 +671,6 @@ ActivelyScrollingType GetActivelyScrollingType() const; bool IsHandlingInteraction() const; bool IsCurrentScrollMainRepainted() const; - bool ScrollAffectsScrollHandler() const; void SetExternalPinchGestureActive(bool active); void set_force_smooth_wheel_scrolling_for_testing(bool enabled) { GetInputHandler().set_force_smooth_wheel_scrolling_for_testing(enabled); @@ -1349,13 +1348,6 @@ bool doing_sync_draw_ = false; #endif - // This is used to tell the scheduler there are active scroll handlers on the - // page so we should prioritize latency during a scroll to try to keep - // scroll-linked effects up to data. - // TODO(bokan): This is quite old and scheduling has become much more - // sophisticated since so it's not clear how much value it's still providing. - bool scroll_affects_scroll_handler_ = false; - // Provides support for PaintWorklets which depend on input properties that // are being animated by the compositor (aka 'animated' PaintWorklets). // Responsible for storing animated custom property values and for
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index 1b0f69c..5fc28d3 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -1832,36 +1832,6 @@ } } -TEST_P(LayerTreeHostImplTest, ScrollHandlerNotPresent) { - SetupViewportLayersInnerScrolls(gfx::Size(100, 100), gfx::Size(200, 200)); - EXPECT_FALSE(host_impl_->active_tree()->have_scroll_event_handlers()); - DrawFrame(); - - EXPECT_FALSE(host_impl_->ScrollAffectsScrollHandler()); - GetInputHandler().ScrollBegin(BeginState(gfx::Point(), gfx::Vector2d(0, 10), - ui::ScrollInputType::kTouchscreen) - .get(), - ui::ScrollInputType::kTouchscreen); - EXPECT_FALSE(host_impl_->ScrollAffectsScrollHandler()); - GetInputHandler().ScrollEnd(/*should_snap=*/false, std::nullopt); - EXPECT_FALSE(host_impl_->ScrollAffectsScrollHandler()); -} - -TEST_P(LayerTreeHostImplTest, ScrollHandlerPresent) { - SetupViewportLayersInnerScrolls(gfx::Size(100, 100), gfx::Size(200, 200)); - host_impl_->active_tree()->set_have_scroll_event_handlers(true); - DrawFrame(); - - EXPECT_FALSE(host_impl_->ScrollAffectsScrollHandler()); - GetInputHandler().ScrollBegin(BeginState(gfx::Point(), gfx::Vector2d(0, 10), - ui::ScrollInputType::kTouchscreen) - .get(), - ui::ScrollInputType::kTouchscreen); - EXPECT_TRUE(host_impl_->ScrollAffectsScrollHandler()); - GetInputHandler().ScrollEnd(/*should_snap=*/false, std::nullopt); - EXPECT_FALSE(host_impl_->ScrollAffectsScrollHandler()); -} - TEST_P(LayerTreeHostImplTest, ScrollUpdateReturnsCorrectValue) { SetupViewportLayersInnerScrolls(gfx::Size(100, 100), gfx::Size(200, 200)); DrawFrame(); @@ -13123,14 +13093,14 @@ } // Fluent Overlay Scrollbars track opacity is scaled depending on the thickness -// scale factor of the scrollbar's thumb. When the thumb's thickness is at it's +// scale factor of the scrollbar's thumb. When the thumb's thickness is at its // minimum the track should be invisible // (`thickness_scale_factor_` == `kIdleThicknessScale`) => (`opacity_` == 0). -// When the thumb's thickness is at it's maximum, the track should be fully +// When the thumb's thickness is at its maximum, the track should be fully // visible. // (`thickness_scale_factor_` == 1) => (`opacity_` == 1). // For every thickness value in between `kIdleThicknessScale` and 1.f the -// opacity should be scaled appropriately This test ensures the correlation +// opacity should be scaled appropriately. This test ensures the correlation // between thickness of the thumb and opacity of the track. TEST_P(FluentOverlayScrollbarOpacityLayerTreeHostImplTest, PaintedOverlayScrollbarTrackOpacityTest) { @@ -13239,12 +13209,12 @@ EXPECT_FLOAT_EQ(CreateAndRegisterPaintedScrollbarLayer()->Opacity(), 0.f); } -// Fluent Overlay Scrollbar should not be hit tested when it's opacity is zero. +// Fluent Overlay Scrollbar should not be hit tested when its opacity is zero. TEST_F(FluentOverlayScrollbarLayerTreeHostImplTest, DoesntGetHitTestedWhenInvisible) { EXPECT_FLOAT_EQ(CreateAndRegisterPaintedScrollbarLayer()->Opacity(), 0.f); // Per CreateAndRegisterPaintedScrollbarLayer the Scrollbar's rect is located - // at (345,0)x(15,600). A point of 352 clicks it in the middle of the the + // at (345,0)x(15,600). A point of 352 clicks it in the middle of the // track and would cause a scroll. InputHandlerPointerResult result = GetInputHandler().MouseMoveAt(gfx::Point(352, 300));
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc index 3720fb95..b17e574 100644 --- a/cc/trees/layer_tree_host_unittest.cc +++ b/cc/trees/layer_tree_host_unittest.cc
@@ -3526,6 +3526,41 @@ // Single thread proxy does not support impl-side page scale changes. MULTI_THREAD_TEST_F(LayerTreeHostTestStartPageScaleAnimation); +class LayerTreeHostTestSetPageScaleFactorAndLimits : public LayerTreeHostTest { + protected: + void BeginTest() override { + const LayerTreeHost* host = layer_tree_host(); + + // Case 1: page_scale_factor <= 0, min_page_scale_factor <= 0 + layer_tree_host()->SetPageScaleFactorAndLimits(0.f, 0.f, 2.f); + EXPECT_EQ(1.f, host->pending_commit_state()->page_scale_factor); + EXPECT_EQ(1.f, host->pending_commit_state()->min_page_scale_factor); + EXPECT_EQ(2.f, host->pending_commit_state()->max_page_scale_factor); + + // Case 2: page_scale_factor > 0, min_page_scale_factor <= 0 + layer_tree_host()->SetPageScaleFactorAndLimits(1.5f, -1.f, 2.f); + EXPECT_EQ(1.5f, host->pending_commit_state()->page_scale_factor); + EXPECT_EQ(1.5f, host->pending_commit_state()->min_page_scale_factor); + EXPECT_EQ(2.f, host->pending_commit_state()->max_page_scale_factor); + + // Case 3: valid parameters + layer_tree_host()->SetPageScaleFactorAndLimits(0.8f, 0.5f, 2.f); + EXPECT_EQ(0.8f, host->pending_commit_state()->page_scale_factor); + EXPECT_EQ(0.5f, host->pending_commit_state()->min_page_scale_factor); + EXPECT_EQ(2.f, host->pending_commit_state()->max_page_scale_factor); + + // Case 4: page_scale_factor <= 0, min_page_scale_factor > 0 + layer_tree_host()->SetPageScaleFactorAndLimits(0.f, 0.5f, 2.f); + EXPECT_EQ(1.f, host->pending_commit_state()->page_scale_factor); + EXPECT_EQ(0.5f, host->pending_commit_state()->min_page_scale_factor); + EXPECT_EQ(2.f, host->pending_commit_state()->max_page_scale_factor); + + EndTest(); + } +}; + +SINGLE_THREAD_TEST_F(LayerTreeHostTestSetPageScaleFactorAndLimits); + class ViewportDeltasAppliedDuringPinch : public LayerTreeHostTest, public ScrollCallbacks { protected:
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc index 983933720..8feabf6 100644 --- a/cc/trees/layer_tree_impl.cc +++ b/cc/trees/layer_tree_impl.cc
@@ -161,8 +161,8 @@ hud_layer_(nullptr), background_color_(SkColors::kTransparent), page_scale_factor_(page_scale_factor), - min_page_scale_factor_(0), - max_page_scale_factor_(0), + min_page_scale_factor_(1.f), + max_page_scale_factor_(1.f), external_page_scale_factor_(1.f), device_scale_factor_(1.f), painted_device_scale_factor_(1.f), @@ -496,9 +496,8 @@ 0.0f, max_safe_area_inset_bottom() - blink_bottom_content_offset); float transform_delta_by_safe_area_inset_bottom = -(real_saib - blink_saib); - if (min_page_scale_factor() > 0.f) { - transform_delta_by_safe_area_inset_bottom /= min_page_scale_factor(); - } + DCHECK_GT(min_page_scale_factor(), 0.f); + transform_delta_by_safe_area_inset_bottom /= min_page_scale_factor(); if (property_trees->transform_delta_by_safe_area_inset_bottom() != transform_delta_by_safe_area_inset_bottom) { @@ -845,7 +844,8 @@ PushPageScaleFromMainThread(commit_state.page_scale_factor, commit_state.min_page_scale_factor, - commit_state.max_page_scale_factor); + commit_state.max_page_scale_factor, + commit_state.page_scale_factor_limits_set); SetBrowserControlsParams(commit_state.browser_controls_params); set_overscroll_behavior(commit_state.overscroll_behavior); @@ -968,7 +968,8 @@ // Active tree already shares the page_scale_factor object with pending // tree so only the limits need to be provided. target_tree->PushPageScaleFactorAndLimits(nullptr, min_page_scale_factor(), - max_page_scale_factor()); + max_page_scale_factor(), + page_scale_factor_limits_set_); target_tree->SetExternalPageScaleFactor(external_page_scale_factor_); target_tree->SetBrowserControlsParams(browser_controls_params_); @@ -1296,10 +1297,15 @@ float LayerTreeImpl::ClampPageScaleFactorToLimits( float page_scale_factor) const { - if (min_page_scale_factor_ && page_scale_factor < min_page_scale_factor_) - page_scale_factor = min_page_scale_factor_; - else if (max_page_scale_factor_ && page_scale_factor > max_page_scale_factor_) - page_scale_factor = max_page_scale_factor_; + if (!page_scale_factor_limits_set_) { + return page_scale_factor; + } + if (page_scale_factor < min_page_scale_factor_) { + return min_page_scale_factor_; + } + if (page_scale_factor > max_page_scale_factor_) { + return max_page_scale_factor_; + } return page_scale_factor; } @@ -1400,9 +1406,10 @@ void LayerTreeImpl::PushPageScaleFromMainThread(float page_scale_factor, float min_page_scale_factor, - float max_page_scale_factor) { + float max_page_scale_factor, + bool limits_set) { PushPageScaleFactorAndLimits(&page_scale_factor, min_page_scale_factor, - max_page_scale_factor); + max_page_scale_factor, limits_set); } void LayerTreeImpl::SetPageScaleFactorAndLimitsForDisplayTree( @@ -1411,8 +1418,8 @@ float max_page_scale_factor) { DCHECK(settings().trees_in_viz_in_viz_process); bool changed_page_scale = page_scale_factor_->SetCurrent(page_scale_factor); - changed_page_scale |= - SetPageScaleFactorLimits(min_page_scale_factor, max_page_scale_factor); + changed_page_scale |= SetPageScaleFactorLimits(min_page_scale_factor, + max_page_scale_factor, true); if (changed_page_scale) { DidUpdatePageScale(); @@ -1421,12 +1428,13 @@ void LayerTreeImpl::PushPageScaleFactorAndLimits(const float* page_scale_factor, float min_page_scale_factor, - float max_page_scale_factor) { + float max_page_scale_factor, + bool limits_set) { DCHECK(page_scale_factor || IsActiveTree()); bool changed_page_scale = false; - changed_page_scale |= - SetPageScaleFactorLimits(min_page_scale_factor, max_page_scale_factor); + changed_page_scale |= SetPageScaleFactorLimits( + min_page_scale_factor, max_page_scale_factor, limits_set); if (page_scale_factor) { DCHECK(!IsActiveTree() || !host_impl_->pending_tree()); @@ -1531,11 +1539,18 @@ } bool LayerTreeImpl::SetPageScaleFactorLimits(float min_page_scale_factor, - float max_page_scale_factor) { - if (min_page_scale_factor == min_page_scale_factor_ && - max_page_scale_factor == max_page_scale_factor_) - return false; + float max_page_scale_factor, + bool limits_set) { + DCHECK_GT(min_page_scale_factor, 0.f); + DCHECK_GE(max_page_scale_factor, min_page_scale_factor); + if (page_scale_factor_limits_set_ == limits_set && + min_page_scale_factor == min_page_scale_factor_ && + max_page_scale_factor == max_page_scale_factor_) { + return false; + } + + page_scale_factor_limits_set_ = limits_set; min_page_scale_factor_ = min_page_scale_factor; max_page_scale_factor_ = max_page_scale_factor;
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h index 8dc84bb3..c2d5b0bb 100644 --- a/cc/trees/layer_tree_impl.h +++ b/cc/trees/layer_tree_impl.h
@@ -385,7 +385,8 @@ void SetPageScaleOnActiveTree(float active_page_scale); void PushPageScaleFromMainThread(float page_scale_factor, float min_page_scale_factor, - float max_page_scale_factor); + float max_page_scale_factor, + bool limits_set = true); const LayerSelection& selection() const { return selection_; } float current_page_scale_factor() const { return page_scale_factor()->Current(IsActiveTree()); @@ -884,9 +885,11 @@ float ClampPageScaleFactorToLimits(float page_scale_factor) const; void PushPageScaleFactorAndLimits(const float* page_scale_factor, float min_page_scale_factor, - float max_page_scale_factor); + float max_page_scale_factor, + bool limits_set); bool SetPageScaleFactorLimits(float min_page_scale_factor, - float max_page_scale_factor); + float max_page_scale_factor, + bool limits_set); void DidUpdatePageScale(); void PushBrowserControls(const float* top_controls_shown_ratio, const float* bottom_controls_shown_ratio); @@ -924,8 +927,9 @@ scoped_refptr<SyncedScale> page_scale_factor_; - // The minimum and maximum page scale factor. A value of 0 indicates that the - // limit is not enforced. + // True if the minimum and maximum page scale factors have been explicitly + // set. + bool page_scale_factor_limits_set_ = false; float min_page_scale_factor_; float max_page_scale_factor_; float external_page_scale_factor_;
diff --git a/cc/trees/layer_tree_settings.h b/cc/trees/layer_tree_settings.h index 16ac79d..26eb8bd3 100644 --- a/cc/trees/layer_tree_settings.h +++ b/cc/trees/layer_tree_settings.h
@@ -192,10 +192,6 @@ // https://crbug.com/414283. bool commit_fractional_scroll_deltas = false; - // Whether the compositor should attempt to sync with the scroll handlers - // before submitting a frame. - bool enable_synchronized_scrolling = true; - #if DCHECK_IS_ON() // Whether to check if any double blur exists. bool log_on_ui_double_background_blur = false;
diff --git a/cc/trees/proxy_impl.cc b/cc/trees/proxy_impl.cc index 1ef8821d..f3e334b 100644 --- a/cc/trees/proxy_impl.cc +++ b/cc/trees/proxy_impl.cc
@@ -569,17 +569,8 @@ // have a scroll listener. This gives the scroll listener a better chance of // handling scroll updates within the same frame. The tree itself is still // kept in prefer smoothness mode to allow checkerboarding. - // - // Note: `is_current_scroll_main_painted` does not imply - // SCROLL_AFFECTS_SCROLL_HANDLER, as on some platforms we don't attempt to - // synchronize non=passive scroll handlers. See `kSynchronizedScrolling`. - ScrollHandlerState scroll_handler_state = - host_impl_->ScrollAffectsScrollHandler() - ? ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER - : ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER; - - scheduler_->SetTreePrioritiesAndScrollState( - tree_priority, scroll_handler_state, is_current_scroll_main_painted); + scheduler_->SetTreePrioritiesAndScrollState(tree_priority, + is_current_scroll_main_painted); } void ProxyImpl::PostDelayedAnimationTaskOnImplThread(base::OnceClosure task,
diff --git a/cc/trees/tracked_element_rects.h b/cc/trees/tracked_element_rects.h index 8b2318d..ad0f168 100644 --- a/cc/trees/tracked_element_rects.h +++ b/cc/trees/tracked_element_rects.h
@@ -21,12 +21,15 @@ // The feature that is tracking the element. The feature values are kept opaque // at this level. The actual values are maintained in the higher level browser -// code. If any new features are added, TRACKED_ELEMENT_FEATURE_MAX should be +// code. If any new features are added, `kTrackedElementFeatureMax` should be // updated. For the actual values, see // components/page_content_annotations/core/tracked_element_feature.h -enum TrackedElementFeature : int32_t { - TRACKED_ELEMENT_FEATURE_MAX = 1, + +// LINT.IfChange(TrackedElementFeature) +enum class TrackedElementFeature : int32_t { + kTrackedElementFeatureMax = 1, }; +// LINT.ThenChange(//components/page_content_annotations/core/tracked_element_feature.h:TrackedElementFeature) // New struct to hold the tracked element clipped/visible bounds and other data. struct CC_EXPORT TrackedElementRect {
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn index d8f5126..f74c98ab 100644 --- a/chrome/BUILD.gn +++ b/chrome/BUILD.gn
@@ -1821,11 +1821,7 @@ # Copies some scripts and resources that are used for desktop integration. copy("linux_cros_extra_data") { - sources = [ - "//chrome/tools/build/linux/chrome-wrapper", - "//third_party/xdg-utils/scripts/xdg-mime", - "//third_party/xdg-utils/scripts/xdg-settings", - ] + sources = [ "//chrome/tools/build/linux/chrome-wrapper" ] if (is_linux) { sources += [ "//chrome/app/theme/$branding_path_component/linux/product_logo_48.png",
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 594c792..cb13aa7 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -2972,6 +2972,7 @@ "java/src/org/chromium/chrome/browser/app/tabmodel/TabGroupSyncDepsProvider.java", "java/src/org/chromium/chrome/browser/app/tabmodel/TabStoragePackager.java", "java/src/org/chromium/chrome/browser/app/tabwindow/TabWindowManagerObserver.java", + "java/src/org/chromium/chrome/browser/autofill/AutofillDialogController.java", "java/src/org/chromium/chrome/browser/autofill/AutofillExpirationDateFixFlowBridge.java", "java/src/org/chromium/chrome/browser/autofill/AutofillFallbackSurfaceLauncher.java", "java/src/org/chromium/chrome/browser/autofill/AutofillNameFixFlowBridge.java",
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index bed9169..c0c0dab 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -135,6 +135,7 @@ "java/src/org/chromium/chrome/browser/app/usb/UsbNotificationServiceImpl.java", "java/src/org/chromium/chrome/browser/app/xsurface_provider/ProcessScopeDependencyProviderFactoryImpl.java", "java/src/org/chromium/chrome/browser/appearance/settings/AppearanceSettingsFragment.java", + "java/src/org/chromium/chrome/browser/autofill/AutofillDialogController.java", "java/src/org/chromium/chrome/browser/autofill/AutofillExpirationDateFixFlowBridge.java", "java/src/org/chromium/chrome/browser/autofill/AutofillExpirationDateFixFlowPrompt.java", "java/src/org/chromium/chrome/browser/autofill/AutofillFallbackSurfaceLauncher.java", @@ -177,13 +178,13 @@ "java/src/org/chromium/chrome/browser/autofill/settings/AutofillPaymentMethodsFragment.java", "java/src/org/chromium/chrome/browser/autofill/settings/AutofillProfileEditorPreference.java", "java/src/org/chromium/chrome/browser/autofill/settings/AutofillProfilesFragment.java", - "java/src/org/chromium/chrome/browser/autofill/settings/HomeOfTransactionsFragment.java", "java/src/org/chromium/chrome/browser/autofill/settings/AutofillServerCardEditor.java", "java/src/org/chromium/chrome/browser/autofill/settings/AutofillVirtualCardEnrollmentDialog.java", "java/src/org/chromium/chrome/browser/autofill/settings/AutofillVirtualCardUnenrollmentDialog.java", "java/src/org/chromium/chrome/browser/autofill/settings/CreditCardNumberFormattingTextWatcher.java", "java/src/org/chromium/chrome/browser/autofill/settings/CreditCardScannerManager.java", "java/src/org/chromium/chrome/browser/autofill/settings/FinancialAccountsManagementFragment.java", + "java/src/org/chromium/chrome/browser/autofill/settings/HomeOfTransactionsFragment.java", "java/src/org/chromium/chrome/browser/autofill/settings/NonCardPaymentMethodsManagementFragment.java", "java/src/org/chromium/chrome/browser/autofill/settings/SettingsNavigationHelper.java", "java/src/org/chromium/chrome/browser/autofill/settings/VirtualCardEnrollmentFields.java",
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 d124f742..c636cbc 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
@@ -46,7 +46,7 @@ <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="2359808026110333948">Jätka</translation> -<translation id="2371084566192454134">Vaheleht</translation> +<translation id="2371084566192454134">Vahelehed ja vahelehegrupid</translation> <translation id="2375257132547014176">{TABS_COUNT,plural, =1{Ahenda <ph name="TABS_COUNT_ONE" /> vahelehega vahelehegrupp <ph name="TITLE_OF_GROUP" />.}other{Ahenda <ph name="TABS_COUNT_MANY" /> vahelehega vahelehegrupp <ph name="TITLE_OF_GROUP" />.}}</translation> <translation id="2476179388576975626">Pilt pildis</translation> <translation id="2498435670446402865">Vahelehegrupi ümbernimetamine</translation> @@ -110,7 +110,7 @@ <translation id="4861611890274104875">Sulge kaart.</translation> <translation id="4861953997778766866">Kõik saavad teie jagatud vahelehegruppides muudatusi teha</translation> <translation id="4870911314065352661">Kas sulgeda kõik vahelehed?</translation> -<translation id="4871719318659334896">Grupi sulgemine</translation> +<translation id="4871719318659334896">Sulge grupp</translation> <translation id="4876860795942196286">{NUMBER_OF_TABS,plural, =1{Taastage ja avage vahelehtede rühm (<ph name="TITLE_OF_GROUP" />) <ph name="TABS_COUNT_ONE" /> vahelehega, värviga <ph name="COLOR_NAME" />.}other{Taastage ja avage vahelehtede rühm (<ph name="TITLE_OF_GROUP" />) <ph name="TABS_COUNT_MANY" /> vahelehega, värviga <ph name="COLOR_NAME" />.}}</translation> <translation id="4881695831933465202">Ava</translation> <translation id="4894777338623123366">Vahelehekuva jagamine</translation> @@ -209,7 +209,7 @@ <translation id="799469866974412355">Uus grupp teie teises seadmes</translation> <translation id="8029301326595421733">Selle poe teave on avatud täiskõrgusel</translation> <translation id="8053770993984522566">Vahelehegruppide loend, avatud poolel kõrgusel</translation> -<translation id="805809603610022708">{TABS_COUNT,plural, =1{Vahelehe lisamine gruppi}other{Vahelehtede lisamine gruppi}}</translation> +<translation id="805809603610022708">{TABS_COUNT,plural, =1{Lisa vaheleht gruppi}other{Lisa vahelehed gruppi}}</translation> <translation id="8138067144082174140">14 passiivse päeva järel</translation> <translation id="8153873338998959464">{NUMBER_OF_TABS,plural, =1{Laienda <ph name="TABS_COUNT_ONE" /> vahelehega vahelehegruppi <ph name="TITLE_OF_GROUP" />, värv on <ph name="COLOR_NAME" />.}other{Laienda <ph name="TABS_COUNT_MANY" /> vahelehega vahelehegruppi <ph name="TITLE_OF_GROUP" />, värv on <ph name="COLOR_NAME" />.}}</translation> <translation id="8195186926670288294">{TABS_COUNT,plural, =1{Vabasta vaheleht}other{Vabasta vahelehed}}</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 2931cfe..0ba925c8 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
@@ -20,7 +20,7 @@ <translation id="1499635324672558517">Tutup semua tab Samaran?</translation> <translation id="1501480321619201731">Hapus grup</translation> <translation id="1553638665176794706">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> item tidak aktif}other{<ph name="TABS_COUNT_MANY" /> item tidak aktif}}</translation> -<translation id="1568067597247500137">Matikan notifikasi situs</translation> +<translation id="1568067597247500137">Bisukan situs</translation> <translation id="1645759014353344461"><ph name="TABS_COUNT_MANY" /> tab dikelompokkan</translation> <translation id="1657719826150349398">Pindahkan tab ke bawah</translation> <translation id="1670942869417022142">Audio dibisukan</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 f3e099e..cbac61a 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
@@ -41,10 +41,10 @@ <translation id="2123073051266141035">{INCOGNITO_TABS_COUNT,plural, =1{您可以从“最近打开的标签页”部分和“标签页分组”部分重新打开已关闭的标签页和分组。不过,无法打开已关闭的无痕式标签页。}other{您可以从“最近打开的标签页”部分和“标签页分组”部分重新打开已关闭的标签页和分组。不过,无法打开您已关闭的 # 个无痕式标签页。}}</translation> <translation id="2153899164605463849">{TAB_COUNT,plural, =1{将网站取消静音}other{将网站取消静音}}</translation> <translation id="2162620598375156287"><ph name="SOURCE_WEBSITE" /> 上的现价为 <ph name="CURRENT_PRICE" /></translation> -<translation id="22623456902492423">{TABS_COUNT,plural, =1{为标签页取消分组}other{为标签页取消分组}}</translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{将标签页取消分组}other{将标签页取消分组}}</translation> <translation id="2271452184061378400">您的标签页分组会保存在此处</translation> <translation id="2277224997687551299">修改组名称</translation> -<translation id="2330212241471632770">{TABS_COUNT,plural, =1{为所选标签页添加书签}other{为所有所选标签页添加书签}}</translation> +<translation id="2330212241471632770">{TABS_COUNT,plural, =1{为所选标签页添加书签}other{为所选标签页添加书签}}</translation> <translation id="2359808026110333948">继续</translation> <translation id="2371084566192454134">标签页和标签页分组</translation> <translation id="2375257132547014176">{TABS_COUNT,plural, =1{收起包含 <ph name="TABS_COUNT_ONE" /> 个标签页的“<ph name="TITLE_OF_GROUP" />”标签页分组。}other{收起包含 <ph name="TABS_COUNT_MANY" /> 个标签页的“<ph name="TITLE_OF_GROUP" />”标签页分组。}}</translation>
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java index 9ff6e688..32479ef0 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java
@@ -172,6 +172,7 @@ private @Nullable NtpCustomizationConfigManager mNtpCustomizationConfigManager; private @Nullable NtpBackgroundImageCoordinator mNtpBackgroundImageCoordinator; private NtpCustomizationConfigManager.@Nullable HomepageStateListener mHomepageStateListener; + private RecyclerView.@Nullable ItemDecoration mItemDecoration; /** Provides the additional capabilities needed for the container view. */ private class RootView extends FrameLayout { @@ -716,6 +717,11 @@ @Override @SuppressWarnings("NullAway") public void destroy() { + mRecyclerView.setItemAnimator(null); + if (mItemDecoration != null) { + mRecyclerView.removeItemDecoration(mItemDecoration); + } + if (mSwipeRefreshLayout != null) { if (mSwipeRefreshLayout.isRefreshing()) { mSwipeRefreshLayout.setRefreshing(false); @@ -965,14 +971,15 @@ if (ChromeFeatureList.isEnabled(ChromeFeatureList.FEED_CONTAINMENT)) { // Used to draw containment background. - view.addItemDecoration( + mItemDecoration = new FeedItemDecoration( mActivity, this, (resId) -> { return AppCompatResources.getDrawable(mActivity, resId); }, - gutterPadding)); + gutterPadding); + view.addItemDecoration(mItemDecoration); } // Work around https://crbug.com/943873 where default focus highlight shows up after
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java index 90d3071..9ffa0b5b 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java
@@ -124,6 +124,13 @@ void destroy() { mSigninPromoCoordinator.destroy(); + if (mOnLayoutChangeListener != null) { + mCoordinator.getView().removeOnLayoutChangeListener(mOnLayoutChangeListener); + } + + if (mSnapScrollHelper != null) { + mSnapScrollHelper.destroy(); + } mCoordinator.updateHeaderViews(/* signinPromoView= */ null); } @@ -204,6 +211,7 @@ private final SigninManager mSigninManager; private final TemplateUrlService mTemplateUrlService; private final FeedActionDelegate mActionDelegate; + private View.@Nullable OnLayoutChangeListener mOnLayoutChangeListener; private final SettableNonNullObservableSupplier<Integer> mGetRestoringStateSupplier = ObservableSuppliers.createNonNull(RestoringState.WAITING_TO_RESTORE); @@ -338,15 +346,14 @@ // Listen for layout changes on the NewTabPageView itself to catch changes in scroll // position that are due to layout changes after e.g. device rotation. This contrasts with // regular scrolling, which is observed through an OnScrollListener. - mCoordinator - .getView() - .addOnLayoutChangeListener( - (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { - mCoordinator.getView().postOnAnimation(mSnapScrollHelper::handleScroll); - float pixelToDp = mContext.getResources().getDisplayMetrics().density; - int widthDp = (int) ((right - left) / pixelToDp); - updateLayout(widthDp < SMALL_WIDTH_DP); - }); + mOnLayoutChangeListener = + (view, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { + mCoordinator.getView().postOnAnimation(mSnapScrollHelper::handleScroll); + float pixelToDp = mContext.getResources().getDisplayMetrics().density; + int widthDp = (int) ((right - left) / pixelToDp); + updateLayout(widthDp < SMALL_WIDTH_DP); + }; + mCoordinator.getView().addOnLayoutChangeListener(mOnLayoutChangeListener); } /** @@ -698,6 +705,8 @@ mStreamHolder.destroy(); mStreamHolder = null; } + + mRecyclerViewAnimationFinishDetector.destroy(); mStreamContentChangedListener = null; unbindStream(); @@ -955,6 +964,12 @@ } } + void destroy() { + if (mFinishedCallback != null) { + mFinishedCallback = null; + } + } + @Override public void onAnimationsFinished() { // There might still be more items that will be animated after this one.
diff --git a/chrome/android/java/res/layout/custom_tabs_handle_view.xml b/chrome/android/java/res/layout/custom_tabs_handle_view.xml index 351b693..87ed562 100644 --- a/chrome/android/java/res/layout/custom_tabs_handle_view.xml +++ b/chrome/android/java/res/layout/custom_tabs_handle_view.xml
@@ -5,32 +5,45 @@ found in the LICENSE file. --> -<FrameLayout +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/custom_tabs_handle_container" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/custom_tabs_handle_view_shape" - tools:ignore="UselessParent"> - <org.chromium.chrome.browser.customtabs.features.partialcustomtab.CustomTabDragBar - android:id="@+id/drag_bar" + android:orientation="vertical" + android:baselineAligned="false"> + <FrameLayout android:layout_width="match_parent" android:layout_height="@dimen/custom_tabs_handle_height" - android:importantForAccessibility="no" + android:id="@+id/custom_tabs_handle_view" android:background="@drawable/custom_tabs_handle_view_shape"> - </org.chromium.chrome.browser.customtabs.features.partialcustomtab.CustomTabDragBar> - <ImageView - android:id="@+id/drag_handle" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="top|center_horizontal" - android:clickable="true" - android:focusable="true" - android:src="@drawable/drag_handlebar" - android:paddingTop="@dimen/custom_tabs_drag_handle_padding_top" - android:paddingBottom="@dimen/custom_tabs_drag_handle_padding_bottom" - android:paddingStart="@dimen/custom_tabs_drag_handle_padding_side" - android:paddingEnd="@dimen/custom_tabs_drag_handle_padding_side" - android:contentDescription="@string/accessibility_custom_tab_drag_handle" - android:tint="@macro/drag_handle_color" /> -</FrameLayout> + <org.chromium.chrome.browser.customtabs.features.partialcustomtab.CustomTabDragBar + android:id="@+id/drag_bar" + android:layout_width="match_parent" + android:layout_height="@dimen/custom_tabs_handle_height" + android:importantForAccessibility="no" + android:background="@drawable/custom_tabs_handle_view_shape"> + </org.chromium.chrome.browser.customtabs.features.partialcustomtab.CustomTabDragBar> + <ImageView + android:id="@+id/drag_handle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="top|center_horizontal" + android:clickable="true" + android:focusable="true" + android:src="@drawable/drag_handlebar" + android:paddingTop="@dimen/custom_tabs_drag_handle_padding_top" + android:paddingBottom="@dimen/custom_tabs_drag_handle_padding_bottom" + android:paddingStart="@dimen/custom_tabs_drag_handle_padding_side" + android:paddingEnd="@dimen/custom_tabs_drag_handle_padding_side" + android:contentDescription="@string/accessibility_custom_tab_drag_handle" + android:tint="@macro/drag_handle_color" /> + </FrameLayout> + <FrameLayout + android:id="@+id/custom_tabs_content_background" + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1"> + </FrameLayout> +</LinearLayout>
diff --git a/chrome/android/java/res_app/layout/main.xml b/chrome/android/java/res_app/layout/main.xml index 8414a5d..216e769e 100644 --- a/chrome/android/java/res_app/layout/main.xml +++ b/chrome/android/java/res_app/layout/main.xml
@@ -14,7 +14,7 @@ make the custom tab rounded. --> <ViewStub android:id="@+id/custom_tabs_handle_view_stub" - android:inflatedId="@+id/custom_tabs_handle_view" + android:inflatedId="@+id/custom_tabs_handle_container" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="@dimen/custom_tabs_shadow_offset"
diff --git a/chrome/android/java/res_app/layout/main_forked_with_secondary_ui_container.xml b/chrome/android/java/res_app/layout/main_forked_with_secondary_ui_container.xml index 6b43b90b..375fb25 100644 --- a/chrome/android/java/res_app/layout/main_forked_with_secondary_ui_container.xml +++ b/chrome/android/java/res_app/layout/main_forked_with_secondary_ui_container.xml
@@ -23,7 +23,7 @@ make the custom tab rounded. --> <ViewStub android:id="@+id/custom_tabs_handle_view_stub" - android:inflatedId="@+id/custom_tabs_handle_view" + android:inflatedId="@+id/custom_tabs_handle_container" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="@dimen/custom_tabs_shadow_offset"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ActivityTabProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/ActivityTabProvider.java index 632df80..fb81c22 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ActivityTabProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ActivityTabProvider.java
@@ -149,6 +149,15 @@ triggerActivityTabChangeEvent(null); } } + + @Override + public void tabRemoved(Tab tab) { + // If the last tab was removed (e.g. reparented), make sure a signal is sent + // to the observers. + if (selector.getCurrentModel().getCount() == 0) { + triggerActivityTabChangeEvent(null); + } + } }; mTabModelSelector
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java index 54379b68..179a354 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
@@ -1093,6 +1093,7 @@ new ChromeAndroidTask.ActivityScopedObjects( activityWindowAndroid, tabModelSelector, + browserWindowType, supportedProfileType, desktopWindowStateManager, multiInstanceManager),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillDialogController.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillDialogController.java new file mode 100644 index 0000000..81c00dc9 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillDialogController.java
@@ -0,0 +1,121 @@ +// Copyright 2026 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.autofill; + +import android.content.Context; + +import androidx.annotation.VisibleForTesting; + +import org.jni_zero.CalledByNative; +import org.jni_zero.JNINamespace; +import org.jni_zero.JniType; +import org.jni_zero.NativeMethods; + +import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; +import org.chromium.components.browser_ui.widget.ActionConfirmationDialog; +import org.chromium.components.browser_ui.widget.ActionConfirmationDialog.ConfirmationDialogParams; +import org.chromium.components.browser_ui.widget.ActionConfirmationDialog.DialogDismissType; +import org.chromium.components.browser_ui.widget.ActionConfirmationDialog.DismissHandler; +import org.chromium.components.browser_ui.widget.StrictButtonPressController.ButtonClickResult; +import org.chromium.ui.base.WindowAndroid; +import org.chromium.ui.modaldialog.DialogDismissalCause; +import org.chromium.ui.modaldialog.ModalDialogManager; +import org.chromium.ui.modaldialog.ModalDialogManagerHolder; + +/** Controller that allows the native autofill code to show an {@link ActionConfirmationDialog}. */ +@JNINamespace("autofill") +@NullMarked +public class AutofillDialogController { + private long mNativeAutofillDialogView; + private final Context mContext; + private final ModalDialogManager mModalDialogManager; + private final ActionConfirmationDialog mDialog; + + private AutofillDialogController(long nativeAutofillDialogView, Context context) { + this( + nativeAutofillDialogView, + context, + ((ModalDialogManagerHolder) context).getModalDialogManager(), + new ActionConfirmationDialog( + context, ((ModalDialogManagerHolder) context).getModalDialogManager())); + } + + @VisibleForTesting + AutofillDialogController( + long nativeAutofillDialogView, + Context context, + ModalDialogManager modalDialogManager, + ActionConfirmationDialog dialog) { + mContext = context; + mNativeAutofillDialogView = nativeAutofillDialogView; + mModalDialogManager = modalDialogManager; + mDialog = dialog; + } + + @CalledByNative + static @Nullable AutofillDialogController create( + long nativeAutofillDialogView, WindowAndroid windowAndroid) { + Context context = windowAndroid.getContext().get(); + if (context == null) { + return null; + } + return new AutofillDialogController(nativeAutofillDialogView, context); + } + + /** + * Show the dialog. + * + * @param title The title of the dialog. + * @param description The description of the dialog. + * @param buttonText The text of the positive button. + */ + @CalledByNative + void show( + @JniType("std::u16string") String title, + @JniType("std::u16string") String description, + @JniType("std::u16string") String buttonText) { + // TODO: crbug.com/476753598 - Remove "cancel" button. + mDialog.show( + new ConfirmationDialogParams(mContext) + .withTitle(title) + .withDescription(description) + .withPositiveButton(buttonText) + .withNegativeButton(R.string.cancel), + this::handleDialogAction); + } + + /** Dismiss the autofill dialog if it's showing. No-op if it's not showing. */ + @CalledByNative + @VisibleForTesting + void dismiss() { + if (mDialog != null) { + mModalDialogManager.dismissAllDialogs(DialogDismissalCause.DISMISSED_BY_NATIVE); + mNativeAutofillDialogView = 0; + } + } + + private @DialogDismissType int handleDialogAction( + DismissHandler dismissHandler, + @ButtonClickResult int buttonClickResult, + boolean stopShowing) { + if (mNativeAutofillDialogView == 0) { + return DialogDismissType.DISMISS_IMMEDIATELY; + } + if (buttonClickResult == ButtonClickResult.POSITIVE) { + AutofillDialogControllerJni.get().onPositiveButtonClicked(mNativeAutofillDialogView); + } + AutofillDialogControllerJni.get().onDismissed(mNativeAutofillDialogView); + mNativeAutofillDialogView = 0; + return DialogDismissType.DISMISS_IMMEDIATELY; + } + + @NativeMethods + public interface Natives { + void onPositiveButtonClicked(long nativeAutofillDialogViewAndroid); + + void onDismissed(long nativeAutofillDialogViewAndroid); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java index 03636db..0bceb5bf 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java
@@ -1728,7 +1728,7 @@ switch (type) { case CustomTabsUiType.DEFAULT: if (browserWindowInterfaceEnabled) { - return BrowserWindowType.NORMAL; + return BrowserWindowType.CUSTOM_TAB; } break; // Popups.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java index e1969a96..7b4f8c4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java
@@ -50,6 +50,7 @@ import android.util.Pair; import android.widget.RemoteViews; +import androidx.annotation.ColorInt; import androidx.annotation.IntDef; import androidx.annotation.Px; import androidx.annotation.VisibleForTesting; @@ -101,6 +102,7 @@ import org.chromium.chrome.browser.ui.google_bottom_bar.proto.IntentParams.GoogleBottomBarIntentParams; import org.chromium.chrome.browser.ui.web_app_header.WebAppHeaderUtils; import org.chromium.chrome.browser.util.WindowFeatures; +import org.chromium.components.browser_ui.styles.SemanticColorUtils; import org.chromium.components.browser_ui.widget.TintedDrawable; import org.chromium.components.embedder_support.util.Origin; import org.chromium.components.embedder_support.util.UrlConstants; @@ -210,6 +212,9 @@ static final String EXTRA_CUSTOM_CONTENT_ACTIONS = "androidx.browser.customtabs.extra.CUSTOM_CONTENT_ACTIONS"; + private static final String EXTRA_TRANSLUCENT_BACKGROUND = + "androidx.browser.customtabs.extra.TRANSLUCENT_BACKGROUND"; + @IntDef({ CustomTabsButtonState.BUTTON_STATE_OFF, CustomTabsButtonState.BUTTON_STATE_ON, @@ -500,6 +505,13 @@ : roundedCornersPosition; } + @Override + public @ColorInt int getTranslucentBackgroundColor(Context context) { + int defValue = SemanticColorUtils.getDefaultBgColor(context); + // TODO(crbug.com/493918709): Limit the minimum alpha to 50% to avoid too much transparency. + return IntentUtils.safeGetIntExtra(mIntent, EXTRA_TRANSLUCENT_BACKGROUND, defValue); + } + private static boolean getIsCloseButtonEnabled(Intent intent, int uiType) { return IntentUtils.safeGetBooleanExtra(intent, EXTRA_CLOSE_BUTTON_ENABLED, true) && uiType != CustomTabsUiType.POPUP;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBottomSheetStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBottomSheetStrategy.java index 2f99f795..5c8e79e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBottomSheetStrategy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBottomSheetStrategy.java
@@ -62,10 +62,12 @@ import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.lifecycle.ConfigurationChangedObserver; import org.chromium.chrome.browser.multiwindow.MultiWindowUtils; +import org.chromium.chrome.browser.page_load_metrics.PageLoadMetrics; import org.chromium.chrome.browser.tab.Tab; import org.chromium.components.browser_ui.styles.SemanticColorUtils; import org.chromium.components.browser_ui.widget.TouchEventObserver; import org.chromium.components.browser_ui.widget.TouchEventProvider; +import org.chromium.content_public.browser.WebContents; import org.chromium.ui.accessibility.AccessibilityState; import org.chromium.ui.util.ColorUtils; @@ -140,6 +142,10 @@ // This is a workaround to an issue of the host app briefly flashing when the tab is resized. private boolean mInitFirstHeight; + // Translucent background color. This keeps the host app visible while the page is loading. + private final @ColorInt int mBackgroundColor; + private boolean mUseTranslucentBackground; + public PartialCustomTabBottomSheetStrategy( Activity activity, BrowserServicesIntentDataProvider intentData, @@ -199,6 +205,13 @@ new GestureDetector( activity, mGestureHandler, ThreadUtils.getUiThreadHandler()); } + mBackgroundColor = intentData.getTranslucentBackgroundColor(activity); + } + + private void setContentVisibility(boolean visible) { + mActivity + .findViewById(R.id.compositor_view_holder) + .setVisibility(visible ? View.VISIBLE : View.INVISIBLE); } @Override @@ -318,6 +331,7 @@ @Override public void onPostInflationStartup() { super.onPostInflationStartup(); + if (mUseTranslucentBackground) setContentVisibility(false); // Bottom-sheet can start in fullscreen mode. Remove the top margin. if (isFullscreen()) setTopMargins(0, 0); @@ -386,6 +400,27 @@ mTouchEventProvider.get().addTouchEventObserver(this); } updateDragBarVisibility(); + + mUseTranslucentBackground = + mBackgroundColor != SemanticColorUtils.getDefaultBgColor(mActivity); + if (mUseTranslucentBackground) { + mActivity + .findViewById(R.id.custom_tabs_content_background) + .setBackgroundColor(mBackgroundColor); + PageLoadMetrics.addObserver( + new PageLoadMetrics.Observer() { + @Override + public void onFirstContentfulPaint( + WebContents webContents, + long navigationId, + long navigationStartMicros, + long firstContentfulPaintMs) { + setContentVisibility(true); + PageLoadMetrics.removeObserver(this); + } + }, + true); + } } private void onDragBarTapped() { @@ -659,6 +694,11 @@ return; } } + + if (!mUseTranslucentBackground) triggerSpinnerView(y); + } + + private void triggerSpinnerView(int y) { // Show the spinner lazily, only when the tab is dragged _up_, which requires showing // more area than initial state. if (!mStopShowingSpinner
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/SnapScrollHelperImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/SnapScrollHelperImpl.java index a92c8f8..05c2777 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/SnapScrollHelperImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/SnapScrollHelperImpl.java
@@ -152,9 +152,20 @@ return scrollPosition; } + @Override + public void destroy() { + if (mView != null) { + mView.setOnTouchListener(null); + mView.removeCallbacks(mSnapScrollRunnable); + mView.removeCallbacks(mUpdateSearchBoxOnScrollRunnable); + mView = null; + } + } + /** * Calculates the position to scroll to in order to move out of a region where {@code mView} * should not stay at rest. + * * @param currentScroll the current scroll position. * @param regionStart the beginning of the region to scroll out of. * @param regionEnd the end of the region to scroll out of.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ChromePaymentRequestService.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ChromePaymentRequestService.java index e6f5789..453bcb5d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ChromePaymentRequestService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ChromePaymentRequestService.java
@@ -338,10 +338,7 @@ // Either there are no apps, XOR the new fallback flow is enabled where there must be an SPC // app. assert !hasAvailableApps() - ^ (PaymentFeatureList.isEnabledOrExperimentalFeaturesEnabled( - PaymentFeatureList.SECURE_PAYMENT_CONFIRMATION_FALLBACK) - || ContentFeatureMap.isEnabled( - BlinkFeatures.SECURE_PAYMENT_CONFIRMATION_UX_REFRESH)); + ^ ContentFeatureMap.isEnabled(BlinkFeatures.SECURE_PAYMENT_CONFIRMATION_UX_REFRESH); mJourneyLogger.setNoMatchingCredentialsShown(); @@ -430,86 +427,27 @@ return mSpcController.show(); } - if (PaymentFeatureList.isEnabledOrExperimentalFeaturesEnabled( - PaymentFeatureList.SECURE_PAYMENT_CONFIRMATION_FALLBACK)) { - assert mSpcAuthnUiController == null; - mSpcAuthnUiController = SecurePaymentConfirmationAuthnController.create(mWebContents); + mNoMatchingController = + SecurePaymentConfirmationNoMatchingCredController.create(mWebContents); + Runnable continueCallback = + () -> { + RecordHistogram.recordEnumeratedHistogram( + SPC_FALLBACK_OUTCOME_HISTOGRAM, + SpcResponseStatus.ANOTHER_WAY, + SpcResponseStatus.COUNT); + mJourneyLogger.setAborted(AbortReason.ABORTED_BY_USER); + disconnectFromClientWithDebugMessage( + ErrorStrings.WEB_AUTHN_OPERATION_TIMED_OUT_OR_NOT_ALLOWED, + PaymentErrorReason.NOT_ALLOWED_ERROR); + }; + assert mNoMatchingController != null; + mNoMatchingController.show( + continueCallback, + optOutCallback, + spcMethodData.securePaymentConfirmation.showOptOut, + spcMethodData.securePaymentConfirmation.rpId); - Callback<Integer> responseCallback = - (responseStatus) -> { - RecordHistogram.recordEnumeratedHistogram( - SPC_FALLBACK_OUTCOME_HISTOGRAM, - responseStatus, - SpcResponseStatus.COUNT); - - switch (responseStatus) { - case SpcResponseStatus.ANOTHER_WAY: - mJourneyLogger.setAborted(AbortReason.ABORTED_BY_USER); - disconnectFromClientWithDebugMessage( - ErrorStrings.WEB_AUTHN_OPERATION_TIMED_OUT_OR_NOT_ALLOWED, - PaymentErrorReason.NOT_ALLOWED_ERROR); - break; - case SpcResponseStatus.CANCEL: - mJourneyLogger.setAborted(AbortReason.ABORTED_BY_USER); - disconnectFromClientWithDebugMessage( - ErrorStrings.USER_CANCELLED, - PaymentErrorReason.USER_CANCEL); - break; - default: - Log.e(TAG, "Unexpected SPC response status: %d", responseStatus); - mJourneyLogger.setAborted(AbortReason.ABORTED_BY_USER); - disconnectFromClientWithDebugMessage( - ErrorStrings.WEB_AUTHN_OPERATION_TIMED_OUT_OR_NOT_ALLOWED, - PaymentErrorReason.NOT_ALLOWED_ERROR); - } - mSpcAuthnUiController = null; - }; - - PaymentItem rawTotal = mSpec.getRawTotal(); - assert rawTotal != null; - PaymentApp selectedPaymentApp = getSelectedPaymentApp(); - assert selectedPaymentApp != null; - assert selectedPaymentApp.getDrawableIcon() != null; - assert selectedPaymentApp.getLabel() != null; - assumeNonNull(mSpcAuthnUiController); - - boolean success = - mSpcAuthnUiController.show( - selectedPaymentApp.getDrawableIcon(), - selectedPaymentApp.getLabel(), - rawTotal, - responseCallback, - optOutCallback, - spcMethodData.securePaymentConfirmation.payeeName, - getPayeeOrigin(spcMethodData.securePaymentConfirmation), - spcMethodData.securePaymentConfirmation.showOptOut, - spcMethodData.securePaymentConfirmation.rpId, - /* informOnly= */ true); - - return success; - } else { - mNoMatchingController = - SecurePaymentConfirmationNoMatchingCredController.create(mWebContents); - Runnable continueCallback = - () -> { - RecordHistogram.recordEnumeratedHistogram( - SPC_FALLBACK_OUTCOME_HISTOGRAM, - SpcResponseStatus.ANOTHER_WAY, - SpcResponseStatus.COUNT); - mJourneyLogger.setAborted(AbortReason.ABORTED_BY_USER); - disconnectFromClientWithDebugMessage( - ErrorStrings.WEB_AUTHN_OPERATION_TIMED_OUT_OR_NOT_ALLOWED, - PaymentErrorReason.NOT_ALLOWED_ERROR); - }; - assert mNoMatchingController != null; - mNoMatchingController.show( - continueCallback, - optOutCallback, - spcMethodData.securePaymentConfirmation.showOptOut, - spcMethodData.securePaymentConfirmation.rpId); - - return true; - } + return true; } // Implements BrowserPaymentRequest:
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java index ea9905f..6ff7dee 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
@@ -1704,7 +1704,10 @@ mActivityLifecycleDispatcher, mSnackbarManagerSupplier.get()); mTabBottomSheetManager = - new TabBottomSheetManager(mWindowAndroid, getBottomSheetController()); + new TabBottomSheetManager( + mWindowAndroid, + getBottomSheetController(), + mLayoutStateProviderOneShotSupplier); } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ActivityTabProviderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ActivityTabProviderTest.java index 065b734..e12def0d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ActivityTabProviderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ActivityTabProviderTest.java
@@ -245,6 +245,30 @@ assertEquals("The activity's tab should be null.", null, mActivityTab); } + /** Test that onActivityTabChanged is triggered when the last tab is removed. */ + @Test + @SmallTest + @Feature({"ActivityTabObserver"}) + @Restriction(DeviceFormFactor.PHONE) + public void testTriggerOnLastTabRemoved() throws TimeoutException { + TabModelSelector selector = mActivity.getTabModelSelector(); + + int callCount = mActivityTabChangedHelper.getCallCount(); + ThreadUtils.runOnUiThreadBlocking( + () -> { + selector.getCurrentModel() + .getTabRemover() + .removeTab(getModelSelectedTab(), /* allowDialog= */ false); + }); + mActivityTabChangedHelper.waitForCallback(callCount); + + assertEquals( + "Removing the last tab should have triggered the event once.", + callCount + 1, + mActivityTabChangedHelper.getCallCount()); + assertEquals("The activity's tab should be null.", null, mActivityTab); + } + /** * Test that the correct tab is considered the activity tab when a different tab is closed on * phone.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorControllerTest.java index aac57d7..8713eea 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorControllerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorControllerTest.java
@@ -30,7 +30,6 @@ import androidx.test.filters.SmallTest; import org.junit.Assume; -import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -41,7 +40,6 @@ import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CriteriaHelper; -import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Features; import org.chromium.base.test.util.Features.DisableFeatures; @@ -101,8 +99,9 @@ private EdgeToEdgeSystemBarColorHelper mEdgeToEdgeSystemBarColorHelper; private WindowSystemBarColorHelper mWindowSystemBarColorHelper; - @Before - public void setUp() throws InterruptedException { + // This should be called directly from tests to allow for settings 3-button mode via + // EdgeToEdgeUtils. + public void initialize() { mPage = mActivityTestRule.startOnBlankPage(); mWindow = mActivityTestRule.getActivity().getWindow(); Context context = mActivityTestRule.getActivity(); @@ -127,6 +126,8 @@ @SmallTest @DisabledTest(message = "crbug.com/419391905") public void testToggleOverview() { + initialize(); + assertEquals( "Navigation bar should match the tab background before entering overview mode.", mActivityTestRule.getActivityTab().getBackgroundColor(), @@ -151,39 +152,49 @@ @Test @SmallTest - // TODO(crbug.com/428056054): Do not read color from system window bars on B+. - @DisableIf.Build( - sdk_is_greater_than = Build.VERSION_CODES.VANILLA_ICE_CREAM, - message = "crbug.com/428056054") - public void testToggleIncognitoLegacy() { + @MaxAndroidSdkLevel(29) + public void testToggleIncognitoPreEdgeToEdge() { + initialize(); + IncognitoNewTabPageStation incognitoNtp = mPage.openNewIncognitoTabOrWindowFast(); - assertWindowNavBarIsTransparentOrMatchesColor( - incognitoNtp.getActivity().getWindow(), mDarkNavigationColor); + assertEquals( + mDarkNavigationColor, + incognitoNtp.getActivity().getWindow().getNavigationBarColor()); if (!incognitoNtp.getActivity().isIncognitoWindow()) { RegularNewTabPageStation regularNtp = incognitoNtp.openNewTabOrWindowFast(); - assertWindowNavBarIsTransparentOrMatchesColor( - regularNtp.getActivity().getWindow(), - mActivityTestRule.getActivityTab().getBackgroundColor()); + assertEquals( + mActivityTestRule.getActivityTab().getBackgroundColor(), + regularNtp.getActivity().getWindow().getNavigationBarColor()); } } - // By default, the window navbar will match the tab's background color. However, when drawing - // edge-to-edge, the window navbar will be transparent, and allow tab contents to display - // directly. Either is acceptable, and depends on device navbar settings (3-button vs gesture) - // that are not explicitly exposed by Android. - private static void assertWindowNavBarIsTransparentOrMatchesColor( - Window window, @ColorInt int color) { - boolean hasTransparentNavBar = window.getNavigationBarColor() == Color.TRANSPARENT; - boolean navBarColorMatchesColor = window.getNavigationBarColor() == color; - assertTrue(hasTransparentNavBar || navBarColorMatchesColor); + @Test + @SmallTest + @MinAndroidSdkLevel(Build.VERSION_CODES.R) + @Restriction(DeviceFormFactor.PHONE) + public void testToggleIncognitoEdgeToEdge() { + initialize(); + + IncognitoNewTabPageStation incognitoNtp = mPage.openNewIncognitoTabOrWindowFast(); + assertEquals(mDarkNavigationColor, mEdgeToEdgeSystemBarColorHelper.getNavigationBarColor()); + + if (!incognitoNtp.getActivity().isIncognitoWindow()) { + RegularNewTabPageStation regularNtp = incognitoNtp.openNewTabOrWindowFast(); + CriteriaHelper.pollUiThread( + () -> + mActivityTestRule.getActivityTab().getBackgroundColor() + == mEdgeToEdgeSystemBarColorHelper.getNavigationBarColor()); + } } @Test @MediumTest @DisabledTest(message = "crbug.com/1381509") public void testToggleFullscreen() throws TimeoutException { + initialize(); + assertEquals( "Navigation bar should be colorSurface before entering fullscreen mode.", mRegularNavigationColor, @@ -218,6 +229,8 @@ @MediumTest @MaxAndroidSdkLevel(29) public void testSetNavigationBarScrimFractionPreEdgeToEdge() { + initialize(); + assertEquals( "Navigation bar should match the tab background on normal tabs.", mActivityTestRule.getActivityTab().getBackgroundColor(), @@ -257,6 +270,103 @@ @Test @MediumTest + @MinAndroidSdkLevel(Build.VERSION_CODES.R) + @Restriction(DeviceFormFactor.PHONE) + public void testSetNavigationBarScrimFractionNotEdgeToEdge() { + EdgeToEdgeUtils.setHas3ButtonNavBarForTesting(true); + initialize(); + + assertEquals( + "Navigation bar should match the tab background on normal tabs.", + mActivityTestRule.getActivityTab().getBackgroundColor(), + mEdgeToEdgeSystemBarColorHelper.getNavigationBarColor()); + + ChromeTabbedActivity activity = mActivityTestRule.getActivity(); + View rootView = activity.findViewById(R.id.tab_switcher_view_holder_stub); + ScrimManager scrimManager = activity.getRootUiCoordinatorForTesting().getScrimManager(); + + PropertyModel outerPropertyModel = + ThreadUtils.runOnUiThreadBlocking( + () -> { + PropertyModel propertyModel = + new PropertyModel.Builder(ScrimProperties.ALL_KEYS) + .with(ScrimProperties.ANCHOR_VIEW, rootView) + .with(ScrimProperties.AFFECTS_NAVIGATION_BAR, true) + .build(); + scrimManager.showScrim(propertyModel); + scrimManager.forceAnimationToFinish(propertyModel); + return propertyModel; + }); + + double regularBrightness = ColorUtils.calculateLuminance(mRegularNavigationColor); + CriteriaHelper.pollUiThread( + () -> { + return mActivityTestRule.getActivityTab().getBackgroundColor() + != mEdgeToEdgeSystemBarColorHelper.getNavigationBarColor(); + }, + "Navigation bar color should change due to the scrim."); + @ColorInt int withScrim = mEdgeToEdgeSystemBarColorHelper.getNavigationBarColor(); + assertTrue(regularBrightness > ColorUtils.calculateLuminance(withScrim)); + + ThreadUtils.runOnUiThreadBlocking( + () -> + scrimManager.hideScrim( + outerPropertyModel, /* animate= */ false, /* duration= */ 0)); + CriteriaHelper.pollUiThread( + () -> { + return mActivityTestRule.getActivityTab().getBackgroundColor() + == mEdgeToEdgeSystemBarColorHelper.getNavigationBarColor(); + }, + "Navigation bar color should reset after hiding the scrim."); + } + + @Test + @MediumTest + @MinAndroidSdkLevel(Build.VERSION_CODES.R) + @Restriction(DeviceFormFactor.PHONE) + public void testSetNavigationBarScrimFractionEdgeToEdge() { + EdgeToEdgeUtils.setHas3ButtonNavBarForTesting(false); + initialize(); + + assertEquals( + "Navigation bar should match the tab background on normal tabs.", + mActivityTestRule.getActivityTab().getBackgroundColor(), + mEdgeToEdgeSystemBarColorHelper.getNavigationBarColor()); + + ChromeTabbedActivity activity = mActivityTestRule.getActivity(); + View rootView = activity.findViewById(R.id.tab_switcher_view_holder_stub); + ScrimManager scrimManager = activity.getRootUiCoordinatorForTesting().getScrimManager(); + + PropertyModel outerPropertyModel = + ThreadUtils.runOnUiThreadBlocking( + () -> { + PropertyModel propertyModel = + new PropertyModel.Builder(ScrimProperties.ALL_KEYS) + .with(ScrimProperties.ANCHOR_VIEW, rootView) + .with(ScrimProperties.AFFECTS_NAVIGATION_BAR, true) + .build(); + scrimManager.showScrim(propertyModel); + scrimManager.forceAnimationToFinish(propertyModel); + return propertyModel; + }); + + assertEquals( + "The scrim will show over the edge-to-edge bottom chin, so no color change is" + + " expected.", + mActivityTestRule.getActivityTab().getBackgroundColor(), + mEdgeToEdgeSystemBarColorHelper.getNavigationBarColor()); + + ThreadUtils.runOnUiThreadBlocking( + () -> + scrimManager.hideScrim( + outerPropertyModel, /* animate= */ false, /* duration= */ 0)); + assertEquals( + mActivityTestRule.getActivityTab().getBackgroundColor(), + mEdgeToEdgeSystemBarColorHelper.getNavigationBarColor()); + } + + @Test + @MediumTest @EnableFeatures({ ChromeFeatureList.NAV_BAR_COLOR_ANIMATION, }) @@ -265,6 +375,8 @@ @Restriction({DeviceFormFactor.PHONE, DeviceRestriction.RESTRICTION_TYPE_NON_AUTO}) @MinAndroidSdkLevel(Build.VERSION_CODES.R) public void testNavBarColorAnimationsEdgeToEdgeBottomChin() throws InterruptedException { + initialize(); + Assume.assumeTrue( "E2E not applicable.", EdgeToEdgeUtils.isEdgeToEdgeBottomChinEnabled(mActivityTestRule.getActivity())); @@ -281,6 +393,7 @@ @Restriction({DeviceFormFactor.PHONE, DeviceRestriction.RESTRICTION_TYPE_NON_AUTO}) @MinAndroidSdkLevel(Build.VERSION_CODES.R) public void testNavBarColorAnimationsEdgeToEdgeEverywhere() throws InterruptedException { + initialize(); testNavBarColorAnimations(); } @@ -289,6 +402,8 @@ @SmallTest @DisableFeatures(ChromeFeatureList.NAV_BAR_COLOR_ANIMATION) public void testNavBarColorAnimationsFeatureFlagDisabled() { + initialize(); + Assume.assumeTrue( "E2E not applicable.", EdgeToEdgeUtils.isEdgeToEdgeBottomChinEnabled(mActivityTestRule.getActivity())); @@ -303,6 +418,7 @@ + ":disable_bottom_chin_color_animation/true/disable_edge_to_edge_layout_color_animation/true" }) public void testNavBarColorAnimationsCachedParamsDisabled() { + initialize(); testNavBarColorAnimationsDisabled(); }
diff --git a/chrome/android/junit/BUILD.gn b/chrome/android/junit/BUILD.gn index aa45c8a..e02b9c2 100644 --- a/chrome/android/junit/BUILD.gn +++ b/chrome/android/junit/BUILD.gn
@@ -476,6 +476,7 @@ resources_package = "org.chromium.chrome.browser.autofill" sources = [ + "src/org/chromium/chrome/browser/autofill/AutofillDialogControllerTest.java", "src/org/chromium/chrome/browser/autofill/AutofillFallbackSurfaceLauncherTest.java", "src/org/chromium/chrome/browser/autofill/AutofillImageFetcherTest.java", "src/org/chromium/chrome/browser/autofill/AutofillImageFetcherUtilsTest.java",
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/AutofillDialogControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/AutofillDialogControllerTest.java new file mode 100644 index 0000000..1dcc29d9a --- /dev/null +++ b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/AutofillDialogControllerTest.java
@@ -0,0 +1,124 @@ +// Copyright 2026 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.autofill; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import android.app.Activity; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.robolectric.Robolectric; +import org.robolectric.annotation.Config; + +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.base.test.util.Batch; +import org.chromium.components.browser_ui.widget.ActionConfirmationDialog; +import org.chromium.components.browser_ui.widget.ActionConfirmationDialog.ConfirmationDialogHandler; +import org.chromium.components.browser_ui.widget.ActionConfirmationDialog.ConfirmationDialogParams; +import org.chromium.components.browser_ui.widget.ActionConfirmationDialog.DismissHandler; +import org.chromium.components.browser_ui.widget.StrictButtonPressController.ButtonClickResult; +import org.chromium.ui.base.TestActivity; +import org.chromium.ui.modaldialog.DialogDismissalCause; +import org.chromium.ui.modaldialog.ModalDialogManager; + +/** Unit tests for {@link AutofillDialogController}. */ +@RunWith(BaseRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +@Batch(Batch.UNIT_TESTS) +public class AutofillDialogControllerTest { + private static final long NATIVE_AUTOFILL_DIALOG_VIEW = 1234L; + private static final String TEST_TITLE = "Test Title"; + private static final String TEST_DESCRIPTION = "Test Description"; + private static final String TEST_BUTTON_TEXT = "Test Button"; + + @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule(); + + @Mock private AutofillDialogController.Natives mNativeMock; + @Mock private ModalDialogManager mModalDialogManager; + @Mock private ActionConfirmationDialog mDialog; + @Mock private DismissHandler mDismissHandler; + + @Captor private ArgumentCaptor<ConfirmationDialogParams> mDialogParamsCaptor; + @Captor private ArgumentCaptor<ConfirmationDialogHandler> mDialogHandlerCaptor; + + private Activity mActivity; + private AutofillDialogController mController; + + @Before + public void setUp() { + mActivity = Robolectric.setupActivity(TestActivity.class); + AutofillDialogControllerJni.setInstanceForTesting(mNativeMock); + mController = + new AutofillDialogController( + NATIVE_AUTOFILL_DIALOG_VIEW, mActivity, mModalDialogManager, mDialog); + } + + @Test + public void testShowDialog_RendersCorrectly() { + mController.show(TEST_TITLE, TEST_DESCRIPTION, TEST_BUTTON_TEXT); + + verify(mDialog).show(mDialogParamsCaptor.capture(), any()); + ConfirmationDialogParams dialogParams = mDialogParamsCaptor.getValue(); + + ConfirmationDialogParams expectedParams = + new ConfirmationDialogParams(mActivity) + .withTitle(TEST_TITLE) + .withDescription(TEST_DESCRIPTION) + .withPositiveButton(TEST_BUTTON_TEXT) + .withNegativeButton(R.string.cancel); + assertEquals(expectedParams, dialogParams); + } + + @Test + public void testPositiveButtonClick_CallsNative() { + mController.show(TEST_TITLE, TEST_DESCRIPTION, TEST_BUTTON_TEXT); + + verify(mDialog).show(any(), mDialogHandlerCaptor.capture()); + ConfirmationDialogHandler dialogHelper = mDialogHandlerCaptor.getValue(); + dialogHelper.onDialogInteracted( + mDismissHandler, ButtonClickResult.POSITIVE, /* stopShowing= */ false); + + // Simulate dismissal after positive button click. + verify(mNativeMock).onPositiveButtonClicked(NATIVE_AUTOFILL_DIALOG_VIEW); + // The onDismissed should only be called if the dialog was dismissed by the user. + verify(mNativeMock).onDismissed(NATIVE_AUTOFILL_DIALOG_VIEW); + } + + @Test + public void testNegativeButtonClick_CallsNativeOnDismissed() { + mController.show(TEST_TITLE, TEST_DESCRIPTION, TEST_BUTTON_TEXT); + + verify(mDialog).show(any(), mDialogHandlerCaptor.capture()); + ConfirmationDialogHandler dialogHelper = mDialogHandlerCaptor.getValue(); + dialogHelper.onDialogInteracted( + mDismissHandler, ButtonClickResult.NEGATIVE, /* stopShowing= */ false); + + // Simulate dismissal after negative button click. + verify(mNativeMock, times(0)).onPositiveButtonClicked(NATIVE_AUTOFILL_DIALOG_VIEW); + // The onDismissed should only be called if the dialog was dismissed by the user. + verify(mNativeMock).onDismissed(NATIVE_AUTOFILL_DIALOG_VIEW); + } + + @Test + public void testDismiss_DismissesDialog() { + mController.show(TEST_TITLE, TEST_DESCRIPTION, TEST_BUTTON_TEXT); + mController.dismiss(); + + verify(mModalDialogManager).dismissAllDialogs(DialogDismissalCause.DISMISSED_BY_NATIVE); + // The onDismissed should only be called if the dialog was dismissed by the user. + verify(mNativeMock, times(0)).onDismissed(NATIVE_AUTOFILL_DIALOG_VIEW); + } +}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabTestRule.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabTestRule.java index bf8febc..2b55e50 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabTestRule.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabTestRule.java
@@ -95,6 +95,8 @@ static final int DEVICE_WIDTH_COMPACT_PORTRAIT = DEVICE_HEIGHT_COMPACT; static final int DEVICE_HEIGHT_COMPACT_PORTRAIT = DEVICE_WIDTH_COMPACT; + private static final int DEFAULT_BG_COLOR = Color.LTGRAY; + @Mock Activity mActivity; @Mock Window mWindow; @Mock WindowManager mWindowManager; @@ -117,6 +119,7 @@ @Mock FullscreenManager mFullscreenManager; @Mock ViewStub mHandleViewStub; @Mock ImageView mHandleView; + @Mock FrameLayout mContentBackground; @Mock ActivityLifecycleDispatcher mActivityLifecycleDispatcher; @Mock LinearLayout mNavbar; @Mock ViewPropertyAnimator mViewAnimator; @@ -157,6 +160,7 @@ MockitoAnnotations.initMocks(this); mConfiguration.orientation = Configuration.ORIENTATION_PORTRAIT; SemanticColorUtils.setDividerLineBgColorForTesting(Color.LTGRAY); + SemanticColorUtils.setDefaultBgColorForTesting(DEFAULT_BG_COLOR); setUpActivityAndWindowMocks(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { @@ -184,6 +188,8 @@ when(mActivity.findViewById(android.R.id.content)).thenReturn(mContentFrame); when(mActivity.findViewById(R.id.custom_tabs_handle_view_stub)).thenReturn(mHandleViewStub); when(mActivity.findViewById(R.id.custom_tabs_handle_view)).thenReturn(mHandleView); + when(mActivity.findViewById(R.id.custom_tabs_content_background)) + .thenReturn(mContentBackground); when(mActivity.findViewById(R.id.drag_bar)).thenReturn(mDragBar); when(mActivity.findViewById(R.id.drag_handle)).thenReturn(mDragHandlebar);
diff --git a/chrome/app/resources/chromium_strings_af.xtb b/chrome/app/resources/chromium_strings_af.xtb index 54f90bdb..96388e4 100644 --- a/chrome/app/resources/chromium_strings_af.xtb +++ b/chrome/app/resources/chromium_strings_af.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">Chromium wil jou Wagwoordbestuurder-data uitvee. Tik jou Windows-wagwoord in om dit toe te laat.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Jou administrateur vereis dat jy Chromium herbegin om 'n opdatering toe te pas}=1{Jou administrateur vereis dat jy Chromium herbegin om 'n opdatering toe te pas. Jou incognitovenster sal nie weer oopgemaak word nie.}other{Jou administrateur vereis dat jy Chromium herbegin om 'n opdatering toe te pas. Jou # incognitovensters sal nie weer oopgemaak word nie.}}</translation> <translation id="1625909126243026060">Gaan belangrike privaatheid- en sekuriteitkontroles in Chromium na</translation> +<translation id="1639380494700489405">Meld aan by Chromium om KI-modus oor jou oortjie te vra sonder om die bladsy te verlaat. Jy sal ook jou wagwoorde en meer op al jou toestelle kry.</translation> <translation id="1640672724030957280">Laai tans af …</translation> <translation id="1680687534629375545">Vra Prentsoektog oor hierdie bladsy</translation> <translation id="1709772298389099340">Verskaf verhoogde voorregte vir <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_am.xtb b/chrome/app/resources/chromium_strings_am.xtb index 1521057..af908677 100644 --- a/chrome/app/resources/chromium_strings_am.xtb +++ b/chrome/app/resources/chromium_strings_am.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">Chromium የእርስዎን የይለፍ ቃል አስተዳዳሪ ውሂብ መሰረዝ ይፈልጋል። ይህን ለመፍቀድ የWindows የይለፍ ቃልዎን ይተይቡ።</translation> <translation id="1607715478322902680">{COUNT,plural, =0{አንድ ዝማኔ ለመተግበር አስተዳዳሪዎ Chromiumን ዳግም እንዲያስጀምሩት ይፈልግብዎታል}=1{አንድ ዝማኔ ለመተግበር አስተዳዳሪዎ Chromiumን ዳግም እንዲያስጀምሩት ይፈልግብዎታል። የእርስዎ ማንነት የማያሳውቅ መስኮት ዳግም አይከፈትም}one{አንድ ዝማኔ ለመተግበር አስተዳዳሪዎ Chromiumን ዳግም እንዲያስጀምሩት ይፈልግብዎታል። የእርስዎ # ማንነት የማያሳውቁ መስኮቶች ዳግም አይከፈቱም}other{አንድ ዝማኔ ለመተግበር አስተዳዳሪዎ Chromiumን ዳግም እንዲያስጀምሩት ይፈልግብዎታል። የእርስዎ # ማንነት የማያሳውቁ መስኮቶች ዳግም አይከፈቱም}}</translation> <translation id="1625909126243026060">በChromium ውስጥ ቁልፍ የግላዊነት እና የደህንነት ቁጥጥሮችን ይገምግሙ</translation> +<translation id="1639380494700489405">ገጹን ለቅቀው ሳይወጡ ስለ ትርዎ የሰው ሠራሽ አስተውሎት ሁነታን ለመጠየቅ ወደ Chromium ይግቡ። እንዲሁም የይለፍ ቃላትዎን እና ሌሎችንም በሁሉም መሣሪያዎችዎ ላይ ያገኛሉ።</translation> <translation id="1640672724030957280">በማውረድ ላይ...</translation> <translation id="1680687534629375545">ስለዚህ ገፅ የምስል ፍለጋን ይጠይቁ</translation> <translation id="1709772298389099340">ለ<ph name="BROWSER_NAME" /> የላቁ ልዩ መብቶች ያቀርባል።</translation>
diff --git a/chrome/app/resources/chromium_strings_ar.xtb b/chrome/app/resources/chromium_strings_ar.xtb index 6cc85bc..da5053d 100644 --- a/chrome/app/resources/chromium_strings_ar.xtb +++ b/chrome/app/resources/chromium_strings_ar.xtb
@@ -55,6 +55,7 @@ <translation id="1594928384848033697">يريد Chromium حذف بياناتك في "مدير كلمات المرور". للسماح بذلك، يُرجى كتابة كلمة المرور المستخدَمة في Windows.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{يطلب المشرف إعادة تشغيل Chromium لتطبيق تحديث.}=1{يطلب المشرف إعادة تشغيل Chromium لتطبيق تحديث. لن تتم إعادة فتح نافذة التصفح المتخفي.}two{يطلب المشرف إعادة تشغيل Chromium لتطبيق تحديث. لن تتم إعادة فتح نافذتَي التصفح المتخفي.}few{يطلب المشرف إعادة تشغيل Chromium لتطبيق تحديث. لن تتم إعادة فتح نوافذ التصفّح المتخفي البالغ عددها #.}many{يطلب المشرف إعادة تشغيل Chromium لتطبيق تحديث. لن تتم إعادة فتح نوافذ التصفّح المتخفي البالغ عددها #.}other{يطلب المشرف إعادة تشغيل Chromium لتطبيق تحديث. لن تتم إعادة فتح نوافذ التصفّح المتخفي البالغ عددها #.}}</translation> <translation id="1625909126243026060">يمكنك مراجعة العناصر الرئيسية للتحكّم في الخصوصية والأمان في Chromium.</translation> +<translation id="1639380494700489405">لطرح أسئلة في "وضع AI" حول علامة التبويب بدون مغادرة الصفحة، يُرجى تسجيل الدخول إلى Chromium. بإمكانك أيضًا الوصول إلى كلمات المرور وغيرها من البيانات على جميع أجهزتك.</translation> <translation id="1640672724030957280">جارٍ التنزيل...</translation> <translation id="1680687534629375545">طرح أسئلة حول محتوى هذه الصفحة باستخدام ميزة "البحث بالصور"</translation> <translation id="1709772298389099340">توفِّر الخدمة أذونات مميّزة وعالية المستوى لمتصفِّح <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_as.xtb b/chrome/app/resources/chromium_strings_as.xtb index e923bb40..054063e 100644 --- a/chrome/app/resources/chromium_strings_as.xtb +++ b/chrome/app/resources/chromium_strings_as.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">Chromiumএ আপোনাৰ Password Managerৰ ডেটা মচিব বিচাৰে। এই কাৰ্যৰ বাবে অনুমতি দিবলৈ আপোনাৰ Windowsৰ পাছৱৰ্ডটো টাইপ কৰক।</translation> <translation id="1607715478322902680">{COUNT,plural, =0{আপোনাৰ প্ৰশাসকে কোনো আপডে’ট প্ৰয়োগ কৰিবলৈ আপুনি Chromium পুনৰ লঞ্চ কৰাটো বিচাৰে}=1{আপোনাৰ প্ৰশাসকে কোনো আপডে’ট প্ৰয়োগ কৰিবলৈ আপুনি Chromium পুনৰ লঞ্চ কৰাটো বিচাৰে। আপোনাৰ.ইনক’গনিট' ৱিণ্ড'খন পুনৰ খুলিব নোৱাৰিব।}one{আপোনাৰ প্ৰশাসকে কোনো আপডে’ট প্ৰয়োগ কৰিবলৈ আপুনি Chromium পুনৰ লঞ্চ কৰাটো বিচাৰে। আপোনাৰ #খন.ইনক’গনিট' ৱিণ্ড' পুনৰ খুলিব নোৱাৰিব।}other{আপোনাৰ প্ৰশাসকে কোনো আপডে’ট প্ৰয়োগ কৰিবলৈ আপুনি Chromium পুনৰ লঞ্চ কৰাটো বিচাৰে। আপোনাৰ #খন.ইনক’গনিট' ৱিণ্ড' পুনৰ খুলিব নোৱাৰিব।}}</translation> <translation id="1625909126243026060">Chromiumত গোপনীয়তা আৰু সুৰক্ষা সম্পৰ্কীয় মুখ্য নিয়ন্ত্ৰণসমূহ পৰ্যালোচনা কৰক</translation> +<translation id="1639380494700489405">পৃষ্ঠাখন এৰি নোযোৱাকৈ আপোনাৰ টেবৰ বিষয়ে AI ম’ডক সুধিবলৈ, Chromiumত ছাইন ইন কৰক। আপুনি লগতে আপোনাৰ আটাইবোৰ ডিভাইচত পাছৱৰ্ড আৰু অধিক লাভ কৰিব।</translation> <translation id="1640672724030957280">ডাউনল’ড হৈ আছে...</translation> <translation id="1680687534629375545">প্ৰতিচ্ছবিৰ সন্ধানক এই পৃষ্ঠাৰ বিষয়ে সোধক</translation> <translation id="1709772298389099340"><ph name="BROWSER_NAME" />ৰ বাবে উচ্চখাপৰ বিশেষাধিকাৰ প্ৰদান কৰে।</translation>
diff --git a/chrome/app/resources/chromium_strings_az.xtb b/chrome/app/resources/chromium_strings_az.xtb index 172af84..afd9809 100644 --- a/chrome/app/resources/chromium_strings_az.xtb +++ b/chrome/app/resources/chromium_strings_az.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">Chromium Parol Meneceri datanızı silmək istəyir. İcazə vermək üçün Windows parolunu yazın.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Administrator güncəlləməni tətbiq etmək üçün Chromium'u yenidən başlatmanızı tələb edir}=1{Administrator güncəlləməni tətbiq etmək üçün Chromium'u yenidən başlatmanızı tələb edir. Anonim pəncərəniz yenidən açılmayacaq.}other{Administrator güncəlləməni tətbiq etmək üçün Chromium'u yenidən başlatmanızı tələb edir. # Anonim pəncərəniz yenidən açılmayacaq.}}</translation> <translation id="1625909126243026060">Chromium'da əsas məxfilik və təhlükəsizlik nəzarətlərini nəzərdən keçirin</translation> +<translation id="1639380494700489405">Səhifədən çıxmadan tab haqqında Sİ rejimindən soruşmaq üçün Chromium-a daxil olun. Bütün cihazlarınızda parollarınızı və daha çoxunu da əldə edəcəksiniz.</translation> <translation id="1640672724030957280">Endirilir...</translation> <translation id="1680687534629375545">Bu səhifə haqqında Şəkil Axtarışından soruşun</translation> <translation id="1709772298389099340"><ph name="BROWSER_NAME" /> üçün artırılmış imtiyazlar təmin edir.</translation>
diff --git a/chrome/app/resources/chromium_strings_be.xtb b/chrome/app/resources/chromium_strings_be.xtb index 62516c9..711dcf7 100644 --- a/chrome/app/resources/chromium_strings_be.xtb +++ b/chrome/app/resources/chromium_strings_be.xtb
@@ -56,6 +56,7 @@ <translation id="1594928384848033697">Chromium збіраецца выдаліць вашы даныя з Менеджара пароляў. Каб дазволіць гэта, увядзіце пароль Windows.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Ваш адміністратар патрабуе перазапусціць Chromium для ўсталявання абнаўлення}=1{Ваш адміністратар патрабуе перазапусціць Chromium для ўсталявання абнаўлення. Акно ў рэжыме інкогніта не будзе адкрыта паўторна.}one{Ваш адміністратар патрабуе перазапусціць Chromium для ўсталявання абнаўлення. # акно ў рэжыме інкогніта не будзе адкрыта паўторна.}few{Ваш адміністратар патрабуе перазапусціць Chromium для ўсталявання абнаўлення. # акны ў рэжыме інкогніта не будуць адкрыты паўторна.}many{Ваш адміністратар патрабуе перазапусціць Chromium для ўсталявання абнаўлення. # вокнаў у рэжыме інкогніта не будуць адкрыты паўторна.}other{Ваш адміністратар патрабуе перазапусціць Chromium для ўсталявання абнаўлення. # акна ў рэжыме інкогніта не будуць адкрыты паўторна.}}</translation> <translation id="1625909126243026060">Праверка ключавых налад бяспекі і прыватнасці ў Chromium</translation> +<translation id="1639380494700489405">Каб задаць пытанне пра ўкладку ў рэжыме AI, не пакідаючы старонку, увайдзіце ў Chromium. Таксама вы атрымаеце доступ да сваіх пароляў і іншых даных на ўсіх сваіх прыладах.</translation> <translation id="1640672724030957280">Ідзе спампоўванне…</translation> <translation id="1680687534629375545">Спытаць пра гэту старонку з дапамогай функцыі "Пошук відарысаў"</translation> <translation id="1709772298389099340">Дае пашыраныя правы для браўзера <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_bg.xtb b/chrome/app/resources/chromium_strings_bg.xtb index 15f604a..ddea426 100644 --- a/chrome/app/resources/chromium_strings_bg.xtb +++ b/chrome/app/resources/chromium_strings_bg.xtb
@@ -55,6 +55,7 @@ <translation id="1594928384848033697">Chromium иска да изтрие данните ви от Мениджър на пароли. За да разрешите това, въведете паролата си за Windows.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Администраторът ви изисква да рестартирате Chromium, за да се приложи актуализация}=1{Администраторът ви изисква да рестартирате Chromium, за да се приложи актуализация. Прозорецът ви в режим „инкогнито“ няма да бъде отворен отново.}other{Администраторът ви изисква да рестартирате Chromium, за да се приложи актуализация. Вашите # прозореца в режим „инкогнито“ няма да бъдат отворени отново.}}</translation> <translation id="1625909126243026060">Прегледайте ключовите контроли в Chromium за поверителност и сигурност</translation> +<translation id="1639380494700489405">За да попитате режима с AI за раздела си, без да напускате страницата, влезте в профила си в Chromium. Също така ще получите паролите си и др. на всичките си устройства.</translation> <translation id="1640672724030957280">Изтегля се...</translation> <translation id="1680687534629375545">Попитайте функцията за търсене на изображения за тази страница</translation> <translation id="1709772298389099340">Предоставя администраторски права за <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_bn.xtb b/chrome/app/resources/chromium_strings_bn.xtb index 7f74827..34ddbe8 100644 --- a/chrome/app/resources/chromium_strings_bn.xtb +++ b/chrome/app/resources/chromium_strings_bn.xtb
@@ -55,6 +55,7 @@ <translation id="1594928384848033697">Chromium আপনার Password Manager সম্পর্কিত ডেটা মুছতে চায়। এটি করার অনুমতি দিতে, আপনার Windows-এর পাসওয়ার্ড টাইপ করুন।</translation> <translation id="1607715478322902680">{COUNT,plural, =0{একটি আপডেট প্রয়োগ করতে আপনার অ্যাডমিনিস্ট্রেটর আপনাকে Chromium আবার চালু করতে বলছেন}=1{একটি আপডেট প্রয়োগ করতে আপনার অ্যাডমিনিস্ট্রেটর আপনাকে Chromium আবার চালু করতে বলছেন। আপনার ছদ্মবেশী উইন্ডো আবার খুলবে না।}one{একটি আপডেট প্রয়োগ করতে আপনার অ্যাডমিনিস্ট্রেটর আপনাকে Chromium আবার চালু করতে বলছেন। আপনার #টি ছদ্মবেশী উইন্ডো আবার খুলবে না।}other{একটি আপডেট প্রয়োগ করতে আপনার অ্যাডমিনিস্ট্রেটর আপনাকে Chromium আবার চালু করতে বলছেন। আপনার #টি ছদ্মবেশী উইন্ডো আবার খুলবে না।}}</translation> <translation id="1625909126243026060">Chromium-এ মূল গোপনীয়তা এবং নিরাপত্তা নিয়ন্ত্রণ পর্যালোচনা করুন</translation> +<translation id="1639380494700489405">পৃষ্ঠা ছেড়ে না বেরিয়েই AI মোডকে আপনার ট্যাব সম্পর্কে জিজ্ঞাসা করতে, Chromium-এ সাইন-ইন করুন। তাছাড়া, আপনার সব ডিভাইসে পাসওয়ার্ড এবং আরও অনেক কিছু পাবেন।</translation> <translation id="1640672724030957280">ডাউনলোড হচ্ছে...</translation> <translation id="1680687534629375545">'ছবি সার্চ করা' ফিচারকে এই পৃষ্ঠার ব্যাপারে জিজ্ঞাসা করুন</translation> <translation id="1709772298389099340">এটি <ph name="BROWSER_NAME" />-এর জন্য বিশেষ সুবিধার অ্যাক্সেস দেয়।</translation>
diff --git a/chrome/app/resources/chromium_strings_bs.xtb b/chrome/app/resources/chromium_strings_bs.xtb index ba31da9..230a07d 100644 --- a/chrome/app/resources/chromium_strings_bs.xtb +++ b/chrome/app/resources/chromium_strings_bs.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">Chromium želi izbrisati vaše podatke iz Upravitelja lozinki. Unesite svoju lozinku za Windows da to dozvolite.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Administrator traži da ponovo pokrenete Chromium radi primjene ažuriranja}=1{Administrator traži da ponovo pokrenete Chromium radi primjene ažuriranja. Vaš anonimni prozor se neće ponovo otvoriti.}one{Administrator traži da ponovo pokrenete Chromium radi primjene ažuriranja. Vaš # anonimni prozor se neće ponovo otvoriti.}few{Administrator traži da ponovo pokrenete Chromium radi primjene ažuriranja. Vaša # anonimna prozora se neće ponovo otvoriti.}other{Administrator traži da ponovo pokrenete Chromium radi primjene ažuriranja. Vaših # anonimnih prozora se neće ponovo otvoriti.}}</translation> <translation id="1625909126243026060">Pregledajte ključne kontrole privatnosti i sigurnosti na Chromiumu</translation> +<translation id="1639380494700489405">Da pitate AI način rada o kartici bez napuštanja stranice, prijavite se u Chromium. Također ćete dobiti svoje lozinke i druge stavke na svim svojim uređajima.</translation> <translation id="1640672724030957280">Preuzimanje…</translation> <translation id="1680687534629375545">Postavite pitanje pretraživanju pomoću slika o ovoj stranici</translation> <translation id="1709772298389099340">Pruža dodatne ovlasti za preglednik <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb index 8f34ce7..00648ee 100644 --- a/chrome/app/resources/chromium_strings_ca.xtb +++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -55,6 +55,7 @@ <translation id="1594928384848033697">Chromium vol suprimir les dades del gestor de contrasenyes. Escriu la teva contrasenya de Windows per permetre-ho.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{L'administrador necessita que reiniciïs Chromium per aplicar una actualització}=1{L'administrador necessita que reiniciïs Chromium per aplicar una actualització. La finestra d'incògnit no es tornarà a obrir.}other{L'administrador necessita que reiniciïs Chromium per aplicar una actualització. Les # finestres d'incògnit no es tornaran a obrir.}}</translation> <translation id="1625909126243026060">Revisa els controls principals de privadesa i seguretat a Chromium</translation> +<translation id="1639380494700489405">Per fer preguntes al mode IA sobre la pestanya sense sortir de la pàgina, inicia la sessió a Chromium. També obtindràs les contrasenyes i altres dades en tots els teus dispositius.</translation> <translation id="1640672724030957280">S'està baixant...</translation> <translation id="1680687534629375545">Pregunta a la cerca d'imatges sobre aquesta pàgina</translation> <translation id="1709772298389099340">Proporciona privilegis elevats per a <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_cs.xtb b/chrome/app/resources/chromium_strings_cs.xtb index 6586f7f..2bf8528 100644 --- a/chrome/app/resources/chromium_strings_cs.xtb +++ b/chrome/app/resources/chromium_strings_cs.xtb
@@ -56,6 +56,7 @@ <translation id="1594928384848033697">Chromium chce smazat vaše data Správce hesel. Tato akce vyžaduje zadání hesla systému Windows.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Váš administrátor vyžaduje, abyste kvůli použití této aktualizace Chromium restartovali}=1{Váš administrátor vyžaduje, abyste kvůli použití této aktualizace Chromium restartovali. Anonymní okno se neotevře znovu.}few{Váš administrátor vyžaduje, abyste kvůli použití této aktualizace Chromium restartovali. # anonymní okna se neotevřou znovu.}many{Váš administrátor vyžaduje, abyste kvůli použití této aktualizace Chromium restartovali. # anonymního okna se neotevře znovu.}other{Váš administrátor vyžaduje, abyste kvůli použití této aktualizace Chromium restartovali. # anonymních oken se neotevře znovu.}}</translation> <translation id="1625909126243026060">Zkontrolujte klíčové ovládací prvky ochrany soukromí a zabezpečení v prohlížeči Chromium</translation> +<translation id="1639380494700489405">Pokud se chcete režimu AI ptát ohledně karty bez opuštění stránky, přihlaste se do prohlížeče Chromium. Na všech svých zařízeních budete mít k dispozici i svá hesla a další informace.</translation> <translation id="1640672724030957280">Stahování...</translation> <translation id="1680687534629375545">Zeptat se Vyhledávání obrázků na tuto stránku</translation> <translation id="1709772298389099340">Poskytuje zvýšená oprávnění prohlížeči <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_cy.xtb b/chrome/app/resources/chromium_strings_cy.xtb index 5a405c0..4a40531 100644 --- a/chrome/app/resources/chromium_strings_cy.xtb +++ b/chrome/app/resources/chromium_strings_cy.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">Mae Chromium eisiau dileu eich data Rheolwr Cyfrineiriau. Teipiwch eich cyfrinair Windows i ganiatáu hyn.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Mae eich gweinyddwr yn gofyn i chi ail-lansio Chromium i gymhwyso diweddariad}=1{Mae eich gweinyddwr yn gofyn i chi ail-lansio Chromium i gymhwyso diweddariad. Ni fydd eich ffenestr Anhysbys yn ailagor.}two{Mae eich gweinyddwr yn gofyn i chi ail-lansio Chromium i gymhwyso diweddariad. Ni fydd eich # ffenestr Anhysbys yn ailagor.}few{Mae eich gweinyddwr yn gofyn i chi ail-lansio Chromium i gymhwyso diweddariad. Ni fydd eich # ffenestr Anhysbys yn ailagor.}many{Mae eich gweinyddwr yn gofyn i chi ail-lansio Chromium i gymhwyso diweddariad. Ni fydd eich # ffenestr Anhysbys yn ailagor.}other{Mae eich gweinyddwr yn gofyn i chi ail-lansio Chromium i gymhwyso diweddariad. Ni fydd eich # ffenestr Anhysbys yn ailagor.}}</translation> <translation id="1625909126243026060">Adolygu rheoliadau diogelwch a phreifatrwydd allweddol yn Chromium</translation> +<translation id="1639380494700489405">I ofyn i'r Dull AI am eich tab heb adael y dudalen, mewngofnodwch i Chromium. Byddwch hefyd yn cael eich cyfrineiriau a rhagor ar eich holl ddyfeisiau.</translation> <translation id="1640672724030957280">Wrthi'n lawrlwytho...</translation> <translation id="1680687534629375545">Gofyn i Chwilio Lluniau am y dudalen hon</translation> <translation id="1709772298389099340">Yn darparu breintiau dyrchafedig ar gyfer <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_da.xtb b/chrome/app/resources/chromium_strings_da.xtb index 9f52b15..b8a8e7c 100644 --- a/chrome/app/resources/chromium_strings_da.xtb +++ b/chrome/app/resources/chromium_strings_da.xtb
@@ -55,6 +55,7 @@ <translation id="1594928384848033697">Chromium anmoder om tilladelse til at slette dine data i Adgangskodeadministrator. Angiv din Windows-adgangskode for at tillade dette.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Din administrator kræver, at du genstarter Chromium for at anvende en opdatering}=1{Din administrator kræver, at du genstarter Chromium for at anvende en opdatering. Dit inkognitovindue åbnes ikke igen.}one{Din administrator kræver, at du genstarter Chromium for at anvende en opdatering. # inkognitovindue åbnes ikke igen.}other{Din administrator kræver, at du genstarter Chromium for at anvende en opdatering. Dine # inkognitovinduer åbnes ikke igen.}}</translation> <translation id="1625909126243026060">Gennemgå vigtige privatlivs- og sikkerhedsindstillinger i Chromium</translation> +<translation id="1639380494700489405">Hvis du vil spørge AI-tilstand om din fane uden at forlade siden, skal du logge ind i Chromium. Du kan også se dine adgangskoder m.m. på alle dine enheder.</translation> <translation id="1640672724030957280">Downloader...</translation> <translation id="1680687534629375545">Stil Billedsøgning spørgsmål om denne side</translation> <translation id="1709772298389099340">Giver udvidede adgangsrettigheder til <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_de.xtb b/chrome/app/resources/chromium_strings_de.xtb index 988839cc..c90b6c46 100644 --- a/chrome/app/resources/chromium_strings_de.xtb +++ b/chrome/app/resources/chromium_strings_de.xtb
@@ -54,6 +54,7 @@ <translation id="1594928384848033697">Chromium möchte deine Passwortmanager-Daten löschen. Gib dein Windows-Passwort ein, um dies zuzulassen.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Laut deinem Administrator musst du Chromium neu starten, um ein Update durchzuführen}=1{Laut deinem Administrator musst du Chromium neu starten, um ein Update durchzuführen. Dein Inkognitofenster wird nicht wieder geöffnet.}other{Laut deinem Administrator musst du Chromium neu starten, um ein Update durchzuführen. Deine # Inkognitofenster werden nicht wieder geöffnet.}}</translation> <translation id="1625909126243026060">Lerne die wichtigsten Datenschutz- und Sicherheitseinstellungen in Chrome kennen</translation> +<translation id="1639380494700489405">Wenn du im KI-Modus Fragen zu Inhalten auf deinem Tab stellen möchtest, ohne die Seite zu verlassen, melde dich in Chromium an. Du kannst dann auch auf allen deinen Geräten auf deine Passwörter und weitere Daten zugreifen.</translation> <translation id="1640672724030957280">Download wird ausgeführt...</translation> <translation id="1680687534629375545">Bildersuche nach Infos zur Seite fragen</translation> <translation id="1709772298389099340">Gewährt erhöhte Berechtigungen für <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_el.xtb b/chrome/app/resources/chromium_strings_el.xtb index e989896..65c3199e 100644 --- a/chrome/app/resources/chromium_strings_el.xtb +++ b/chrome/app/resources/chromium_strings_el.xtb
@@ -55,6 +55,7 @@ <translation id="1594928384848033697">Το Chromium θέλει να διαγράψει τα δεδομένα της Διαχείρισης κωδικών πρόσβασης. Πληκτρολογήστε τον κωδικό πρόσβασης των Windows για να επιτρέψετε αυτή την ενέργεια.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Ο διαχειριστής σας απαιτεί να επανεκκινήσετε το Chromium, προκειμένου να εφαρμοστεί μια ενημέρωση.}=1{Ο διαχειριστής σας απαιτεί να επανεκκινήσετε το Chromium, προκειμένου να εφαρμοστεί μια ενημέρωση. Το παράθυρο για ανώνυμη περιήγηση δεν θα ανοίξει ξανά.}other{Ο διαχειριστής σας απαιτεί να επανεκκινήσετε το Chromium, προκειμένου να εφαρμοστεί μια ενημέρωση. Τα # παράθυρα για ανώνυμη περιήγηση δεν θα ανοίξουν ξανά.}}</translation> <translation id="1625909126243026060">Ελέγξτε σημαντικά στοιχεία ελέγχου για το απόρρητο και την ασφάλεια στο Chromium</translation> +<translation id="1639380494700489405">Για να ρωτήσετε τη Λειτουργία AI σχετικά με την καρτέλα σας χωρίς να αποχωρήσετε από τη σελίδα, συνδεθείτε στο Chromium. Θα έχετε επίσης πρόσβαση στους κωδικούς πρόσβασής σας και σε άλλα στοιχεία σε όλες τις συσκευές σας.</translation> <translation id="1640672724030957280">Γίνεται λήψη…</translation> <translation id="1680687534629375545">Ερώτηση στην Αναζήτηση με εικόνες σχετικά με αυτή τη σελίδα</translation> <translation id="1709772298389099340">Παρέχει αναβαθμισμένα προνόμια για το <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_en-GB.xtb b/chrome/app/resources/chromium_strings_en-GB.xtb index 1966a0af..a36e5809 100644 --- a/chrome/app/resources/chromium_strings_en-GB.xtb +++ b/chrome/app/resources/chromium_strings_en-GB.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">Chromium wants to delete your Password Manager data. Type in your Windows password to allow this.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Your administrator requires that you relaunch Chromium to apply an update}=1{Your administrator requires that you relaunch Chromium to apply an update. Your Incognito window won't reopen.}other{Your administrator requires that you relaunch Chromium to apply an update. Your # Incognito windows won't reopen.}}</translation> <translation id="1625909126243026060">Review key privacy and security controls in Chromium</translation> +<translation id="1639380494700489405">To ask AI Mode about your tab without leaving the page, sign in to Chromium. You'll also get your passwords and more on all your devices.</translation> <translation id="1640672724030957280">Downloading ...</translation> <translation id="1680687534629375545">Ask image search about this page</translation> <translation id="1709772298389099340">Provides elevated privileges for <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_es-419.xtb b/chrome/app/resources/chromium_strings_es-419.xtb index b68686d..92b8eaf88 100644 --- a/chrome/app/resources/chromium_strings_es-419.xtb +++ b/chrome/app/resources/chromium_strings_es-419.xtb
@@ -55,6 +55,7 @@ <translation id="1594928384848033697">Chromium quiere borrar tus datos del Administrador de contraseñas. Para permitirlo, escribe tu contraseña de Windows.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Tu administrador necesita que reinicies Chromium para aplicar una actualización}=1{Tu administrador necesita que reinicies Chromium para aplicar una actualización. No se volverá a abrir la ventana de incógnito.}other{Tu administrador necesita que reinicies Chromium para aplicar una actualización. No se volverán a abrir las # ventanas de incógnito.}}</translation> <translation id="1625909126243026060">Revisa los controles de seguridad y privacidad más importantes en Chromium</translation> +<translation id="1639380494700489405">Para preguntarle al Modo IA sobre tu pestaña sin salir de la página, accede a Chromium. También obtendrás tus contraseñas y más en todos tus dispositivos.</translation> <translation id="1640672724030957280">Descargando...</translation> <translation id="1680687534629375545">Preguntar a la Búsqueda con imágenes acerca de esta página</translation> <translation id="1709772298389099340">Otorga privilegios elevados para <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_et.xtb b/chrome/app/resources/chromium_strings_et.xtb index 19a6df0..6cb2a6e 100644 --- a/chrome/app/resources/chromium_strings_et.xtb +++ b/chrome/app/resources/chromium_strings_et.xtb
@@ -55,6 +55,7 @@ <translation id="1594928384848033697">Chromium soovib kustutada teie Paroolihalduri andmed. Selle lubamiseks sisestage oma Windowsi parool.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Administraator nõuab, et käivitaksite Chromiumi värskenduse rakendamiseks uuesti}=1{Administraator nõuab, et käivitaksite Chromiumi värskenduse rakendamiseks uuesti. Teie inkognito akent ei avata uuesti.}other{Administraator nõuab, et käivitaksite Chromiumi värskenduse rakendamiseks uuesti. Teie # inkognito akent ei avata uuesti.}}</translation> <translation id="1625909126243026060">Vaadake üle Chromiumi peamised privaatsus- ja turvaseaded</translation> +<translation id="1639380494700489405">AI-režiimilt vahelehe kohta küsimiseks ilma lehelt lahkumata logige Chromiumi sisse. Lisaks saate kõigis oma seadmetes oma paroole ja muud kasutada.</translation> <translation id="1640672724030957280">Allalaadimine ...</translation> <translation id="1680687534629375545">Küsige pildiotsingult selle lehe kohta</translation> <translation id="1709772298389099340">Annab brauserile <ph name="BROWSER_NAME" /> administraatoriõigused.</translation>
diff --git a/chrome/app/resources/chromium_strings_eu.xtb b/chrome/app/resources/chromium_strings_eu.xtb index 7977d3ce..6869068 100644 --- a/chrome/app/resources/chromium_strings_eu.xtb +++ b/chrome/app/resources/chromium_strings_eu.xtb
@@ -56,6 +56,7 @@ <translation id="1594928384848033697">Chromium-ek Pasahitz-kudeatzailea zerbitzuan dauzkazun datuak ezabatu behar ditu. Horretarako baimena emateko, idatzi Windows-eko pasahitza.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Chromium berriro exekutatzea behar du administratzaileak, eguneratzea aplikatzeko}=1{Chromium berriro exekutatzea behar du administratzaileak, eguneratzea aplikatzeko. Ezkutuko moduko leihoa ez da berriro irekiko.}other{Chromium berriro exekutatzea behar du administratzaileak, eguneratzea aplikatzeko. Ezkutuko moduko # leihoak ez dira berriro irekiko.}}</translation> <translation id="1625909126243026060">Berrikusi pribatutasuna eta segurtasuna kontrolatzeko aukera garrantzitsuenak Chromium-en</translation> +<translation id="1639380494700489405">AA moduari fitxari buruzko galderak egiteko orritik irten gabe, hasi saioa Chromium-en. Pasahitzak eta beste ere izango dituzu gailu guztietan.</translation> <translation id="1640672724030957280">Deskargatzen…</translation> <translation id="1680687534629375545">Egin orri honi buruzko galdera bat irudi-bilaketari</translation> <translation id="1709772298389099340"><ph name="BROWSER_NAME" /> arakatzailerako gehiegizko baimenak ematen ditu.</translation>
diff --git a/chrome/app/resources/chromium_strings_fi.xtb b/chrome/app/resources/chromium_strings_fi.xtb index 97a07dcd..af4f20b 100644 --- a/chrome/app/resources/chromium_strings_fi.xtb +++ b/chrome/app/resources/chromium_strings_fi.xtb
@@ -55,6 +55,7 @@ <translation id="1594928384848033697">Chromium haluaa poistaa Salasanat-datasi. Salli tämä kirjoittamalla Windows-salasanasi.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Ylläpitäjä vaatii Chromiumin uudelleenkäynnistystä, jotta päivitys voidaan ottaa käyttöön.}=1{Ylläpitäjä vaatii Chromiumin uudelleenkäynnistystä, jotta päivitys voidaan ottaa käyttöön. Incognito-ikkunaasi ei avata uudelleen.}other{Ylläpitäjä vaatii Chromiumin uudelleenkäynnistystä, jotta päivitys voidaan ottaa käyttöön. # incognito-ikkunaasi ei avata uudelleen.}}</translation> <translation id="1625909126243026060">Tarkista Chromiumin tärkeimmät yksityisyys‑ ja turvallisuusasetukset</translation> +<translation id="1639380494700489405">Jos haluat kysyä tekoälytilalta välilehdestä poistumatta sivulta, kirjaudu sisään Chromiumiin. Voit myös käyttää salasanojasi ja muita tietoja kaikilla laitteillasi.</translation> <translation id="1640672724030957280">Ladataan...</translation> <translation id="1680687534629375545">Kysy tästä sivusta kuvahausta</translation> <translation id="1709772298389099340">Tarjoaa laajat pääsyoikeudet (<ph name="BROWSER_NAME" />).</translation>
diff --git a/chrome/app/resources/chromium_strings_fr-CA.xtb b/chrome/app/resources/chromium_strings_fr-CA.xtb index 17936e9e..c8f2b72 100644 --- a/chrome/app/resources/chromium_strings_fr-CA.xtb +++ b/chrome/app/resources/chromium_strings_fr-CA.xtb
@@ -56,6 +56,7 @@ <translation id="1594928384848033697">Chromium souhaite supprimer vos données du gestionnaire de mots de passe. Tapez votre mot de passe Windows pour autoriser la suppression.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Votre administrateur exige que vous relanciez Chromium pour appliquer une mise à jour}=1{Votre administrateur exige que vous relanciez Chromium pour appliquer une mise à jour. Votre fenêtre de navigation privée ne sera pas rouverte.}one{Votre administrateur exige que vous relanciez Chromium pour appliquer une mise à jour. Votre fenêtre de navigation privée ne sera pas rouverte.}other{Votre administrateur exige que vous relanciez Chromium pour appliquer une mise à jour. Vos # fenêtres de navigation privée ne seront pas rouvertes.}}</translation> <translation id="1625909126243026060">Passer en revue les principaux paramètres de confidentialité et de sécurité dans Chromium</translation> +<translation id="1639380494700489405">Pour poser des questions au mode IA sur votre onglet sans quitter la page, connectez-vous à Chromium. Vous obtiendrez également vos mots de passe et bien plus encore sur tous vos appareils.</translation> <translation id="1640672724030957280">Téléchargement en cours…</translation> <translation id="1680687534629375545">Poser des questions à la recherche d'images à propos de cette page</translation> <translation id="1709772298389099340">Fournit des privilèges élevés pour <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_fr.xtb b/chrome/app/resources/chromium_strings_fr.xtb index e04f37f..59272200 100644 --- a/chrome/app/resources/chromium_strings_fr.xtb +++ b/chrome/app/resources/chromium_strings_fr.xtb
@@ -55,6 +55,7 @@ <translation id="1594928384848033697">Chromium souhaite supprimer les données du Gestionnaire de mots de passe. Saisissez votre mot de passe Windows pour autoriser l'opération.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{À la demande de votre administrateur, vous devez relancer Chromium pour installer une mise à jour}=1{À la demande de votre administrateur, vous devez relancer Chromium pour installer une mise à jour. Sachez que la fenêtre de navigation privée ne sera pas rouverte.}one{À la demande de votre administrateur, vous devez relancer Chromium pour installer une mise à jour. Sachez que la fenêtre de navigation privée (#) ne sera pas rouverte.}other{À la demande de votre administrateur, vous devez relancer Chromium pour installer une mise à jour. Sachez que les # fenêtres de navigation privée ne seront pas rouvertes.}}</translation> <translation id="1625909126243026060">Passez en revue les principaux paramètres de confidentialité et de sécurité dans Chromium</translation> +<translation id="1639380494700489405">Pour poser des questions au Mode IA sur votre onglet sans quitter la page, connectez-vous à Chromium. Vous pourrez également accéder à vos mots de passe et à d'autres données sur tous vos appareils.</translation> <translation id="1640672724030957280">Téléchargement en cours…</translation> <translation id="1680687534629375545">Demander des infos sur cette page à la recherche dans des images</translation> <translation id="1709772298389099340">Fournit des droits élevés pour <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_gl.xtb b/chrome/app/resources/chromium_strings_gl.xtb index f42c60e..fb6fe61 100644 --- a/chrome/app/resources/chromium_strings_gl.xtb +++ b/chrome/app/resources/chromium_strings_gl.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">Chromium quere eliminar os datos do xestor de contrasinais. Escribe o teu contrasinal de Windows para permitir esta acción.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{O teu administrador require que reinicies Chromium para aplicar unha actualización}=1{O teu administrador require que reinicies Chromium para aplicar unha actualización. A ventá do modo de incógnito non se volverá abrir.}other{O teu administrador require que reinicies Chromium para aplicar unha actualización. As # ventás do modo de incógnito non se volverán abrir.}}</translation> <translation id="1625909126243026060">Revisa os controis clave de privacidade e seguranza en Chromium</translation> +<translation id="1639380494700489405">Para preguntar co modo IA sobre a pestana sen saír da páxina, inicia sesión en Chromium. Tamén terás acceso aos teus contrasinais e moito máis en todos os teus dispositivos.</translation> <translation id="1640672724030957280">Descargando…</translation> <translation id="1680687534629375545">Pregúntalle á busca de imaxes acerca desta páxina</translation> <translation id="1709772298389099340">Proporciona privilexios avanzados a <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb index 9dd3370..17a9778 100644 --- a/chrome/app/resources/chromium_strings_hi.xtb +++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -54,6 +54,7 @@ <translation id="1594928384848033697">Chromium, आपके Password Manager के डेटा को मिटाना चाहता है. इसकी अनुमति देने के लिए, Windows का पासवर्ड डालें.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{आपका एडमिन चाहता है कि आप अपडेट लागू करने के लिए क्रोमियम को फिर से लॉन्च करें}=1{आपका एडमिन चाहता है कि आप अपडेट लागू करने के लिए क्रोमियम को फिर से लॉन्च करें. आपकी गुप्त विंडो फिर से नहीं खुलेगी.}one{आपका एडमिन चाहता है कि आप अपडेट लागू करने के लिए क्रोमियम को फिर से लॉन्च करें. आपकी # गुप्त विंडो फिर से नहीं खुलेंगी.}other{आपका एडमिन चाहता है कि आप अपडेट लागू करने के लिए क्रोमियम को फिर से लॉन्च करें. आपकी # गुप्त विंडो फिर से नहीं खुलेंगी.}}</translation> <translation id="1625909126243026060">Chromium के निजता और सुरक्षा से जुड़े मुख्य कंट्रोल देखें</translation> +<translation id="1639380494700489405">पेज छोड़े बिना एआई मोड से अपने टैब के बारे में सवाल पूछने के लिए, Chromium में साइन इन करें. आपको अपने सभी डिवाइसों पर अपने पासवर्ड वगैरह का ऐक्सेस भी मिलेगा.</translation> <translation id="1640672724030957280">डाउनलोड हो रहा है...</translation> <translation id="1680687534629375545">इमेज सर्च से इस पेज के बारे में सवाल पूछें</translation> <translation id="1709772298389099340">यह <ph name="BROWSER_NAME" /> के लिए खास सुविधाओं का ऐक्सेस देती है.</translation>
diff --git a/chrome/app/resources/chromium_strings_hr.xtb b/chrome/app/resources/chromium_strings_hr.xtb index 79261694..3102fcb 100644 --- a/chrome/app/resources/chromium_strings_hr.xtb +++ b/chrome/app/resources/chromium_strings_hr.xtb
@@ -55,6 +55,7 @@ <translation id="1594928384848033697">Chromium želi izbrisati vaše podatke Upravitelja zaporki. Upišite svoju zaporku za Windows da biste to dopustili.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Vaš administrator zahtijeva da ponovno pokrenete Chromium radi primjene ažuriranja}=1{Vaš administrator zahtijeva da ponovno pokrenete Chromium radi primjene ažuriranja. Anonimni se prozor neće ponovno otvoriti.}one{Vaš administrator zahtijeva da ponovno pokrenete Chromium radi primjene ažuriranja. Vaš # anonimni prozor neće se ponovno otvoriti.}few{Vaš administrator zahtijeva da ponovno pokrenete Chromium radi primjene ažuriranja. Vaša # anonimna prozora neće se ponovno otvoriti.}other{Vaš administrator zahtijeva da ponovno pokrenete Chromium radi primjene ažuriranja. Vaših # anonimnih prozora neće se ponovno otvoriti.}}</translation> <translation id="1625909126243026060">Pregledajte ključne kontrole privatnosti i sigurnosti u Chromiumu</translation> +<translation id="1639380494700489405">Da biste postavili pitanje AI načinu o svojoj kartici bez napuštanja stranice, prijavite se u Chromium. Također ćete moći pristupati svojim zaporkama i drugim podacima na svim svojim uređajima.</translation> <translation id="1640672724030957280">Preuzimanje...</translation> <translation id="1680687534629375545">Postavite pitanja Google pretraživanju slika o toj stranici</translation> <translation id="1709772298389099340">Pruža dodatne ovlasti za <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_hu.xtb b/chrome/app/resources/chromium_strings_hu.xtb index 05ef1f3..b4a9125 100644 --- a/chrome/app/resources/chromium_strings_hu.xtb +++ b/chrome/app/resources/chromium_strings_hu.xtb
@@ -55,6 +55,7 @@ <translation id="1594928384848033697">A Chromium törölni szeretné a Jelszókezelőhöz tartozó adatait. Az engedélyezéshez adja meg Windows-jelszavát.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{A rendszergazda előírta, hogy újra kell indítania a Chromiumot a frissítés alkalmazásához.}=1{A rendszergazda előírta, hogy újra kell indítania a Chromiumot a frissítés alkalmazásához. Az inkognitó ablak nem fog újra megnyílni.}other{A rendszergazda előírta, hogy újra kell indítania a Chromiumot a frissítés alkalmazásához. A(z) # inkognitó ablak nem fog újra megnyílni.}}</translation> <translation id="1625909126243026060">A legfontosabb adatvédelmi és biztonsági beállítások áttekintése a Chromiumban</translation> +<translation id="1639380494700489405">Ha az oldal elhagyása nélkül szeretne kérdezni az AI-módtól az adott lapról, jelentkezzen be a Chromiumba. Egyebek mellett a jelszavaihoz is hozzáférhet bármely eszközén.</translation> <translation id="1640672724030957280">Letöltés...</translation> <translation id="1680687534629375545">Kérdés feltevése a Képkeresőnek erről az oldalról</translation> <translation id="1709772298389099340">Magasabb szintű jogosultságokat biztosít a <ph name="BROWSER_NAME" /> számára.</translation>
diff --git a/chrome/app/resources/chromium_strings_id.xtb b/chrome/app/resources/chromium_strings_id.xtb index 61f80aaf..2d53d3f 100644 --- a/chrome/app/resources/chromium_strings_id.xtb +++ b/chrome/app/resources/chromium_strings_id.xtb
@@ -55,6 +55,7 @@ <translation id="1594928384848033697">Chromium ingin menghapus data Pengelola Sandi Anda. Ketik sandi Windows Anda untuk mengizinkannya.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Administrator mewajibkan Anda meluncurkan kembali Chromium untuk menerapkan update}=1{Administrator mewajibkan Anda meluncurkan kembali Chromium untuk menerapkan update. Jendela Samaran Anda tidak akan dibuka kembali.}other{Administrator mewajibkan Anda meluncurkan kembali Chromium untuk menerapkan update. # jendela Samaran Anda tidak akan dibuka kembali.}}</translation> <translation id="1625909126243026060">Meninjau kontrol privasi dan keamanan utama di Chromium</translation> +<translation id="1639380494700489405">Untuk bertanya kepada Mode AI tentang tab Anda tanpa keluar dari halaman, login ke Chromium. Anda juga akan mendapatkan sandi dan info Anda yang lain di semua perangkat Anda.</translation> <translation id="1640672724030957280">Mengunduh...</translation> <translation id="1680687534629375545">Tanya Penelusuran Gambar info tentang halaman ini</translation> <translation id="1709772298389099340">Memberikan hak istimewa yang ditingkatkan untuk <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_is.xtb b/chrome/app/resources/chromium_strings_is.xtb index c3f4c0f..053b5af5 100644 --- a/chrome/app/resources/chromium_strings_is.xtb +++ b/chrome/app/resources/chromium_strings_is.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">Chromium vill eyða gögnum Aðgangsorðastjórnunar. Sláðu inn Windows-aðgangsorðið þitt til að leyfa það.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Kerfisstjórinn þinn gerir kröfu um að þú endurræsir Chromium til að setja upp uppfærslu}=1{Kerfisstjórinn þinn gerir kröfu um að þú endurræsir Chromium til að setja upp uppfærslu. Huliðsglugginn enduropnast ekki.}one{Kerfisstjórinn þinn gerir kröfu um að þú endurræsir Chromium til að setja upp uppfærslu. # huliðsgluggi enduropnast ekki.}other{Kerfisstjórinn þinn gerir kröfu um að þú endurræsir Chromium til að setja upp uppfærslu. # huliðsgluggar enduropnast ekki.}}</translation> <translation id="1625909126243026060">Farðu yfir helstu öryggis- og persónuverndarstýringar í Chromium</translation> +<translation id="1639380494700489405">Skráðu þig inn í Chromium til að spyrja gervigreindarstillingu út í flipann þinn án þess að yfirgefa síðuna. Þú færð einnig aðgangsorðin þín og fleira í öllum tækjunum þínum.</translation> <translation id="1640672724030957280">Sækir...</translation> <translation id="1680687534629375545">Spyrja Myndaleit um þessa síðu</translation> <translation id="1709772298389099340">Veitir auknar heimildir fyrir <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_it.xtb b/chrome/app/resources/chromium_strings_it.xtb index 373f792..e5f2f65 100644 --- a/chrome/app/resources/chromium_strings_it.xtb +++ b/chrome/app/resources/chromium_strings_it.xtb
@@ -54,6 +54,7 @@ <translation id="1594928384848033697">Chromium vuole eliminare i tuoi dati del Gestore delle password. Digita la tua password di Windows per consentire l'operazione.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{L'amministratore richiede il riavvio di Chromium per installare un aggiornamento}=1{L'amministratore richiede il riavvio di Chromium per installare un aggiornamento. La finestra Incognito non verrà riaperta.}other{L'amministratore richiede il riavvio di Chromium per installare un aggiornamento. Le # finestre Incognito non verranno riaperte.}}</translation> <translation id="1625909126243026060">Esamina i controlli per la privacy e la sicurezza più importanti in Chromium</translation> +<translation id="1639380494700489405">Per chiedere in AI Mode informazioni sulla tua scheda senza uscire dalla pagina, accedi a Chromium. Potrai anche usare le password e altri dati su tutti i tuoi dispositivi.</translation> <translation id="1640672724030957280">Download in corso...</translation> <translation id="1680687534629375545">Chiedi alla Ricerca immagini informazioni su questa pagina</translation> <translation id="1709772298389099340">Fornisce privilegi elevati per <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_iw.xtb b/chrome/app/resources/chromium_strings_iw.xtb index 6b2f30b6..f13090c 100644 --- a/chrome/app/resources/chromium_strings_iw.xtb +++ b/chrome/app/resources/chromium_strings_iw.xtb
@@ -55,6 +55,7 @@ <translation id="1594928384848033697">Chromium רוצה למחוק את הנתונים שלך במנהל הסיסמאות. כדי לאפשר זאת, צריך להזין את הסיסמה שלך ל-Windows.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{מנהל המערכת מבקש להפעיל מחדש את Chromium כדי להחיל עדכון}=1{מנהל המערכת מבקש להפעיל מחדש את Chromium כדי להחיל עדכון. החלון האנונימי לא ייפתח מחדש.}one{מנהל המערכת מבקש להפעיל מחדש את Chromium כדי להחיל עדכון. # החלונות האנונימיים לא ייפתחו מחדש.}two{מנהל המערכת מבקש להפעיל מחדש את Chromium כדי להחיל עדכון. # החלונות האנונימיים לא ייפתחו מחדש.}other{מנהל המערכת מבקש להפעיל מחדש את Chromium כדי להחיל עדכון. # החלונות האנונימיים לא ייפתחו מחדש.}}</translation> <translation id="1625909126243026060">בדיקה של אמצעי הבקרה החשובים ביותר על פרטיות ואבטחה ב-Chromium</translation> +<translation id="1639380494700489405">כדי לשאול את מצב AI שאלות על הכרטיסייה בלי לצאת מהדף, צריך להיכנס ל-Chromium. אחרי הכניסה לחשבון, אפשר גם לראות סיסמאות ופריטים נוספים בכל המכשירים.</translation> <translation id="1640672724030957280">מוריד...</translation> <translation id="1680687534629375545">רוצה לשאול שאלה על הדף הזה ב"חיפוש התמונות"?</translation> <translation id="1709772298389099340">השירות הזה מספק הרשאות מורחבות ל-<ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_ja.xtb b/chrome/app/resources/chromium_strings_ja.xtb index 1fd3ea64..4af74034 100644 --- a/chrome/app/resources/chromium_strings_ja.xtb +++ b/chrome/app/resources/chromium_strings_ja.xtb
@@ -54,6 +54,7 @@ <translation id="1594928384848033697">Chromium がパスワード マネージャーのデータの削除をリクエストしています。続行するには、Windows のパスワードを入力してください。</translation> <translation id="1607715478322902680">{COUNT,plural, =0{管理者が、アップデートを適用するために Chromium を再起動するよう求めています}=1{管理者が、アップデートを適用するために Chromium を再起動するよう求めています。シークレット ウィンドウは、再起動後は自動的には開きません。}other{管理者が、アップデートを適用するために Chromium を再起動するよう求めています。現在開いている # 個のシークレット ウィンドウは、再起動後は自動的には開きません。}}</translation> <translation id="1625909126243026060">Chromium のプライバシーとセキュリティに関する重要な設定を確認します</translation> +<translation id="1639380494700489405">ページを離れることなく、タブについて AI モードに質問するには、Chromium にログインしてください。これにより、すべてのデバイスでパスワードなどの設定も使用できるようになります。</translation> <translation id="1640672724030957280">ダウンロードしています...</translation> <translation id="1680687534629375545">画像検索でこのページについて質問する</translation> <translation id="1709772298389099340"><ph name="BROWSER_NAME" /> に権限昇格を提供します。</translation>
diff --git a/chrome/app/resources/chromium_strings_kk.xtb b/chrome/app/resources/chromium_strings_kk.xtb index 234846da..8ec38d0 100644 --- a/chrome/app/resources/chromium_strings_kk.xtb +++ b/chrome/app/resources/chromium_strings_kk.xtb
@@ -56,6 +56,7 @@ <translation id="1594928384848033697">Chromium браузері Password Manager-дегі деректеріңізді жоюға рұқсат сұрайды. Рұқсат беру үшін Windows құпия сөзін енгізіңіз.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Жаңартылған нұсқаны қолдану үшін әкімшіңіз Chromium браузерін қайта іске қосуыңызды талап етеді.}=1{Жаңартылған нұсқаны қолдану үшін әкімшіңіз Chromium браузерін қайта іске қосуыңызды талап етеді. Инкогнито терезесі қайта ашылмайды.}other{Жаңартылған нұсқаны қолдану үшін әкімшіңіз Chromium браузерін қайта іске қосуыңызды талап етеді. # инкогнито терезесі қайта ашылмайды.}}</translation> <translation id="1625909126243026060">Chromium-дегі құпиялық пен қауіпсіздікті басқарудың маңызды құралдарын қарап шығыңыз.</translation> +<translation id="1639380494700489405">Беттен шықпай-ақ AI режиміне қойынды туралы сұрақ қою үшін Chromium-ге кіріңіз. Құпия сөздер мен басқа да деректеріңіз барлық құрылғыңызда қолжетімді болады.</translation> <translation id="1640672724030957280">Жүктеп алынып жатыр…</translation> <translation id="1680687534629375545">Сурет іздеу функциясынан осы бет жайында сұрау</translation> <translation id="1709772298389099340"><ph name="BROWSER_NAME" /> браузеріне кеңейтілген құқықтар береді.</translation>
diff --git a/chrome/app/resources/chromium_strings_km.xtb b/chrome/app/resources/chromium_strings_km.xtb index 65e8228..24f9957 100644 --- a/chrome/app/resources/chromium_strings_km.xtb +++ b/chrome/app/resources/chromium_strings_km.xtb
@@ -56,6 +56,7 @@ <translation id="1594928384848033697">Chromium ចង់លុបទិន្នន័យកម្មវិធីគ្រប់គ្រងពាក្យសម្ងាត់របស់អ្នក។ សូមវាយបញ្ចូលពាក្យសម្ងាត់ Windows របស់អ្នក ដើម្បីអនុញ្ញាតការលុបនេះ។</translation> <translation id="1607715478322902680">{COUNT,plural, =0{អ្នកគ្រប់គ្រងរបស់អ្នកតម្រូវឱ្យអ្នកចាប់ផ្ដើម Chromium ឡើងវិញ ដើម្បីប្រើកំណែថ្មី}=1{អ្នកគ្រប់គ្រងរបស់អ្នកតម្រូវឱ្យអ្នកចាប់ផ្ដើម Chromium ឡើងវិញ ដើម្បីប្រើកំណែថ្មី។ ផ្ទាំងឯកជនរបស់អ្នកនឹងមិនបើកឡើងវិញទេ។}other{អ្នកគ្រប់គ្រងរបស់អ្នកតម្រូវឱ្យអ្នកចាប់ផ្ដើម Chromium ឡើងវិញ ដើម្បីប្រើកំណែថ្មី។ ផ្ទាំងឯកជន # របស់អ្នកនឹងមិនបើកឡើងវិញទេ។}}</translation> <translation id="1625909126243026060">ពិនិត្យមើលការគ្រប់គ្រងសុវត្ថិភាព និងឯកជនភាពសំខាន់ៗនៅក្នុង Chromium</translation> +<translation id="1639380494700489405">ដើម្បីសួរមុខងារ AI អំពីផ្ទាំងរបស់អ្នកដោយមិនចាកចេញពីទំព័រ សូមចូលគណនី Chromium។ អ្នកក៏នឹងទទួលបានពាក្យសម្ងាត់របស់អ្នក និងអ្វីៗជាច្រើនទៀតនៅលើឧបករណ៍ទាំងអស់របស់អ្នកផងដែរ។</translation> <translation id="1640672724030957280">កំពុងទាញយក...</translation> <translation id="1680687534629375545">សួរមុខងារស្វែងរករូបភាពអំពីទំព័រនេះ</translation> <translation id="1709772298389099340">ផ្ដល់ឯកសិទ្ធិបន្ថែមសម្រាប់ <ph name="BROWSER_NAME" />។</translation>
diff --git a/chrome/app/resources/chromium_strings_kn.xtb b/chrome/app/resources/chromium_strings_kn.xtb index 8456e81..90c1ebc 100644 --- a/chrome/app/resources/chromium_strings_kn.xtb +++ b/chrome/app/resources/chromium_strings_kn.xtb
@@ -55,6 +55,7 @@ <translation id="1594928384848033697">Chromium ನಿಮ್ಮ Password Manager ಡೇಟಾವನ್ನು ಅಳಿಸಲು ಬಯಸುತ್ತದೆ. ಇದನ್ನು ಅನುಮತಿಸಲು ನಿಮ್ಮ Windows ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಟೈಪ್ ಮಾಡಿ.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{ಅಪ್ಡೇಟ್ ಅನ್ವಯಿಸಲು ನೀವು Chromium ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕೆಂದು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಬಯಸುತ್ತಾರೆ}=1{ಅಪ್ಡೇಟ್ ಅನ್ವಯಿಸಲು ನೀವು Chromium ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕೆಂದು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಬಯಸುತ್ತಾರೆ. ನಿಮ್ಮ ಅಜ್ಞಾತ ವಿಂಡೋವನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.}one{ಅಪ್ಡೇಟ್ ಅನ್ವಯಿಸಲು ನೀವು Chromium ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕೆಂದು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಬಯಸುತ್ತಾರೆ. ನಿಮ್ಮ # ಅಜ್ಞಾತ ವಿಂಡೋಗಳನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.}other{ಅಪ್ಡೇಟ್ ಅನ್ವಯಿಸಲು ನೀವು Chromium ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕೆಂದು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಬಯಸುತ್ತಾರೆ. ನಿಮ್ಮ # ಅಜ್ಞಾತ ವಿಂಡೋಗಳನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.}}</translation> <translation id="1625909126243026060">Chromium ನಲ್ಲಿ ಪ್ರಮುಖ ಗೌಪ್ಯತೆ ಮತ್ತು ಭದ್ರತಾ ನಿಯಂತ್ರಣಗಳನ್ನು ಪರಿಶೀಲಿಸಿ</translation> +<translation id="1639380494700489405">ಪುಟವನ್ನು ತೊರೆಯದೆಯೇ ನಿಮ್ಮ ಟ್ಯಾಬ್ ಕುರಿತು AI ಮೋಡ್ ಅನ್ನು ಕೇಳಲು, Chromium ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ. ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳು ಮತ್ತು ಇತ್ಯಾದಿಗಳನ್ನು ನೀವು ಪಡೆಯುತ್ತೀರಿ.</translation> <translation id="1640672724030957280">ಡೌನ್ಲೋಡ್ ಆಗುತ್ತಿದೆ...</translation> <translation id="1680687534629375545">ಈ ಪುಟದ ಕುರಿತು ಚಿತ್ರದ ಮೂಲಕ ಹುಡುಕಾಟವನ್ನು ಕೇಳಿ</translation> <translation id="1709772298389099340"><ph name="BROWSER_NAME" /> ಗಾಗಿ ಎಲಿವೇಟೆಡ್ ಪ್ರಿವಿಲೇಜಸ್ ಅನ್ನು ಒದಗಿಸುತ್ತದೆ.</translation>
diff --git a/chrome/app/resources/chromium_strings_ko.xtb b/chrome/app/resources/chromium_strings_ko.xtb index f940a96..03ff673b9 100644 --- a/chrome/app/resources/chromium_strings_ko.xtb +++ b/chrome/app/resources/chromium_strings_ko.xtb
@@ -56,6 +56,7 @@ <translation id="1594928384848033697">Chromium에서 비밀번호 관리자 데이터를 삭제하려고 합니다. 허용하려면 Windows 비밀번호를 입력하세요.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{관리자의 요구에 따라 업데이트를 적용하려면 Chromium을 다시 실행해야 합니다.}=1{관리자의 요구에 따라 업데이트를 적용하려면 Chromium을 다시 실행해야 합니다. 시크릿 창이 다시 열리지 않습니다.}other{관리자의 요구에 따라 업데이트를 적용하려면 Chromium을 다시 실행해야 합니다. 시크릿 창 #개가 다시 열리지 않습니다.}}</translation> <translation id="1625909126243026060">Chromium의 주요 개인 정보 보호 및 보안 제어 기능을 검토합니다.</translation> +<translation id="1639380494700489405">페이지를 나가지 않고 탭에 관해 AI 모드에게 물어보려면 Chromium에 로그인하세요. 이렇게 하면 이용 중인 모든 기기에서 비밀번호 등도 사용할 수 있습니다.</translation> <translation id="1640672724030957280">다운로드 중...</translation> <translation id="1680687534629375545">이미지 검색에 이 페이지에 관해 질문하기</translation> <translation id="1709772298389099340"><ph name="BROWSER_NAME" />에 승격된 권한을 제공합니다.</translation>
diff --git a/chrome/app/resources/chromium_strings_ky.xtb b/chrome/app/resources/chromium_strings_ky.xtb index 0808f38..2729f61 100644 --- a/chrome/app/resources/chromium_strings_ky.xtb +++ b/chrome/app/resources/chromium_strings_ky.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">Chromium Сырсөздөрдү башкаргычтагы маалыматтарыңызды өчүргөнү жатат. Ага уруксат берүү үчүн Windows аккаунтуңуздун сырсөзүн териңиз.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Администраторуңуз жаңыртууну колдонуу үчүн Chromium'ду кайра иштетүүнү талап кылууда}=1{Администраторуңуз жаңыртууну колдонуу үчүн Chromium'ду кайра иштетүүнү талап кылууда. Жашыруун терезеңиз кайра ачылбайт.}other{Администраторуңуз жаңыртууну колдонуу үчүн Chromium'ду кайра иштетүүнү талап кылууда. # жашыруун терезеңиз кайра ачылбайт.}}</translation> <translation id="1625909126243026060">Chromium'дагы негизги купуялык жана коопсуздукту көзөмөлдөө каражаттарын карап көрүңүз</translation> +<translation id="1639380494700489405">Барактан чыкпай эле ЖИ режиминен өтмөгүңүз тууралуу суроо үчүн Chromium'га кириңиз. Мындан тышкары, сырсөздөрүңүздү жана башкаларды бардык түзмөктөрүңүздө колдоно аласыз.</translation> <translation id="1640672724030957280">Жүктөлүп алынууда...</translation> <translation id="1680687534629375545">Сүрөт издөө функциясынан бул бет жөнүндө суроо</translation> <translation id="1709772298389099340"><ph name="BROWSER_NAME" /> серепчисине жогорулатылган артыкчылыктар берилет.</translation>
diff --git a/chrome/app/resources/chromium_strings_lo.xtb b/chrome/app/resources/chromium_strings_lo.xtb index eb69415..a8de04a 100644 --- a/chrome/app/resources/chromium_strings_lo.xtb +++ b/chrome/app/resources/chromium_strings_lo.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">Chromium ຕ້ອງການລຶບຂໍ້ມູນຕົວຈັດການລະຫັດຜ່ານຂອງທ່ານ. ກະລຸນາພິມລະຫັດຜ່ານ Windows ຂອງທ່ານເພື່ອອະນຸຍາດສິ່ງນີ້.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານກຳນົດໃຫ້ທ່ານເປີດ Chromium ຄືນໃໝ່ເພື່ອນຳໃຊ້ການອັບເດດ}=1{ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານກຳນົດໃຫ້ທ່ານເປີດ Chromium ຄືນໃໝ່ເພື່ອນຳໃຊ້ການອັບເດດ. ໜ້າຈໍທີ່ບໍ່ເປີດເຜີຍຕົວຕົນຂອງທ່ານຈະບໍ່ເປີດຄືນໃໝ່.}other{ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານກຳນົດໃຫ້ທ່ານເປີດ Chromium ຄືນໃໝ່ເພື່ອນຳໃຊ້ການອັບເດດ. ໜ້າຈໍທີ່ບໍ່ເປີດເຜີຍຕົວຕົນຂອງທ່ານ # ລາຍການຈະບໍ່ເປີດຄືນໃໝ່.}}</translation> <translation id="1625909126243026060">ກວດສອບການຄວບຄຸມຄວາມເປັນສ່ວນຕົວ ແລະ ຄວາມປອດໄພຫຼັກໃນ Chromium</translation> +<translation id="1639380494700489405">ເພື່ອຖາມໂໝດ AI ກ່ຽວກັບແຖບຂອງທ່ານໂດຍບໍ່ຕ້ອງອອກຈາກໜ້າ, ໃຫ້ເຂົ້າສູ່ລະບົບ Chromium. ນອກຈາກນີ້, ທ່ານຍັງຈະຮັບລະຫັດຜ່ານ ແລະ ຂໍ້ມູນອື່ນໆໃນອຸປະກອນທຸກເຄື່ອງຂອງທ່ານໄດ້ນຳ.</translation> <translation id="1640672724030957280">ກຳລັງດາວໂຫຼດ...</translation> <translation id="1680687534629375545">ຖາມຄຸນສົມບັດຊອກຫາຮູບກ່ຽວກັບໜ້ານີ້</translation> <translation id="1709772298389099340">ໃຫ້ສິດທິພິເສດລະດັບສູງສຳລັບ <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_lt.xtb b/chrome/app/resources/chromium_strings_lt.xtb index 3da2e11..fde8bf8f 100644 --- a/chrome/app/resources/chromium_strings_lt.xtb +++ b/chrome/app/resources/chromium_strings_lt.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">„Chromium“ nori ištrinti jūsų Slaptažodžių tvarkyklės duomenis. Įveskite „Windows“ slaptažodį, kad tai leistumėte.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Administratorius reikalauja paleisti „Chromium“ iš naujo, kad būtų galima pritaikyti naujinį}=1{Administratorius reikalauja paleisti „Chromium“ iš naujo, kad būtų galima pritaikyti naujinį. Inkognito langas nebus atidarytas iš naujo.}one{Administratorius reikalauja paleisti „Chromium“ iš naujo, kad būtų galima pritaikyti naujinį. # inkognito langas nebus atidarytas iš naujo.}few{Administratorius reikalauja paleisti „Chromium“ iš naujo, kad būtų galima pritaikyti naujinį. # inkognito langai nebus atidaryti iš naujo.}many{Administratorius reikalauja paleisti „Chromium“ iš naujo, kad būtų galima pritaikyti naujinį. # inkognito lango nebus atidaryta iš naujo.}other{Administratorius reikalauja paleisti „Chromium“ iš naujo, kad būtų galima pritaikyti naujinį. # inkognito langų nebus atidaryta iš naujo.}}</translation> <translation id="1625909126243026060">Peržiūrėkite pagrindinius privatumo ir saugos valdiklius naršyklėje „Chromium“</translation> +<translation id="1639380494700489405">Jei norite paklausti DI režimo apie skirtuką neišeidami iš puslapio, prisijunkite prie „Chromium“. Be to, slaptažodžius ir kitas funkcijas pasieksite visuose įrenginiuose.</translation> <translation id="1640672724030957280">Atsisiunčiama...</translation> <translation id="1680687534629375545">Klausti vaizdų paieškos apie šį puslapį</translation> <translation id="1709772298389099340">Suteikia „<ph name="BROWSER_NAME" />“ aukštesnio lygio privilegijas.</translation>
diff --git a/chrome/app/resources/chromium_strings_lv.xtb b/chrome/app/resources/chromium_strings_lv.xtb index 2bead2fd..c69eef8 100644 --- a/chrome/app/resources/chromium_strings_lv.xtb +++ b/chrome/app/resources/chromium_strings_lv.xtb
@@ -54,6 +54,7 @@ <translation id="1594928384848033697">Chromium pieprasa dzēst jūsu paroļu pārvaldnieka datus. Lai to atļautu, ierakstiet savu Windows paroli.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Lai lietotu atjauninājumu, administrators pieprasa restartēt pārlūku Chromium.}=1{Lai lietotu atjauninājumu, administrators pieprasa restartēt pārlūku Chromium. Jūsu inkognito režīma logs netiks atkārtoti atvērts.}zero{Lai lietotu atjauninājumu, administrators pieprasa restartēt pārlūku Chromium. # jūsu inkognito režīma logi netiks atkārtoti atvērti.}one{Lai lietotu atjauninājumu, administrators pieprasa restartēt pārlūku Chromium. # jūsu inkognito režīma logs netiks atkārtoti atvērts.}other{Lai lietotu atjauninājumu, administrators pieprasa restartēt pārlūku Chromium. # jūsu inkognito režīma logi netiks atkārtoti atvērti.}}</translation> <translation id="1625909126243026060">Pārskatiet svarīgākās konfidencialitātes un drošības vadīklas pārlūkā Chromium.</translation> +<translation id="1639380494700489405">Lai MI režīmā uzdotu jautājumus par savu cilni, nepametot lapu, pierakstieties pārlūkā Chromium. Jūs arī varēsiet piekļūt parolēm un citiem datiem visās savās ierīcēs.</translation> <translation id="1640672724030957280">Notiek lejupielāde...</translation> <translation id="1680687534629375545">Jautāt attēlu meklēšanas funkcijai par šo lapu</translation> <translation id="1709772298389099340">Nodrošina augstas privilēģijas pārlūkam <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_mk.xtb b/chrome/app/resources/chromium_strings_mk.xtb index aa241e09..af6a5ea94 100644 --- a/chrome/app/resources/chromium_strings_mk.xtb +++ b/chrome/app/resources/chromium_strings_mk.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">Chromium сака да ги избрише вашите податоци во Password Manager. За да го дозволите тоа, внесете ја вашата лозинка за Windows.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Администраторот бара да го рестартирате Chromium за да се примени ажурирање}=1{Администраторот бара да го рестартирате Chromium за да се примени ажурирање. Прозорецот „Инкогнито“ нема да се отвори повторно.}one{Администраторот бара да го рестартирате Chromium за да се примени ажурирање. # прозорец „Инкогнито“ нема да се отвори повторно.}other{Администраторот бара да го рестартирате Chromium за да се примени ажурирање. # прозорци „Инкогнито“ нема да се отворат повторно.}}</translation> <translation id="1625909126243026060">Прегледајте ги клучните контроли за приватноста и безбедноста во Chromium</translation> +<translation id="1639380494700489405">Најавете се на Chromium за да го прашате „AI-режимот“ за вашата картичка без да ја напуштите страницата. Ќе ги добиете и вашите лозинки и друго на сите ваши уреди.</translation> <translation id="1640672724030957280">Се презема…</translation> <translation id="1680687534629375545">Прашајте ја „Пребарување слики“ за страницава</translation> <translation id="1709772298389099340">Обезбедува зголемени привилегии за <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_mn.xtb b/chrome/app/resources/chromium_strings_mn.xtb index 8e30c874..8fed0240 100644 --- a/chrome/app/resources/chromium_strings_mn.xtb +++ b/chrome/app/resources/chromium_strings_mn.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">Chromium таны Нууц үгний менежерийн өгөгдлийг устгахыг хүсэж байна. Үүнийг зөвшөөрөхийн тулд Windows-н нууц үгээ бичнэ үү.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Шинэчлэлтийг хэрэгжүүлэхийн тулд Chromium-г дахин ачаалахыг таны администратор танаас шаардаж байна}=1{Шинэчлэлтийг хэрэгжүүлэхийн тулд Chromium-г дахин ачаалахыг таны администратор танаас шаардаж байна. Таны нууцлалтай цонхыг дахин нээхгүй.}other{Шинэчлэлтийг хэрэгжүүлэхийн тулд Chromium-г дахин ачаалахыг таны администратор танаас шаардаж байна. Таны # нууцлалтай цонхыг дахин нээхгүй.}}</translation> <translation id="1625909126243026060">Chromium-н нууцлал болон аюулгүй байдлын үндсэн хяналтуудыг шалгана уу</translation> +<translation id="1639380494700489405">Хуудаснаас гарахгүйгээр ХОУ-ы горимоос табынхаа талаар асуухын тулд Chromium-д нэвтэрнэ үү. Та мөн бүх төхөөрөмж дээрээ нууц үг болон бусад зүйлээ авна.</translation> <translation id="1640672724030957280">Татаж байна...</translation> <translation id="1680687534629375545">Энэ хуудасны тухай Зурган хайлтаас асуу</translation> <translation id="1709772298389099340"><ph name="BROWSER_NAME" />-н нэмэлт эрхээр хангадаг.</translation>
diff --git a/chrome/app/resources/chromium_strings_my.xtb b/chrome/app/resources/chromium_strings_my.xtb index d10b57a..200ab81 100644 --- a/chrome/app/resources/chromium_strings_my.xtb +++ b/chrome/app/resources/chromium_strings_my.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">Chromium က သင်၏ Password Manager ဒေတာကို ဖျက်လိုသည်။ ၎င်းကိုခွင့်ပြုရန် သင်၏ Windows စကားဝှက်ကို ရိုက်ပါ။</translation> <translation id="1607715478322902680">{COUNT,plural, =0{အပ်ဒိတ်ကို အသုံးပြုနိုင်ရန်အတွက် Chromium ကို ပြန်လည်စတင်ရန် သင်၏စီမံခန့်ခွဲသူက တောင်းဆိုထားပါသည်}=1{အပ်ဒိတ်ကို အသုံးပြုနိုင်ရန်အတွက် Chromium ကို ပြန်လည်စတင်ရန် သင်၏စီမံခန့်ခွဲသူက တောင်းဆိုထားပါသည်။ သင်၏ရုပ်ဖျက် ဝင်ဒိုးကို ပြန်ဖွင့်မည် မဟုတ်ပါ။}other{အပ်ဒိတ်ကို အသုံးပြုနိုင်ရန်အတွက် Chromium ကို ပြန်လည်စတင်ရန် သင်၏စီမံခန့်ခွဲသူက တောင်းဆိုထားပါသည်။ သင်၏ရုပ်ဖျက် ဝင်ဒိုး # ခုကို ပြန်ဖွင့်မည် မဟုတ်ပါ။}}</translation> <translation id="1625909126243026060">အဓိကကျသော ကိုယ်ရေးအချက်အလက်နှင့် လုံခြုံရေး ထိန်းချုပ်မှုများကို Chromium တွင် ကြည့်နိုင်သည်</translation> +<translation id="1639380494700489405">စာမျက်နှာမှ မထွက်ဘဲ သင့်တဘ်အကြောင်း ‘AI မုဒ်’ ကို မေးရန် Chromium သို့ လက်မှတ်ထိုးဝင်ပါ။ သင့်စက်အားလုံးတွင် စကားဝှက်နှင့် အခြားအရာများကိုလည်း ရရှိပါမည်။</translation> <translation id="1640672724030957280">ဒေါင်းလုဒ်လုပ်နေသည်…</translation> <translation id="1680687534629375545">ဤပုံအကြောင်း ‘ပုံဖြင့်ရှာဖွေမှု’ ကို မေးရန်</translation> <translation id="1709772298389099340"><ph name="BROWSER_NAME" /> အတွက် အထူးလုပ်ပိုင်ခွင့်များ ပေးနိုင်သည်။</translation>
diff --git a/chrome/app/resources/chromium_strings_ne.xtb b/chrome/app/resources/chromium_strings_ne.xtb index d3afb4d..cd1d8de 100644 --- a/chrome/app/resources/chromium_strings_ne.xtb +++ b/chrome/app/resources/chromium_strings_ne.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">Chromium तपाईंको पासवर्ड म्यानेजरमा भएको जानकारी मेटाउन चाहन्छ। यसो गर्ने अनुमति दिन Windows को पासवर्ड टाइप गर्नुहोस्।</translation> <translation id="1607715478322902680">{COUNT,plural, =0{तपाईंका व्यवस्थापकका अनुसार तपाईंले यो अद्यावधिक लागू गर्न Chromium पुनः सुरु गर्नु पर्ने हुन्छ}=1{तपाईंका व्यवस्थापकका अनुसार तपाईंले यो अद्यावधिक लागू गर्न Chromium पुनः सुरु गर्नु पर्ने हुन्छ। तपाईंको इन्कोग्निटो विन्डो पुनः खुल्ने छैन।}other{तपाईंका व्यवस्थापकका अनुसार तपाईंले यो अद्यावधिक लागू गर्न Chromium पुनः सुरु गर्नु पर्ने हुन्छ। तपाईंका # वटा इन्कोग्निटो विन्डो पुनः खुल्ने छैनन्।}}</translation> <translation id="1625909126243026060">Chromium मा भएका गोपनीयता र सुरक्षासम्बन्धी मुख्य नियन्त्रण सुविधाहरूको समीक्षा गर्नुहोस्</translation> +<translation id="1639380494700489405">यो पेजबाट नबाहिरिकनै AI मोडलाई आफ्नो ट्याबका बारेमा सोध्न Chromium मा साइन इन गर्नुहोस्। तपाईं सबै डिभाइसमा रहेका आफ्ना पासवर्डलगायतका थप कुराहरू पनि प्राप्त गर्नु हुने छ।</translation> <translation id="1640672724030957280">डाउनलोड गरिँदै छ...</translation> <translation id="1680687534629375545">फोटो प्रयोग गरी खोज्ने सुविधालाई यो पेजका बारेमा सोध्नुहोस्</translation> <translation id="1709772298389099340">यो सेवाले <ph name="BROWSER_NAME" /> का खास विशेषाधिकारहरू उपलब्ध गराउँछ।</translation>
diff --git a/chrome/app/resources/chromium_strings_no.xtb b/chrome/app/resources/chromium_strings_no.xtb index de9e1c6..daa3de7d 100644 --- a/chrome/app/resources/chromium_strings_no.xtb +++ b/chrome/app/resources/chromium_strings_no.xtb
@@ -55,6 +55,7 @@ <translation id="1594928384848033697">Chromium vil slette Passordlagring-dataene dine. Skriv inn Windows-passordet ditt for å tillate dette.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Administratoren din krever at du starter Chromium på nytt for å ta i bruk en oppdatering}=1{Administratoren din krever at du starter Chromium på nytt for å ta i bruk en oppdatering. Inkognitovinduet ditt blir ikke gjenåpnet.}other{Administratoren din krever at du starter Chromium på nytt for å ta i bruk en oppdatering. De # inkognitovinduene dine blir ikke gjenåpnet.}}</translation> <translation id="1625909126243026060">Gjennomgå viktige personvern- og sikkerhetskontroller i Chromium</translation> +<translation id="1639380494700489405">For å spørre AI-modus om fanen din uten å forlate siden, logg på Chromium. Du får også passordene dine med mer på alle enhetene dine.</translation> <translation id="1640672724030957280">Laster ned …</translation> <translation id="1680687534629375545">Spør Bildesøk om denne siden</translation> <translation id="1709772298389099340">Gir overordnet rettighet til <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_pa.xtb b/chrome/app/resources/chromium_strings_pa.xtb index 077c9f76..3c821a3 100644 --- a/chrome/app/resources/chromium_strings_pa.xtb +++ b/chrome/app/resources/chromium_strings_pa.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">Chromium ਤੁਹਾਡੇ Password Manager ਡਾਟੇ ਨੂੰ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦਾ ਹੈ। ਇਸਦੀ ਆਗਿਆ ਦੇਣ ਲਈ ਆਪਣਾ Windows ਪਾਸਵਰਡ ਟਾਈਪ ਕਰੋ।</translation> <translation id="1607715478322902680">{COUNT,plural, =0{ਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਚਾਹੁੰਦਾ ਹੈ ਕਿ ਤੁਸੀਂ ਅੱਪਡੇਟ ਲਾਗੂ ਕਰਨ ਲਈ Chromium ਨੂੰ ਮੁੜ-ਲਾਂਚ ਕਰੋ}=1{ਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਚਾਹੁੰਦਾ ਹੈ ਕਿ ਤੁਸੀਂ ਅੱਪਡੇਟ ਲਾਗੂ ਕਰਨ ਲਈ Chromium ਨੂੰ ਮੁੜ-ਲਾਂਚ ਕਰੋ। ਤੁਹਾਡੀ ਇਨਕੋਗਨਿਟੋ ਵਿੰਡੋ ਦੁਬਾਰਾ ਨਹੀਂ ਖੁੱਲ੍ਹੇਗੀ।}other{ਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਚਾਹੁੰਦਾ ਹੈ ਕਿ ਤੁਸੀਂ ਅੱਪਡੇਟ ਲਾਗੂ ਕਰਨ ਲਈ Chromium ਨੂੰ ਮੁੜ-ਲਾਂਚ ਕਰੋ। ਤੁਹਾਡੀਆਂ # ਇਨਕੋਗਨਿਟੋ ਵਿੰਡੋ ਦੁਬਾਰਾ ਨਹੀਂ ਖੁੱਲ੍ਹਣਗੀਆਂ।}}</translation> <translation id="1625909126243026060">Chromium ਵਿੱਚ ਪ੍ਰਮੁੱਖ ਪਰਦੇਦਾਰੀ ਅਤੇ ਸੁਰੱਖਿਆ ਕੰਟਰੋਲਾਂ ਦੀ ਸਮੀਖਿਆ ਕਰੋ</translation> +<translation id="1639380494700489405">ਪੰਨੇ ਨੂੰ ਛੱਡੇ ਬਿਨਾਂ ਆਪਣੀ ਟੈਬ ਬਾਰੇ AI ਮੋਡ ਨੂੰ ਪੁੱਛਣ ਲਈ, Chromium ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰੋ। ਤੁਸੀਂ ਆਪਣੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ 'ਤੇ ਆਪਣੇ ਪਾਸਵਰਡ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਪ੍ਰਾਪਤ ਕਰ ਸਕੋਗੇ।</translation> <translation id="1640672724030957280">ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation> <translation id="1680687534629375545">ਇਸ ਪੰਨੇ ਬਾਰੇ Image Search ਨੂੰ ਪੁੱਛੋ</translation> <translation id="1709772298389099340"><ph name="BROWSER_NAME" /> ਲਈ ਐਲੀਵੇਟਿਡ ਵਿਸ਼ੇਸ਼-ਅਧਿਕਾਰ ਮੁਹੱਈਆ ਕਰਵਾਉਂਦੀ ਹੈ।</translation>
diff --git a/chrome/app/resources/chromium_strings_ro.xtb b/chrome/app/resources/chromium_strings_ro.xtb index 612dd5fb..323ba81 100644 --- a/chrome/app/resources/chromium_strings_ro.xtb +++ b/chrome/app/resources/chromium_strings_ro.xtb
@@ -55,6 +55,7 @@ <translation id="1594928384848033697">Chromium dorește să șteargă datele din Managerul de parole. Introdu parola Windows pentru a permite acest lucru.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Administratorul solicită să relansezi Chromium pentru a aplica o actualizare}=1{Administratorul solicită să relansezi Chromium pentru a aplica o actualizare. Fereastra incognito nu se va mai deschide.}few{Administratorul solicită să relansezi Chromium pentru a aplica o actualizare. Cele # ferestre incognito nu se vor mai deschide.}other{Administratorul solicită să relansezi Chromium pentru a aplica o actualizare. Cele # de ferestre incognito nu se vor mai deschide.}}</translation> <translation id="1625909126243026060">Examinează cele mai importante opțiuni de confidențialitate și de securitate din Chromium</translation> +<translation id="1639380494700489405">Pentru a întreba Modul AI despre filă fără să părăsești pagina, conectează-te la Chromium. În plus, vei putea accesa parolele și multe altele pe toate dispozitivele.</translation> <translation id="1640672724030957280">Se descarcă…</translation> <translation id="1680687534629375545">Întreabă Căutarea de imagini despre această pagină</translation> <translation id="1709772298389099340">Oferă privilegii de nivel superior pentru <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_ru.xtb b/chrome/app/resources/chromium_strings_ru.xtb index 7f3f04c..d13af44 100644 --- a/chrome/app/resources/chromium_strings_ru.xtb +++ b/chrome/app/resources/chromium_strings_ru.xtb
@@ -54,6 +54,7 @@ <translation id="1594928384848033697">Chromium пытается удалить ваши данные из Google Менеджера паролей. Чтобы разрешить это, введите свой пароль Windows.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Администратор требует перезапустить Chromium для установки обновления.}=1{Администратор требует перезапустить Chromium для установки обновления. Окно в режиме инкогнито не будет открыто повторно.}one{Администратор требует перезапустить Chromium для установки обновления. # окно в режиме инкогнито не будет открыто повторно.}few{Администратор требует перезапустить Chromium для установки обновления. # окна в режиме инкогнито не будут открыты повторно.}many{Администратор требует перезапустить Chromium для установки обновления. # окон в режиме инкогнито не будут открыты повторно.}other{Администратор требует перезапустить Chromium для установки обновления. # окна в режиме инкогнито не будут открыты повторно.}}</translation> <translation id="1625909126243026060">Проверьте основные настройки конфиденциальности и безопасности в Chromium.</translation> +<translation id="1639380494700489405">Войдите в Chromium, чтобы задать вопрос о вкладке в режиме ИИ, не покидая страницу. Пароли и другие данные также появятся на всех ваших устройствах.</translation> <translation id="1640672724030957280">Загрузка...</translation> <translation id="1680687534629375545">Спросить об этой странице у поиска картинок</translation> <translation id="1709772298389099340">Предоставляет повышенные привилегии браузеру <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_si.xtb b/chrome/app/resources/chromium_strings_si.xtb index 15948ab7..f570e19 100644 --- a/chrome/app/resources/chromium_strings_si.xtb +++ b/chrome/app/resources/chromium_strings_si.xtb
@@ -56,6 +56,7 @@ <translation id="1594928384848033697">Chromium හට ඔබේ මුරපද කළමනාකරු දත්ත මැකීමට අවශ්යයි. මෙයට ඉඩ දීමට ඔබේ Windows මුරපදය ටයිප් කරන්න.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{යාවත්කාලීනයක් යෙදීමට ඔබ Chromium නැවත ආරම්භ කිරීම පරිපාලකයාට අවශ්ය වේ}=1{යාවත්කාලීනයක් යෙදීමට ඔබ Chromium නැවත ආරම්භ කිරීම පරිපාලකයාට අවශ්ය වේ. ඔබේ අප්රසිද්ධ කවුළුව යළි විවෘත නොවෙයි.}one{යාවත්කාලීනයක් යෙදීමට ඔබ Chromium නැවත ආරම්භ කිරීම පරිපාලකයාට අවශ්ය වේ. ඔබේ අප්රසිද්ධ කවුළු # යළි විවෘත නොවෙයි.}other{යාවත්කාලීනයක් යෙදීමට ඔබ Chromium නැවත ආරම්භ කිරීම පරිපාලකයාට අවශ්ය වේ. ඔබේ අප්රසිද්ධ කවුළු # යළි විවෘත නොවෙයි.}}</translation> <translation id="1625909126243026060">Chromium හි ප්රධාන පෞද්ගලිකත්ව සහ ආරක්ෂක පාලන සමාලෝචනය කරන්න</translation> +<translation id="1639380494700489405">පිටුවෙන් පිටව නොයා ඔබේ පටිත්ත ගැන AI මාදිලියෙන් විමසීමට, Chromium වෙත පුරන්න. ඔබේ සියලු උපාංගවල ඔබේ මුරපද සහ තවත් දේ ඔබට ලැබෙනු ඇත.</translation> <translation id="1640672724030957280">බාගනිමින්...</translation> <translation id="1680687534629375545">මෙම පිටුව ගැන රූප සෙවීමෙන් විමසන්න</translation> <translation id="1709772298389099340"><ph name="BROWSER_NAME" /> සඳහා උසස් වරප්රසාද ලබා දෙයි.</translation>
diff --git a/chrome/app/resources/chromium_strings_sk.xtb b/chrome/app/resources/chromium_strings_sk.xtb index a242600..9b80d158 100644 --- a/chrome/app/resources/chromium_strings_sk.xtb +++ b/chrome/app/resources/chromium_strings_sk.xtb
@@ -56,6 +56,7 @@ <translation id="1594928384848033697">Chromium chce odstrániť vaše údaje Správcu hesiel. Ak to chcete povoliť, zadajte heslo systému Windows.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Správca požaduje nové spustenie prehliadača Chromium, aby sa použila aktualizácia}=1{Správca požaduje nové spustenie prehliadača Chromium, aby sa použila aktualizácia. Vaše okno inkognito sa neotvorí.}few{Správca požaduje nové spustenie prehliadača Chromium, aby sa použila aktualizácia. Vaše # okná inkognito sa neotvoria.}many{Správca požaduje nové spustenie prehliadača Chromium, aby sa použila aktualizácia. Your # Incognito windows won't reopen.}other{Správca požaduje nové spustenie prehliadača Chromium, aby sa použila aktualizácia. Vašich # okien inkognito sa neotvorí.}}</translation> <translation id="1625909126243026060">Pozrite si hlavné ovládacie prvky ochrany súkromia a zabezpečenia v prehliadači Chromium</translation> +<translation id="1639380494700489405">Ak sa chcete režimu AI spýtať na svoju kartu bez opustenia stránky, prihláste sa do prehliadača Chromium. Navyše budete mať k dispozícii heslá a ďalší obsah vo všetkých svojich zariadeniach.</translation> <translation id="1640672724030957280">Sťahuje sa…</translation> <translation id="1680687534629375545">Spýtať sa vyhľadávania podľa obrázkov otázku o tejto stránke</translation> <translation id="1709772298389099340">Poskytuje vyššie oprávnenia pre <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb index e598ab6..7bacc54 100644 --- a/chrome/app/resources/chromium_strings_sl.xtb +++ b/chrome/app/resources/chromium_strings_sl.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">Chromium želi izbrisati podatke upravitelja gesel. Če želite to omogočiti, vnesite geslo za Windows.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Skrbnik zahteva, da za uveljavitev te posodobitve znova zaženete Chromium.}=1{Skrbnik zahteva, da za uveljavitev te posodobitve znova zaženete Chromium. Anonimno okno se ne bo znova odprlo.}one{Skrbnik zahteva, da za uveljavitev te posodobitve znova zaženete Chromium. # anonimno okno se ne bo znova odprlo.}two{Skrbnik zahteva, da za uveljavitev te posodobitve znova zaženete Chromium. # anonimni okni se ne bosta znova odprli.}few{Skrbnik zahteva, da za uveljavitev te posodobitve znova zaženete Chromium. # anonimna okna se ne bodo znova odprla.}other{Skrbnik zahteva, da za uveljavitev te posodobitve znova zaženete Chromium. # anonimnih oken se ne bo znova odprlo.}}</translation> <translation id="1625909126243026060">Oglejte si ključne kontrolnike zasebnosti in varnosti v Chromiumu.</translation> +<translation id="1639380494700489405">Če želite v načinu umetne inteligence postaviti vprašanje o zavihku, ne da bi zapustili stran, se prijavite v Chromium. V vseh svojih napravah boste imeli na voljo tudi gesla in drugo.</translation> <translation id="1640672724030957280">Prenos ...</translation> <translation id="1680687534629375545">Vprašajte slikovno iskanje o tej strani</translation> <translation id="1709772298389099340">Zagotovi povečane pravice za brskalnik <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_sq.xtb b/chrome/app/resources/chromium_strings_sq.xtb index 6802e74..1d4f0e1 100644 --- a/chrome/app/resources/chromium_strings_sq.xtb +++ b/chrome/app/resources/chromium_strings_sq.xtb
@@ -56,6 +56,7 @@ <translation id="1594928384848033697">Chromium dëshiron të fshijë të dhënat e tua të "Menaxherit të fjalëkalimeve". Shkruaj fjalëkalimin tënd të Windows për ta lejuar këtë.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Administratori yt kërkon që të hapësh përsëri Chromium për të zbatuar këtë përditësim}=1{Administratori yt kërkon që të hapësh përsëri Chromium për të zbatuar këtë përditësim Dritarja jote "e fshehtë" nuk do të rihapet.}other{Administratori yt kërkon që të hapësh përsëri Chromium për të zbatuar këtë përditësim # dritaret e tua "të fshehta" nuk do të rihapen.}}</translation> <translation id="1625909126243026060">Shqyrto kontrollet kryesore të sigurisë dhe privatësisë në Chromium</translation> +<translation id="1639380494700489405">Për t'i kërkuar "Modalitetit të IA-së" për skedën tënde pa u larguar nga faqja, identifikohu në Chromium. Do të marrësh gjithashtu fjalëkalimet dhe më shumë në të gjitha pajisjet e tua.</translation> <translation id="1640672724030957280">Po shkarkohet...</translation> <translation id="1680687534629375545">Pyet "Kërkimin e imazheve" për këtë faqe</translation> <translation id="1709772298389099340">Ofron privilegje të larta për <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_sr-Latn.xtb b/chrome/app/resources/chromium_strings_sr-Latn.xtb index ebba49b..80eaf60 100644 --- a/chrome/app/resources/chromium_strings_sr-Latn.xtb +++ b/chrome/app/resources/chromium_strings_sr-Latn.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">Chromium želi da izbriše podatke Menadžera lozinki. Unesite lozinku za Windows da biste to omogućili.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Administrator zahteva da ponovo pokrenete Chromium da biste primenili ažuriranje}=1{Administrator zahteva da ponovo pokrenete Chromium da biste primenili ažuriranje. Prozor bez arhiviranja se neće ponovo otvoriti.}one{Administrator zahteva da ponovo pokrenete Chromium da biste primenili ažuriranje. # prozor bez arhiviranja se neće ponovo otvoriti.}few{Administrator zahteva da ponovo pokrenete Chromium da biste primenili ažuriranje. # prozora bez arhiviranja se neće ponovo otvoriti.}other{Administrator zahteva da ponovo pokrenete Chromium da biste primenili ažuriranje. # prozora bez arhiviranja se neće ponovo otvoriti.}}</translation> <translation id="1625909126243026060">Pregledajte ključne kontrole privatnosti i bezbednosti u Chromium-u</translation> +<translation id="1639380494700489405">Da biste postavili pitanje AI režimu o kartici bez napuštanja stranice, prijavite se u Chromium. Moći ćete i da pristupate lozinkama i drugom sadržaju na svim uređajima.</translation> <translation id="1640672724030957280">Preuzimanje...</translation> <translation id="1680687534629375545">Postavite pitanje pretrazi slika o ovoj stranici</translation> <translation id="1709772298389099340">Pruža pune privilegije za <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_sr.xtb b/chrome/app/resources/chromium_strings_sr.xtb index 27899ac9..36c0c746 100644 --- a/chrome/app/resources/chromium_strings_sr.xtb +++ b/chrome/app/resources/chromium_strings_sr.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">Chromium жели да избрише податке Менаџера лозинки. Унесите лозинку за Windows да бисте то омогућили.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Администратор захтева да поново покренете Chromium да бисте применили ажурирање}=1{Администратор захтева да поново покренете Chromium да бисте применили ажурирање. Прозор без архивирања се неће поново отворити.}one{Администратор захтева да поново покренете Chromium да бисте применили ажурирање. # прозор без архивирања се неће поново отворити.}few{Администратор захтева да поново покренете Chromium да бисте применили ажурирање. # прозора без архивирања се неће поново отворити.}other{Администратор захтева да поново покренете Chromium да бисте применили ажурирање. # прозора без архивирања се неће поново отворити.}}</translation> <translation id="1625909126243026060">Прегледајте кључне контроле приватности и безбедности у Chromium-у</translation> +<translation id="1639380494700489405">Да бисте поставили питање AI режиму о картици без напуштања странице, пријавите се у Chromium. Моћи ћете и да приступате лозинкама и другом садржају на свим уређајима.</translation> <translation id="1640672724030957280">Преузимање...</translation> <translation id="1680687534629375545">Поставите питање претрази слика о овој страници</translation> <translation id="1709772298389099340">Пружа пуне привилегије за <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_sv.xtb b/chrome/app/resources/chromium_strings_sv.xtb index 6591c67e..59c9b348d 100644 --- a/chrome/app/resources/chromium_strings_sv.xtb +++ b/chrome/app/resources/chromium_strings_sv.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">Chromium vill radera din data i Lösenordshantering. Skriv ditt Windows-lösenord om du vill tillåta detta.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Administratören meddelar att du måste starta om Chromium så att en uppdatering tillämpas}=1{Administratören meddelar att du måste starta om Chromium så att en uppdatering tillämpas. Inkognitofönstret öppnas inte igen.}other{Administratören meddelar att du måste starta om Chromium så att en uppdatering tillämpas. De # inkognitofönstren öppnas inte igen.}}</translation> <translation id="1625909126243026060">Granska viktiga integritets- och säkerhetskontroller i Chromium</translation> +<translation id="1639380494700489405">Logga in i Chromium om du vill fråga AI-läget om fliken utan att lämna sidan. Du får även dina lösenord med mera på alla dina enheter.</translation> <translation id="1640672724030957280">Hämtar ...</translation> <translation id="1680687534629375545">Fråga bildsökning om den här sidan</translation> <translation id="1709772298389099340">Ger förhöjd behörighet för <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_sw.xtb b/chrome/app/resources/chromium_strings_sw.xtb index acfea72..2b4e557 100644 --- a/chrome/app/resources/chromium_strings_sw.xtb +++ b/chrome/app/resources/chromium_strings_sw.xtb
@@ -57,6 +57,7 @@ <translation id="1594928384848033697">Chromium ingependa kufuta data yako ya Kidhibiti cha Manenosiri. Weka nenosiri lako la Windows ili uruhusu hatua hii.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Msimamizi wako anataka ufungue Chromium tena ili utumie sasisho}=1{Msimamizi wako anataka ufungue Chromium tena ili utumie sasisho. Haitafungua upya dirisha fiche.}other{Msimamizi wako anataka ufungue Chromium tena ili utumie sasisho. Haitafungua upya madirisha # fiche.}}</translation> <translation id="1625909126243026060">Kagua vidhibiti muhimu vya faragha na usalama katika Chromium</translation> +<translation id="1639380494700489405">Ili uulize Matumizi ya AI kuhusu kichupo chako bila kuondoka kwenye ukurasa, ingia katika akaunti kwenye Chromium. Pia utapata manenosiri yako na zaidi kwenye vifaa vyako vyote.</translation> <translation id="1640672724030957280">Inapakua...</translation> <translation id="1680687534629375545">Uliza kipengele cha Kutafuta kwa Picha kuhusu ukurasa huu</translation> <translation id="1709772298389099340">Huwezesha ufikiaji maalum wa <ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_th.xtb b/chrome/app/resources/chromium_strings_th.xtb index e7ca3203..8d9fb82 100644 --- a/chrome/app/resources/chromium_strings_th.xtb +++ b/chrome/app/resources/chromium_strings_th.xtb
@@ -54,6 +54,7 @@ <translation id="1594928384848033697">Chromium ต้องการลบข้อมูลในเครื่องมือจัดการรหัสผ่าน โปรดพิมพ์รหัสผ่าน Windows ของคุณเพื่ออนุญาต</translation> <translation id="1607715478322902680">{COUNT,plural, =0{ผู้ดูแลระบบต้องการให้คุณเปิด Chromium ขึ้นมาใหม่เพื่อใช้การอัปเดต}=1{ผู้ดูแลระบบต้องการให้คุณเปิด Chromium ขึ้นมาใหม่เพื่อใช้การอัปเดต หน้าต่างที่ไม่ระบุตัวตนจะไม่เปิดให้อีก}other{ผู้ดูแลระบบต้องการให้คุณเปิด Chromium ขึ้นมาใหม่เพื่อใช้การอัปเดต หน้าต่างที่ไม่ระบุตัวตนจำนวน # หน้าต่างจะไม่เปิดให้อีก}}</translation> <translation id="1625909126243026060">ตรวจสอบการควบคุมที่สำคัญด้านความเป็นส่วนตัวและความปลอดภัยใน Chromium</translation> +<translation id="1639380494700489405">หากต้องการถามโหมด AI เกี่ยวกับแท็บโดยไม่ต้องออกจากหน้า ให้ลงชื่อเข้าใช้ Chromium นอกจากนี้ คุณยังรับรหัสผ่านและข้อมูลอื่นๆ ในอุปกรณ์ทุกเครื่องได้ด้วย</translation> <translation id="1640672724030957280">กำลังดาวน์โหลด...</translation> <translation id="1680687534629375545">ถามการค้นหารูปภาพเกี่ยวกับหน้านี้</translation> <translation id="1709772298389099340">ให้สิทธิ์ในระดับสูงขึ้นกับ <ph name="BROWSER_NAME" /></translation> @@ -195,6 +196,7 @@ <translation id="3045032126857188731">ภาษาที่แปล: <ph name="LANGUAGE" /></translation> <translation id="3047590466164881923">ปิดกล่องโต้ตอบความคิดเห็น</translation> <translation id="3068187312562070417">โปรไฟล์ Chromium อื่นๆ</translation> +<translation id="3068290154869370196">ส่วนขยายคือส่วนเสริมที่ช่วยให้คุณปรับแต่ง Chromium ได้ ตั้งแต่การจัดระเบียบไปจนถึงการทำให้งานประจำวันง่ายขึ้น ส่วนขยายช่วยให้คุณปรับแต่ง Chromium ในรูปแบบของคุณเอง</translation> <translation id="3068515742935458733">ช่วยทำให้ Chromium ดียิ่งขึ้นโดยการส่งรายงานข้อขัดข้องและ <ph name="UMA_LINK" /> ไปยัง Google</translation> <translation id="3079753320517721795">{NUM_DEVICES,plural, =0{มีส่วนขยาย Chromium อย่างน้อย 1 รายการกำลังเข้าถึงอุปกรณ์ USB 1 เครื่อง}=1{มีส่วนขยาย Chromium อย่างน้อย 1 รายการกำลังเข้าถึงอุปกรณ์ USB 1 เครื่อง}other{มีส่วนขยาย Chromium อย่างน้อย 1 รายการกำลังเข้าถึงอุปกรณ์ USB # เครื่อง}}</translation> <translation id="3095811995836568724">ประวัติการเข้าชมใน Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_tr.xtb b/chrome/app/resources/chromium_strings_tr.xtb index 6e065f3..e6add44 100644 --- a/chrome/app/resources/chromium_strings_tr.xtb +++ b/chrome/app/resources/chromium_strings_tr.xtb
@@ -54,6 +54,7 @@ <translation id="1594928384848033697">Chromium, Şifre Yöneticisi verilerinizi silmek istiyor. Buna izin vermek için Windows şifrenizi yazın.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Yöneticiniz bir güncellemeyi uygulamak için Chromium'u yeniden başlatmanızı gerektiriyor}=1{Yöneticiniz bir güncellemeyi uygulamak için Chromium'u yeniden başlatmanızı gerektiriyor. Gizli pencereniz yeniden açılmayacak.}other{Yöneticiniz bir güncellemeyi uygulamak için Chromium'u yeniden başlatmanızı gerektiriyor. # Gizli pencereniz yeniden açılmayacak.}}</translation> <translation id="1625909126243026060">Chromium'daki önemli gizlilik ve güvenlik kontrollerini inceleyin</translation> +<translation id="1639380494700489405">Sayfadan ayrılmadan AI Modu'na sekmenizle ilgili soru sormak için Chromium'da oturum açın. Ayrıca, şifrelerinize ve diğer öğelerinize tüm cihazlarınızdan erişebilirsiniz.</translation> <translation id="1640672724030957280">İndiriliyor...</translation> <translation id="1680687534629375545">Görsel aramaya bu sayfa hakkında soru sorun</translation> <translation id="1709772298389099340"><ph name="BROWSER_NAME" /> için üst düzey ayrıcalıklar sağlar.</translation>
diff --git a/chrome/app/resources/chromium_strings_ur.xtb b/chrome/app/resources/chromium_strings_ur.xtb index fe15b1fb..bc9f327 100644 --- a/chrome/app/resources/chromium_strings_ur.xtb +++ b/chrome/app/resources/chromium_strings_ur.xtb
@@ -56,6 +56,7 @@ <translation id="1594928384848033697">Chromium آپ کا پاس ورڈ مینیجر ڈیٹا حذف کرنا چاہتا ہے۔ اس کی اجازت دینے کے لیے اپنا Windows پاس ورڈ ٹائپ کریں۔</translation> <translation id="1607715478322902680">{COUNT,plural, =0{آپ کے منتظم کا مطالبہ ہے کہ آپ اپ ڈیٹ کو لاگو کرنے کیلئے Chromium کو بند کر کے دوبارہ چلائیں}=1{آپ کے منتظم کا مطالبہ ہے کہ آپ اپ ڈیٹ کو لاگو کرنے کیلئے Chromium کو بند کر کے دوبارہ چلائیں۔ آپ کی پوشیدگی ونڈو دوبارہ نہیں کھلے گی۔}other{آپ کے منتظم کا مطالبہ ہے کہ آپ اپ ڈیٹ کو لاگو کرنے کیلئے Chromium کو بند کر کے دوبارہ چلائیں۔ آپ کی # پوشیدگی ونڈوز دوبارہ نہیں کھلیں گی۔}}</translation> <translation id="1625909126243026060">Chromium میں کلیدی رازداری اور سیکیورٹی کنٹرولز کا جائزہ لیں</translation> +<translation id="1639380494700489405">صفحہ چھوڑے بغیر اپنے ٹیب کے بارے میں AI وضع سے پوچھنے کے لیے، Chromium میں سائن ان کریں۔ آپ کو اپنے تمام آلات پر اپنے پاس ورڈز اور مزید چیزیں بھی مل جائیں گی۔</translation> <translation id="1640672724030957280">ڈاؤن لوڈ ہو رہی ہے…</translation> <translation id="1680687534629375545">اس صفحہ کے بارے میں تصاویر کا استعمال کر کے تلاش سے پوچھیں</translation> <translation id="1709772298389099340"><ph name="BROWSER_NAME" /> کے لیے زیادہ مراعات فراہم کرتا ہے۔</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-CN.xtb b/chrome/app/resources/chromium_strings_zh-CN.xtb index 62c2fad..b5433bbf 100644 --- a/chrome/app/resources/chromium_strings_zh-CN.xtb +++ b/chrome/app/resources/chromium_strings_zh-CN.xtb
@@ -54,6 +54,7 @@ <translation id="1594928384848033697">Chromium 想要删除您的密码管理工具数据。请输入您的 Windows 密码以允许此操作。</translation> <translation id="1607715478322902680">{COUNT,plural, =0{您的管理员要求您重新启动 Chromium 以应用一项更新}=1{您的管理员要求您重新启动 Chromium 以应用一项更新。您的无痕式窗口不会重新打开。}other{您的管理员要求您重新启动 Chromium 以应用一项更新。您的 # 个无痕式窗口不会重新打开。}}</translation> <translation id="1625909126243026060">检查 Chromium 中重要的隐私控制设置和安全控件</translation> +<translation id="1639380494700489405">如需在不离开网页的情况下向 AI 模式询问有关标签页的问题,请登录 Chromium。登录后,您还可在自己的所有设备上同步保存的密码等信息。</translation> <translation id="1640672724030957280">正在下载...</translation> <translation id="1680687534629375545">向图片搜索功能询问此页面</translation> <translation id="1709772298389099340">为 <ph name="BROWSER_NAME" /> 提供提升的权限。</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-TW.xtb b/chrome/app/resources/chromium_strings_zh-TW.xtb index 035c0e08..72f1694 100644 --- a/chrome/app/resources/chromium_strings_zh-TW.xtb +++ b/chrome/app/resources/chromium_strings_zh-TW.xtb
@@ -54,6 +54,7 @@ <translation id="1594928384848033697">Chromium 要刪除密碼管理工具資料。如果允許,請輸入 Windows 密碼。</translation> <translation id="1607715478322902680">{COUNT,plural, =0{系統管理員要求你重新啟動 Chromium,以套用更新}=1{系統管理員要求你重新啟動 Chromium,以套用更新。你的無痕視窗不會重新開啟。}other{系統管理員要求你重新啟動 Chromium,以套用更新。你的 # 個無痕視窗不會重新開啟。}}</translation> <translation id="1625909126243026060">查看 Chromium 中最重要的隱私權和安全性控制項</translation> +<translation id="1639380494700489405">登入 Chromium 後,不必離開頁面就能用 AI 模式查詢分頁,並在所有裝置上同步密碼與其他資料。</translation> <translation id="1640672724030957280">下載中…</translation> <translation id="1680687534629375545">向「圖片搜尋」詢問這個頁面的相關問題</translation> <translation id="1709772298389099340">為 <ph name="BROWSER_NAME" /> 提供進階權限。</translation>
diff --git a/chrome/app/resources/chromium_strings_zu.xtb b/chrome/app/resources/chromium_strings_zu.xtb index 9010709..5a8650e 100644 --- a/chrome/app/resources/chromium_strings_zu.xtb +++ b/chrome/app/resources/chromium_strings_zu.xtb
@@ -56,6 +56,7 @@ <translation id="1594928384848033697">IChromium ifuna ukusula idatha Yesiphathi sakho Sephasiwedi. Thayipha iphasiwedi yakho yeWindows ukuze uvumele lokhu.</translation> <translation id="1607715478322902680">{COUNT,plural, =0{Umlawuli wakho udinga ukuthi uqalise kabusha i-Chromium ukuze kusetshenziswe isibuyekezo}=1{Umlawuli wakho udinga ukuthi uqalise kabusha i-Chromium ukuze kusetshenziswe isibuyekezo. Iwindi lakho le-Incognito ngeke liphinde livuleke.}one{Umlawuli wakho udinga ukuthi uqalise kabusha i-Chromium ukuze kusetshenziswe isibuyekezo. Amawindi akho angu-# e-Incognito ngeke aze aphinde avuleke.}other{Umlawuli wakho udinga ukuthi uqalise kabusha i-Chromium ukuze kusetshenziswe isibuyekezo. Amawindi akho angu-# e-Incognito ngeke aze aphinde avuleke.}}</translation> <translation id="1625909126243026060">Buyekeza izilawuli eziyinhloko zobumfihlo nokuvikeleka ku-Chromium</translation> +<translation id="1639380494700489405">Ukuze ubuze Imodi ye-AI mayelana nethebhu yakho ngaphandle kokushiya ikhasi, ngena ngemvume kuChromium. Uzophinde uthole namaphasiwedi akho nokuningi kuwo wonke amadivayisi akho.</translation> <translation id="1640672724030957280">Iyadawuniloda...</translation> <translation id="1680687534629375545">Buza Ukusesha Ngezithombe ngaleli khasi</translation> <translation id="1709772298389099340">Inikeza amalungelo aphakeme e-<ph name="BROWSER_NAME" />.</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index 425ebcb..441d2e7 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Kan nie die hoofnodus se annotasielêers aflaai nie. Probeer later weer.</translation> <translation id="1103523840287552314">Vertaal <ph name="LANGUAGE" /> altyd</translation> <translation id="1104098698795583187">Jy sal onmiddellik toegang tot die hierdie oortjiegroep verloor, en dit sal van al jou toestelle af uitgevee word</translation> +<translation id="1105934302947321130">Google Beam met Zoom</translation> <translation id="1106270460549661906">Ontdeel met Gemini</translation> <translation id="1106350001632362876">Verhoog drempel</translation> <translation id="110850812463801904">Koppel handmatig aan OneDrive</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Jou sekuriteitsleutel word nie met 'n PIN beskerm nie. Om aanmelddata te bestuur, skep eers 'n PIN.</translation> <translation id="1179400851034021914">IBAN is ongeldig</translation> <translation id="1179902906564467236">Volg instruksies op jou foon of gebruik die kamera-app</translation> -<translation id="1180117276105724040">Stel tans vensters van jou vorige sessie terug …</translation> <translation id="118057123461613219">Baie groot besparing</translation> <translation id="1181037720776840403">Verwyder</translation> <translation id="1182876754474670069">tuis</translation> @@ -762,7 +762,6 @@ <translation id="151501797353681931">Van Safari af ingevoer</translation> <translation id="1515163294334130951">Begin</translation> <translation id="1517467582299994451">Skakel Chrome-blaaier se sinkroniseringinstellings aan om met ’n kode uit te saai</translation> -<translation id="1519090060276706457">Terugstel van vensters neem langer as verwag</translation> <translation id="1521442365706402292">Bestuur sertifikate</translation> <translation id="1521655867290435174">Google Blaaie</translation> <translation id="1521774566618522728">Aktief vandag</translation> @@ -1111,6 +1110,7 @@ <translation id="1745732479023874451">Bestuur kontakte</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{Maak # lêers in hierdie webprogram oop en wysig dit?}}</translation> <translation id="1748563609363301860">Jy kan hierdie wagwoord in jou Google-rekening of net op hierdie toestel stoor</translation> +<translation id="1749645492410897998">Installeer tans sagteware</translation> <translation id="1749733017156547309">’n Wagwoord word vereis</translation> <translation id="1750172676754093297">Jou sekuriteitsleutel kan nie vingerafdrukke berg nie</translation> <translation id="1750238553597293878">Hou aan om die wagwoorde in jou Google-rekening te gebruik</translation> @@ -1182,7 +1182,6 @@ <translation id="1796460466266263589">Verifieer dat dit jy is om aan te hou om Gemini te gebruik</translation> <translation id="1796588414813960292">Kenmerke wat klank nodig het, sal nie werk nie</translation> <translation id="1798726622311813209">Krediet- en debietkaarte</translation> -<translation id="1799852120691957794">Kan nie vensters van jou vorige sessie terugstel nie</translation> <translation id="180203835522132923">Soek + O, dan W</translation> <translation id="1802624026913571222">Slaap wanneer omhulsel toe is</translation> <translation id="1802687198411089702">Hierdie bladsy reageer nie. Jy kan daarvoor wag of uitgaan.</translation> @@ -2379,7 +2378,6 @@ <translation id="2610374175948698697">Kan lêers of vouers op jou toestel bekyk</translation> <translation id="2610780100389066815">Microsoft-vertrouelys-ondertekening</translation> <translation id="261114180663074524">Meld by jou Microsoft-rekening aan en probeer dan weer</translation> -<translation id="2611702650078660078">’n Fout het voorgekom</translation> <translation id="2611776654555141051">Reghoeknutsding</translation> <translation id="2611885296070244383">Mikrofoon (intern)</translation> <translation id="2612676031748830579">Kaartnommer</translation> @@ -2743,7 +2741,6 @@ <translation id="285033512555869047">Toe</translation> <translation id="2850541429955027218">Voeg tema by</translation> <translation id="2851291081585704741">Jy is vanlyn</translation> -<translation id="2852045827873867442">Internetverbinding is nodig.</translation> <translation id="285237063405807022">(laai tans)</translation> <translation id="2853121255651601031">Wagwoord gestoor</translation> <translation id="2854453262159518435">Vervang bestaande oortjiegroep</translation> @@ -3610,6 +3607,7 @@ <translation id="3473241910002674503">Navigeer tuis en terug, en wissel programme met knoppies in tabletmodus.</translation> <translation id="3473479545200714844">Skermvergrootglas</translation> <translation id="3474218480460386727">Gebruik 99 letters of minder vir nuwe woorde</translation> +<translation id="3474330892505468100">Google Beam met Vergader</translation> <translation id="3474624961160222204">Gaan voort as <ph name="NAME" /></translation> <translation id="3477772589943384839">Kry matige geheuebesparings Jou oortjies word ná ’n langer tydperk onaktief.</translation> <translation id="347785443197175480">Hou aan om <ph name="HOST" /> toegang tot jou kamera en mikrofoon te gee</translation> @@ -5498,7 +5496,6 @@ <translation id="4779766576531456629">Hernoem e-SIM-selnetwerk</translation> <translation id="4780321648949301421">Stoor bladsy as …</translation> <translation id="4780558987886269159">Vir werk</translation> -<translation id="4781633367688946589">Gaan voort na nuwe sessie</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> wil persoonlike inligting gebruik wat in jou digitale beursie is.</translation> <translation id="4785719467058219317">Jy gebruik tans 'n sleutel wat nie by hierdie webwerf geregistreer is nie</translation> <translation id="4785914069240823137">Kanselleer snoei</translation> @@ -6287,6 +6284,7 @@ <translation id="5337926771328966926">Huidige toestelnaam is <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Jy kan 'n Incognito-venster gebruik om privaat te blaai</translation> <translation id="5338503421962489998">Plaaslike berging</translation> +<translation id="5340620183031438925">Verifieer dat dit jy is om KI-modus oor jou oortjie te vra sonder om die bladsy te verlaat. Jy sal ook jou wagwoorde en meer op al jou toestelle kry.</translation> <translation id="5340787663756381836">&Soek en wysig</translation> <translation id="5340900621595888432">Stuur diagnostiese en gebruiksdata</translation> <translation id="5341793073192892252">Die volgende webkoekies is geblokkeer (derdepartywebkoekies word sonder uitsondering geblokkeer)</translation> @@ -7474,7 +7472,6 @@ <translation id="6180550893222597997">Watter toegangsleutel wil jy vir <ph name="APP_NAME" /> gebruik?</translation> <translation id="6181218116951226898">Apps dateer soms hul handelsmerk op. Hersien vóór opdatering alle veranderinge om seker te maak dat jy gemaklik is daarmee.</translation> <translation id="6181431612547969857">Aflaai geblokkeer</translation> -<translation id="6182100780603067202">Deel ook appoudio (van al hul vensters)</translation> <translation id="6183369864942961155">Outomatiese lig-/donkertema</translation> <translation id="6183773856988300112">Gemini in Chrome gebruik outoblaai om in jou oortjies te werk en take te voltooi wat jy vir dit gee. <ph name="LINK_BEGIN" />Meer inligting<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Soek oortjies</translation> @@ -8267,7 +8264,6 @@ <translation id="6754359471209693699">Begin nuwe soektog</translation> <translation id="6754918760968695779">Kitsinvoeg</translation> <translation id="6755702685749429945">Voeg woordeboek by</translation> -<translation id="6756157672127672536">Die Lêers-app bied vinnige toegang tot lêers wat jy op Google Drive, eksterne berging of jou Chrome-bedryfstelseltoestel gestoor het.</translation> <translation id="6756643207511618722">Spraakenjins</translation> <translation id="6757431299485455321">Help ander toestelle om hierdie warmkol te kry.</translation> <translation id="6758056191028427665">Sê vir ons hoe ons vaar.</translation> @@ -9213,6 +9209,7 @@ <translation id="7406912950279255498">Kleuromkeringmodus</translation> <translation id="7407430846095439694">Voer in en bind</translation> <translation id="7407504355934009739">Meeste mense blokkeer kennisgewings van hierdie werf af</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> het sensitiewe data. Jou organisasie sal jou toelaat om dit in wolkberging te stoor of om dit weg te gooi</translation> <translation id="7408080603962564527">Ander mense sal dit kan sien</translation> <translation id="740810853557944681">Voeg 'n drukbediener by</translation> <translation id="7409549334477097887">Ekstra groot</translation> @@ -9266,6 +9263,7 @@ <translation id="7434969625063495310">Kon nie die drukbediener byvoeg nie. Gaan die bediener se opstelling na en probeer weer.</translation> <translation id="7436921188514130341">Ai tog! Kon nie hernoem nie.</translation> <translation id="7439519621174723623">Voeg 'n toestelnaam by om voort te gaan</translation> +<translation id="743982235360757672">Hou KI-modus naby terwyl jy blaai</translation> <translation id="7441736532026945583">Kies “Versteek groep” om die groep van jou oortjiestrook te verwyder</translation> <translation id="7441736921018636843">As jy hierdie instelling wil verander, <ph name="BEGIN_LINK" />stel sinkronisering terug<ph name="END_LINK" /> om jou sinkroniseringwagfrase te verwyder</translation> <translation id="7441830548568730290">Ander gebruikers</translation> @@ -10004,7 +10002,6 @@ <translation id="794676567536738329">Bevestig toestemmings</translation> <translation id="7947962633355574091">Kopieer video-adres</translation> <translation id="7947964080535614577">Werwe wys gewoonlik advertensies sodat hulle inhoud of dienste kosteloos kan verskaf. Sommige werwe is egter bekend daarvoor dat hulle indringerige of misleidende advertensies wys.</translation> -<translation id="7948239795436419268">Moenie vensters terugstel nie</translation> <translation id="7948407723851303488">Alle bladsye van <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Rede: LBS ondersteun net URL'e met http://, https:// en file://.</translation> <translation id="7950814699499457511">Aan • Hierdie uitbreiding het nie privaatheidpraktyke gepubliseer nie, soos hoe dit data insamel en gebruik</translation> @@ -11193,7 +11190,6 @@ <translation id="8751034568832412184">Skool</translation> <translation id="8751329102746373229">Van jou administrateur af</translation> <translation id="8752451679755290210">Beweeg outomaties tussen items</translation> -<translation id="8753948258138515839">Die Lêers-app bied vinnige toegang tot lêers wat jy op Google Drive, eksterne berging of jou Chrome OS Flex-toestel gestoor het.</translation> <translation id="8754200782896249056"><p>As <ph name="PRODUCT_NAME" /> in 'n gesteunde werkskermomgewing gebruik word, sal die stelsel se instaanbedienerinstellings gebruik word. Jou stelsel word egter óf nie gesteun nie, óf jou stelselopstelling kon nie begin word nie.</p> <p>Jy kan egter steeds via die bevellyn opstel. Sien asseblief <code>man <ph name="PRODUCT_BINARY_NAME" /></code> vir meer inligting oor vlae en omgewingsveranderlikes.</p></translation> @@ -11986,6 +11982,7 @@ <translation id="992778845837390402">Linux-rugsteun vind tans plaas</translation> <translation id="994087375490600917">Kantpanele</translation> <translation id="994289308992179865">Lus</translation> +<translation id="995420352808264005">Kies toestelinskrywingtipe</translation> <translation id="995755448277384931">Voeg IBAN by</translation> <translation id="996250603853062861">Vestig tans beveiligde verbinding …</translation> <translation id="997143476478634194">Werwe volg outomaties hierdie instelling wanneer jy hulle besoek. Werwe stuur gewoonlik kennisgewings om jou in te lig oor brekende nuus of kletsboodskappe.</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 88b88b8..210d4298 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">የዋና አንጓ ማብራሪያ ፋይሎችን ማውረድ አልተቻለም። ቆይተው እንደገና ይሞክሩ።</translation> <translation id="1103523840287552314">ሁልጊዜ <ph name="LANGUAGE" />ን መተርጎም</translation> <translation id="1104098698795583187">ለዚህ የትር ቡድን ያለዎትን መዳረሻ ወዲያውኑ ያጣሉ እና ከሁሉም መሣሪያዎችዎ ላይ ይሰረዛል</translation> +<translation id="1105934302947321130">Google Beam ከZoom ጋር</translation> <translation id="1106270460549661906">ከGemini ጋር አታጋራ</translation> <translation id="1106350001632362876">መባቻ ጨምር</translation> <translation id="110850812463801904">በእጅ ወደ OneDrive ይገናኙ</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">የእርስዎ ደህንነት ቁልፍ በፒን ጥበቃ እየተደረገለት አይደለም ያለው። በመለያ መግቢያ ውሂብን ለማስተዳደር፣ በመጀመሪያ ፒን ይፍጠሩ።</translation> <translation id="1179400851034021914">አይቢኤኤን ልክ ያልሆነ ነው</translation> <translation id="1179902906564467236">በስልክዎ ላይ መመሪያዎችን ይከተሉ ወይም የካሜራ መተግበሪያውን ይጠቀሙ</translation> -<translation id="1180117276105724040">ከቀዳሚ ክፍለ ጊዜዎ መስኮቶችን ወደነበሩበት በመመለስ ላይ...</translation> <translation id="118057123461613219">ግዙፍ ቁጠባዎች</translation> <translation id="1181037720776840403">አስወግድ</translation> <translation id="1182876754474670069">መነሻ</translation> @@ -762,7 +762,6 @@ <translation id="151501797353681931">ከSafari የመጣ</translation> <translation id="1515163294334130951">አስጀምር</translation> <translation id="1517467582299994451">በኮድ cast ለማድረግ የChrome አሳሽ ስምረት ቅንብሮችን ያብሩ</translation> -<translation id="1519090060276706457">መስኮቶችን ወደነበሩበት መመለስ ከተጠበቀው ጊዜ በላይ ጊዜ እየወሰደ ነው</translation> <translation id="1521442365706402292">ሰርተፊኬቶችን አቀናብር</translation> <translation id="1521655867290435174">Google ሉሆች</translation> <translation id="1521774566618522728">ገባሪ ዛሬ</translation> @@ -1110,6 +1109,7 @@ <translation id="1745732479023874451">እውቂያዎችን ያስተዳድሩ</translation> <translation id="1748283190377208783">{0,plural, =1{ሥራ ላይ ያልዋለ ብዙ ቁጥር}one{በዚህ የድር መተግበሪያ ውስጥ # ፋይሎችን ይክፈቱ እና ያርትዑ?}other{በዚህ የድር መተግበሪያ ውስጥ # ፋይሎችን ይክፈቱ እና ያርትዑ?}}</translation> <translation id="1748563609363301860">ይህንን ይለፍ ቃል በGoogle መለያዎ ወይም በዚህ መሣሪያ ላይ ብቻ ማስቀመጥ ይችላሉ</translation> +<translation id="1749645492410897998">ሶፍትዌር በመጫን ላይ</translation> <translation id="1749733017156547309">የይለፍ ቃል ያስፈልጋል</translation> <translation id="1750172676754093297">የእርስዎ የደህንነት ቁልፍ የጣት አሻራዎችን ማስቀመጥ አይችልም</translation> <translation id="1750238553597293878">በGoogle መለያዎ ውስጥ የይለፍ ቃላትን መጠቀምዎን ይቀጥሉ</translation> @@ -1181,7 +1181,6 @@ <translation id="1796460466266263589">Geminiን መጠቀም ለመቀጠል፣ እርስዎ መሆንዎን ያረጋግጡ</translation> <translation id="1796588414813960292">ድምፅ የሚያስፈልጋቸው ባህሪዎች አይሰሩም</translation> <translation id="1798726622311813209">ክሬዲት እና ዴቢት ካርዶች</translation> -<translation id="1799852120691957794">ከቀዳሚ ክፍለ ጊዜው መስኮቶችን ወደነበሩበት መመለስ አይቻልም</translation> <translation id="180203835522132923">+ O፣ ከዚያ Wን ይፈልጉ</translation> <translation id="1802624026913571222">ክዳኑ ሲዘጋ ተኛ</translation> <translation id="1802687198411089702">ይህ ገፅ ምላሽ እየሰጠ አይደለም። እሱን መጠበቅ ወይም ትተው መውጣት ይችላል።</translation> @@ -2375,7 +2374,6 @@ <translation id="2610374175948698697">በመሣሪያዎ ላይ ፋይሎችን ወይም አቃፊዎችን መመልከት ይቻላል</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">በMicrosoft መለያዎ ይግቡ እና በመቀጠል እንደገና ይሞክሩ</translation> -<translation id="2611702650078660078">ስህተት ተከስቷል</translation> <translation id="2611776654555141051">የአራት ማዕዘን መሣሪያ</translation> <translation id="2611885296070244383">ማይክሮፎን (ውስጣዊ)</translation> <translation id="2612676031748830579">የካርድ ቁጥር</translation> @@ -2739,7 +2737,6 @@ <translation id="285033512555869047">ዝግ ነው</translation> <translation id="2850541429955027218">ገጽታ አክል</translation> <translation id="2851291081585704741">ከመስመር ውጭ ነዎት</translation> -<translation id="2852045827873867442">የበይነመረብ ግንኙነት ያስፈልጋል።</translation> <translation id="285237063405807022">(በመጫን ላይ)</translation> <translation id="2853121255651601031">የይለፍ ቃሉ ተቀምጧል</translation> <translation id="2854453262159518435">ነባር የትር ቡድንን ተካ</translation> @@ -3606,6 +3603,7 @@ <translation id="3473241910002674503">በጡባዊ ሁነታ ላይ ወደ ቤት ይዳስሱ፣ ይመለሱ እና መተግበሪያዎችን ይቀይሩ።</translation> <translation id="3473479545200714844">የማያ ገፅ ማጉያ</translation> <translation id="3474218480460386727">ለአዲስ ቃላት 99 ፊደሎችን ወይም ከዚያ ያነሰ ይጠቀሙ</translation> +<translation id="3474330892505468100">Google Beam ከMeet ጋር</translation> <translation id="3474624961160222204">እንደ <ph name="NAME" /> ይቀጥሉ</translation> <translation id="3477772589943384839">መካከለኛ የማህደረ ትውስታ ቁጠባዎችን ያግኙ። የእርስዎ ትሮች ከረጅም ጊዜ በኋላ ይቦዘናሉ።</translation> <translation id="347785443197175480"><ph name="HOST" /> ካሜራዎን እና ማይክሮፎንዎን እንዲደርስ መፍቀዱን ይቀጥሉ</translation> @@ -5492,7 +5490,6 @@ <translation id="4779766576531456629">የኢሲም የተንቀሳቃሽ ስልክ አውታረ መረብን ዳግም ይሰይሙ</translation> <translation id="4780321648949301421">ገፅ አስቀምጥ እንደ…</translation> <translation id="4780558987886269159">ለሥራ</translation> -<translation id="4781633367688946589">ወደ አዲስ ክፍለ ጊዜ ቀጥል</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> ከእርስዎ ዲጂታል የኪስ ቦርሳ ላይ ግላዊ መረጃን መጠቀም ይፈልጋል።</translation> <translation id="4785719467058219317">በዚህ ድር ጣቢያ ያልተመዘገበ የደህንነት ቁልፍ እየተጠቀሙ ነው</translation> <translation id="4785914069240823137">ከርክምን ሰርዝ</translation> @@ -6281,6 +6278,7 @@ <translation id="5337926771328966926">አሁን ያለው የመሣሪያ ስም <ph name="DEVICE_NAME" /> ነው</translation> <translation id="5338338064218053691">ማንነት የማያሳውቅ መስኮት ተጠቅመው በግል ማሰስ ይችላሉ</translation> <translation id="5338503421962489998">አካባቢያዊ ማከማቻ</translation> +<translation id="5340620183031438925">ገጹን ለቅቀው ሳይወጡ ስለ ትርዎ የሰው ሠራሽ አስተውሎት ሁነታን ለመጠየቅ እርስዎ መሆንዎን ያረጋግጡ። እንዲሁም የይለፍ ቃላትዎን እና ሌሎችንም በሁሉም መሣሪያዎችዎ ላይ ያገኛሉ።</translation> <translation id="5340787663756381836">አግኝ እና አርትዕ</translation> <translation id="5340900621595888432">የምርመራ እና የአጠቃቀም ውሂብ ላክ</translation> <translation id="5341793073192892252">የሚከተሉት ኩኪዎች ታግደዋል (የሦስተኛ ወገን ኩኪዎች ሳይገለግሉ እየታገዱ ናቸው)</translation> @@ -7467,7 +7465,6 @@ <translation id="6180550893222597997">ለ<ph name="APP_NAME" /> የትኛውን የይለፍ ቁልፍ መጠቀም ይፈልጋሉ?</translation> <translation id="6181218116951226898">መተግበሪያዎ አንዳንድ ጊዜያት የምርት ስማቸውን ያዘምናሉ። ከማዘመንዎ በፊት ከእነሱ ጋር እርስዎ ምቾት እንደሚሰማዎት ለማረጋገጥ ሁሉንም ለውጦች ይገምግሙ።</translation> <translation id="6181431612547969857">ማውረድ ታግዷል</translation> -<translation id="6182100780603067202">እንዲሁም የመተግበሪያ ኦዲዮን ያጋሩ (ከሁሉም መስኮቶቹ)</translation> <translation id="6183369864942961155">ራስ-ሰር የብርሃን/የጨለማ ገጽታ</translation> <translation id="6183773856988300112">Gemini በChrome ውስጥ በትሮችዎ ውስጥ ለመሥራት እና እርስዎ የሚሰጡትን ተግባራት ለማጠናቀቅ ራስ-ሰር አሰሳን ይጠቀማል። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation> <translation id="6184099524311454384">ትሮችን ይፈልጉ</translation> @@ -8262,7 +8259,6 @@ <translation id="6754359471209693699">አዲስ ፍለጋ ጀምር</translation> <translation id="6754918760968695779">ፈጣን ማስገቢያ</translation> <translation id="6755702685749429945">መዝገበ ቃላት አክል</translation> -<translation id="6756157672127672536">የፋይሎች መተግበሪያው በGoogle Drive፣ ውጫዊ ማከማቻ ወይም በእርስዎ የChromeOS መሣሪያ ላይ ያስቀመጧቸውን ፋይሎች ፈጣን መዳረሻ ይሰጠዎታል።</translation> <translation id="6756643207511618722">የንግግር ፍርግሞች</translation> <translation id="6757431299485455321">ሌሎች መሣሪያዎች ይህን መገናኛ ነጥብ እንዲያገኙ ያግዟቸው</translation> <translation id="6758056191028427665">እንዴት እኛ እያደርግን እንደሆነ እንድናውቅ ያድርጉን።</translation> @@ -9209,6 +9205,7 @@ <translation id="7406912950279255498">የተቃራኒ ቀለም ሁነታ</translation> <translation id="7407430846095439694">አስመጣ እና እሰር</translation> <translation id="7407504355934009739">አብዛኛዎቹ ሰዎች ከዚህ ጣቢያ የሚመጡ ማሳወቂያዎችን ያግዳሉ</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> ልዩ ጥንቃቄ የሚያስፈልገው ውሂብ አለው። ድርጅትዎ ወደ የደመና ማከማቻ እንዲያስቀምጡት ወይም እንዲያስወግዱት ይፈቅድልዎታል</translation> <translation id="7408080603962564527">ይህ ለሌሎች የሚታይ ይሆናል</translation> <translation id="740810853557944681">የህትመት አገልጋይ ያክሉ</translation> <translation id="7409549334477097887">በጣም ትልቅ</translation> @@ -9262,6 +9259,7 @@ <translation id="7434969625063495310">የህትመት አገልጋዩን ማከል አልተቻለም። እባክዎ የአገልጋዩን ውቅረት ይፈትሹና እንደገና ይሞክሩ።</translation> <translation id="7436921188514130341">ኧረ ቴች! ዳግም በሚሰየምበት ጊዜ የሆነ ስህተት ነበር።</translation> <translation id="7439519621174723623">ለመቀጠል የመሣሪያ ስም ያክሉ</translation> +<translation id="743982235360757672">በሚያስሱበት ጊዜ የሰው ሠራሽ አስተውሎት ሁነታን በአቅራቢያ ያቆዩ</translation> <translation id="7441736532026945583">ቡድኑን ከትር ድርድርዎ ለማስወገድ «ቡድን ደብቅ» የሚለውን ይምረጡ</translation> <translation id="7441736921018636843">ይህን ቅንብር ለመቀየር፣ የእርስዎን የስምረት ይለፍ ሐረግ ለማስወገድ <ph name="BEGIN_LINK" />ስምረትን ዳግም ያቀናብሩ<ph name="END_LINK" /></translation> <translation id="7441830548568730290">ሌሎች ተጠቃሚዎች</translation> @@ -10000,7 +9998,6 @@ <translation id="794676567536738329">ፍቃዶችን ያረጋግጡ</translation> <translation id="7947962633355574091">የቪዲዮ አድራሻ &ቅዳ</translation> <translation id="7947964080535614577">ጣቢያዎች ይዘትን ወይም አገልግሎቶችን ከክፍያ ነፃ ማቅረብ እንዲችሉ ማስታወቂያዎችን ያሳያሉ። ነገር ግን አንዳንድ ጣቢያዎች ረባሽ ወይም አሳሳች ማስታወቂያዎችን በማሳየት ይታወቃሉ።</translation> -<translation id="7948239795436419268">መስኮቶችን ወደነበሩበት አትመልስ</translation> <translation id="7948407723851303488">የ<ph name="DOMAIN_NAME" /> ሁሉም ገጾች</translation> <translation id="7950629216186736592">ምክንያት፦ LBS የሚደግፈው የ http://፣ https:// እና file:// ዩአርኤሎችን ብቻ ነው።</translation> <translation id="7950814699499457511">በርቷል • ይህ ቅጥያ እንደ ውሂብን እንዴት እንደሚሰበስብ እና እንደሚጠቀም ያሉ የግላዊነት ተግባሮችን አላተመም</translation> @@ -11194,7 +11191,6 @@ <translation id="8751034568832412184">ትምህርት ቤት</translation> <translation id="8751329102746373229">ከእርስዎ አስተዳዳሪ</translation> <translation id="8752451679755290210">በንጥሎች መካከል በራስ-ሰር ይንቀሳቀሱ</translation> -<translation id="8753948258138515839">የፋይሎች መተግበሪያው በGoogle Drive፣ ውጫዊ ማከማቻ ወይም በእርስዎ የChromeOS Flex መሣሪያ ላይ ያስቀመጧቸውን ፋይሎች ፈጣን መዳረሻ ይሰጠዎታል።</translation> <translation id="8754200782896249056"><p><ph name="PRODUCT_NAME" />ን በተደገፈ የዴስክቶፕ ምህዳር ላይ ሲሄድ የስርዓቱ ተኪ ቅንብሮች ናቸው ሥራ ላይ የሚውሉት። ይሁንና ወይም ስርዓትዎ አይደገፍም ወይም የስርዓት ውቅርዎን ማስጀመር ላይ ችግር ነበር።</p> <p>ግን አሁንም በትዕዛዝ መስመሩ በኩል ሊያዋቅሩ ይችላሉ። በጥቆማዎች እና የምህዳር ተለዋዋጮች ላይ ተጨማሪ መረጃ ለማግኘት እባክዎ <code>man <ph name="PRODUCT_BINARY_NAME" /></code>ን ይመልከቱ።</p></translation> @@ -11988,6 +11984,7 @@ <translation id="992778845837390402">Linux ምትኬ አሁን በሂደት ላይ ነው</translation> <translation id="994087375490600917">የጎን ፓነሎች</translation> <translation id="994289308992179865">&ደጋግም</translation> +<translation id="995420352808264005">የመሣሪያ ምዝገባ ዓይነት ይምረጡ</translation> <translation id="995755448277384931">አይ ቢ ኤ ኤን ያክሉ</translation> <translation id="996250603853062861">ደህንነቱ የተጠበቀ ግንኙነት በመመስረት ላይ...</translation> <translation id="997143476478634194">እርስዎ ሲጎበኟቸው ጣቢያዎች ይህን ቅንብር በራስ-ሰር ይከተሉታል። ጣቢያዎች አብዛኛውን ጊዜ ስለ ሰበር ዜና ወይም ስለ ውይይት መልዕክቶች እርስዎን ለማሳወቅ ማሳወቂያዎችን ይልካሉ።</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 8c2f6cf..99414573 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">يتعذَّر تنزيل ملفات التعليقات التوضيحية للعقدة الرئيسية. يُرجى إعادة المحاولة لاحقًا.</translation> <translation id="1103523840287552314">ترجمة اللغة <ph name="LANGUAGE" /> دائمًا</translation> <translation id="1104098698795583187">ستفقد على الفور إمكانية الوصول إلى مجموعة علامات التبويب هذه، وسيتم حذفها من جميع أجهزتك</translation> +<translation id="1105934302947321130">Google Beam مع Zoom</translation> <translation id="1106270460549661906">إلغاء المشاركة مع Gemini</translation> <translation id="1106350001632362876">زيادة الحدّ</translation> <translation id="110850812463801904">الربط يدويًا بخدمة OneDrive</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">مفتاح الأمان غير محمي برقم تعريف شخصي. لإدارة بيانات تسجيل الدخول، عليك أولاً إنشاء رقم تعريف شخصي.</translation> <translation id="1179400851034021914">رقم الحساب بصيغة IBAN غير صالح</translation> <translation id="1179902906564467236">اتّبِع التعليمات التي تظهر على هاتفك أو استخدِم تطبيق "الكاميرا"</translation> -<translation id="1180117276105724040">جارٍ استعادة النوافذ من الجلسة السابقة…</translation> <translation id="118057123461613219">تم إخلاء جزء كبير جدًا من مساحة التخزين</translation> <translation id="1181037720776840403">إزالة</translation> <translation id="1182876754474670069">مفتاح Home</translation> @@ -764,7 +764,6 @@ <translation id="151501797353681931">تم الاستيراد من Safari</translation> <translation id="1515163294334130951">تشغيل</translation> <translation id="1517467582299994451">لبث المحتوى باستخدام رمز، يجب تفعيل إعدادات مزامنة متصفّح Chrome.</translation> -<translation id="1519090060276706457">تستغرق عملية استعادة النوافذ وقتًا أطول من المتوقع</translation> <translation id="1521442365706402292">تنظيم الشهادات</translation> <translation id="1521655867290435174">جداول بيانات Google</translation> <translation id="1521774566618522728">نشط اليوم</translation> @@ -1105,6 +1104,7 @@ <translation id="1745732479023874451">إدارة جهات الاتصال</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}zero{هل تريد فتح # ملف وتعديله في تطبيق الويب هذا؟}two{هل تريد فتح ملفَين وتعديلهما في تطبيق الويب هذا؟}few{هل تريد فتح # ملفات وتعديلها في تطبيق الويب هذا؟}many{هل تريد فتح # ملفًا وتعديلها في تطبيق الويب هذا؟}other{هل تريد فتح # ملف وتعديلها في تطبيق الويب هذا؟}}</translation> <translation id="1748563609363301860">يمكنك حفظ كلمة المرور هذه في حسابك على Google أو على هذا الجهاز فقط.</translation> +<translation id="1749645492410897998">جارٍ تثبيت البرنامج</translation> <translation id="1749733017156547309">كلمة المرور مطلوبة.</translation> <translation id="1750172676754093297">يتعذّر على مفتاح الأمان تخزين بصمات الإصبع.</translation> <translation id="1750238553597293878">مواصلة استخدام كلمات المرور في حسابك على Google</translation> @@ -1176,7 +1176,6 @@ <translation id="1796460466266263589">لمواصلة استخدام Gemini، يجب إثبات هويتك</translation> <translation id="1796588414813960292">لن تعمل الميزات التي تحتاج إلى استخدام الصوت.</translation> <translation id="1798726622311813209">بطاقات الائتمان والسحب الآلي</translation> -<translation id="1799852120691957794">تتعذّر استعادة النوافذ من الجلسة السابقة</translation> <translation id="180203835522132923">مفتاح البحث + O، ثم W</translation> <translation id="1802624026913571222">السكون عند غلق الغطاء </translation> @@ -2371,7 +2370,6 @@ <translation id="2610374175948698697">يمكنها قراءة الملفات أو المجلدات على جهازك</translation> <translation id="2610780100389066815">توقيع قائمة الثقة لـ Microsoft</translation> <translation id="261114180663074524">سجِّل الدخول إلى حسابك على Microsoft ثم أعِد المحاولة.</translation> -<translation id="2611702650078660078">حدث خطأ</translation> <translation id="2611776654555141051">أداة رسم المستطيل</translation> <translation id="2611885296070244383">ميكروفون (داخلي)</translation> <translation id="2612676031748830579">رقم البطاقة</translation> @@ -2735,7 +2733,6 @@ <translation id="285033512555869047">مغلقة</translation> <translation id="2850541429955027218">إضافة مظهر</translation> <translation id="2851291081585704741">لا يتوفر اتصال بالإنترنت</translation> -<translation id="2852045827873867442">يجب توفُّر اتصال بالإنترنت.</translation> <translation id="285237063405807022">(جارٍ تحميله)</translation> <translation id="2853121255651601031">تم حفظ كلمة المرور.</translation> <translation id="2854453262159518435">استبدال مجموعة علامات التبويب الحالية</translation> @@ -3602,6 +3599,7 @@ <translation id="3473241910002674503">يمكنك الانتقال إلى الصفحة الرئيسية والصفحة السابقة والتبديل بين التطبيقات باستخدام أزرار التنقل في وضع الجهاز اللوحي.</translation> <translation id="3473479545200714844">مكبّر الشاشة</translation> <translation id="3474218480460386727">يجب استخدام ما لا يزيد عن 99 حرفًا للكلمات الجديدة.</translation> +<translation id="3474330892505468100">Google Beam مع Meet</translation> <translation id="3474624961160222204">المتابعة بحساب "<ph name="NAME" />"</translation> <translation id="3477772589943384839">يمكنك إخلاء جزء متوسط من مساحة التخزين في الذاكرة. وستظل علامات التبويب نشطة لفترة زمنية أطول.</translation> <translation id="347785443197175480">مواصلة إتاحة دخول <ph name="HOST" /> إلى الكاميرا والميكروفون التابعين لك</translation> @@ -5488,7 +5486,6 @@ <translation id="4779766576531456629">إعادة تسمية شبكة الجوّال لشريحة eSIM</translation> <translation id="4780321648949301421">حفظ صفحة باسم...</translation> <translation id="4780558987886269159">للعمل</translation> -<translation id="4781633367688946589">المتابعة إلى جلسة جديدة</translation> <translation id="4784349455504343791">يريد <ph name="WEBSITE_ORIGIN" /> استخدام معلومات شخصية من محفظتك الرقمية.</translation> <translation id="4785719467058219317">أنت تستخدم مفتاح أمان غير مُسجَّل مع هذا الموقع الإلكتروني</translation> <translation id="4785914069240823137">إلغاء الاقتصاص</translation> @@ -6277,6 +6274,7 @@ <translation id="5337926771328966926">اسم الجهاز الحالي هو <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">يمكنك التصفُّح بخصوصية تامّة باستخدام نافذة للتصفُّح المتخفي.</translation> <translation id="5338503421962489998">تخزين محلي</translation> +<translation id="5340620183031438925">لطرح أسئلة في "وضع AI" حول علامة التبويب بدون مغادرة الصفحة، يُرجى إثبات هويتك. بإمكانك أيضًا الوصول إلى كلمات المرور وغيرها من البيانات على جميع أجهزتك.</translation> <translation id="5340787663756381836">بحث وتعديل</translation> <translation id="5340900621595888432">إرسال بيانات التشخيص والاستخدام</translation> <translation id="5341793073192892252">تم حظر ملفات تعريف الارتباط التالية (يتم حظر ملفات تعريف الارتباط التي تنتمي إلى جهات خارجية بدون استثناء)</translation> @@ -7463,7 +7461,6 @@ <translation id="6180550893222597997">ما هو مفتاح المرور الذي تريد استخدامه لتسجيل الدخول إلى "<ph name="APP_NAME" />"؟</translation> <translation id="6181218116951226898">قد يتم أحيانًا تعديل هوية العلامة التجارية للتطبيقات. لذا، يُرجى مراجعة جميع التغييرات للتأكّد من أنّها مناسبة لك قبل تحديث التطبيق.</translation> <translation id="6181431612547969857">تم حظر التنزيل</translation> -<translation id="6182100780603067202">مشاركة صوت التطبيق أيضًا (من جميع نوافذه)</translation> <translation id="6183369864942961155">المظهر التلقائي الفاتح أو الداكن</translation> <translation id="6183773856988300112">يستخدم "Gemini في Chrome" ميزة التصفّح التلقائي للعمل في علامات التبويب وإكمال المهام المطلوبة منه. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation> <translation id="6184099524311454384">البحث في علامات التبويب</translation> @@ -8264,7 +8261,6 @@ <translation id="6754359471209693699">بدء عملية بحث جديدة</translation> <translation id="6754918760968695779">الإدراج السريع</translation> <translation id="6755702685749429945">إضافة قاموس</translation> -<translation id="6756157672127672536">يتيح تطبيق "الملفات" الوصول سريعًا إلى الملفات التي حفظتها على Google Drive، أو وحدة تخزين خارجية، أو جهازك الذي يعمل بنظام التشغيل Chrome.</translation> <translation id="6756643207511618722">محركات تحويل النص إلى كلام</translation> <translation id="6757431299485455321">مساعدة الأجهزة الأخرى في العثور على نقطة الاتصال هذه</translation> <translation id="6758056191028427665">يُرجى تقييم أدائنا.</translation> @@ -9212,6 +9208,7 @@ <translation id="7406912950279255498">وضع "قلب الألوان"</translation> <translation id="7407430846095439694">الاستيراد والربط</translation> <translation id="7407504355934009739">يحظر معظم المستخدمين الإشعارات من هذا الموقع الإلكتروني.</translation> +<translation id="7407578029724074226">يتضمّن الملف "<ph name="FILE_NAME" />" بيانات حسّاسة. وستسمح لك مؤسستك بتخزينه في السحابة الإلكترونية أو تجاهله</translation> <translation id="7408080603962564527">سيكون هذا الاسم ظاهرًا للآخرين.</translation> <translation id="740810853557944681">إضافة خادم طباعة</translation> <translation id="7409549334477097887">كبير جدًا</translation> @@ -9264,6 +9261,7 @@ <translation id="7434969625063495310">تعذّر العثور على خادم الطباعة. يُرجى التحقّق من إعدادات الخادم وإعادة المحاولة.</translation> <translation id="7436921188514130341">عذرًا، حدث خطأ في أثناء إعادة التسمية.</translation> <translation id="7439519621174723623">يجب إضافة اسم جهاز للمتابعة.</translation> +<translation id="743982235360757672">الاستفادة من "وضع AI" أثناء التصفّح</translation> <translation id="7441736532026945583">اختيار "إخفاء المجموعة" لإزالتها من شريط علامات التبويب</translation> <translation id="7441736921018636843">لتغيير هذا الإعداد، يمكنك <ph name="BEGIN_LINK" />إعادة ضبط المزامنة<ph name="END_LINK" /> لإزالة عبارة مرور المزامنة.</translation> <translation id="7441830548568730290">المستخدمون الآخرون</translation> @@ -9398,7 +9396,7 @@ <translation id="7531779363494549572">يُرجى الانتقال إلى "الإعدادات" > "التطبيقات والإشعارات" > "الإشعارات".</translation> <translation id="7532009420053991888"><ph name="LINUX_APP_NAME" /> لا يستجيب. اختَر "فرض الإغلاق" لإغلاق التطبيق.</translation> <translation id="75362970626182391">مجموعة علامات تبويب جديدة</translation> -<translation id="7536815228183532290">تم تسجيل الدخول بحساب <ph name="EMAIL" />.</translation> +<translation id="7536815228183532290">تم تسجيل الدخول بحساب <ph name="EMAIL" /></translation> <translation id="7538013435257102593">لا يتم تنزيل نوع هذا الملف عادةً، وقد يكون خطيرًا.</translation> <translation id="7540972813190816353">حدث خطأ أثناء التحقق من التحديثات: <ph name="ERROR" /></translation> <translation id="7541076351905098232">أعاد <ph name="MANAGER" /> هذا الجهاز إلى إصدار سابق من نظام التشغيل. يُرجى حفظ الملفات المُهمة، ثم إعادة تشغيل الجهاز. سيتم حذف كل البيانات على الجهاز.</translation> @@ -10002,7 +10000,6 @@ <translation id="794676567536738329">تأكيد الأذونات</translation> <translation id="7947962633355574091">نس&خ عنوان الفيديو</translation> <translation id="7947964080535614577">تعرض المواقع الإلكترونية عادةً الإعلانات لتتمكَّن من توفير محتوى أو خدمات مجانًا، إلا أن بعض المواقع الإلكترونية تُعرَف بعرضها إعلانات مضلِّلة أو غير مرغوب فيها.</translation> -<translation id="7948239795436419268">عدم استعادة النوافذ</translation> <translation id="7948407723851303488">جميع صفحات النطاق <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">السبب: لا تتوافق ميزة "الوصول إلى المتصفِّحات القديمة" (LBS) إلا مع عناوين URL التي تبدأ بـ http:// وhttps:// وfile://.</translation> <translation id="7950814699499457511">مفعَّلة • لم تنشر هذه الإضافة الممارسات المتعلقة بالخصوصية، مثل كيفية جمعها للبيانات واستخدامها</translation> @@ -11192,7 +11189,6 @@ <translation id="8751034568832412184">مؤسسة تعليمية</translation> <translation id="8751329102746373229">من المُشرف</translation> <translation id="8752451679755290210">التنقُّل بين العناصر تلقائيًا</translation> -<translation id="8753948258138515839">يتيح تطبيق "الملفات" وصولاً سريعًا إلى الملفات التي تم حفظها على Google Drive أو وحدة التخزين الخارجية أو الجهاز الذي يعمل بنظام التشغيل ChromeOS Flex.</translation> <translation id="8754200782896249056"><p>عند تشغيل <ph name="PRODUCT_NAME" /> من خلال بيئة معتمدة لسطح المكتب، سيتم استخدام إعدادات الخادم الوكيل للنظام. ومع ذلك، يحتمل إما أن يكون نظامك غير مدعم أو أنه ربما حدثت مشكلة أثناء تشغيل إعداد نظامك.</p> <p>لكن لا يزال بإمكانك الإعداد من خلال سطر الأوامر. يُرجى الاطّلاع على <code>man <ph name="PRODUCT_BINARY_NAME" /></code> للمزيد من المعلومات عن المتغيرات لكل من العلامات والبيئة.</p></translation> @@ -11989,6 +11985,7 @@ <translation id="992778845837390402">الاحتفاظ بنسخة احتياطية من Linux قيد التقدم حاليًا</translation> <translation id="994087375490600917">اللوحات الجانبية</translation> <translation id="994289308992179865">ت&كرار</translation> +<translation id="995420352808264005">اختيار نوع تسجيل الجهاز</translation> <translation id="995755448277384931">إضافة رقم الحساب بصيغة IBAN</translation> <translation id="996250603853062861">إنشاء اتصال آمن...</translation> <translation id="997143476478634194">ستتّبِع المواقع الإلكترونية هذا الإعداد تلقائيًا عند زيارتك لها. ترسل المواقع الإلكترونية عادةً الإشعارات لإعلامك بالأخبار العاجلة أو رسائل المحادثة.</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index ae9f60a..2322f3e 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">মুখ্য ন’ড এন’টেশ্বন ফাইল ডাউনল’ড কৰিব নোৱাৰি। পাছত পুনৰ চেষ্টা কৰক।</translation> <translation id="1103523840287552314"><ph name="LANGUAGE" /> সদাই অনুবাদ কৰক</translation> <translation id="1104098698795583187">আপুনি তাৎক্ষণিকভাৱে এই টেবৰ গোটটোৰ এক্সেছ হেৰুৱাব আৰু এইটো আপোনাৰ আটাইবোৰ ডিভাইচৰ পৰা মচা হ’ব</translation> +<translation id="1105934302947321130">Zoomৰ সৈতে Google Beam</translation> <translation id="1106270460549661906">Geminiৰ জৰিয়তে আনশ্বেয়াৰ কৰক</translation> <translation id="1106350001632362876">সীমা বৃদ্ধি কৰক</translation> <translation id="110850812463801904">OneDriveৰ সৈতে মেনুৱেলী সংযোগ কৰক</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">আপোনাৰ সুৰক্ষাৰ চাবিটো এটা পিনৰ দ্বাৰা সুৰক্ষিত নহয়। ছাইন ইন ডেটা পৰিচালনা কৰিবলৈ, প্ৰথমে এটা পিন সৃষ্টি কৰক।</translation> <translation id="1179400851034021914">IBAN মান্য নহয়</translation> <translation id="1179902906564467236">আপোনাৰ ফ’নত পোৱা নিৰ্দেশাৱলী মানি চলক অথবা কেমেৰা এপ্টো ব্যৱহাৰ কৰক</translation> -<translation id="1180117276105724040">আপোনাৰ পূৰ্বৱৰ্তী ছেশ্বন পৰা ৱিণ্ড’ পুনঃস্থাপন কৰি থকা হৈছে...</translation> <translation id="118057123461613219">বহুত বেছি ৰাহি</translation> <translation id="1181037720776840403">আঁতৰাওক</translation> <translation id="1182876754474670069">হ’ম</translation> @@ -760,7 +760,6 @@ <translation id="151501797353681931">Safariৰ পৰা আমদানি কৰা হৈছে</translation> <translation id="1515163294334130951">লঞ্চ কৰক</translation> <translation id="1517467582299994451">এটা ক’ডৰ জৰিয়তে কাষ্ট কৰিবলৈ Chrome ব্ৰাউজাৰৰ ছিংকৰ ছেটিং অন কৰক</translation> -<translation id="1519090060276706457">ৱিণ্ড’ পুনঃস্থাপন কৰাটোৱে আশা কৰাতকৈ অধিক সময় লৈছে</translation> <translation id="1521442365706402292">প্ৰমাণপত্ৰ পৰিচালনা কৰক</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">আজি সক্ৰিয় হৈছে</translation> @@ -1109,6 +1108,7 @@ <translation id="1745732479023874451">সম্পৰ্কসমূহ পৰিচালনা কৰক</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}one{এই ৱেব এপ্টোত # টা ফাইল খুলি সম্পাদনা কৰিবনে?}other{এই ৱেব এপ্টোত # টা ফাইল খুলি সম্পাদনা কৰিবনে?}}</translation> <translation id="1748563609363301860">আপুনি এই পাছৱৰ্ডটো নিজৰ Google একাউণ্ট অথবা কেৱল এই ডিভাইচটোত ছেভ কৰিব পাৰে</translation> +<translation id="1749645492410897998">ছফ্টৱেৰ ইনষ্টল কৰি থকা হৈছে</translation> <translation id="1749733017156547309">এটা পাছৱৰ্ডৰ প্ৰয়োজন</translation> <translation id="1750172676754093297">এই সুৰক্ষাৰ চাবিটোৱে ফিংগাৰপ্ৰিণ্টবোৰ ষ্ট'ৰ কৰিব নোৱাৰে</translation> <translation id="1750238553597293878">আপোনাৰ Google একাউণ্টত পাছৱৰ্ডসমূহ ব্যৱহাৰ কৰি থাকক</translation> @@ -1180,7 +1180,6 @@ <translation id="1796460466266263589">Gemini ব্যৱহাৰ কৰি থাকিবলৈ, আপুনি নিজৰ পৰিচয় সত্যাপন কৰক</translation> <translation id="1796588414813960292">ধ্বনিৰ আৱশ্যক হোৱা সুবিধাসমূহে কাম নকৰিব</translation> <translation id="1798726622311813209">ক্ৰেডিট আৰু ডেবিট কাৰ্ড</translation> -<translation id="1799852120691957794">আপোনাৰ পূৰ্বৱৰ্তী ছেশ্বনৰ পৰা ৱিণ্ড’ পুনঃস্থাপন কৰিব নোৱাৰি</translation> <translation id="180203835522132923">Search + O, তাৰ পাছত W</translation> <translation id="1802624026913571222">ক’ভাৰটো বন্ধ কৰিলে সুপ্ত অৱস্থালৈ নিয়ক</translation> <translation id="1802687198411089702">এই পৃষ্ঠাটোৱে সঁহাৰি জনোৱা নাই। আপুনি পৃষ্ঠাটোৱে সঁহাৰি জনোৱালৈ অপেক্ষা কৰিব পাৰে বা বাহিৰ হ’ব পাৰে।</translation> @@ -2377,7 +2376,6 @@ <translation id="2610374175948698697">আপোনাৰ ডিভাইচত ফাইল বা ফ’ল্ডাৰসমূহ চাব পাৰে</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">আপোনাৰ Microsoft একাউণ্টত ছাইন ইন কৰক আৰু তাৰ পাছত পুনৰ চেষ্টা কৰক</translation> -<translation id="2611702650078660078">কিবা আসোঁৱাহ হ’ল</translation> <translation id="2611776654555141051">আয়তক্ষেত্ৰৰ সঁজুলি</translation> <translation id="2611885296070244383">মাইক (অভ্যন্তৰীণ)</translation> <translation id="2612676031748830579">কার্ড নম্বৰ</translation> @@ -2741,7 +2739,6 @@ <translation id="285033512555869047">বন্ধ আছে</translation> <translation id="2850541429955027218">থীম যোগ কৰক</translation> <translation id="2851291081585704741">আপুনি অফলাইন হৈ আছে</translation> -<translation id="2852045827873867442">ইণ্টাৰনেট সংযোগৰ প্ৰয়োজন।</translation> <translation id="285237063405807022">(ল’ড কৰি থকা হৈছে)</translation> <translation id="2853121255651601031">পাছৱৰ্ড ছেভ কৰা হ’ল</translation> <translation id="2854453262159518435">ইতিমধ্যে থকা টেবৰ গোট সলনি কৰক</translation> @@ -3608,6 +3605,7 @@ <translation id="3473241910002674503">টেবলেট ম’ডত বুটামৰ জৰিয়তে গৃহপৃষ্ঠালৈ নেভিগে’ট কৰক, উভতি যাওক আৰু এপ্সমূহ সলনি কৰক।</translation> <translation id="3473479545200714844">স্ক্ৰীন বিৱৰ্ধক</translation> <translation id="3474218480460386727">নতুন শব্দবোৰৰ বাবে ৯৯ টা অথবা তাতকৈ কম আখৰ ব্যৱহাৰ কৰক</translation> +<translation id="3474330892505468100">Meetৰ সৈতে Google Beam</translation> <translation id="3474624961160222204"><ph name="NAME" /> হিচাপে অব্যাহত ৰাখক</translation> <translation id="3477772589943384839">মধ্যমীয়া মেম’ৰী ৰাহিৰ সুবিধা লাভ কৰক। আপোনাৰ টেৱসমূহ এক দীৰ্ঘ সময়ৰ পাছত নিষ্ক্ৰিয় হৈ পৰিব।</translation> <translation id="347785443197175480"><ph name="HOST" />ক আপোনাৰ কেমেৰা আৰু মাইক্ৰ’ফ’ন এক্সেছ কৰি থাকিবলৈ দিয়ক</translation> @@ -5495,7 +5493,6 @@ <translation id="4779766576531456629">ই-ছিমৰ চেলুলাৰ নেটৱৰ্কৰ নতুন নাম দিয়ক</translation> <translation id="4780321648949301421">এই হিচাপ ছেভ কৰক…</translation> <translation id="4780558987886269159">কৰ্মস্থানৰ বাবে</translation> -<translation id="4781633367688946589">নতুন ছেশ্বনলৈ অব্যাহত ৰাখক</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" />এ আপোনাৰ ডিজিটেল ৱালেটৰ পৰা ব্যক্তিগত তথ্য ব্যৱহাৰ কৰিব বিচাৰে।</translation> <translation id="4785719467058219317">আপুনি ব্যৱহাৰ কৰি থকা সুৰক্ষা চাবিটো এই ৱেবছাইটটোত পঞ্জীকৃত নহয়</translation> <translation id="4785914069240823137">ক্ৰপ কৰাটো বাতিল কৰক</translation> @@ -6284,6 +6281,7 @@ <translation id="5337926771328966926">বৰ্তমানৰ ডিভাইচটোৰ নাম হৈছে <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">আপুনি এখন ইনক’গনিট‘ ৱিণ্ড‘ ব্যৱহাৰ কৰি ব্যক্তিগতভাৱে ব্ৰাউজ কৰিব পাৰে</translation> <translation id="5338503421962489998">স্থানীয় ষ্ট'ৰেজ</translation> +<translation id="5340620183031438925">পৃষ্ঠাখন এৰি নোযোৱাকৈ আপোনাৰ টেবটোৰ বিষয়ে AI ম’ডক সুধিবলৈ, এয়া আপুনিয়েই বুলি সত্যাপন কৰক। আপুনি লগতে আপোনাৰ আটাইবোৰ ডিভাইচত পাছৱৰ্ড আৰু অধিক লাভ কৰিব।</translation> <translation id="5340787663756381836">&বিচাৰক আৰু সম্পাদনা কৰক</translation> <translation id="5340900621595888432">ডায়গন’ষ্টিক আৰু ব্যৱহাৰৰ ডেটা পঠিয়াওক</translation> <translation id="5341793073192892252">তলৰ কুকিসমূহ অৱৰোধ কৰা হৈছিল (কোনো ব্যতিক্ৰম নৰখাকৈ তৃতীয় পক্ষৰ কুকিসমূহ অৱৰোধ কৰা হৈছে)</translation> @@ -7470,7 +7468,6 @@ <translation id="6180550893222597997">আপুনি <ph name="APP_NAME" />ৰ বাবে কোনটো পাছকী ব্যৱহাৰ কৰিব বিচাৰে?</translation> <translation id="6181218116951226898">এপ্সমূহে কেতিয়াবা নিজৰ ব্ৰেণ্ডিং আপডে’ট কৰে। আপডে’ট কৰাৰ পূৰ্বে আপুনি সেইসমূহক লৈ সহজ হোৱাটো নিশ্চিত কৰিবলৈ আটাইবোৰ সালসলনি পৰ্যালোচনা কৰক।</translation> <translation id="6181431612547969857">ডাউনল’ড অৱৰোধ কৰা হৈছে</translation> -<translation id="6182100780603067202">লগতে এপ্লিকেশ্বনৰ অডিঅ’ শ্বেয়াৰ কৰক (ইয়াৰ আটাইবোৰ ৱিণ্ড’ৰ পৰা)</translation> <translation id="6183369864942961155">স্বয়ংক্ৰিয় উজ্জ্বল/গাঢ় ৰঙৰ থীম</translation> <translation id="6183773856988300112">আপোনাৰ টেবসমূহত কাম কৰিবলৈ আৰু আপুনি Geminiক দিয়া কাৰ্যসমূহ সম্পূৰ্ণ কৰিবলৈ Chromeত Geminiএ স্বয়ংক্ৰিয় ব্ৰাউজ ব্যৱহাৰ কৰে। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation> <translation id="6184099524311454384">সন্ধানৰ টেব</translation> @@ -8265,7 +8262,6 @@ <translation id="6754359471209693699">নতুন সন্ধান আৰম্ভ কৰক</translation> <translation id="6754918760968695779">দ্ৰুত অন্তৰ্ভুক্তি</translation> <translation id="6755702685749429945">অভিধান যোগ দিয়ক</translation> -<translation id="6756157672127672536">Files এপ্টোৱে আপুনি Google Drive, বাহ্যিক ষ্ট’ৰেজ অথবা আপোনাৰ ChromeOS ডিভাইচত ছেভ কৰি থোৱা ফাইল দ্ৰুতভাৱে এক্সেছ কৰিবলৈ দিয়ে।</translation> <translation id="6756643207511618722">কথন ইঞ্জিন</translation> <translation id="6757431299485455321">অন্য ডিভাইচক এই হটস্পটটো বিচৰাত সহায় কৰক।</translation> <translation id="6758056191028427665">আমি কেনে প্ৰদৰ্শন কৰিছোঁ আমাক জনাওক৷</translation> @@ -9211,6 +9207,7 @@ <translation id="7406912950279255498">ৰং বিপৰীতকৰণ ম'ড</translation> <translation id="7407430846095439694">আমদানি কৰক আৰু সংযুক্ত কৰক</translation> <translation id="7407504355934009739">অধিকাংশ লোকে এই ছাইটটোৰ জাননীসমূহ অৱৰোধ কৰে</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" />ত সংবেদনশীল ডেটা আছে। আপোনাৰ প্ৰতিষ্ঠানে আপোনাক এইটো ক্লাউড ষ্ট’ৰেজত ছেভ কৰিবলৈ বা এইটো প্ৰত্যাখ্যান কৰিবলৈ দিব</translation> <translation id="7408080603962564527">এইটো অন্যৰ বাবে দৃশ্যমান হ’ব</translation> <translation id="740810853557944681">এটা প্ৰিণ্ট ছার্ভাৰ যোগ দিয়ক</translation> <translation id="7409549334477097887">অতিৰিক্তভাৱে ডাঙৰ</translation> @@ -9264,6 +9261,7 @@ <translation id="7434969625063495310">প্ৰিণ্ট ছার্ভাৰটো যোগ দিব পৰা নগ’ল। অনুগ্ৰহ কৰি ছার্ভাৰটোৰ কনফিগাৰেশ্বন পৰীক্ষা কৰক আৰু পুনৰ চেষ্টা কৰক।</translation> <translation id="7436921188514130341">আমি দুঃখিত! পূৰ্বৰ নাম সলাই নতুন নাম দি থাকোঁতে কিবা আসোঁৱাহ হ'ল।</translation> <translation id="7439519621174723623">অব্যাহত ৰাখিবলৈ ডিভাইচৰ নাম যোগ দিয়ক</translation> +<translation id="743982235360757672">আপুনি ব্ৰাউজ কৰি থাকোঁতে AI ম’ডটো ওচৰত ৰাখক</translation> <translation id="7441736532026945583">আপোনাৰ টেবৰ ষ্ট্ৰিপৰ পৰা গোটটো আঁতৰাবলৈ "গোট লুকুৱাওক" বাছনি কৰক</translation> <translation id="7441736921018636843">এই ছেটিং সলনি কৰিবলৈ, ছিংক পাছফ্ৰেজ আঁতৰবলৈ <ph name="BEGIN_LINK" />ছিংক ৰিছেট কৰক<ph name="END_LINK" /></translation> <translation id="7441830548568730290">অন্য ব্যৱহাৰকাৰী</translation> @@ -10002,7 +10000,6 @@ <translation id="794676567536738329">অনুমতি নিশ্চিত কৰক</translation> <translation id="7947962633355574091">ভিডিঅ’ৰ ঠিকনা ক&পি কৰক</translation> <translation id="7947964080535614577">ছাইটসমূহে সচৰাচৰ বিজ্ঞাপন দেখুৱায় গতিকে সেইসমূহে মাচুল অবিহনে সমল আৰু সেৱা প্ৰদান কৰিব পাৰে। কিন্তু, কিছুমান ছাইট অননুমোদিত অথবা বিভ্ৰান্তিকৰ বিজ্ঞাপন দেখুওৱাৰ বাবে জনাজাত।</translation> -<translation id="7948239795436419268">ৱিণ্ড’ পুনঃস্থাপন নকৰিব</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" />ৰ আটাইবোৰ পৃষ্ঠা</translation> <translation id="7950629216186736592">কাৰণ: LBSএ কেৱল http://, https:// আৰু file:// URL সমৰ্থন কৰে।</translation> <translation id="7950814699499457511">অন • এই এক্সটেনশ্বনে গোপনীয়তাৰ ব্যৱস্থাসমূহ প্ৰকাশ কৰা নাই, যেনে ই কেনেকৈ ডেটা সংগ্ৰহ আৰু ব্যৱহাৰ কৰে</translation> @@ -11191,7 +11188,6 @@ <translation id="8751034568832412184">বিদ্যালয়</translation> <translation id="8751329102746373229">আপোনাৰ প্ৰশাসকৰ পৰা</translation> <translation id="8752451679755290210">বস্তুসমূহৰ মাজত স্বয়ংক্ৰিয়ভাৱে ইফাল সিফাল কৰক</translation> -<translation id="8753948258138515839">Files এপ্টোৱে আপুনি Google Drive, বাহ্যিক ষ্ট’ৰেজ অথবা আপোনাৰ ChromeOS Flex ডিভাইচত ছেভ কৰি থোৱা ফাইল দ্ৰুতভাৱে এক্সেছ কৰিবলৈ দিয়ে।</translation> <translation id="8754200782896249056"><p><ph name="PRODUCT_NAME" />ক কোনো সমৰ্থিত ডেস্কটপৰ পৰিবেষ্টনিত চলালে ছিষ্টেম প্ৰক্সিৰ ছেটিংসমূহ ব্যৱহাৰ কৰা হ’ব। যিয়েই কি নহওক, হয় আপোনাৰ ছিষ্টেমটো সমর্থন নকৰে, নহয় আপোনাৰ ছিষ্টেমৰ কনফিগাৰেশ্বন লঞ্চ কৰোঁতে কিবা সমস্যা হৈছে।</p> <p>কিন্তু তথাপিও আপুনি কামাণ্ড লাইনৰ জৰিয়তে কনফিগাৰ কৰিব পাৰে। পতাকা আৰু পৰিবেষ্টনিৰ লগত জড়িত চলকৰ বিষয়ে অধিক তথ্য পাবলৈ অনুগ্ৰহ কৰি <code>man <ph name="PRODUCT_BINARY_NAME" /></code> চাওক।</p></translation> @@ -11985,6 +11981,7 @@ <translation id="992778845837390402">বর্তমান Linuxৰ বেকআপ প্ৰক্ৰিয়া চলি আছে</translation> <translation id="994087375490600917">ছাইডৰ পেনেল</translation> <translation id="994289308992179865">&লুপ কৰক</translation> +<translation id="995420352808264005">ডিভাইচ পঞ্জীয়নৰ প্ৰকাৰ বাছনি কৰক</translation> <translation id="995755448277384931">IBANটো যোগ দিয়ক</translation> <translation id="996250603853062861">সুৰক্ষিত সংযোগ স্থাপন কৰি থকা হৈছে...</translation> <translation id="997143476478634194">আপুনি কোনো ছাইট খুলিলে সেইটোৱে এই ছেটিংটো স্বয়ংক্ৰিয়ভাৱে মানি চলে। ছাইটসমূহে সাধাৰণতে আপোনাক শেহতীয়া প্ৰধান বাতৰি অথবা চাট বাৰ্তাৰ বিষয়ে জনাবলৈ জাননী পঠিয়ায়।</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index 75dccc7..28fa9d9 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Əsas düyün annotasiya fayllarını endirmək mümkün deyil. Sonra cəhd edin.</translation> <translation id="1103523840287552314">Həmişə <ph name="LANGUAGE" /> dilinə tərcümə edin</translation> <translation id="1104098698795583187">Bu tab qrupuna girişi dərhal itirəcəksiniz və o, bütün cihazlarınızdan silinəcək</translation> +<translation id="1105934302947321130">Zoom ilə Google Beam</translation> <translation id="1106270460549661906">Gemini ilə paylaşımı ləğv edin</translation> <translation id="1106350001632362876">Həddi artırın</translation> <translation id="110850812463801904">OneDrive-a manual qoşulun</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Təhlükəsizlik açarınız PIN ilə qorunmur. Giriş datasını idarə etmək üçün əvvəlcə PIN yaradın.</translation> <translation id="1179400851034021914">IBAN yanlışdır</translation> <translation id="1179902906564467236">Telefondakı təlimatlara əməl edin, yaxud kamera tətbiqindən istifadə edin</translation> -<translation id="1180117276105724040">Əvvəlki sessiyanızdan pəncərələr bərpa edilir...</translation> <translation id="118057123461613219">Çox böyük qənaət</translation> <translation id="1181037720776840403">Silin</translation> <translation id="1182876754474670069">home</translation> @@ -761,7 +761,6 @@ <translation id="151501797353681931">Safaridən import edildi</translation> <translation id="1515163294334130951">İşə salın</translation> <translation id="1517467582299994451">Kodla yayımlamaq üçün Chrome brauzer sinxronizasiya ayarlarını aktiv edin</translation> -<translation id="1519090060276706457">Pəncərələrin bərpası gözləniləndən çox vaxt aparır</translation> <translation id="1521442365706402292">Sertifikatları idarə edin</translation> <translation id="1521655867290435174">Google Cədvəl</translation> <translation id="1521774566618522728">Bu gün aktivdir</translation> @@ -1102,6 +1101,7 @@ <translation id="1745732479023874451">Kontaktları idarə edin</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{Bu veb tətbiqdə # fayl açılsın və redaktə edilsin?}}</translation> <translation id="1748563609363301860">Bu parolu Google Hesabınızda və ya yalnız bu cihazda saxlaya bilərsiniz</translation> +<translation id="1749645492410897998">Proqram təminatı quraşdırılır</translation> <translation id="1749733017156547309">Parol tələb olunur</translation> <translation id="1750172676754093297">Təhlükəsizlik açarında saxlanılan barmaq izi yoxdur</translation> <translation id="1750238553597293878">Google Hesabında parollardan istifadəyə davam edin</translation> @@ -1173,7 +1173,6 @@ <translation id="1796460466266263589">Gemini-dan istifadə etməyə davam etmək üçün kimliyinizi doğrulayın</translation> <translation id="1796588414813960292">Səs tələb edən funksiyalar işləməyəcək</translation> <translation id="1798726622311813209">Kredit və debet kartları</translation> -<translation id="1799852120691957794">Əvvəlki sessiyanızdan pəncərələri bərpa etmək olmur</translation> <translation id="180203835522132923">Axtarış + O, sonra W</translation> <translation id="1802624026913571222">Qapaq bağlandıqda yuxu rejiminə keçsin</translation> <translation id="1802687198411089702">Səhifəyə daxil olmaq alınmadı. Gözləyin və ya çıxın.</translation> @@ -2369,7 +2368,6 @@ <translation id="2610374175948698697">Cihazda fayl və ya qovluqlara baxa bilər</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">Microsoft hesabına daxil olub, yenidən cəhd edin</translation> -<translation id="2611702650078660078">Xəta baş verdi</translation> <translation id="2611776654555141051">Düzbucaqlı Aləti</translation> <translation id="2611885296070244383">Mikrofon (daxili)</translation> <translation id="2612676031748830579">Kart nömrəsi</translation> @@ -2733,7 +2731,6 @@ <translation id="285033512555869047">Bağlıdır</translation> <translation id="2850541429955027218">Tema əlavə edin</translation> <translation id="2851291081585704741">Oflaynsınız</translation> -<translation id="2852045827873867442">İnternet bağlantısı tələb olunur.</translation> <translation id="285237063405807022">(yüklənir)</translation> <translation id="2853121255651601031">Parol Yadda Saxlandı</translation> <translation id="2854453262159518435">Mövcud tab qrupunu əvəz edin</translation> @@ -3600,6 +3597,7 @@ <translation id="3473241910002674503">Planşet rejimindəki düymələrlə əsas səhifəyə, geri keçin və tətbiqləri dəyişdirin.</translation> <translation id="3473479545200714844">Ekran böyüdücü</translation> <translation id="3474218480460386727">Yeni sözlər üçün 99 və ya daha az hərfdən istifadə edin</translation> +<translation id="3474330892505468100">Meet ilə Google Beam</translation> <translation id="3474624961160222204"><ph name="NAME" /> olaraq davam edin</translation> <translation id="3477772589943384839">Yaddaşa orta səviyyədə qənaət edin. Tablar uzun müddətdən sonra qeyri-aktiv olur.</translation> <translation id="347785443197175480"><ph name="HOST" /> hostuna kameranıza və mikrofonunuza giriş verirsiniz</translation> @@ -5486,7 +5484,6 @@ <translation id="4779766576531456629">eSIM Mobil şəbəkəsinin adını dəyişin</translation> <translation id="4780321648949301421">Səhifəni yadda saxlama formatı:</translation> <translation id="4780558987886269159">İş üçün</translation> -<translation id="4781633367688946589">Yeni sessiyaya davam edin</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> rəqəmsal pulqabınızdakı şəxsi məlumatlardan istifadə etmək istəyir.</translation> <translation id="4785719467058219317">Bu veb saytda qeydiyyatda olmayan təhlükəsizlik açarından istifadə edirsiniz</translation> <translation id="4785914069240823137">Kəsilməni ləğv edin</translation> @@ -6275,6 +6272,7 @@ <translation id="5337926771328966926">Cari cihaz adı: <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Anonim pəncərə ilə məxfi axtarış edə bilərsiniz</translation> <translation id="5338503421962489998">Yerli saxlama yaddaşı</translation> +<translation id="5340620183031438925">Səhifədən çıxmadan Sİ rejimindən tab haqqında soruşmaq üçün kimliyinizi doğrulayın. Bütün cihazlarınızda parollarınızı və daha çoxunu da əldə edəcəksiniz.</translation> <translation id="5340787663756381836">&Tapın və redaktə edin</translation> <translation id="5340900621595888432">Diaqnostika və istifadə datasını göndərin</translation> <translation id="5341793073192892252">Aşağıdakı kukilər blok edilib (üçüncü tərəf kukiləri istisna olmadan bloklanır)</translation> @@ -7459,7 +7457,6 @@ <translation id="6180550893222597997"><ph name="APP_NAME" /> üçün hansı giriş açarından istifadə etmək istəyirsiniz?</translation> <translation id="6181218116951226898">Tətbiqlər bəzən öz brendini yeniləyir. Yeniləməzdən əvvəl bütün dəyişiklikləri nəzərdən keçirin və onlarla razı olduğunuza əmin olun.</translation> <translation id="6181431612547969857">Endirmə bloklandı</translation> -<translation id="6182100780603067202">Tətbiq audiosunu da paylaşın (bütün pəncərələrdən)</translation> <translation id="6183369864942961155">Avtomatik işıqlı/tünd tema</translation> <translation id="6183773856988300112">Chrome-da Gemini tablarınızda işləmək və ona verdiyiniz tapşırıqları yerinə yetirmək üçün avtomatik axtarışdan istifadə edir. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Tabları axtarın</translation> @@ -8252,7 +8249,6 @@ <translation id="6754359471209693699">Yeni axtarışa başlayın</translation> <translation id="6754918760968695779">Cəld giriş</translation> <translation id="6755702685749429945">Lüğət əlavə edin</translation> -<translation id="6756157672127672536">Fayllar tətbiqi Google Disk, xarici yaddaş və ya ChromeOS cihazınızda saxladığınız fayllara sürətli giriş təmin edir.</translation> <translation id="6756643207511618722">Nitq sistemləri</translation> <translation id="6757431299485455321">Digər cihazlara bu hotspotu tapmağa kömək edin.</translation> <translation id="6758056191028427665">Necə işlədiyimizi bizə bildirin.</translation> @@ -9198,6 +9194,7 @@ <translation id="7406912950279255498">Rəng inversiyası rejimi</translation> <translation id="7407430846095439694">İmport edin və qoşun</translation> <translation id="7407504355934009739">Bir çox insan bu saytdan gələn bildirişləri bloklayır</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> həssas dataya malikdir. Təşkilatınız onu bulud yaddaşında yadda saxlamağınıza və ya imtina etməyinizə icazə verir</translation> <translation id="7408080603962564527">Bu, başqalarına görünəcək</translation> <translation id="740810853557944681">Çap serveri əlavə edin</translation> <translation id="7409549334477097887">Çox böyük</translation> @@ -9251,6 +9248,7 @@ <translation id="7434969625063495310">Çap serverini əlavə etmək mümkün olmadı. Serverin konfiqurasiyasını yoxlayın və yenidən cəhd edin.</translation> <translation id="7436921188514130341">Yenidən adlandırarkən xəta baş verdi.</translation> <translation id="7439519621174723623">Davam etmək üçün cihaz adı əlavə edin</translation> +<translation id="743982235360757672">Axtarış edərkən Sİ rejimini yaxınlıqda saxlayın</translation> <translation id="7441736532026945583">Qrupu tab zolağından silmək üçün "Qrupu gizlədin" seçin</translation> <translation id="7441736921018636843">Bu ayarı dəyişmək və sinxronizasiya parolunu silmək üçün <ph name="BEGIN_LINK" />sinxronizasiyanı sıfırlayın<ph name="END_LINK" /></translation> <translation id="7441830548568730290">Digər istifadəçilər</translation> @@ -9989,7 +9987,6 @@ <translation id="794676567536738329">İcazələri təsdiq edin</translation> <translation id="7947962633355574091">Video ünvanını kopyalayın</translation> <translation id="7947964080535614577">Saytlar adətən ödənişsiz məzmun və xidmətlər təklif etmək üçün reklamlar göstərir. Lakin bəzi saytlar müdaxilə edən və aldadıcı reklamlar göstərmələri ilə tanınır.</translation> -<translation id="7948239795436419268">Pəncərələri bərpa etməyin</translation> <translation id="7948407723851303488">Bütün <ph name="DOMAIN_NAME" /> səhifələri</translation> <translation id="7950629216186736592">Səbəb: LBS yalnız http://, https:// və file:// URL-lərini dəstəkləyir.</translation> <translation id="7950814699499457511">Yanılı • Bu artırma datanın toplanma və istifadə qaydası kimi məxfilik təcrübələrini dərc etməyib</translation> @@ -11178,7 +11175,6 @@ <translation id="8751034568832412184">Məktəb</translation> <translation id="8751329102746373229">Administratorunuzdan</translation> <translation id="8752451679755290210">Avtomatik olaraq elementlər arasında keçid edin</translation> -<translation id="8753948258138515839">Fayllar tətbiqi Google Disk, xarici yaddaş və ya ChromeOS Flex cihazınızda saxladığınız fayllara sürətli giriş təmin edir.</translation> <translation id="8754200782896249056"><p><ph name="PRODUCT_NAME" /> məhsulunu dəstəklənən masaüstündə işlədəndə, sistemin proksi məlumatları istifadə olunacaq. Belə ki, sisteminiz dəstəklənmir və ya sistem konfiqurasiyanızı başladarkən problem oldub.</p> <p>Amma əmr sətri vasitəsilə konfiqurasiya edə bilərsiniz. bayraqlar və fəqrlər haqqında əlavə məlumat üçün <code>man <ph name="PRODUCT_BINARY_NAME" /></code> baxın.</p></translation> <translation id="8755175579224030324">Təşkilatınız üçün cihazınızda saxlanan sertifikat və açarların idarə olunması kimi təhlükəsizlik tapşırıqlarını icra edin</translation> <translation id="875532100880844232"><ph name="DEVICE_NAME" /> üçün hər düymə üzrə əməliyyat seçin</translation> @@ -11969,6 +11965,7 @@ <translation id="992778845837390402">Linux hazırda yedəklənir</translation> <translation id="994087375490600917">Yan panellər</translation> <translation id="994289308992179865">&Dövr</translation> +<translation id="995420352808264005">Cihazın qeydiyyat növünü seçin</translation> <translation id="995755448277384931">IBAN əlavə edin</translation> <translation id="996250603853062861">Güvənli bağlantı qurulur...</translation> <translation id="997143476478634194">Saytları ziyarət etdikdə onlar avtomatik bu ayarı izləyir. Saytlar adətən önəmli xəbərlər və ya söhbət mesajları barədə sizə bildirmək bildirişlər göndərir.</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index 7320b25e..83771d5 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Не ўдаецца спампаваць файлы з анатацыямі галоўнага вузла. Паўтарыце спробу пазней.</translation> <translation id="1103523840287552314">Заўсёды перакладаць з мовы: <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Вы адразу страціце доступ да гэтай групы ўкладак, і яна будзе выдалена з усіх вашых прылад</translation> +<translation id="1105934302947321130">Google Beam з Zoom</translation> <translation id="1106270460549661906">Спыніць абагульванне з Gemini</translation> <translation id="1106350001632362876">Павялічыць парог</translation> <translation id="110850812463801904">Падключыцца да OneDrive уручную</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Ключ бяспекі не абаронены PIN-кодам. Каб кіраваць данымі для ўваходу, спачатку стварыце PIN-код.</translation> <translation id="1179400851034021914">Нумар IBAN несапраўдны</translation> <translation id="1179902906564467236">Выканайце інструкцыі на тэлефоне або выкарыстайце праграму камеры.</translation> -<translation id="1180117276105724040">Ідзе аднаўленне акон з папярэдняга сеанса…</translation> <translation id="118057123461613219">Вялізная эканомія</translation> <translation id="1181037720776840403">Выдаліць</translation> <translation id="1182876754474670069">Home</translation> @@ -764,7 +764,6 @@ <translation id="151501797353681931">Імпартаваныя з Safari</translation> <translation id="1515163294334130951">Запусціць</translation> <translation id="1517467582299994451">Каб трансляцыю можна было запускаць з дапамогай кода, уключыце сінхранізацыю ў браўзеры Chrome</translation> -<translation id="1519090060276706457">Аднаўленне акон займае больш часу, чым чакалася</translation> <translation id="1521442365706402292">Кіраваць сертыфікатамі</translation> <translation id="1521655867290435174">Табліцы Google</translation> <translation id="1521774566618522728">Апошнія дзеянні адбываліся сёння</translation> @@ -1105,6 +1104,7 @@ <translation id="1745732479023874451">Кіраваць кантактамі</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}one{Адкрыць і змяніць у гэтай вэб-праграме # файл?}few{Адкрыць і змяніць у гэтай вэб-праграме # файлы?}many{Адкрыць і змяніць у гэтай вэб-праграме # файлаў?}other{Адкрыць і змяніць у гэтай вэб-праграме # файла?}}</translation> <translation id="1748563609363301860">Вы можаце захаваць пароль ва Уліковым запісе Google або толькі на гэтай прыладзе</translation> +<translation id="1749645492410897998">Усталёўваецца праграмнае забеспячэнне</translation> <translation id="1749733017156547309">Неабходна ўказаць пароль</translation> <translation id="1750172676754093297">Не ўдалося захаваць адбіткі пальцаў на вашым ключы бяспекі</translation> <translation id="1750238553597293878">Працягвайце выкарыстоўваць паролі ва Уліковым запісе Google</translation> @@ -1176,7 +1176,6 @@ <translation id="1796460466266263589">Каб выкарыстоўваць Gemini, пацвердзіце сваю асобу</translation> <translation id="1796588414813960292">Функцыі, для якіх патрэбны гук, не будуць працаваць</translation> <translation id="1798726622311813209">Крэдытныя і дэбетовыя карткі</translation> -<translation id="1799852120691957794">Не ўдалося аднавіць вокны з папярэдняга сеанса</translation> <translation id="180203835522132923">Пошук + O, затым W</translation> <translation id="1802624026913571222">Пры закрыцці вечка пераводзіць прыладу ў рэжым сну</translation> <translation id="1802687198411089702">Старонка не адказвае. Можна пачакаць або закрыць яе.</translation> @@ -2366,7 +2365,6 @@ <translation id="2610374175948698697">Файлы, якім дазволена праглядаць файлы і папкі на прыладзе</translation> <translation id="2610780100389066815">Падпісванне даверанага спіса Microsoft</translation> <translation id="261114180663074524">Увайдзіце ва ўліковы запіс Microsoft і паўтарыце спробу</translation> -<translation id="2611702650078660078">Адбылася памылка</translation> <translation id="2611776654555141051">Інструмент "Прамавугольнік"</translation> <translation id="2611885296070244383">Мікрафон (унутраны)</translation> <translation id="2612676031748830579">Нумар карткі</translation> @@ -2730,7 +2728,6 @@ <translation id="285033512555869047">Закрытая</translation> <translation id="2850541429955027218">Дадаць тэму</translation> <translation id="2851291081585704741">Вы па-за сеткай</translation> -<translation id="2852045827873867442">Патрабуецца падключэнне да інтэрнэту.</translation> <translation id="285237063405807022">(загружаецца)</translation> <translation id="2853121255651601031">Пароль захаваны</translation> <translation id="2854453262159518435">Замяніць існуючую групу ўкладак</translation> @@ -3597,6 +3594,7 @@ <translation id="3473241910002674503">Пераход на Панэль запуску, вяртанне назад і пераключэнне праграм кнопкамі ў планшэтным рэжыме.</translation> <translation id="3473479545200714844">Экранная лупа</translation> <translation id="3474218480460386727">Новыя словы павінны складацца з не больш чым 99 літар</translation> +<translation id="3474330892505468100">Google Beam з Meet</translation> <translation id="3474624961160222204">Працягнуць як <ph name="NAME" /></translation> <translation id="3477772589943384839">Умераная эканомія памяці. Укладкі становяцца неактыўнымі праз даўжэйшы перыяд часу.</translation> <translation id="347785443197175480">І далей даваць <ph name="HOST" /> доступ да камеры і мікрафона</translation> @@ -5483,7 +5481,6 @@ <translation id="4779766576531456629">Перайменаваць сотавую сетку eSIM-карты</translation> <translation id="4780321648949301421">Захаваць старонку як...</translation> <translation id="4780558987886269159">Для працы</translation> -<translation id="4781633367688946589">Перайсці да новага сеанса</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> запытвае магчымасць выкарыстоўваць вашу асабістую інфармацыю з лічбавага кашалька.</translation> <translation id="4785719467058219317">Вы выкарыстоўваеце ключ бяспекі, не зарэгістраваны на гэтым вэб-сайце</translation> <translation id="4785914069240823137">Скасаваць абрэзку</translation> @@ -6271,6 +6268,7 @@ <translation id="5337926771328966926">Бягучая назва прылады – <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Прыватны прагляд вэб-старонак магчымы ў акне ў рэжыме інкогніта</translation> <translation id="5338503421962489998">Лакальнае сховішча</translation> +<translation id="5340620183031438925">Каб задаць пытанне пра ўкладку ў рэжыме AI, не пакідаючы старонку, пацвердзіце сваю асобу. Таксама вы атрымаеце доступ да сваіх пароляў і іншых даных на ўсіх сваіх прыладах.</translation> <translation id="5340787663756381836">&Знайсці і змяніць</translation> <translation id="5340900621595888432">Адпраўка даных пра выкарыстанне і дыягностыку</translation> <translation id="5341793073192892252">Наступныя файлы cookie былі заблакіраваны (староннія файлы cookie блакіруюцца без выключэнняў)</translation> @@ -7457,7 +7455,6 @@ <translation id="6180550893222597997">Які ключ доступу вы хочаце выкарыстаць для <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Брэндынг праграм час ад часу змяняецца. Перш чым абнаўляць праграму, пераканайцеся, што ўнесеныя ў яе змяненні вас задавольваюць.</translation> <translation id="6181431612547969857">Спампоўванне заблакіравана</translation> -<translation id="6182100780603067202">Таксама абагульваць аўдыя з праграмы (з усіх яе вокнаў)</translation> <translation id="6183369864942961155">Аўтаматычнае ўключэнне светлай/цёмнай тэмы</translation> <translation id="6183773856988300112">Gemini ў Chrome выкарыстоўвае функцыю аўтаматычнага прагляду, каб працаваць ва ўкладках і выконваць задачы, атрыманыя ад вас. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Пошук укладак</translation> @@ -8256,7 +8253,6 @@ <translation id="6754359471209693699">Пачаць новы пошук</translation> <translation id="6754918760968695779">Хуткая ўстаўка</translation> <translation id="6755702685749429945">Дадаць слоўнік</translation> -<translation id="6756157672127672536">Праграма "Файлы" дазваляе хутка адкрываць файлы, захаваныя на Google Дыску, знешніх сховішчах і прыладах Chrome OS.</translation> <translation id="6756643207511618722">Модулі маўлення</translation> <translation id="6757431299485455321">Дапамагаць іншым прыладам знаходзіць гэты хот-спот.</translation> <translation id="6758056191028427665">Паведаміце нам, што вы думаеце пра наш прадукт.</translation> @@ -9202,6 +9198,7 @@ <translation id="7406912950279255498">Рэжым інверсіі колераў</translation> <translation id="7407430846095439694">Імпартаваць і звязаць</translation> <translation id="7407504355934009739">Большасць карыстальнікаў блакіруюць апавяшчэнні з гэтага сайта</translation> +<translation id="7407578029724074226">Файл "<ph name="FILE_NAME" />" змяшчае канфідэнцыяльныя даныя. Ваша арганізацыя дазволіць вам захаваць гэты файл у воблачным сховішчы або адхіліць яго.</translation> <translation id="7408080603962564527">Гэту назву будуць бачыць іншыя карыстальнікі</translation> <translation id="740810853557944681">Дадаванне сервера друку</translation> <translation id="7409549334477097887">Вельмі вялікі</translation> @@ -9255,6 +9252,7 @@ <translation id="7434969625063495310">Не ўдалося дадаць сервер друку. Праверце канфігурацыю сервера і паўтарыце спробу.</translation> <translation id="7436921188514130341">На жаль, падчас перайменавання адбылася памылка.</translation> <translation id="7439519621174723623">Каб працягнуць, дадайце назву прылады</translation> +<translation id="743982235360757672">Зручны доступ да рэжыму AI пры праглядзе вэб-старонак</translation> <translation id="7441736532026945583">Каб прыбраць групу з панэлі ўкладак, выберыце "Схаваць групу"</translation> <translation id="7441736921018636843">Для змянення гэтай налады <ph name="BEGIN_LINK" />скіньце сінхранізацыю<ph name="END_LINK" />, каб выдаліць фразу-пароль сінхранізацыі</translation> <translation id="7441830548568730290">Іншыя карыстальнікі</translation> @@ -9993,7 +9991,6 @@ <translation id="794676567536738329">Пацвярджэнне дазволаў</translation> <translation id="7947962633355574091">К&апіраваць адрас відэа</translation> <translation id="7947964080535614577">Сайты звычайна паказваюць рэкламу, каб мець магчымасць прапаноўваць змесціва або паслугі бясплатна. Аднак некаторыя сайты паказваюць назойлівую рэкламу або рэкламу, якая ўводзіць у зман.</translation> -<translation id="7948239795436419268">Не аднаўляць вокны</translation> <translation id="7948407723851303488">Усе старонкі дамена <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Прычына: функцыя "Падтрымка браўзераў ранейшых версій" дазваляе выкарыстоўваць толькі URL-адрасы з пратаколамі http://, https:// і file://.</translation> <translation id="7950814699499457511">Уключана • Для гэтага пашырэння не апублікаваны меры забеспячэння прыватнасці, напрыклад звесткі пра тое, як яно збірае і выкарыстоўвае даныя</translation> @@ -11182,7 +11179,6 @@ <translation id="8751034568832412184">Навучальная ўстанова</translation> <translation id="8751329102746373229">Ад адміністратара</translation> <translation id="8752451679755290210">Аўтаматычнае перамяшчэнне паміж элементамі</translation> -<translation id="8753948258138515839">Праграма "Файлы" дазваляе хутка адкрываць файлы, захаваныя на Google Дыску, знешніх сховішчах і прыладах з Chrome OS Flex.</translation> <translation id="8754200782896249056"><p>Калі <ph name="PRODUCT_NAME" /> працуе ў камп’ютарным асяроддзі, якое падтрымліваецца, выкарыстоўваюцца сістэмныя налады проксі-сервера. Але або ваша сістэма не падтрымліваецца, або пры запуску сістэмнай канфігурацыі адбылася памылка.</p> <p>Аднак вы па-ранейшаму можаце наладжваць проксі-сервер праз камандны радок. Падрабязней пра параметры і пераменныя асяроддзя глядзіце <code>man <ph name="PRODUCT_BINARY_NAME" /></code>.</p></translation> @@ -11975,6 +11971,7 @@ <translation id="992778845837390402">Ідзе рэзервовае капіраванне кантэйнера Linux</translation> <translation id="994087375490600917">Бакавыя панэлі</translation> <translation id="994289308992179865">&Зацыкліць</translation> +<translation id="995420352808264005">Выберыце тып рэгістрацыі прылады</translation> <translation id="995755448277384931">Дадаванне нумара IBAN</translation> <translation id="996250603853062861">Устанаўленне бяспечнага падключэння...</translation> <translation id="997143476478634194">Пры наведванні сайтаў яны будуць аўтаматычна ўлічваць гэту наладу. Звычайна сайты адпраўляюць апавяшчэнні, каб паведаміць вам пра экстранныя навіны або новыя паведамленні ў чаце.</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index f1aa57ab..cdabe69 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Файловете с пояснения за основния възел не могат да се изтеглят. Опитайте отново по-късно.</translation> <translation id="1103523840287552314">Винаги да се превежда от <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Незабавно ще загубите достъп до групата раздели и тя ще бъде изтрита от всичките ви устройства</translation> +<translation id="1105934302947321130">Google Beam със Zoom</translation> <translation id="1106270460549661906">Отмяна на споделянето с Gemini</translation> <translation id="1106350001632362876">Увеличаване на прага</translation> <translation id="110850812463801904">Ръчно свързване с OneDrive</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Ключът ви за сигурност не е защитен с ПИН. За да управлявате данни за вход, първо създайте ПИН.</translation> <translation id="1179400851034021914">IBAN е невалиден</translation> <translation id="1179902906564467236">Изпълнете инструкциите на телефона си или използвайте приложението за камера</translation> -<translation id="1180117276105724040">Прозорците от предходната ви сесия се възстановяват...</translation> <translation id="118057123461613219">Много голяма икономия</translation> <translation id="1181037720776840403">Премахване</translation> <translation id="1182876754474670069">home</translation> @@ -759,7 +759,6 @@ <translation id="151501797353681931">Импортирани от Safari</translation> <translation id="1515163294334130951">Стартиране</translation> <translation id="1517467582299994451">За да предавате посредством код, включете настройките за синхронизиране на браузъра Chrome</translation> -<translation id="1519090060276706457">Възстановяването на прозорците отнема повече време от очакваното</translation> <translation id="1521442365706402292">Управление на сертификати</translation> <translation id="1521655867290435174">Google Таблици</translation> <translation id="1521774566618522728">Активно днес</translation> @@ -1107,6 +1106,7 @@ <translation id="1745732479023874451">Управление на контактите</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{Искате ли да отворите и редактирате # файла в това уеб приложение?}}</translation> <translation id="1748563609363301860">Можете да запазите тази парола в профила си в Google или само на това устройство</translation> +<translation id="1749645492410897998">Софтуерът се инсталира</translation> <translation id="1749733017156547309">Изисква се парола</translation> <translation id="1750172676754093297">В ключа ви за сигурност не могат да се съхраняват отпечатъци</translation> <translation id="1750238553597293878">Продължете да използвате паролите в профила си в Google</translation> @@ -1178,7 +1178,6 @@ <translation id="1796460466266263589">За да продължите да използвате Gemini, потвърдете, че сте вие</translation> <translation id="1796588414813960292">Функциите, за които е нужен звук, няма да работят</translation> <translation id="1798726622311813209">Кредитни и дебитни карти</translation> -<translation id="1799852120691957794">Прозорците от предходната ви сесия не могат да бъдат възстановени</translation> <translation id="180203835522132923">Клавиш „търсене“ + O, след това W</translation> <translation id="1802624026913571222">Преминаване в спящ режим при затваряне на капака</translation> <translation id="1802687198411089702">Страницата не реагира. Можете да изчакате или да я затворите.</translation> @@ -2375,7 +2374,6 @@ <translation id="2610374175948698697">Може да преглежда файловете и папките на устройството ви</translation> <translation id="2610780100389066815">Подписване от Microsoft на списък с гаранти на сертификати</translation> <translation id="261114180663074524">Влезте в профила си в Microsoft и опитайте отново</translation> -<translation id="2611702650078660078">Възникна грешка</translation> <translation id="2611776654555141051">Инструмент за правоъгълник</translation> <translation id="2611885296070244383">Микрофон (вътрешен)</translation> <translation id="2612676031748830579">Номер на картата</translation> @@ -2739,7 +2737,6 @@ <translation id="285033512555869047">Затворено</translation> <translation id="2850541429955027218">Добавяне на темата</translation> <translation id="2851291081585704741">Офлайн сте</translation> -<translation id="2852045827873867442">Изисква се връзка с интернет.</translation> <translation id="285237063405807022">(зарежда се)</translation> <translation id="2853121255651601031">Паролата е запазена</translation> <translation id="2854453262159518435">Замяна на съществуващата група раздели</translation> @@ -3606,6 +3603,7 @@ <translation id="3473241910002674503">Преминавайте към началния екран, връщайте се и превключвайте между приложенията чрез бутони, когато сте в режим на таблет.</translation> <translation id="3473479545200714844">Екранна лупа</translation> <translation id="3474218480460386727">Използвайте до 99 букви за новите думи</translation> +<translation id="3474330892505468100">Google Beam с Meet</translation> <translation id="3474624961160222204">Продължаване като <ph name="NAME" /></translation> <translation id="3477772589943384839">Възползвайте се от средна икономия на памет. Разделите ви стават неактивни след по-дълъг период от време.</translation> <translation id="347785443197175480">Достъпът на <ph name="HOST" /> до камерата и микрофона ви да продължава да е разрешен</translation> @@ -5495,7 +5493,6 @@ <translation id="4779766576531456629">Преименуване на мобилната мрежа за електронната SIM карта</translation> <translation id="4780321648949301421">Запазване на страницата като...</translation> <translation id="4780558987886269159">За работа</translation> -<translation id="4781633367688946589">Продължаване към нова сесия</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> иска да използва лична информация от дигиталния ви портфейл.</translation> <translation id="4785719467058219317">Използвате ключ за сигурност, който не е регистриран в този уебсайт</translation> <translation id="4785914069240823137">Отказ от подрязването</translation> @@ -6284,6 +6281,7 @@ <translation id="5337926771328966926">Настоящото име на устройството е <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Можете да сърфирате частно посредством прозорец в режим „инкогнито“</translation> <translation id="5338503421962489998">Локално хранилище</translation> +<translation id="5340620183031438925">За да попитате режима с AI за раздела си, без да напускате страницата, потвърдете самоличността си. Също така ще получите паролите си и др. на всичките си устройства.</translation> <translation id="5340787663756381836">&Намиране и редактиране</translation> <translation id="5340900621595888432">Изпращане на диагностична информация и данни за използването</translation> <translation id="5341793073192892252">Следните „бисквитки“ бяха блокирани („бисквитките“ на трети страни се блокират без изключение)</translation> @@ -7471,7 +7469,6 @@ <translation id="6180550893222597997">Кой код за достъп искате да използвате за <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Понякога приложенията актуализират марката си. Прегледайте всички промени, за да се уверите, че ви удовлетворяват, преди да актуализирате.</translation> <translation id="6181431612547969857">Изтеглянето е блокирано</translation> -<translation id="6182100780603067202">Споделяне и на звука от приложението (от всичките му прозорци)</translation> <translation id="6183369864942961155">Автоматична светла/тъмна тема</translation> <translation id="6183773856988300112">Gemini в Chrome използва функцията за автоматично сърфиране, за да работи в разделите си и да изпълнява задачите, които му възлагате. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Търсене на раздели</translation> @@ -8264,7 +8261,6 @@ <translation id="6754359471209693699">Стартиране на ново търсене</translation> <translation id="6754918760968695779">Бързо вмъкване</translation> <translation id="6755702685749429945">Добавяне на речник</translation> -<translation id="6756157672127672536">Приложението „Файлове“ предоставя бърз достъп до файловете, които сте запазили в Google Диск, във външно хранилище или на устройството си с Chrome OS.</translation> <translation id="6756643207511618722">Машини за синтезиран говор</translation> <translation id="6757431299485455321">Помагане на други устройства да намират тази точка за достъп.</translation> <translation id="6758056191028427665">Уведомете ни как се справяме.</translation> @@ -9211,6 +9207,7 @@ <translation id="7406912950279255498">Режим на инвертиране на цветовете</translation> <translation id="7407430846095439694">Импортиране и свързване</translation> <translation id="7407504355934009739">Повечето хора блокират известията от този сайт</translation> +<translation id="7407578029724074226">Файлът <ph name="FILE_NAME" /> съдържа поверителни данни. Организацията ви ще ви даде възможност да го запазите в хранилището в облака или да го отхвърлите</translation> <translation id="7408080603962564527">Това ще е видимо за други хора</translation> <translation id="740810853557944681">Добавяне на сървър за отпечатване</translation> <translation id="7409549334477097887">Много висок</translation> @@ -9264,6 +9261,7 @@ <translation id="7434969625063495310">Сървърът за отпечатване не бе добавен. Моля, проверете конфигурацията му и опитайте отново.</translation> <translation id="7436921188514130341">Ужас! При преименуването възникна грешка.</translation> <translation id="7439519621174723623">Добавете име на устройство, за да продължите</translation> +<translation id="743982235360757672">Осъществявайте лесен достъп до режима с AI, докато сърфирате</translation> <translation id="7441736532026945583">Изберете „Скриване на групата“, за да премахнете групата от лентата с раздели</translation> <translation id="7441736921018636843">За да промените тази настройка, <ph name="BEGIN_LINK" />нулирайте синхронизирането<ph name="END_LINK" />, така че да премахнете съответния си пропуск</translation> <translation id="7441830548568730290">Други потребители</translation> @@ -10002,7 +10000,6 @@ <translation id="794676567536738329">Потвърждаване на разрешенията</translation> <translation id="7947962633355574091">К&опиране на адреса на видеоклипа</translation> <translation id="7947964080535614577">Сайтовете обикновено показват реклами, за да могат да предоставят съдържание или услуги без парично заплащане. Някои от тях обаче показват натрапчиви или подвеждащи реклами.</translation> -<translation id="7948239795436419268">Без възстановяване на прозорците</translation> <translation id="7948407723851303488">Всички страници на <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Причина: Услугите, базиращи се на местоположението, поддържат само URL адреси със схема http://, https:// и file://.</translation> <translation id="7950814699499457511">Включено • За това разширение не са публикувани практики за поверителност, като например как събира и използва данни</translation> @@ -11191,7 +11188,6 @@ <translation id="8751034568832412184">Училище</translation> <translation id="8751329102746373229">От администратора ви</translation> <translation id="8752451679755290210">Автоматично придвижване между елементите</translation> -<translation id="8753948258138515839">Приложението „Файлове“ предоставя бърз достъп до файловете, които сте запазили в Google Диск, във външно хранилище или на устройството си с ChromeOS Flex.</translation> <translation id="8754200782896249056"><p>Когато изпълнявате <ph name="PRODUCT_NAME" /> в поддържана среда на компютър, ще се използват системните настройки за прокси сървър. Но системата ви или не се поддържа, или е възникнал проблем при стартирането на системната конфигурация.</p> <p>Можете обаче да конфигурирате чрез командния ред. Моля, вижте <code>man <ph name="PRODUCT_BINARY_NAME" /></code> за още информация за флагове и променливи на обкръжението.</p></translation> @@ -11984,6 +11980,7 @@ <translation id="992778845837390402">В момента се създава резервно копие на Linux</translation> <translation id="994087375490600917">Странични панели</translation> <translation id="994289308992179865">Цикъ&л</translation> +<translation id="995420352808264005">Изберете тип регистрация на устройството</translation> <translation id="995755448277384931">Добавяне на IBAN</translation> <translation id="996250603853062861">Установява се защитена връзка...</translation> <translation id="997143476478634194">Сайтовете автоматично следват тази настройка, когато ги посещавате. Сайтовете обикновено изпращат известия, за да ви уведомяват за извънредни новини или съобщения в чата.</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index ad8b862e..05191f8 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">মূল নোড অ্যানোটেশন ফাইল ডাউনলোড করা যাচ্ছে না। পরে আবার চেষ্টা করুন।</translation> <translation id="1103523840287552314">সর্বদা অনুবাদ করুন <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">আপনি অবিলম্বে এই ট্যাব গ্রুপের অ্যাক্সেস হারাবেন এবং আপনার সব ডিভাইস থেকে এটি মুছে দেওয়া হবে</translation> +<translation id="1105934302947321130">Zoom-সহ Google Beam</translation> <translation id="1106270460549661906">Gemini-র সাথে শেয়ার করা বন্ধ করুন</translation> <translation id="1106350001632362876">থ্রেশহোল্ড বাড়ান</translation> <translation id="110850812463801904">OneDrive-এ ম্যানুয়ালি কানেক্ট করা আছে</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">আপনার নিরাপত্তা কী কোনও পিন দ্বারা সুরক্ষিত নেই। সাইন-ইন ডেটা ম্যানেজ করতে, প্রথমে পিন তৈরি করুন।</translation> <translation id="1179400851034021914">ভুল IBAN</translation> <translation id="1179902906564467236">আপনার ফোনে নির্দেশাবলী ফলো করুন অথবা ক্যামেরা অ্যাপ ব্যবহার করুন</translation> -<translation id="1180117276105724040">আপনার পূর্ববর্তী সেশন থেকে উইন্ডোগুলি ফেরানো হচ্ছে...</translation> <translation id="118057123461613219">প্রচুর পরিমাণে সেভ করা</translation> <translation id="1181037720776840403">সরান</translation> <translation id="1182876754474670069">বাড়ি</translation> @@ -763,7 +763,6 @@ <translation id="151501797353681931">Safari থেকে আমদানি করা</translation> <translation id="1515163294334130951">লঞ্চ করুন</translation> <translation id="1517467582299994451">কোডের সাহায্যে কাস্ট করতে, Chrome ব্রাউজারের 'সিঙ্ক' সেটিংস চালু করুন</translation> -<translation id="1519090060276706457">উইন্ডোগুলি ফিরিয়ে আনার জন্য প্রত্যাশিত সময়ের চেয়ে বেশি সময় লাগছে</translation> <translation id="1521442365706402292">শংসাপত্রগুলি পরিচালনা করুন</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">আজ ব্যবহার করা হয়েছে</translation> @@ -1112,6 +1111,7 @@ <translation id="1745732479023874451">পরিচিতি ম্যানেজ করুন</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}one{এই ওয়েব অ্যাপে #টি ফাইল খুলবেন এবং এডিট করবেন?}other{এই ওয়েব অ্যাপে #টি ফাইল খুলবেন এবং এডিট করবেন?}}</translation> <translation id="1748563609363301860">আপনার Google অ্যাকাউন্ট অথবা শুধুমাত্র এই ডিভাইসে আপনি পাসওয়ার্ড সেভ করতে পারবেন</translation> +<translation id="1749645492410897998">সফ্টওয়্যার ইনস্টল করা হচ্ছে</translation> <translation id="1749733017156547309">পাসওয়ার্ড দিতে হবে</translation> <translation id="1750172676754093297">আপনার নিরাপত্তা কী-তে ফিঙ্গারপ্রিন্ট স্টোর করা যায় না</translation> <translation id="1750238553597293878">আপনার Google অ্যাকাউন্টে পাসওয়ার্ড ব্যবহার করতে থাকুন</translation> @@ -1183,7 +1183,6 @@ <translation id="1796460466266263589">Gemini ব্যবহার করা চালিয়ে যেতে, আপনার পরিচয় যাচাই করুন</translation> <translation id="1796588414813960292">যেসব ফিচার ব্যবহার করার জন্য সাউন্ড প্রয়োজন সেগুলি কাজ করবে না</translation> <translation id="1798726622311813209">ক্রেডিট ও ডেবিট কার্ড</translation> -<translation id="1799852120691957794">আপনার পূর্ববর্তী সেশন থেকে উইন্ডোগুলি ফেরানো যাচ্ছে না</translation> <translation id="180203835522132923">'Search' ও 'O' বোতাম একসাথে প্রেস করুন, তারপরে 'W' বোতাম প্রেস করুন</translation> <translation id="1802624026913571222">ডিভাইসের কভার বন্ধ করলে স্লিপ মোডে চলে যাবে</translation> <translation id="1802687198411089702">পৃষ্ঠাটি সাড়া দিচ্ছে না। আপনি অপেক্ষা করতে পারেন অথবা পৃষ্ঠা ছেড়ে যেতে পারেন।</translation> @@ -2380,7 +2379,6 @@ <translation id="2610374175948698697">আপনার ডিভাইসে ফাইল বা ফোল্ডার দেখতে পারেন</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">আপনার Microsoft অ্যাকাউন্টে সাইন-ইন করে তারপর আবার চেষ্টা করুন</translation> -<translation id="2611702650078660078">কোনও সমস্যা হয়েছে</translation> <translation id="2611776654555141051">আয়তকার টুল</translation> <translation id="2611885296070244383">মাইক (ইন্টার্নাল)</translation> <translation id="2612676031748830579">কার্ড নম্বর</translation> @@ -2744,7 +2742,6 @@ <translation id="285033512555869047">বন্ধ করা আছে</translation> <translation id="2850541429955027218">থীম জুড়ুন</translation> <translation id="2851291081585704741">আপনি অফলাইন আছেন</translation> -<translation id="2852045827873867442">ইন্টারনেট কানেকশন প্রয়োজন।</translation> <translation id="285237063405807022">(লোড হচ্ছে)</translation> <translation id="2853121255651601031">পাসওয়ার্ড সেভ করা হয়েছে</translation> <translation id="2854453262159518435">আগে থেকে থাকা ট্যাব গ্রুপ পরিবর্তন করুন</translation> @@ -3611,6 +3608,7 @@ <translation id="3473241910002674503">ট্যাবলেট মোডে বোতাম ব্যবহার করে হোম পেজে যান, ফিরে আসুন এবং একটি অ্যাপ থেকে আরেকটি অ্যাপে যান।</translation> <translation id="3473479545200714844">স্ক্রিন ম্যাগনিফায়ার</translation> <translation id="3474218480460386727">নতুন শব্দের জন্য ৯৯টি অথবা তার চেয়ে কম বর্ণ ব্যবহার করুন</translation> +<translation id="3474330892505468100">Meet-সহ Google Beam</translation> <translation id="3474624961160222204"><ph name="NAME" /> হিসাবে চালিয়ে যান</translation> <translation id="3477772589943384839">মডারেট মেমরি সেভ করার সুবিধা পান। দীর্ঘ সময় ব্যবহার না করলে, আপনার ট্যাব অ্যাক্টিভ থাকবে না।</translation> <translation id="347785443197175480">আপনার ক্যামেরা এবং মাইক্রোফোন অ্যাক্সেস করতে <ph name="HOST" /> এর মঞ্জুরি অবিরত রাখুন</translation> @@ -5499,7 +5497,6 @@ <translation id="4779766576531456629">ই-সিম মোবাইল নেটওয়ার্কের নতুন নাম দিন</translation> <translation id="4780321648949301421">এইভাবে পৃষ্ঠা সেভ করুন...</translation> <translation id="4780558987886269159">অফিসের জন্য</translation> -<translation id="4781633367688946589">নতুন সেশন চালিয়ে যান</translation> <translation id="4784349455504343791">আপনার ডিজিটাল ওয়ালেট থেকে <ph name="WEBSITE_ORIGIN" /> ব্যক্তিগত তথ্য ব্যবহার করতে চায়।</translation> <translation id="4785719467058219317">আপনি এমন একটি নিরাপত্তা কী ব্যবহার করছেন যেটি এই ওয়েবসাইটের সাথে রেজিস্টার করা নেই</translation> <translation id="4785914069240823137">ক্রপ করা বাতিল করুন</translation> @@ -6288,6 +6285,7 @@ <translation id="5337926771328966926"><ph name="DEVICE_NAME" /> হল বর্তমান ডিভাইস</translation> <translation id="5338338064218053691">ছদ্মবেশী মোডে ব্যবহার করে আপনি গোপনে ব্রাউজ করতে পারেন</translation> <translation id="5338503421962489998">স্থানীয় সঞ্চয়স্থান</translation> +<translation id="5340620183031438925">পৃষ্ঠা ছেড়ে না বেরিয়েই AI মোডকে আপনার ট্যাব সম্পর্কে জিজ্ঞাসা করতে, নিজের পরিচয় যাচাই করুন। তাছাড়া, আপনার সব ডিভাইসে পাসওয়ার্ড এবং আরও অনেক কিছু পাবেন।</translation> <translation id="5340787663756381836">&খুঁজুন ও এডিট করুন</translation> <translation id="5340900621595888432">ডায়াগনস্টিক ও ব্যবহারের ডেটা পাঠান</translation> <translation id="5341793073192892252">নিম্নোক্ত কুকিগুলি ব্লক করা আছে (কোনও এক্সেপশন ছাড়াই তৃতীয়-পক্ষের কুকিগুলি ব্লক করা হচ্ছে)</translation> @@ -7475,7 +7473,6 @@ <translation id="6180550893222597997"><ph name="APP_NAME" />-এর জন্য কোন 'পাসকী' ব্যবহার করতে চান?</translation> <translation id="6181218116951226898">অ্যাপগুলি কখনও কখনও সেগুলির ব্র্যান্ডিং আপডেট করে। যেসব পরিবর্তন করা হয়েছে সেগুলির ব্যাপারে আপনি স্বচ্ছন্দ কিনা তা নিশ্চিত করতে আপডেট করার আগে সব পরিবর্তন পর্যালোচনা করুন।</translation> <translation id="6181431612547969857">ডাউনলোড ব্লক করা হয়েছে</translation> -<translation id="6182100780603067202">এছাড়াও অ্যাপ্লিকেশন অডিও (এর সব উইন্ডো থেকে) শেয়ার করুন</translation> <translation id="6183369864942961155">অটোমেটিক লাইট/ডার্ক থিম</translation> <translation id="6183773856988300112">Gemini in Chrome আপনার ট্যাবে কাজ করতে ও আপনি যে টাস্ক দেন সেটি সম্পূর্ণ করতে অটোমেটিক ব্রাউজ ব্যবহার করে। <ph name="LINK_BEGIN" />আরও জানুন<ph name="LINK_END" /></translation> <translation id="6184099524311454384">ট্যাব খুঁজুন</translation> @@ -8270,7 +8267,6 @@ <translation id="6754359471209693699">নতুন সার্চ শুরু করুন</translation> <translation id="6754918760968695779">কুইক ইনসার্ট</translation> <translation id="6755702685749429945">অভিধান যোগ করুন</translation> -<translation id="6756157672127672536">Google Drive, এক্সটার্নাল স্টোরেজ অথবা আপনার ChromeOS ডিভাইসে আপনি যে ফাইলগুলি সেভ করেছেন ফাইল অ্যাপ সেগুলিতে দ্রুত অ্যাক্সেস প্রদান করে।</translation> <translation id="6756643207511618722">স্পিচ ইঞ্জিন</translation> <translation id="6757431299485455321">এই হটস্পট খুঁজতে অন্যান্য ডিভাইসকে সহায়তা করে।</translation> <translation id="6758056191028427665">আমাদের পরিষেবা কেমন লাগছে তা জানান।</translation> @@ -9217,6 +9213,7 @@ <translation id="7406912950279255498">কালার ইনভার্সন মোড</translation> <translation id="7407430846095439694">আমদানি করে আটকান</translation> <translation id="7407504355934009739">অধিকাংশ ব্যক্তি এই সাইটের বিজ্ঞপ্তি ব্লক করে দেন</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" />-এ সংবেদনশীল ব্যক্তিগত তথ্য আছে। আপনার সংস্থা ক্লাউড স্টোরেজে এটি সেভ করার অনুমতি দেবে অথবা এটি বাতিল করতে হবে</translation> <translation id="7408080603962564527">অন্যরা এটি দেখতে পাবেন</translation> <translation id="740810853557944681">একটি প্রিন্ট সার্ভার যোগ করুন</translation> <translation id="7409549334477097887">অনেক বড়</translation> @@ -9270,6 +9267,7 @@ <translation id="7434969625063495310">প্রিন্ট সার্ভারটি যোগ করা যায়নি। সার্ভার কনফিগারেশন চেক করে আবার চেষ্টা করুন।</translation> <translation id="7436921188514130341">নাম পরিবর্তনের সময় একটি ত্রুটি হয়েছিল।</translation> <translation id="7439519621174723623">চালিয়ে যেতে ডিভাইসের নাম যোগ করুন</translation> +<translation id="743982235360757672">ব্রাউজ করার সময় AI মোডকে অ্যাক্সেসযোগ্য রাখুন</translation> <translation id="7441736532026945583">আপনার ট্যাব বার থেকে গ্রুপ সরাতে "গ্রুপ লুকান" বিকল্প বেছে নিন</translation> <translation id="7441736921018636843">এই সেটিংটি পরিবর্তন করতে, আপনার সিঙ্ক পাসফ্রেজটি সরানোর জন্য <ph name="BEGIN_LINK" />সিঙ্ক রিসেট করুন<ph name="END_LINK" /></translation> <translation id="7441830548568730290">অন্যান্য ব্যবহারকারী</translation> @@ -10008,7 +10006,6 @@ <translation id="794676567536738329">অনুমতিগুলি নিশ্চিত করুন</translation> <translation id="7947962633355574091">ভি&ডিও ঠিকানা কপি করুন</translation> <translation id="7947964080535614577">সাইট সাধারণত বিজ্ঞাপন দেখায় যাতে সেগুলি কোনও পেমেন্ট ছাড়াই কন্টেন্ট অথবা পরিষেবা প্রদান করতে পারে। কিন্তু ব্যাঘাত সৃষ্টিকারী অথবা বিভ্রান্তিকর বিজ্ঞাপন দেখায় বলে কিছু সাইটের বদনাম আছে।</translation> -<translation id="7948239795436419268">উইন্ডোগুলি ফেরাতে হবে না</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" />-এর সব পৃষ্ঠা</translation> <translation id="7950629216186736592">কারণ: LBS-এ শুধু http://, https:// এবং file:// URL ব্যবহার করা যায়।</translation> <translation id="7950814699499457511">চালু আছে • এই এক্সটেনশন গোপনীয়তা অনুশীলন প্রকাশ করেনি, যেমন কীভাবে এটি ডেটা সংগ্রহ ও ব্যবহার করে</translation> @@ -11197,7 +11194,6 @@ <translation id="8751034568832412184">স্কুল</translation> <translation id="8751329102746373229">আপনার অ্যাডমিনিস্ট্রেটরের থেকে</translation> <translation id="8752451679755290210">অটোমেটিক একটি আইটেম থেকে অন্য আইটেমে যান</translation> -<translation id="8753948258138515839">Google Drive, এক্সটার্নাল স্টোরেজ অথবা আপনার ChromeOS Flex ডিভাইসে আপনি যে ফাইলগুলি সেভ করেছেন ফাইল অ্যাপ সেগুলিতে দ্রুত অ্যাক্সেস প্রদান করে।</translation> <translation id="8754200782896249056"><p>কোন সমর্থিত ডেস্কটপ পরিবেশে <ph name="PRODUCT_NAME" /> চলার সময়, সিস্টেম প্রক্সি সেটিংস ব্যবহার করা হবে৷ যদিও, আপনার সিস্টেম সমর্থিত নয় অথবা আপনার সিস্টেম কনফিগারেশন প্রবর্তন করার সময় একটি সমস্যা হয়েছে।</p> <p>কিন্তু আপনি এখনও কম্যান্ড লাইনের মাধ্যমে কনফিগার করতে পারেন৷ ফ্ল্যাগ ও বিভিন্ন পরিবেশের উপর আরও তথ্যের জন্য অনুগ্রহ করে <code>ম্যানুয়াল <ph name="PRODUCT_BINARY_NAME" /></code> দেখুন।</p></translation> @@ -11991,6 +11987,7 @@ <translation id="992778845837390402">বর্তমানে Linux-এর ব্যাক-আপ নেওয়া হচ্ছে</translation> <translation id="994087375490600917">সাইড প্যানেল</translation> <translation id="994289308992179865">&লুপ</translation> +<translation id="995420352808264005">ডিভাইস এনরোলমেন্টের ধরন বেছে নিন</translation> <translation id="995755448277384931">IBAN যোগ করুন</translation> <translation id="996250603853062861">নিরাপদ সংযোগ স্থাপন করা হচ্ছে...</translation> <translation id="997143476478634194">আপনি কোনও সাইট খুললে সেটি অটোমেটিক এই সেটিং মেনে কাজ করবে। ব্রেকিং নিউজ বা চ্যাট মেসেজ সম্পর্কে আপনাকে জানাতে সাইট সাধারণত বিজ্ঞপ্তি পাঠিয়ে থাকে।</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index 0584e0c..f4b01258 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Nije moguće preuzeti fajlove s bilješkama o glavnom čvoru. Pokušajte ponovo kasnije.</translation> <translation id="1103523840287552314">Uvijek prevodi <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Odmah ćete izgubiti pristup grupi kartica, a ona će se izbrisati sa svih vaših uređaja</translation> +<translation id="1105934302947321130">Google Beam sa Zoomom</translation> <translation id="1106270460549661906">Prekini dijeljenje s Geminijem</translation> <translation id="1106350001632362876">Povećanje praga</translation> <translation id="110850812463801904">Ručno se povežite s OneDriveom</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Vaš sigurnosni ključ nije zaštićen PIN-om. Za upravljanje podacima za prijavu, najprije kreirajte PIN.</translation> <translation id="1179400851034021914">IBAN nije važeći</translation> <translation id="1179902906564467236">Pratite uputstva na telefonu ili koristite aplikaciju kamere</translation> -<translation id="1180117276105724040">Vraćanje prozora iz prethodne sesije…</translation> <translation id="118057123461613219">Ogromne uštede</translation> <translation id="1181037720776840403">Ukloni</translation> <translation id="1182876754474670069">Home</translation> @@ -764,7 +764,6 @@ <translation id="151501797353681931">Uvezeno iz preglednika Safari</translation> <translation id="1515163294334130951">Pokreni</translation> <translation id="1517467582299994451">Da emitirate pomoću kôda, uključite postavke sinhronizacije u pregledniku Chrome</translation> -<translation id="1519090060276706457">Vraćanje prozora traje duže od očekivanog</translation> <translation id="1521442365706402292">Upravljaj potvrdama</translation> <translation id="1521655867290435174">Google Tabele</translation> <translation id="1521774566618522728">Aktivan danas</translation> @@ -1110,6 +1109,7 @@ <translation id="1745732479023874451">Upravljajte kontaktima</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}one{Otvoriti i urediti # fajl u ovoj web aplikaciji?}few{Otvoriti i urediti # fajla u ovoj web aplikaciji?}other{Otvoriti i urediti # fajlova u ovoj web aplikaciji?}}</translation> <translation id="1748563609363301860">Možete sačuvati ovu lozinku na Google računu ili samo na ovom uređaju</translation> +<translation id="1749645492410897998">Instaliranje softvera</translation> <translation id="1749733017156547309">Lozinka je obavezna</translation> <translation id="1750172676754093297">Sigurnosni ključ ne može pohranjivati otiske prstiju</translation> <translation id="1750238553597293878">Nastavite koristiti lozinke na Google računu</translation> @@ -1181,7 +1181,6 @@ <translation id="1796460466266263589">Potvrdite identitet da nastavite koristiti Gemini</translation> <translation id="1796588414813960292">Funkcije za koje je potreban zvuk neće funkcionirati</translation> <translation id="1798726622311813209">Kreditne i debitne kartice</translation> -<translation id="1799852120691957794">Nije moguće vratiti prozore iz prethodne sesije</translation> <translation id="180203835522132923">Tipka za pretraživanje + O, a zatim W</translation> <translation id="1802624026913571222">Uključi stanje mirovanje kada se zatvori poklopac</translation> <translation id="1802687198411089702">Stranica ne reagira. Možete sačekati ili je zatvoriti.</translation> @@ -2378,7 +2377,6 @@ <translation id="2610374175948698697">Može pregledati fajlove ili foldere na uređaju</translation> <translation id="2610780100389066815">Potpisivanje Microsoftove liste pouzdanih stavki</translation> <translation id="261114180663074524">Prijavite se na Microsoft račun, a zatim pokušajte ponovo</translation> -<translation id="2611702650078660078">Došlo je do greške</translation> <translation id="2611776654555141051">Alat za crtanje pravougaonika</translation> <translation id="2611885296070244383">Mikrofon (interno)</translation> <translation id="2612676031748830579">Broj kartice</translation> @@ -2742,7 +2740,6 @@ <translation id="285033512555869047">Zatvoreno</translation> <translation id="2850541429955027218">Dodaj temu</translation> <translation id="2851291081585704741">Offline ste</translation> -<translation id="2852045827873867442">Potrebna je internetska veza.</translation> <translation id="285237063405807022">(učitavanje)</translation> <translation id="2853121255651601031">Zaporka je spremljena</translation> <translation id="2854453262159518435">Zamijeni postojeću grupu kartica</translation> @@ -3609,6 +3606,7 @@ <translation id="3473241910002674503">Navigiranje na početnu stranicu, nazad i prebacivanje između aplikacija pomoću dugmadi u načinu rada za tablet.</translation> <translation id="3473479545200714844">Povećalo ekrana</translation> <translation id="3474218480460386727">Za nove riječi koristite 99 slova ili manje</translation> +<translation id="3474330892505468100">Google Beam s Meetom</translation> <translation id="3474624961160222204">Nastavi kao <ph name="NAME" /></translation> <translation id="3477772589943384839">Dobijte umjerene uštede memorije. Kartice postaju neaktivne nakon dužeg perioda.</translation> <translation id="347785443197175480">I dalje dozvoljavaj host računaru <ph name="HOST" /> da pristupa kameri i mikrofonu</translation> @@ -5497,7 +5495,6 @@ <translation id="4779766576531456629">Promijeni naziv eSIM mobilne mreže</translation> <translation id="4780321648949301421">Sačuvaj stranicu kao...</translation> <translation id="4780558987886269159">Za posao</translation> -<translation id="4781633367688946589">Nastavi na novu sesiju</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> želi koristiti lične informacije iz vašeg digitalnog novčanika.</translation> <translation id="4785719467058219317">Koristite sigurnosni ključ koji nije registriran na ovoj web lokaciji</translation> <translation id="4785914069240823137">Otkažite izrezivanje</translation> @@ -6286,6 +6283,7 @@ <translation id="5337926771328966926">Trenutni naziv uređaja je <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Možete pregledati privatno koristeći anonimni prozor</translation> <translation id="5338503421962489998">Lokalna pohrana</translation> +<translation id="5340620183031438925">Da pitate AI način rada o kartici bez napuštanja stranice, potvrdite identitet. Također ćete dobiti svoje lozinke i druge stavke na svim svojim uređajima.</translation> <translation id="5340787663756381836">&Pronađi i uredi</translation> <translation id="5340900621595888432">Pošaljite dijagnostiku i podatke o korištenju</translation> <translation id="5341793073192892252">Sljedeći kolačići su blokirani (kolačići treće strane se blokiraju bez izuzetka)</translation> @@ -7472,7 +7470,6 @@ <translation id="6180550893222597997">Koji pristupni ključ želite koristiti za aplikaciju <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Aplikacije ponekad ažuriraju svoje brendiranje. Pregledajte sve promjene kako biste bili sigurni da vam odgovaraju prije ažuriranja.</translation> <translation id="6181431612547969857">Preuzimanje je blokirano</translation> -<translation id="6182100780603067202">Dijeli i zvuk aplikacije (iz svih njenih prozora)</translation> <translation id="6183369864942961155">Automatska svijetla/tamna tema</translation> <translation id="6183773856988300112">Gemini u Chromeu koristi automatsko pregledanje za rad na vašim karticama i izvršavanje zadataka koje mu dodijelite. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Pretražite kartice</translation> @@ -8269,7 +8266,6 @@ <translation id="6754359471209693699">Pokretanje novog pretraživanja</translation> <translation id="6754918760968695779">Brzo umetanje</translation> <translation id="6755702685749429945">Dodajte rječnik</translation> -<translation id="6756157672127672536">Aplikacija Files pruža brzi pristup fajlovima sačuvanim na Google Disku, vanjskoj pohrani ili ChromeOS uređaju.</translation> <translation id="6756643207511618722">Alati za govor</translation> <translation id="6757431299485455321">Pomozite drugim uređajima da pronađu ovu pristupnu tačku.</translation> <translation id="6758056191028427665">Recite nam koliko ste zadovoljni nama.</translation> @@ -9216,6 +9212,7 @@ <translation id="7406912950279255498">Način rada s inverzijom boja</translation> <translation id="7407430846095439694">Uvezi i poveži</translation> <translation id="7407504355934009739">Većina osoba blokira obavještenja s ove web lokacije</translation> +<translation id="7407578029724074226">Fajl <ph name="FILE_NAME" /> sadržava osjetljive podatke. Vaša organizacija će vam omogućiti da ga sačuvate u pohranu u oblaku ili odbacite</translation> <translation id="7408080603962564527">Ovo će biti vidljivo drugima</translation> <translation id="740810853557944681">Dodavanje servera za štampanje</translation> <translation id="7409549334477097887">Veoma veliki</translation> @@ -9269,6 +9266,7 @@ <translation id="7434969625063495310">Dodavanje servera za štampanje nije uspjelo. Provjerite konfiguraciju servera i pokušajte ponovo.</translation> <translation id="7436921188514130341">O, ne! Došlo je do greške prilikom promjene naziva.</translation> <translation id="7439519621174723623">Dodajte naziv uređaja da nastavite</translation> +<translation id="743982235360757672">Neka vam AI način rada bude nadohvat ruke dok pregledate</translation> <translation id="7441736532026945583">Odaberite "Sakrij grupu" da uklonite grupu iz trake kartice</translation> <translation id="7441736921018636843">Za promjenu ove postavke <ph name="BEGIN_LINK" />poništite sinhronizaciju<ph name="END_LINK" /> da uklonite pristupni izraz sinhronizacije</translation> <translation id="7441830548568730290">Drugi korisnici</translation> @@ -10007,7 +10005,6 @@ <translation id="794676567536738329">Potvrdite odobrenja</translation> <translation id="7947962633355574091">K&opiraj adresu videozapisa</translation> <translation id="7947964080535614577">Web lokacije obično prikazuju oglase da mogu besplatno pružati sadržaj ili usluge. Ali, poznato je da neke web lokacije prikazuju ometajuće ili obmanjujuće oglase.</translation> -<translation id="7948239795436419268">Nemoj vraćati prozore</translation> <translation id="7948407723851303488">Sve stranice na domeni <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Razlog: LBS podržava samo URL-ove http://, https:// i file://.</translation> <translation id="7950814699499457511">Uključeno • Ekstenzija nije objavila prakse u vezi s privatnošću, kao što je način na koji prikuplja i koristi podatke</translation> @@ -11196,7 +11193,6 @@ <translation id="8751034568832412184">Školsko</translation> <translation id="8751329102746373229">Od administratora</translation> <translation id="8752451679755290210">Automatski se krećite između stavki</translation> -<translation id="8753948258138515839">Aplikacija Fajlovi pruža brzi pristup fajlovima sačuvanim na Google Disku, vanjskoj pohrani ili na ChromeOS Flex uređaju.</translation> <translation id="8754200782896249056"><p>Kada je <ph name="PRODUCT_NAME" /> pokrenut u podržanom okruženju radne površine, koristit će se sistemske postavke proksi servera. Međutim, vaš sistem nije podržan ili je došlo do problema prilikom pokretanja konfiguracije sistema.</p> <p>Konfiguraciju i dalje možete izvršiti putem komandne linije. Više informacija o oznakama i varijablama okruženja potražite u <code>man <ph name="PRODUCT_BINARY_NAME" /></code>.</p></translation> @@ -11991,6 +11987,7 @@ <translation id="992778845837390402">Kreiranje sigurnosne kopije za Linux je trenutno u toku</translation> <translation id="994087375490600917">Bočne ploče</translation> <translation id="994289308992179865">&Ponavljaj</translation> +<translation id="995420352808264005">Odaberite vrstu registracije uređaja</translation> <translation id="995755448277384931">Dodajte IBAN</translation> <translation id="996250603853062861">Uspostavljanje sigurne veze…</translation> <translation id="997143476478634194">Web lokacije automatski primjenjuju ovu postavku kada ih posjetite. Web lokacije obično šalju obavještenja o najnovijim vijestima ili porukama chata.</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index 52ff693..241449d 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">No es poden baixar els fitxers d'anotacions del node principal. Torna-ho a provar més tard.</translation> <translation id="1103523840287552314">Tradueix sempre el text en <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Perdràs immediatament l'accés a aquest grup de pestanyes i se suprimirà de tots els teus dispositius</translation> +<translation id="1105934302947321130">Google Beam amb Zoom</translation> <translation id="1106270460549661906">Deixa de compartir amb Gemini</translation> <translation id="1106350001632362876">Augmenta el llindar</translation> <translation id="110850812463801904">Connecta't manualment a OneDrive</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">La clau de seguretat no està protegida amb un PIN. Per gestionar les dades d'inici de sessió, primer crea un PIN.</translation> <translation id="1179400851034021914">L'IBAN no és vàlid</translation> <translation id="1179902906564467236">Segueix les instruccions al telèfon o utilitza l'aplicació de càmera</translation> -<translation id="1180117276105724040">S'estan restaurant les finestres de la sessió anterior...</translation> <translation id="118057123461613219">Estalvi enorme</translation> <translation id="1181037720776840403">Suprimeix</translation> <translation id="1182876754474670069">Inici</translation> @@ -761,7 +761,6 @@ <translation id="151501797353681931">Importat de Safari</translation> <translation id="1515163294334130951">Inicia</translation> <translation id="1517467582299994451">Per emetre contingut amb un codi, activa la configuració de sincronització del navegador Chrome</translation> -<translation id="1519090060276706457">La restauració de les finestres està tardant més del previst</translation> <translation id="1521442365706402292">Administra certificats</translation> <translation id="1521655867290435174">Fulls de càlcul de Google</translation> <translation id="1521774566618522728">Actiu avui</translation> @@ -1102,6 +1101,7 @@ <translation id="1745732479023874451">Gestiona els contactes</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{Vols obrir i editar # en aquesta aplicació web?}}</translation> <translation id="1748563609363301860">Pots desar aquesta contrasenya al teu Compte de Google o només en aquest dispositiu</translation> +<translation id="1749645492410897998">Instal·lant el programari</translation> <translation id="1749733017156547309">Has d'introduir una contrasenya</translation> <translation id="1750172676754093297">La teva clau de seguretat no pot emmagatzemar empremtes digitals</translation> <translation id="1750238553597293878">Continua utilitzant les contrasenyes al teu Compte de Google</translation> @@ -1173,7 +1173,6 @@ <translation id="1796460466266263589">Per continuar utilitzant Gemini, verifica la teva identitat</translation> <translation id="1796588414813960292">Les funcions que necessitin so no funcionaran</translation> <translation id="1798726622311813209">Targetes de crèdit i de dèbit</translation> -<translation id="1799852120691957794">No es poden restaurar les finestres de la sessió anterior</translation> <translation id="180203835522132923">Cerca+O i, després, W</translation> <translation id="1802624026913571222">Posa en repòs quan es tanqui la tapa</translation> <translation id="1802687198411089702">La pàgina no respon. Pots esperar que respongui o pots sortir-ne.</translation> @@ -2366,7 +2365,6 @@ <translation id="2610374175948698697">Poden veure els fitxers o les carpetes del dispositiu</translation> <translation id="2610780100389066815">Signatura de llista de confiança de Microsoft</translation> <translation id="261114180663074524">Inicia la sessió al teu compte de Microsoft i torna-ho a provar</translation> -<translation id="2611702650078660078">S'ha produït un error</translation> <translation id="2611776654555141051">Eina de rectangle</translation> <translation id="2611885296070244383">Micròfon (intern)</translation> <translation id="2612676031748830579">Número de targeta</translation> @@ -2730,7 +2728,6 @@ <translation id="285033512555869047">tancat</translation> <translation id="2850541429955027218">Afegeix el tema</translation> <translation id="2851291081585704741">No tens connexió</translation> -<translation id="2852045827873867442">Cal tenir connexió a Internet.</translation> <translation id="285237063405807022">(s'està carregant)</translation> <translation id="2853121255651601031">S'ha desat la contrasenya</translation> <translation id="2854453262159518435">Substitueix el grup de pestanyes existent</translation> @@ -3595,6 +3592,7 @@ <translation id="3473241910002674503">Navega fins a la pàgina d'inici, ves enrere i canvia d'aplicació amb els botons en mode de tauleta.</translation> <translation id="3473479545200714844">Lupa</translation> <translation id="3474218480460386727">Utilitza 99 lletres o menys per a les paraules noves</translation> +<translation id="3474330892505468100">Google Beam amb Meet</translation> <translation id="3474624961160222204">Continua com a <ph name="NAME" /></translation> <translation id="3477772589943384839">Aconsegueix un estalvi de memòria moderat. Les pestanyes es desactiven després d'un període de temps més llarg.</translation> <translation id="347785443197175480">Continua permetent que <ph name="HOST" /> accedeixi a la càmera i al micròfon</translation> @@ -5482,7 +5480,6 @@ <translation id="4779766576531456629">Canvia el nom de la xarxa mòbil de l'eSIM</translation> <translation id="4780321648949301421">Anomena i desa la pàgina...</translation> <translation id="4780558987886269159">Per a la feina</translation> -<translation id="4781633367688946589">Continua a la sessió nova</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> vol utilitzar informació personal de la teva cartera digital.</translation> <translation id="4785719467058219317">Estàs utilitzant una clau de seguretat que no està registrada en aquest lloc web</translation> <translation id="4785914069240823137">Cancel·la la retallada</translation> @@ -6270,6 +6267,7 @@ <translation id="5337926771328966926">El nom actual del dispositiu és <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Pots navegar de manera privada utilitzant una finestra d'incògnit</translation> <translation id="5338503421962489998">Emmagatzematge local</translation> +<translation id="5340620183031438925">Per fer preguntes al mode IA sobre la pestanya sense sortir de la pàgina, verifica la teva identitat. També obtindràs les contrasenyes i altres dades en tots els teus dispositius.</translation> <translation id="5340787663756381836">&Cerca i edita</translation> <translation id="5340900621595888432">Envia dades de diagnòstic i d'ús</translation> <translation id="5341793073192892252">S'han bloquejat les galetes següents (totes les galetes de tercers es bloquegen sempre)</translation> @@ -7454,7 +7452,6 @@ <translation id="6180550893222597997">Quina clau d'accés vols utilitzar per a <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">De vegades, les aplicacions actualitzen el seu brànding. Revisa tots els canvis per assegurar-te que t'agraden abans de fer l'actualització.</translation> <translation id="6181431612547969857">S'ha bloquejat la baixada</translation> -<translation id="6182100780603067202">Comparteix també l'àudio de l'aplicació (de totes les seves finestres)</translation> <translation id="6183369864942961155">Tema clar/fosc automàtic</translation> <translation id="6183773856988300112">Gemini a Chrome utilitza la navegació automàtica per treballar a les teves pestanyes i completar les tasques que li demanis. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Cerca pestanyes</translation> @@ -8247,7 +8244,6 @@ <translation id="6754359471209693699">Inicia una cerca nova</translation> <translation id="6754918760968695779">Inserció ràpida</translation> <translation id="6755702685749429945">Afegeix un diccionari</translation> -<translation id="6756157672127672536">L'aplicació Fitxers permet accedir ràpidament als fitxers desats a Google Drive, a l'emmagatzematge extern o al dispositiu Chrome OS.</translation> <translation id="6756643207511618722">Motors de parla</translation> <translation id="6757431299485455321">Ajuda altres dispositius a trobar aquest punt d'accés Wi‐Fi.</translation> <translation id="6758056191028427665">Digue'ns si ho estem fent bé.</translation> @@ -9194,6 +9190,7 @@ <translation id="7406912950279255498">Mode d'inversió de colors</translation> <translation id="7407430846095439694">Importa i vincula</translation> <translation id="7407504355934009739">La majoria d'usuaris bloquegen les notificacions d'aquest lloc web</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> conté dades sensibles. La teva organització et permetrà desar-lo a l'emmagatzematge al núvol o descartar-lo.</translation> <translation id="7408080603962564527">Serà visible per a la resta d'usuaris</translation> <translation id="740810853557944681">Afegeix un servidor d'impressió</translation> <translation id="7409549334477097887">Molt gran</translation> @@ -9247,6 +9244,7 @@ <translation id="7434969625063495310">No s'ha pogut afegir el servidor d'impressió. Comprova'n la configuració i torna-ho a provar.</translation> <translation id="7436921188514130341">S'ha produït un error durant el canvi de nom.</translation> <translation id="7439519621174723623">Afegeix el nom d'un dispositiu per continuar</translation> +<translation id="743982235360757672">Tingues el mode IA a prop mentre navegues</translation> <translation id="7441736532026945583">Per suprimir el grup de la barra de pestanyes, selecciona Amaga el grup</translation> <translation id="7441736921018636843">Si vols canviar aquesta opció, <ph name="BEGIN_LINK" />restableix la sincronització<ph name="END_LINK" /> perquè se suprimeixi la frase de contrasenya de sincronització</translation> <translation id="7441830548568730290">Altres usuaris</translation> @@ -9985,7 +9983,6 @@ <translation id="794676567536738329">Confirma els permisos</translation> <translation id="7947962633355574091">C&opia l'adreça del vídeo</translation> <translation id="7947964080535614577">Els llocs web solen mostrar anuncis per proporcionar contingut o serveis sense cost econòmic, tot i que se sap que alguns llocs web mostren anuncis intrusius i enganyosos.</translation> -<translation id="7948239795436419268">No restauris les finestres</translation> <translation id="7948407723851303488">Totes les pàgines de: <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Motiu: LBS només admet els URL http://, https://, i file://.</translation> <translation id="7950814699499457511">Activada • Aquesta extensió no ha publicat les seves pràctiques de privadesa, per exemple, la manera com recull i utilitza les dades</translation> @@ -11174,7 +11171,6 @@ <translation id="8751034568832412184">Centre educatiu</translation> <translation id="8751329102746373229">De l'administrador</translation> <translation id="8752451679755290210">Mou d'un element a un altre automàticament</translation> -<translation id="8753948258138515839">L'aplicació Fitxers permet accedir ràpidament als fitxers desats a Google Drive, a l'emmagatzematge extern o al dispositiu ChromeOS Flex.</translation> <translation id="8754200782896249056"><p>Quan <ph name="PRODUCT_NAME" /> s'executa en un entorn d'escriptori compatible, s'utilitza la configuració del servidor intermediari del sistema. No obstant això, o bé el vostre sistema no és compatible o bé s'ha produït un problema en iniciar la configuració del sistema.</p> <p>Encara podeu configurar-lo mitjançant la línia d'ordres. Consulteu <code>man <ph name="PRODUCT_BINARY_NAME" /></code> per obtenir més informació sobre indicadors i sobre variables d'entorn.</p></translation> @@ -11967,6 +11963,7 @@ <translation id="992778845837390402">Hi ha una còpia de seguretat de Linux en curs</translation> <translation id="994087375490600917">Taulers laterals</translation> <translation id="994289308992179865">&Bucle</translation> +<translation id="995420352808264005">Tria el tipus d'inscripció del dispositiu</translation> <translation id="995755448277384931">Afegeix un IBAN</translation> <translation id="996250603853062861">S'està establint una connexió segura...</translation> <translation id="997143476478634194">Aquesta opció de configuració s'aplica automàticament als llocs web quan els visites. Els llocs web acostumen a enviar notificacions per informar-te de notícies d'última hora o de missatges de xat.</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 843f1b0..5960c47 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Soubory s poznámkami k hlavnímu uzlu nelze stáhnout. Zkuste to později.</translation> <translation id="1103523840287552314">Vždy překládat jazyk <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">K této skupině karet okamžitě ztratíte přístup a bude smazána ze všech vašich zařízení</translation> +<translation id="1105934302947321130">Google Beam se zoomem</translation> <translation id="1106270460549661906">Zrušit sdílení s Gemini</translation> <translation id="1106350001632362876">Zvýšit práh</translation> <translation id="110850812463801904">Připojit se k OneDrive ručně</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Váš bezpečnostní klíč není chráněn kódem PIN. Chcete-li spravovat přihlašovací údaje, nejdříve nastavte PIN.</translation> <translation id="1179400851034021914">Číslo IBAN není platné</translation> <translation id="1179902906564467236">Postupujte podle pokynů v telefonu nebo použijte aplikaci fotoaparátu</translation> -<translation id="1180117276105724040">Obnovování oken z předchozí relace…</translation> <translation id="118057123461613219">Obrovská úspora</translation> <translation id="1181037720776840403">Odebrat</translation> <translation id="1182876754474670069">home</translation> @@ -763,7 +763,6 @@ <translation id="151501797353681931">Importováno z prohlížeče Safari</translation> <translation id="1515163294334130951">Spustit</translation> <translation id="1517467582299994451">Pokud chcete odesílat pomocí kódu, zapněte v prohlížeči Chrome nastavení synchronizace</translation> -<translation id="1519090060276706457">Obnovení oken trvá neočekávaně dlouho</translation> <translation id="1521442365706402292">Správa certifikátů</translation> <translation id="1521655867290435174">Tabulky Google</translation> <translation id="1521774566618522728">Aktivní dnes</translation> @@ -1104,6 +1103,7 @@ <translation id="1745732479023874451">Spravovat kontakty</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}few{Otevřít a upravit # soubory v této webové aplikaci?}many{Otevřít a upravit # souboru v této webové aplikaci?}other{Otevřít a upravit # souborů v této webové aplikaci?}}</translation> <translation id="1748563609363301860">Heslo můžete uložit do účtu Google nebo jen do tohoto zařízení</translation> +<translation id="1749645492410897998">Instalace softwaru</translation> <translation id="1749733017156547309">Heslo je povinné</translation> <translation id="1750172676754093297">Váš bezpečnostní klíč neumí ukládat otisky</translation> <translation id="1750238553597293878">Pokračujte v používání hesel ve svém účtu Google</translation> @@ -1175,7 +1175,6 @@ <translation id="1796460466266263589">Pokud chcete Gemini používat dál, ověřte svou totožnost</translation> <translation id="1796588414813960292">Funkce vyžadující zvuk nebudou k dispozici</translation> <translation id="1798726622311813209">Kreditní a debetní karty</translation> -<translation id="1799852120691957794">Okna z předchozí relace nelze obnovit</translation> <translation id="180203835522132923">Vyhledávací tlačítko + O, poté W</translation> <translation id="1802624026913571222">Při zavření víka přejít do režimu spánku</translation> <translation id="1802687198411089702">Stránka nereaguje. Můžete počkat nebo ji zavřít.</translation> @@ -2368,7 +2367,6 @@ <translation id="2610374175948698697">Může zobrazovat soubory nebo složky v zařízení</translation> <translation id="2610780100389066815">Podpis seznamu důvěryhodných certifikátů Microsoft</translation> <translation id="261114180663074524">Přihlaste se ke svému účtu Microsoft a poté to zkuste znovu</translation> -<translation id="2611702650078660078">Došlo k chybě</translation> <translation id="2611776654555141051">Nástroj Obdélník</translation> <translation id="2611885296070244383">Mikrofon (interní)</translation> <translation id="2612676031748830579">Číslo karty</translation> @@ -2732,7 +2730,6 @@ <translation id="285033512555869047">Zavřeno</translation> <translation id="2850541429955027218">Přidat motiv</translation> <translation id="2851291081585704741">Nemáte připojení k internetu</translation> -<translation id="2852045827873867442">Je vyžadováno připojení k internetu.</translation> <translation id="285237063405807022">(načítání)</translation> <translation id="2853121255651601031">Heslo uloženo</translation> <translation id="2854453262159518435">Nahradit existující skupinu karet</translation> @@ -3597,6 +3594,7 @@ <translation id="3473241910002674503">Umožňuje přejít na domovskou stránku či zpět a přepínat aplikace pomocí tlačítek v režimu tabletu.</translation> <translation id="3473479545200714844">Lupa obrazovky</translation> <translation id="3474218480460386727">Nová slova smí mít maximálně 99 písmen</translation> +<translation id="3474330892505468100">Google Beam se službou Meet</translation> <translation id="3474624961160222204">Pokračovat jako <ph name="NAME" /></translation> <translation id="3477772589943384839">Získáte malou úsporu paměti. Karty přestanou být aktivní po delší době.</translation> <translation id="347785443197175480">Povolit webu <ph name="HOST" /> přístup k webové kameře a mikrofonu i nadále</translation> @@ -5484,7 +5482,6 @@ <translation id="4779766576531456629">Přejmenovat mobilní síť eSIM</translation> <translation id="4780321648949301421">Uložit stránku jako...</translation> <translation id="4780558987886269159">Pro práci</translation> -<translation id="4781633367688946589">Pokračovat k nové relaci</translation> <translation id="4784349455504343791">Web <ph name="WEBSITE_ORIGIN" /> chce použít osobní údaje z vaší digitální peněženky.</translation> <translation id="4785719467058219317">Používáte bezpečnostní klíč, který pro tento web není zaregistrován</translation> <translation id="4785914069240823137">Zrušit oříznutí</translation> @@ -6271,6 +6268,7 @@ <translation id="5337926771328966926">Aktuální název zařízení je <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">V anonymním okně můžete web procházet v soukromí</translation> <translation id="5338503421962489998">Místní úložiště</translation> +<translation id="5340620183031438925">Pokud se chcete režimu AI ptát ohledně karty bez opuštění stránky, ověřte svou totožnost. Na všech svých zařízeních budete mít k dispozici i svá hesla a další informace.</translation> <translation id="5340787663756381836">&Najít a upravit</translation> <translation id="5340900621595888432">Odesílat diagnostické údaje a údaje o využití</translation> <translation id="5341793073192892252">Následující soubory cookie byly zablokovány (soubory cookie třetí strany jsou blokovány bez výjimky)</translation> @@ -7454,7 +7452,6 @@ <translation id="6180550893222597997">Který přístupový klíč chcete pro <ph name="APP_NAME" /> použít?</translation> <translation id="6181218116951226898">Aplikace někdy mění branding. Před aktualizací si zkontrolujte, zda se všemi změnami souhlasíte.</translation> <translation id="6181431612547969857">Stahování zablokováno</translation> -<translation id="6182100780603067202">Sdílet také zvuk aplikace (ze všech jejích oken)</translation> <translation id="6183369864942961155">Automatické přepínání mezi světlým a tmavým motivem</translation> <translation id="6183773856988300112">Gemini v Chromu používá automatické procházení k práci na vašich kartách a plnění zadaných úkolů. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Hledat karty</translation> @@ -8251,7 +8248,6 @@ <translation id="6754359471209693699">Zahájit nové vyhledávání</translation> <translation id="6754918760968695779">Rychle vložit</translation> <translation id="6755702685749429945">Přidat slovník</translation> -<translation id="6756157672127672536">Aplikace Soubory umožňuje rychlý přístup k souborům, které jste uložili na Disk Google, externí úložiště nebo zařízení se systémem ChromeOS.</translation> <translation id="6756643207511618722">Řečové moduly</translation> <translation id="6757431299485455321">Pomoci ostatním zařízením najít tento hotspot.</translation> <translation id="6758056191028427665">Sdělte nám, jak si vedeme.</translation> @@ -9198,6 +9194,7 @@ <translation id="7406912950279255498">Režim převrácení barev</translation> <translation id="7407430846095439694">Importovat a svázat</translation> <translation id="7407504355934009739">Většina lidí oznámení z tohoto webu blokuje</translation> +<translation id="7407578029724074226">Soubor <ph name="FILE_NAME" /> obsahuje citlivá data. Vaše organizace vám umožní uložit ho do cloudového úložiště nebo ho zahodit</translation> <translation id="7408080603962564527">Tento název uvidí ostatní</translation> <translation id="740810853557944681">Přidání tiskového serveru</translation> <translation id="7409549334477097887">Velmi velký</translation> @@ -9250,6 +9247,7 @@ <translation id="7434969625063495310">Přidání tiskového serveru se nezdařilo. Zkontrolujte konfiguraci serveru a zkuste to znovu.</translation> <translation id="7436921188514130341">Aj, chyba! Při přejmenovávání došlo k chybě.</translation> <translation id="7439519621174723623">Pokud chcete pokračovat, přidejte název zařízení</translation> +<translation id="743982235360757672">Mějte při procházení po ruce režim AI</translation> <translation id="7441736532026945583">Výběrem možnosti Skrýt skupinu odstraňte skupinu z lišty karet</translation> <translation id="7441736921018636843">Chcete-li toto nastavení změnit, <ph name="BEGIN_LINK" />resetováním synchronizace<ph name="END_LINK" /> odstraňte svou heslovou frázi pro synchronizaci</translation> <translation id="7441830548568730290">Ostatní uživatelé</translation> @@ -9988,7 +9986,6 @@ <translation id="794676567536738329">Potvrdit oprávnění</translation> <translation id="7947962633355574091">K&opírovat adresu souboru videa</translation> <translation id="7947964080535614577">Weby obvykle zobrazují reklamy, aby mohly poskytovat obsah nebo služby bez dalších poplatků. Některé weby ale zobrazují rušivé nebo zavádějící reklamy.</translation> -<translation id="7948239795436419268">Neobnovovat okna</translation> <translation id="7948407723851303488">Všechny stránky domény <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Důvod: LBS podporuje pouze adresy URL se schématem http://, https:// nebo file://.</translation> <translation id="7950814699499457511">Zapnuto • Pro toto rozšíření nebyly publikovány postupy v oblasti ochrany soukromí, například informace o tom, jak shromažďuje a používá data</translation> @@ -11176,7 +11173,6 @@ <translation id="8751034568832412184">Škola</translation> <translation id="8751329102746373229">Od vašeho administrátora</translation> <translation id="8752451679755290210">Přecházet mezi položkami automaticky</translation> -<translation id="8753948258138515839">Aplikace Soubory umožňuje rychlý přístup k souborům, které jste uložili na Disk Google, externí úložiště nebo zařízení se systémem ChromeOS Flex.</translation> <translation id="8754200782896249056"><p>Při spuštění aplikace <ph name="PRODUCT_NAME" /> v podporovaném počítačovém prostředí se použijí systémová nastavení proxy serveru. Váš systém však buď není podporován, nebo došlo k problému se spuštěním konfigurace systému.</p> <p>Konfiguraci můžete provést pomocí příkazového řádku. Další informace o příznacích a proměnných prostředí zobrazíte zadáním příkazu: <code>man <ph name="PRODUCT_BINARY_NAME" /></code>.</p></translation> @@ -11971,6 +11967,7 @@ <translation id="992778845837390402">Probíhá zálohování kontejneru systému Linux</translation> <translation id="994087375490600917">Boční panely</translation> <translation id="994289308992179865">&Opakovat</translation> +<translation id="995420352808264005">Vyberte typ registrace zařízení</translation> <translation id="995755448277384931">Přidání čísla IBAN</translation> <translation id="996250603853062861">Navazování zabezpečeného připojení...</translation> <translation id="997143476478634194">Weby, které navštívíte, se automaticky řídí tímto nastavením. Weby obvykle zasílají oznámení, kterými vás informují o mimořádných zprávách nebo zprávách v chatu.</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb index d688237..45560564 100644 --- a/chrome/app/resources/generated_resources_cy.xtb +++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Nid oes modd lawrlwytho ffeiliau anodiadau prif nod. Rhowch gynnig arall arni'n nes ymlaen.</translation> <translation id="1103523840287552314">Cyfieithu <ph name="LANGUAGE" /> bob amser</translation> <translation id="1104098698795583187">Byddwch yn colli mynediad at y grŵp tabiau hwn ar unwaith, a bydd yn cael ei ddileu o'ch holl ddyfeisiau</translation> +<translation id="1105934302947321130">Google Beam gyda Zoom</translation> <translation id="1106270460549661906">Peidio â rhannu gyda Gemini</translation> <translation id="1106350001632362876">Cynyddu'r trothwy</translation> <translation id="110850812463801904">Cysylltu ag OneDrive yn bwrpasol</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Nid yw eich allwedd ddiogelwch yn cael ei amddiffyn gan PIN. I reoli data mewngofnodi, crëwch PIN yn gyntaf.</translation> <translation id="1179400851034021914">IBAN yn annilys</translation> <translation id="1179902906564467236">Dilynwch y cyfarwyddiadau ar eich ffôn neu defnyddiwch yr ap camera</translation> -<translation id="1180117276105724040">Wrthi'n adfer ffenestri o'ch sesiwn flaenorol...</translation> <translation id="118057123461613219">Arbedion enfawr</translation> <translation id="1181037720776840403">Dileu</translation> <translation id="1182876754474670069">cartref</translation> @@ -765,7 +765,6 @@ <translation id="151501797353681931">Mewnforiwyd o Safari</translation> <translation id="1515163294334130951">Lansio</translation> <translation id="1517467582299994451">I gastio gyda chod, trowch osodiadau cysoni Porwr Chrome ymlaen</translation> -<translation id="1519090060276706457">Mae'n cymryd mwy o amser na'r disgwyl i adfer ffenestri</translation> <translation id="1521442365706402292">Rheoli tystysgrifau</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">Yma heddiw</translation> @@ -1114,6 +1113,7 @@ <translation id="1745732479023874451">Rheoli cysylltiadau</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}zero{Agor a golygu # ffeil yn yr ap gwe hwn?}two{Agor a golygu # ffeil yn yr ap gwe hwn?}few{Agor a golygu # ffeil yn yr ap gwe hwn?}many{Agor a golygu # o ffeiliau yn yr ap gwe hwn?}other{Agor a golygu # o ffeiliau yn yr ap gwe hwn?}}</translation> <translation id="1748563609363301860">Gallwch gadw'r cyfrinair hwn yn eich Cyfrif Google neu ar y ddyfais hon yn unig</translation> +<translation id="1749645492410897998">Wrthi'n gosod meddalwedd</translation> <translation id="1749733017156547309">Mae angen cyfrinair</translation> <translation id="1750172676754093297">Ni all eich allwedd ddiogelwch storio olion bysedd</translation> <translation id="1750238553597293878">Parhewch i ddefnyddio'r cyfrineiriau yn eich Cyfrif Google</translation> @@ -1185,7 +1185,6 @@ <translation id="1796460466266263589">I barhau i ddefnyddio Gemini, gwiriwch mai chi sydd yno</translation> <translation id="1796588414813960292">Ni fydd nodweddion sy'n gofyn am sain yn gweithio</translation> <translation id="1798726622311813209">Cardiau credyd a debyd</translation> -<translation id="1799852120691957794">Methu adfer ffenestri o'ch sesiwn flaenorol</translation> <translation id="180203835522132923">Search + O, yna W</translation> <translation id="1802624026913571222">Cysgu pan fydd y gorchudd ar gau</translation> <translation id="1802687198411089702">Nid yw'r dudalen yn ymateb. Gallwch aros amdani neu adael.</translation> @@ -2382,7 +2381,6 @@ <translation id="2610374175948698697">Yn gallu gweld ffeiliau neu ffolderi ar eich dyfais</translation> <translation id="2610780100389066815">Llofnodi Rhestr Ymddiried Microsoft</translation> <translation id="261114180663074524">Mewngofnodwch i'ch cyfrif Microsoft ac yna rhowch gynnig arall arni</translation> -<translation id="2611702650078660078">Bu gwall</translation> <translation id="2611776654555141051">Offeryn Petryal</translation> <translation id="2611885296070244383">Meic (mewnol)</translation> <translation id="2612676031748830579">Rhif y cerdyn</translation> @@ -2746,7 +2744,6 @@ <translation id="285033512555869047">Wedi cau</translation> <translation id="2850541429955027218">Ychwanegu thema</translation> <translation id="2851291081585704741">Rydych chi all-lein</translation> -<translation id="2852045827873867442">Mae angen cysylltiad rhyngrwyd.</translation> <translation id="285237063405807022">(wrthi'n llwytho)</translation> <translation id="2853121255651601031">Cadwyd y Cyfrinair</translation> <translation id="2854453262159518435">Disodli'r grŵp tabiau presennol</translation> @@ -3613,6 +3610,7 @@ <translation id="3473241910002674503">Gallwch lywio i'r dudalen hafan, yn ôl, a newid apiau gyda botymau yn y modd tabled.</translation> <translation id="3473479545200714844">Chwyddwydr sgrîn</translation> <translation id="3474218480460386727">Defnyddiwch 99 llythyren neu lai ar gyfer geiriau newydd</translation> +<translation id="3474330892505468100">Google Beam gyda Meet</translation> <translation id="3474624961160222204">Parhau fel <ph name="NAME" /></translation> <translation id="3477772589943384839">Sicrhewch arbedion cof cymedrol. Bydd eich tabiau'n dod yn anweithredol ar ôl cyfnod hirach o amser.</translation> <translation id="347785443197175480">Parhau i ganiatáu i <ph name="HOST" /> gael mynediad at eich camera a'ch meicroffon</translation> @@ -5501,7 +5499,6 @@ <translation id="4779766576531456629">Ail-enwi rhwydwaith symudol eSIM</translation> <translation id="4780321648949301421">Cadw Tudalen Fel...</translation> <translation id="4780558987886269159">Ar gyfer gwaith</translation> -<translation id="4781633367688946589">Parhau i sesiwn newydd</translation> <translation id="4784349455504343791">Mae <ph name="WEBSITE_ORIGIN" /> eisiau defnyddio gwybodaeth bersonol o'ch waled ddigidol.</translation> <translation id="4785719467058219317">Rydych yn defnyddio allwedd ddiogelwch nad yw wedi'i chofrestru gyda'r wefan hon</translation> <translation id="4785914069240823137">Canslo Tocio</translation> @@ -6290,6 +6287,7 @@ <translation id="5337926771328966926">Enw presennol y ddyfais yw <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Gallwch bori'n breifat gan ddefnyddio ffenestr Anhysbys</translation> <translation id="5338503421962489998">Storfa leol</translation> +<translation id="5340620183031438925">I ofyn i'r Dull AI am eich tab heb adael y dudalen, cadarnhewch mai chi sydd yno. Byddwch hefyd yn cael eich cyfrineiriau a rhagor ar eich holl ddyfeisiau.</translation> <translation id="5340787663756381836">&Canfod a golygu</translation> <translation id="5340900621595888432">Anfon data diagnosteg a data defnydd</translation> <translation id="5341793073192892252">Cafodd y cwcis canlynol eu rhwystro (caiff cwcis trydydd parti eu rhwystro heb eithriad)</translation> @@ -7476,7 +7474,6 @@ <translation id="6180550893222597997">Pa god pas ydych chi am ei ddefnyddio ar gyfer <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Weithiau mae apiau'n diweddaru eu brandio. Adolygu'r holl newidiadau i wneud yn siŵr eich bod yn gyfforddus â nhw cyn diweddaru.</translation> <translation id="6181431612547969857">Rhwystrwyd y lawrlwythiad</translation> -<translation id="6182100780603067202">Rhannu sain ap hefyd (o'i holl ffenestri)</translation> <translation id="6183369864942961155">Thema golau/tywyll awtomatig</translation> <translation id="6183773856988300112">Mae Gemini yn Chrome yn defnyddio pori awtomatig i weithio yn eich tabiau a chwblhau tasgau rydych yn eu rhoi iddo. <ph name="LINK_BEGIN" />Dysgu rhagor<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Chwilio Tabiau</translation> @@ -8277,7 +8274,6 @@ <translation id="6754359471209693699">Dechrau chwiliad newydd</translation> <translation id="6754918760968695779">Mewnosod Cyflym</translation> <translation id="6755702685749429945">Ychwanegu geiriadur</translation> -<translation id="6756157672127672536">Mae'r ap Files yn darparu mynediad cyflym at ffeiliau rydych wedi'u cadw ar Google Drive, storfa allanol, neu'ch dyfais ChromeOS.</translation> <translation id="6756643207511618722">Peiriannau lleferydd</translation> <translation id="6757431299485455321">Helpu dyfeisiau eraill i ddod o hyd i'r poethfan hwn.</translation> <translation id="6758056191028427665">Rhannwch eich barn gyda ni.</translation> @@ -9223,6 +9219,7 @@ <translation id="7406912950279255498">Modd gwrthdroad lliw</translation> <translation id="7407430846095439694">Mewnforio a Rhwymo</translation> <translation id="7407504355934009739">Mae'r rhan fwyaf o bobl yn rhwystro hysbysiadau o'r wefan hon</translation> +<translation id="7407578029724074226">Mae gan <ph name="FILE_NAME" /> ddata sensitif. Bydd eich sefydliad yn gadael i chi eu cadw i storfa'r cwmwl neu eu gwaredu</translation> <translation id="7408080603962564527">Bydd hyn yn weladwy i eraill</translation> <translation id="740810853557944681">Ychwanegu gweinydd argraffu</translation> <translation id="7409549334477097887">Mawr iawn</translation> @@ -9276,6 +9273,7 @@ <translation id="7434969625063495310">Ni ellid ychwanegu gweinydd yr argraffydd. Gwiriwch ffurfweddiad y gweinydd a rhowch gynnig arall arni.</translation> <translation id="7436921188514130341">Damo! Bu gwall wrth ailenwi.</translation> <translation id="7439519621174723623">Ychwanegwch enw dyfais i barhau</translation> +<translation id="743982235360757672">Cadwch y Dull AI gerllaw wrth bori</translation> <translation id="7441736532026945583">Dewiswch "Cuddio Grŵp" i dynnu'r grŵp o'ch stribed tabiau</translation> <translation id="7441736921018636843">I newid y gosodiad hwn, <ph name="BEGIN_LINK" />ail-osodwch gysoni<ph name="END_LINK" /> i dynnu eich cyfrinymadrodd cysoni</translation> <translation id="7441830548568730290">Defnyddwyr eraill</translation> @@ -10014,7 +10012,6 @@ <translation id="794676567536738329">Cadarnhau Caniatadau</translation> <translation id="7947962633355574091">C&opïo Cyfeiriad Fideo</translation> <translation id="7947964080535614577">Mae gwefannau fel arfer yn dangos hysbysebion fel y gallant ddarparu cynnwys neu wasanaethau'n ddi-dâl. Ond, mae'n hysbys bod rhai gwefannau yn dangos hysbysebion ymwthiol neu gamarweiniol.</translation> -<translation id="7948239795436419268">Peidio ag adfer ffenestri</translation> <translation id="7948407723851303488">Pob tudalen o <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Rheswm: Dim ond cyfeiriadau URL http://, https://, a file:// y mae LBS yn eu cefnogi.</translation> <translation id="7950814699499457511">Ymlaen • Nid yw'r estyniad hwn wedi cyhoeddi arferion preifatrwydd, megis sut mae'n casglu a defnyddio data</translation> @@ -11203,7 +11200,6 @@ <translation id="8751034568832412184">Ysgol</translation> <translation id="8751329102746373229">Gan eich gweinyddwr</translation> <translation id="8752451679755290210">Symud rhwng eitemau'n awtomatig</translation> -<translation id="8753948258138515839">Mae'r ap Files yn darparu mynediad cyflym at ffeiliau rydych wedi'u cadw ar Google Drive, storfa allanol, neu'ch dyfais ChromeOS Flex.</translation> <translation id="8754200782896249056"><p>Wrth redeg <ph name="PRODUCT_NAME" /> o dan amgylchedd bwrdd gwaith a gefnogir, bydd gosodiadau dirprwyol y system yn cael eu defnyddio. Fodd bynnag, naill ai nid yw'ch system yn cael ei chefnogi neu roedd problem wrth lansio ffurfweddiad eich system.</p> <p>Ond gallwch ffurfweddu drwy'r llinell orchymyn o hyd. Gweler <code>man <ph name="PRODUCT_BINARY_NAME" /></code> am ragor o wybodaeth am fflagiau a newidynnau amgylchedd.</p></translation> @@ -12000,6 +11996,7 @@ <translation id="992778845837390402">Wrthi'n gwneud copi wrth gefn o Linux ar hyn o bryd</translation> <translation id="994087375490600917">Paneli ochr</translation> <translation id="994289308992179865">&Dolen</translation> +<translation id="995420352808264005">Dewiswch fath o gofrestru dyfais</translation> <translation id="995755448277384931">Ychwanegu'r IBAN</translation> <translation id="996250603853062861">Wrthi'n sefydlu cysylltiad diogel...</translation> <translation id="997143476478634194">Bydd gwefannau'n dilyn y gosodiad hwn yn awtomatig wrth i chi ymweld â nhw. Mae gwefannau fel arfer yn anfon hysbysiadau i roi gwybod i chi am newyddion yn torri neu negeseuon sgwrsio.</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index ea9ee6e4..fcf52dac2 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Annoteringsfilerne for den primære node kan ikke downloades. Prøv igen senere.</translation> <translation id="1103523840287552314">Oversæt altid <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Du mister øjeblikkeligt adgang til denne fanegruppe, og den slettes fra alle dine enheder</translation> +<translation id="1105934302947321130">Google Beam med Zoom</translation> <translation id="1106270460549661906">Del ikke med Gemini</translation> <translation id="1106350001632362876">Hæv grænsen</translation> <translation id="110850812463801904">Opret manuelt forbindelse til OneDrive</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Din sikkerhedsnøgle er ikke beskyttet med en pinkode. Opret en pinkode for at administrere logindata.</translation> <translation id="1179400851034021914">IBAN er ugyldigt</translation> <translation id="1179902906564467236">Følg vejledningen på din telefon, eller brug kameraappen</translation> -<translation id="1180117276105724040">Gendanner vinduer fra din tidligere session…</translation> <translation id="118057123461613219">Store hukommelsesbesparelser</translation> <translation id="1181037720776840403">Fjern</translation> <translation id="1182876754474670069">Home</translation> @@ -763,7 +763,6 @@ <translation id="151501797353681931">Importeret fra Safari</translation> <translation id="1515163294334130951">Start</translation> <translation id="1517467582299994451">Aktivér indstillingerne for synkronisering af Chrome-browseren for at caste med en kode</translation> -<translation id="1519090060276706457">Det tager længere tid end forventet at gendanne vinduer</translation> <translation id="1521442365706402292">Administrer certifikater</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">Aktiv i dag</translation> @@ -1112,6 +1111,7 @@ <translation id="1745732479023874451">Administrer kontakter</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}one{Vil du åbne og redigere # fil i denne webapp?}other{Vil du åbne og redigere # filer i denne webapp?}}</translation> <translation id="1748563609363301860">Du kan gemme denne adgangskode på din Google-konto eller kun på denne enhed</translation> +<translation id="1749645492410897998">Software installeres</translation> <translation id="1749733017156547309">En adgangskode er påkrævet</translation> <translation id="1750172676754093297">Din sikkerhedsnøgle kan ikke gemme fingeraftryk</translation> <translation id="1750238553597293878">Fortsæt med at bruge adgangskoderne på din Google-konto</translation> @@ -1183,7 +1183,6 @@ <translation id="1796460466266263589">Hvis du vil fortsætte med at bruge Gemini, skal du verificere din identitet</translation> <translation id="1796588414813960292">Funktioner, der skal bruge lyd, fungerer ikke</translation> <translation id="1798726622311813209">Betalingskort</translation> -<translation id="1799852120691957794">Vinduerne fra din forrige session kan ikke gendannes</translation> <translation id="180203835522132923">Søgetasten+O efterfulgt af W</translation> <translation id="1802624026913571222">Gå i dvale, når skærmen er slået ned</translation> <translation id="1802687198411089702">Siden svarer ikke. Du kan vente på den eller afslutte.</translation> @@ -2381,7 +2380,6 @@ <translation id="2610374175948698697">Kan se filer eller mapper på din enhed</translation> <translation id="2610780100389066815">Microsoft-signering af tillidslister</translation> <translation id="261114180663074524">Log ind på din Microsoft-konto, og prøv igen</translation> -<translation id="2611702650078660078">Der opstod en fejl</translation> <translation id="2611776654555141051">Rektangelværktøj</translation> <translation id="2611885296070244383">Mikrofon (indbygget)</translation> <translation id="2612676031748830579">Kortnummer</translation> @@ -2745,7 +2743,6 @@ <translation id="285033512555869047">Lukket</translation> <translation id="2850541429955027218">Tilføj tema</translation> <translation id="2851291081585704741">Du er offline</translation> -<translation id="2852045827873867442">Dette kræver internetforbindelse.</translation> <translation id="285237063405807022">(indlæser)</translation> <translation id="2853121255651601031">Adgangskoden er blevet gemt</translation> <translation id="2854453262159518435">Erstat eksisterende fanegruppe</translation> @@ -3612,6 +3609,7 @@ <translation id="3473241910002674503">Gå til startsiden, gå tilbage, og skift mellem apps ved hjælp af knapperne i tablettilstand.</translation> <translation id="3473479545200714844">Skærmforstørrer</translation> <translation id="3474218480460386727">Nye ord må højst være på 99 bogstaver</translation> +<translation id="3474330892505468100">Google Beam med Meet</translation> <translation id="3474624961160222204">Fortsæt som <ph name="NAME" /></translation> <translation id="3477772589943384839">Få moderate hukommelsesbesparelser. Dine faner bliver inaktive efter en længere periode.</translation> <translation id="347785443197175480">Tillad fortsat, at <ph name="HOST" /> har adgang til dit kamera og din mikrofon</translation> @@ -5500,7 +5498,6 @@ <translation id="4779766576531456629">Omdøb eSIM-kortmobilnetværk</translation> <translation id="4780321648949301421">Gem side som...</translation> <translation id="4780558987886269159">Til arbejde</translation> -<translation id="4781633367688946589">Fortsæt til ny session</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> vil gerne bruge personlige oplysninger fra din digitale pung.</translation> <translation id="4785719467058219317">Du bruger en sikkerhedsnøgle, som ikke er registreret på dette website</translation> <translation id="4785914069240823137">Annuller beskæring</translation> @@ -6289,6 +6286,7 @@ <translation id="5337926771328966926">Navnet på den aktuelle enhed er <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Du kan bruge nettet privat ved hjælp af et inkognitovindue</translation> <translation id="5338503421962489998">Lokalt lager</translation> +<translation id="5340620183031438925">Hvis du vil spørge AI-tilstand om din fane uden at forlade siden, skal du verificere din identitet. Du kan også se dine adgangskoder m.m. på alle dine enheder.</translation> <translation id="5340787663756381836">&Find og rediger</translation> <translation id="5340900621595888432">Send diagnostik- og brugsdata</translation> <translation id="5341793073192892252">Følgende cookies blev blokeret (cookies fra tredjeparter blokeres uden undtagelse)</translation> @@ -7475,7 +7473,6 @@ <translation id="6180550893222597997">Hvilken adgangsnøgle vil du bruge til <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Nogle gange opdateres brandingen af apps. Gennemgå alle ændringer for at sikre, at du er tryg ved dem, før du opdaterer.</translation> <translation id="6181431612547969857">Downloaden blev blokeret</translation> -<translation id="6182100780603067202">Del også applyd (fra alle dens vinduer)</translation> <translation id="6183369864942961155">Automatisk Lyst/Mørkt tema</translation> <translation id="6183773856988300112">Gemini i Chrome bruger automatisk browsing til at arbejde på dine faner og udføre de opgaver, du giver den. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Søg i faner</translation> @@ -8270,7 +8267,6 @@ <translation id="6754359471209693699">Start en ny søgning</translation> <translation id="6754918760968695779">Hurtigindsættelse</translation> <translation id="6755702685749429945">Tilføj ordbog</translation> -<translation id="6756157672127672536">Appen Filer giver hurtig adgang til filer, som du har gemt i Google Drev, på et eksternt lager eller på din ChromeOS-enhed.</translation> <translation id="6756643207511618722">Oplæsningsmaskiner</translation> <translation id="6757431299485455321">Hjælp andre enheder med at finde dette hotspot.</translation> <translation id="6758056191028427665">Fortæl os, hvad du synes.</translation> @@ -9217,6 +9213,7 @@ <translation id="7406912950279255498">Tilstand for ombytning af farver</translation> <translation id="7407430846095439694">Importér og tilknyt</translation> <translation id="7407504355934009739">Folk blokerer som regel notifikationer fra dette website</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> indeholder følsomme oplysninger. Din organisation giver dig mulighed for at gemme den i lagerplads i skyen eller kassere den</translation> <translation id="7408080603962564527">Dette vil være synligt for andre</translation> <translation id="740810853557944681">Tilføj en printerserver</translation> <translation id="7409549334477097887">Ekstra stor</translation> @@ -9270,6 +9267,7 @@ <translation id="7434969625063495310">Der kunne ikke tilføjes en printerserver. Tjek serverens konfiguration, og prøv igen.</translation> <translation id="7436921188514130341">Øv, surt! Der opstod en fejl under omdøbningen.</translation> <translation id="7439519621174723623">Tilføj en enhed for at fortsætte</translation> +<translation id="743982235360757672">Hav AI-tilstand ved hånden, mens du browser</translation> <translation id="7441736532026945583">Vælg "Skjul gruppe" for at fjerne gruppen fra din fanelinje</translation> <translation id="7441736921018636843">Hvis du vil ændre denne indstilling, skal du <ph name="BEGIN_LINK" />nulstille synkronisering<ph name="END_LINK" /> for at fjerne din adgangssætning for synkronisering</translation> <translation id="7441830548568730290">Andre brugere</translation> @@ -10008,7 +10006,6 @@ <translation id="794676567536738329">Bekræft tilladelser</translation> <translation id="7947962633355574091">K&opiér webadressen til videoen</translation> <translation id="7947964080535614577">Websites viser normalt annoncer, så de kan levere indhold eller tjenester uden omkostninger. Nogle websites er dog kendt for at vise påtrængende eller vildledende annoncer.</translation> -<translation id="7948239795436419268">Gendan ikke vinduer</translation> <translation id="7948407723851303488">Alle sider på <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Årsag: LBS understøtter kun http://-, https://- og file://-webadresser.</translation> <translation id="7950814699499457511">Til • Denne udvidelse har ikke offentliggjort privatlivsprocedurer, f.eks. hvordan den indsamler og bruger data</translation> @@ -11197,7 +11194,6 @@ <translation id="8751034568832412184">Skole</translation> <translation id="8751329102746373229">Fra din administrator</translation> <translation id="8752451679755290210">Gå automatisk frem og tilbage mellem elementer</translation> -<translation id="8753948258138515839">Appen Filer giver hurtig adgang til filer, som du har gemt i Google Drev, på et eksternt lager eller på din ChromeOS Flex-enhed.</translation> <translation id="8754200782896249056"><p>Når <ph name="PRODUCT_NAME" /> kører i et understøttet computermiljø, anvendes systemets proxyindstillinger. Dit system understøttes imidlertid ikke, eller også er der opstået et problem ved opstart af din systemkonfiguration. </p> @@ -11992,6 +11988,7 @@ <translation id="992778845837390402">Linux er i øjeblikket ved at blive sikkerhedskopieret</translation> <translation id="994087375490600917">Sidepaneler</translation> <translation id="994289308992179865">&Sløjfe</translation> +<translation id="995420352808264005">Vælg type af tilmelding af enhed</translation> <translation id="995755448277384931">Tilføj IBAN</translation> <translation id="996250603853062861">Etablerer sikker forbindelse...</translation> <translation id="997143476478634194">Websites følger automatisk denne indstilling, når du besøger dem. Websites sender normalt notifikationer for at informere dig om breaking news eller chatbeskeder.</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 6155ef0..5f2fc8b 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Dateien zur Annotation von Hauptknoten können nicht heruntergeladen werden. Versuch es später noch einmal.</translation> <translation id="1103523840287552314"><ph name="LANGUAGE" /> immer übersetzen</translation> <translation id="1104098698795583187">Du verlierst dann sofort den Zugriff auf diese Tabgruppe und sie wird von allen deinen Geräten gelöscht</translation> +<translation id="1105934302947321130">Google Beam mit Zoom</translation> <translation id="1106270460549661906">Teilen mit Gemini aufheben</translation> <translation id="1106350001632362876">Schwellenwert erhöhen</translation> <translation id="110850812463801904">Manuell mit OneDrive verbinden</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Dein Sicherheitsschlüssel ist nicht durch eine PIN geschützt. Erstelle zuerst eine PIN, um die Anmeldedaten zu verwalten.</translation> <translation id="1179400851034021914">IBAN ist ungültig</translation> <translation id="1179902906564467236">Folge der Anleitung auf deinem Smartphone oder verwende die Kamera</translation> -<translation id="1180117276105724040">Fenster aus der vorherigen Sitzung werden wiederhergestellt…</translation> <translation id="118057123461613219">Sehr große Einsparungen</translation> <translation id="1181037720776840403">Entfernen</translation> <translation id="1182876754474670069">Pos1</translation> @@ -758,7 +758,6 @@ <translation id="151501797353681931">Von Safari importiert</translation> <translation id="1515163294334130951">Starten</translation> <translation id="1517467582299994451">Wenn du mit einem Code streamen möchtest, musst du die Synchronisierungseinstellungen des Chrome-Browsers aktivieren</translation> -<translation id="1519090060276706457">Das Wiederherstellen von Fenstern dauert länger als erwartet</translation> <translation id="1521442365706402292">Zertifikate verwalten</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">Heute aktiv</translation> @@ -1099,6 +1098,7 @@ <translation id="1745732479023874451">Kontakte verwalten</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{# Dateien in dieser Web-App öffnen und bearbeiten?}}</translation> <translation id="1748563609363301860">Du kannst dieses Passwort entweder in deinem Google-Konto oder nur auf diesem Gerät speichern</translation> +<translation id="1749645492410897998">Software wird installiert…</translation> <translation id="1749733017156547309">Es ist ein Passwort erforderlich</translation> <translation id="1750172676754093297">Auf deinem Sicherheitsschlüssel können keine Fingerabdrücke gespeichert werden</translation> <translation id="1750238553597293878">Passwörter in deinem Google-Konto weiterhin verwenden</translation> @@ -1170,7 +1170,6 @@ <translation id="1796460466266263589">Bestätige deine Identität, um Gemini weiter zu verwenden</translation> <translation id="1796588414813960292">Funktionen, die Ton erfordern, funktionieren dann nicht</translation> <translation id="1798726622311813209">Kredit- und Debitkarten</translation> -<translation id="1799852120691957794">Fenster aus der vorherigen Sitzung können nicht wiederhergestellt werden</translation> <translation id="180203835522132923">Suchtaste + O, anschließend W</translation> <translation id="1802624026913571222">Beim Zuklappen in den Ruhemodus wechseln</translation> <translation id="1802687198411089702">Die Seite reagiert nicht. Du kannst warten, bis sie wieder reagiert, oder sie schließen.</translation> @@ -2363,7 +2362,6 @@ <translation id="2610374175948698697">Können Dateien und Ordner auf meinem Gerät ansehen</translation> <translation id="2610780100389066815">Microsoft-Vertrauenslistensignatur</translation> <translation id="261114180663074524">Melde dich in deinem Microsoft-Konto an und versuch es dann noch einmal</translation> -<translation id="2611702650078660078">Ein Fehler ist aufgetreten</translation> <translation id="2611776654555141051">Rechtecktool</translation> <translation id="2611885296070244383">Mikrofon (intern)</translation> <translation id="2612676031748830579">Kartennummer</translation> @@ -2727,7 +2725,6 @@ <translation id="285033512555869047">Geschlossen</translation> <translation id="2850541429955027218">Design hinzufügen</translation> <translation id="2851291081585704741">Du bist offline</translation> -<translation id="2852045827873867442">Eine Internetverbindung ist erforderlich.</translation> <translation id="285237063405807022">(wird geladen)</translation> <translation id="2853121255651601031">Passwort gespeichert</translation> <translation id="2854453262159518435">Vorhandene Tabgruppe ersetzen</translation> @@ -3592,6 +3589,7 @@ <translation id="3473241910002674503">Mit den Buttons im Tablet-Modus zum Launcher, zurück und zwischen Apps wechseln.</translation> <translation id="3473479545200714844">Lupe</translation> <translation id="3474218480460386727">Neue Wörter dürfen maximal 99 Buchstaben lang sein</translation> +<translation id="3474330892505468100">Google Beam mit Meet</translation> <translation id="3474624961160222204">Als <ph name="NAME" /> fortfahren</translation> <translation id="3477772589943384839">Du erzielst mäßige Arbeitsspeichereinsparungen. Deine Tabs werden nach längerer Zeit inaktiv.</translation> <translation id="347785443197175480"><ph name="HOST" /> weiterhin Zugriff auf Kamera und Mikrofon gestatten</translation> @@ -5480,7 +5478,6 @@ <translation id="4779766576531456629">eSIM-Mobilfunknetz umbenennen</translation> <translation id="4780321648949301421">Seite speichern unter...</translation> <translation id="4780558987886269159">Für die Arbeit</translation> -<translation id="4781633367688946589">Mit neuer Sitzung fortfahren</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> möchte personenbezogene Daten aus deinem digitalen Wallet verwenden.</translation> <translation id="4785719467058219317">Du verwendest einen Sicherheitsschlüssel, der nicht auf dieser Website registriert ist</translation> <translation id="4785914069240823137">Zuschneiden abbrechen</translation> @@ -6267,6 +6264,7 @@ <translation id="5337926771328966926">Der aktuelle Gerätename ist <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">In einem Inkognitofenster kannst du privat surfen</translation> <translation id="5338503421962489998">Lokaler Speicher</translation> +<translation id="5340620183031438925">Wenn du im KI-Modus Fragen zu Inhalten auf deinem Tab stellen möchtest, ohne die Seite zu verlassen, bestätige deine Identität. Du kannst dann auch auf allen deinen Geräten auf deine Passwörter und weitere Daten zugreifen.</translation> <translation id="5340787663756381836">&Suchen und bearbeiten</translation> <translation id="5340900621595888432">Diagnose- und Nutzungsdaten senden</translation> <translation id="5341793073192892252">Die folgenden Cookies wurden blockiert (Cookies von Drittanbietern werden ausnahmslos blockiert)</translation> @@ -7450,7 +7448,6 @@ <translation id="6180550893222597997">Welchen Passkey möchtest du für <ph name="APP_NAME" /> verwenden?</translation> <translation id="6181218116951226898">Apps aktualisieren manchmal ihr Branding. Überprüfe, ob du mit allen Änderungen einverstanden bist, bevor du das Update durchführst.</translation> <translation id="6181431612547969857">Download blockiert</translation> -<translation id="6182100780603067202">Auch Audio der App teilen (aus allen Fenstern)</translation> <translation id="6183369864942961155">Automatisches helles/dunkles Design</translation> <translation id="6183773856988300112">Gemini in Chrome nutzt automatisches Browsen, um Aufgaben auf deinen Tabs zu erledigen. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Tabs suchen</translation> @@ -8243,7 +8240,6 @@ <translation id="6754359471209693699">Neue Suche starten</translation> <translation id="6754918760968695779">Schnelles Einfügen</translation> <translation id="6755702685749429945">Wörterbuch hinzufügen</translation> -<translation id="6756157672127672536">Mit der App „Dateien“ erhältst du schnellen Zugriff auf Dateien, die du in Google Drive, auf externen Speichermedien oder auf deinem Chrome OS-Gerät gespeichert hast.</translation> <translation id="6756643207511618722">Sprach-Engines</translation> <translation id="6757431299485455321">Hilf anderen Geräten, diesen Hotspot zu finden.</translation> <translation id="6758056191028427665">Teile uns mit, wie zufrieden du mit uns bist.</translation> @@ -9190,6 +9186,7 @@ <translation id="7406912950279255498">Farbumkehrmodus</translation> <translation id="7407430846095439694">Importieren und binden</translation> <translation id="7407504355934009739">Die meisten Nutzer blockieren Benachrichtigungen von dieser Website</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> enthält sensible Informationen. Deine Organisation erlaubt dir, die Datei im Cloud-Speicher zu speichern oder zu verwerfen.</translation> <translation id="7408080603962564527">Für andere sichtbar</translation> <translation id="740810853557944681">Druckserver hinzufügen</translation> <translation id="7409549334477097887">Sehr groß</translation> @@ -9243,6 +9240,7 @@ <translation id="7434969625063495310">Der Druckserver konnte nicht hinzugefügt werden. Prüfe die Konfiguration des Servers und versuche es noch einmal.</translation> <translation id="7436921188514130341">Oh nein! Beim Umbenennen ist ein Fehler aufgetreten.</translation> <translation id="7439519621174723623">Gib einen Gerätenamen ein, um fortzufahren</translation> +<translation id="743982235360757672">KI-Modus beim Surfen im Web immer bereithalten</translation> <translation id="7441736532026945583">Wähle „Gruppe ausblenden“ aus, um die Gruppe von deiner Tableiste zu entfernen</translation> <translation id="7441736921018636843">Wenn du diese Einstellung ändern möchtest, musst du die <ph name="BEGIN_LINK" />Synchronisierung zurücksetzen<ph name="END_LINK" />, um die Synchronisierungspassphrase zu entfernen</translation> <translation id="7441830548568730290">Andere Nutzer</translation> @@ -9981,7 +9979,6 @@ <translation id="794676567536738329">Berechtigungen bestätigen</translation> <translation id="7947962633355574091">Videolink k&opieren</translation> <translation id="7947964080535614577">Websites zeigen normalerweise Werbung an, um Inhalte oder Dienste kostenlos anbieten zu können. Allerdings gibt es auch Websites, auf denen bekanntermaßen aufdringliche oder irreführende Werbung erscheint.</translation> -<translation id="7948239795436419268">Fenster nicht wiederherstellen</translation> <translation id="7948407723851303488">Alle Seiten von <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Grund: Die Unterstützung älterer Browser funktioniert nur mit URLs, die http://, https:// und file:// enthalten.</translation> <translation id="7950814699499457511">Aktiviert • Für diese Erweiterung wurden keine Informationen zum Umgang mit dem Datenschutz veröffentlicht, wie z. B. Informationen darüber, wie Daten erhoben und verwendet werden</translation> @@ -11170,7 +11167,6 @@ <translation id="8751034568832412184">Schule</translation> <translation id="8751329102746373229">Von deinem Administrator</translation> <translation id="8752451679755290210">Automatisch zwischen Elementen wechseln</translation> -<translation id="8753948258138515839">Mit der App „Dateien“ erhältst du schnellen Zugriff auf Dateien, die du in Google Drive, auf externen Speichermedien oder auf deinem Chrome OS Flex-Gerät gespeichert hast.</translation> <translation id="8754200782896249056"><p>Bei der Ausführung von <ph name="PRODUCT_NAME" /> in einer unterstützten Desktop-Umgebung werden die Proxy-Einstellungen des Systems verwendet. Allerdings wird entweder dein System nicht unterstützt oder deine Systemkonfiguration konnte nicht gestartet werden.</p> <p>Du kannst die Konfiguration dennoch über die Befehlszeile vornehmen. Weitere Informationen zu Markierungen und Umgebungsvariablen findest du unter <code>man <ph name="PRODUCT_BINARY_NAME" /></code>.</p></translation> @@ -11963,6 +11959,7 @@ <translation id="992778845837390402">Sicherung für Linux wird gerade ausgeführt</translation> <translation id="994087375490600917">Seitenleisten</translation> <translation id="994289308992179865">Sch&leife</translation> +<translation id="995420352808264005">Geräteregistrierungstyp auswählen</translation> <translation id="995755448277384931">IBAN hinzufügen</translation> <translation id="996250603853062861">Sichere Verbindung wird hergestellt...</translation> <translation id="997143476478634194">Wenn du Websites aufrufst, wird diese Einstellung automatisch angewendet. Websites senden normalerweise Benachrichtigungen, um dich über Eilmeldungen oder Chatnachrichten zu informieren.</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 7693989..992d060 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Δεν είναι δυνατή η λήψη αρχείων σχολιασμού κύριου κόμβου. Δοκιμάστε ξανά αργότερα.</translation> <translation id="1103523840287552314">Να μεταφράζονται πάντα τα <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Θα χάσετε αμέσως την πρόσβαση σε αυτή την ομάδα καρτελών και θα διαγραφεί από όλες τις συσκευές σας</translation> +<translation id="1105934302947321130">Google Beam με το Zoom</translation> <translation id="1106270460549661906">Κατάργηση κοινής χρήσης με το Gemini</translation> <translation id="1106350001632362876">Αύξηση ορίου</translation> <translation id="110850812463801904">Μη αυτόματη σύνδεση στο OneDrive</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Το κλειδί ασφαλείας σας δεν προστατεύεται από PIN. Για να διαχειριστείτε τα δεδομένα σύνδεσης, δημιουργήστε ένα PIN.</translation> <translation id="1179400851034021914">Το IBAN δεν είναι έγκυρο</translation> <translation id="1179902906564467236">Ακολουθήστε τις οδηγίες στο τηλέφωνό σας ή χρησιμοποιήστε την εφαρμογή κάμερας</translation> -<translation id="1180117276105724040">Επαναφορά παραθύρων από την προηγούμενη περίοδο λειτουργίας…</translation> <translation id="118057123461613219">Τεράστια εξοικονόμηση</translation> <translation id="1181037720776840403">Κατάργηση</translation> <translation id="1182876754474670069">σπίτι</translation> @@ -762,7 +762,6 @@ <translation id="151501797353681931">Εισήχθησαν Από το Safari</translation> <translation id="1515163294334130951">Έναρξη</translation> <translation id="1517467582299994451">Για να κάνετε μετάδοση με κωδικό, ενεργοποιήστε τις ρυθμίσεις συγχρονισμού του προγράμματος περιήγησης Chrome</translation> -<translation id="1519090060276706457">Η επαναφορά των παραθύρων διαρκεί περισσότερο από το αναμενόμενο</translation> <translation id="1521442365706402292">Διαχείριση πιστοποιητικών</translation> <translation id="1521655867290435174">Υπολογιστικά φύλλα Google</translation> <translation id="1521774566618522728">Ενεργή σήμερα</translation> @@ -1111,6 +1110,7 @@ <translation id="1745732479023874451">Διαχείριση επαφών</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{Θέλετε να ανοίξετε και να επεξεργαστείτε # αρχεία σε αυτή την εφαρμογή ιστού;}}</translation> <translation id="1748563609363301860">Μπορείτε να αποθηκεύσετε αυτόν τον κωδικό πρόσβασης στον Λογαριασμό σας Google ή μόνο σε αυτήν τη συσκευή.</translation> +<translation id="1749645492410897998">Εγκατάσταση λογισμικού</translation> <translation id="1749733017156547309">Απαιτείται κωδικός πρόσβασης</translation> <translation id="1750172676754093297">Αυτό το κλειδί ασφαλείας δεν μπορεί να αποθηκεύσει δακτυλικά αποτυπώματα.</translation> <translation id="1750238553597293878">Συνεχίστε να χρησιμοποιείτε τους κωδικούς πρόσβασης στον Λογαριασμό σας Google</translation> @@ -1182,7 +1182,6 @@ <translation id="1796460466266263589">Για να συνεχίσετε να χρησιμοποιείτε το Gemini, επαληθεύστε την ταυτότητά σας</translation> <translation id="1796588414813960292">Οι λειτουργίες που απαιτούν ήχο δεν θα είναι διαθέσιμες</translation> <translation id="1798726622311813209">Πιστωτικές και χρεωστικές κάρτες</translation> -<translation id="1799852120691957794">Δεν είναι δυνατή η επαναφορά των παραθύρων από την προηγούμενη περίοδο λειτουργίας</translation> <translation id="180203835522132923">Αναζήτηση + O και έπειτα W</translation> <translation id="1802624026913571222">Σε κατάσταση αδράνειας όταν το κάλυμμα είναι κλειστό</translation> <translation id="1802687198411089702">Η σελίδα δεν ανταποκρίνεται. Μπορείτε να περιμένετε ή να πραγματοποιήσετε έξοδο.</translation> @@ -2379,7 +2378,6 @@ <translation id="2610374175948698697">Μπορεί να βλέπει αρχεία ή φακέλους στη συσκευή σας</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">Συνδεθείτε στον λογαριασμό σας Microsoft και δοκιμάστε ξανά</translation> -<translation id="2611702650078660078">Προέκυψε σφάλμα</translation> <translation id="2611776654555141051">Εργαλείο ορθογώνιου παραλληλόγραμμου</translation> <translation id="2611885296070244383">Μικρόφωνο (εσωτερικό)</translation> <translation id="2612676031748830579">Αριθμός κάρτας</translation> @@ -2743,7 +2741,6 @@ <translation id="285033512555869047">Κλειστή</translation> <translation id="2850541429955027218">Προσθήκη θέματος</translation> <translation id="2851291081585704741">Είστε εκτός σύνδεσης</translation> -<translation id="2852045827873867442">Απαιτείται σύνδεση στο διαδίκτυο.</translation> <translation id="285237063405807022">(γίνεται φόρτωση)</translation> <translation id="2853121255651601031">Ο κωδικός πρόσβασης αποθηκεύτηκε</translation> <translation id="2854453262159518435">Αντικατάσταση υπάρχουσας ομάδας καρτελών</translation> @@ -3610,6 +3607,7 @@ <translation id="3473241910002674503">Πλοήγηση στην αρχική οθόνη, μετάβαση πίσω και εναλλαγή εφαρμογών με τα κουμπιά σε λειτουργία tablet.</translation> <translation id="3473479545200714844">Μεγεθυντής οθόνης</translation> <translation id="3474218480460386727">Χρησιμοποιήστε έως 99 γράμματα για τις νέες λέξεις.</translation> +<translation id="3474330892505468100">Google Beam με το Meet</translation> <translation id="3474624961160222204">Συνέχεια ως <ph name="NAME" /></translation> <translation id="3477772589943384839">Εξασφαλίστε μέτρια εξοικονόμηση μνήμης. Οι καρτέλες σας καθίστανται ανενεργές μετά από μεγαλύτερο χρονικό διάστημα.</translation> <translation id="347785443197175480">Να συνεχίσει να επιτρέπεται στο <ph name="HOST" /> η πρόσβαση στην κάμερα και στο μικρόφωνό σας</translation> @@ -5498,7 +5496,6 @@ <translation id="4779766576531456629">Μετονομασία δικτύου κινητής τηλεφωνίας eSIM</translation> <translation id="4780321648949301421">Αποθήκευση σελίδας &ως...</translation> <translation id="4780558987886269159">Για εργασία</translation> -<translation id="4781633367688946589">Συνέχεια σε νέα περίοδο λειτουργίας</translation> <translation id="4784349455504343791">Ο ιστότοπος <ph name="WEBSITE_ORIGIN" /> θέλει να χρησιμοποιήσει προσωπικά στοιχεία από το ψηφιακό πορτοφόλι σας.</translation> <translation id="4785719467058219317">Χρησιμοποιείτε ένα κλειδί ασφαλείας το οποίο δεν είναι εγγεγραμμένο σε αυτόν τον ιστότοπο</translation> <translation id="4785914069240823137">Ακύρωση περικοπής</translation> @@ -6287,6 +6284,7 @@ <translation id="5337926771328966926">Το τρέχον όνομα συσκευής είναι <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Μπορείτε να περιηγηθείτε ιδιωτικά χρησιμοποιώντας ένα παράθυρο για ανώνυμη περιήγηση.</translation> <translation id="5338503421962489998">Τοπικός αποθηκευτικός χώρος</translation> +<translation id="5340620183031438925">Για να κάνετε ερωτήσεις στη Λειτουργία AI σχετικά με την καρτέλα σας χωρίς να αποχωρήσετε από τη σελίδα, επαληθεύστε την ταυτότητά σας. Θα έχετε επίσης πρόσβαση στους κωδικούς πρόσβασής σας και σε άλλα στοιχεία σε όλες τις συσκευές σας.</translation> <translation id="5340787663756381836">&Εύρεση και επεξεργασία</translation> <translation id="5340900621595888432">Αποστολή διαγνωστικών στοιχείων και δεδομένων χρήσης</translation> <translation id="5341793073192892252">Τα ακόλουθα cookie αποκλείστηκαν (τα cookie τρίτων μερών αποκλείονται χωρίς εξαιρέσεις)</translation> @@ -7474,7 +7472,6 @@ <translation id="6180550893222597997">Ποιο κλειδί πρόσβασης θέλετε να χρησιμοποιήσετε για το <ph name="APP_NAME" />;</translation> <translation id="6181218116951226898">Οι εφαρμογές μερικές φορές ενημερώνουν την επωνυμία τους. Ελέγξτε όλες τις αλλαγές, για να βεβαιωθείτε ότι τις αποδέχεστε πριν από την ενημέρωση.</translation> <translation id="6181431612547969857">Η λήψη αποκλείστηκε</translation> -<translation id="6182100780603067202">Να γίνει επίσης κοινή χρήση του ήχου εφαρμογής (από όλα τα παράθυρά της)</translation> <translation id="6183369864942961155">Αυτόματο φωτεινό/σκούρο θέμα</translation> <translation id="6183773856988300112">Το Gemini στο Chrome χρησιμοποιεί την αυτόματη περιήγηση για να εργάζεται στις καρτέλες σας και να ολοκληρώνει τις εργασίες που του αναθέτετε. <ph name="LINK_BEGIN" />Μάθετε περισσότερα<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Αναζήτηση στις καρτέλες</translation> @@ -8267,7 +8264,6 @@ <translation id="6754359471209693699">Έναρξη νέας αναζήτησης</translation> <translation id="6754918760968695779">Άμεση εισαγωγή</translation> <translation id="6755702685749429945">Προσθήκη λεξικού</translation> -<translation id="6756157672127672536">Η εφαρμογή Αρχεία παρέχει γρήγορη πρόσβαση σε αρχεία που έχετε αποθηκεύσει στο Google Drive, σε εξωτερικό αποθηκευτικό χώρο ή στη συσκευή σας Chrome OS.</translation> <translation id="6756643207511618722">Μηχανές ομιλίας</translation> <translation id="6757431299485455321">Βοηθήστε άλλες συσκευές να βρουν αυτό το σημείο πρόσβασης Wi-Fi.</translation> <translation id="6758056191028427665">Πείτε μας πώς τα πηγαίνουμε</translation> @@ -9214,6 +9210,7 @@ <translation id="7406912950279255498">Λειτουργία αντιστροφής χρωμάτων</translation> <translation id="7407430846095439694">Εισαγωγή και δέσμευση</translation> <translation id="7407504355934009739">Οι περισσότεροι χρήστες αποκλείουν τις ειδοποιήσεις από αυτόν τον ιστότοπο.</translation> +<translation id="7407578029724074226">Το αρχείο <ph name="FILE_NAME" /> έχει ευαίσθητα δεδομένα. Ο οργανισμός σας θα σας επιτρέψει να το αποθηκεύσετε στον αποθηκευτικό χώρο cloud ή να το απορρίψετε</translation> <translation id="7408080603962564527">Αυτό θα είναι ορατό σε άλλους</translation> <translation id="740810853557944681">Προσθέστε έναν διακομιστή εκτύπωσης</translation> <translation id="7409549334477097887">Πολύ μεγάλο</translation> @@ -9267,6 +9264,7 @@ <translation id="7434969625063495310">Δεν ήταν δυνατή η προσθήκη του διακομιστή εκτύπωσης. Ελέγξτε τη διαμόρφωση του διακομιστή και δοκιμάστε ξανά.</translation> <translation id="7436921188514130341">Δυστυχώς, παρουσιάστηκε σφάλμα κατά τη μετονομασία.</translation> <translation id="7439519621174723623">Προσθέστε ένα όνομα συσκευής για να συνεχίσετε</translation> +<translation id="743982235360757672">Κρατήστε τη Λειτουργία AI κοντά σας κατά την περιήγηση</translation> <translation id="7441736532026945583">Επιλέξτε Απόκρυψη ομάδας για να καταργήσετε την ομάδα από τη γραμμή καρτελών</translation> <translation id="7441736921018636843">Για να αλλάξετε αυτήν τη ρύθμιση, <ph name="BEGIN_LINK" />κάντε επαναφορά στον συγχρονισμό<ph name="END_LINK" />, έτσι ώστε να καταργηθεί η φράση πρόσβασης συγχρονισμού</translation> <translation id="7441830548568730290">Άλλοι χρήστες</translation> @@ -10005,7 +10003,6 @@ <translation id="794676567536738329">Επιβεβαίωση δικαιωμάτων</translation> <translation id="7947962633355574091">Α&ντιγραφή διεύθυνσης βίντεο</translation> <translation id="7947964080535614577">Οι ιστότοποι προβάλλουν συνήθως διαφημίσεις, ώστε να μπορούν να παρέχουν περιεχόμενο ή υπηρεσίες χωρίς χρέωση. Ωστόσο, ορισμένοι ιστότοποι είναι γνωστοί για την προβολή παρεμβατικών ή παραπλανητικών διαφημίσεων.</translation> -<translation id="7948239795436419268">Να μην γίνει επαναφορά των παραθύρων</translation> <translation id="7948407723851303488">Όλες οι σελίδες του τομέα <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Λόγος: Το LBS υποστηρίζει μόνο URL http://, https:// και file://.</translation> <translation id="7950814699499457511">Ενεργή • Αυτή η επέκταση δεν έχει δημοσιεύσει πρακτικές απορρήτου, όπως τον τρόπο συλλογής και χρήσης δεδομένων</translation> @@ -11194,7 +11191,6 @@ <translation id="8751034568832412184">Σχολείο</translation> <translation id="8751329102746373229">Από τον διαχειριστή σας</translation> <translation id="8752451679755290210">Αυτόματη μετακίνηση μεταξύ στοιχείων</translation> -<translation id="8753948258138515839">Η εφαρμογή Αρχεία παρέχει γρήγορη πρόσβαση σε αρχεία που έχετε αποθηκεύσει στο Google Drive, σε εξωτερικό αποθηκευτικό χώρο ή στη συσκευή σας ChromeOS Flex.</translation> <translation id="8754200782896249056"><p>Κατά την εκτέλεση του <ph name="PRODUCT_NAME" /> σε ένα υποστηριζόμενο περιβάλλον επιφάνειας εργασίας, θα χρησιμοποιηθούν οι ρυθμίσεις διακομιστή μεσολάβησης συστήματος. Ωστόσο, είτε το σύστημά σας δεν υποστηρίζεται ή παρουσιάστηκε ένα πρόβλημα κατά την εκκίνηση της διαμόρφωσης του συστήματός σας.</p> <p>Μπορείτε, όμως, να πραγματοποιήσετε διαμόρφωση μέσω της γραμμής εντολών. Ανατρέξτε στο <code>man <ph name="PRODUCT_BINARY_NAME" /></code> για περισσότερες πληροφορίες σχετικά με επισημάνσεις ή μεταβλητές περιβάλλοντος.</p></translation> <translation id="8755175579224030324">Εκτέλεση εργασιών που σχετίζονται με την ασφάλεια για τον οργανισμό σας, όπως διαχείριση πιστοποιητικών και κλειδιών που είναι αποθηκευμένα στη συσκευή.</translation> <translation id="875532100880844232">Για τη συσκευή <ph name="DEVICE_NAME" />, επιλέξτε μια ενέργεια για κάθε πλήκτρο</translation> @@ -11985,6 +11981,7 @@ <translation id="992778845837390402">Η δημιουργία αντιγράφου ασφαλείας Linux βρίσκεται σε εξέλιξη.</translation> <translation id="994087375490600917">Πλαϊνά πλαίσια</translation> <translation id="994289308992179865">&Επανάληψη</translation> +<translation id="995420352808264005">Επιλογή τύπου εγγραφής συσκευής</translation> <translation id="995755448277384931">Προσθήκη IBAN</translation> <translation id="996250603853062861">Δημιουργία ασφαλούς σύνδεσης...</translation> <translation id="997143476478634194">Οι ιστότοποι θα εφαρμόζουν αυτόματα αυτήν τη ρύθμιση όταν τους επισκέπτεστε. Οι ιστότοποι συνήθως στέλνουν ειδοποιήσεις για να σας ενημερώσουν σχετικά με έκτακτες ειδήσεις ή μηνύματα συζήτησης.</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index d948f25..f6f5b5e 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Can't download main node annotation files. Please try again later.</translation> <translation id="1103523840287552314">Always translate <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">You'll immediately lose access to this tab group, and it will be deleted from all your devices</translation> +<translation id="1105934302947321130">Google Beam with Zoom</translation> <translation id="1106270460549661906">Unshare with Gemini</translation> <translation id="1106350001632362876">Increase threshold</translation> <translation id="110850812463801904">Manually connect to OneDrive</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Your security key is not protected with a PIN. To manage sign-in data, first create a PIN.</translation> <translation id="1179400851034021914">IBAN is invalid</translation> <translation id="1179902906564467236">Follow instructions on your phone or use the camera app</translation> -<translation id="1180117276105724040">Restoring windows from your previous session…</translation> <translation id="118057123461613219">Huge savings</translation> <translation id="1181037720776840403">Remove</translation> <translation id="1182876754474670069">home</translation> @@ -762,7 +762,6 @@ <translation id="151501797353681931">Imported from Safari</translation> <translation id="1515163294334130951">Launch</translation> <translation id="1517467582299994451">To cast with a code, turn on Chrome browser sync settings</translation> -<translation id="1519090060276706457">Restoring windows is taking longer than expected</translation> <translation id="1521442365706402292">Manage certificates</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">Active today</translation> @@ -1111,6 +1110,7 @@ <translation id="1745732479023874451">Manage contacts</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{Open and edit # files in this web app?}}</translation> <translation id="1748563609363301860">You can save this password in your Google Account or only on this device</translation> +<translation id="1749645492410897998">Installing software</translation> <translation id="1749733017156547309">A password is required</translation> <translation id="1750172676754093297">Your security key can't store fingerprints</translation> <translation id="1750238553597293878">Keep using the passwords in your Google Account</translation> @@ -1182,7 +1182,6 @@ <translation id="1796460466266263589">To continue using Gemini, verify that it's you</translation> <translation id="1796588414813960292">Features that need sound won't work</translation> <translation id="1798726622311813209">Credit and debit cards</translation> -<translation id="1799852120691957794">Can't restore windows from your previous session</translation> <translation id="180203835522132923">Search + O, then W</translation> <translation id="1802624026913571222">Sleep when cover is closed</translation> <translation id="1802687198411089702">The page isn't responding. You can wait for it or exit.</translation> @@ -2379,7 +2378,6 @@ <translation id="2610374175948698697">Can view files or folders on your device</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">Sign in to your Microsoft account and then try again</translation> -<translation id="2611702650078660078">An error occurred</translation> <translation id="2611776654555141051">Rectangle tool</translation> <translation id="2611885296070244383">Mic (internal)</translation> <translation id="2612676031748830579">Card number</translation> @@ -2743,7 +2741,6 @@ <translation id="285033512555869047">Closed</translation> <translation id="2850541429955027218">Add theme</translation> <translation id="2851291081585704741">You're offline</translation> -<translation id="2852045827873867442">Internet connection is required.</translation> <translation id="285237063405807022">(loading)</translation> <translation id="2853121255651601031">Password Saved</translation> <translation id="2854453262159518435">Replace existing tab group</translation> @@ -3610,6 +3607,7 @@ <translation id="3473241910002674503">Navigate home or back and switch apps with buttons in tablet mode.</translation> <translation id="3473479545200714844">Screen magnifier</translation> <translation id="3474218480460386727">Use 99 letters or fewer for new words</translation> +<translation id="3474330892505468100">Google Beam with Meet</translation> <translation id="3474624961160222204">Continue as <ph name="NAME" /></translation> <translation id="3477772589943384839">Get moderate memory savings. Your tabs become inactive after a longer period of time.</translation> <translation id="347785443197175480">Continue allowing <ph name="HOST" /> to access your camera and microphone</translation> @@ -5498,7 +5496,6 @@ <translation id="4779766576531456629">Rename eSIM mobile network</translation> <translation id="4780321648949301421">Save Page As...</translation> <translation id="4780558987886269159">For work</translation> -<translation id="4781633367688946589">Continue to new session</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> wants to use personal info from your digital wallet.</translation> <translation id="4785719467058219317">You're using a security key that's not registered with this website</translation> <translation id="4785914069240823137">Cancel crop</translation> @@ -6287,6 +6284,7 @@ <translation id="5337926771328966926">Current device name is <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">You can browse privately using an Incognito window</translation> <translation id="5338503421962489998">Local storage</translation> +<translation id="5340620183031438925">To ask AI Mode about your tab without leaving the page, verify that it's you. You'll also get your passwords and more on all your devices.</translation> <translation id="5340787663756381836">&Find and edit</translation> <translation id="5340900621595888432">Send diagnostic and usage data</translation> <translation id="5341793073192892252">The following cookies were blocked (third-party cookies are being blocked without exception)</translation> @@ -7473,7 +7471,6 @@ <translation id="6180550893222597997">Which passkey do you want to use for <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Apps sometimes update their branding. Review all changes to make sure that you're comfortable with them before updating.</translation> <translation id="6181431612547969857">Download blocked</translation> -<translation id="6182100780603067202">Also share application audio (from all its windows)</translation> <translation id="6183369864942961155">Automatic Light/Dark theme</translation> <translation id="6183773856988300112">Gemini in Chrome uses auto-browse to work in your tabs and complete tasks that you give it. <ph name="LINK_BEGIN" />Learn more<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Search tabs</translation> @@ -8266,7 +8263,6 @@ <translation id="6754359471209693699">Start new search</translation> <translation id="6754918760968695779">Quick Insert</translation> <translation id="6755702685749429945">Add dictionary</translation> -<translation id="6756157672127672536">The Files app provides Quick access to files that you've saved on Google Drive, external storage or your Chrome OS device.</translation> <translation id="6756643207511618722">Speech engines</translation> <translation id="6757431299485455321">Help other devices find this hotspot.</translation> <translation id="6758056191028427665">Let us know how we’re doing.</translation> @@ -9213,6 +9209,7 @@ <translation id="7406912950279255498">Colour inversion mode</translation> <translation id="7407430846095439694">Import and Bind</translation> <translation id="7407504355934009739">Most people block notifications from this site</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> has sensitive data. Your organisation will let you save it to cloud storage or discard it</translation> <translation id="7408080603962564527">This will be visible to others</translation> <translation id="740810853557944681">Add a print server</translation> <translation id="7409549334477097887">Extra large</translation> @@ -9266,6 +9263,7 @@ <translation id="7434969625063495310">Couldn't add the print server. Please check the server's configuration and try again.</translation> <translation id="7436921188514130341">Oh no! There was an error during renaming.</translation> <translation id="7439519621174723623">Add a device name to continue</translation> +<translation id="743982235360757672">Keep AI Mode nearby while you browse</translation> <translation id="7441736532026945583">Select 'Hide group' to remove the group from your tab strip</translation> <translation id="7441736921018636843">To change this setting, <ph name="BEGIN_LINK" />reset sync<ph name="END_LINK" /> to remove your sync passphrase</translation> <translation id="7441830548568730290">Other users</translation> @@ -10004,7 +10002,6 @@ <translation id="794676567536738329">Confirm Permission</translation> <translation id="7947962633355574091">C&opy video address</translation> <translation id="7947964080535614577">Sites usually show ads so that they can provide content or services free of charge. But, some sites are known to show intrusive or misleading ads.</translation> -<translation id="7948239795436419268">Don't restore windows</translation> <translation id="7948407723851303488">All pages of <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Reason: LBS only supports http://, https:// and file:// URLs.</translation> <translation id="7950814699499457511">On • This extension hasn't published privacy practices, such as how it collects and uses data</translation> @@ -11193,7 +11190,6 @@ <translation id="8751034568832412184">School</translation> <translation id="8751329102746373229">From your administrator</translation> <translation id="8752451679755290210">Move between items automatically</translation> -<translation id="8753948258138515839">The Files app provides quick access to files that you've saved on Google Drive, external storage or your Chrome OS Flex device.</translation> <translation id="8754200782896249056"><p>When running <ph name="PRODUCT_NAME" /> under a supported desktop environment, the system proxy settings will be used. However, either your system is not supported or there was a problem launching your system configuration.</p> <p>But you can still configure via the command line. Please see <code>man <ph name="PRODUCT_BINARY_NAME" /></code> for more information on flags and environment variables.</p></translation> @@ -11986,6 +11982,7 @@ <translation id="992778845837390402">Linux backup currently in progress</translation> <translation id="994087375490600917">Side panels</translation> <translation id="994289308992179865">&Loop</translation> +<translation id="995420352808264005">Choose device enrolment type</translation> <translation id="995755448277384931">Add IBAN</translation> <translation id="996250603853062861">Establishing secure connection...</translation> <translation id="997143476478634194">Sites automatically follow this setting when you visit them. Sites usually send notifications to let you know about breaking news or chat messages.</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 68390ddc..fd3518a 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">No se pueden descargar los archivos de anotaciones de nodos principales. Vuelve a intentarlo más tarde.</translation> <translation id="1103523840287552314">Siempre traducir <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Perderás de inmediato el acceso a este grupo de pestañas y se borrará de todos tus dispositivos</translation> +<translation id="1105934302947321130">Google Beam con Zoom</translation> <translation id="1106270460549661906">Dejar de compartir con Gemini</translation> <translation id="1106350001632362876">Aumentar el umbral</translation> <translation id="110850812463801904">Conectarse a OneDrive de forma manual</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Tu llave de seguridad no está protegida con un PIN. Para administrar los datos de acceso, crea uno.</translation> <translation id="1179400851034021914">El IBAN no es válido</translation> <translation id="1179902906564467236">Sigue las instrucciones que aparecen en el teléfono o usa la app de la cámara</translation> -<translation id="1180117276105724040">Restableciendo ventanas de tu sesión anterior…</translation> <translation id="118057123461613219">Ahorro: muy alto</translation> <translation id="1181037720776840403">Quitar</translation> <translation id="1182876754474670069">Inicio</translation> @@ -758,7 +758,6 @@ <translation id="151501797353681931">Importar de Safari</translation> <translation id="1515163294334130951">Iniciar</translation> <translation id="1517467582299994451">Para transmitir con un código, activa la configuración de sincronización del navegador Chrome</translation> -<translation id="1519090060276706457">El restablecimiento de las ventanas está tardando más de lo esperado</translation> <translation id="1521442365706402292">Administrar certificados</translation> <translation id="1521655867290435174">Hojas de cálculo de Google</translation> <translation id="1521774566618522728">Activo hoy</translation> @@ -1099,6 +1098,7 @@ <translation id="1745732479023874451">Administrar contactos</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{¿Quieres abrir y editar # archivos en la aplicación web?}}</translation> <translation id="1748563609363301860">Puedes guardar esta contraseña en tu Cuenta de Google o solo en este dispositivo</translation> +<translation id="1749645492410897998">Instalando el software</translation> <translation id="1749733017156547309">Debes ingresar una contraseña</translation> <translation id="1750172676754093297">Tu llave de seguridad no puede almacenar huellas dactilares</translation> <translation id="1750238553597293878">Sigue usando las contraseñas en tu Cuenta de Google</translation> @@ -1170,7 +1170,6 @@ <translation id="1796460466266263589">Para seguir usando Gemini, verifica tu identidad</translation> <translation id="1796588414813960292">No se habilitarán las funciones que necesitan sonido.</translation> <translation id="1798726622311813209">Tarjetas de débito y crédito</translation> -<translation id="1799852120691957794">No se pueden restablecer las ventanas de tu sesión anterior</translation> <translation id="180203835522132923">Tecla de búsqueda + O y, luego, W</translation> <translation id="1802624026913571222">Suspender cuando se cierra la tapa</translation> <translation id="1802687198411089702">La página no responde. Puedes esperar o salir.</translation> @@ -2363,7 +2362,6 @@ <translation id="2610374175948698697">Pueden ver archivos o carpetas del dispositivo</translation> <translation id="2610780100389066815">Firma de lista de confianza de Microsoft</translation> <translation id="261114180663074524">Accede a tu cuenta de Microsoft y vuelve a intentarlo</translation> -<translation id="2611702650078660078">Se produjo un error</translation> <translation id="2611776654555141051">Herramienta de rectángulo</translation> <translation id="2611885296070244383">Micrófono (interno)</translation> <translation id="2612676031748830579">Número de tarjeta</translation> @@ -2727,7 +2725,6 @@ <translation id="285033512555869047">Cerrado</translation> <translation id="2850541429955027218">Agregar tema</translation> <translation id="2851291081585704741">No tienes conexión</translation> -<translation id="2852045827873867442">Se requiere una conexión a Internet.</translation> <translation id="285237063405807022">(cargando)</translation> <translation id="2853121255651601031">Se guardó la contraseña</translation> <translation id="2854453262159518435">Reemplazar el grupo de pestañas existente</translation> @@ -3594,6 +3591,7 @@ <translation id="3473241910002674503">Con los botones del modo tablet, puedes navegar hacia la pantalla de inicio, regresar y cambiar de apps.</translation> <translation id="3473479545200714844">Lupa</translation> <translation id="3474218480460386727">Las palabras nuevas pueden tener un máximo de 99 letras.</translation> +<translation id="3474330892505468100">Google Beam con Meet</translation> <translation id="3474624961160222204">Continuar como <ph name="NAME" /></translation> <translation id="3477772589943384839">Obtén un ahorro de memoria moderado. Las pestañas se vuelven inactivas después de un período más largo.</translation> <translation id="347785443197175480">Continuar permitiendo que <ph name="HOST" /> acceda a la cámara y al micrófono</translation> @@ -5482,7 +5480,6 @@ <translation id="4779766576531456629">Cambiar el nombre de la Red móvil por eSIM</translation> <translation id="4780321648949301421">Guardar página como...</translation> <translation id="4780558987886269159">Para el trabajo</translation> -<translation id="4781633367688946589">Continuar a la nueva sesión</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> quiere usar información personal de tu billetera digital.</translation> <translation id="4785719467058219317">Estás usando una llave de seguridad que no se registró con este sitio web</translation> <translation id="4785914069240823137">Cancelar recorte</translation> @@ -6271,6 +6268,7 @@ <translation id="5337926771328966926">El nombre actual del dispositivo es <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Puedes navegar de forma privada con una ventana de incógnito</translation> <translation id="5338503421962489998">Almacenamiento local</translation> +<translation id="5340620183031438925">Para preguntarle al Modo IA sobre tu pestaña sin salir de la página, verifica tu identidad. También obtendrás tus contraseñas y más en todos tus dispositivos.</translation> <translation id="5340787663756381836">&Buscar y editar</translation> <translation id="5340900621595888432">Enviar datos de uso y diagnóstico</translation> <translation id="5341793073192892252">Se bloquearon las siguientes cookies (las cookies de terceros se bloquean sin excepción)</translation> @@ -7457,7 +7455,6 @@ <translation id="6180550893222597997">¿Qué llave de acceso deseas usar para <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">A veces, las apps actualizan su desarrollo de la marca. Revisa todos los cambios para asegurarte de que estás de acuerdo con ellos antes de actualizar.</translation> <translation id="6181431612547969857">Descarga bloqueada</translation> -<translation id="6182100780603067202">Compartir también el audio de la aplicación (de todas sus ventanas)</translation> <translation id="6183369864942961155">Tema claro/oscuro automático</translation> <translation id="6183773856988300112">Gemini en Chrome usa la navegación automática para trabajar en tus pestañas y completar las tareas que le asignes. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Buscar pestañas</translation> @@ -8250,7 +8247,6 @@ <translation id="6754359471209693699">Iniciar nueva búsqueda</translation> <translation id="6754918760968695779">Insertar rápido</translation> <translation id="6755702685749429945">Agregar diccionario</translation> -<translation id="6756157672127672536">La aplicación Archivos brinda acceso rápido a los archivos que hayas guardado en Google Drive, el almacenamiento externo o el dispositivo de ChromeOS.</translation> <translation id="6756643207511618722">Motores de voz</translation> <translation id="6757431299485455321">Ayuda a que otros dispositivos encuentren este hotspot.</translation> <translation id="6758056191028427665">Danos tu opinión sobre nuestro trabajo.</translation> @@ -9197,6 +9193,7 @@ <translation id="7406912950279255498">Modo de inversión de colores</translation> <translation id="7407430846095439694">Importar y vincular</translation> <translation id="7407504355934009739">La mayoría de las personas bloquean las notificaciones de este sitio</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> tiene datos sensibles. Tu organización te permitirá guardarlo en el almacenamiento en la nube o descartarlo</translation> <translation id="7408080603962564527">Esta información será visible para otras personas</translation> <translation id="740810853557944681">Agrega un servidor de impresión</translation> <translation id="7409549334477097887">Extragrande</translation> @@ -9250,6 +9247,7 @@ <translation id="7434969625063495310">No se pudo agregar el servidor de impresión. Revisa la configuración del servidor y vuelve a intentarlo.</translation> <translation id="7436921188514130341">Se produjo un error al cambiar el nombre.</translation> <translation id="7439519621174723623">Agregar un nombre de dispositivo para continuar</translation> +<translation id="743982235360757672">Mantén el Modo IA cerca mientras navegas</translation> <translation id="7441736532026945583">Selecciona "Ocultar grupo" para quitar el grupo de la barra de pestañas</translation> <translation id="7441736921018636843">A fin de cambiar esta configuración, <ph name="BEGIN_LINK" />restablece la sincronización<ph name="END_LINK" /> para quitar la frase de contraseña de sincronización</translation> <translation id="7441830548568730290">Otros usuarios</translation> @@ -9988,7 +9986,6 @@ <translation id="794676567536738329">Confirmar permisos</translation> <translation id="7947962633355574091">Copiar dirección del video</translation> <translation id="7947964080535614577">Por lo general los sitios muestran anuncios para poder proporcionar contenido o servicios de forma gratuita. No obstante, algunos sitios son conocidos por mostrar anuncios intrusivos o engañosos.</translation> -<translation id="7948239795436419268">No restablecer ventanas</translation> <translation id="7948407723851303488">Todas las páginas de <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Motivo: LBS solo admite URLs con http://, https:// y file://.</translation> <translation id="7950814699499457511">Activada • Esta extensión no publicó prácticas de privacidad, como la forma en que recopila y usa datos</translation> @@ -11177,7 +11174,6 @@ <translation id="8751034568832412184">Institución educativa</translation> <translation id="8751329102746373229">De tu administrador</translation> <translation id="8752451679755290210">Pasar de un elemento a otro de forma automática</translation> -<translation id="8753948258138515839">La aplicación Archivos brinda acceso rápido a los archivos que hayas guardado en Google Drive, el almacenamiento externo o el dispositivo ChromeOS Flex.</translation> <translation id="8754200782896249056"><p>Al ejecutar <ph name="PRODUCT_NAME" /> en un entorno admitido de escritorio, se utiliza la configuración proxy del sistema. Sin embargo, o bien el sistema no es admitido, o hubo un problema al lanzar la configuración del sistema.</p> <p>Aún puedes establecer la configuración mediante la línea de comando. Consulta <code>man <ph name="PRODUCT_BINARY_NAME" /></code> para obtener más información sobre etiquetas y variables del entorno.</p></translation> @@ -11970,6 +11966,7 @@ <translation id="992778845837390402">La copia de seguridad de Linux está en curso</translation> <translation id="994087375490600917">Paneles laterales</translation> <translation id="994289308992179865">Bucle</translation> +<translation id="995420352808264005">Elige el tipo de inscripción de dispositivos</translation> <translation id="995755448277384931">Agregar un IBAN</translation> <translation id="996250603853062861">Estableciendo una conexión segura...</translation> <translation id="997143476478634194">Los sitios siguen esta configuración de forma automática cuando los visitas. Por lo general, los sitios envían notificaciones sobre noticias de último momento o mensajes de chat.</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 563d8049..5a78dfe 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -285,7 +285,6 @@ <translation id="117916940443676133">Tu llave de seguridad no está protegida mediante un PIN. Para gestionar los datos de inicio de sesión, primero debes crear un PIN.</translation> <translation id="1179400851034021914">El IBAN no es válido</translation> <translation id="1179902906564467236">Sigue las instrucciones que aparecen en tu teléfono o usa la aplicación de la cámara</translation> -<translation id="1180117276105724040">Restaurando ventanas de tu sesión anterior...</translation> <translation id="118057123461613219">Ahorro muy elevado</translation> <translation id="1181037720776840403">Quitar</translation> <translation id="1182876754474670069">Inicio</translation> @@ -762,7 +761,6 @@ <translation id="151501797353681931">Importado desde Safari</translation> <translation id="1515163294334130951">Iniciar</translation> <translation id="1517467582299994451">Para enviar contenido con un código, activa los ajustes de sincronización del navegador Chrome</translation> -<translation id="1519090060276706457">Se está tardando más de lo esperado en restaurar las ventanas</translation> <translation id="1521442365706402292">Gestionar certificados</translation> <translation id="1521655867290435174">Hojas de cálculo de Google</translation> <translation id="1521774566618522728">Activo hoy</translation> @@ -1175,7 +1173,6 @@ <translation id="1796460466266263589">Para seguir usando Gemini, verifica que eres tú</translation> <translation id="1796588414813960292">Las funciones que requieran reproducir sonido no funcionarán</translation> <translation id="1798726622311813209">Tarjetas de crédito y débito</translation> -<translation id="1799852120691957794">No se pueden restaurar las ventanas de tu sesión anterior</translation> <translation id="180203835522132923">Tecla de búsqueda + O y, después, W</translation> <translation id="1802624026913571222">Suspender cuando se cierre la tapa</translation> <translation id="1802687198411089702">La página no responde. Puedes esperar a que lo haga o cerrarla.</translation> @@ -2369,7 +2366,6 @@ <translation id="2610374175948698697">Puede ver archivos o carpetas de tu dispositivo</translation> <translation id="2610780100389066815">Firma de listas de confianza de Microsoft</translation> <translation id="261114180663074524">Inicia sesión en tu cuenta de Microsoft y vuelve a intentarlo</translation> -<translation id="2611702650078660078">Se ha producido un error</translation> <translation id="2611776654555141051">Herramienta de rectángulo</translation> <translation id="2611885296070244383">Micrófono (interno)</translation> <translation id="2612676031748830579">Número de tarjeta</translation> @@ -2733,7 +2729,6 @@ <translation id="285033512555869047">Cerrado</translation> <translation id="2850541429955027218">Añadir tema</translation> <translation id="2851291081585704741">No tienes conexión</translation> -<translation id="2852045827873867442">Se necesita conexión a Internet.</translation> <translation id="285237063405807022">(cargando)</translation> <translation id="2853121255651601031">Contraseña guardada</translation> <translation id="2854453262159518435">Sustituir grupo de pestañas actual</translation> @@ -5488,7 +5483,6 @@ <translation id="4779766576531456629">Cambiar nombre de la red móvil de eSIM</translation> <translation id="4780321648949301421">Guardar página como...</translation> <translation id="4780558987886269159">Para el trabajo</translation> -<translation id="4781633367688946589">Continuar a una nueva sesión</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> quiere usar información personal de tu cartera digital.</translation> <translation id="4785719467058219317">Estás usando una llave de seguridad que no se ha registrado en este sitio web</translation> <translation id="4785914069240823137">Cancelar recorte</translation> @@ -7462,7 +7456,6 @@ <translation id="6180550893222597997">¿Qué llave de acceso quieres usar en <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">A veces, las apps actualizan su branding. Revisa todos los cambios para asegurarte de que estás de acuerdo con ellos antes de la actualización.</translation> <translation id="6181431612547969857">Descarga bloqueada</translation> -<translation id="6182100780603067202">Compartir también el audio de la aplicación (de todas sus ventanas)</translation> <translation id="6183369864942961155">Tema claro/oscuro automático</translation> <translation id="6183773856988300112">Gemini en Chrome usa la navegación automática en tus pestañas para completar las tareas que le asignes. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Buscar pestañas</translation> @@ -8255,7 +8248,6 @@ <translation id="6754359471209693699">Iniciar nueva búsqueda</translation> <translation id="6754918760968695779">Insertar rápido</translation> <translation id="6755702685749429945">Añadir diccionario</translation> -<translation id="6756157672127672536">La aplicación Archivos permite acceder rápidamente a los archivos que has guardado en Google Drive, en un almacenamiento interno o en tu dispositivo ChromeOS.</translation> <translation id="6756643207511618722">Motores de voz</translation> <translation id="6757431299485455321">Ayuda a otros dispositivos a encontrar este punto de acceso.</translation> <translation id="6758056191028427665">Envíanos tu opinión sobre nuestro servicio.</translation> @@ -9995,7 +9987,6 @@ <translation id="794676567536738329">Confirmar permisos</translation> <translation id="7947962633355574091">C&opiar dirección de vídeo</translation> <translation id="7947964080535614577">Los sitios suelen mostrar anuncios para poder ofrecer contenido o servicios sin coste económico. Sin embargo, algunos sitios se caracterizan por mostrar anuncios invasivos o engañosos.</translation> -<translation id="7948239795436419268">No restaurar ventanas</translation> <translation id="7948407723851303488">Todas las páginas de <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Motivo: LBS solo admite URLs http://, https:// y file://.</translation> <translation id="7950814699499457511">Activada • Esta extensión no ha publicado sus prácticas de privacidad, como la forma en la que recoge y usa los datos</translation> @@ -11184,7 +11175,6 @@ <translation id="8751034568832412184">Centro educativo</translation> <translation id="8751329102746373229">De tu administrador</translation> <translation id="8752451679755290210">Pasa de un elemento a otro de forma automática</translation> -<translation id="8753948258138515839">La aplicación Archivos permite acceder rápidamente a los archivos que has guardado en Google Drive, en un almacenamiento interno o en tu dispositivo ChromeOS Flex.</translation> <translation id="8754200782896249056"><p>Al ejecutar <ph name="PRODUCT_NAME" /> en un entorno de escritorio compatible, se utilizará la configuración de proxy del sistema. Sin embargo, tu sistema no es compatible o ha habido algún problema al iniciar la configuración del sistema.</p> <p>Aún puedes configurar el sistema mediante la línea de comandos. Para obtener más información sobre los indicadores y sobre las variables del entorno, consulta <code>man <ph name="PRODUCT_BINARY_NAME" /></code>.</p></translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 7ecb9e11..20abf65 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Põhisõlme märgistamise faile ei saa alla laadida. Proovige hiljem uuesti.</translation> <translation id="1103523840287552314">Tõlgi alati: <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Kaotate kohe juurdepääsu sellele vahelehegrupile ja see kustutatakse kõigist teie seadmetest</translation> +<translation id="1105934302947321130">Google Beam koos Zoomiga</translation> <translation id="1106270460549661906">Jagamise tühistamine Geminiga</translation> <translation id="1106350001632362876">Tõstke läve</translation> <translation id="110850812463801904">Looge ühendus OneDrive'iga käsitsi</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Teie turvavõti pole PIN-koodiga kaitstud. Sisselogimisandmete haldamiseks looge esmalt PIN-kood.</translation> <translation id="1179400851034021914">IBAN on kehtetu</translation> <translation id="1179902906564467236">Järgige oma telefonis kuvatavaid juhiseid või kasutage kaamerarakendust</translation> -<translation id="1180117276105724040">Akende taastamine teie eelmisest seansist…</translation> <translation id="118057123461613219">Hiiglaslik sääst</translation> <translation id="1181037720776840403">Eemalda</translation> <translation id="1182876754474670069">avaekraan</translation> @@ -762,7 +762,6 @@ <translation id="151501797353681931">Imporditud Safarist</translation> <translation id="1515163294334130951">Käivita</translation> <translation id="1517467582299994451">Ülekandmiseks koodi abil lülitage sisse Chrome'i brauseri sünkroonimisseaded</translation> -<translation id="1519090060276706457">Akende taastamine võtab oodatust kauem aega</translation> <translation id="1521442365706402292">Sertifikaatide haldamine</translation> <translation id="1521655867290435174">Google'i arvutustabelid</translation> <translation id="1521774566618522728">Aktiivne täna</translation> @@ -1103,6 +1102,7 @@ <translation id="1745732479023874451">Kontaktide haldamine</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{Kas soovite selles veebirakenduses # faili avada ja neid redigeerida?}}</translation> <translation id="1748563609363301860">Saate selle parooli salvestada oma Google'i kontole või ainult sellesse seadmesse</translation> +<translation id="1749645492410897998">Tarkvara installimine</translation> <translation id="1749733017156547309">Parool on nõutav</translation> <translation id="1750172676754093297">Teie turvavõtmele ei saa sõrmejälgi salvestada</translation> <translation id="1750238553597293878">Jätkake paroolide kasutamist Google'i kontol</translation> @@ -1174,7 +1174,6 @@ <translation id="1796460466266263589">Gemini kasutamise jätkamiseks kinnitage oma isik.</translation> <translation id="1796588414813960292">Heli vajavad funktsioonid ei tööta</translation> <translation id="1798726622311813209">Krediit- ja deebetkaardid</translation> -<translation id="1799852120691957794">Eelmise seansi aknaid ei saa taastada</translation> <translation id="180203835522132923">Otsinguklahv + O, seejärel W</translation> <translation id="1802624026913571222">Lülita unerežiimi, kui kaas on suletud</translation> <translation id="1802687198411089702">Leht ei reageeri. Võite oodata või väljuda.</translation> @@ -2370,7 +2369,6 @@ <translation id="2610374175948698697">Võivad teie seadmes faile ja kaustu vaadata</translation> <translation id="2610780100389066815">Microsoft Trusti loendi signeerimine</translation> <translation id="261114180663074524">Logige sisse oma Microsofti kontole ja proovige uuesti</translation> -<translation id="2611702650078660078">Ilmnes viga</translation> <translation id="2611776654555141051">Nelinurgatööriist</translation> <translation id="2611885296070244383">Mikrofon (sisemine)</translation> <translation id="2612676031748830579">Kaardi number</translation> @@ -2734,7 +2732,6 @@ <translation id="285033512555869047">Suletud</translation> <translation id="2850541429955027218">Lisa teema</translation> <translation id="2851291081585704741">Võrguühendus puudub</translation> -<translation id="2852045827873867442">Vaja on internetiühendust.</translation> <translation id="285237063405807022">(laadimine)</translation> <translation id="2853121255651601031">Parool salvestati</translation> <translation id="2854453262159518435">Asenda olemasolev vahelehegrupp</translation> @@ -3601,6 +3598,7 @@ <translation id="3473241910002674503">Navigeerige tahvelarvutirežiimis nuppude abil avalehele, tagasi ja vahetage rakendusi.</translation> <translation id="3473479545200714844">Ekraanisuurendi</translation> <translation id="3474218480460386727">Uutes sõnades võib olla kuni 99 tähte</translation> +<translation id="3474330892505468100">Google Beam koos Meetiga</translation> <translation id="3474624961160222204">Jätka kasutajana <ph name="NAME" /></translation> <translation id="3477772589943384839">Säästate mälumahtu keskmiselt. Teie vahelehed muutuvad pärast pikemalt aega inaktiivseks.</translation> <translation id="347785443197175480">Luba hostile <ph name="HOST" /> jätkuvalt juurdepääs kaamerale ja mikrofonile</translation> @@ -5489,7 +5487,6 @@ <translation id="4779766576531456629">eSIM-i mobiilsidevõrgu ümbernimetamine</translation> <translation id="4780321648949301421">Salvesta leht &nimega...</translation> <translation id="4780558987886269159">Töö jaoks</translation> -<translation id="4781633367688946589">Jätka uues seansis</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> soovib kasutada teie digitaalsest rahakotist pärinevat isiklikku teavet.</translation> <translation id="4785719467058219317">Kasutate turvavõtit, mis ei ole sellel veebisaidil registreeritud</translation> <translation id="4785914069240823137">Kärpimisest loobumine</translation> @@ -5631,7 +5628,7 @@ <translation id="4871370605780490696">Järjehoidja lisamine</translation> <translation id="4871568871368204250">Sünkroonimise väljalülitamine</translation> <translation id="4871630917300912613">JavaScripti piirangud</translation> -<translation id="4871719318659334896">Grupi sulgemine</translation> +<translation id="4871719318659334896">Sulge grupp</translation> <translation id="4872192066608821120">Paroolide importimiseks valige CSV-fail</translation> <translation id="4872212987539553601">Seadistage seadmes krüpteerimine</translation> <translation id="4873312501243535625">Meediafaili kontrollija</translation> @@ -6278,6 +6275,7 @@ <translation id="5337926771328966926">Seadme praegune nimi on <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Inkognito aknas saab privaatselt sirvida</translation> <translation id="5338503421962489998">Kohalik talletusruum</translation> +<translation id="5340620183031438925">Kui soovite AI-režiimilt vahelehe kohta küsida ilma lehelt lahkumata, kinnitage oma isik. Lisaks saate kõigis oma seadmetes oma paroole ja muud kasutada.</translation> <translation id="5340787663756381836">&Leia ja muuda</translation> <translation id="5340900621595888432">Saada diagnostika- ja kasutusandmeid</translation> <translation id="5341793073192892252">Blokeeriti järgmised küpsisefailid (kolmandate osapoolte küpsised blokeeriti ühegi erandita)</translation> @@ -7464,7 +7462,6 @@ <translation id="6180550893222597997">Millist pääsuvõtit soovite rakenduse <ph name="APP_NAME" /> puhul kasutada?</translation> <translation id="6181218116951226898">Rakendused muudavad mõnikord oma brändingut. Vaadake enne värskendamist kõik muudatused üle, et veenduda, kas olete nendega nõus.</translation> <translation id="6181431612547969857">Allalaadimine on blokeeritud</translation> -<translation id="6182100780603067202">Jaga ka rakenduse heli (kõigist selle akendest)</translation> <translation id="6183369864942961155">Automaatne hele/tume teema</translation> <translation id="6183773856988300112">Gemini Chrome'is kasutab teie vahelehtedel töötamiseks ja antud ülesannete täitmiseks automaatset sirvimist. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Otsige vahelehtedelt</translation> @@ -8257,7 +8254,6 @@ <translation id="6754359471209693699">Uue otsingu alustamine</translation> <translation id="6754918760968695779">Kiirsisestus</translation> <translation id="6755702685749429945">Lisa sõnastik</translation> -<translation id="6756157672127672536">Rakendusega Failid saate kiiresti juurdepääsu Google Drive'i, välisesse talletusseadmesse või Chrome OS-i seadmesse salvestatud failidele.</translation> <translation id="6756643207511618722">Kõnesünteesimootorid</translation> <translation id="6757431299485455321">Aidake teistel seadmetel see kuumkoht leida.</translation> <translation id="6758056191028427665">Andke teada, kuidas meil läheb.</translation> @@ -9204,6 +9200,7 @@ <translation id="7406912950279255498">Värvide ümberpööramise režiim</translation> <translation id="7407430846095439694">Impordi ja seo</translation> <translation id="7407504355934009739">Enamik inimesi blokeerib selle saidi märguanded</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> sisaldab delikaatseid isikuandmeid. Teie organisatsioon lubab teil selle pilvepõhisesse salvestusruumi salvestada või failist loobuda.</translation> <translation id="7408080603962564527">See on teistele nähtav</translation> <translation id="740810853557944681">Prindiserveri lisamine</translation> <translation id="7409549334477097887">Väga suur</translation> @@ -9257,6 +9254,7 @@ <translation id="7434969625063495310">Prindiserverit ei õnnestunud lisada. Kontrollige serveri seadistust ja proovige uuesti.</translation> <translation id="7436921188514130341">Ups, ebaõnn! Ümbernimetamisel ilmnes viga.</translation> <translation id="7439519621174723623">Jätkamiseks lisage seadme nimi</translation> +<translation id="743982235360757672">Kasutage AI-režiimi sirvimise ajal</translation> <translation id="7441736532026945583">Tehke valik „Peida grupp“, et eemaldada grupp oma vahelehtede ribalt</translation> <translation id="7441736921018636843">Seade muutmiseks <ph name="BEGIN_LINK" />lähtestage sünkroonimine<ph name="END_LINK" />, et sünkroonimisparool eemaldada</translation> <translation id="7441830548568730290">Teised kasutajad</translation> @@ -9995,7 +9993,6 @@ <translation id="794676567536738329">Kinnitage load</translation> <translation id="7947962633355574091">K&opeeri video aadress</translation> <translation id="7947964080535614577">Saidid kuvavad reklaame tavaliselt selleks, et pakkuda maksekohustuseta sisu või teenuseid. Mõned saidid aga kuvavad sekkuvaid või eksitavaid reklaame.</translation> -<translation id="7948239795436419268">Ära taasta aknaid</translation> <translation id="7948407723851303488">Kõik domeeni <ph name="DOMAIN_NAME" /> lehed</translation> <translation id="7950629216186736592">Põhjus: LBS toetab ainult URL-e kujul http://, https:// ja file://.</translation> <translation id="7950814699499457511">Sees • See laiendus pole avaldanud privaatsuspõhimõtteid, milles kirjeldataks, kuidas laiendus andmeid kogub ja kasutab</translation> @@ -11184,7 +11181,6 @@ <translation id="8751034568832412184">Kool</translation> <translation id="8751329102746373229">Teie administraatorilt</translation> <translation id="8752451679755290210">Üksuste vahel automaatselt liikumine</translation> -<translation id="8753948258138515839">Rakendusega Failid saate kiirjuurdepääsu Google Drive'i, välisesse salvestusseadmesse või Chrome OS Flexi seadmesse salvestatud failidele.</translation> <translation id="8754200782896249056"><p>Kui toodet <ph name="PRODUCT_NAME" /> käitatakse toetatud töölaua keskkonnas, kasutatakse süsteemi puhverserveri seadeid. Kuid teie süsteemi ei toetata või tekkis probleem süsteemi konfiguratsiooni käivitamisel.</p> <p>Saate ikka seadistada käsurea abil. Vaadake lisateavet (<code>man <ph name="PRODUCT_BINARY_NAME" /></code>) märgistuste ja keskkonna muutujate kohta.</p></translation> @@ -11977,6 +11973,7 @@ <translation id="992778845837390402">Linuxi varundamine on pooleli</translation> <translation id="994087375490600917">Külgpaneelid</translation> <translation id="994289308992179865">&Korda</translation> +<translation id="995420352808264005">Valige seadme registreerimise tüüp</translation> <translation id="995755448277384931">IBAN-i lisamine</translation> <translation id="996250603853062861">Turvalise ühenduse loomine...</translation> <translation id="997143476478634194">Saidid järgivad automaatselt seda seadet, kui neid külastate. Saidid saadavad tavaliselt märguandeid, et teavitada teid olulistest uudistest või vestlussõnumitest.</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index 365145c..d2237eb 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Ezin dira deskargatu nodo nagusiko oharpen-fitxategiak. Saiatu berriro geroago.</translation> <translation id="1103523840287552314">Itzuli <ph name="LANGUAGE" /> beti</translation> <translation id="1104098698795583187">Berehala galduko duzu fitxa talde honetarako sarbidea, eta zure gailu guztietatik ezabatuko da</translation> +<translation id="1105934302947321130">Google Beam Zoom bidez</translation> <translation id="1106270460549661906">Utzi Gemini-rekin partekatzeari</translation> <translation id="1106350001632362876">Handitu atalasea</translation> <translation id="110850812463801904">Konektatu OneDrive-ra eskuz</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Segurtasun-giltza ez daukazu PIN kodearekin babestuta. Saioa hasteko datuak kudeatzeko, sortu PIN bat.</translation> <translation id="1179400851034021914">IBANak ez du balio</translation> <translation id="1179902906564467236">Jarraitu zure telefonoko jarraibideei edo erabili Kamera aplikazioa</translation> -<translation id="1180117276105724040">Aurreko gailuko leihoak leheneratzen…</translation> <translation id="118057123461613219">Aurrezte oso handia</translation> <translation id="1181037720776840403">Kendu</translation> <translation id="1182876754474670069">hasiera tekla</translation> @@ -761,7 +761,6 @@ <translation id="151501797353681931">Safari arakatzailetik inportatutakoak</translation> <translation id="1515163294334130951">Exekutatu</translation> <translation id="1517467582299994451">Edukia kode baten bidez igortzeko, aktibatu Chrome arakatzailearen sinkronizazio-ezarpenak</translation> -<translation id="1519090060276706457">Espero baino gehiago ari da luzatzen leihoak leheneratzeko prozesua</translation> <translation id="1521442365706402292">Kudeatu ziurtagiriak</translation> <translation id="1521655867290435174">Google Kalkulu-orriak</translation> <translation id="1521774566618522728">Aktibo gaur</translation> @@ -1102,6 +1101,7 @@ <translation id="1745732479023874451">Kudeatu kontaktuak</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{Sareko aplikazio honetan ireki eta editatu nahi dituzu # fitxategi horiek?}}</translation> <translation id="1748563609363301860">Google-ko kontuan edo gailu honetan bakarrik gorde dezakezu pasahitza</translation> +<translation id="1749645492410897998">Softwarea instalatzen</translation> <translation id="1749733017156547309">Pasahitz bat behar da</translation> <translation id="1750172676754093297">Segurtasun-giltzak ezin du hatz-markarik gorde</translation> <translation id="1750238553597293878">Jarraitu Google-ko kontuko pasahitzak erabiltzen</translation> @@ -1173,7 +1173,6 @@ <translation id="1796460466266263589">Gemini erabiltzen jarraitzeko, egiaztatu zeu zarela</translation> <translation id="1796588414813960292">Soinua behar duten eginbideek ez dute funtzionatuko</translation> <translation id="1798726622311813209">Kreditu- eta zordunketa-txartelak</translation> -<translation id="1799852120691957794">Ezin dira leheneratu aurreko saioko leihoak</translation> <translation id="180203835522132923">Bilatu + O; gero, W</translation> <translation id="1802624026913571222">Ezarri inaktibo estalkia ixtean</translation> <translation id="1802687198411089702">Orriak ez du erantzuten. Itxaron orriak erantzun arte edo irten orritik.</translation> @@ -2365,7 +2364,6 @@ <translation id="2610374175948698697">Gailuko fitxategiak edo karpetak ikus ditzakete</translation> <translation id="2610780100389066815">Microsoft-en fidagarrien zerrendaren sinatzea</translation> <translation id="261114180663074524">Hasi saioa Microsoft-eko kontuan eta saiatu berriro</translation> -<translation id="2611702650078660078">Errore bat gertatu da</translation> <translation id="2611776654555141051">Laukizuzenaren tresna</translation> <translation id="2611885296070244383">Mikrofonoa (barnekoa)</translation> <translation id="2612676031748830579">Txartelaren zenbakia</translation> @@ -2729,7 +2727,6 @@ <translation id="285033512555869047">Itxita</translation> <translation id="2850541429955027218">Gehitu gaia</translation> <translation id="2851291081585704741">Ez zaude konektatuta Internetera</translation> -<translation id="2852045827873867442">Internetera konektatuta egon behar duzu.</translation> <translation id="285237063405807022">(kargatzen)</translation> <translation id="2853121255651601031">Gorde da pasahitza</translation> <translation id="2854453262159518435">Ordeztu lehendik dagoen fitxa taldea</translation> @@ -3594,6 +3591,7 @@ <translation id="3473241910002674503">Tableta moduan, erabili botoiak orri nagusira joateko, atzera egiteko eta aplikazioz aldatzeko.</translation> <translation id="3473479545200714844">Lupa</translation> <translation id="3474218480460386727">Erabili 99 letra edo gutxiago beste hitz bat gehitzeko</translation> +<translation id="3474330892505468100">Google Beam Meet bidez</translation> <translation id="3474624961160222204">Egin aurrera <ph name="NAME" /> gisa</translation> <translation id="3477772589943384839">Lortu memoria-aurrezte ertaina. Tarte luzeago baten ondoren ezartzen dira inaktibo fitxak.</translation> <translation id="347785443197175480">Jarraitu <ph name="HOST" /> webguneari kamera eta mikrofonoa atzitzea baimentzen</translation> @@ -5482,7 +5480,6 @@ <translation id="4779766576531456629">Aldatu izena eSIM txartelaren sare mugikorrari</translation> <translation id="4780321648949301421">Gorde orria honela…</translation> <translation id="4780558987886269159">Lanerako</translation> -<translation id="4781633367688946589">Egin aurrera saio berrira</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> webguneak diru-zorro digitaleko informazio pertsonala erabili nahi du.</translation> <translation id="4785719467058219317">Webgune honetan erregistratuta ez dagoen segurtasun-giltza bat erabiltzen ari zara</translation> <translation id="4785914069240823137">Utzi ebaketa bertan behera</translation> @@ -6269,6 +6266,7 @@ <translation id="5337926771328966926"><ph name="DEVICE_NAME" /> da gailuaren izena</translation> <translation id="5338338064218053691">Sarea modu pribatuan araka dezakezu ezkutuko moduko leihoak erabilita</translation> <translation id="5338503421962489998">Tokiko biltegia</translation> +<translation id="5340620183031438925">AA moduari fitxari buruzko galderak egiteko orritik irten gabe, egiaztatu zeu zarela. Pasahitzak eta beste ere izango dituzu gailu guztietan.</translation> <translation id="5340787663756381836">&Aurkitu eta editatu</translation> <translation id="5340900621595888432">Bidali diagnostiko- eta erabilera-datuak</translation> <translation id="5341793073192892252">Cookie hauek blokeatu egin dira (hirugarrenen cookieak blokeatzen ari dira, salbuespenik gabe):</translation> @@ -7452,7 +7450,6 @@ <translation id="6180550893222597997">Zein sarbide-gako erabili nahi duzu <ph name="APP_NAME" /> webgunerako?</translation> <translation id="6181218116951226898">Batzuetan, aplikazioek beren marka eguneratzen dute. Eguneratu aurretik, berrikusi aldaketa guztiak, ondo iruditzen zaizkizula ziurtatzeko.</translation> <translation id="6181431612547969857">Deskarga blokeatu da</translation> -<translation id="6182100780603067202">Partekatu aplikazioaren audioa ere (leiho guztietakoa)</translation> <translation id="6183369864942961155">Gai argi/ilun automatikoa</translation> <translation id="6183773856988300112">Chrome-ko Gemini-k arakatze automatikoa erabiltzen du fitxetan lan egiteko eta ematen dizkiozun zereginak osatzeko. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Bilatu fitxak</translation> @@ -8245,7 +8242,6 @@ <translation id="6754359471209693699">Egin beste bilaketa bat</translation> <translation id="6754918760968695779">Txertatze bizkorra</translation> <translation id="6755702685749429945">Gehitu hiztegi bat</translation> -<translation id="6756157672127672536">Fitxategiak aplikazioarekin, azkar atzituko dituzu Google Drive-n, kanpoko memorian edo Chrome OS-ko gailuan gordeta dauzkazun fitxategiak.</translation> <translation id="6756643207511618722">Hizketa-motorrak</translation> <translation id="6757431299485455321">Lagundu beste gailuei wifi-gune hau aurkitzen.</translation> <translation id="6758056191028427665">Eman iritzia.</translation> @@ -9191,6 +9187,7 @@ <translation id="7406912950279255498">Koloreak alderantzikatzeko modua</translation> <translation id="7407430846095439694">Inportatu eta lotu</translation> <translation id="7407504355934009739">Jende gehienak blokeatu egiten ditu webgune honen jakinarazpenak</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> fitxategiak kontuzko datuak ditu. Erakundeak hodeiko biltegian gordetzeko edo baztertzeko aukera emango dizu.</translation> <translation id="7408080603962564527">Besteentzat ikusgai egongo da</translation> <translation id="740810853557944681">Gehitu inprimatze-zerbitzari bat</translation> <translation id="7409549334477097887">Oso-oso handia</translation> @@ -9243,6 +9240,7 @@ <translation id="7434969625063495310">Ezin izan da gehitu inprimatze-zerbitzaria. Egiaztatu ongi konfiguratuta dagoela eta saiatu berriro.</translation> <translation id="7436921188514130341">Errore bat gertatu da izena aldatzean.</translation> <translation id="7439519621174723623">Idatzi gailu-izen bat aurrera egiteko</translation> +<translation id="743982235360757672">Izan AA modua eskura arakatzen duzun bitartean</translation> <translation id="7441736532026945583">Taldea fitxen zintatik kentzeko, hautatu "Ezkutatu taldea"</translation> <translation id="7441736921018636843">Ezarpena aldatzeko, <ph name="BEGIN_LINK" />berrezarri sinkronizazioa<ph name="END_LINK" /> sinkronizazio-pasaesaldia kentzeko</translation> <translation id="7441830548568730290">Beste erabiltzaile batzuk</translation> @@ -9981,7 +9979,6 @@ <translation id="794676567536738329">Berretsi baimenak</translation> <translation id="7947962633355574091">K&opiatu bideoaren helbidea</translation> <translation id="7947964080535614577">Edukiak edo zerbitzuak erabiltzaileek ezer ordaindu gabe eskaini ahal izateko erakutsi ohi dituzte webguneek iragarkiak. Alabaina, badaude iragarki oztopatzaileak edo iruzurrezkoak erakusten dituzten webguneak ere.</translation> -<translation id="7948239795436419268">Ez leheneratu leihoak</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" /> domeinuko orri guztiak</translation> <translation id="7950629216186736592">Arrazoia: http://, https:// eta file:// daukaten URLekin soilik da bateragarria LBS.</translation> <translation id="7950814699499457511">Aktibatuta • Luzapen honek ez du argitaratu pribatutasun-jardunbiderik (adibidez, datuak biltzeko eta erabiltzeko duen moduari buruz)</translation> @@ -11170,7 +11167,6 @@ <translation id="8751034568832412184">Ikastetxea</translation> <translation id="8751329102746373229">Zure administratzaileak gehitutakoak</translation> <translation id="8752451679755290210">Mugitu automatikoki elementu batetik bestera</translation> -<translation id="8753948258138515839">Fitxategiak aplikazioarekin, azkar atzituko dituzu Google Drive-n, kanpoko memorian edo Chrome OS Flex-eko gailuan gordeta dituzun fitxategiak.</translation> <translation id="8754200782896249056"><p>Ordenagailu-ingurune bateragarri batean <ph name="PRODUCT_NAME" /> abiarazten duzunean, sistemaren proxy-ezarpenak erabiliko dira. Dena den, zure sistema ez da bateragarria edo arazo bat izan da sistemaren konfigurazioa kargatzean.</p> <p>Hala ere, agindu-lerroaren bidez konfigura dezakezu. Etengailuei eta ingurune-aldagaiei buruzko informazio gehiago lortzeko, ikusi <code>man <ph name="PRODUCT_BINARY_NAME" /></code>.</p></translation> @@ -11963,6 +11959,7 @@ <translation id="992778845837390402">Linux-en edukiontziaren babeskopia egiten</translation> <translation id="994087375490600917">Alboko panelak</translation> <translation id="994289308992179865">&Errepikatu behin eta berriz</translation> +<translation id="995420352808264005">Aukeratu gailua erregistratzeko mota</translation> <translation id="995755448277384931">Gehitu IBANa</translation> <translation id="996250603853062861">Konexio segurua ezartzen…</translation> <translation id="997143476478634194">Webguneetan sartzen zarenean, webguneek automatikoki jarraitzen diote ezarpen honi. Webguneek jakinarazpenak bidali ohi dituzte azken orduko albiste edo txat-mezuen berri emateko.</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 96d5958d..0d3c5560 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -285,7 +285,6 @@ <translation id="117916940443676133">کلید امنیتیتان پین ندارد و محافظتشده نیست. برای مدیریت دادههای ورود به سیستم، ابتدا پین ایجاد کنید.</translation> <translation id="1179400851034021914">IBAN نامعتبر است</translation> <translation id="1179902906564467236">دستورالعملهای روی تلفنتان را دنبال کنید یا از برنامه دوربین استفاده کنید</translation> -<translation id="1180117276105724040">درحال بازیابی پنجرهها از جلسه قبلیتان…</translation> <translation id="118057123461613219">صرفهجوییهای بسیار زیاد</translation> <translation id="1181037720776840403">برداشتن</translation> <translation id="1182876754474670069">صفحه اصلی</translation> @@ -395,6 +394,7 @@ <translation id="1252987234827889034">خطای نمایه رخ داد</translation> <translation id="1254034280040157728">گرند کنیون</translation> <translation id="1254593899333212300">اتصال اینترنتی مستقیم</translation> +<translation id="1254767904958485584">نمای دونیمه ایجاد شد</translation> <translation id="1255095393630332248">وقتیکه زبانهها همرسانی میشوند، محتوای صفحه، رسانه، و نشانی وب آنها به Google ارسال میشوند.</translation> <translation id="1256143630373008432">خودآزمایی ناموفق بود</translation> <translation id="1256588359404100567">تنظیم از دستگاه قبلیتان همگامسازی شده است.</translation> @@ -761,7 +761,6 @@ <translation id="151501797353681931">وارد شده از Safari</translation> <translation id="1515163294334130951">راهاندازی</translation> <translation id="1517467582299994451">برای پخش محتوا با کد، تنظیمات همگامسازی مرورگر Chrome را روشن کنید</translation> -<translation id="1519090060276706457">بازیابی پنجرهها بیشاز انتظار طول کشیده است</translation> <translation id="1521442365706402292">مدیریت گواهیها</translation> <translation id="1521655867290435174">کاربرگنگار Google</translation> <translation id="1521774566618522728">امروز فعال بود</translation> @@ -1182,7 +1181,6 @@ <translation id="1796460466266263589">برای ادامه استفاده از Gemini، هویتتان را درستیسنجی کنید</translation> <translation id="1796588414813960292">ویژگیهایی که به صدا نیاز دارند کار نخواهند کرد</translation> <translation id="1798726622311813209">کارتهای اعتباری و نقدی</translation> -<translation id="1799852120691957794">پنجرههای جلسه قبلیتان بازیابی نشد</translation> <translation id="180203835522132923">Search + O، سپس W</translation> <translation id="1802624026913571222">خواب، پس از اینکه درپوش بسته میشود</translation> <translation id="1802687198411089702">صفحه پاسخ نمیدهد. میتوانید منتظر بمانید یا خارج شوید.</translation> @@ -2273,6 +2271,7 @@ <translation id="2526590354069164005">دسک تاپ</translation> <translation id="2526619973349913024">بررسی برای وجود بهروزرسانی</translation> <translation id="2527167509808613699">هر نوع اتصال</translation> +<translation id="2528487766183344810">برای صادر کردن گواهینامه کارخواه، لطفاً قفل <ph name="TOKEN_NAME" /> را باز کنید.</translation> <translation id="2529887123641260401">همواره میتوانید در تنظیمات «دسترسی کلیدی» تنظیماتتان را تغییر دهید یا راهنمای راهاندازی را دوباره باز کنید.</translation> <translation id="2530166226437958497">عیبیابی</translation> <translation id="2531530485656743109"><ph name="BEGIN_PARAGRAPH1" />مشکلی پیش آمد و <ph name="DEVICE_OS" /> نصب نشد.<ph name="END_PARAGRAPH1" /> @@ -2378,7 +2377,6 @@ <translation id="2610374175948698697">میتواند فایلها یا پوشههای درون دستگاه را مشاهده کند</translation> <translation id="2610780100389066815">امضای فهرست اطمینان Microsoft</translation> <translation id="261114180663074524">به سیستم حساب Microsoft وارد شوید و دوباره امتحان کنید</translation> -<translation id="2611702650078660078">خطایی رخ داد</translation> <translation id="2611776654555141051">ابزار مستطیل</translation> <translation id="2611885296070244383">میکروفون (داخلی)</translation> <translation id="2612676031748830579">شماره کارت</translation> @@ -2478,6 +2476,7 @@ <translation id="2670403088701171361">به سایتها اجازه داده نشود نوشتار یا تصاویر موجود در بریدهدان را ببینند</translation> <translation id="2671423594960767771">همرسانی گروه</translation> <translation id="2671451824761031126">نشانکها و تنظیمات شما آماده هستند</translation> +<translation id="267276224968585180">Chrome درحال بار کردن پرچمها از فایل خط فرمان است. ممکن است ثبات و امنیت تحت تأثیر قرار بگیرد.</translation> <translation id="2673135533890720193">خواندن سابقه مرور شما</translation> <translation id="2673848446870717676">مطمئن شوید دستگاه بلوتوث درحالت جفتسازی و در همین اطراف باشد. فقط با دستگاههایی که به آنها اعتماد دارید جفت شوید. دستگاههای جفتشده برای همه حسابهای موجود در این Chromebook قابلمشاهده است.</translation> <translation id="2673873887296220733">یک فایل برای باز شدن در <ph name="CLOUD_PROVIDER" /> کپی شود؟</translation> @@ -2742,7 +2741,6 @@ <translation id="285033512555869047">بسته</translation> <translation id="2850541429955027218">افزودن زمینه</translation> <translation id="2851291081585704741">آفلاین هستید</translation> -<translation id="2852045827873867442">به اتصال اینترنت نیاز است.</translation> <translation id="285237063405807022">(بارگیری)</translation> <translation id="2853121255651601031">گذرواژه ذخیره شد</translation> <translation id="2854453262159518435">جایگزین کردن گروه زبانه موجود</translation> @@ -2838,6 +2836,7 @@ <translation id="2916745397441987255">جستجوی افزونهها</translation> <translation id="2918484639460781603">رفتن به «تنظیمات»</translation> <translation id="2918484644467055090">نمیتوان این دستگاه را در سازمانی که حسابتان متعلق به آن است ثبتنام کرد زیرا دستگاه برای مدیریت توسط سازمان دیگری علامتگذاری شده است.</translation> +<translation id="2920257489056757859">نمادی که نشان میدهد سازمانتان این نمایه را مدیریت میکند</translation> <translation id="2920346489891435227">باز کردن پیوند در نمای راست</translation> <translation id="2920852127376356161">اجازه ندارد پروتکلها را کنترل کند</translation> <translation id="2921081876747860777">لطفاً برای محافظت از داده محلی گذرواژهای ایجاد کنید.</translation> @@ -3286,6 +3285,7 @@ <translation id="3241638166094654466">تعداد سلولها در هر خط:</translation> <translation id="3241680850019875542">دایرکتوری ریشه برنامهٔ افزودنی را برای فشرده کردن انتخاب کنید. همچنین برای بهروزرسانی برنامهٔ افزودنی، فایل کلید خصوصی را برای استفاده مجدد انتخاب کنید.</translation> <translation id="3241810535741601486">این تغییر دائمی است و قابلبازگرداندن نیست. بهروزرسانیهای تمدیدشده برای همه کاربران این دستگاه اعمال میشود. <ph name="LINK_START" />بیشتر بدانید<ph name="LINK_END" /></translation> +<translation id="324205398936770726">چهرک شما</translation> <translation id="3243017971870859287">خواندن شمارههای سریال عنصر و دستگاه ChromeOS Flex</translation> <translation id="324366796737464147">حذف نوفه زمینه</translation> <translation id="3244271242291266297">ماه</translation> @@ -4502,6 +4502,7 @@ <translation id="405181879009056822">تنظیمات ChromeOS</translation> <translation id="4052120076834320548">بسیار کوچک</translation> <translation id="4052913941260326985">ایجاد رمزینه پاسخسریع</translation> +<translation id="4053028343167125998">برای وارد کردن گواهینامه کارخواه، لطفاً قفل <ph name="TOKEN_NAME" /> را باز کنید.</translation> <translation id="4053833479432165765">نصب صفحه بهعنوان برنامه…</translation> <translation id="4054070260844648638">نمایان برای همه</translation> <translation id="4056908315660577142">به حداکثر زمانی که ولیتان برای برنامه Chrome <ph name="APP_NAME" /> تنظیم کرده است رسیدهاید. میتوانید فردا بهمدت <ph name="TIME_LIMIT" /> از آن استفاده کنید.</translation> @@ -4715,6 +4716,7 @@ <translation id="4226303886821889519">نسخه بهروزرسان: <ph name="VERSION" /></translation> <translation id="4228071595943929139">استفاده از نشانی ایمیل سازمان</translation> <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{این افزونه مجاز نیست}one{برخی افزونهها مجاز نیستند}other{برخی افزونهها مجاز نیستند}}</translation> +<translation id="4229538146709970028">لطفاً قفل <ph name="TOKEN_NAME" /> را باز کنید تا بتوانید با گواهی خود در <ph name="HOST_NAME" /> اصالتسنجی کنید.</translation> <translation id="4231053948789591973">پخش محتوا موقتاً متوقف شده است. هرزمان بخواهید میتوانید پخش محتوای صفحهنمایش را ازسر بگیرید یا متوقف کنید.</translation> <translation id="4231095370974836764">برنامهها و بازیها را از Google Play در <ph name="DEVICE_TYPE" /> نصب کنید. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="4232375817808480934">پیکربندی Kerberos</translation> @@ -5498,7 +5500,6 @@ <translation id="4779766576531456629">تغییر دادن نام شبکه تلفن همراه سیمکارت داخلی</translation> <translation id="4780321648949301421">ذخیره صفحه بهعنوان...</translation> <translation id="4780558987886269159">برای کار</translation> -<translation id="4781633367688946589">ادامه دادن در جلسه جدید</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> میخواهد از اطلاعات شخصی موجود در کیف پول دیجیتال شما استفاده کند.</translation> <translation id="4785719467058219317">شما از کلید امنیتی استفاده میکنید که در این وبسایت ثبت نشده است</translation> <translation id="4785914069240823137">لغو برش</translation> @@ -5854,6 +5855,7 @@ <translation id="5026874946691314267">این مورد دیگر نشان داده نشود.</translation> <translation id="5027550639139316293">گواهی ایمیل</translation> <translation id="5027562294707732951">افزودن افزونه</translation> +<translation id="502811790397568978">لطفاً قفل <ph name="TOKEN_NAME" /> را باز کنید تا بتوانید گواهینامه کارخواه را از <ph name="HOST_NAME" /> وارد کنید.</translation> <translation id="5029287942302939687">گذرواژهتان تنظیم شد</translation> <translation id="5029873138381728058">بررسی ماشینهای مجازی (VMs) انجام نشد</translation> <translation id="503155457707535043">درحال بارگیری برنامهها</translation> @@ -6055,6 +6057,7 @@ <translation id="5172855596271336236">۱ چاپگر مدیریتشده وجود دارد.</translation> <translation id="5173668317844998239">اثرانگشت به کلید امنیتی اضافه کنید یا اثرهای انگشت ذخیرهشده در آن را حذف کنید</translation> <translation id="5174169235862638850">گذرواژه در بریدهدان کپی شد</translation> +<translation id="517488401359338823">باز کردن قفل دستگاه امنیتی</translation> <translation id="5177479852722101802">ادامه مسدود کردن دسترسی به دوربین و میکروفن</translation> <translation id="5177549709747445269">از داده تلفن همراه استفاده میکنید</translation> <translation id="5178667623289523808">یافتن قبلی</translation> @@ -7474,7 +7477,6 @@ <translation id="6180550893222597997">میخواهید از کدام گذرکلید برای <ph name="APP_NAME" /> استفاده کنید؟</translation> <translation id="6181218116951226898">گاهیاوقات برنامهها نمانامهایشان را بهروز میکنند. قبلاز بهروزرسانی، تمام تغییرات را بازبینی کنید تا مطمئن شوید با آنها مشکلی ندارید.</translation> <translation id="6181431612547969857">بارگیری مسدود شد</translation> -<translation id="6182100780603067202">صدای برنامه (از همه پنجرههای آن) نیز همرسانی شود</translation> <translation id="6183369864942961155">زمینه تاریک/روشن خودکار</translation> <translation id="6183773856988300112">«Gemini در Chrome» از مرور خودکار برای کار کردن در زبانهها و تکمیل کردن تکلیفهایی که به آن میدهید استفاده میکند. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="6184099524311454384">جستجوی زبانهها</translation> @@ -8269,9 +8271,9 @@ <translation id="6754359471209693699">شروع جستجوی جدید</translation> <translation id="6754918760968695779">درج سریع</translation> <translation id="6755702685749429945">افزودن واژهنامه</translation> -<translation id="6756157672127672536">برنامه Files دسترسی سریع به فایلهایی را فراهم میکند که در Google Drive، فضای ذخیرهسازی خارجی، یا دستگاه ChromeOS خودتان ذخیره کردهاید.</translation> <translation id="6756643207511618722">موتورهای گفتار</translation> <translation id="6757431299485455321">کمک میکند دستگاههای دیگر این نقطه اتصال را پیدا کنند.</translation> +<translation id="6757615605516049275">لطفاً قفل <ph name="TOKEN_NAME" /> را باز کنید.</translation> <translation id="6758056191028427665">عملکردمان را به ما نشان دهید.</translation> <translation id="6759193508432371551">بازنشانی به تنظیمات کارخانه</translation> <translation id="6760354150216532978">هشدار: این سایت میتواند ویرایشهای شما را ببیند</translation> @@ -8467,6 +8469,7 @@ <translation id="6871644448911473373">پاسخگوی OCSP: <ph name="LOCATION" /></translation> <translation id="6871860225073478239">زبانها…</translation> <translation id="6872859537300194762"><ph name="TASK_TITLE" />\nتکلیفتان را بهدلیل فعالیت دیگری موقتاً متوقف کردم. وقتی آماده شد میتوانید برای مشاهده آن به Chrome برگردید.</translation> +<translation id="6873156759937047811">پین:</translation> <translation id="6873571253135628430">تغییر اجازههای سایت</translation> <translation id="6876155724392614295">دوچرخه</translation> <translation id="6876469544038980967">مفید نبودند</translation> @@ -9405,7 +9408,7 @@ <translation id="7531779363494549572">به «تنظیمات > برنامهها و اعلانها > اعلانها» بروید.</translation> <translation id="7532009420053991888"><ph name="LINUX_APP_NAME" /> پاسخ نمیدهد. برای بستن برنامه، «بستن اجباری» را انتخاب کنید.</translation> <translation id="75362970626182391">گروه زبانه جدید</translation> -<translation id="7536815228183532290">ورود به سیستم با <ph name="EMAIL" /></translation> +<translation id="7536815228183532290">واردشده به سیستم با <ph name="EMAIL" /></translation> <translation id="7538013435257102593">این نوع فایل معمولاً بارگیری نمیشود و ممکن است خطرناک باشد</translation> <translation id="7540972813190816353">در هنگام بررسی برای وجود بهروزرسانی خطایی رخ داد: <ph name="ERROR" /></translation> <translation id="7541076351905098232"><ph name="MANAGER" /> این دستگاه را به نسخه قبلی برگردانده است. لطفاً فایلهای مهم را ذخیره کنید، سپس دستگاه را بازراهاندازی کنید. همه دادههای ذخیرهشده در دستگاه حذف خواهد شد.</translation> @@ -10009,7 +10012,6 @@ <translation id="794676567536738329">تأیید اجازهها</translation> <translation id="7947962633355574091">کپی آدرس ویدیو</translation> <translation id="7947964080535614577">سایتها معمولاً آگهی نشان میدهند تا بتوانند محتوا یا سرویسها را بهطور رایگان ارائه دهند. اما برخیاز سایتها بهعنوان سایتهایی شناخته شدهاند که آگهیهای مزاحم یا گمراهکننده نمایش میدهند.</translation> -<translation id="7948239795436419268">پنجرهها بازیابی نشوند</translation> <translation id="7948407723851303488">همه صفحههای <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">دلیل: LBS فقط از نشانیهای وب http://، https://، و file:// پشتیبانی میکند.</translation> <translation id="7950814699499457511">روشن • این افزونه روشهای اعمال حریم خصوصی، مثل نحوه جمعآوری و استفاده از دادهها را منتشر نکرده است.</translation> @@ -10557,6 +10559,7 @@ <translation id="8317965619823678157">کپی کردن گذرواژهها</translation> <translation id="8318266828739827371">از نمای صفحهٔ دونیمه برای دیدن ناحیه درشتنماییشده در صفحهنمایش استفاده کنید. از کلیدهای «جستجو + مهار + D» برای روشن و خاموش کردن ذرهبین متصل استفاده کنید.</translation> <translation id="8318680582681577962">قاب فرعی PDF ناشناس: <ph name="SUBFRAME_SITE" /></translation> +<translation id="8319105959731007612">«جداسازی پردازش» مانع از دستکاری <ph name="IDS_SHORT_PRODUCT_NAME" /> توسط برنامههای دیگر میشود.</translation> <translation id="8319414634934645341">کاربرد کلید توسعه یافته</translation> <translation id="8320212361750431956">فعالیت اخیر</translation> <translation id="8321476692217554900">اعلانها</translation> @@ -11198,7 +11201,6 @@ <translation id="8751034568832412184">مدرسه</translation> <translation id="8751329102746373229">ازسوی سرپرست شما</translation> <translation id="8752451679755290210">جابهجا شدن خودکار میان موارد</translation> -<translation id="8753948258138515839">با برنامه Files میتوانید به فایلهایی که در Google Drive، فضای ذخیرهسازی خارجی، یا دستگاه ChromeOS Flex ذخیره کردهاید دسترسی سریع داشته باشید.</translation> <translation id="8754200782896249056"><p>هنگام اجرای <ph name="PRODUCT_NAME" /> تحت محیط پشتیبانی شده دسک تاپ، تنظیمات پروکسی سیستم استفاده خواهد شد. اما، سیستم شما پشتیبانی نمیشود یا مشکلی در راهاندازی پیکربندی سیستم شما وجود دارد.</p> <p>اما هنوز شما میتوانید از طریق خط فرمان پیکربندی کنید. لطفاً برای کسب اطلاعات بیشتر درباره متغیرهای محیط و پرچمها به <code>راهنمای <ph name="PRODUCT_BINARY_NAME" /></code> مراجعه کنید.</p></translation> @@ -11852,6 +11854,7 @@ <translation id="9186743636216815027">{NUM_APPS,plural,offset:2 =1{سرپرستتان میتواند صفحهنمایش را با <ph name="APP0_NAME" /> ضبط کند. وقتی ضبط شروع شود به شما اطلاع داده نخواهد شد.}=2{سرپرستتان میتواند صفحهنمایش را با <ph name="APP0_NAME" /> و <ph name="APP1_NAME" /> ضبط کند. وقتی ضبط شروع شود به شما اطلاع داده نخواهد شد.}=3{سرپرستتان میتواند صفحهنمایش را با <ph name="APP0_NAME" />، <ph name="APP1_NAME" />، و ۱ برنامه دیگر ضبط کند. وقتی ضبط شروع شود به شما اطلاع داده نخواهد شد.}one{سرپرستتان میتواند صفحهنمایش را با <ph name="APP0_NAME" />، <ph name="APP1_NAME" />، و # برنامه دیگر ضبط کند. وقتی ضبط شروع شود به شما اطلاع داده نخواهد شد.}other{سرپرستتان میتواند صفحهنمایش را با <ph name="APP0_NAME" />، <ph name="APP1_NAME" />، و # برنامه دیگر ضبط کند. وقتی ضبط شروع شود به شما اطلاع داده نخواهد شد.}}</translation> <translation id="9186963452600581158">ورود به سیستم با «حساب Google» فرزند</translation> <translation id="9187967020623675250">کلیدها مطابقت ندارند. برای <ph name="RESPONSE" />، یکی از کلیدها را فشار دهید.</translation> +<translation id="9188142767272053574">فعال کردن «جداسازی پردازش»</translation> <translation id="9189618485998894982">این برنامه مسدود شده است. لطفاً با توسعهدهنده تماس بگیرید</translation> <translation id="9192019773545828776">با شنیدن بازخورد گفتاری میتوانید بدون نگاه کردن به صفحهنمایش از دستگاهتان استفاده کنید. بازخورد بریل ازطریق دستگاه متصل دردسترس است. از کلیدهای «مهار + دگرساز + Z» برای روشن و خاموش کردن ChromeVox استفاده کنید. از «جستجو + کلید چپبَر یا کلید راستبَر» برای پیمایش استفاده کنید. از کلیدهای «جستجو + فاصله» برای انتخاب (فعال کردن) استفاده کنید.</translation> <translation id="9195969368671142407">وقتی سازمانتان ذخیرهسازی در «حساب Google» شما را محدود میکند، نمیتوانید گروههای زبانه را همرسانی کنید یا به آنها بپیوندید</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index f0bd9b01..fe42add 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Pääsolmun merkintätiedostoja ei voi ladata. Yritä myöhemmin uudelleen.</translation> <translation id="1103523840287552314">Käännä <ph name="LANGUAGE" /> aina</translation> <translation id="1104098698795583187">Menetät välittömästi pääsyn välilehtiryhmään, ja se poistetaan kaikilta laitteiltasi</translation> +<translation id="1105934302947321130">Google Beam ja Zoom</translation> <translation id="1106270460549661906">Peru Geminille jakaminen</translation> <translation id="1106350001632362876">Nosta kynnysarvoa</translation> <translation id="110850812463801904">Yhdistä OneDriveen manuaalisesti</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Suojausavaintasi ei ole suojattu PIN-koodilla. Luo PIN-koodi, jotta voit ylläpitää kirjautumisdataa.</translation> <translation id="1179400851034021914">IBAN on virheellinen</translation> <translation id="1179902906564467236">Seuraa puhelimen ohjeita tai käytä kamerasovellusta</translation> -<translation id="1180117276105724040">Palautetaan edellisen istunnon ikkunoita…</translation> <translation id="118057123461613219">Huikeat säästöt</translation> <translation id="1181037720776840403">Poista</translation> <translation id="1182876754474670069">koti</translation> @@ -762,7 +762,6 @@ <translation id="151501797353681931">Tuotu Safarista</translation> <translation id="1515163294334130951">Käynnistä</translation> <translation id="1517467582299994451">Laita Chrome-selaimen synkronointiasetukset päälle, jotta voit striimata koodin avulla</translation> -<translation id="1519090060276706457">Ikkunoiden palauttaminen kestää odotettua kauemmin</translation> <translation id="1521442365706402292">Hallinnoi varmenteita</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">Aktiivinen tänään</translation> @@ -1110,6 +1109,7 @@ <translation id="1745732479023874451">Ylläpidä kontakteja</translation> <translation id="1748283190377208783">{0,plural, =1{käyttämätön monikko}other{Haluatko avata ja muokata # tiedostoa tässä verkkosovelluksessa?}}</translation> <translation id="1748563609363301860">Voit tallentaa tämän salasanan Google-tilillesi tai vain tälle laitteelle</translation> +<translation id="1749645492410897998">Asennetaan ohjelmistoa</translation> <translation id="1749733017156547309">Salasana on pakollinen</translation> <translation id="1750172676754093297">Tähän suojausavaimeen ei voi tallentaa sormenjälkiä</translation> <translation id="1750238553597293878">Jatka Google-tilisi salasanojen käyttöä</translation> @@ -1181,7 +1181,6 @@ <translation id="1796460466266263589">Jatka Geminin käyttöä vahvistamalla henkilöllisyytesi</translation> <translation id="1796588414813960292">Ääntä edellyttävät ominaisuudet eivät enää toimi</translation> <translation id="1798726622311813209">Credit- ja debit-kortit</translation> -<translation id="1799852120691957794">Edellisen istunnon ikkunoita ei voi palauttaa</translation> <translation id="180203835522132923">Haku + O ja sitten W</translation> <translation id="1802624026913571222">Lepotila, kun kansi suljetaan</translation> <translation id="1802687198411089702">Tämä sivu ei vastaa. Voit odottaa sitä tai sulkea sen.</translation> @@ -2378,7 +2377,6 @@ <translation id="2610374175948698697">Saa nähdä laitteesi tiedostot tai kansiot</translation> <translation id="2610780100389066815">Microsoft-luottamusluettelon allekirjoitus</translation> <translation id="261114180663074524">Kirjaudu Microsoft-tilille ja yritä uudelleen</translation> -<translation id="2611702650078660078">Tapahtui virhe</translation> <translation id="2611776654555141051">Suorakulmiotyökalu</translation> <translation id="2611885296070244383">Mikrofoni (sisäinen)</translation> <translation id="2612676031748830579">Kortin numero</translation> @@ -2742,7 +2740,6 @@ <translation id="285033512555869047">Suljettu</translation> <translation id="2850541429955027218">Lisää teema</translation> <translation id="2851291081585704741">Olet offline-tilassa</translation> -<translation id="2852045827873867442">Edellyttää internetyhteyttä.</translation> <translation id="285237063405807022">(ladataan)</translation> <translation id="2853121255651601031">Salasana tallennettu</translation> <translation id="2854453262159518435">Korvaa nykyinen välilehtiryhmä</translation> @@ -3609,6 +3606,7 @@ <translation id="3473241910002674503">Tablettitilan painikkeilla voit siirtyä aloitusnäytölle, takaisin ja vaihtaa sovellusta.</translation> <translation id="3473479545200714844">Ruudun suurentaminen</translation> <translation id="3474218480460386727">Käytä uudessa sanassa korkeintaan 99 kirjainta</translation> +<translation id="3474330892505468100">Google Beam ja Meet</translation> <translation id="3474624961160222204">Jatka käyttäjänä <ph name="NAME" /></translation> <translation id="3477772589943384839">Saat kohtuullisen muistinsäästön. Välilehdet muuttuvat epäaktiivisiksi pidemmän ajan kuluttua.</translation> <translation id="347785443197175480">Anna sivuston <ph name="HOST" /> käyttää edelleen kameraasi ja mikrofoniasi</translation> @@ -5494,7 +5492,6 @@ <translation id="4779766576531456629">Nimeä eSIM-mobiiliverkko uudelleen</translation> <translation id="4780321648949301421">Tallenna sivu nimellä...</translation> <translation id="4780558987886269159">Työntekoon</translation> -<translation id="4781633367688946589">Jatka uuteen istuntoon</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> haluaa käyttää henkilökohtaisia tietoja digitaalisesta lompakostasi.</translation> <translation id="4785719467058219317">Käytät suojausavainta, jota ei ole rekisteröity tällä sivustolla.</translation> <translation id="4785914069240823137">Peru rajaus</translation> @@ -6283,6 +6280,7 @@ <translation id="5337926771328966926">Laitteen nimi on tällä hetkellä <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Voit selata verkkoa yksityisesti incognito-ikkunan avulla</translation> <translation id="5338503421962489998">Paikallinen tallennustila</translation> +<translation id="5340620183031438925">Jos haluat kysyä tekoälytilalta välilehdestä poistumatta sivulta, vahvista henkilöllisyytesi. Voit myös käyttää salasanojasi ja muita tietoja kaikilla laitteillasi.</translation> <translation id="5340787663756381836">&Etsi ja muokkaa</translation> <translation id="5340900621595888432">Lähetä diagnostiikka- ja käyttödataa</translation> <translation id="5341793073192892252">Seuraavat evästeet estettiin (kolmannen osapuolen evästeet estetään poikkeuksetta)</translation> @@ -7469,7 +7467,6 @@ <translation id="6180550893222597997">Mitä avainkoodia haluat käyttää sovelluksessa <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Sovellukset päivittävät joskus brändäystään. Tarkista ennen päivittämistä kaikki muutokset ja varmista, että ne sopivat sinulle.</translation> <translation id="6181431612547969857">Lataus estettiin</translation> -<translation id="6182100780603067202">Jaa myös sovelluksen audio (kaikista ikkunoista)</translation> <translation id="6183369864942961155">Automaattinen vaalea/tumma teema</translation> <translation id="6183773856988300112">Gemini in Chrome käyttää automaattista selausta, jotta se voi toimia välilehdilläsi ja hoitaa sille antamiasi tehtäviä. <ph name="LINK_BEGIN" />Lue lisää<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Hae välilehtiä</translation> @@ -8262,7 +8259,6 @@ <translation id="6754359471209693699">Aloita uusi haku</translation> <translation id="6754918760968695779">Pikalisäys</translation> <translation id="6755702685749429945">Lisää sanakirja</translation> -<translation id="6756157672127672536">Tiedostot-sovelluksen kautta voit pikakäyttää Google Driveen, ulkoiseen tallennustilaan tai Chrome-käyttöjärjestelmää käyttävälle laitteelle tallennettuja tiedostoja.</translation> <translation id="6756643207511618722">Puhemoottorit</translation> <translation id="6757431299485455321">Auta muita laitteita löytämään tämä hotspot.</translation> <translation id="6758056191028427665">Kerro mielipiteesi</translation> @@ -9209,6 +9205,7 @@ <translation id="7406912950279255498">Käänteiset värit ‑tila</translation> <translation id="7407430846095439694">Tuo ja sido</translation> <translation id="7407504355934009739">Useimmat ihmiset estävät tämän sovelluksen ilmoitukset</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> sisältää arkaluontoista dataa. Organisaatio antaa sinun tallentaa sen pilvitallennustilaan tai hylätä sen</translation> <translation id="7408080603962564527">Tämä näkyy muille</translation> <translation id="740810853557944681">Lisää tulostuspalvelin</translation> <translation id="7409549334477097887">Erittäin suuri</translation> @@ -9262,6 +9259,7 @@ <translation id="7434969625063495310">Tulostuspalvelinta ei voitu asentaa. Tarkista palvelimen asetukset ja yritä uudelleen.</translation> <translation id="7436921188514130341">Harmin paikka! Uudelleennimeämisen aikana tapahtui virhe.</translation> <translation id="7439519621174723623">Jatka lisäämällä laitteen nimi</translation> +<translation id="743982235360757672">Pidä tekoälytila lähellä selatessasi</translation> <translation id="7441736532026945583">Poista ryhmä välilehtiriviltä valitsemalla "Piilota ryhmä"</translation> <translation id="7441736921018636843">Jos haluat muuttaa tätä, <ph name="BEGIN_LINK" />nollaa synkronointi<ph name="END_LINK" /> poistaaksesi synkronoinnin tunnuslauseen</translation> <translation id="7441830548568730290">Muut käyttäjät</translation> @@ -10000,7 +9998,6 @@ <translation id="794676567536738329">Vahvista luvat</translation> <translation id="7947962633355574091">K&opioi videon osoite</translation> <translation id="7947964080535614577">Sivustot näyttävät yleensä mainoksia voidakseen tarjota sisältöä tai palveluja maksutta. Joidenkin sivustojen tiedetään näyttävän häiritseviä tai harhaanjohtavia mainoksia.</translation> -<translation id="7948239795436419268">Älä palauta ikkunoita</translation> <translation id="7948407723851303488">Kaikki sivut, joiden verkkotunnus on <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Syy: Vanhojen selaimien tuki koskee vain http://-, https://- ja file://-URL-osoitteita.</translation> <translation id="7950814699499457511">Päällä • Tästä laajennuksesta ei ole julkaistu tietosuojakäytäntöjä koskien esimerkiksi datan keräämistä ja käyttöä.</translation> @@ -11189,7 +11186,6 @@ <translation id="8751034568832412184">Koulu</translation> <translation id="8751329102746373229">Järjestelmänvalvojalta</translation> <translation id="8752451679755290210">Siirry kohteiden välillä automaattisesti</translation> -<translation id="8753948258138515839">Tiedostot-sovelluksen kautta pääset käyttämään nopeasti Google Driveen, ulkoiseen tallennustilaan tai ChromeOS Flexiä käyttävälle laitteellesi tallennettuja tiedostoja.</translation> <translation id="8754200782896249056"><p>Kun tuotetta <ph name="PRODUCT_NAME" /> käytetään tuetussa työpöytäympäristössä, järjestelmän välityspalvelinasetukset ovat käytössä. Joko järjestelmäsi ei ole tuettu tai järjestelmän määrityksiä käynnistettäessä tapahtui virhe.</p> <p>Voit kuitenkin määrittää asetukset komentorivin kautta. Lisätietoja ilmoituksista ja ympäristömuuttujista saat täältä: <code>man <ph name="PRODUCT_BINARY_NAME" /></code>.</p></translation> @@ -11982,6 +11978,7 @@ <translation id="992778845837390402">Linux-varmuuskopiointi käynnissä</translation> <translation id="994087375490600917">Sivupaneelit</translation> <translation id="994289308992179865">Toista &jatkuvasti</translation> +<translation id="995420352808264005">Valitse laitteen rekisteröintityyppi</translation> <translation id="995755448277384931">Lisää IBAN-numero</translation> <translation id="996250603853062861">Muodostetaan suojattua yhteyttä...</translation> <translation id="997143476478634194">Avaamasi sivustot noudattavat tätä asetusta automaattisesti. Sivustoilta lähetetään yleensä ilmoituksia esimerkiksi tuoreista uutisista tai chat-viesteistä.</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 08fbd2a..aebd8b4 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -285,7 +285,6 @@ <translation id="117916940443676133">Hindi pinoprotektahan ng PIN ang iyong security key. Para pamahalaan ang data sa pag-sign in, gumawa muna ng PIN.</translation> <translation id="1179400851034021914">Invalid ang IBAN</translation> <translation id="1179902906564467236">Sundin ang mga tagubilin sa iyong telepono o gamitin ang camera app</translation> -<translation id="1180117276105724040">Nire-restore ang mga window mula sa iyong nakaraang session...</translation> <translation id="118057123461613219">Malalaking natipid</translation> <translation id="1181037720776840403">Alisin</translation> <translation id="1182876754474670069">home</translation> @@ -395,6 +394,7 @@ <translation id="1252987234827889034">Nagkaroon ng error sa profile</translation> <translation id="1254034280040157728">Grand Canyon</translation> <translation id="1254593899333212300">Direktang koneksyon ng Internet</translation> +<translation id="1254767904958485584">Nagawa na ang split view</translation> <translation id="1255095393630332248">Kapag na-share ang mga tab, ipapadala sa Google ang mga content ng page, media, at mga URL ng mga ito.</translation> <translation id="1256143630373008432">Hindi naisagawa ang self test</translation> <translation id="1256588359404100567">Na-sync ang setting mula sa dati mong device.</translation> @@ -764,7 +764,6 @@ <translation id="151501797353681931">Na-import Mula sa Safari</translation> <translation id="1515163294334130951">Ilunsad</translation> <translation id="1517467582299994451">Para mag-cast gamit ang isang code, i-on ang mga setting sa pag-sync ng Chrome browser</translation> -<translation id="1519090060276706457">Mas matagal kaysa sa inaasahan ang pag-restore ng mga window</translation> <translation id="1521442365706402292">Pamahalaan ang mga sertipiko</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">Aktibo ngayong araw</translation> @@ -1185,7 +1184,6 @@ <translation id="1796460466266263589">Para magamit pa rin ang Gemini, i-verify na ikaw ito</translation> <translation id="1796588414813960292">Hindi gagana ang mga feature na nangangailangan ng tunog</translation> <translation id="1798726622311813209">Mga credit at debit card</translation> -<translation id="1799852120691957794">Hindi ma-restore ang mga window mula sa iyong nakaraang session</translation> <translation id="180203835522132923">Search + O, pagkatapos ay W</translation> <translation id="1802624026913571222">I-sleep kapag nakasara ang cover</translation> <translation id="1802687198411089702">Hindi tumutugon ang page. Maaari mo itong hintayin o maaari kang lumabas.</translation> @@ -2277,6 +2275,7 @@ <translation id="2526590354069164005">Desktop</translation> <translation id="2526619973349913024">Tumingin para sa update</translation> <translation id="2527167509808613699">Anumang uri ng koneksyon</translation> +<translation id="2528487766183344810">Paki-unlock ang <ph name="TOKEN_NAME" /> para ma-export ang certificate ng client.</translation> <translation id="2529887123641260401">Puwede mong baguhin anumang oras ang iyong mga setting o buksan ulit ang gabay sa pag-set up mula sa mga setting ng Switch Access.</translation> <translation id="2530166226437958497">Pag-troubleshoot</translation> <translation id="2531530485656743109"><ph name="BEGIN_PARAGRAPH1" />Nagkaproblema at hindi ma-install ang <ph name="DEVICE_OS" />.<ph name="END_PARAGRAPH1" /> @@ -2382,7 +2381,6 @@ <translation id="2610374175948698697">Puwedeng tumingin ng mga file o folder sa iyong device</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">Mag-sign in sa iyong Microsoft account at subukan ulit</translation> -<translation id="2611702650078660078">Nagka-error</translation> <translation id="2611776654555141051">Rectangle Tool</translation> <translation id="2611885296070244383">Mikropono (internal)</translation> <translation id="2612676031748830579">Numero ng card</translation> @@ -2482,6 +2480,7 @@ <translation id="2670403088701171361">Huwag payagan ang mga site na makita ang text o mga larawan sa iyong clipboard</translation> <translation id="2671423594960767771">Ibahagi ang pangkat</translation> <translation id="2671451824761031126">Handa na ang iyong mga bookmark at setting</translation> +<translation id="267276224968585180">Nilo-load ng Chrome ang mga pag-flag mula sa isang command-line file. Posibleng maapektuhan ang stability at seguridad.</translation> <translation id="2673135533890720193">Basahin ang iyong history ng pag-browse</translation> <translation id="2673848446870717676">Tiyaking nasa pairing mode at nasa malapit ang iyong Bluetooth device. Makipagpares lang sa mga device na pinagkakatiwalaan mo. Makikita ng lahat ng account sa Chromebook na ito ang mga nakapares na device.</translation> <translation id="2673873887296220733">Kopyahin ang 1 file sa <ph name="CLOUD_PROVIDER" /> para buksan?</translation> @@ -2746,7 +2745,6 @@ <translation id="285033512555869047">Sarado</translation> <translation id="2850541429955027218">Magdagdag ng tema</translation> <translation id="2851291081585704741">Offline ka</translation> -<translation id="2852045827873867442">Nire-require ang koneksyon sa internet.</translation> <translation id="285237063405807022">(naglo-load)</translation> <translation id="2853121255651601031">Na-save ang Password</translation> <translation id="2854453262159518435">Palitan ang kasalukuyang grupo ng tab</translation> @@ -2842,6 +2840,7 @@ <translation id="2916745397441987255">Maghanap sa mga extension</translation> <translation id="2918484639460781603">Pumunta sa mga setting</translation> <translation id="2918484644467055090">Hindi puwedeng i-enroll ang device na ito sa organisasyon kung saan nabibilang ang iyong account dahil minarkahan ang device para pamahalaan ng ibang organisasyon.</translation> +<translation id="2920257489056757859">Isang icon na nagsasaad na pinapamahalaan ng iyong organisasyon ang profile na ito</translation> <translation id="2920346489891435227">Buksan ang Link sa Kanang View</translation> <translation id="2920852127376356161">Hindi pinapayagang mangasiwa ng mga protocol</translation> <translation id="2921081876747860777">Mangyaring gumawa ng password upang protektahan ang iyong lokal na data.</translation> @@ -3290,6 +3289,7 @@ <translation id="3241638166094654466">Mga cell sa bawat linya:</translation> <translation id="3241680850019875542">Piliin ang pinagmulang direktoryo ng extension sa pack. Upang mai-update ang extension, piliin rin ang file ng private na key na muling gagamitin.</translation> <translation id="3241810535741601486">Permanente ang pagbabagong ito at hindi mababawi. Ia-apply ang mga pinalawig na update sa lahat ng user ng device na ito. <ph name="LINK_START" />Matuto pa<ph name="LINK_END" /></translation> +<translation id="324205398936770726">Iyong avatar</translation> <translation id="3243017971870859287">Basahin ang mga serial number ng ChromeOS Flex device at bahagi</translation> <translation id="324366796737464147">Pagkansela ng ingay</translation> <translation id="3244271242291266297">MM</translation> @@ -4506,6 +4506,7 @@ <translation id="405181879009056822">Mga Setting ng ChromeOS</translation> <translation id="4052120076834320548">Maliit</translation> <translation id="4052913941260326985">Gumawa ng &QR Code</translation> +<translation id="4053028343167125998">Paki-unlock ang <ph name="TOKEN_NAME" /> para ma-import ang certificate ng client.</translation> <translation id="4053833479432165765">&I-install ang page bilang app...</translation> <translation id="4054070260844648638">Makikita ng lahat ng tao</translation> <translation id="4056908315660577142">Naabot mo na ang limitasyon sa oras na itinakda ng iyong magulang para sa Chrome app na <ph name="APP_NAME" />. Puwede mo itong magamit nang <ph name="TIME_LIMIT" /> bukas.</translation> @@ -4719,6 +4720,7 @@ <translation id="4226303886821889519">Bersyon ng updater: <ph name="VERSION" /></translation> <translation id="4228071595943929139">Gamitin ang email address ng iyong organisasyon</translation> <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Hindi pinapayagan ang extension na ito}one{Hindi pinapayagan ang ilang extension}other{Hindi pinapayagan ang ilang extension}}</translation> +<translation id="4229538146709970028">Paki-unlock ang <ph name="TOKEN_NAME" /> para mag-authenticate sa <ph name="HOST_NAME" /> gamit ang iyong certificate.</translation> <translation id="4231053948789591973">Kasalukuyang naka-pause ang pag-cast. Puwede mong ituloy ang pag-cast o ihinto ang pag-cast ng iyong screen sa anumang oras.</translation> <translation id="4231095370974836764">Mag-install ng mga app at laro mula sa Google Play sa iyong <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> <translation id="4232375817808480934">I-configure ang Kerberos</translation> @@ -5502,7 +5504,6 @@ <translation id="4779766576531456629">I-rename ang Cellular network ng eSIM</translation> <translation id="4780321648949301421">I-save ang Page Bilang...</translation> <translation id="4780558987886269159">Para sa trabaho</translation> -<translation id="4781633367688946589">Magpatuloy sa bagong session</translation> <translation id="4784349455504343791">Gustong gamitin ng <ph name="WEBSITE_ORIGIN" /> ang personal na impormasyon mula sa iyong digital wallet.</translation> <translation id="4785719467058219317">Gumagamit ka ng security key na hindi nakarehistro sa website na ito</translation> <translation id="4785914069240823137">Kanselahin ang Pag-crop</translation> @@ -5858,6 +5859,7 @@ <translation id="5026874946691314267">Huwag itong ipakita muli</translation> <translation id="5027550639139316293">Email Certificate</translation> <translation id="5027562294707732951">Idagdag ang extension</translation> +<translation id="502811790397568978">Paki-unlock ang <ph name="TOKEN_NAME" /> para ma-import ang certificate ng client mula sa <ph name="HOST_NAME" />.</translation> <translation id="5029287942302939687">Nakatakda na ang iyong password</translation> <translation id="5029873138381728058">Hindi nasuri ang mga VM</translation> <translation id="503155457707535043">Dina-download ang mga app</translation> @@ -6059,6 +6061,7 @@ <translation id="5172855596271336236">May 1 pinapamahalaang printer.</translation> <translation id="5173668317844998239">Magdagdag at mag-delete ng mga fingerprint na naka-save sa iyong security key</translation> <translation id="5174169235862638850">Nakopya sa clipboard ang password</translation> +<translation id="517488401359338823">I-unlock ang Panseguridad na Device</translation> <translation id="5177479852722101802">Ipagpatuloy ang pag-block ng access sa camera at mikropono</translation> <translation id="5177549709747445269">Gumagamit ka ng mobile data</translation> <translation id="5178667623289523808">Find Previous</translation> @@ -7478,7 +7481,6 @@ <translation id="6180550893222597997">Aling passkey ang gusto mong gamitin para sa <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Kung minsan, ina-update ng mga app ang branding ng mga ito. Suriin ang lahat ng pagbabago para matiyak na kumportable ka sa mga ito bago mag-update.</translation> <translation id="6181431612547969857">Na-block ang pagda-download</translation> -<translation id="6182100780603067202">I-share din ang audio ng application (mula sa lahat ng window nito)</translation> <translation id="6183369864942961155">Awtomatikong maliwanag/madilim na tema</translation> <translation id="6183773856988300112">Gumagamit ang Gemini sa Chrome ng awtomatikong pag-browse para gumawa sa iyong mga tab at kumumpleto ng mga gawaing ibibigay mo rito. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Maghanap sa Mga Tab</translation> @@ -8273,9 +8275,9 @@ <translation id="6754359471209693699">Magsimula ng bagong paghahanap</translation> <translation id="6754918760968695779">Quick Insert</translation> <translation id="6755702685749429945">Magdagdag ng diksyunaryo</translation> -<translation id="6756157672127672536">Nagbibigay ang Files app ng mabilis na pag-access sa mga file na nai-save mo sa Google Drive, external storage, o sa iyong ChromeOS device.</translation> <translation id="6756643207511618722">Mga speech engine</translation> <translation id="6757431299485455321">Tulungan ang iba pang device na mahanap ang hotspot na ito.</translation> +<translation id="6757615605516049275">Paki-unlock ang <ph name="TOKEN_NAME" />.</translation> <translation id="6758056191028427665">Ipaalam sa amin kung ano ang iyong palagay sa ginagawa namin.</translation> <translation id="6759193508432371551">Factory reset</translation> <translation id="6760354150216532978">Babala: makikita ng site na ito ang mga pag-edit na gagawin mo</translation> @@ -8471,6 +8473,7 @@ <translation id="6871644448911473373">OCSP Responder: <ph name="LOCATION" /></translation> <translation id="6871860225073478239">Mga Wika...</translation> <translation id="6872859537300194762"><ph name="TASK_TITLE" />\nNa-pause ko ang iyong gawain dahil sa iba pang aktibidad. Puwede kang bumalik sa Chrome para tingnan ito kapag handa na.</translation> +<translation id="6873156759937047811">PIN:</translation> <translation id="6873571253135628430">Baguhin ang mga pahintulot ng site</translation> <translation id="6876155724392614295">Bisikleta</translation> <translation id="6876469544038980967">Hindi Nakatulong</translation> @@ -10013,7 +10016,6 @@ <translation id="794676567536738329">Kumpirmahin ang Mga Pagpapahintulot</translation> <translation id="7947962633355574091">K&opyahin ang Address ng Video</translation> <translation id="7947964080535614577">Karaniwang nagpapakita ng mga ad ang mga site para makapagbigay ang mga ito ng content o mga serbisyo nang libre. Pero, kilalang nagpapakita ng mga nakakasagabal o nakakapanlinlang na ad ang ilang site.</translation> -<translation id="7948239795436419268">Huwag i-restore ang mga window</translation> <translation id="7948407723851303488">Lahat ng page ng <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Dahilan: Sinusuportahan lang ng LBS ang mga URL na http://, https://, at file://.</translation> <translation id="7950814699499457511">Naka-on • Hindi nag-publish ang extension na ito ng mga kagawian sa privacy, gaya ng kung paano ito nangongolekta at gumagamit ng data</translation> @@ -10561,6 +10563,7 @@ <translation id="8317965619823678157">kopyahin ang mga password</translation> <translation id="8318266828739827371">Gumamit ng split-screen view para makita ang naka-magnify na bahagi ng iyong screen. Gamitin ang Search + Ctrl + D para i-on at i-off ang naka-dock na magnifier.</translation> <translation id="8318680582681577962">Subframe ng Incognito na PDF: <ph name="SUBFRAME_SITE" /></translation> +<translation id="8319105959731007612">Pinipigilan ng Pag-isolate ng Proseso ang iba pang application na mag-tamper sa <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="8319414634934645341">Extended na Paggamit ng Key</translation> <translation id="8320212361750431956">Kamakailang Aktibidad</translation> <translation id="8321476692217554900">mga notification</translation> @@ -11203,7 +11206,6 @@ <translation id="8751034568832412184">Paaralan</translation> <translation id="8751329102746373229">Mula sa iyong administrator</translation> <translation id="8752451679755290210">Awtomatikong magpalipat-lipat sa mga item</translation> -<translation id="8753948258138515839">Nagbibigay ang Files app ng mabilisang access sa mga file na na-save mo sa Google Drive, external na storage, o sa iyong ChromeOS Flex device.</translation> <translation id="8754200782896249056"><p>Kapag pinapatakbo ang <ph name="PRODUCT_NAME" /> sa isang sinusuportahang desktop environment, gagamitin ang mga setting ng proxy ng system. Gayunpaman, hindi sinusuportahan ang iyong system o nagkaroon ng problema sa paglulunsad ng configuration ng iyong system.</p> <p>Ngunit magagawa mo pa ring mag-configure sa pamamagitan ng command line. Pakitingnan ang <code>man <ph name="PRODUCT_BINARY_NAME" /></code> para sa higit pang impormasyon tungkol sa mga flag at variable ng environment.</p></translation> @@ -11858,6 +11860,7 @@ <translation id="9186743636216815027">{NUM_APPS,plural,offset:2 =1{Puwedeng i-record ng iyong administrator ang screen mo gamit ang <ph name="APP0_NAME" />. Hindi ka aabisuhan kapag nagsimula na ang pag-record.}=2{Puwedeng i-record ng iyong administrator ang screen mo gamit ang <ph name="APP0_NAME" /> at <ph name="APP1_NAME" />. Hindi ka aabisuhan kapag nagsimula na ang pag-record.}=3{Puwedeng i-record ng iyong administrator ang screen mo gamit ang <ph name="APP0_NAME" />, <ph name="APP1_NAME" />, at 1 pang app. Hindi ka aabisuhan kapag nagsimula na ang pag-record.}one{Puwedeng i-record ng iyong administrator ang screen mo gamit ang <ph name="APP0_NAME" />, <ph name="APP1_NAME" />, at # pang app. Hindi ka aabisuhan kapag nagsimula na ang pag-record.}other{Puwedeng i-record ng iyong administrator ang screen mo gamit ang <ph name="APP0_NAME" />, <ph name="APP1_NAME" />, at # pang app. Hindi ka aabisuhan kapag nagsimula na ang pag-record.}}</translation> <translation id="9186963452600581158">Mag-sign in gamit ang Google Account ng isang bata</translation> <translation id="9187967020623675250">Hindi magkatugma ang mga key. Pumindot ng anumang key para <ph name="RESPONSE" />.</translation> +<translation id="9188142767272053574">I-enable ang Pag-isolate ng Proseso</translation> <translation id="9189618485998894982">Na-block ang application na ito. Makipag-ugnayan sa developer</translation> <translation id="9192019773545828776">Makarinig ng pasalitang feedback para magamit mo ang iyong device nang hindi tumitingin sa screen. Available ang braille na feedback gamit ang isang nakakonektang device. Gamitin ang Ctrl + Alt + Z para i-on at i-off ang ChromeVox. Gamitin ang Search + Pakaliwang arrow o Pakanang arrow para mag-navigate. Gamitin ang Search + Space para pumili (mag-activate).</translation> <translation id="9195969368671142407">Kapag nilimitahan ng iyong organisasyon ang pag-save sa Google Account mo, hindi ka puwedeng mag-share ng o sumali sa mga grupo ng tab</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index 59b0e656..02e58f6 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Impossible de télécharger les fichiers d'annotation du nœud principal. Réessayez plus tard.</translation> <translation id="1103523840287552314">Toujours traduire les pages rédigées en <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Vous perdrez immédiatement l'accès au groupe d'onglets, et il sera supprimé de tous vos appareils.</translation> +<translation id="1105934302947321130">Google Beam avec Zoom</translation> <translation id="1106270460549661906">Annuler le partage avec Gemini</translation> <translation id="1106350001632362876">Augmenter le seuil</translation> <translation id="110850812463801904">Se connecter manuellement à OneDrive</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Votre clé de sécurité n'est pas protégée par un NIP. Pour gérer les données de connexion, commencez par créer un NIP.</translation> <translation id="1179400851034021914">L'IBAN n'est pas valide</translation> <translation id="1179902906564467236">Suivez les instructions sur votre téléphone ou utilisez l'appli Appareil photo</translation> -<translation id="1180117276105724040">Restauration des fenêtres de votre session précédente en cours…</translation> <translation id="118057123461613219">Économies énormes</translation> <translation id="1181037720776840403">Supprimer</translation> <translation id="1182876754474670069">début</translation> @@ -762,7 +762,6 @@ <translation id="151501797353681931">Importés de Safari</translation> <translation id="1515163294334130951">Lancer</translation> <translation id="1517467582299994451">Pour diffuser avec un code, activez les réglages de synchronisation du navigateur Chrome</translation> -<translation id="1519090060276706457">La restauration des fenêtres prend plus de temps que prévu</translation> <translation id="1521442365706402292">Gérer les certificats</translation> <translation id="1521655867290435174">Google Feuilles de calcul</translation> <translation id="1521774566618522728">Actif aujourd'hui</translation> @@ -1103,6 +1102,7 @@ <translation id="1745732479023874451">Gérer les contacts</translation> <translation id="1748283190377208783">{0,plural, =1{forme plurielle non utilisée}one{Ouvrir et modifier # fichier dans cette application Web?}other{Ouvrir et modifier # fichiers dans cette application Web?}}</translation> <translation id="1748563609363301860">Vous pouvez enregistrer ce mot de passe dans votre compte Google ou seulement sur cet appareil</translation> +<translation id="1749645492410897998">Installation du logiciel en cours…</translation> <translation id="1749733017156547309">Veuillez entrer un mot de passe</translation> <translation id="1750172676754093297">Cette clé de sécurité ne peut pas stocker d'empreintes digitales</translation> <translation id="1750238553597293878">Continuer à utiliser les mots de passe de votre compte Google</translation> @@ -1174,7 +1174,6 @@ <translation id="1796460466266263589">Pour continuer à utiliser Gemini, confirmez votre identité</translation> <translation id="1796588414813960292">Les fonctionnalités qui utilisent des sons ne fonctionneront pas</translation> <translation id="1798726622311813209">Cartes de crédit et de débit</translation> -<translation id="1799852120691957794">Impossible de restaurer les fenêtres de votre session précédente</translation> <translation id="180203835522132923">Rechercher+O, puis W</translation> <translation id="1802624026913571222">Mettre en veille lorsque le couvercle est fermé</translation> <translation id="1802687198411089702">La page ne répond pas. Vous pouvez attendre qu'elle réponde ou la quitter.</translation> @@ -2368,7 +2367,6 @@ <translation id="2610374175948698697">Peut afficher des fichiers ou des dossiers sur votre appareil</translation> <translation id="2610780100389066815">Signature de liste d'approbation Microsoft</translation> <translation id="261114180663074524">Connectez-vous à votre compte Microsoft, puis réessayez</translation> -<translation id="2611702650078660078">Une erreur s'est produite</translation> <translation id="2611776654555141051">Rectangle</translation> <translation id="2611885296070244383">Microphone (interne)</translation> <translation id="2612676031748830579">Numéro de la carte</translation> @@ -2733,7 +2731,6 @@ <translation id="285033512555869047">Fermé</translation> <translation id="2850541429955027218">Ajouter un thème</translation> <translation id="2851291081585704741">Vous êtes hors ligne</translation> -<translation id="2852045827873867442">Une connexion Internet est requise.</translation> <translation id="285237063405807022">(chargement en cours…)</translation> <translation id="2853121255651601031">Mot de passe enregistré</translation> <translation id="2854453262159518435">Remplacer le groupe d'onglets existant</translation> @@ -3600,6 +3597,7 @@ <translation id="3473241910002674503">Naviguer vers l'écran d'accueil ou vers l'arrière et basculer entre les applications grâce aux boutons en mode tablette.</translation> <translation id="3473479545200714844">Loupe d'écran</translation> <translation id="3474218480460386727">Les nouveaux mots ne doivent pas contenir plus de 99 lettres</translation> +<translation id="3474330892505468100">Google Beam avec Meet</translation> <translation id="3474624961160222204">Contin. comme <ph name="NAME" /></translation> <translation id="3477772589943384839">Obtenez des économies de mémoire modérées. Vos onglets deviennent inactifs après une plus longue période.</translation> <translation id="347785443197175480">Continuer à autoriser <ph name="HOST" /> à accéder à votre caméra et à votre microphone</translation> @@ -5488,7 +5486,6 @@ <translation id="4779766576531456629">Renommer le réseau cellulaire de la carte eSIM</translation> <translation id="4780321648949301421">Enregistrer la page sous…</translation> <translation id="4780558987886269159">Pour le travail</translation> -<translation id="4781633367688946589">Continuer vers une nouvelle session</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> souhaite utiliser des renseignements personnels à partir de votre portefeuille numérique.</translation> <translation id="4785719467058219317">Vous utilisez une clé de sécurité qui n'est pas enregistrée auprès de ce site Web</translation> <translation id="4785914069240823137">Annuler le recadrage</translation> @@ -6275,6 +6272,7 @@ <translation id="5337926771328966926">Le nom actuel de l'appareil est <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Vous pouvez naviguer de manière anonyme à l'aide d'une fenêtre de navigation privée</translation> <translation id="5338503421962489998">Stockage local</translation> +<translation id="5340620183031438925">Pour poser des questions au mode IA sur votre onglet sans quitter la page, confirmez votre identité. Vous obtiendrez également vos mots de passe et bien plus encore sur tous vos appareils.</translation> <translation id="5340787663756381836">et Rechercher et modifier</translation> <translation id="5340900621595888432">Envoyer des données d'utilisation et de diagnostic</translation> <translation id="5341793073192892252">Les témoins suivants ont été bloqués (tous les témoins de tiers sont bloqués, sans exception)</translation> @@ -7461,7 +7459,6 @@ <translation id="6180550893222597997">Quelle clé d'accès voulez-vous utiliser pour <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Les applis mettent parfois à jour leur stratégie de marque. Examinez toutes les modifications pour vous assurer qu'elles vous conviennent avant de procéder à la mise à jour.</translation> <translation id="6181431612547969857">Téléchargement bloqué</translation> -<translation id="6182100780603067202">Partager également l'audio de l'application (à partir de toutes ses fenêtres)</translation> <translation id="6183369864942961155">Thème clair/sombre automatique</translation> <translation id="6183773856988300112">Gemini dans Chrome utilise la navigation automatique pour travailler dans vos onglets et accomplir les tâches que vous lui confiez. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Rechercher des onglets</translation> @@ -8256,7 +8253,6 @@ <translation id="6754359471209693699">Lancer une nouvelle recherche</translation> <translation id="6754918760968695779">Insertion rapide</translation> <translation id="6755702685749429945">Ajouter un dictionnaire</translation> -<translation id="6756157672127672536">L'application Fichiers permet d'accéder rapidement aux fichiers que vous avez enregistrés sur Google Disque, sur vos appareils de stockage externe ou sur votre appareil Chrome OS.</translation> <translation id="6756643207511618722">Moteurs de reconnaissance vocale</translation> <translation id="6757431299485455321">Aider les autres appareils à détecter ce point d’accès.</translation> <translation id="6758056191028427665">Donnez-nous votre avis sur nos services.</translation> @@ -9202,6 +9198,7 @@ <translation id="7406912950279255498">Mode d'inversion des couleurs</translation> <translation id="7407430846095439694">Importer et associer</translation> <translation id="7407504355934009739">La plupart des gens bloquent les notifications provenant de ce site</translation> +<translation id="7407578029724074226">Le fichier <ph name="FILE_NAME" /> contient des données sensibles. Votre organisation vous permettra de l'enregistrer dans l'espace de stockage infonuagique ou de le supprimer</translation> <translation id="7408080603962564527">Le nom du point d’accès sera visible pour les utilisateurs</translation> <translation id="740810853557944681">Ajouter un serveur d'impression</translation> <translation id="7409549334477097887">Très grand</translation> @@ -9255,6 +9252,7 @@ <translation id="7434969625063495310">Impossible d'ajouter le serveur d'impression. Veuillez vérifier la configuration du serveur, puis réessayer.</translation> <translation id="7436921188514130341">Oups… Une erreur s'est produite lors du changement de nom.</translation> <translation id="7439519621174723623">Pour continuer, donnez un nom à l'appareil</translation> +<translation id="743982235360757672">Gardez le mode IA à proximité pendant que vous naviguez</translation> <translation id="7441736532026945583">Sélectionnez « Masquer le groupe » pour retirer le groupe de votre bande d'onglets</translation> <translation id="7441736921018636843">Pour modifier ce paramètre, <ph name="BEGIN_LINK" />réinitialisez la synchronisation<ph name="END_LINK" /> afin de supprimer votre phrase de passe de synchronisation</translation> <translation id="7441830548568730290">Autres utilisateurs</translation> @@ -9993,7 +9991,6 @@ <translation id="794676567536738329">Confirmer les autorisations</translation> <translation id="7947962633355574091">C&opier l'adresse de la vidéo</translation> <translation id="7947964080535614577">Les sites affichent généralement des annonces afin de pouvoir proposer des contenus ou des services gratuits. Toutefois, certains sites sont connus pour afficher des annonces intrusives ou trompeuses.</translation> -<translation id="7948239795436419268">Ne pas restaurer les fenêtres</translation> <translation id="7948407723851303488">Toutes les pages de <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Motif : LBS ne prend en charge que les URL http://, https:// et file://.</translation> <translation id="7950814699499457511">Activée • Cette extension n'a pas publié de pratiques en matière de confidentialité, telles que la manière dont elle collecte et utilise les données</translation> @@ -11181,7 +11178,6 @@ <translation id="8751034568832412184">École</translation> <translation id="8751329102746373229">De votre administrateur</translation> <translation id="8752451679755290210">Se déplacer automatiquement entre les éléments</translation> -<translation id="8753948258138515839">L'application Fichiers permet d'accéder rapidement aux fichiers que vous avez enregistrés sur Google Disque, sur vos appareils de stockage externe ou sur votre appareil Chrome OS Flex.</translation> <translation id="8754200782896249056"><p>Lors de l'exécution de <ph name="PRODUCT_NAME" /> dans un environnement de bureau compatible, les paramètres du serveur mandataire du système seront utilisés. Cependant, soit votre système n'est pas compatible, soit un problème est survenu lors du lancement de votre configuration système.</p> <p>Vous avez toujours la possibilité d'effectuer la configuration à l'aide de la ligne de commande. Pour obtenir davantage d'information à propos des indicateurs et des variables d'environnement, veuillez consulter <code>man <ph name="PRODUCT_BINARY_NAME" /></code>.</p></translation> @@ -11975,6 +11971,7 @@ <translation id="992778845837390402">Sauvegarde Linux en cours…</translation> <translation id="994087375490600917">Panneaux latéraux</translation> <translation id="994289308992179865">Bouc&le</translation> +<translation id="995420352808264005">Choisir le type d'inscription d'appareil</translation> <translation id="995755448277384931">Ajouter un IBAN</translation> <translation id="996250603853062861">Établissement de la connexion sécurisée...</translation> <translation id="997143476478634194">Les sites respectent automatiquement ce paramètre quand vous les visitez. Les sites envoient généralement des notifications pour vous présenter des nouvelles de dernière heure ou des messages de clavardage.</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index a2d67c0..6b04e7b 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Impossible de télécharger les fichiers d'annotation du nœud principal. Réessayez plus tard.</translation> <translation id="1103523840287552314">Toujours traduire les pages rédigées en <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Vous perdrez immédiatement l'accès à ce groupe d'onglets, qui sera supprimé de tous vos appareils</translation> +<translation id="1105934302947321130">Google Beam avec Zoom</translation> <translation id="1106270460549661906">Ne plus partager avec Gemini</translation> <translation id="1106350001632362876">Augmenter le seuil</translation> <translation id="110850812463801904">Se connecter manuellement à OneDrive</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Votre clé de sécurité n'est pas protégée par un code. Pour gérer vos données de connexion, commencez par créer un code.</translation> <translation id="1179400851034021914">L'IBAN n'est pas valide</translation> <translation id="1179902906564467236">Suivez les instructions sur votre téléphone ou utilisez l'appli Appareil photo</translation> -<translation id="1180117276105724040">Restauration des fenêtres de votre session précédente...</translation> <translation id="118057123461613219">Économies considérables</translation> <translation id="1181037720776840403">Supprimer</translation> <translation id="1182876754474670069">Accueil</translation> @@ -762,7 +762,6 @@ <translation id="151501797353681931">Importés depuis Safari</translation> <translation id="1515163294334130951">Lancer</translation> <translation id="1517467582299994451">Pour caster avec un code, activez les paramètres de synchronisation du navigateur Chrome</translation> -<translation id="1519090060276706457">La restauration des fenêtres prend plus de temps que prévu</translation> <translation id="1521442365706402292">Gérer les certificats</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">Actif aujourd'hui</translation> @@ -1103,6 +1102,7 @@ <translation id="1745732479023874451">Gérer les contacts</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}one{Ouvrir et modifier # fichier dans cette appli Web ?}other{Ouvrir et modifier # fichiers dans cette appli Web ?}}</translation> <translation id="1748563609363301860">Vous pouvez enregistrer ce mot de passe dans votre compte Google ou uniquement sur cet appareil</translation> +<translation id="1749645492410897998">Installation du logiciel…</translation> <translation id="1749733017156547309">Veuillez saisir votre mot de passe</translation> <translation id="1750172676754093297">Impossible de stocker des empreintes digitales dans votre clé de sécurité</translation> <translation id="1750238553597293878">Continuez d'utiliser les mots de passe de votre compte Google</translation> @@ -1174,7 +1174,6 @@ <translation id="1796460466266263589">Pour continuer à utiliser Gemini, confirmez votre identité</translation> <translation id="1796588414813960292">Les fonctionnalités qui utilisent des sons ne seront pas disponibles</translation> <translation id="1798726622311813209">Cartes de crédit ou de débit</translation> -<translation id="1799852120691957794">Impossible de restaurer les fenêtres de votre session précédente</translation> <translation id="180203835522132923">Recherche+O, puis W</translation> <translation id="1802624026913571222">Mettre en veille lorsque l'appareil est refermé</translation> <translation id="1802687198411089702">La page ne répond plus. Vous pouvez attendre qu'elle soit de nouveau accessible ou la fermer.</translation> @@ -2367,7 +2366,6 @@ <translation id="2610374175948698697">Peuvent voir des fichiers et des dossiers sur votre appareil</translation> <translation id="2610780100389066815">Signature de liste d'approbation Microsoft</translation> <translation id="261114180663074524">Connectez-vous à votre compte Microsoft, puis réessayez</translation> -<translation id="2611702650078660078">Une erreur s'est produite</translation> <translation id="2611776654555141051">Outil Rectangle</translation> <translation id="2611885296070244383">Micro (interne)</translation> <translation id="2612676031748830579">Numéro de carte</translation> @@ -2731,7 +2729,6 @@ <translation id="285033512555869047">Fermé</translation> <translation id="2850541429955027218">Ajouter un thème</translation> <translation id="2851291081585704741">Vous êtes hors connexion</translation> -<translation id="2852045827873867442">Une connexion Internet est requise.</translation> <translation id="285237063405807022">(chargement…)</translation> <translation id="2853121255651601031">Mot de passe enregistré</translation> <translation id="2854453262159518435">Remplacer le groupe d'onglets existant</translation> @@ -3596,6 +3593,7 @@ <translation id="3473241910002674503">Utilisez les boutons pour accéder à la page d'accueil, revenir en arrière et changer d'application en mode tablette.</translation> <translation id="3473479545200714844">Loupe</translation> <translation id="3474218480460386727">Les nouveaux termes ne doivent pas contenir plus de 99 lettres</translation> +<translation id="3474330892505468100">Google Beam avec Meet</translation> <translation id="3474624961160222204">Continuer en tant que <ph name="NAME" /></translation> <translation id="3477772589943384839">Économies de mémoire modérées. Les onglets deviennent inactifs après une longue période.</translation> <translation id="347785443197175480">Continuer à autoriser <ph name="HOST" /> à accéder à votre caméra et à votre micro</translation> @@ -5484,7 +5482,6 @@ <translation id="4779766576531456629">Renommer le réseau mobile de l'eSIM</translation> <translation id="4780321648949301421">Enregistrer la page sous...</translation> <translation id="4780558987886269159">Pour le travail</translation> -<translation id="4781633367688946589">Accéder à une nouvelle session</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> souhaite utiliser des informations personnelles de votre portefeuille numérique.</translation> <translation id="4785719467058219317">La clé de sécurité n'est pas enregistrée auprès de ce site Web</translation> <translation id="4785914069240823137">Annuler le recadrage</translation> @@ -6271,6 +6268,7 @@ <translation id="5337926771328966926">Nom actuel de l'appareil : <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Vous pouvez parcourir le Web en mode privé à l'aide d'une fenêtre de navigation privée</translation> <translation id="5338503421962489998">Stockage local</translation> +<translation id="5340620183031438925">Pour poser des questions sur votre onglet au Mode IA sans quitter la page, confirmez votre identité. Vous pourrez également accéder à vos mots de passe et à d'autres données sur tous vos appareils.</translation> <translation id="5340787663756381836">&Rechercher et modifier</translation> <translation id="5340900621595888432">Envoyer des données de diagnostic et d'utilisation</translation> <translation id="5341793073192892252">Les cookies suivants ont été bloqués (tous les cookies tiers sont bloqués, sans exception)</translation> @@ -7458,7 +7456,6 @@ <translation id="6180550893222597997">Laquelle voulez-vous utiliser pour <ph name="APP_NAME" /> ?</translation> <translation id="6181218116951226898">Les applis modifient parfois leur branding. Examinez toutes les modifications pour vous assurer qu'elles vous conviennent avant d'effectuer la mettre à jour.</translation> <translation id="6181431612547969857">Téléchargement bloqué</translation> -<translation id="6182100780603067202">Partager aussi l'audio de l'appli (de toutes ses fenêtres)</translation> <translation id="6183369864942961155">Thème clair/sombre automatique</translation> <translation id="6183773856988300112">Gemini dans Chrome utilise la navigation automatique pour travailler dans vos onglets et effectuer les tâches que vous lui confiez. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Rechercher dans les onglets</translation> @@ -8253,7 +8250,6 @@ <translation id="6754359471209693699">Lancer une nouvelle recherche</translation> <translation id="6754918760968695779">Insertion Rapide</translation> <translation id="6755702685749429945">Ajouter un dictionnaire</translation> -<translation id="6756157672127672536">L'appli Fichiers vous permet d'accéder rapidement aux fichiers que vous avez enregistrés dans Google Drive, sur un périphérique de stockage externe ou sur votre appareil Chrome OS.</translation> <translation id="6756643207511618722">Moteurs de synthèse vocale</translation> <translation id="6757431299485455321">Aidez d'autres appareils à détecter ce point d'accès.</translation> <translation id="6758056191028427665">Faites-nous part de vos commentaires.</translation> @@ -9200,6 +9196,7 @@ <translation id="7406912950279255498">Mode d'inversion des couleurs</translation> <translation id="7407430846095439694">Importer et lier</translation> <translation id="7407504355934009739">La plupart des internautes bloquent les notifications provenant de ce site</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> contient des données sensibles. Votre organisation vous permettra de l'enregistrer dans le cloud ou de le supprimer.</translation> <translation id="7408080603962564527">Les autres utilisateurs pourront voir ce nom</translation> <translation id="740810853557944681">Ajouter un serveur d'impression</translation> <translation id="7409549334477097887">Très important</translation> @@ -9253,6 +9250,7 @@ <translation id="7434969625063495310">Impossible d'ajouter le serveur d'impression. Veuillez vérifier la configuration du serveur, puis réessayer.</translation> <translation id="7436921188514130341">Aïe, aïe, aïe ! Une erreur s'est produite lors du changement du nom.</translation> <translation id="7439519621174723623">Attribuez un nom à l'appareil pour continuer</translation> +<translation id="743982235360757672">Gardez le Mode IA à portée de main pendant que vous naviguez</translation> <translation id="7441736532026945583">Sélectionnez "Masquer le groupe" pour supprimer le groupe de votre barre d'onglets</translation> <translation id="7441736921018636843">Pour modifier ce paramètre, <ph name="BEGIN_LINK" />réinitialisez la synchronisation<ph name="END_LINK" /> pour supprimer votre phrase secrète de synchronisation</translation> <translation id="7441830548568730290">Autres utilisateurs</translation> @@ -9991,7 +9989,6 @@ <translation id="794676567536738329">Confirmer les autorisations</translation> <translation id="7947962633355574091">C&opier l'adresse de la vidéo</translation> <translation id="7947964080535614577">Les sites diffusent généralement des annonces en contrepartie de contenus ou services offerts. Toutefois, certains sites sont connus pour afficher des annonces intrusives ou trompeuses.</translation> -<translation id="7948239795436419268">Ne pas restaurer les fenêtres</translation> <translation id="7948407723851303488">Toutes les pages de <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Motif : LBS n'accepte que les URL incluant http://, https:// et file://.</translation> <translation id="7950814699499457511">Activé • Cette extension n'a pas publié de pratiques en matière de confidentialité, comme la façon dont elle collecte et utilise les données</translation> @@ -11180,7 +11177,6 @@ <translation id="8751034568832412184">Scolaire</translation> <translation id="8751329102746373229">Provenant de votre administrateur</translation> <translation id="8752451679755290210">Se déplacer automatiquement entre les éléments</translation> -<translation id="8753948258138515839">L'appli Fichiers vous permet d'accéder rapidement aux fichiers que vous avez enregistrés dans Google Drive, sur un périphérique de stockage externe ou sur votre appareil ChromeOS Flex.</translation> <translation id="8754200782896249056"><p>Lorsque vous exécutez <ph name="PRODUCT_NAME" /> dans un environnement de bureau compatible, les paramètres proxy du système sont utilisés. Cependant, soit votre système n'est pas compatible, soit un problème est survenu lors du lancement de votre configuration système.</p> <p>Vous avez toujours la possibilité d'effectuer la configuration via la ligne de commande. Pour plus d'informations sur les indicateurs et les variables d'environnement, veuillez vous reporter à <code>man <ph name="PRODUCT_BINARY_NAME" /></code>.</p></translation> @@ -11974,6 +11970,7 @@ <translation id="992778845837390402">Sauvegarde Linux…</translation> <translation id="994087375490600917">Panneaux latéraux</translation> <translation id="994289308992179865">&Répéter</translation> +<translation id="995420352808264005">Choisissez le type d'enregistrement d'appareils</translation> <translation id="995755448277384931">Ajouter un IBAN</translation> <translation id="996250603853062861">Établissement de la connexion sécurisée...</translation> <translation id="997143476478634194">Les sites se basent automatiquement sur ce paramètre lorsque vous les consultez. Les sites envoient généralement des notifications pour vous transmettre des alertes info ou vous informer que vous avez reçu un message dans un chat.</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index c070a762..731d4c9 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Non se puideron descargar os ficheiros de anotación do nó principal. Téntao de novo máis tarde.</translation> <translation id="1103523840287552314">Traducir sempre o <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Perderás inmediatamente o acceso ao grupo de pestanas, que se eliminará de todos os teus dispositivos</translation> +<translation id="1105934302947321130">Google Beam con Zoom</translation> <translation id="1106270460549661906">Deixar de compartir o contido con Gemini</translation> <translation id="1106350001632362876">Aumentar o límite</translation> <translation id="110850812463801904">Conectar manualmente a OneDrive</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">A túa chave de seguranza non está protexida cun PIN. Para xestionar os datos de inicio de sesión, primeiro crea un PIN.</translation> <translation id="1179400851034021914">O IBAN non é válido</translation> <translation id="1179902906564467236">Sigue as instrucións no teléfono ou usa a aplicación da cámara</translation> -<translation id="1180117276105724040">Restaurando ventás da sesión anterior...</translation> <translation id="118057123461613219">Aforro moi elevado</translation> <translation id="1181037720776840403">Eliminar</translation> <translation id="1182876754474670069">inicio</translation> @@ -760,7 +760,6 @@ <translation id="151501797353681931">Importados de Safari</translation> <translation id="1515163294334130951">Iniciar</translation> <translation id="1517467582299994451">Para emitir contido cun código, activa a opción de configuración de sincronización do navegador Chrome</translation> -<translation id="1519090060276706457">A restauración das ventás está tardando máis do esperado</translation> <translation id="1521442365706402292">Xestionar certificados</translation> <translation id="1521655867290435174">Follas de cálculo de Google</translation> <translation id="1521774566618522728">Dispositivo activo hoxe</translation> @@ -1101,6 +1100,7 @@ <translation id="1745732479023874451">Xestionar contactos</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{Queres abrir e editar # ficheiros nesta aplicación web?}}</translation> <translation id="1748563609363301860">Podes gardar este contrasinal na túa Conta de Google ou só neste dispositivo</translation> +<translation id="1749645492410897998">Instalando software</translation> <translation id="1749733017156547309">Necesítase un contrasinal</translation> <translation id="1750172676754093297">A túa chave de seguranza non pode almacenar impresións dixitais</translation> <translation id="1750238553597293878">Sigue usando os contrasinais na túa Conta de Google</translation> @@ -1172,7 +1172,6 @@ <translation id="1796460466266263589">Para continuar usando Gemini, verifica a túa identidade</translation> <translation id="1796588414813960292">As funcións que necesiten reproducir sons non estarán dispoñibles</translation> <translation id="1798726622311813209">Tarxetas de crédito e débito</translation> -<translation id="1799852120691957794">Non se poden restaurar as ventás da sesión anterior</translation> <translation id="180203835522132923">Buscar + O e despois W</translation> <translation id="1802624026913571222">Activar suspensión cando se peche a tapa</translation> <translation id="1802687198411089702">A páxina non responde. Podes esperar ou saír da páxina.</translation> @@ -2365,7 +2364,6 @@ <translation id="2610374175948698697">Permiso para ver os ficheiros ou os cartafoles do teu dispositivo</translation> <translation id="2610780100389066815">Sinatura da lista de confianza de Microsoft</translation> <translation id="261114180663074524">Inicia sesión na túa conta de Microsoft e téntao de novo</translation> -<translation id="2611702650078660078">Produciuse un erro</translation> <translation id="2611776654555141051">Ferramenta de rectángulos</translation> <translation id="2611885296070244383">Micrófono (interno)</translation> <translation id="2612676031748830579">Número da tarxeta</translation> @@ -2729,7 +2727,6 @@ <translation id="285033512555869047">Pechado</translation> <translation id="2850541429955027218">Engadir tema</translation> <translation id="2851291081585704741">Estás sen conexión</translation> -<translation id="2852045827873867442">Cómpre ter conexión a Internet.</translation> <translation id="285237063405807022">(cargando)</translation> <translation id="2853121255651601031">Gardouse o contrasinal</translation> <translation id="2854453262159518435">Substituír grupo de pestanas existente</translation> @@ -3596,6 +3593,7 @@ <translation id="3473241910002674503">Vai ao inicio, volve atrás e cambia de aplicación usando os botóns no modo de tableta.</translation> <translation id="3473479545200714844">Lupa</translation> <translation id="3474218480460386727">As palabras novas non deben ter máis de 99 letras</translation> +<translation id="3474330892505468100">Google Beam con Meet</translation> <translation id="3474624961160222204">Continuar como <ph name="NAME" /></translation> <translation id="3477772589943384839">Aforra memoria de forma moderada. As túas pestanas pasarán a estar inactivas despois dun período longo de tempo.</translation> <translation id="347785443197175480">Continuar permitindo a <ph name="HOST" /> acceder á túa cámara e micrófono</translation> @@ -5487,7 +5485,6 @@ <translation id="4779766576531456629">Cambiar nome da rede de telefonía móbil de eSIM</translation> <translation id="4780321648949301421">Gardar páxina como...</translation> <translation id="4780558987886269159">Para o traballo</translation> -<translation id="4781633367688946589">Continuar na nova sesión</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> quere usar información persoal do teu moedeiro dixital.</translation> <translation id="4785719467058219317">Estás utilizando unha chave de seguranza que non está rexistrada neste sitio web</translation> <translation id="4785914069240823137">Cancelar recorte</translation> @@ -6276,6 +6273,7 @@ <translation id="5337926771328966926">Actualmente, o nome do dispositivo é "<ph name="DEVICE_NAME" />"</translation> <translation id="5338338064218053691">Podes navegar de forma privada usando unha ventá do modo de incógnito</translation> <translation id="5338503421962489998">Almacenamento local</translation> +<translation id="5340620183031438925">Para preguntar co modo IA sobre a pestana sen saír da páxina, verifica a túa identidade. Tamén terás acceso aos teus contrasinais e moito máis en todos os teus dispositivos.</translation> <translation id="5340787663756381836">&Buscar e editar</translation> <translation id="5340900621595888432">Enviar datos de uso e de diagnóstico</translation> <translation id="5341793073192892252">Bloqueáronse as seguintes cookies (estanse bloqueando as cookies de terceiros sen excepción)</translation> @@ -7459,7 +7457,6 @@ <translation id="6180550893222597997">Que clave de acceso queres usar para <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">As aplicacións ás veces actualizan a súa marca. Revisa todos os cambios para asegurarte de que son axeitados antes da actualización.</translation> <translation id="6181431612547969857">Descarga bloqueada</translation> -<translation id="6182100780603067202">Compartir tamén o audio da aplicación (de todas as súas ventás)</translation> <translation id="6183369864942961155">Tema escuro/claro automático</translation> <translation id="6183773856988300112">Gemini en Chrome usa a navegación automática para traballar nas túas pestanas e completar as tarefas que lle encomendes. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Realiza buscas nas pestanas</translation> @@ -8252,7 +8249,6 @@ <translation id="6754359471209693699">Comezar unha busca nova</translation> <translation id="6754918760968695779">Inserción rápida</translation> <translation id="6755702685749429945">Engadir dicionario</translation> -<translation id="6756157672127672536">A aplicación Ficheiros permite acceder rapidamente aos ficheiros que gardases en Google Drive, no almacenamento externo ou no dispositivo Chrome OS.</translation> <translation id="6756643207511618722">Motores de fala</translation> <translation id="6757431299485455321">Axuda a que outros dispositivos atopen esta zona wifi.</translation> <translation id="6758056191028427665">Indícanos o teu grao de satisfacción.</translation> @@ -9198,6 +9194,7 @@ <translation id="7406912950279255498">Modo de inversión da cor</translation> <translation id="7407430846095439694">Importar e vincular</translation> <translation id="7407504355934009739">A maioría de usuarios bloquean as notificacións deste sitio</translation> +<translation id="7407578029724074226">O ficheiro "<ph name="FILE_NAME" />" contén datos confidenciais. A túa organización permitirache gardalo no almacenamento na nube ou descartalo</translation> <translation id="7408080603962564527">Poderán velo outras persoas</translation> <translation id="740810853557944681">Engadir un servidor de impresión</translation> <translation id="7409549334477097887">Moi grande</translation> @@ -9251,6 +9248,7 @@ <translation id="7434969625063495310">Non se puido engadir o servidor de impresión. Comproba a súa configuración e téntao de novo.</translation> <translation id="7436921188514130341">Que pena! Produciuse un erro durante o cambio de nome.</translation> <translation id="7439519621174723623">Engade un nome de dispositivo para continuar</translation> +<translation id="743982235360757672">Mantén o modo IA á man mentres navegas</translation> <translation id="7441736532026945583">Selecciona Ocultar grupo para quitalo da franxa de pestanas</translation> <translation id="7441736921018636843">Se queres cambiar esta opción de configuración, <ph name="BEGIN_LINK" />restablece a sincronización<ph name="END_LINK" /> para quitar a frase de acceso da sincronización</translation> <translation id="7441830548568730290">Outros usuarios</translation> @@ -9989,7 +9987,6 @@ <translation id="794676567536738329">Confirmar permisos</translation> <translation id="7947962633355574091">C&opiar enderezo de vídeo</translation> <translation id="7947964080535614577">Os sitios adoitan mostrar anuncios para poder ofrecer contido ou servizos sen custo económico. Non obstante, algúns conteñen anuncios enganosos ou intrusivos.</translation> -<translation id="7948239795436419268">Non restaurar ventás</translation> <translation id="7948407723851303488">Todas as páxinas de <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Razón: LBS só admite os URL http://, https:// e file://.</translation> <translation id="7950814699499457511">Activada • Esta extensión non ten publicada ningunha práctica de privacidade (como, por exemplo, o modo en que recompila e usa os datos)</translation> @@ -11178,7 +11175,6 @@ <translation id="8751034568832412184">Centro educativo</translation> <translation id="8751329102746373229">Da persoa administradora</translation> <translation id="8752451679755290210">Desprázate polos distintos elementos de forma automática</translation> -<translation id="8753948258138515839">A aplicación Ficheiros permite acceder rapidamente aos ficheiros que gardases en Google Drive, no almacenamento externo ou no dispositivo Chrome OS Flex.</translation> <translation id="8754200782896249056"><p>Cando se execute <ph name="PRODUCT_NAME" /> nun contorno de escritorio compatible, utilizarase a configuración do proxy do sistema. Non obstante, ou o sistema non é compatible ou se produciu un problema ao iniciar a configuración do sistema.</p> <p>Pero aínda así podes efectuar a configuración a través da liña de comandos. Consulta <code>man <ph name="PRODUCT_BINARY_NAME" /></code> para obter máis información acerca das marcas e das variables do contorno.</p></translation> @@ -11971,6 +11967,7 @@ <translation id="992778845837390402">Estase creando unha copia de seguranza de Linux</translation> <translation id="994087375490600917">Paneis laterais</translation> <translation id="994289308992179865">&Bucle</translation> +<translation id="995420352808264005">Escoller o tipo de inscrición do dispositivo</translation> <translation id="995755448277384931">Engadir IBAN</translation> <translation id="996250603853062861">Establecendo conexión segura...</translation> <translation id="997143476478634194">Esta opción de configuración aplicarase automaticamente aos sitios cando os visites. Os sitios adoitan enviar notificacións con noticias de última hora ou mensaxes de chat.</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 2b8a316..84691ea 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -285,7 +285,6 @@ <translation id="117916940443676133">તમારી સુરક્ષા કી પિન વડે સુરક્ષિત નથી. સાઇન-ઇન ડેટા મેનેજ કરવા માટે, પહેલાં પિન બનાવો.</translation> <translation id="1179400851034021914">IBAN અમાન્ય છે</translation> <translation id="1179902906564467236">તમારા ફોન પર સૂચનાઓ અનુસરો અથવા કૅમેરા ઍપનો ઉપયોગ કરો</translation> -<translation id="1180117276105724040">તમારા અગાઉના સત્રમાંથી વિન્ડો રિસ્ટોર કરી રહ્યાં છીએ...</translation> <translation id="118057123461613219">વધુ પ્રમાણમાં મેમરી બચત</translation> <translation id="1181037720776840403">કાઢી નાખો</translation> <translation id="1182876754474670069">હોમ</translation> @@ -760,7 +759,6 @@ <translation id="151501797353681931">સફારીમાંથી આયાત કરેલું</translation> <translation id="1515163294334130951">શરૂ કરો</translation> <translation id="1517467582299994451">કોઈ કોડ વડે કાસ્ટ કરવા માટે, Chrome બ્રાઉઝરના સિંક સેટિંગ ચાલુ કરો</translation> -<translation id="1519090060276706457">વિન્ડો રિસ્ટોર કરવામાં અપેક્ષા કરતાં વધુ સમય લાગી રહ્યો છે</translation> <translation id="1521442365706402292">પ્રમાણપત્રો મેનેજ કરો</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">આજે સક્રિય છે</translation> @@ -1173,7 +1171,6 @@ <translation id="1796460466266263589">Geminiનો ઉપયોગ કરવાનું ચાલુ રાખવા માટે, આ તમે જ હોવાની ચકાસણી કરો</translation> <translation id="1796588414813960292">સાઉન્ડની આવશ્યકતા હોય તેવી સુવિધાઓ કામ કરશે નહીં</translation> <translation id="1798726622311813209">ક્રેડિટ અને ડેબિટ કાર્ડ</translation> -<translation id="1799852120691957794">તમારા અગાઉના સત્રમાંની વિન્ડો રિસ્ટોર કરી શકતા નથી</translation> <translation id="180203835522132923">Search + O, પછી W</translation> <translation id="1802624026913571222">કવર બંધ કરવામાં આવે ત્યારે નિષ્ક્રિય કરો</translation> <translation id="1802687198411089702">પેજ પ્રતિસાદ આપી રહ્યું નથી. તમે તેની રાહ જોઈ શકો છો અથવા બહાર નીકળી શકો છો.</translation> @@ -2367,7 +2364,6 @@ <translation id="2610374175948698697">તમારા ડિવાઇસમાંની ફાઇલો અથવા ફોલ્ડરો જોઈ શકે છે</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">તમારા Microsoft એકાઉન્ટમાં સાઇન ઇન કરો અને પછી ફરી પ્રયાસ કરો</translation> -<translation id="2611702650078660078">ભૂલ આવી છે</translation> <translation id="2611776654555141051">લંબચોરસ ટૂલ</translation> <translation id="2611885296070244383">માઇક (આંતરિક)</translation> <translation id="2612676031748830579">કાર્ડ નંબર</translation> @@ -2731,7 +2727,6 @@ <translation id="285033512555869047">બંધ</translation> <translation id="2850541429955027218">થીમ ઉમેરો</translation> <translation id="2851291081585704741">તમે ઑફલાઇન છો</translation> -<translation id="2852045827873867442">ઇન્ટરનેટ કનેક્શન આવશ્યક છે.</translation> <translation id="285237063405807022">(લોડ કરી રહ્યાં છીએ)</translation> <translation id="2853121255651601031">પાસવર્ડ સાચવ્યો</translation> <translation id="2854453262159518435">વર્તમાન ટૅબનું ગ્રૂપ બદલો</translation> @@ -5487,7 +5482,6 @@ <translation id="4779766576531456629">ઇ-સિમ સેલ્યુલર નેટવર્કનું નામ બદલો</translation> <translation id="4780321648949301421">પેજ આ રીતે સાચવો...</translation> <translation id="4780558987886269159">ઑફિસ માટે</translation> -<translation id="4781633367688946589">નવા સત્રમાં આગળ વધો</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> તમારા ડિજિટલ વૉલેટમાંથી વ્યક્તિગત માહિતીનો ઉપયોગ કરવા માગે છે.</translation> <translation id="4785719467058219317">તમે આ વેબસાઇટમાં રજિસ્ટર ન થયેલા સુરક્ષા કોડનો ઉપયોગ કરી રહ્યા છો</translation> <translation id="4785914069240823137">કાપવાનું રદ કરો</translation> @@ -7465,7 +7459,6 @@ <translation id="6180550893222597997"><ph name="APP_NAME" /> માટે તમે કઈ પાસકીનો ઉપયોગ કરવા માગો છો?</translation> <translation id="6181218116951226898">ઍપ ક્યારેક તેમનું બ્રાંડિંગ અપડેટ કરે છે. અપડેટ કરતા પહેલાં બધા ફેરફારોનો રિવ્યૂ કરો જેથી ખાતરી કરી શકાય કે તમને તે અનુકૂળ લાગે છે.</translation> <translation id="6181431612547969857">ડાઉનલોડ અવરોધિત કર્યું</translation> -<translation id="6182100780603067202">ઍપ્લિકેશનનો ઑડિયો પણ શેર કરો (તેની બધી વિન્ડોમાંથી)</translation> <translation id="6183369864942961155">ઑટોમૅટિક લાઇટ/ડાર્ક થીમ</translation> <translation id="6183773856988300112">Gemini in Chrome તમારા ટૅબમાં કામ કરવા માટે ઑટોમૅટિક રીતે બ્રાઉઝ કરવાની સુવિધાનો ઉપયોગ કરે છે અને તમે તેને આપેલા કાર્યો પૂર્ણ કરે છે. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> <translation id="6184099524311454384">ટૅબ શોધો</translation> @@ -8260,7 +8253,6 @@ <translation id="6754359471209693699">નવી શોધ શરૂ કરો</translation> <translation id="6754918760968695779">ક્વિક ઇન્સર્ટ</translation> <translation id="6755702685749429945">શબ્દકોશ ઉમેરો</translation> -<translation id="6756157672127672536">Files ઍપ તમે Google Drive, બાહ્ય સ્ટોરેજ અથવા તમારા ChromeOS ડિવાઇસ પર સાચવેલી ફાઇલોનો ઝડપી ઍક્સેસ આપે છે.</translation> <translation id="6756643207511618722">સ્પીચ એન્જિન</translation> <translation id="6757431299485455321">આ હૉટસ્પૉટ શોધવામાં અન્ય ડિવાઇસની સહાય કરો.</translation> <translation id="6758056191028427665">અમને જણાવો કે અમે કેવું કાર્ય કરી રહ્યાં છીએ.</translation> @@ -10000,7 +9992,6 @@ <translation id="794676567536738329">પરવાનગીઓની પુષ્ટિ કરો</translation> <translation id="7947962633355574091">વીડિયો ઍડ્રેસ કૉ&પિ કરો</translation> <translation id="7947964080535614577">સાઇટ સામાન્ય રીતે જાહેરાતો બતાવે છે, જેથી તેઓ કોઈ કિંમત વિના કન્ટેન્ટ અથવા સેવાઓ આપી શકે. પણ કેટલીક સાઇટ ઘૃણાસ્પદ અથવા ભ્રામક જાહેરાતો બતાવવા માટે જાણીતી હોય છે.</translation> -<translation id="7948239795436419268">વિન્ડો રિસ્ટોર કરશો નહીં</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" />ના તમામ પેજ</translation> <translation id="7950629216186736592">કારણ: LBS માત્ર http://, https:// અને file:// URLsને જ સપોર્ટ કરે છે.</translation> <translation id="7950814699499457511">ચાલુ છે • આ એક્સ્ટેન્શન દ્વારા તેની ડેટા એકત્રિત કરવાની અને તેનો ઉપયોગ કરવાની રીત જેવી પ્રાઇવસી પ્રૅક્ટિસ પબ્લિશ કરવામાં આવી નથી</translation> @@ -11184,7 +11175,6 @@ <translation id="8751034568832412184">સ્કૂલ</translation> <translation id="8751329102746373229">તમારા ઍડમિનિસ્ટ્રેટર તરફથી</translation> <translation id="8752451679755290210">એકથી બીજી આઇટમ પર ઑટોમૅટિક રીતે સરળતાથી જાઓ</translation> -<translation id="8753948258138515839">Files ઍપ તમે Google Drive, બાહ્ય સ્ટોરેજ અથવા તમારા ChromeOS Flex ડિવાઇસ પર સાચવેલી ફાઇલોનો ઝડપી ઍક્સેસ આપે છે.</translation> <translation id="8754200782896249056"><p>જ્યારે સમર્થિત ડેસ્કટૉપ વાતાવરણની અંતર્ગત <ph name="PRODUCT_NAME" /> ચલાવી રહ્યા હોય, ત્યારે સિસ્ટમ પ્રૉક્સી સેટિંગ ઉપયોગમાં લેવાશે. તેમ છતાં, ક્યાં તો તમારી સિસ્ટમ સમર્થિત નથી અથવા તમારી સિસ્ટમ ગોઠવણીને લોંચ કરવામાં કોઈ સમસ્યા હતી.</p> <p>પણ તમે કમાન્ડ લાઇન દ્વારા હજી પણ ગોઠવી શકો છો. કૃપા કરીને ફ્લેગ અને વાતાવરણ વેરિએબલ પર વધુ માહિતી માટે <code>man <ph name="PRODUCT_BINARY_NAME" /></code> જુઓ.</p></translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 967a1c2..45fcc66 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">मुख्य नोड की व्याख्या करने के लिए फ़ाइलें डाउनलोड नहीं की जा सकीं. कुछ देर बाद कोशिश करें.</translation> <translation id="1103523840287552314"><ph name="LANGUAGE" /> का हमेशा अनुवाद करें</translation> <translation id="1104098698795583187">आपके लिए, इस टैब ग्रुप का ऐक्सेस तुरंत हटा दिया जाएगा. साथ ही, इसे आपके सभी डिवाइसों से मिटा दिया जाएगा</translation> +<translation id="1105934302947321130">Google Beam में Zoom</translation> <translation id="1106270460549661906">Gemini के साथ शेयर करना बंद करें</translation> <translation id="1106350001632362876">थ्रेशोल्ड बढ़ाएं</translation> <translation id="110850812463801904">OneDrive से मैन्युअल तरीके से कनेक्ट करें</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">आपकी सुरक्षा कुंजी को पिन से सुरक्षित नहीं किया गया है. साइन इन करने के लिए डेटा प्रबंधित करने के लिए, पहले पिन बनाएं.</translation> <translation id="1179400851034021914">IBAN अमान्य है</translation> <translation id="1179902906564467236">अपने फ़ोन पर दिए गए निर्देशों का पालन करें या Camera ऐप्लिकेशन का इस्तेमाल करें</translation> -<translation id="1180117276105724040">आपके पिछले सेशन की विंडो वापस लाई जा रही हैं...</translation> <translation id="118057123461613219">ज़्यादा बचत</translation> <translation id="1181037720776840403">हटाएं</translation> <translation id="1182876754474670069">home</translation> @@ -763,7 +763,6 @@ <translation id="151501797353681931">Safari से आयातित</translation> <translation id="1515163294334130951">लॉन्च करें</translation> <translation id="1517467582299994451">कोड की मदद से कास्ट करने के लिए, Chrome ब्राउज़र की सिंक सेटिंग चालू करें</translation> -<translation id="1519090060276706457">विंडो को वापस लाने में उम्मीद से ज़्यादा समय लग रहा है</translation> <translation id="1521442365706402292">प्रमाणपत्र प्रबंधित करें</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">आज सक्रिय है</translation> @@ -1112,6 +1111,7 @@ <translation id="1745732479023874451">संपर्कों को प्रबंधित करें</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}one{क्या # फ़ाइल को इस वेब ऐप्लिकेशन में खोलकर उसमें बदलाव करना है?}other{क्या # फ़ाइलों को इस वेब ऐप्लिकेशन में खोलकर उनमें बदलाव करना है?}}</translation> <translation id="1748563609363301860">आप इस पासवर्ड को अपने Google खाते या सिर्फ़ इस डिवाइस में सेव कर सकते हैं</translation> +<translation id="1749645492410897998">सॉफ़्टवेयर इंस्टॉल किया जा रहा है</translation> <translation id="1749733017156547309">पासवर्ड ज़रूरी है</translation> <translation id="1750172676754093297">आपकी सुरक्षा कुंजी फ़िंगरप्रिंट स्टोर नहीं कर सकती है.</translation> <translation id="1750238553597293878">अपने Google खाते में सेव किए गए पासवर्ड का इस्तेमाल जारी रखें</translation> @@ -1183,7 +1183,6 @@ <translation id="1796460466266263589">Gemini का इस्तेमाल जारी रखने के लिए, अपनी पहचान की पुष्टि करें</translation> <translation id="1796588414813960292">वे सुविधाएं काम नहीं करेंगी जिन्हें आवाज़ की ज़रूरत है</translation> <translation id="1798726622311813209">क्रेडिट और डेबिट कार्ड की जानकारी</translation> -<translation id="1799852120691957794">आपके पिछले सेशन वाली विंडो वापस नहीं लाई जा सकतीं</translation> <translation id="180203835522132923">Search + O, फिर W</translation> <translation id="1802624026913571222">लिड बंद होने पर स्लीप मोड चालू करें</translation> <translation id="1802687198411089702">पेज काम नहीं कर रहा है. आप इंतज़ार कर सकते हैं या बाहर निकल सकते हैं.</translation> @@ -2380,7 +2379,6 @@ <translation id="2610374175948698697">आपके डिवाइस पर, इन फ़ाइलों या फ़ोल्डर को देखने की अनुमति है</translation> <translation id="2610780100389066815">Microsoft विश्वास सूची हस्ताक्षर</translation> <translation id="261114180663074524">अपने Microsoft खाते में साइन इन करें और फिर से कोशिश करें</translation> -<translation id="2611702650078660078">कोई गड़बड़ी हुई</translation> <translation id="2611776654555141051">आयत बनाने का टूल</translation> <translation id="2611885296070244383">माइक्रोफ़ोन (इंटरनल)</translation> <translation id="2612676031748830579">कार्ड नंबर</translation> @@ -2744,7 +2742,6 @@ <translation id="285033512555869047">बंद हो गया है</translation> <translation id="2850541429955027218">थीम जोड़ें</translation> <translation id="2851291081585704741">आप ऑफ़लाइन हैं</translation> -<translation id="2852045827873867442">इंटरनेट कनेक्शन होना ज़रूरी है.</translation> <translation id="285237063405807022">(लोड हो रहा है)</translation> <translation id="2853121255651601031">पासवर्ड सेव किया गया</translation> <translation id="2854453262159518435">मौजूदा टैब ग्रुप को बदलें</translation> @@ -3611,6 +3608,7 @@ <translation id="3473241910002674503">टैबलेट मोड में बटन की मदद से, होम पेज पर जाएं, वापस जाएं, और एक ऐप्लिकेशन से दूसरे पर जाएं.</translation> <translation id="3473479545200714844">स्क्रीन पर मौजूद कॉन्टेंट को बड़ा करके दिखाने की सुविधा</translation> <translation id="3474218480460386727">नए शब्दों के लिए 99 अक्षरों या उससे कम का इस्तेमाल करें</translation> +<translation id="3474330892505468100">Google Beam में Meet</translation> <translation id="3474624961160222204"><ph name="NAME" /> के रूप में जारी रखें</translation> <translation id="3477772589943384839">मॉडरेट तरीके से मेमोरी सेव करें. लंबे समय तक इस्तेमाल न किए जाने पर, टैब इनऐक्टिव हो जाते हैं.</translation> <translation id="347785443197175480"><ph name="HOST" /> को अपने कैमरे और माइक्रोफ़ोन को एक्सेस करते रहने दें</translation> @@ -5498,7 +5496,6 @@ <translation id="4779766576531456629">eSIM मोबाइल नेटवर्क का नाम बदलें</translation> <translation id="4780321648949301421">पेज को इस रूप में सेव करें...</translation> <translation id="4780558987886269159">काम के लिए</translation> -<translation id="4781633367688946589">नए सेशन में जारी रखें</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> को आपके डिजिटल वॉलेट से निजी जानकारी इस्तेमाल करनी है.</translation> <translation id="4785719467058219317">आप एक ऐसी 'सुरक्षा चाबी' इस्तेमाल कर रहे हैं जिसे इस वेबसाइट पर रजिस्टर नहीं किया गया है</translation> <translation id="4785914069240823137">कांट-छांट को रद्द करें</translation> @@ -6285,6 +6282,7 @@ <translation id="5337926771328966926">मौजूदा डिवाइस का नाम <ph name="DEVICE_NAME" /> है</translation> <translation id="5338338064218053691">आप गुप्त विंडो इस्तेमाल करके, निजी रूप से ब्राउज़ कर सकते हैं</translation> <translation id="5338503421962489998">स्थानीय मेमोरी</translation> +<translation id="5340620183031438925">पेज छोड़े बिना एआई मोड से अपने टैब के बारे में सवाल पूछने के लिए, अपनी पहचान की पुष्टि करें. आपको अपने सभी डिवाइसों पर अपने पासवर्ड वगैरह का ऐक्सेस भी मिलेगा.</translation> <translation id="5340787663756381836">&ढूंढें और बदलाव करें</translation> <translation id="5340900621595888432">ऐप्लिकेशन की परफ़ॉर्मेंस और उसके इस्तेमाल से जुड़ा डेटा भेजें</translation> <translation id="5341793073192892252">इन कुकी को ब्लॉक कर दिया गया था (तृतीय पक्ष की कुकी बिना किसी अपवाद के ब्लॉक की जा रही हैं)</translation> @@ -7471,7 +7469,6 @@ <translation id="6180550893222597997">आपको <ph name="APP_NAME" /> के लिए किस पासकी का इस्तेमाल करना है?</translation> <translation id="6181218116951226898">ऐप्लिकेशन कभी-कभी अपनी ब्रैंडिंग अपडेट करते हैं. अपडेट करने से पहले, सभी बदलावों की समीक्षा करें. इससे यह पक्का करने में मदद मिलेगी कि आपको ये बदलाव स्वीकार हैं.</translation> <translation id="6181431612547969857">डाउनलोड करना ब्लॉक किया गया</translation> -<translation id="6182100780603067202">ऐप्लिकेशन का ऑडियो भी शेयर करें (इसकी सभी विंडो से)</translation> <translation id="6183369864942961155">अपने-आप हल्के/गहरे रंग वाली थीम</translation> <translation id="6183773856988300112">Chrome में Gemini आपके टैब में काम करने और आपके बताए काम पूरे करने के लिए, अपने-आप ब्राउज़ करने की सुविधा का इस्तेमाल करता है. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="6184099524311454384">टैब खोजें</translation> @@ -8266,7 +8263,6 @@ <translation id="6754359471209693699">नई खोज शुरू करें</translation> <translation id="6754918760968695779">क्विक इंसर्ट</translation> <translation id="6755702685749429945">डिक्शनरी जोड़ें</translation> -<translation id="6756157672127672536">Files ऐप्लिकेशन में आपको उन फ़ाइलों का तुरंत ऐक्सेस मिलता है जिन्हें आपने Google Drive, बाहरी मेमोरी या अपने ChromeOS डिवाइस पर सेव किया है.</translation> <translation id="6756643207511618722">लिखाई को बोली में बदलने की सुविधा से जुड़ी सेटिंग पर जाएं</translation> <translation id="6757431299485455321">इस हॉटस्पॉट को खोजने में अन्य डिवाइसों की मदद करें.</translation> <translation id="6758056191028427665">हमें बताएं कि हम कैसा प्रदर्शन कर रहे हैं.</translation> @@ -9213,6 +9209,7 @@ <translation id="7406912950279255498">रंग बदलने की सुविधा वाला मोड</translation> <translation id="7407430846095439694">आयात करें और आबद्ध करें</translation> <translation id="7407504355934009739">ज़्यादातर लोग इस साइट को सूचनाएं दिखाने से रोकते हैं</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> में संवेदनशील डेटा है. आपका संगठन, आपको यह चुनने की अनुमति देगा कि आप इस फ़ाइल को क्लाउड स्टोरेज में सेव करें या इसे हटाएं</translation> <translation id="7408080603962564527">यह नाम दूसरे लोगों को दिखेगा</translation> <translation id="740810853557944681">प्रिंट सर्वर जोड़ें</translation> <translation id="7409549334477097887">बहुत ज़्यादा</translation> @@ -9265,6 +9262,7 @@ <translation id="7434969625063495310">प्रिंट सर्वर नहीं जोड़ा जा सका. कृपया सर्वर का कॉन्फ़िगरेशन जांचें और फिर से कोशिश करें.</translation> <translation id="7436921188514130341">हे भगवान! नाम बदलने के दौरान गड़बड़ी हुई.</translation> <translation id="7439519621174723623">जारी रखने के लिए किसी डिवाइस का नाम जोड़ें</translation> +<translation id="743982235360757672">पक्का करें कि ब्राउज़ करते समय एआई मोड को ऐक्सेस किया जा सके</translation> <translation id="7441736532026945583">किसी ग्रुप को टैब बार से हटाने के लिए, "ग्रुप छिपाएं" को चुनें</translation> <translation id="7441736921018636843">यह सेटिंग बदलने के लिए, <ph name="BEGIN_LINK" />सिंक रीसेट करें<ph name="END_LINK" /> ताकि आपका सिंक करने का लंबा पासवर्ड हटाया जा सके</translation> <translation id="7441830548568730290">अन्य उपयोगकर्ता</translation> @@ -10003,7 +10001,6 @@ <translation id="794676567536738329">अनुमतियों की पुष्टि करें</translation> <translation id="7947962633355574091">वीडियो के पते को कॉ&पी करें</translation> <translation id="7947964080535614577">आम तौर पर, साइटें विज्ञापन दिखाती हैं, ताकि कॉन्टेंट या सेवाएं बिलकुल मुफ़्त में उपलब्ध कराई जा सकें. हालांकि, कुछ साइटें तंग या गुमराह करने वाले विज्ञापन दिखाती हैं.</translation> -<translation id="7948239795436419268">विंडो को वापस न लाएं</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" /> के सभी पेज</translation> <translation id="7950629216186736592">वजह: एलबीएस की सुविधा सिर्फ़ http://, https://, और file:// से शुरू होने वाले यूआरएल के साथ काम करती है.</translation> <translation id="7950814699499457511">चालू है • इस एक्सटेंशन ने निजता लागू करने की प्रक्रियाओं को पब्लिश नहीं किया है. जैसे, डेटा को इकट्ठा और उसे इस्तेमाल करने का तरीका</translation> @@ -11192,7 +11189,6 @@ <translation id="8751034568832412184">स्कूल</translation> <translation id="8751329102746373229">आपके एडमिन से मिले सर्टिफ़िकेट</translation> <translation id="8752451679755290210">अलग-अलग आइटम पर अपने-आप जाने की सुविधा</translation> -<translation id="8753948258138515839">Files ऐप्लिकेशन उन फ़ाइलों का क्विक ऐक्सेस देता है जिन्हें आपने Google Drive, बाहरी स्टोरेज या ChromeOS Flex वाले डिवाइस में सेव किया है.</translation> <translation id="8754200782896249056"><p><ph name="PRODUCT_NAME" /> जिस 'डेस्कटॉप वातावरण' पर काम करता है, उस पर इसे चलाते समय, सिस्टम प्रॉक्सी सेटिंग का उपयोग किया जाएगा. हालांकि, या तो आपके सिस्टम पर यह सुविधा नहीं है या आपके सिस्टम कॉन्फ़िगरेशन को लॉन्च करने में कोई समस्या थी.</p> <p>लेकिन आप फिर भी कमांड लाइन के ज़रिए कॉन्फ़िगर कर सकते हैं. फ़्लैग और वातावरण वैरिएबल पर ज़्यादा जानकारी के लिए कृपया <code>man <ph name="PRODUCT_BINARY_NAME" /></code> देखें.</p></translation> @@ -11986,6 +11982,7 @@ <translation id="992778845837390402">फ़िलहाल, Linux की बैकअप की प्रक्रिया जारी है</translation> <translation id="994087375490600917">साइड पैनल</translation> <translation id="994289308992179865">&लूप</translation> +<translation id="995420352808264005">डिवाइस रजिस्टर करने का तरीका चुनें</translation> <translation id="995755448277384931">IBAN जोड़ें</translation> <translation id="996250603853062861">सुरक्षित कनेक्शन स्थापित कर रहा है...</translation> <translation id="997143476478634194">साइटों पर जाने के दौरान, वे अपने-आप इस सेटिंग का पालन करती हैं. आम तौर पर, साइटें आपको सूचनाएं भेजती हैं, ताकि आपको ताज़ा खबरों या चैट मैसेज के बारे में पता चल सके.</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index e9b60fde..2099dfe 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Ne mogu se preuzeti datoteke sa zabilješkama glavnog čvora. Pokušajte ponovo kasnije.</translation> <translation id="1103523840287552314">Uvijek prevedi <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Odmah ćete izgubiti pristup grupi kartica i ona će se izbrisati sa svih vaših uređaja</translation> +<translation id="1105934302947321130">Google Beam uz Zoom</translation> <translation id="1106270460549661906">Prekini dijeljenje s Geminijem</translation> <translation id="1106350001632362876">Povećaj prag</translation> <translation id="110850812463801904">Ručno se povežite s OneDriveom</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Vaš sigurnosni ključ nije zaštićen PIN-om. Za upravljanje podacima za prijavu prvo izradite PIN.</translation> <translation id="1179400851034021914">IBAN nije važeći</translation> <translation id="1179902906564467236">Slijedite upute na telefonu ili upotrijebite aplikaciju kamere</translation> -<translation id="1180117276105724040">Vraćanje prozora iz prethodne sesije...</translation> <translation id="118057123461613219">Velike uštede</translation> <translation id="1181037720776840403">Ukloni</translation> <translation id="1182876754474670069">početna</translation> @@ -763,7 +763,6 @@ <translation id="151501797353681931">Uvezeno iz preglednika Safari</translation> <translation id="1515163294334130951">Pokreni</translation> <translation id="1517467582299994451">Da biste emitirali pomoću koda, uključite postavke sinkronizacije preglednika Chrome</translation> -<translation id="1519090060276706457">Vraćanje prozora traje dulje od očekivanog</translation> <translation id="1521442365706402292">Upravljajte certifikatima</translation> <translation id="1521655867290435174">Google tablice</translation> <translation id="1521774566618522728">Aktivan danas</translation> @@ -1104,6 +1103,7 @@ <translation id="1745732479023874451">Upravljajte kontaktima</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}one{Otvoriti i urediti # datoteku u ovoj web-aplikaciji?}few{Otvoriti i urediti # datoteke u ovoj web-aplikaciji?}other{Otvoriti i urediti # datoteka u ovoj web-aplikaciji?}}</translation> <translation id="1748563609363301860">Ovu zaporku možete spremiti na svoj Google račun ili samo na ovaj uređaj</translation> +<translation id="1749645492410897998">Instaliranje softvera</translation> <translation id="1749733017156547309">Potrebna je zaporka</translation> <translation id="1750172676754093297">Sigurnosni ključ ne može pohraniti otiske prstiju</translation> <translation id="1750238553597293878">Nastavite upotrebljavati zaporke na svom Google računu</translation> @@ -1175,7 +1175,6 @@ <translation id="1796460466266263589">Da biste nastavili upotrebljavati Gemini, potvrdite svoj identitet</translation> <translation id="1796588414813960292">Značajke kojima je potreban zvuk neće funkcionirati</translation> <translation id="1798726622311813209">Kreditne i debitne kartice</translation> -<translation id="1799852120691957794">Nije moguće vratiti prozore iz prethodne sesije</translation> <translation id="180203835522132923">Pretraživanje + O, a zatim W</translation> <translation id="1802624026913571222">U mirovanje kada se zatvori poklopac.</translation> <translation id="1802687198411089702">Stranica ne reagira. Možete je pričekati ili napustiti.</translation> @@ -2369,7 +2368,6 @@ <translation id="2610374175948698697">Može pregledavati datoteke ili mape na vašem uređaju</translation> <translation id="2610780100389066815">Microsoftovo potpisivanje pouzdanog popisa</translation> <translation id="261114180663074524">Prijavite se na Microsoft račun i pokušajte ponovno</translation> -<translation id="2611702650078660078">Došlo je do pogreške</translation> <translation id="2611776654555141051">Alat za pravokutnike</translation> <translation id="2611885296070244383">Mikrofon (ugrađeni)</translation> <translation id="2612676031748830579">Broj kartice</translation> @@ -2733,7 +2731,6 @@ <translation id="285033512555869047">Zatvoreno</translation> <translation id="2850541429955027218">Dodaj temu</translation> <translation id="2851291081585704741">Niste povezani s internetom</translation> -<translation id="2852045827873867442">Potrebna je internetska veza.</translation> <translation id="285237063405807022">(učitavanje)</translation> <translation id="2853121255651601031">Zaporka je spremljena</translation> <translation id="2854453262159518435">Zamijeni postojeću grupu kartica</translation> @@ -3599,6 +3596,7 @@ <translation id="3473241910002674503">U načinu rada tableta gumbima idite na početnu stranicu, natrag i prelazite s jedne aplikacije na drugu.</translation> <translation id="3473479545200714844">Povećalo</translation> <translation id="3474218480460386727">Za nove riječi koristite najviše 99 slova</translation> +<translation id="3474330892505468100">Google Beam uz Meet</translation> <translation id="3474624961160222204">Nastavi kao <ph name="NAME" /></translation> <translation id="3477772589943384839">Ostvarite umjerenu uštedu memorije. Kartice će nakon duljeg razdoblja postati neaktivne.</translation> <translation id="347785443197175480">Nastavi dopuštati hostu <ph name="HOST" /> pristup kameri i mikrofonu</translation> @@ -5487,7 +5485,6 @@ <translation id="4779766576531456629">Preimenovanje mobilne mreže eSIM-a</translation> <translation id="4780321648949301421">Spremi stranicu kao...</translation> <translation id="4780558987886269159">Za posao</translation> -<translation id="4781633367688946589">Nastavi do nove sesije</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> želi upotrijebiti osobne podatke iz vašeg digitalnog novčanika.</translation> <translation id="4785719467058219317">Upotrebljavate sigurnosni ključ koji nije registriran na toj web-lokaciji</translation> <translation id="4785914069240823137">Poništite obrezivanje</translation> @@ -6274,6 +6271,7 @@ <translation id="5337926771328966926">Trenutačni je naziv uređaja <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Možete pregledavati privatno u anonimnom prozoru</translation> <translation id="5338503421962489998">Lokalna pohrana</translation> +<translation id="5340620183031438925">Da biste postavili pitanje AI načinu o svojoj kartici bez napuštanja stranice, potvrdite svoj identitet. Također ćete moći pristupati svojim zaporkama i drugim podacima na svim svojim uređajima.</translation> <translation id="5340787663756381836">&Traži i uredi</translation> <translation id="5340900621595888432">Pošaljite dijagnostičke podatke i podatke o upotrebi</translation> <translation id="5341793073192892252">Blokirani su sljedeći kolačići (kolačići treće strane blokiraju se bez iznimke)</translation> @@ -7457,7 +7455,6 @@ <translation id="6180550893222597997">Koji pristupni ključ želite koristiti za aplikaciju <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Aplikacije ponekad ažuriraju svoju upotrebu robne marke. Prije ažuriranja pregledajte sve izmjene kako biste bili sigurni da vam odgovaraju.</translation> <translation id="6181431612547969857">Preuzimanje je blokirano</translation> -<translation id="6182100780603067202">Dijelite i zvuk aplikacije (iz svih prozora)</translation> <translation id="6183369864942961155">Automatska svijetla/tamna tema</translation> <translation id="6183773856988300112">Gemini u Chromeu upotrebljava automatsko pregledavanje za rad na vašim karticama i dovršavanje zadataka koje mu dodijelite. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Pretraži kartice</translation> @@ -8254,7 +8251,6 @@ <translation id="6754359471209693699">Pokretanje novog pretraživanja</translation> <translation id="6754918760968695779">Brzo umetanje</translation> <translation id="6755702685749429945">Dodajte rječnik</translation> -<translation id="6756157672127672536">Aplikacija Datoteke pruža brzi pristup datotekama spremljenim na Google disku, u vanjskoj pohrani ili na uređaju s Chrome OS-om.</translation> <translation id="6756643207511618722">Alati za pretvaranje teksta u govor</translation> <translation id="6757431299485455321">Pomozite drugim uređajima da pronađu ovu žarišnu točku.</translation> <translation id="6758056191028427665">Recite nam koliko ste zadovoljni nama.</translation> @@ -9201,6 +9197,7 @@ <translation id="7406912950279255498">Način inverzije boja</translation> <translation id="7407430846095439694">Uvezi i poveži</translation> <translation id="7407504355934009739">Većina korisnika blokira obavijesti s te web-lokacije</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> sadrži osjetljive podatke. Vaša će vam organizacija omogućiti da ih spremite u pohranu u oblaku ili odbacite</translation> <translation id="7408080603962564527">Ovo će biti vidljivo drugima</translation> <translation id="740810853557944681">Dodajte poslužitelj za ispis</translation> <translation id="7409549334477097887">Posebno velik</translation> @@ -9254,6 +9251,7 @@ <translation id="7434969625063495310">Dodavanje poslužitelja za ispis nije uspjelo. Provjerite konfiguraciju poslužitelja i pokušajte ponovo.</translation> <translation id="7436921188514130341">O, ne! Došlo je do pogreške prilikom preimenovanja.</translation> <translation id="7439519621174723623">Dodajte naziv uređaja za nastavak</translation> +<translation id="743982235360757672">Pregledavajte uz AI način nadohvat ruke</translation> <translation id="7441736532026945583">Odaberite Sakrij grupu da biste uklonili grupu s vrpce kartica</translation> <translation id="7441736921018636843">Da biste promijenili tu postavku, <ph name="BEGIN_LINK" />poništite sinkronizaciju<ph name="END_LINK" /> radi uklanjanja vaše šifre za sinkronizaciju</translation> <translation id="7441830548568730290">Ostali korisnici</translation> @@ -9992,7 +9990,6 @@ <translation id="794676567536738329">Potvrda dozvola</translation> <translation id="7947962633355574091">K&opiraj adresu videozapisa</translation> <translation id="7947964080535614577">Web-lokacije obično prikazuju oglase kako bi mogle pružati sadržaj ili usluge bez dodatnih troškova. Međutim, za neke je web-lokacije poznato da prikazuju ometajuće ili obmanjujuće oglase.</translation> -<translation id="7948239795436419268">Ne vraćaj prozore</translation> <translation id="7948407723851303488">Sve stranice domene <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Razlog: LBS podržava samo http://, https:// i file:// URL-ove.</translation> <translation id="7950814699499457511">Uključeno • Ovo proširenje nije objavilo prakse u vezi s privatnošću, na primjer način na koji prikuplja i upotrebljava podatke</translation> @@ -11181,7 +11178,6 @@ <translation id="8751034568832412184">Škola</translation> <translation id="8751329102746373229">Od vašeg administratora</translation> <translation id="8752451679755290210">Automatsko kretanje po stavkama</translation> -<translation id="8753948258138515839">Aplikacija Datoteke pruža brzi pristup datotekama spremljenima na Google disku, u vanjskoj pohrani ili na uređaju s ChromeOS Flexom.</translation> <translation id="8754200782896249056"><p>Kada se <ph name="PRODUCT_NAME" /> izvodi u podržanom okruženju radne površine, upotrebljavaju se proxy postavke sustava. Međutim, vaš sustav nije podržan ili je došlo do problema pri pokretanju konfiguracije sustava.</p> <p>Još uvijek možete konfigurirati putem naredbenog retka. Pogledajte <code>man <ph name="PRODUCT_BINARY_NAME" /></code> za više informacija o oznakama i varijablama okruženja.</p></translation> @@ -11976,6 +11972,7 @@ <translation id="992778845837390402">U tijeku je sigurnosno kopiranje Linuxa</translation> <translation id="994087375490600917">Bočne ploče</translation> <translation id="994289308992179865">&Petlja</translation> +<translation id="995420352808264005">Odaberite vrstu registracije uređaja</translation> <translation id="995755448277384931">Dodavanje IBAN-a</translation> <translation id="996250603853062861">Uspostavljanje sigurne veze...</translation> <translation id="997143476478634194">Web-lokacije automatski primjenjuju ovu postavku kad ih posjetite. Web-lokacije obično šalju obavijesti o izvanrednim vijestima ili porukama chata.</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index e38c97eaf..15e0340 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Nem sikerült letölteni a fő annotációs fájlokat. Próbálja újra később.</translation> <translation id="1103523840287552314"><ph name="LANGUAGE" /> - mindig legyen lefordítva</translation> <translation id="1104098698795583187">Azonnal elveszíti a jelen lapcsoporthoz való hozzáférését, és a lapcsoport az összes eszközéről törlődik</translation> +<translation id="1105934302947321130">Google Beam a Zoommal</translation> <translation id="1106270460549661906">A Geminivel való megosztás visszavonása</translation> <translation id="1106350001632362876">Küszöbérték növelése</translation> <translation id="110850812463801904">Manuális csatlakozás a OneDrive-hoz</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Biztonsági hardverkulcsát nem védi PIN-kód. A bejelentkezési adatok kezeléséhez előbb hozzon létre PIN-kódot.</translation> <translation id="1179400851034021914">Az IBAN érvénytelen</translation> <translation id="1179902906564467236">Kövesse a telefonon megjelenő utasításokat, vagy használja a Kamera alkalmazást</translation> -<translation id="1180117276105724040">Ablakok visszaállítása az előző munkamenetből…</translation> <translation id="118057123461613219">Hatalmas megtakarítás</translation> <translation id="1181037720776840403">Eltávolítás</translation> <translation id="1182876754474670069">home</translation> @@ -762,7 +762,6 @@ <translation id="151501797353681931">A Safariból importálva</translation> <translation id="1515163294334130951">Indítás</translation> <translation id="1517467582299994451">A kóddal való átküldéshez kapcsolja be a Chrome böngésző szinkronizálási beállításait</translation> -<translation id="1519090060276706457">Az ablakok visszaállítása a vártnál tovább tart</translation> <translation id="1521442365706402292">Tanúsítványok beállítása</translation> <translation id="1521655867290435174">Google Táblázatok</translation> <translation id="1521774566618522728">Ma volt aktív</translation> @@ -1111,6 +1110,7 @@ <translation id="1745732479023874451">Névjegyek kezelése</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{Megnyitja és szerkeszti a kiválasztott #fájlt ebben az internetes alkalmazásban?}}</translation> <translation id="1748563609363301860">Ezt a jelszót mentheti Google-fiókjába, illetve csak erre az eszközre</translation> +<translation id="1749645492410897998">Szoftver telepítése…</translation> <translation id="1749733017156547309">A jelszó megadása kötelező</translation> <translation id="1750172676754093297">Biztonsági hardverkulcsa nem tud ujjlenyomatokat tárolni</translation> <translation id="1750238553597293878">Továbbra is használhatja a Google-fiókjában lévő jelszavakat</translation> @@ -1182,7 +1182,6 @@ <translation id="1796460466266263589">A Gemini használatának folytatásához igazolja személyazonosságát</translation> <translation id="1796588414813960292">A hangot igénylő funkciók nem működnek majd</translation> <translation id="1798726622311813209">Hitel- és bankkártyák</translation> -<translation id="1799852120691957794">Nem lehet visszaállítani ablakokat az előző munkamenetből</translation> <translation id="180203835522132923">Keresés + O, majd W</translation> <translation id="1802624026913571222">Alvó mód bekapcsolása a képernyő lecsukásakor</translation> <translation id="1802687198411089702">Az oldal nem válaszol. Várakozhat tovább, vagy bezárhatja.</translation> @@ -2377,7 +2376,6 @@ <translation id="2610374175948698697">Megtekinthetik az Ön eszközén található fájlokat és mappákat</translation> <translation id="2610780100389066815">Microsoft - megbízhatósági lista aláírása</translation> <translation id="261114180663074524">Jelentkezzen be Microsoft-fiókjába, majd próbálja újra</translation> -<translation id="2611702650078660078">Hiba történt</translation> <translation id="2611776654555141051">Téglalap eszköz</translation> <translation id="2611885296070244383">Mikrofon (belső)</translation> <translation id="2612676031748830579">Kártyaszám</translation> @@ -2741,7 +2739,6 @@ <translation id="285033512555869047">Zárva</translation> <translation id="2850541429955027218">Téma hozzáadása</translation> <translation id="2851291081585704741">Offline állapotban van</translation> -<translation id="2852045827873867442">Internetkapcsolat szükséges.</translation> <translation id="285237063405807022">(betöltés…)</translation> <translation id="2853121255651601031">A jelszó mentése megtörtént</translation> <translation id="2854453262159518435">Meglévő lapcsoport cseréje</translation> @@ -3608,6 +3605,7 @@ <translation id="3473241910002674503">Táblagép módban gombok segítségével válthat alkalmazásokat, illetve léphet vissza és a kezdőképernyőre.</translation> <translation id="3473479545200714844">Képernyőnagyító</translation> <translation id="3474218480460386727">Új szavak megadásához legfeljebb 99 betűt használhat</translation> +<translation id="3474330892505468100">Google Beam a Meettel</translation> <translation id="3474624961160222204">Folytatás mint <ph name="NAME" /></translation> <translation id="3477772589943384839">Mérsékelt memóriamegtakarítást kaphat. A lapok hosszabb idő után válnak inaktívvá.</translation> <translation id="347785443197175480">A(z) <ph name="HOST" /> továbbra is hozzáférhet az Ön kamerájához és mikrofonjához</translation> @@ -5495,7 +5493,6 @@ <translation id="4779766576531456629">Az eSIM-hez kapcsolódó mobilhálózat átnevezése</translation> <translation id="4780321648949301421">Oldal mentése &másként...</translation> <translation id="4780558987886269159">Munkához</translation> -<translation id="4781633367688946589">Folytatás új munkamenetben</translation> <translation id="4784349455504343791">A(z) <ph name="WEBSITE_ORIGIN" /> használni szeretné az Ön digitális pénztárcájából származó személyes adatokat.</translation> <translation id="4785719467058219317">Olyan biztonsági hardverkulcsot használ, amely nincs regisztrálva ezen a webhelyen</translation> <translation id="4785914069240823137">Kivágás visszavonása</translation> @@ -6284,6 +6281,7 @@ <translation id="5337926771328966926">Eszköz jelenlegi neve: <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Privát módban böngészhet, ha inkognitó ablakot használ</translation> <translation id="5338503421962489998">Helyi tárhely</translation> +<translation id="5340620183031438925">Ha az oldal elhagyása nélkül szeretne kérdéseket feltenni az AI-módnak az adott lapról, igazolja a személyazonosságát. Egyebek mellett a jelszavaihoz is hozzáférhet bármely eszközén.</translation> <translation id="5340787663756381836">&Keresés és szerkesztés</translation> <translation id="5340900621595888432">Diagnosztikai és használati adatok küldése</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> @@ -7471,7 +7469,6 @@ <translation id="6180550893222597997">Melyik azonosítókulcsot szeretné használni a következőhöz: <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Az alkalmazások időnként frissítik a márkajegyeiket. A frissítés előtt az összes módosítást áttekintheti, és eldöntheti, hogy megfelelőek-e.</translation> <translation id="6181431612547969857">Letöltés letiltva</translation> -<translation id="6182100780603067202">Az alkalmazás hangja is legyen megosztva (az összes ablakából)</translation> <translation id="6183369864942961155">Automatikus világos/sötét téma</translation> <translation id="6183773856988300112">A Gemini a Chrome-ban az automatikus böngészés funkciót használja az Ön lapjain való munkavégzéshez és az Ön által adott feladatok elvégzéséhez. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation> <translation id="6184099524311454384">Keresés a lapokon</translation> @@ -8264,7 +8261,6 @@ <translation id="6754359471209693699">Új keresés indítása</translation> <translation id="6754918760968695779">Gyors beillesztés</translation> <translation id="6755702685749429945">Szótár hozzáadása</translation> -<translation id="6756157672127672536">A Fájlok alkalmazás gyors hozzáférést kínál a Google Drive-on, külső tárolón vagy a ChromeOS-eszközön elmentett fájlokhoz.</translation> <translation id="6756643207511618722">Beszédmotorok</translation> <translation id="6757431299485455321">Megkönnyítheti más eszközök számára ennek a hotspotnak a megtalálását.</translation> <translation id="6758056191028427665">Ossza meg velünk, mennyire van megelégedve munkánkkal.</translation> @@ -9211,6 +9207,7 @@ <translation id="7406912950279255498">Színinvertálás mód</translation> <translation id="7407430846095439694">Importálás és összekapcsolás</translation> <translation id="7407504355934009739">A legtöbb felhasználó letiltja az értesítéseket ezen a webhelyen</translation> +<translation id="7407578029724074226">A(z) <ph name="FILE_NAME" /> bizalmas adatokat tartalmaz. A szervezet lehetővé teszi, hogy felhőtárhelyre mentse, vagy elvesse őket.</translation> <translation id="7408080603962564527">Ez mások számára is látható lesz</translation> <translation id="740810853557944681">Nyomtatószerver hozzáadása</translation> <translation id="7409549334477097887">Extra nagy</translation> @@ -9263,6 +9260,7 @@ <translation id="7434969625063495310">Nem sikerült hozzáadni a nyomtatószervert. Ellenőrizze a szerver beállításait, majd próbálja újra.</translation> <translation id="7436921188514130341">Ajjaj! Hiba történt az átnevezés közben.</translation> <translation id="7439519621174723623">A folytatáshoz adja meg az eszköz nevét</translation> +<translation id="743982235360757672">Tartsa kéznél az AI módot böngészés közben</translation> <translation id="7441736532026945583">Válassza a „Csoport elrejtése” lehetőséget, ha szeretné eltávolítani a csoportot a lapsorról</translation> <translation id="7441736921018636843">A beállítás módosításához <ph name="BEGIN_LINK" />állítsa alaphelyzetbe a szinkronizálást<ph name="END_LINK" />, hogy eltávolíthassa összetett szinkronizálási jelszavát.</translation> <translation id="7441830548568730290">Más felhasználók</translation> @@ -10001,7 +9999,6 @@ <translation id="794676567536738329">Engedélyek megerősítése</translation> <translation id="7947962633355574091">Vide&ocím másolása</translation> <translation id="7947964080535614577">A webhelyek általában azért jelenítenek meg hirdetéseket, hogy díjmentesen kínálhassanak tartalmakat és szolgáltatásokat. Egyes webhelyekről azonban köztudott, hogy tolakodó vagy félrevezető hirdetéseket jelenítenek meg.</translation> -<translation id="7948239795436419268">Ne legyenek visszaállítva az ablakok</translation> <translation id="7948407723851303488">A(z) <ph name="DOMAIN_NAME" /> összes oldala</translation> <translation id="7950629216186736592">Ok: A Régi böngészők támogatása funkció csak a http://, a https:// és a file:// karakterlánccal kezdődő URL-eket támogatja.</translation> <translation id="7950814699499457511">Be • Ez a bővítmény nem tett közzé adatvédelmi gyakorlatokat például arra vonatkozóan, hogy hogyan gyűjti és használja fel az adatokat.</translation> @@ -11190,7 +11187,6 @@ <translation id="8751034568832412184">Iskolai</translation> <translation id="8751329102746373229">A rendszergazdától</translation> <translation id="8752451679755290210">Automatikus mozgás az elemek között</translation> -<translation id="8753948258138515839">A Fájlok alkalmazás gyors hozzáférést kínál a Google Drive-on, külső tárolón vagy a ChromeOS Flex-eszközön elmentett fájlokhoz.</translation> <translation id="8754200782896249056"><p>Ha a <ph name="PRODUCT_NAME" /> támogatott asztali környezetben fut, akkor a rendszer proxybeállításait használja. Most azonban vagy a rendszer nem támogatott, vagy gond volt a rendszerkonfiguráció elindításával.</p> <p>A konfigurálást azonban elvégezheti még a parancssoron keresztül is. Kérjük, a megjelölésről és környezeti változókról szóló további információért tekintse meg a következőt: <code>man <ph name="PRODUCT_BINARY_NAME" /></code></p></translation> @@ -11983,6 +11979,7 @@ <translation id="992778845837390402">Folyamatban van a Linux biztonsági mentése</translation> <translation id="994087375490600917">Oldalsó panelek</translation> <translation id="994289308992179865">&Ismétlés</translation> +<translation id="995420352808264005">Eszközregisztráció típusának kiválasztása</translation> <translation id="995755448277384931">IBAN hozzáadása</translation> <translation id="996250603853062861">Biztonságos kapcsolat létesítése...</translation> <translation id="997143476478634194">A webhelyek automatikusan ezt a beállítást követik, amikor felkeresi őket. A webhelyek általában akkor küldenek értesítéseket, ha rendkívüli hírekről vagy csevegőüzenetekről szeretnék tájékoztatni Önt.</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index a69bf052..7a40df5e 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -285,7 +285,6 @@ <translation id="117916940443676133">Անվտանգության բանալին պաշտպանված չէ PIN-ով: Մուտքի տվյալները կառավարելու համար նախ ստեղծեք PIN կոդ:</translation> <translation id="1179400851034021914">IBAN-ն անվավեր է</translation> <translation id="1179902906564467236">Հետևեք հեռախոսի էկրանին ցուցադրվող հրահանգներին կամ օգտագործեք «Տեսախցիկ» հավելվածը</translation> -<translation id="1180117276105724040">Պատուհանները վերականգնվում են ձեր նախորդ աշխատաշրջանից…</translation> <translation id="118057123461613219">Շատ մեծ տնտեսում</translation> <translation id="1181037720776840403">Ջնջել</translation> <translation id="1182876754474670069">home</translation> @@ -764,7 +763,6 @@ <translation id="151501797353681931">Safari-ից ներմուծված</translation> <translation id="1515163294334130951">Գործարկել</translation> <translation id="1517467582299994451">Կոդի միջոցով հեռարձակելու համար միացրեք Chrome դիտարկիչի համաժամացման կարգավորումները</translation> -<translation id="1519090060276706457">Պատուհանների վերականգնումը սովորականից երկար է տևում</translation> <translation id="1521442365706402292">Կառավարել վկայագրերը</translation> <translation id="1521655867290435174">Google Աղյուսակներ</translation> <translation id="1521774566618522728">Այսօր ակտիվ է եղել</translation> @@ -1177,7 +1175,6 @@ <translation id="1796460466266263589">Հաստատեք ձեր ինքնությունը, որպեսզի շարունակեք օգտվել Gemini-ից</translation> <translation id="1796588414813960292">Գործառույթները, որոնց համար պահանջվում է ձայն, չեն աշխատի</translation> <translation id="1798726622311813209">Վարկային և դեբետային քարտեր</translation> -<translation id="1799852120691957794">Հնարավոր չէ վերականգնել նախորդ աշխատաշրջանի պատուհանները</translation> <translation id="180203835522132923">Search + O, այնուհետև W</translation> <translation id="1802624026913571222">Անցնել քնի ռեժիմ, երբ պատյանի շապիկը փակ է</translation> <translation id="1802687198411089702">Էջը չի պատասխանում: Կարող եք սպասել կամ փակել այն:</translation> @@ -2368,7 +2365,6 @@ <translation id="2610374175948698697">Կարող են դիտել ձեր սարքում առկա ֆայլերը կամ պանակները</translation> <translation id="2610780100389066815">Վստահության ցուցակի ստորագրում (Microsoft)</translation> <translation id="261114180663074524">Մուտք գործեք ձեր Microsoft հաշիվ և նորից փորձեք</translation> -<translation id="2611702650078660078">Սխալ առաջացավ</translation> <translation id="2611776654555141051">«Ուղղանկյուն» գործիք</translation> <translation id="2611885296070244383">Ներկառուցված խոսափող</translation> <translation id="2612676031748830579">Քարտի համարը</translation> @@ -2732,7 +2728,6 @@ <translation id="285033512555869047">Փակ է</translation> <translation id="2850541429955027218">Ավելացնել թեմա</translation> <translation id="2851291081585704741">Դուք օֆլայն եք</translation> -<translation id="2852045827873867442">Ինտերնետ կապ է պահանջվում։</translation> <translation id="285237063405807022">(բեռնվում է)</translation> <translation id="2853121255651601031">Գաղտնաբառը պահվեց</translation> <translation id="2854453262159518435">Փոխարինել ներդիրների գոյություն ունեցող խումբը</translation> @@ -5486,7 +5481,6 @@ <translation id="4779766576531456629">Վերանվանել eSIM-ի բջջային ցանցը</translation> <translation id="4780321648949301421">Save Page As...</translation> <translation id="4780558987886269159">Աշխատանքի համար</translation> -<translation id="4781633367688946589">Սկսել նոր աշխատաշրջան</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" />-ը ցանկանում է օգտագործել ձեր թվային դրամապանակի անձնական տեղեկությունները։</translation> <translation id="4785719467058219317">Դուք օգտագործում եք անվտանգության բանալի, որը գրանցված չէ այս կայքում</translation> <translation id="4785914069240823137">Չեղարկել եզրատումը</translation> @@ -7458,7 +7452,6 @@ <translation id="6180550893222597997">Ո՞ր մուտքի բանալին եք ուզում օգտագործել <ph name="APP_NAME" /> հավելվածի համար</translation> <translation id="6181218116951226898">Հավելվածները երբեմն թարմացնում են իրենց բրենդային տարրերը։ Նախքան թարմացումը ստուգեք բոլոր փոփոխությունները՝ համոզվելու, որ ձեզ ամեն ինչ գոհացնում է։</translation> <translation id="6181431612547969857">Ներբեռնումն արգելափակված է</translation> -<translation id="6182100780603067202">Նաև փոխանցել հավելվածի աուդիոն (բոլոր պատուհաններից)</translation> <translation id="6183369864942961155">Բաց/մուգ թեմայի ավտոմատ միացում</translation> <translation id="6183773856988300112">Gemini-ը Chrome-ում օգտագործում է ավտոմատ դիտարկումը՝ ձեր ներդիրներում աշխատելու և ձեր հանձնարարած առաջադրանքները կատարելու համար։ <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Որոնեք ներդիրներ</translation> @@ -8253,7 +8246,6 @@ <translation id="6754359471209693699">Սկսել նոր որոնում</translation> <translation id="6754918760968695779">Արագ զետեղում</translation> <translation id="6755702685749429945">Ավելացնել բառարանում</translation> -<translation id="6756157672127672536">«Ֆայլեր» հավելվածի օգնությամբ դուք կարող եք արագ բացել ձեր ֆայլերը, որոնք պահել եք Google Drive-ում, արտաքին կրիչի վրա կամ ChromeOS սարքում։</translation> <translation id="6756643207511618722">Խոսքի սինթեզատորներ</translation> <translation id="6757431299485455321">Օգնել մյուս սարքերին գտնել այս թեժ կետը։</translation> <translation id="6758056191028427665">Կիսվեք մեզ հետ ձեր տպավորություններով:</translation> @@ -9992,7 +9984,6 @@ <translation id="794676567536738329">Թույլտվությունների հաստատում</translation> <translation id="7947962633355574091">Պատճենել տեսանյութի հասցեն</translation> <translation id="7947964080535614577">Կայքերը սովորաբար գովազդ են ցուցադրում, որպեսզի կարողանան անվճար բովանդակություն և ծառայություններ տրամադրել։ Սակայն որոշ կայքեր ցուցադրում են հոգնեցնող կամ մոլորեցնող գովազդ։</translation> -<translation id="7948239795436419268">Չվերականգնել պատուհանները</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" /> տիրույթի բոլոր էջերը</translation> <translation id="7950629216186736592">Պատճառը՝ LBS-ն աջակցում է միայն http://, https:// և file:// նախածանցներով սկսվող URL-ները։</translation> <translation id="7950814699499457511">Միացված է • Այս ընդլայնումը չի հրապարակել գաղտնիության քաղաքականություն, օրինակ՝ թե ինչպես է այն հավաքում և օգտագործում տվյալները</translation> @@ -11181,7 +11172,6 @@ <translation id="8751034568832412184">Ուսումնական</translation> <translation id="8751329102746373229">Ձեր ադմինիստրատորի կողմից</translation> <translation id="8752451679755290210">Ավտոմատ անցեք մեկ տարրից մյուսին</translation> -<translation id="8753948258138515839">«Ֆայլեր» հավելվածի օգնությամբ դուք կարող եք արագ բացել ձեր ֆայլերը, որոնք պահել եք Google Drive-ում, արտաքին կրիչի վրա կամ ChromeOS Flex սարքում։</translation> <translation id="8754200782896249056"><p><ph name="PRODUCT_NAME" />-ը աջակցվող աշխատասեղանի միջավայրում գործարկելիս՝ կօգտագործվեն պրոքսի-սերվերի համակարգի կարգավորումները: Սակայն, կամ ձեր համակարգը չի աջակցվում, կամ համակարգի կազմաձևումները չի հաջողվում գործարկել:</p> <p>Այնուամենայնիվ, դուք կարող եք կատարել կազմաձևումը հրամանատողի միջոցով: Դրոշների և միջավայրի փոփոխականների մասին լրացուցիչ տեղեկությունների համար ծանոթացեք <code>man <ph name="PRODUCT_BINARY_NAME" /></code> կոդին:</p></translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 5aa35b6b..9342756 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Tidak dapat mendownload file anotasi node utama. Coba lagi nanti.</translation> <translation id="1103523840287552314">Selalu terjemahkan <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Anda akan segera kehilangan akses ke grup tab ini, dan grup ini akan dihapus dari semua perangkat Anda</translation> +<translation id="1105934302947321130">Google Beam dengan Zoom</translation> <translation id="1106270460549661906">Berhenti berbagi dengan Gemini</translation> <translation id="1106350001632362876">Tingkatkan nilai minimum</translation> <translation id="110850812463801904">Hubungkan ke OneDrive secara manual</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Kunci keamanan Anda tidak dilindungi PIN. Untuk mengelola data login, buat PIN terlebih dahulu.</translation> <translation id="1179400851034021914">IBAN tidak valid</translation> <translation id="1179902906564467236">Ikuti petunjuk di ponsel atau gunakan aplikasi kamera</translation> -<translation id="1180117276105724040">Memulihkan jendela dari sesi sebelumnya...</translation> <translation id="118057123461613219">Penghematan super besar</translation> <translation id="1181037720776840403">Hapus</translation> <translation id="1182876754474670069">home</translation> @@ -762,7 +762,6 @@ <translation id="151501797353681931">Diimpor Dari Safari</translation> <translation id="1515163294334130951">Luncurkan</translation> <translation id="1517467582299994451">Untuk melakukan transmisidengan kode, aktifkan setelan sinkronisasi browser Chrome</translation> -<translation id="1519090060276706457">Pemulihan jendela memerlukan waktu lebih lama dari yang diperkirakan</translation> <translation id="1521442365706402292">Kelola sertifikat</translation> <translation id="1521655867290435174">Google Spreadsheet</translation> <translation id="1521774566618522728">Aktif hari ini</translation> @@ -1111,6 +1110,7 @@ <translation id="1745732479023874451">Kelola kontak</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{Buka dan edit # file di aplikasi web ini?}}</translation> <translation id="1748563609363301860">Anda dapat menyimpan sandi ini di Akun Google atau hanya di perangkat ini</translation> +<translation id="1749645492410897998">Menginstal software</translation> <translation id="1749733017156547309">Sandi wajib diisi</translation> <translation id="1750172676754093297">Kunci keamanan Anda tidak dapat menyimpan sidik jari</translation> <translation id="1750238553597293878">Tetap gunakan sandi yang tersimpan di Akun Google Anda</translation> @@ -1182,7 +1182,6 @@ <translation id="1796460466266263589">Untuk terus menggunakan Gemini, verifikasi diri Anda</translation> <translation id="1796588414813960292">Fitur yang memerlukan suara tidak akan berfungsi</translation> <translation id="1798726622311813209">Kartu kredit & debit</translation> -<translation id="1799852120691957794">Tidak dapat memulihkan jendela dari sesi sebelumnya</translation> <translation id="180203835522132923">Search + O, lalu W</translation> <translation id="1802624026913571222">Tidur saat cover ditutup</translation> <translation id="1802687198411089702">Halaman tidak merespons. Anda dapat menunggunya atau keluar.</translation> @@ -2378,7 +2377,6 @@ <translation id="2610374175948698697">Dapat melihat file atau folder di perangkat Anda</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">Login ke akun Microsoft, lalu coba lagi</translation> -<translation id="2611702650078660078">Terjadi error</translation> <translation id="2611776654555141051">Alat Kotak</translation> <translation id="2611885296070244383">Mikrofon (internal)</translation> <translation id="2612676031748830579">Nomor kartu</translation> @@ -2742,7 +2740,6 @@ <translation id="285033512555869047">Ditutup</translation> <translation id="2850541429955027218">Tambahkan tema</translation> <translation id="2851291081585704741">Anda offline</translation> -<translation id="2852045827873867442">Memerlukan koneksi internet.</translation> <translation id="285237063405807022">(memuat)</translation> <translation id="2853121255651601031">Sandi Sudah Disimpan</translation> <translation id="2854453262159518435">Ganti grup tab yang ada</translation> @@ -2910,7 +2907,7 @@ <translation id="2970982365449313350">Chrome dengan Akun Google ini</translation> <translation id="2972557485845626008">Firmware</translation> <translation id="2972581237482394796">&Ulang</translation> -<translation id="2973324205039581528">Bisukan Audio Situs</translation> +<translation id="2973324205039581528">Bisukan Situs</translation> <translation id="2975761176769946178">URL wajib diisi</translation> <translation id="2975845084271617886">Gabung dan Buka</translation> <translation id="2976547701881428815">Alat dan tindakan</translation> @@ -3609,6 +3606,7 @@ <translation id="3473241910002674503">Buka layar utama, kembali, dan alihkan aplikasi dengan tombol dalam mode tablet.</translation> <translation id="3473479545200714844">Kaca pembesar layar</translation> <translation id="3474218480460386727">Gunakan maksimal 99 huruf untuk kata baru</translation> +<translation id="3474330892505468100">Google Beam dengan Meet</translation> <translation id="3474624961160222204">Lanjutkan sebagai <ph name="NAME" /></translation> <translation id="3477772589943384839">Dapatkan penghematan memori sedang. Tab Anda menjadi tidak aktif setelah jangka waktu yang lebih lama.</translation> <translation id="347785443197175480">Terus izinkan <ph name="HOST" /> untuk mengakses kamera dan mikrofon Anda</translation> @@ -5497,7 +5495,6 @@ <translation id="4779766576531456629">Ganti nama jaringan Seluler eSIM</translation> <translation id="4780321648949301421">Simpan Halaman Sebagai...</translation> <translation id="4780558987886269159">Untuk bekerja</translation> -<translation id="4781633367688946589">Lanjutkan ke sesi baru</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> ingin menggunakan info pribadi dari dompet digital Anda.</translation> <translation id="4785719467058219317">Anda menggunakan kunci keamanan yang tidak terdaftar di situs ini</translation> <translation id="4785914069240823137">Batalkan Pemangkasan</translation> @@ -6286,6 +6283,7 @@ <translation id="5337926771328966926">Nama perangkat saat ini adalah <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Anda dapat melakukan penjelajahan rahasia menggunakan jendela Samaran</translation> <translation id="5338503421962489998">Penyimpanan lokal</translation> +<translation id="5340620183031438925">Untuk bertanya kepada Mode AI tentang tab Anda tanpa keluar dari halaman, verifikasi diri Anda. Anda juga akan mendapatkan sandi dan info Anda yang lain di semua perangkat Anda.</translation> <translation id="5340787663756381836">&Cari dan edit</translation> <translation id="5340900621595888432">Kirim data penggunaan dan diagnostik</translation> <translation id="5341793073192892252">Cookie berikut diblokir (cookie pihak ketiga sedang diblokir tanpa pengecualian)</translation> @@ -7472,7 +7470,6 @@ <translation id="6180550893222597997">Kunci sandi mana yang ingin Anda gunakan untuk <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Aplikasi terkadang memperbarui brandingnya. Tinjau semua perubahan untuk memastikan Anda tidak merasa keberatan dengan perubahan tersebut sebelum melakukan perubahan.</translation> <translation id="6181431612547969857">Download diblokir</translation> -<translation id="6182100780603067202">Bagikan juga audio aplikasi (dari semua jendelanya)</translation> <translation id="6183369864942961155">Tema terang/gelap otomatis</translation> <translation id="6183773856988300112">Gemini di Chrome menggunakan penjelajahan otomatis untuk bekerja di tab Anda dan menyelesaikan tugas yang Anda berikan. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Telusuri Tab</translation> @@ -8265,7 +8262,6 @@ <translation id="6754359471209693699">Mulai penelusuran baru</translation> <translation id="6754918760968695779">Penyisipan Cepat</translation> <translation id="6755702685749429945">Tambahkan kamus</translation> -<translation id="6756157672127672536">Aplikasi File memberikan akses cepat ke file yang telah Anda simpan di Google Drive, penyimpanan eksternal, atau perangkat ChromeOS.</translation> <translation id="6756643207511618722">Mesin ucapan</translation> <translation id="6757431299485455321">Bantu perangkat lain menemukan hotspot ini.</translation> <translation id="6758056191028427665">Berikan masukan Anda tentang kinerja kami.</translation> @@ -9212,6 +9208,7 @@ <translation id="7406912950279255498">Mode inversi warna</translation> <translation id="7407430846095439694">Impor dan Kaitkan</translation> <translation id="7407504355934009739">Sebagian besar orang memblokir notifikasi dari situs ini</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> berisi data sensitif. Organisasi Anda akan mengizinkan Anda menyimpannya ke penyimpanan cloud atau menghapusnya</translation> <translation id="7408080603962564527">Nama ini akan terlihat oleh orang lain</translation> <translation id="740810853557944681">Tambahkan server cetak</translation> <translation id="7409549334477097887">Sangat besar</translation> @@ -9264,6 +9261,7 @@ <translation id="7434969625063495310">Tidak dapat menambahkan server cetak. Harap periksa konfigurasi server dan coba lagi.</translation> <translation id="7436921188514130341">Maaf. Terjadi error saat mengganti nama.</translation> <translation id="7439519621174723623">Tambahkan nama perangkat untuk melanjutkan</translation> +<translation id="743982235360757672">Jaga Mode AI tetap di sekitar saat Anda menjelajah</translation> <translation id="7441736532026945583">Pilih "Sembunyikan Grup" untuk menghapus grup dari tab setrip</translation> <translation id="7441736921018636843">Untuk mengubah setelan ini, <ph name="BEGIN_LINK" />reset sinkronisasi<ph name="END_LINK" /> untuk menghapus frasa sandi sinkronisasi</translation> <translation id="7441830548568730290">Pengguna lain</translation> @@ -10002,7 +10000,6 @@ <translation id="794676567536738329">Konfirmasi Izin</translation> <translation id="7947962633355574091">S&alin Alamat Video</translation> <translation id="7947964080535614577">Situs biasanya menampilkan iklan agar dapat menyediakan konten atau layanan tanpa biaya. Namun, beberapa situs dikenal menampilkan iklan yang mengganggu atau menyesatkan.</translation> -<translation id="7948239795436419268">Jangan pulihkan jendela</translation> <translation id="7948407723851303488">Semua halaman dari <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Alasan: LBS hanya mendukung URL http://, https://, dan file://.</translation> <translation id="7950814699499457511">Aktif • Ekstensi ini belum memublikasikan praktik privasi, seperti cara ekstensi mengumpulkan dan menggunakan data</translation> @@ -11191,7 +11188,6 @@ <translation id="8751034568832412184">Sekolah</translation> <translation id="8751329102746373229">Dari administrator Anda</translation> <translation id="8752451679755290210">Berpindah-pindah item secara otomatis</translation> -<translation id="8753948258138515839">Aplikasi File memberikan akses cepat ke file yang telah Anda simpan di Google Drive, penyimpanan eksternal, atau perangkat ChromeOS Flex.</translation> <translation id="8754200782896249056"><p>Saat mengoperasikan <ph name="PRODUCT_NAME" /> pada lingkungan desktop yang didukung, setelan proxy sistem akan digunakan. Akan tetapi, tampaknya kami tidak dapat mendukung sistem Anda atau mungkin ada masalah saat meluncurkan konfigurasi sistem.</p> <p>Namun demikian, Anda tetap dapat mengonfigurasi setelan melalui baris perintah. Lihat <code>man <ph name="PRODUCT_BINARY_NAME" /></code> untuk informasi selengkapnya mengenai tanda dan variabel lingkungan.</p></translation> @@ -11984,6 +11980,7 @@ <translation id="992778845837390402">Backup Linux saat ini sedang berlangsung</translation> <translation id="994087375490600917">Panel samping</translation> <translation id="994289308992179865">&Putaran</translation> +<translation id="995420352808264005">Pilih jenis pendaftaran perangkat</translation> <translation id="995755448277384931">Tambahkan IBAN</translation> <translation id="996250603853062861">Membuat koneksi aman...</translation> <translation id="997143476478634194">Situs akan otomatis mengikuti setelan ini saat Anda membukanya. Situs biasanya mengirim notifikasi untuk memberi tahu Anda tentang berita terbaru atau pesan chat.</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index 31b71f9..21ea44d 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Ekki tókst að sækja textaskýringarskrár aðalhnúts. Reyndu aftur síðar.</translation> <translation id="1103523840287552314">Þýða alltaf <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Þú munt umsvifalaust missa aðgang að þessum flipahópi og honum verður eytt úr öllum tækjunum þínum</translation> +<translation id="1105934302947321130">Google Beam með Zoom</translation> <translation id="1106270460549661906">Hætta að deila með Gemini</translation> <translation id="1106350001632362876">Hækka mörk</translation> <translation id="110850812463801904">Tengjast sjálfkrafa við OneDrive</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Öryggislykillinn þinn er ekki varinn með PIN-númeri. Til að stjórna innskráningargögnum þarftu fyrst að búa til PIN-númer.</translation> <translation id="1179400851034021914">IBAN er ógilt</translation> <translation id="1179902906564467236">Fylgdu leiðbeiningunum í símanum eða notaðu myndavélarforritið</translation> -<translation id="1180117276105724040">Endurheimtir glugga úr fyrri lotu...</translation> <translation id="118057123461613219">Mjög mikill sparnaður</translation> <translation id="1181037720776840403">Fjarlægja</translation> <translation id="1182876754474670069">heim</translation> @@ -763,7 +763,6 @@ <translation id="151501797353681931">Flutt inn úr Safari</translation> <translation id="1515163294334130951">Ræsa</translation> <translation id="1517467582299994451">Til að senda út með kóða skaltu kveikja á samstillingarkostum Chrome vafra</translation> -<translation id="1519090060276706457">Það tekur lengri tíma en búist var við að endurheimta glugga</translation> <translation id="1521442365706402292">Stjórna vottorðum</translation> <translation id="1521655867290435174">Google töflureiknar</translation> <translation id="1521774566618522728">Virkt í dag</translation> @@ -1112,6 +1111,7 @@ <translation id="1745732479023874451">Stjórna tengiliðum</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}one{Opna og breyta # skrá í þessu vefforriti?}other{Opna og breyta # skrám í þessu vefforriti?}}</translation> <translation id="1748563609363301860">Þú getur vistað þetta aðgangsorð á Google reikningnum þínum eða eingöngu í þessu tæki</translation> +<translation id="1749645492410897998">Setur upp hugbúnað</translation> <translation id="1749733017156547309">Aðgangsorðs er krafist</translation> <translation id="1750172676754093297">Öryggislykillinn þinn getur ekki vistað fingraför</translation> <translation id="1750238553597293878">Haltu áfram að nota aðgangsorðin á Google-reikningnum þínum</translation> @@ -1183,7 +1183,6 @@ <translation id="1796460466266263589">Staðfestu að þetta sért þú til að halda áfram að nota Gemini</translation> <translation id="1796588414813960292">Eiginleikar sem þarfnast hljóðs munu ekki virka</translation> <translation id="1798726622311813209">Kredit- og debetkort</translation> -<translation id="1799852120691957794">Ekki tókst að endurheimta glugga úr fyrri lotu</translation> <translation id="180203835522132923">Leita + O og svo W</translation> <translation id="1802624026913571222">Svefn þegar hulstrið er lokað</translation> <translation id="1802687198411089702">Síðan svarar ekki. Þú getur beðið eftir henni eða hætt.</translation> @@ -2380,7 +2379,6 @@ <translation id="2610374175948698697">Mega skoðað skrár eða möppur í tækinu</translation> <translation id="2610780100389066815">Undirritun Microsoft-traustlista</translation> <translation id="261114180663074524">Skráðu þig inn á Microsoft-reikninginn þinn og reyndu síðan aftur</translation> -<translation id="2611702650078660078">Villa kom upp</translation> <translation id="2611776654555141051">Rétthyrningsverkfæri</translation> <translation id="2611885296070244383">Hljóðnemi (innbyggður)</translation> <translation id="2612676031748830579">Kortanúmer</translation> @@ -2744,7 +2742,6 @@ <translation id="285033512555869047">Lokað</translation> <translation id="2850541429955027218">Bæta þema við</translation> <translation id="2851291081585704741">Þú ert ekki á netinu</translation> -<translation id="2852045827873867442">Nettengingar er krafist.</translation> <translation id="285237063405807022">(hleður)</translation> <translation id="2853121255651601031">Aðgangsorð vistað</translation> <translation id="2854453262159518435">Skipta fyrirliggjandi flipahópi út</translation> @@ -3611,6 +3608,7 @@ <translation id="3473241910002674503">Fara heim og til baka og skipta um forrit með hnöppum í spjaldtölvustillingu.</translation> <translation id="3473479545200714844">Skjástækkun</translation> <translation id="3474218480460386727">Notaðu 99 stafi eða færri fyrir ný orð</translation> +<translation id="3474330892505468100">Google Beam með Meet</translation> <translation id="3474624961160222204">Halda áfram sem <ph name="NAME" /></translation> <translation id="3477772589943384839">Fáðu minnissparnað í meðallagi. Fliparnir þínir verða óvirkir eftir lengri tíma.</translation> <translation id="347785443197175480">Halda áfram að veita <ph name="HOST" /> aðgang að myndavélinni og hljóðnemanum</translation> @@ -5499,7 +5497,6 @@ <translation id="4779766576531456629">Endurnefna eSIM-farsímakerfi</translation> <translation id="4780321648949301421">Vista síðu sem...</translation> <translation id="4780558987886269159">Fyrir vinnuna</translation> -<translation id="4781633367688946589">Halda áfram í næstu lotu</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> biður um að fá að nota persónuupplýsingar úr stafræna veskinu þínu.</translation> <translation id="4785719467058219317">Þú ert að nota öryggislykil sem er ekki skráður hjá þessu vefsvæði</translation> <translation id="4785914069240823137">Hætta við að skera</translation> @@ -6288,6 +6285,7 @@ <translation id="5337926771328966926">Núverandi heiti tækis er <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Þú getur vafrað í leyni með því að nota huliðsglugga</translation> <translation id="5338503421962489998">Staðbundin vistun</translation> +<translation id="5340620183031438925">Til að spyrja gervigreindarstillingu um flipann þinn án þess að yfirgefa síðuna skaltu staðfesta að þetta sért þú. Þú færð einnig aðgangsorðin þín og fleira í öllum tækjunum þínum.</translation> <translation id="5340787663756381836">&Finna og breyta</translation> <translation id="5340900621595888432">Senda notkunar- og greiningargögn</translation> <translation id="5341793073192892252">Eftirfarandi fótspor voru útilokuð (fótspor þriðja aðila eru útilokuð án undantekninga)</translation> @@ -7474,7 +7472,6 @@ <translation id="6180550893222597997">Hvaða aðgangslykil viltu nota fyrir <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Forrit uppfæra stundum mörkun sína. Farðu yfir allar breytingar til að tryggja að þú sért sátt(ur) við þær áður en þú uppfærir.</translation> <translation id="6181431612547969857">Niðurhal útilokað</translation> -<translation id="6182100780603067202">Einnig deila hljóði úr forritinu (úr öllum gluggum þess)</translation> <translation id="6183369864942961155">Sjálfvirkt ljóst/dökkt þema</translation> <translation id="6183773856988300112">Gemini í Chrome notar sjálfvirka skoðun til að vinna í flipunum þínum og ljúka verkefnum sem þú gefur því. <ph name="LINK_BEGIN" />Nánar<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Leita í flipum</translation> @@ -8269,7 +8266,6 @@ <translation id="6754359471209693699">Hefja nýja leit</translation> <translation id="6754918760968695779">Flýtiinnsláttur</translation> <translation id="6755702685749429945">Bæta orðabók við</translation> -<translation id="6756157672127672536">Forritið Skrár býður upp á skjótan aðgang að skrám sem þú hefur vistað á Google Drive, í ytri geymslu eða á ChromeOS tæki.</translation> <translation id="6756643207511618722">Talgervlar</translation> <translation id="6757431299485455321">Hjálpaðu öðrum tækjum að finna þennan heita reit.</translation> <translation id="6758056191028427665">Láttu okkur vita hvernig við stöndum okkur.</translation> @@ -9215,6 +9211,7 @@ <translation id="7406912950279255498">Umsnúningur lita</translation> <translation id="7407430846095439694">Flytja inn og binda</translation> <translation id="7407504355934009739">Flestir notendur loka á tilkynningar frá þessu vefsvæði</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> inniheldur viðkvæmar upplýsingar. Fyrirtækið þitt mun leyfa þér að vista það í skýjageymslu eða farga því</translation> <translation id="7408080603962564527">Aðrir geta séð þetta</translation> <translation id="740810853557944681">Bæta við prentþjóni</translation> <translation id="7409549334477097887">Mjög há</translation> @@ -9268,6 +9265,7 @@ <translation id="7434969625063495310">Ekki var hægt að bæta við prentþjóni. Athugaðu stillingar þjónsins og reyndu aftur.</translation> <translation id="7436921188514130341">Úbbs! Villa kom upp við að breyta heiti.</translation> <translation id="7439519621174723623">Bættu við heiti tækis til að halda áfram</translation> +<translation id="743982235360757672">Hafðu gervigreindarstillingu nálægt þegar þú vafrar</translation> <translation id="7441736532026945583">Veldu „Fela hóp“ til að fjarlægja hópinn af fliparæmunni</translation> <translation id="7441736921018636843">Til að breyta þessari stillingu skaltu <ph name="BEGIN_LINK" />endurstilla samstillingu<ph name="END_LINK" /> til að fjarlægja aðgangsorð samstillingar</translation> <translation id="7441830548568730290">Aðrir notendur</translation> @@ -10006,7 +10004,6 @@ <translation id="794676567536738329">Staðfestu heimildir</translation> <translation id="7947962633355574091">A&frita slóð myndskeiðs</translation> <translation id="7947964080535614577">Yfirleitt birta vefsvæði auglýsingar til að geta boðið upp á gjaldfrjálst efni eða þjónustur. Sum vefsvæði eru hins vegar þekkt fyrir að birta ágengar eða villandi auglýsingar.</translation> -<translation id="7948239795436419268">Ekki endurheimta glugga</translation> <translation id="7948407723851303488">Allar síður <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Ástæða: Stuðningur við eldri vafra styður eingöngu vefslóðirnar http://, https:// og file://.</translation> <translation id="7950814699499457511">Kveikt • Þessi viðbót hefur ekki gefið út vinnureglur um persónuvernd, svo sem hvernig hún safnar og notar gögn</translation> @@ -11195,7 +11192,6 @@ <translation id="8751034568832412184">Skóli</translation> <translation id="8751329102746373229">Frá kerfisstjóra</translation> <translation id="8752451679755290210">Flettu sjálfkrafa á milli atriða</translation> -<translation id="8753948258138515839">Forritið Skrár býður upp á skjótan aðgang að skrám sem þú hefur vistað á Google Drive, í ytri geymslu eða á ChromeOS Flex tæki.</translation> <translation id="8754200782896249056"><p>Þegar <ph name="PRODUCT_NAME" /> er keyrt á studdu tölvukerfi verða proxy-stillingar kerfisins notaðar. Hins vegar er kerfið þitt annaðhvort ekki stutt eða vandamál kom upp við að ræsa kerfisstillingarnar.</p> <p>Þú getur samt sem áður grunnstillt með skipanalínunni. Skoðaðu <code>man <ph name="PRODUCT_BINARY_NAME" /></code> til að fá frekari upplýsingar um flögg og umhverfisbreytur.</p></translation> @@ -11989,6 +11985,7 @@ <translation id="992778845837390402">Endurheimt Linux stendur yfir</translation> <translation id="994087375490600917">Hliðargluggar</translation> <translation id="994289308992179865">&Lykkja</translation> +<translation id="995420352808264005">Veldu tegund skráningar tækis</translation> <translation id="995755448277384931">Bæta við IBAN</translation> <translation id="996250603853062861">Kemur á öruggri tengingu...</translation> <translation id="997143476478634194">Síður fylgja þessari stillingu sjálfkrafa þegar þú opnar þær. Vefsvæði senda yfirleitt tilkynningar til að láta þig vita af nýjustu fréttum eða spjallskilaboðum.</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 99c814c..f062a33 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Impossibile scaricare i file di annotazioni del nodo principale. Riprova più tardi.</translation> <translation id="1103523840287552314">Traduci sempre <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Perderai immediatamente l'accesso a questo gruppo di schede, che verrà eliminato da tutti i tuoi dispositivi</translation> +<translation id="1105934302947321130">Google Beam con Zoom</translation> <translation id="1106270460549661906">Annulla condivisione con Gemini</translation> <translation id="1106350001632362876">Aumenta soglia</translation> <translation id="110850812463801904">Connettiti manualmente a OneDrive</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Il token di sicurezza non è protetto tramite PIN. Per poter gestire i dati di accesso devi creare un PIN.</translation> <translation id="1179400851034021914">L'IBAN non è valido</translation> <translation id="1179902906564467236">Segui le istruzioni sullo smartphone oppure usa l'app Fotocamera</translation> -<translation id="1180117276105724040">Ripristino delle finestre dalla sessione precedente in corso…</translation> <translation id="118057123461613219">Enormi risparmi</translation> <translation id="1181037720776840403">Rimuovi</translation> <translation id="1182876754474670069">home</translation> @@ -761,7 +761,6 @@ <translation id="151501797353681931">Importati da Safari</translation> <translation id="1515163294334130951">Avvia</translation> <translation id="1517467582299994451">Per trasmettere con un codice, attiva le impostazioni di sincronizzazione del browser Chrome</translation> -<translation id="1519090060276706457">Il ripristino delle finestre sta richiedendo più tempo del previsto</translation> <translation id="1521442365706402292">Gestisci certificati</translation> <translation id="1521655867290435174">Fogli Google</translation> <translation id="1521774566618522728">Attivo oggi</translation> @@ -1102,6 +1101,7 @@ <translation id="1745732479023874451">Gestisci contatti</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{Aprire e modificare # file in questa app web?}}</translation> <translation id="1748563609363301860">Puoi salvare questa password nel tuo Account Google o solo su questo dispositivo</translation> +<translation id="1749645492410897998">Installazione del software in corso…</translation> <translation id="1749733017156547309">È necessaria una password.</translation> <translation id="1750172676754093297">Questo token di sicurezza non supporta la memorizzazione di impronte</translation> <translation id="1750238553597293878">Continua a usare le password nel tuo Account Google</translation> @@ -1173,7 +1173,6 @@ <translation id="1796460466266263589">Verifica la tua identità per continuare a usare Gemini</translation> <translation id="1796588414813960292">Le funzionalità che richiedono l'audio non funzioneranno</translation> <translation id="1798726622311813209">Carte di credito e di debito</translation> -<translation id="1799852120691957794">Impossibile ripristinare le finestre della sessione precedente</translation> <translation id="180203835522132923">Tasto per la ricerca + O, poi W</translation> <translation id="1802624026913571222">Sospendi alla chiusura dello schermo</translation> <translation id="1802687198411089702">La pagina non risponde. Puoi aspettare oppure chiuderla.</translation> @@ -2365,7 +2364,6 @@ <translation id="2610374175948698697">Possono visualizzare file o cartelle sul dispositivo</translation> <translation id="2610780100389066815">Elenco firme attendibili Microsoft</translation> <translation id="261114180663074524">Accedi al tuo account Microsoft e riprova</translation> -<translation id="2611702650078660078">Si è verificato un errore</translation> <translation id="2611776654555141051">Strumento Rettangolo</translation> <translation id="2611885296070244383">Microfono (interno)</translation> <translation id="2612676031748830579">Numero carta</translation> @@ -2729,7 +2727,6 @@ <translation id="285033512555869047">Chiuso</translation> <translation id="2850541429955027218">Aggiungi tema</translation> <translation id="2851291081585704741">Sei offline</translation> -<translation id="2852045827873867442">È necessaria una connessione a internet.</translation> <translation id="285237063405807022">(caricamento)</translation> <translation id="2853121255651601031">Password salvata</translation> <translation id="2854453262159518435">Sostituisci il gruppo di schede esistente</translation> @@ -3596,6 +3593,7 @@ <translation id="3473241910002674503">Torna alla schermata Home, vai indietro e cambia app usando i pulsanti in modalità tablet.</translation> <translation id="3473479545200714844">Ingrandimento dello schermo</translation> <translation id="3474218480460386727">Usa al massimo 99 lettere per le nuove parole</translation> +<translation id="3474330892505468100">Google Beam con Meet</translation> <translation id="3474624961160222204">Continua come <ph name="NAME" /></translation> <translation id="3477772589943384839">Risparmio di memoria moderato. Le schede diventano inattive dopo un periodo di tempo più lungo.</translation> <translation id="347785443197175480">Continua a consentire l'accesso di <ph name="HOST" /> alla webcam e al microfono</translation> @@ -5484,7 +5482,6 @@ <translation id="4779766576531456629">Rinomina rete mobile eSIM</translation> <translation id="4780321648949301421">Salva pagina come...</translation> <translation id="4780558987886269159">Per il lavoro</translation> -<translation id="4781633367688946589">Continua alla nuova sessione</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> vuole usare le informazioni personali del tuo portafoglio digitale.</translation> <translation id="4785719467058219317">Stai usando un token di sicurezza non registrato su questo sito web</translation> <translation id="4785914069240823137">Annulla ritaglio</translation> @@ -6272,6 +6269,7 @@ <translation id="5337926771328966926">Il nome attuale del dispositivo è <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Puoi navigare in privato usando una finestra Incognito</translation> <translation id="5338503421962489998">Archiviazione locale</translation> +<translation id="5340620183031438925">Per chiedere in AI Mode informazioni sulla tua scheda senza uscire dalla pagina, verifica la tua identità. Potrai anche usare le password e altri dati su tutti i tuoi dispositivi.</translation> <translation id="5340787663756381836">&Trova e modifica</translation> <translation id="5340900621595888432">Invia dati diagnostici e sull'utilizzo</translation> <translation id="5341793073192892252">I seguenti cookie sono stati bloccati (i cookie di terze parti vengono bloccati senza eccezioni)</translation> @@ -7455,7 +7453,6 @@ <translation id="6180550893222597997">Quale passkey vuoi utilizzare per <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">A volte le app aggiornano il proprio branding. Esamina tutte le modifiche per assicurarti che siano di tuo gradimento prima di aggiornare.</translation> <translation id="6181431612547969857">Download bloccato</translation> -<translation id="6182100780603067202">Condividi anche l'audio dell'applicazione (da tutte le sue finestre)</translation> <translation id="6183369864942961155">Tema scuro/chiaro automatico</translation> <translation id="6183773856988300112">Gemini in Chrome utilizza la navigazione automatica per lavorare nelle tue schede e completare le attività che gli assegni. <ph name="LINK_BEGIN" />Scopri di più<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Cerca tra le schede</translation> @@ -8248,7 +8245,6 @@ <translation id="6754359471209693699">Inizia una nuova ricerca</translation> <translation id="6754918760968695779">Inserimento rapido</translation> <translation id="6755702685749429945">Aggiungi dizionario</translation> -<translation id="6756157672127672536">L'app File consente di accedere rapidamente ai file salvati su Google Drive, nell'unità di archiviazione esterna o sul tuo dispositivo ChromeOS.</translation> <translation id="6756643207511618722">Motori di riconoscimento vocale</translation> <translation id="6757431299485455321">Aiuta altri dispositivi a trovare questo hotspot.</translation> <translation id="6758056191028427665">Comunicaci la tua opinione sul nostro lavoro.</translation> @@ -9195,6 +9191,7 @@ <translation id="7406912950279255498">Modalità inversione dei colori</translation> <translation id="7407430846095439694">Importa e associa</translation> <translation id="7407504355934009739">La maggior parte degli utenti blocca le notifiche da questo sito</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> contiene dati sensibili. La tua organizzazione ti consentirà di salvarlo nello spazio di archiviazione sul cloud o di eliminarlo</translation> <translation id="7408080603962564527">Sarà visibile ad altri</translation> <translation id="740810853557944681">Aggiungi un server di stampa</translation> <translation id="7409549334477097887">Molto alta</translation> @@ -9248,6 +9245,7 @@ <translation id="7434969625063495310">Impossibile aggiungere il server di stampa. Controlla la configurazione del server e riprova.</translation> <translation id="7436921188514130341">Uffa! Si è verificato un errore durante la ridenominazione.</translation> <translation id="7439519621174723623">Per continuare, aggiungi un nome per il dispositivo</translation> +<translation id="743982235360757672">Mantieni l'AI Mode a portata di mano mentre navighi</translation> <translation id="7441736532026945583">Seleziona "Nascondi gruppo" per rimuovere il gruppo dalla tabstrip</translation> <translation id="7441736921018636843">Per modificare questa impostazione, <ph name="BEGIN_LINK" />reimposta la sincronizzazione<ph name="END_LINK" /> per rimuovere la passphrase di sincronizzazione.</translation> <translation id="7441830548568730290">Altri utenti</translation> @@ -9986,7 +9984,6 @@ <translation id="794676567536738329">Conferma autorizzazioni</translation> <translation id="7947962633355574091">C&opia l'indirizzo del video</translation> <translation id="7947964080535614577">In genere, i siti mostrano annunci per fornire contenuti o servizi senza costi aggiuntivi. Tuttavia, alcuni siti sono noti per mostrare annunci invasivi o fuorvianti.</translation> -<translation id="7948239795436419268">Non ripristinare le finestre</translation> <translation id="7948407723851303488">Tutte le pagine di <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Motivo: LBS supporta solo URL http://, https:// e file://.</translation> <translation id="7950814699499457511">On • Per questa estensione non sono state pubblicate Norme di tutela della privacy, ad esempio la modalità di raccolta e utilizzo dei dati</translation> @@ -11175,7 +11172,6 @@ <translation id="8751034568832412184">Scuola</translation> <translation id="8751329102746373229">Dal tuo amministratore</translation> <translation id="8752451679755290210">Passa automaticamente da un elemento all'altro</translation> -<translation id="8753948258138515839">L'app File consente di accedere rapidamente ai file salvati su Google Drive, nell'unità di archiviazione esterna o sul tuo dispositivo ChromeOS Flex.</translation> <translation id="8754200782896249056"><p>Quando esegui <ph name="PRODUCT_NAME" /> in un ambiente desktop supportato, vengono utilizzate le impostazioni proxy del sistema. Tuttavia, il tuo sistema non è supportato o si è verificato un problema durante l'avvio della tua configurazione di sistema.</p> <p>Puoi comunque eseguire la configurazione tramite la riga di comando. Consulta <code>man <ph name="PRODUCT_BINARY_NAME" /></code> per avere ulteriori informazioni su contrassegni e variabili di ambiente.</p></translation> @@ -11968,6 +11964,7 @@ <translation id="992778845837390402">È in corso il backup di Linux</translation> <translation id="994087375490600917">Riquadri laterali</translation> <translation id="994289308992179865">&Ripeti</translation> +<translation id="995420352808264005">Scegli il tipo di registrazione dei dispositivi</translation> <translation id="995755448277384931">Aggiungi IBAN</translation> <translation id="996250603853062861">Creazione di una connessione protetta in corso...</translation> <translation id="997143476478634194">I siti seguiranno automaticamente questa impostazione quando li visiti. In genere, i siti inviano delle notifiche per comunicarti le ultime notizie o se hai ricevuto nuovi messaggi di chat.</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index c42ea6d..3b9be016 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">אי אפשר להוריד את קובצי הרישומים של הצומת הראשי. אפשר לנסות שוב מאוחר יותר.</translation> <translation id="1103523840287552314">ברצוני לקבל תרגום מ<ph name="LANGUAGE" /> תמיד</translation> <translation id="1104098698795583187">הגישה שלך לקבוצת הכרטיסיות הזו תאבד באופן מיידי, והיא תימחק מכל המכשירים שלך</translation> +<translation id="1105934302947321130">Google Beam עם Zoom</translation> <translation id="1106270460549661906">ביטול השיתוף עם Gemini</translation> <translation id="1106350001632362876">הגדלת הסף</translation> <translation id="110850812463801904">התחברות ידנית ל-OneDrive</translation> @@ -265,7 +266,7 @@ <translation id="1173036203040243666">הכרטיסייה הזו מחוברת למכשיר Bluetooth</translation> <translation id="1173332155861271669">פרטי הספק של Passpoint</translation> <translation id="1173894706177603556">שינוי שם</translation> -<translation id="1174073918202301297">קיצור הדרך נוסף</translation> +<translation id="1174073918202301297">קיצור הדרך התווסף</translation> <translation id="1174366174291287894">החיבור שלך תמיד מאובטח, אלא אם תתקבל הודעה שונה מ-Chrome</translation> <translation id="1175131936083782305">התכונה הזו הושבתה על ידי האדמין.</translation> <translation id="1175277108283187866">אפשר לבקר באתר או להתחיל חיפוש בסרגל הכתובות</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">מפתח האבטחה שלך אינו מוגן באמצעות קוד אימות. כדי לנהל את פרטי הכניסה, צריך תחילה ליצור קוד אימות.</translation> <translation id="1179400851034021914">מספר ה-IBAN לא תקין</translation> <translation id="1179902906564467236">צריך לפעול לפי ההוראות בטלפון או להשתמש באפליקציית המצלמה</translation> -<translation id="1180117276105724040">מתבצע שחזור של חלונות מהסשן הקודם…</translation> <translation id="118057123461613219">חיסכון של נפח גדול מאוד</translation> <translation id="1181037720776840403">הסרה</translation> <translation id="1182876754474670069">מקש Home</translation> @@ -761,7 +761,6 @@ <translation id="151501797353681931">יובא מ-Safari</translation> <translation id="1515163294334130951">הפעלה</translation> <translation id="1517467582299994451">כדי להתשמש בקוד לצורך הפעלת Cast, צריך להפעיל את הגדרות הסנכרון של דפדפן Chrome</translation> -<translation id="1519090060276706457">שחזור החלונות נמשך יותר זמן מהצפוי</translation> <translation id="1521442365706402292">ניהול אישורים</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">סנכרון אחרון: היום</translation> @@ -1110,6 +1109,7 @@ <translation id="1745732479023874451">ניהול אנשי קשר</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}one{לפתוח ולערוך # קבצים באפליקציית האינטרנט הזו?}two{לפתוח ולערוך # קבצים באפליקציית האינטרנט הזו?}other{לפתוח ולערוך # קבצים באפליקציית האינטרנט הזו?}}</translation> <translation id="1748563609363301860">אפשר לשמור את הסיסמה הזו בחשבון Google או רק במכשיר</translation> +<translation id="1749645492410897998">התוכנה בתהליך התקנה</translation> <translation id="1749733017156547309">נדרשת סיסמה</translation> <translation id="1750172676754093297">אי אפשר לשמור טביעות אצבעות במפתח האבטחה שלך</translation> <translation id="1750238553597293878">המשך השימוש בסיסמאות בחשבון Google שלך</translation> @@ -1181,7 +1181,6 @@ <translation id="1796460466266263589">כדי להמשיך להשתמש ב-Gemini, צריך לאמת את הזהות</translation> <translation id="1796588414813960292">תכונות שצריכות צלילים לא יפעלו</translation> <translation id="1798726622311813209">כרטיסי אשראי וכרטיסי חיוב מיידי</translation> -<translation id="1799852120691957794">אי אפשר לשחזר חלונות מהסשן הקודם</translation> <translation id="180203835522132923">מקש החיפוש + O, ואז W</translation> <translation id="1802624026913571222">מעבר למצב שינה כשסוגרים את המכסה</translation> <translation id="1802687198411089702">הדף לא מגיב. אפשר לחכות או לצאת.</translation> @@ -2377,7 +2376,6 @@ <translation id="2610374175948698697">ניתן להציג קבצים או תיקיות במכשיר</translation> <translation id="2610780100389066815">חתימת רשימת יחסי אמון של Microsoft</translation> <translation id="261114180663074524">צריך להיכנס לחשבון Microsoft ולנסות שוב</translation> -<translation id="2611702650078660078">קרתה שגיאה</translation> <translation id="2611776654555141051">כלי המלבן</translation> <translation id="2611885296070244383">מיקרופון (פנימי)</translation> <translation id="2612676031748830579">מספר הכרטיס</translation> @@ -2741,7 +2739,6 @@ <translation id="285033512555869047">סגורה</translation> <translation id="2850541429955027218">הוספת העיצוב</translation> <translation id="2851291081585704741">אין חיבור לאינטרנט</translation> -<translation id="2852045827873867442">צריך חיבור לאינטרנט.</translation> <translation id="285237063405807022">(בטעינה)</translation> <translation id="2853121255651601031">הסיסמה נשמרה</translation> <translation id="2854453262159518435">החלפת קבוצת הכרטיסיות הקיימת</translation> @@ -3608,6 +3605,7 @@ <translation id="3473241910002674503">במצב טאבלט אפשר להשתמש בכפתורים כדי לעבור אל דף הבית, לחזור לדף הקודם ולעבור בין אפליקציות.</translation> <translation id="3473479545200714844">מגדיל התצוגה</translation> <translation id="3474218480460386727">יש לכתוב מילים חדשות עם 99 אותיות או פחות</translation> +<translation id="3474330892505468100">Google Beam עם Meet</translation> <translation id="3474624961160222204">המשך כ-<ph name="NAME" /></translation> <translation id="3477772589943384839">חיסכון בינוני במשאבי הזיכרון. הכרטיסיות מושבתות אחרי פרק זמן ארוך יותר.</translation> <translation id="347785443197175480">אני רוצה להמשיך לאפשר ל-<ph name="HOST" /> לגשת למצלמה ולמיקרופון</translation> @@ -5497,7 +5495,6 @@ <translation id="4779766576531456629">שינוי שם של הרשת הסלולרית של eSIM</translation> <translation id="4780321648949301421">שמירת הדף בשם...</translation> <translation id="4780558987886269159">לעבודה</translation> -<translation id="4781633367688946589">המשך לסשן חדש</translation> <translation id="4784349455504343791">האתר <ph name="WEBSITE_ORIGIN" /> רוצה להשתמש בפרטים האישיים מהארנק הדיגיטלי שלך.</translation> <translation id="4785719467058219317">בחרת להשתמש במפתח אבטחה שלא רשום עבור האתר הזה</translation> <translation id="4785914069240823137">ביטול החיתוך</translation> @@ -6286,6 +6283,7 @@ <translation id="5337926771328966926">השם הנוכחי של המכשיר הוא <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">אפשר לגלוש בפרטיות באמצעות חלון אנונימי</translation> <translation id="5338503421962489998">אחסון מקומי</translation> +<translation id="5340620183031438925">כדי לשאול במצב AI שאלות לגבי הכרטיסייה בלי לצאת מהדף, צריך לאמת את הזהות. אחרי הכניסה לחשבון, אפשר גם לראות סיסמאות ופריטים נוספים בכל המכשירים.</translation> <translation id="5340787663756381836">&חיפוש ועריכה</translation> <translation id="5340900621595888432">שליחה של נתוני אבחון ונתוני שימוש במכשיר</translation> <translation id="5341793073192892252">קובצי ה-Cookie הבאים נחסמו (קובצי Cookie של צד שלישי נחסמים ללא יוצא מן הכלל)</translation> @@ -7472,7 +7470,6 @@ <translation id="6180550893222597997">באיזה מפתח גישה ברצונך להשתמש עבור <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">לפעמים המיתוג של אפליקציות מתעדכן. לפני העדכון, חשוב לבדוק את כל השינויים ולוודא שהם מקובלים עליך.</translation> <translation id="6181431612547969857">ההורדה נחסמה</translation> -<translation id="6182100780603067202">שיתוף גם של האודיו מהאפליקציה (מכל החלונות שלה)</translation> <translation id="6183369864942961155">הפעלה אוטומטית של עיצוב בהיר או כהה</translation> <translation id="6183773856988300112">Gemini ב-Chrome משתמש בגלישה אוטומטית כדי לפעול בכרטיסיות שלך ולהשלים משימות שהוא מקבל ממך. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation> <translation id="6184099524311454384">חיפוש כרטיסיות</translation> @@ -8269,7 +8266,6 @@ <translation id="6754359471209693699">התחלת חיפוש חדש</translation> <translation id="6754918760968695779">הוספה מהירה</translation> <translation id="6755702685749429945">הוספת מילון</translation> -<translation id="6756157672127672536">האפליקציה 'קבצים' מעניקה גישה מהירה לקבצים ששמרת ב-Google Drive, בהתקן אחסון חיצוני או במכשיר שלך עם ChromeOS.</translation> <translation id="6756643207511618722">מנועי דיבור</translation> <translation id="6757431299485455321">עזרה למכשירים אחרים באיתור הנקודה הזו לשיתוף אינטרנט.</translation> <translation id="6758056191028427665">נשמח לקבל ממך משוב.</translation> @@ -9216,6 +9212,7 @@ <translation id="7406912950279255498">מצב היפוך צבעים</translation> <translation id="7407430846095439694">ייבוא ושיוך</translation> <translation id="7407504355934009739">רוב האנשים חוסמים התראות מהאתר הזה</translation> +<translation id="7407578029724074226">הקובץ <ph name="FILE_NAME" /> מכיל מידע אישי רגיש. הארגון שלך יאפשר לך לשמור אותו באחסון בענן או למחוק אותו</translation> <translation id="7408080603962564527">השם הזה יהיה גלוי לאנשים אחרים</translation> <translation id="740810853557944681">הוספה של שרת הדפסה</translation> <translation id="7409549334477097887">גדול מאוד</translation> @@ -9269,6 +9266,7 @@ <translation id="7434969625063495310">לא ניתן היה להוסיף את שרת ההדפסה. יש לבדוק את הגדרת השרת ולנסות שוב.</translation> <translation id="7436921188514130341">אופס! אירעה שגיאה במהלך שינוי השם.</translation> <translation id="7439519621174723623">יש להוסיף את שם המכשיר כדי להמשיך</translation> +<translation id="743982235360757672">רוצה להשאיר את מצב AI בהישג יד בזמן הגלישה?</translation> <translation id="7441736532026945583">בוחרים באפשרות 'הסתרת הקבוצה' כדי להסיר את הקבוצה משורת הכרטיסיות</translation> <translation id="7441736921018636843">כדי לשנות את ההגדרה הזאת, צריך להסיר את ביטוי הסיסמה של הסנכרון על ידי <ph name="BEGIN_LINK" />איפוס הסנכרון<ph name="END_LINK" /></translation> <translation id="7441830548568730290">משתמשים אחרים</translation> @@ -10007,7 +10005,6 @@ <translation id="794676567536738329">אישור הרשאות</translation> <translation id="7947962633355574091">העתקת כתובת &סרטון</translation> <translation id="7947964080535614577">אתרים מציגים בדרך כלל מודעות כדי שיוכלו לספק תוכן או שירותים בחינם. עם זאת, ידוע שאתרים מסוימים מציגים מודעות שמפריעות או מטעות.</translation> -<translation id="7948239795436419268">לא לשחזר חלונות</translation> <translation id="7948407723851303488">כל הדפים של <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">סיבות: ב-LBS יש תמיכה רק בכתובות URL עם הקידומת http://, https:// ו-file://.</translation> <translation id="7950814699499457511">מופעל • לתוסף הזה לא פורסמו נוהלי פרטיות, למשל האופן שבו הוא אוסף נתונים ומשתמש בהם</translation> @@ -11196,7 +11193,6 @@ <translation id="8751034568832412184">בית ספרי</translation> <translation id="8751329102746373229">מהאדמין שלך</translation> <translation id="8752451679755290210">מעבר אוטומטי בין פריטים</translation> -<translation id="8753948258138515839">האפליקציה 'קבצים' נותנת גישה מהירה לקבצים ששמרת ב-Google Drive, בהתקן אחסון חיצוני או במכשיר שלך עם ChromeOS Flex.</translation> <translation id="8754200782896249056"><p>בעת הפעלת <ph name="PRODUCT_NAME" /> בסביבה של שולחנות עבודה נתמכים, ייעשה שימוש בהגדרות ה-Proxy של המערכת. עם זאת, ייתכן שהמערכת שלך אינה נתמכת, או שאירעה בעיה בהפעלת תצורת המערכת.</p> <p>באפשרותך עדיין לבצע הגדרת תצורה באמצעות שורת הפקודה. אפשר לעיין בקטע <code>man<ph name="PRODUCT_BINARY_NAME" /></code> לקבלת מידע נוסף על סימונים ומשתנים סביבתיים.</p></translation> @@ -11991,6 +11987,7 @@ <translation id="992778845837390402">מתבצע כעת גיבוי של Linux</translation> <translation id="994087375490600917">חלוניות צדדיות</translation> <translation id="994289308992179865">הפעלה ב&רצף</translation> +<translation id="995420352808264005">בחירת סוג שיוך המכשיר לארגון</translation> <translation id="995755448277384931">הוספת IBAN</translation> <translation id="996250603853062861">יוצר חיבור מאובטח...</translation> <translation id="997143476478634194">אתרים יפעלו לפי ההגדרה הזו באופן אוטומטי בזמן הביקור בהם. בדרך כלל, אתרים שולחים התראות כדי לאפשר לך להתעדכן במבזקי החדשות או לקבל הודעות בצ'אט.</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 32039d1..2f186a1 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">メインノードのアノテーション ファイルをダウンロードできません。しばらくしてからもう一度お試しください。</translation> <translation id="1103523840287552314"><ph name="LANGUAGE" />を常に翻訳</translation> <translation id="1104098698795583187">このタブグループに直ちにアクセスできなくなり、すべてのデバイスから削除されます</translation> +<translation id="1105934302947321130">Google Beam(Zoom と連携)</translation> <translation id="1106270460549661906">Gemini との共有を解除</translation> <translation id="1106350001632362876">しきい値を引き上げ</translation> <translation id="110850812463801904">OneDrive に手動で接続</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">セキュリティ キーは PIN で保護されていません。ログインデータを管理するには、まず PIN を作成してください。</translation> <translation id="1179400851034021914">IBAN が無効です</translation> <translation id="1179902906564467236">スマートフォンに表示される手順に沿って操作するか、カメラアプリを使用してください</translation> -<translation id="1180117276105724040">前回のセッションからウィンドウを復元しています...</translation> <translation id="118057123461613219">非常に大量の節約</translation> <translation id="1181037720776840403">削除</translation> <translation id="1182876754474670069">Home</translation> @@ -761,7 +761,6 @@ <translation id="151501797353681931">Safari からのインポート</translation> <translation id="1515163294334130951">起動</translation> <translation id="1517467582299994451">コードを使ってキャストするには、Chrome ブラウザの同期設定を有効にしてください</translation> -<translation id="1519090060276706457">ウィンドウの復元に通常より時間がかかっています</translation> <translation id="1521442365706402292">証明書の管理</translation> <translation id="1521655867290435174">Google スプレッドシート</translation> <translation id="1521774566618522728">最終同期: 今日</translation> @@ -1101,6 +1100,7 @@ <translation id="1745732479023874451">連絡先を管理</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{# 件のファイルをこのウェブアプリで開いて編集しますか?}}</translation> <translation id="1748563609363301860">このパスワードは、Google アカウントまたはこのデバイスのみに保存できます。</translation> +<translation id="1749645492410897998">ソフトウェアのインストール中</translation> <translation id="1749733017156547309">パスワードを入力してください</translation> <translation id="1750172676754093297">セキュリティ キーにフィンガープリントを保存できません</translation> <translation id="1750238553597293878">Google アカウントのパスワードを引き続き使用してください</translation> @@ -1172,7 +1172,6 @@ <translation id="1796460466266263589">Gemini を引き続き使用するには、本人確認を行ってください</translation> <translation id="1796588414813960292">音を使用する機能は動作しなくなります</translation> <translation id="1798726622311813209">クレジット カードとデビットカード</translation> -<translation id="1799852120691957794">前回のセッションからウィンドウを復元できません</translation> <translation id="180203835522132923">検索+O の後、W</translation> <translation id="1802624026913571222">ディスプレイを閉じたときにスリープ状態にする</translation> <translation id="1802687198411089702">ページが応答していません。しばらくお待ちいただくか、終了してください。</translation> @@ -2360,7 +2359,6 @@ <translation id="2610374175948698697">デバイスのファイルやフォルダを表示できる</translation> <translation id="2610780100389066815">Microsoft 信頼リストの署名</translation> <translation id="261114180663074524">Microsoft アカウントにログインして、もう一度お試しください</translation> -<translation id="2611702650078660078">エラーが発生しました</translation> <translation id="2611776654555141051">長方形ツール</translation> <translation id="2611885296070244383">マイク(内蔵)</translation> <translation id="2612676031748830579">カード番号</translation> @@ -2724,7 +2722,6 @@ <translation id="285033512555869047">閉じています</translation> <translation id="2850541429955027218">テーマを追加</translation> <translation id="2851291081585704741">オフラインです</translation> -<translation id="2852045827873867442">インターネット接続が必要です。</translation> <translation id="285237063405807022">(読み込んでいます)</translation> <translation id="2853121255651601031">パスワードが保存されました</translation> <translation id="2854453262159518435">既存のタブグループを置き換える</translation> @@ -3589,6 +3586,7 @@ <translation id="3473241910002674503">タブレット モードで、ボタンを使用してホームに移動したり、戻ったり、アプリを切り替えたりできます。</translation> <translation id="3473479545200714844">画面拡大鏡</translation> <translation id="3474218480460386727">新しい語句は 99 文字以内で指定してください</translation> +<translation id="3474330892505468100">Google Beam(Meet と連携)</translation> <translation id="3474624961160222204"><ph name="NAME" /> として続行</translation> <translation id="3477772589943384839">メモリを適度に節約します。タブは長時間経過してから非アクティブになります。</translation> <translation id="347785443197175480"><ph name="HOST" /> によるカメラとマイクへのアクセスを引き続き許可する</translation> @@ -5474,7 +5472,6 @@ <translation id="4779766576531456629">eSIM モバイル ネットワークの名前変更</translation> <translation id="4780321648949301421">ページを別名で保存...</translation> <translation id="4780558987886269159">仕事向け</translation> -<translation id="4781633367688946589">新しいセッションに進む</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> は、デジタル ウォレットの個人情報の使用を求めています。</translation> <translation id="4785719467058219317">このウェブサイトに登録されていないセキュリティ キーを使用しています</translation> <translation id="4785914069240823137">切り抜きをキャンセル</translation> @@ -6259,6 +6256,7 @@ <translation id="5337926771328966926">現在のデバイス名は <ph name="DEVICE_NAME" /> です</translation> <translation id="5338338064218053691">シークレット ウィンドウを使って、シークレット モードで閲覧できます</translation> <translation id="5338503421962489998">ローカル ストレージ</translation> +<translation id="5340620183031438925">ページを離れることなく、タブについて AI モードに質問するには、本人確認を行ってください。これにより、すべてのデバイスでパスワードなどの設定も使用できるようになります。</translation> <translation id="5340787663756381836">検索と編集(&F)</translation> <translation id="5340900621595888432">診断データと使用状況データを送信する</translation> <translation id="5341793073192892252">以下の Cookie がブロックされました(サードパーティの Cookie は例外なくブロックされます)</translation> @@ -7444,7 +7442,6 @@ <translation id="6180550893222597997"><ph name="APP_NAME" /> に使用するパスキーを指定してください</translation> <translation id="6181218116951226898">アプリでブランディングが更新されることがあります。更新の前に、すべての変更内容に問題がないことを確認してください。</translation> <translation id="6181431612547969857">ダウンロードがブロックされました</translation> -<translation id="6182100780603067202">(すべてのウィンドウの)アプリケーションの音声も共有する</translation> <translation id="6183369864942961155">ライトモード / ダークモード自動設定</translation> <translation id="6183773856988300112">Gemini in Chrome が自動でブラウジングして、タブ上の作業や指定されたタスクを行います。<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" /></translation> <translation id="6184099524311454384">タブを検索</translation> @@ -8227,7 +8224,7 @@ <translation id="6745592621698551453">今すぐ更新</translation> <translation id="6746124502594467657">下に移動</translation> <translation id="67465227497040338"><ph name="DOMAIN" /> のパスワードを表示する</translation> -<translation id="6746834324024491643">すべてのデバイスで同じパスワードやその他の設定を利用するには、<ph name="EMAIL" /> としてログインしてください</translation> +<translation id="6746834324024491643">すべてのデバイスでパスワードやその他の設定を使用するには、<ph name="EMAIL" /> としてログインしてください</translation> <translation id="6748980958975836188"><ph name="BEGIN_LINK1" />Google 利用規約<ph name="END_LINK1" />、<ph name="BEGIN_LINK2" />Chrome および ChromeOS 追加利用規約<ph name="END_LINK2" />を確認し、内容に同意します。</translation> <translation id="6749077623962119521">権限をリセットしますか?</translation> <translation id="6749473226660745022">写真</translation> @@ -8236,7 +8233,6 @@ <translation id="6754359471209693699">新しい検索を開始</translation> <translation id="6754918760968695779">クイック インサート</translation> <translation id="6755702685749429945">辞書を追加</translation> -<translation id="6756157672127672536">ファイルアプリを使用すると、Google ドライブ、外部ストレージ、ChromeOS デバイスに保存したファイルにすばやくアクセスできます。</translation> <translation id="6756643207511618722">読み上げエンジン</translation> <translation id="6757431299485455321">このアクセス ポイントを他のデバイスで検出できるようにします。</translation> <translation id="6758056191028427665">アンケートにご協力ください。</translation> @@ -9182,6 +9178,7 @@ <translation id="7406912950279255498">色反転モード</translation> <translation id="7407430846095439694">インポートしてバインド</translation> <translation id="7407504355934009739">ほとんどのユーザーがこのサイトの通知をブロックしています</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> にはセンシティブ データが含まれています。組織の設定では、このデータをクラウド ストレージに保存するか破棄することができます。</translation> <translation id="7408080603962564527">他のユーザーに表示されます</translation> <translation id="740810853557944681">プリント サーバーを追加</translation> <translation id="7409549334477097887">特大</translation> @@ -9235,6 +9232,7 @@ <translation id="7434969625063495310">プリント サーバーを追加できませんでした。サーバーの設定を確認してから、もう一度お試しください。</translation> <translation id="7436921188514130341">名前の変更中にエラーが発生しました。</translation> <translation id="7439519621174723623">続行するにはデバイス名を追加してください</translation> +<translation id="743982235360757672">ブラウジング中に AI モードを手軽に使用</translation> <translation id="7441736532026945583">タブバーからグループを削除するには、[グループを非表示] を選択します</translation> <translation id="7441736921018636843">この設定を変更するには、<ph name="BEGIN_LINK" />同期をリセット<ph name="END_LINK" />して同期パスフレーズを削除します</translation> <translation id="7441830548568730290">他のユーザー</translation> @@ -9972,7 +9970,6 @@ <translation id="794676567536738329">許可の確認</translation> <translation id="7947962633355574091">動画アドレスをコピー(&C)</translation> <translation id="7947964080535614577">多くのサイトは、コンテンツやサービスを料金なしで提供する目的で広告を表示します。ただし、一部のサイトについては、煩わしい広告や誤解を招く広告が表示されることがわかっています。</translation> -<translation id="7948239795436419268">ウィンドウを復元しない</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" /> のすべてのページ</translation> <translation id="7950629216186736592">理由: LBS では http://、https://、file:// の URL のみサポートされています。</translation> <translation id="7950814699499457511">オン • この拡張機能は、データの収集方法や使用方法などのプライバシー保護の取り組みを公開していません</translation> @@ -11161,7 +11158,6 @@ <translation id="8751034568832412184">学校</translation> <translation id="8751329102746373229">管理者が追加</translation> <translation id="8752451679755290210">アイテム間を自動的に移動する</translation> -<translation id="8753948258138515839">ファイルアプリを使えば、Google ドライブ、外部ストレージ、ChromeOS Flex デバイスに保存したファイルにすぐにアクセスできます。</translation> <translation id="8754200782896249056"><p><ph name="PRODUCT_NAME" /> をサポート対象のデスクトップ環境で実行するとシステムのプロキシ設定が使用されますが、お使いのシステムがサポートされていないか、システム設定の適用で問題が発生した可能性があります。</p> <p>コマンドラインからの設定は可能です。フラグや環境変数について詳しくは、<code>man <ph name="PRODUCT_BINARY_NAME" /></code> を実行してご確認ください。</p></translation> @@ -11954,6 +11950,7 @@ <translation id="992778845837390402">現在、Linux のバックアップが進行中です</translation> <translation id="994087375490600917">サイドパネル</translation> <translation id="994289308992179865">ループ(&L)</translation> +<translation id="995420352808264005">デバイスの登録タイプを選択してください</translation> <translation id="995755448277384931">IBAN の追加</translation> <translation id="996250603853062861">安全な接続を確立しています...</translation> <translation id="997143476478634194">サイトにアクセスしたときにこの設定の動作を自動的に行います。多くのサイトは、最新情報やチャット メッセージなどを知らせる目的で通知を送信します。</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index 061883c4..d1186a93 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -285,7 +285,6 @@ <translation id="117916940443676133">თქვენი უსაფრთხოების გასაღები არ არის დაცული PIN-კოდით. სისტემაში შესვლის მონაცემების სამართავად, პირველ რიგში, შექმენით PIN-კოდი.</translation> <translation id="1179400851034021914">IBAN არასწორია</translation> <translation id="1179902906564467236">მიჰყევით ინსტრუქციას ტელეფონზე ან გამოიყენეთ კამერის აპი</translation> -<translation id="1180117276105724040">მიმდინარეობს ფანჯრების აღდგენა წინა სესიიდან...</translation> <translation id="118057123461613219">ძალიან დიდი დანაზოგი</translation> <translation id="1181037720776840403">ამოშლა</translation> <translation id="1182876754474670069">მთავარი</translation> @@ -762,7 +761,6 @@ <translation id="151501797353681931">იმპორტირებულია Safari-დან</translation> <translation id="1515163294334130951">გაშვება</translation> <translation id="1517467582299994451">კოდის მეშვეობით ტრანსლირებისთვის ჩართეთ ბრაუზერის სინქრონიზაციის პარამეტრები Chrome-ში</translation> -<translation id="1519090060276706457">ფანრების აღდგენას დაგეგმილზე მეტი დრო სჭირდება</translation> <translation id="1521442365706402292">სერთიფიკატების მართვა</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">აქტიური იყო დღეს</translation> @@ -1175,7 +1173,6 @@ <translation id="1796460466266263589">Gemini-ს გამოყენების გასაგრძელებლად დაადასტურეთ თქვენი ვინაობა</translation> <translation id="1796588414813960292">ფუნქციები, რომლებიც ხმას საჭიროებს, არ იმუშავებს</translation> <translation id="1798726622311813209">საკრედიტო და სადებეტო ბარათები</translation> -<translation id="1799852120691957794">წინა სესიიდან ფანჯრების აღდგენა შეუძლებელია</translation> <translation id="180203835522132923">Search + O, შემდეგ W</translation> <translation id="1802624026913571222">დაძინება თავსახურის დახურვისას</translation> <translation id="1802687198411089702">გვერდი არ რეაგირებს. შეგიძლიათ დაელოდოთ ან გამოხვიდეთ.</translation> @@ -2368,7 +2365,6 @@ <translation id="2610374175948698697">შეუძლია ფაილების ან საქაღალდეების ნახვა თქვენს მოწყობილობაზე</translation> <translation id="2610780100389066815">Microsoft-ის სანდო ელემენტების სიის ხელმოწერა</translation> <translation id="261114180663074524">შედით თქვენს Microsoft ანგარიშში და შემდეგ ცადეთ ხელახლა</translation> -<translation id="2611702650078660078">მოხდა შეცდომა</translation> <translation id="2611776654555141051">მართკუთხედის ხელსაწყო</translation> <translation id="2611885296070244383">მიკროფონი (შიდა)</translation> <translation id="2612676031748830579">ბარათის ნომერი</translation> @@ -2732,7 +2728,6 @@ <translation id="285033512555869047">დაკეტილია</translation> <translation id="2850541429955027218">თემის დამატება</translation> <translation id="2851291081585704741">თქვენ ხაზგარეშე რეჟიმში ხართ</translation> -<translation id="2852045827873867442">საჭიროა ინტერნეტ-კავშირი.</translation> <translation id="285237063405807022">(იტვირთება)</translation> <translation id="2853121255651601031">პაროლი შენახულია</translation> <translation id="2854453262159518435">ჩანართების არსებული ჯგუფის ჩანაცვლება</translation> @@ -5488,7 +5483,6 @@ <translation id="4779766576531456629">eSIM ფიჭური ქსელის გადარქმევა</translation> <translation id="4780321648949301421">გვერდის შენახვა, როგორც…</translation> <translation id="4780558987886269159">სამსახურისთვის</translation> -<translation id="4781633367688946589">ახალი სესიით გაგრძელება</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> ითხოვს, გამოიყენოს თქვენი პერსონალური ინფორმაცია თქვენი ციფრული საფულიდან.</translation> <translation id="4785719467058219317">თქვენ მიერ გამოყენებული უსაფრთხოების გასაღები არ არის რეგისტრირებული ამ ვებსაიტზე</translation> <translation id="4785914069240823137">ჩამოჭრის გაუქმება</translation> @@ -7464,7 +7458,6 @@ <translation id="6180550893222597997">წვდომის რომელი გასაღების გამოყენება გსურთ <ph name="APP_NAME" />-ისთვის?</translation> <translation id="6181218116951226898">აპები ზოგჯერ აახლებენ თავიანთ ბრენდინგს. განახლებამდე გადახედეთ ყველა ცვლილებას იმაში დასარწმუნებლად, რომ ცვლილებები გაკმაყოფილებთ.</translation> <translation id="6181431612547969857">ჩამოტვირთვა დაბლოკილია</translation> -<translation id="6182100780603067202">ასევე, გააზიარეთ აპლიკაციის აუდიო (მისი ყველა ფანჯრიდან)</translation> <translation id="6183369864942961155">ავტომატური ღია/მუქი თემა</translation> <translation id="6183773856988300112">Gemini Chrome-ში იყენებს ავტომატურ დათვალიერებას, რათა იმუშაოს თქვენს ჩანართებში და შეასრულოს თქვენ მიერ დაკისრებული მიცემული დავალებები. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="6184099524311454384">მოიძიეთ ჩანართებში</translation> @@ -8257,7 +8250,6 @@ <translation id="6754359471209693699">ახალი ძიების დაწყება</translation> <translation id="6754918760968695779">სწრაფი ჩასმა</translation> <translation id="6755702685749429945">ლექსიკონის დამატება</translation> -<translation id="6756157672127672536">ფაილების პროგრამა უზრუნველყოფს სწრაფ წვდომას ფაილებზე, რომლებიც შეინახეთ Google Drive-ზე, გარე მეხსიერებაში ან თქვენს ChromeOS მოწყობილობაში.</translation> <translation id="6756643207511618722">მეტყველების მოდულები</translation> <translation id="6757431299485455321">დაეხმარეთ სხვა მოწყობილობებს უსადენო ქსელის პოვნაში.</translation> <translation id="6758056191028427665">შეგვატყობინეთ, როგორ ვმუშაობთ.</translation> @@ -9995,7 +9987,6 @@ <translation id="794676567536738329">დაადასტურეთ ნებართვები</translation> <translation id="7947962633355574091">ვიდეოს მისამართის კ&ოპირება</translation> <translation id="7947964080535614577">როგორც წესი, საიტების მიერ რეკლამის ჩვენება ხდება იმიტომ, რომ ისინი კონტენტსა თუ სერვისებს უფასოდ გთავაზობენ. მიუხედავად ამისა, ზოგიერთ საიტზე არსებული რეკლამა მომაბეზრებელი ან შეცდომაში შემყვანია.</translation> -<translation id="7948239795436419268">არ აღდგეს ფანჯრები</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" />-ის ყველა გვერდი</translation> <translation id="7950629216186736592">მიზეზი: LBS-ს მიერ მხარდაჭერილია მხოლოდ http://, https:// და file:// ტიპის URL-ები.</translation> <translation id="7950814699499457511">ჩართული • ამ გაფართოებას არ გამოუქვეყნებია კონფიდენციალური ინფორმაციის გამოყენების პრაქტიკა, მაგალითად, მონაცემების შეგროვებისა და გამოყენების წესები.</translation> @@ -11184,7 +11175,6 @@ <translation id="8751034568832412184">სკოლის</translation> <translation id="8751329102746373229">თქვენი ადმინისტრატორისგან</translation> <translation id="8752451679755290210">ერთეულებს შორის ავტომატურად გადასვლა</translation> -<translation id="8753948258138515839">ფაილების აპი უზრუნველყოფს სწრაფ წვდომას ფაილებზე, რომლებიც შეინახეთ Google Drive-ზე, გარე მეხსიერებაში ან თქვენს ChromeOS Flex მოწყობილობაზე.</translation> <translation id="8754200782896249056"><p>როდესაც ხდება <ph name="PRODUCT_NAME" /> ის მხარდამჭერი სამუშაო დაფის გარემოში გაშვება, გამოიყენება პროქსი სისტემა. თუმცა, ან თქვენი სისტემა არ არის მხარდაჭერილი ან სისტემის კონფიგურაციის გაშვებისას შეიქმნა დაბრკოლება</p> <p>მიუხედავად ამისა თქვენ მაინც შეძლებთ ბრძანებათა სტრიქონიდან სისტემის კონფიგურაციას. იხილეთ <code>man <ph name="PRODUCT_BINARY_NAME" /></code> ალმებსა და გარემოს ცვლილებებზე დამატებითი ინფორმაციისთვის.</p></translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index b989264..35697a45 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Негізгі түйіннің aннотация файлдарын жүктеп алу мүмкін емес. Кейінірек қайталап көріңіз.</translation> <translation id="1103523840287552314">Әрқашан <ph name="LANGUAGE" /> тіліне аудару</translation> <translation id="1104098698795583187">Осы қойындылар тобын пайдалану рұқсатынан бірден айырылып қаласыз. Бұл топ барлық құрылғыңыздан жойылады.</translation> +<translation id="1105934302947321130">Google Beam және Zoom</translation> <translation id="1106270460549661906">Gemini-мен бөлісуді тоқтату</translation> <translation id="1106350001632362876">Шекті арттыру</translation> <translation id="110850812463801904">OneDrive-бен қолмен байланыстыру</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Сіздің қауіпсіздік кілтіңіз PIN кодымен қорғалмаған. Кіру деректерін басқару үшін алдымен PIN кодын жасаңыз.</translation> <translation id="1179400851034021914">IBAN жарамсыз</translation> <translation id="1179902906564467236">Телефондағы нұсқауларды орындаңыз немесе камера қолданбасын пайдаланыңыз.</translation> -<translation id="1180117276105724040">Алдыңғы сеанс терезелері қалпына келтіріліп жатыр...</translation> <translation id="118057123461613219">Үнем мөлшері өте көп</translation> <translation id="1181037720776840403">Өшіру</translation> <translation id="1182876754474670069">home</translation> @@ -758,7 +758,6 @@ <translation id="151501797353681931">Safari браузерінен импортталған</translation> <translation id="1515163294334130951">Іске қосу</translation> <translation id="1517467582299994451">Код арқылы трансляциялау үшін Chrome браузерін синхрондау параметрлерін іске қосыңыз.</translation> -<translation id="1519090060276706457">Терезелерді қалпына келтіру әдеттегіден ұзаққа созылып жатыр</translation> <translation id="1521442365706402292">Сертификаттар басқару</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">Бүгін белсенді болды</translation> @@ -1099,6 +1098,7 @@ <translation id="1745732479023874451">Контактілерді басқару</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{Осы веб-қолданбада # файлды ашып, өзгерту керек пе?}}</translation> <translation id="1748563609363301860">Бұл құпия сөзді Google аккаунтыңызда немесе тек осы құрылғыда сақтай аласыз.</translation> +<translation id="1749645492410897998">Бағдарламалық құрал орнатылып жатыр</translation> <translation id="1749733017156547309">Құпия сөз енгізу қажет.</translation> <translation id="1750172676754093297">Қауіпсіздік кілті саусақ іздерін сақтай алмайды.</translation> <translation id="1750238553597293878">Google аккаунтыңызда құпия сөздерді пайдалануды жалғастыру</translation> @@ -1170,7 +1170,6 @@ <translation id="1796460466266263589">Gemini қызметін әрі қарай пайдалану үшін жеке басыңызды растаңыз.</translation> <translation id="1796588414813960292">Дыбысты қажет ететін функциялар жұмыс істемейді.</translation> <translation id="1798726622311813209">Несиелік және дебеттік карталар</translation> -<translation id="1799852120691957794">Алдыңғы сеанс терезелері қалпына келмеді</translation> <translation id="180203835522132923">Search + O, одан кейін W</translation> <translation id="1802624026913571222">Қақпағы жабылғанда, ұйқы режиміне өту</translation> <translation id="1802687198411089702">Бет жауап бермеуде. Оны күтуге не жабуға болады.</translation> @@ -2363,7 +2362,6 @@ <translation id="2610374175948698697">Құрылғыңыздағы файлдарды немесе қалталарды көре алады</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">Microsoft аккаунтыңызға кіріп, әрекетті қайталаңыз</translation> -<translation id="2611702650078660078">Қате орын алды.</translation> <translation id="2611776654555141051">Тікбұрыш құралы</translation> <translation id="2611885296070244383">Микрофон (ішкі)</translation> <translation id="2612676031748830579">Карта нөмірі</translation> @@ -2727,7 +2725,6 @@ <translation id="285033512555869047">Жабық</translation> <translation id="2850541429955027218">Тақырып қосу</translation> <translation id="2851291081585704741">Офлайн режимдесіз</translation> -<translation id="2852045827873867442">Интернет байланысы қажет.</translation> <translation id="285237063405807022">(жүктеліп жатыр)</translation> <translation id="2853121255651601031">Құпия сөз сақталды</translation> <translation id="2854453262159518435">Бұрыннан бар қойындылар тобын ауыстыру</translation> @@ -3592,6 +3589,7 @@ <translation id="3473241910002674503">Планшет режимінде түймелердің көмегімен негізгі экранға, артқа өтіңіз және қолданбалар арасында ауысыңыз.</translation> <translation id="3473479545200714844">Экран ұлғайтқыш</translation> <translation id="3474218480460386727">Жаңа сөздер үшін 99 немесе одан аз әріп пайдаланыңыз.</translation> +<translation id="3474330892505468100">Google Beam және Meet</translation> <translation id="3474624961160222204"><ph name="NAME" /> болып жалғастыру</translation> <translation id="3477772589943384839">Жад орташа дәрежеде үнемделеді. Қойындылар әрекетсіз күйге ұзақ уақыттан кейін енеді.</translation> <translation id="347785443197175480"><ph name="HOST" /> хостына камераңыз бен микрофоныңызды пайдалануға берген рұқсатты сақтау</translation> @@ -5480,7 +5478,6 @@ <translation id="4779766576531456629">eSIM ұялы байланыс желісінің атауын өзгерту</translation> <translation id="4780321648949301421">Бетті басқаша сақтау…</translation> <translation id="4780558987886269159">Жұмыс үшін</translation> -<translation id="4781633367688946589">Жаңа сеанста жалғастыру</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> цифрлық әмияныңыздағы жеке ақпаратыңызды пайдалануға рұқсат сұрайды.</translation> <translation id="4785719467058219317">Веб-сайтта тіркелмеген қауіпсіздік кілтін пайдаланып жатырсыз.</translation> <translation id="4785914069240823137">Қиюдан бас тарту</translation> @@ -6267,6 +6264,7 @@ <translation id="5337926771328966926">Қазіргі құрылғының атауы — <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Инкогнито терезесінде интернетті құпия пайдалануыңызға болады.</translation> <translation id="5338503421962489998">Жергілікті сақтау орны</translation> +<translation id="5340620183031438925">Беттен шықпай-ақ AI режиміне қойынды туралы сұрақ қою үшін жеке басыңызды растаңыз. Құпия сөздер мен басқа да деректеріңіз барлық құрылғыңызда қолжетімді болады.</translation> <translation id="5340787663756381836">&Табу және өзгерту</translation> <translation id="5340900621595888432">Диагностика және пайдалану туралы деректі жіберу</translation> <translation id="5341793073192892252">Мына cookie файлдарына тыйым салынды (үшінші тараптың cookie файлдарына түбегейлі тыйым салынады)</translation> @@ -7450,7 +7448,6 @@ <translation id="6180550893222597997"><ph name="APP_NAME" /> үшін қандай кіру кілтін пайдаланғыңыз келеді?</translation> <translation id="6181218116951226898">Қолданбалар кейде брендинг туралы ақпаратын өзгертеді. Өзгерту алдында барлық өзгеріс өзіңізге ыңғайлы екенін тексеріп алыңыз.</translation> <translation id="6181431612547969857">Жүктеуге тыйым салынған</translation> -<translation id="6182100780603067202">Қолданбаның (барлық терезесіндегі) аудиосын да бөлісу</translation> <translation id="6183369864942961155">Автоматты жарық/қараңғы режим</translation> <translation id="6183773856988300112">Chrome-дағы Gemini қойындыларыңызда істеп, сіз берген тапсырмаларды орындау үшін автоматты түрде шолу функциясын пайдаланады. <ph name="LINK_BEGIN" />Толық ақпарат<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Қойындыларды іздеу</translation> @@ -8243,7 +8240,6 @@ <translation id="6754359471209693699">Жаңадан іздеуді бастау</translation> <translation id="6754918760968695779">Жылдам енгізу</translation> <translation id="6755702685749429945">Сөздік қосу</translation> -<translation id="6756157672127672536">Files қолданбасы Google Drive қызметінде, сыртқы жадта немесе ChromeOS құрылғысында сақталған файлдарыңызға жылдам кіруге мүмкіндік береді.</translation> <translation id="6756643207511618722">Дауыстап оқу модульдері</translation> <translation id="6757431299485455321">Басқа құрылғылардың осы хотспотты табуына көмектесіңіз.</translation> <translation id="6758056191028427665">Қал-жағдайыңызды айтып беріңіз.</translation> @@ -9189,6 +9185,7 @@ <translation id="7406912950279255498">Түс инверсиясы режимі</translation> <translation id="7407430846095439694">Импорттау және байланыстыру</translation> <translation id="7407504355934009739">Көптеген адамдар осы сайттың хабарландыруларына тыйым салады.</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> файлында құпия деректер бар. Ұйымыңыз оны бұлт жадына сақтауға немесе өшіруге рұқсат береді.</translation> <translation id="7408080603962564527">Бұл басқаларға көрінетін болады</translation> <translation id="740810853557944681">Басып шығару серверін енгізу</translation> <translation id="7409549334477097887">Өте үлкен</translation> @@ -9241,6 +9238,7 @@ <translation id="7434969625063495310">Басып шығару сервері енгізілмеді. Сервер конфигурациясын тексеріп, қайталап көріңіз.</translation> <translation id="7436921188514130341">Қап! Атын өзгерту кезінде қате пайда болды.</translation> <translation id="7439519621174723623">Жалғастыру үшін құрылғының атауын енгізіңіз.</translation> +<translation id="743982235360757672">Шолу кезінде AI режимі қолжетімді болады</translation> <translation id="7441736532026945583">Топты қойындылар жолағынан өшіру үшін "Топты жасыру" опциясын таңдаңыз.</translation> <translation id="7441736921018636843">Параметрді өзгерту үшін <ph name="BEGIN_LINK" />синхрондауды бастапқы күйге қайтарып<ph name="END_LINK" />, синхрондаудың құпия фразасын өшіріңіз</translation> <translation id="7441830548568730290">Басқа пайдаланушылар</translation> @@ -9979,7 +9977,6 @@ <translation id="794676567536738329">Рұқсаттарды растау</translation> <translation id="7947962633355574091">Бейне мекенжайын к&өшіру</translation> <translation id="7947964080535614577">Сайттар әдетте жарнамалар көрсетеді, сондықтан олар контентті немесе қызметтерді тегін ұсынады. Бірақ кейбір сайтта мезі қылатын немесе жалған ақпаратты жарнамалар кездесетіні белгілі.</translation> -<translation id="7948239795436419268">Терезелерді қалпына келтірмеу</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" /> доменінің барлық беті</translation> <translation id="7950629216186736592">Себеп: LBS тек http://, https:// және file:// URL мекенжайларына қолдау көрсетеді.</translation> <translation id="7950814699499457511">Қосылған • Бұл кеңейтім пайдаланушы деректерін қалай жинап, қолданатыны сияқты құпиялық шараларын жарияламаған.</translation> @@ -11168,7 +11165,6 @@ <translation id="8751034568832412184">Мектеп</translation> <translation id="8751329102746373229">Әкімші саясатынан импортталған</translation> <translation id="8752451679755290210">Элементтер арасында автоматты түрде жылжу</translation> -<translation id="8753948258138515839">Files қолданбасы Google Drive қызметінде, сыртқы жадта немесе ChromeOS Flex құрылғысында сақталған файлдарыңызға жылдам кіруге мүмкіндік береді.</translation> <translation id="8754200782896249056"><p>Қолдау көрсетілген жұмыс үстелі ортасына негізделген <ph name="PRODUCT_NAME" /> іске қосу кезінде, жүйенің прокси параметрлері пайдаланылады. Бірақ жүйеңізге қолдау көрсетілмеген немесе жүйелік конфигурацияңызды іске қосу кезінде ақау орын алды.</p> <p>Пәрмен жолы арқылы реттеуіңізге болады. Жалаушалар мен қоршаған орта айнымалылары туралы қосымша ақпарат алу үшін <code><ph name="PRODUCT_BINARY_NAME" /> нұсқаулығын</code> қараңыз.</p></translation> @@ -11961,6 +11957,7 @@ <translation id="992778845837390402">Linux жүйесінің сақтық көшірмесі жасалуда.</translation> <translation id="994087375490600917">Бүйірлік панельдер</translation> <translation id="994289308992179865">&Цикл</translation> +<translation id="995420352808264005">Құрылғыны тіркеу түрін таңдаңыз</translation> <translation id="995755448277384931">IBAN нөмірін қосу</translation> <translation id="996250603853062861">Қауіпсіз байланыс орнату…</translation> <translation id="997143476478634194">Сайттарға кірген кезде, оларға автоматты түрде осы параметр қолданылады. Сайттар әдетте шұғыл жаңалықтар немесе чат хабарламалары туралы хабарландырулар жібереді.</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index ba4ce5c9..0880d98 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">មិនអាចទាញយកឯកសារចំណារណតចម្បងបានទេ។ សូមព្យាយាមម្ដងទៀតនៅពេលក្រោយ។</translation> <translation id="1103523840287552314">បកប្រែ <ph name="LANGUAGE" /> ជានិច្ច</translation> <translation id="1104098698795583187">អ្នកនឹងបាត់បង់សិទ្ធិចូលប្រើក្រុមផ្ទាំងនេះ ហើយវានឹងត្រូវបានលុបចេញពីឧបករណ៍ទាំងអស់របស់អ្នក</translation> +<translation id="1105934302947321130">Google Beam with Zoom</translation> <translation id="1106270460549661906">ឈប់ចែករំលែកជាមួយ Gemini</translation> <translation id="1106350001632362876">បង្កើនកម្រិតកំណត់</translation> <translation id="110850812463801904">ភ្ជាប់ទៅ OneDrive ដោយផ្ទាល់ដៃ</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">សោសុវត្ថិភាពរបស់អ្នកមិនបានប្រើកូដ PIN សម្រាប់ការពារទេ។ ដើម្បីគ្រប់គ្រងទិន្នន័យសម្រាប់ចូលគណនី សូមបង្កើតកូដ PIN ជាមុនសិន។</translation> <translation id="1179400851034021914">IBAN មិនត្រឹមត្រូវទេ</translation> <translation id="1179902906564467236">អនុវត្តតាមការណែនាំនៅលើទូរសព្ទរបស់អ្នក ឬប្រើកម្មវិធីកាមេរ៉ា</translation> -<translation id="1180117276105724040">កំពុងស្ដារវិនដូពីវគ្គមុនរបស់អ្នក...</translation> <translation id="118057123461613219">ការសន្សំសំចៃច្រើនខ្លាំង</translation> <translation id="1181037720776840403">ដកចេញ</translation> <translation id="1182876754474670069">home</translation> @@ -762,7 +762,6 @@ <translation id="151501797353681931">បាននាំចូលពី Safari</translation> <translation id="1515163294334130951">បើកដំណើរការ</translation> <translation id="1517467582299994451">ដើម្បីបញ្ជូនដោយប្រើកូដ សូមបើកការកំណត់សមកាលកម្មកម្មវិធីរុករកតាមអ៊ីនធឺណិត Chrome</translation> -<translation id="1519090060276706457">ការស្ដារវិនដូកំពុងចំណាយពេលយូរជាងការរំពឹងទុក</translation> <translation id="1521442365706402292">គ្រប់គ្រងវិញ្ញាបនប័ត្រ</translation> <translation id="1521655867290435174">Google បញ្ជី</translation> <translation id="1521774566618522728">ដំណើរការថ្ងៃនេះ</translation> @@ -1111,6 +1110,7 @@ <translation id="1745732479023874451">គ្រប់គ្រងទំនាក់ទំនង</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{បើក ហើយកែឯកសារ # នៅក្នុងកម្មវិធីលើអ៊ីនធឺណិតនេះឬ?}}</translation> <translation id="1748563609363301860">អ្នកអាចរក្សាទុកពាក្យសម្ងាត់នេះនៅក្នុងគណនី Google របស់អ្នក ឬនៅលើឧបករណ៍នេះតែប៉ុណ្ណោះ</translation> +<translation id="1749645492410897998">កំពុងដំឡើងកម្មវិធី</translation> <translation id="1749733017156547309">តម្រូវឱ្យបញ្ចូលពាក្យសម្ងាត់</translation> <translation id="1750172676754093297">សោសុវត្ថិភាពរបស់អ្នកមិនអាចរក្សាទុកស្នាមម្រាមដៃបានទេ</translation> <translation id="1750238553597293878">បន្តប្រើពាក្យសម្ងាត់នៅក្នុងគណនី Google របស់អ្នក</translation> @@ -1182,7 +1182,6 @@ <translation id="1796460466266263589">ដើម្បីបន្តប្រើ Gemini សូមផ្ទៀងផ្ទាត់ថាជាអ្នក</translation> <translation id="1796588414813960292">មុខងារដែលត្រូវការសំឡេងនឹងមិនដំណើរការទេ</translation> <translation id="1798726622311813209">កាតឥណពន្ធ និងឥណទាន</translation> -<translation id="1799852120691957794">មិនអាចស្ដារវិនដូពីវគ្គមុនរបស់អ្នកបានទេ</translation> <translation id="180203835522132923">Search + O បន្ទាប់មក W</translation> <translation id="1802624026913571222">ដេកនៅពេលបិទគម្រប</translation> <translation id="1802687198411089702">ទំព័រនេះមិនឆ្លើយតបទេ។ អ្នកអាចរង់ចាំឱ្យវាឆ្លើយតប ឬចាកចេញ។</translation> @@ -2379,7 +2378,6 @@ <translation id="2610374175948698697">អាចមើលឯកសារ ឬថតនៅលើឧបករណ៍របស់អ្នក</translation> <translation id="2610780100389066815">ការចុះហត្ថលេខាបញ្ជីទុកចិត្ត Microsoft</translation> <translation id="261114180663074524">ចូលគណនី Microsoft របស់អ្នក រួចព្យាយាមម្ដងទៀត</translation> -<translation id="2611702650078660078">មានបញ្ហាបានកើតឡើង</translation> <translation id="2611776654555141051">ឧបករណ៍បញ្ចូលរាងចតុកោណកែង</translation> <translation id="2611885296070244383">មីក្រូហ្វូន (ខាងក្នុង)</translation> <translation id="2612676031748830579">លេខកាត</translation> @@ -2743,7 +2741,6 @@ <translation id="285033512555869047">បិទ</translation> <translation id="2850541429955027218">បន្ថែមធីម</translation> <translation id="2851291081585704741">អ្នកគ្មានអ៊ីនធឺណិតទេ</translation> -<translation id="2852045827873867442">តម្រូវឱ្យមានការតភ្ជាប់អ៊ីនធឺណិត។</translation> <translation id="285237063405807022">(កំពុងផ្ទុក)</translation> <translation id="2853121255651601031">បានរក្សាទុកពាក្យសម្ងាត់</translation> <translation id="2854453262159518435">ជំនួសក្រុមផ្ទាំងដែលមានស្រាប់</translation> @@ -3608,6 +3605,7 @@ <translation id="3473241910002674503">ចូលទៅទំព័រដើម ថយក្រោយ រួចប្ដូរកម្មវិធីដោយប្រើប៊ូតុងនៅក្នុងមុខងារថេប្លេត។</translation> <translation id="3473479545200714844">ឧបករណ៍ពង្រីកអេក្រង់</translation> <translation id="3474218480460386727">ប្រើ 99 តួ ឬតិចជាងនេះសម្រាប់ពាក្យថ្មី</translation> +<translation id="3474330892505468100">Google Beam with Meet</translation> <translation id="3474624961160222204">បន្តជា <ph name="NAME" /></translation> <translation id="3477772589943384839">ទទួលបានការសន្សំសំចៃអង្គចងចាំមធ្យម។ ផ្ទាំងរបស់អ្នកក្លាយជាអសកម្ម បន្ទាប់ពីរយៈពេលយូរជាងមុន។</translation> <translation id="347785443197175480">បន្តអនុញ្ញាត <ph name="HOST" /> ឲ្យចូលប្រើកាមេរ៉ា និងម៉ៃក្រូហ្វូនរបស់អ្នក</translation> @@ -5496,7 +5494,6 @@ <translation id="4779766576531456629">ប្ដូរឈ្មោះបណ្ដាញចល័ត eSIM</translation> <translation id="4780321648949301421">រក្សាទុកទំព័រជា...</translation> <translation id="4780558987886269159">សម្រាប់ការងារ</translation> -<translation id="4781633367688946589">បន្តទៅវគ្គថ្មី</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> ចង់ប្រើព័ត៌មានផ្ទាល់ខ្លួនពីកាបូបឌីជីថលរបស់អ្នក។</translation> <translation id="4785719467058219317">អ្នកកំពុងប្រើសោសុវត្ថិភាពដែលមិនបានចុះឈ្មោះជាមួយគេហទំព័រនេះ</translation> <translation id="4785914069240823137">បោះបង់ការច្រឹប</translation> @@ -6283,6 +6280,7 @@ <translation id="5337926771328966926">ឈ្មោះឧបករណ៍បច្ចុប្បន្នគឺ <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">អ្នកអាចរុករកជាលក្ខណៈឯកជន ដោយប្រើផ្ទាំងឯកជន</translation> <translation id="5338503421962489998">ឧបករណ៍ផ្ទុកទិន្នន័យមូលដ្ឋាន</translation> +<translation id="5340620183031438925">ដើម្បីសួរមុខងារ AI អំពីផ្ទាំងរបស់អ្នកដោយមិនចាកចេញពីទំព័រ សូមផ្ទៀងផ្ទាត់ថាជាអ្នក។ អ្នកក៏នឹងទទួលបានពាក្យសម្ងាត់របស់អ្នក និងអ្វីៗជាច្រើនទៀតនៅលើឧបករណ៍ទាំងអស់របស់អ្នកផងដែរ។</translation> <translation id="5340787663756381836">&ស្វែងរក រួចកែ</translation> <translation id="5340900621595888432">បញ្ជូនទិន្នន័យប្រើប្រាស់ និងទិន្នន័យវិភាគ</translation> <translation id="5341793073192892252">ខូគីខាងក្រោមត្រូវបានទប់ស្កាត់ (ខូគីភាគីទីបីកំពុងត្រូវបានទប់ស្កាត់ដោយគ្មានការលើកលែង)</translation> @@ -7470,7 +7468,6 @@ <translation id="6180550893222597997">តើកូដសម្ងាត់ណាដែលអ្នកចង់ប្រើសម្រាប់ <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">ជួនកាល កម្មវិធីធ្វើបច្ចុប្បន្នភាពម៉ាករបស់ខ្លួន។ សូមពិនិត្យមើលការផ្លាស់ប្ដូរទាំងអស់ ដើម្បីប្រាកដថាអ្នកមិនមានបញ្ហា មុនពេលធ្វើបច្ចុប្បន្នភាព។</translation> <translation id="6181431612547969857">ការទាញយកត្រូវបានរារាំង</translation> -<translation id="6182100780603067202">ចែករំលែកសំឡេងកម្មវិធី (ពីវិនដូទាំងអស់របស់វា) ផងដែរ</translation> <translation id="6183369864942961155">ទម្រង់រចនាងងឹត/ភ្លឺស្វ័យប្រវត្តិ</translation> <translation id="6183773856988300112">Gemini ក្នុង Chrome ប្រើការរុករកដោយស្វ័យប្រវត្តិ ដើម្បីដំណើរការនៅក្នុងផ្ទាំងរបស់អ្នក និងបំពេញកិច្ចការដែលអ្នកផ្ដល់ឱ្យវា។ <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> <translation id="6184099524311454384">ស្វែងរកផ្ទាំង</translation> @@ -8263,7 +8260,6 @@ <translation id="6754359471209693699">ចាប់ផ្ដើមការស្វែងរកថ្មី</translation> <translation id="6754918760968695779">បញ្ចូលរហ័ស</translation> <translation id="6755702685749429945">បញ្ចូលវចនានុក្រម</translation> -<translation id="6756157672127672536">កម្មវិធី Files ផ្ដល់លទ្ធភាពសម្រាប់ការចូលប្រើប្រាស់រហ័សទៅក្នុងឯកសារ ដែលអ្នកបានរក្សាទុកនៅក្នុង Google ថាស, ទំហំផ្ទុកខាងក្រៅ ឬឧបករណ៍ ChromeOS របស់អ្នក។</translation> <translation id="6756643207511618722">ម៉ាស៊ីនបំប្លែងអត្ថបទទៅជាការនិយាយ</translation> <translation id="6757431299485455321">ជួយឱ្យឧបករណ៍ផ្សេងទៀតរកឃើញហតស្ប៉តនេះ។</translation> <translation id="6758056191028427665">អនុញ្ញាតឱ្យយើងដឹងថា ការបំពេញការងាររបស់យើងដូចម្ដេចដែរ។</translation> @@ -9209,6 +9205,7 @@ <translation id="7406912950279255498">មុខងារបញ្ច្រាសពណ៌</translation> <translation id="7407430846095439694">នាំចូល និងចងភ្ជាប់</translation> <translation id="7407504355934009739">មនុស្សភាគច្រើនទប់ស្កាត់ការជូនដំណឹងពីគេហទំព័រនេះ</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> មានទិន្នន័យរសើប។ ស្ថាប័នរបស់អ្នកនឹងអនុញ្ញាតឱ្យអ្នករក្សាទុកវាទៅទំហំផ្ទុកលើពពក ឬលុបវាចោល</translation> <translation id="7408080603962564527">អ្នកផ្សេងនឹងអាចមើលឃើញវា</translation> <translation id="740810853557944681">បញ្ចូលម៉ាស៊ីនមេបោះពុម្ព</translation> <translation id="7409549334477097887">ធំជាងធម្មតា</translation> @@ -9262,6 +9259,7 @@ <translation id="7434969625063495310">មិនអាចបញ្ចូលម៉ាស៊ីនមេបោះពុម្ពបានទេ។ សូមពិនិត្យការកំណត់រចនាសម្ព័ន្ធរបស់ម៉ាស៊ីនមេ រួចព្យាយាមម្ដងទៀត។</translation> <translation id="7436921188514130341">អូ! មានបញ្ហាពេលកំពុងប្តូរឈ្មោះ។</translation> <translation id="7439519621174723623">បញ្ចូលឈ្មោះឧបករណ៍ ដើម្បីបន្ត</translation> +<translation id="743982235360757672">ធ្វើឱ្យងាយស្រួលចូលប្រើមុខងារ AI នៅពេលអ្នករុករក</translation> <translation id="7441736532026945583">ជ្រើសរើស "លាក់ក្រុម" ដើម្បីដកក្រុមចេញពីរបារផ្ទាំងរបស់អ្នក</translation> <translation id="7441736921018636843">ដើម្បីប្ដូរការកំណត់នេះ <ph name="BEGIN_LINK" />សូមកំណត់សមកាលកម្មឡើងវិញ<ph name="END_LINK" /> ដើម្បីលុបឃ្លាសម្ងាត់សមកាលកម្មរបស់អ្នក</translation> <translation id="7441830548568730290">អ្នកប្រើផ្សេងទៀត</translation> @@ -10000,7 +9998,6 @@ <translation id="794676567536738329">អះអាងការអនុញ្ញាត</translation> <translation id="7947962633355574091">ថតចម្លងអាសយដ្ឋានវីដេអូ</translation> <translation id="7947964080535614577">ជាធម្មតា គេហទំព័របង្ហាញការផ្សាយពាណិជ្ជកម្ម ដើម្បីអាចឱ្យពួកគេផ្ដល់ខ្លឹមសារ ឬសេវាកម្មដោយឥតគិតថ្លៃ។ ប៉ុន្តែគេហទំព័រមួយចំនួនត្រូវបានគេស្គាល់ថា បង្ហាញការផ្សាយពាណិជ្ជកម្មនាំឱ្យយល់ច្រឡំ ឬរំខាន។</translation> -<translation id="7948239795436419268">កុំស្ដារវិនដូ</translation> <translation id="7948407723851303488">ទំព័រទាំងអស់នៃ <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">មូលហេតុ៖ LBS ស្គាល់តែ http://, https:// និង file:// URLs ប៉ុណ្ណោះ។</translation> <translation id="7950814699499457511">បើក • កម្មវិធីបន្ថែមនេះមិនបានបោះផ្សាយការអនុវត្តឯកជនភាព ដូចជារបៀបដែលកម្មវិធីបន្ថែមនេះប្រមូល និងប្រើទិន្នន័យទេ</translation> @@ -11190,7 +11187,6 @@ <translation id="8751034568832412184">សាលារៀន</translation> <translation id="8751329102746373229">ពីអ្នកគ្រប់គ្រងរបស់អ្នក</translation> <translation id="8752451679755290210">ផ្លាស់ទីរវាងធាតុដោយស្វ័យប្រវត្តិ</translation> -<translation id="8753948258138515839">កម្មវិធី Files ផ្ដល់លទ្ធភាពសម្រាប់ការចូលប្រើប្រាស់រហ័សទៅក្នុងឯកសារ ដែលអ្នកបានរក្សាទុកនៅក្នុង Google ថាស, ទំហំផ្ទុកខាងក្រៅ ឬឧបករណ៍ ChromeOS Flex របស់អ្នក។</translation> <translation id="8754200782896249056"><p>នៅពេលដំណើរការ <ph name="PRODUCT_NAME" /> នៅក្នុងបរិស្ថានដេស៍ថបដែលគាំទ្រ ការកំណត់ប្រូកស៊ីប្រព័ន្ធនឹងត្រូវប្រើ។ ប៉ុន្តែទោះជាយ៉ាងណាក៏ដោយ ប្រព័ន្ធរបស់អ្នកអាចមិនគាំទ្រទេ ឫវាមានបញ្ហាពាក់ព័ន្ធនឹងការបើកដំណើរការការកំណត់ប្រព័ន្ធរបស់អ្នក។</p> <p>ប៉ុន្តែអ្នកអាចនៅតែកំណត់តាមរយៈពាក្យបញ្ជា។ សូមមើល <code>man <ph name="PRODUCT_BINARY_NAME" /></code> សម្រាប់ព័ត៌មានបន្ថែមអំពីទង់ និងបំរែបំរួលបរិស្ថាន។</p></translation> @@ -11983,6 +11979,7 @@ <translation id="992778845837390402">បច្ចុប្បន្ននេះ ការបម្រុងទុក Linux កំពុងដំណើរការ</translation> <translation id="994087375490600917">ផ្ទាំងចំហៀង</translation> <translation id="994289308992179865">លូប</translation> +<translation id="995420352808264005">ជ្រើសរើសប្រភេទនៃការចុះឈ្មោះឧបករណ៍</translation> <translation id="995755448277384931">បញ្ចូល IBAN</translation> <translation id="996250603853062861">កំពុងបង្កើតការភ្ជាប់ដែលមានសុវត្ថិភាព...</translation> <translation id="997143476478634194">គេហទំព័រប្រើការកំណត់នេះដោយស្វ័យប្រវត្តិ នៅពេលអ្នកចូលទៅកាន់គេហទំព័រទាំងនោះ។ ជាធម្មតា គេហទំព័រផ្ញើការជូនដំណឹង ដើម្បីជូនដំណឹងដល់អ្នកអំពីព័ត៌មានទាន់ហេតុការណ៍ ឬសារជជែក។</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 3c94ffc..34eff44 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">ಪ್ರಮುಖ ನೋಡ್ ಟಿಪ್ಪಣಿ ಫೈಲ್ಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="1103523840287552314">ಯಾವಾಗಲೂ ಅನುವಾದಿಸಿ <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">ನೀವು ತಕ್ಷಣವೇ ಈ ಟ್ಯಾಬ್ ಗುಂಪಿಗೆ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಕಳೆದುಕೊಳ್ಳುತ್ತೀರಿ ಮತ್ತು ಅದನ್ನು ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಿಂದ ಅಳಿಸಲಾಗುತ್ತದೆ</translation> +<translation id="1105934302947321130">Zoom ನೊಂದಿಗೆ Google Beam</translation> <translation id="1106270460549661906">Gemini ಜೊತೆ ಹಂಚಿಕೊಳ್ಳುವುದನ್ನು ನಿಲ್ಲಿಸಿ</translation> <translation id="1106350001632362876">ಥ್ರೆಶೋಲ್ಡ್ ಅನ್ನು ಹೆಚ್ಚಿಸಿ</translation> <translation id="110850812463801904">OneDrive ಗೆ ಹಸ್ತಚಾಲಿತವಾಗಿ ಕನೆಕ್ಟ್ ಮಾಡಿ</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">ನಿಮ್ಮ ಸುರಕ್ಷತಾ ಕೀಯನ್ನು ಪಿನ್ ಮೂಲಕ ಸಂರಕ್ಷಿಸಿಲ್ಲ. ಸೈನ್-ಇನ್ ಡೇಟಾವನ್ನು ನಿರ್ವಹಿಸಲು, ಮೊದಲು ಪಿನ್ ರಚಿಸಿ.</translation> <translation id="1179400851034021914">IBAN ಅಮಾನ್ಯವಾಗಿದೆ</translation> <translation id="1179902906564467236">ನಿಮ್ಮ ಫೋನ್ನಲ್ಲಿರುವ ಸೂಚನೆಗಳನ್ನು ಅನುಸರಿಸಿ ಅಥವಾ ಕ್ಯಾಮರಾ ಆ್ಯಪ್ ಅನ್ನು ಬಳಸಿ</translation> -<translation id="1180117276105724040">ನಿಮ್ಮ ಹಿಂದಿನ ಸೇಶನ್ನಿಂದ ವಿಂಡೋಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="118057123461613219">ಭಾರಿ ಉಳಿತಾಯಗಳು</translation> <translation id="1181037720776840403">ತೆಗೆದುಹಾಕು</translation> <translation id="1182876754474670069">ಹೋಮ್</translation> @@ -764,7 +764,6 @@ <translation id="151501797353681931">Safari ಯಿಂದ ಆಮದು ಮಾಡಲಾಗಿದೆ</translation> <translation id="1515163294334130951">ಪ್ರಾರಂಭಿಸಿ</translation> <translation id="1517467582299994451">ಕೋಡ್ ಮೂಲಕ ಕ್ಯಾಸ್ಟ್ ಮಾಡಲು, Chrome ಬ್ರೌಸರ್ ಸಿಂಕ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಆನ್ ಮಾಡಿ</translation> -<translation id="1519090060276706457">ವಿಂಡೋಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸುವುದು ನಿರೀಕ್ಷೆಗಿಂತ ಹೆಚ್ಚು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುತ್ತಿದೆ</translation> <translation id="1521442365706402292">ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">ಇಂದು ಸಕ್ರಿಯ</translation> @@ -1105,6 +1104,7 @@ <translation id="1745732479023874451">ಸಂಪರ್ಕಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}one{ಈ ವೆಬ್ ಆ್ಯಪ್ನಲ್ಲಿ # ಫೈಲ್ಗಳನ್ನು ತೆರೆದು, ಎಡಿಟ್ ಮಾಡಬೇಕೇ?}other{ಈ ವೆಬ್ ಆ್ಯಪ್ನಲ್ಲಿ # ಫೈಲ್ಗಳನ್ನು ತೆರೆದು, ಎಡಿಟ್ ಮಾಡಬೇಕೇ?}}</translation> <translation id="1748563609363301860">ನೀವು ಈ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಿಮ್ಮ Google ಖಾತೆ ಅಥವಾ ಈ ಸಾಧನದಲ್ಲಿ ಮಾತ್ರ ಉಳಿಸಬಹುದು</translation> +<translation id="1749645492410897998">ಸಾಫ್ಟ್ವೇರ್ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation> <translation id="1749733017156547309">ಪಾಸ್ವರ್ಡ್ ಅಗತ್ಯವಿದೆ</translation> <translation id="1750172676754093297">ನಿಮ್ಮ ಭದ್ರತಾ ಕೀಯಲ್ಲಿ ಫಿಂಗರ್ಪ್ರಿಂಟ್ಗಳನ್ನು ಸಂಗ್ರಹಣೆ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="1750238553597293878">ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿರುವ ಪಾಸ್ವರ್ಡ್ಗಳ ಬಳಕೆಯನ್ನು ಮುಂದುವರಿಸಿ</translation> @@ -1176,7 +1176,6 @@ <translation id="1796460466266263589">Gemini ಬಳಸುವುದನ್ನು ಮುಂದುವರಿಸಲು, ಇದು ನೀವೇ ಎಂಬುದನ್ನು ದೃಢೀಕರಿಸಿ</translation> <translation id="1796588414813960292">ಧ್ವನಿಯ ಅಗತ್ಯವಿರುವ ಫೀಚರ್ಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸುವುದಿಲ್ಲ</translation> <translation id="1798726622311813209">ಕ್ರೆಡಿಟ್ ಮತ್ತು ಡೆಬಿಟ್ ಕಾರ್ಡ್ಗಳು</translation> -<translation id="1799852120691957794">ನಿಮ್ಮ ಹಿಂದಿನ ಸೆಶನ್ನಿಂದ ವಿಂಡೋಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="180203835522132923">Search + O, ನಂತರ W</translation> <translation id="1802624026913571222">ಕವರ್ ಮುಚ್ಚಿದಾಗ ಸ್ಲೀಪ್ ಮೋಡ್ಗೆ ಬದಲಿಸಿ</translation> <translation id="1802687198411089702">ಪುಟವು ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ. ನೀವು ಅದಕ್ಕಾಗಿ ಕಾಯಬಹುದು ಅಥವಾ ನಿರ್ಗಮಿಸಬಹುದು.</translation> @@ -2372,7 +2371,6 @@ <translation id="2610374175948698697">ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಫೈಲ್ಗಳು ಅಥವಾ ಫೋಲ್ಡರ್ಗಳನ್ನು ವೀಕ್ಷಿಸಬಹುದು</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">ನಿಮ್ಮ Microsoft ಖಾತೆಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ ಮತ್ತು ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ</translation> -<translation id="2611702650078660078">ದೋಷ ಸಂಭವಿಸಿದೆ</translation> <translation id="2611776654555141051">ಆಯತ ಟೂಲ್</translation> <translation id="2611885296070244383">ಮೈಕ್ (ಆಂತರಿಕ)</translation> <translation id="2612676031748830579">ಕಾರ್ಡ್ ಸಂಖ್ಯೆ</translation> @@ -2736,7 +2734,6 @@ <translation id="285033512555869047">ಮುಚ್ಚಿದೆ</translation> <translation id="2850541429955027218">ಥೀಮ್ ಸೇರಿಸು</translation> <translation id="2851291081585704741">ನೀವು ಆಫ್ಲೈನ್ನಲ್ಲಿದ್ದೀರಿ</translation> -<translation id="2852045827873867442">ಇಂಟರ್ನೆಟ್ ಕನೆಕ್ಷನ್ ಅಗತ್ಯವಿದೆ.</translation> <translation id="285237063405807022">(ಲೋಡ್ ಆಗುತ್ತಿದೆ)</translation> <translation id="2853121255651601031">ಪಾಸ್ವರ್ಡ್ ಸೇವ್ ಮಾಡಲಾಗಿದೆ</translation> <translation id="2854453262159518435">ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಟ್ಯಾಬ್ ಗುಂಪನ್ನು ಬದಲಾಯಿಸಿ</translation> @@ -3601,6 +3598,7 @@ <translation id="3473241910002674503">ಟ್ಯಾಬ್ಲೆಟ್ ಮೋಡ್ನಲ್ಲಿ, ಹೋಮ್ಗೆ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಲು, ಹಿಂತಿರುಗಲು ಮತ್ತು ಆ್ಯಪ್ಗಳನ್ನು ಬದಲಾಯಿಸಲು ಬಟನ್ಗಳನ್ನು ಬಳಸಿ.</translation> <translation id="3473479545200714844">ಸ್ಕ್ರೀನ್ ವರ್ಧಕ</translation> <translation id="3474218480460386727">ಹೊಸ ಪದಗಳಿಗಾಗಿ 99 ಅಥವಾ ಕಡಿಮೆ ಅಕ್ಷರಗಳನ್ನು ಬಳಸಿ</translation> +<translation id="3474330892505468100">Meet ನೊಂದಿಗೆ Google Beam</translation> <translation id="3474624961160222204"><ph name="NAME" /> ನಂತೆ ಮುಂದುವರಿಸಿ</translation> <translation id="3477772589943384839">ಮಧ್ಯಮ ಮೆಮೊರಿ ಉಳಿತಾಯವನ್ನು ಪಡೆಯಿರಿ. ದೀರ್ಘಾವಧಿಯ ನಂತರ ನಿಮ್ಮ ಟ್ಯಾಬ್ಗಳು ನಿಷ್ಕ್ರಿಯವಾಗುತ್ತವೆ.</translation> <translation id="347785443197175480">ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಹಾಗೂ ಮೈಕ್ರೋಫೋನ್ ಅನ್ನು ಪ್ರವೇಶಿಸಲು <ph name="HOST" /> ಗೆ ಅನುಮತಿಸುವುದನ್ನು ಮುಂದುವರೆಸಿ</translation> @@ -5490,7 +5488,6 @@ <translation id="4779766576531456629">eSIM ಸೆಲ್ಯುಲಾರ್ ನೆಟ್ವರ್ಕ್ ಅನ್ನು ಮರುಹೆಸರಿಸಿ</translation> <translation id="4780321648949301421">ಇದರಂತೆ ಪುಟವನ್ನು ಉಳಿಸು...</translation> <translation id="4780558987886269159">ಉದ್ಯೋಗಕ್ಕಾಗಿ</translation> -<translation id="4781633367688946589">ಹೊಸ ಸೆಶನ್ಗೆ ಮುಂದುವರಿಯಿರಿ</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> ನಿಮ್ಮ ಡಿಜಿಟಲ್ ವಾಲೆಟ್ನಿಂದ ವೈಯಕ್ತಿಕ ಮಾಹಿತಿಯನ್ನು ಬಳಸಲು ಬಯಸುತ್ತದೆ.</translation> <translation id="4785719467058219317">ಈ ವೆಬ್ಸೈಟ್ನೊಂದಿಗೆ ನೋಂದಾಯಿಸಿಲ್ಲದ ಭದ್ರತೆ ಕೀಯನ್ನು ನೀವು ಬಳಸುತ್ತಿದ್ದೀರಿ</translation> <translation id="4785914069240823137">ಕ್ರಾಪ್ ರದ್ದುಮಾಡಿ</translation> @@ -6278,6 +6275,7 @@ <translation id="5337926771328966926">ಪ್ರಸ್ತುತ ಸಾಧನದ ಹೆಸರು <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">ಅಜ್ಞಾತ ವಿಂಡೋವನ್ನು ಬಳಸಿಕೊಂಡು ನೀವು ಖಾಸಗಿಯಾಗಿ ಬ್ರೌಸ್ ಮಾಡಬಹುದು</translation> <translation id="5338503421962489998">ಸ್ಥಳೀಯ ಸಂಗ್ರಹಣೆ</translation> +<translation id="5340620183031438925">ಪುಟವನ್ನು ತೊರೆಯದೆಯೇ ನಿಮ್ಮ ಟ್ಯಾಬ್ ಕುರಿತು AI ಮೋಡ್ ಅನ್ನು ಕೇಳಲು, ಇದು ನೀವೇ ಎಂದು ದೃಢೀಕರಿಸಿ. ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳು ಮತ್ತು ಇತ್ಯಾದಿಗಳನ್ನು ನೀವು ಪಡೆಯುತ್ತೀರಿ.</translation> <translation id="5340787663756381836">&ಹುಡುಕಿ ಹಾಗೂ ಎಡಿಟ್ ಮಾಡಿ</translation> <translation id="5340900621595888432">ಡಯಾಗ್ನಾಸ್ಟಿಕ್ ಮತ್ತು ಬಳಕೆಯ ಡೇಟಾವನ್ನು ಕಳುಹಿಸಿ</translation> <translation id="5341793073192892252">ಕೆಳಗಿನ ಕುಕೀಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ (ಮೂರನೇ-ಪಾರ್ಟಿ ಕುಕೀಗಳನ್ನು ಹೊರತುಪಡಿಸದೇ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ)</translation> @@ -7465,7 +7463,6 @@ <translation id="6180550893222597997"><ph name="APP_NAME" /> ಗಾಗಿ ನೀವು ಯಾವ ಪಾಸ್ಕೀಯನ್ನು ಬಳಸಲು ಬಯಸುತ್ತೀರಿ?</translation> <translation id="6181218116951226898">ಆ್ಯಪ್ಗಳು ಕೆಲವೊಮ್ಮೆ ತಮ್ಮ ಬ್ರ್ಯಾಂಡಿಂಗ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡುತ್ತವೆ. ಅಪ್ಡೇಟ್ ಮಾಡುವ ಮೊದಲು, ನೀವು ಅವುಗಳಿಂದ ತೃಪ್ತರಾಗಿದ್ದೀರಿ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಎಲ್ಲಾ ಬದಲಾವಣೆಗಳನ್ನು ಪರಿಶೀಲಿಸಿ.</translation> <translation id="6181431612547969857">ಡೌನ್ಲೋಡ್ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation> -<translation id="6182100780603067202">ಆ್ಯಪ್ ಆಡಿಯೋವನ್ನು ಸಹ ಹಂಚಿಕೊಳ್ಳಿ (ಅದರ ಎಲ್ಲಾ ವಿಂಡೋಗಳಿಂದ)</translation> <translation id="6183369864942961155">ಸ್ವಯಂಚಾಲಿತ ಲೈಟ್/ಡಾರ್ಕ್ ಥೀಮ್</translation> <translation id="6183773856988300112">Chrome ನಲ್ಲಿ Gemini ನಿಮ್ಮ ಟ್ಯಾಬ್ಗಳಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸಲು ಮತ್ತು ನೀವು ಅದಕ್ಕೆ ನೀಡುವ ಕಾರ್ಯಗಳನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು ಆಟೋ ಬ್ರೌಸ್ ಅನ್ನು ಬಳಸುತ್ತದೆ. <ph name="LINK_BEGIN" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LINK_END" /></translation> <translation id="6184099524311454384">ಟ್ಯಾಬ್ಗಳನ್ನು ಹುಡುಕಿ</translation> @@ -8260,7 +8257,6 @@ <translation id="6754359471209693699">ಹೊಸ ಹುಡುಕಾಟವನ್ನು ಪ್ರಾರಂಭಿಸಿ</translation> <translation id="6754918760968695779">ಕ್ವಿಕ್ ಇನ್ಸರ್ಟ್</translation> <translation id="6755702685749429945">ನಿಘಂಟನ್ನು ಸೇರಿಸಿ</translation> -<translation id="6756157672127672536">ನೀವು Google Drive, ಬಾಹ್ಯ ಸಂಗ್ರಹಣೆ ಅಥವಾ ನಿಮ್ಮ ChromeOS ಸಾಧನದಲ್ಲಿ ಉಳಿಸಿರುವ ಫೈಲ್ಗಳಿಗೆ Files ಆ್ಯಪ್ ತ್ವರಿತ ಆ್ಯಕ್ಸೆಸ್ ಒದಗಿಸುತ್ತದೆ.</translation> <translation id="6756643207511618722">ಧ್ವನಿ ಎಂಜಿನ್ಗಳು</translation> <translation id="6757431299485455321">ಈ ಹಾಟ್ಸ್ಪಾಟ್ ಹುಡುಕಲು ಇತರ ಸಾಧನಗಳಿಗೆ ಸಹಾಯ ಮಾಡಿ.</translation> <translation id="6758056191028427665">ನಮ್ಮ ಕೆಲಸದ ಕುರಿತು ನಿಮ್ಮ ಅಭಿಪ್ರಾಯವನ್ನು ತಿಳಿಸಿ.</translation> @@ -9208,6 +9204,7 @@ <translation id="7406912950279255498">ಬಣ್ಣ ವಿಲೋಮದ ಮೋಡ್</translation> <translation id="7407430846095439694">ಆಮದು ಮಾಡಿ ಮತ್ತು ಬೈಂಡ್ ಮಾಡಿ</translation> <translation id="7407504355934009739">ಬಹುತೇಕ ಜನರು ಈ ಸೈಟ್ನ ಅಧಿಸೂಚನೆಗಳನ್ನು ನಿರ್ಬಂಧಿಸುತ್ತಾರೆ</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> ಸೂಕ್ಷ್ಮವಾದ ವೈಯಕ್ತಿಕ ಡೇಟಾವನ್ನು ಹೊಂದಿದೆ. ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ಅದನ್ನು ಕ್ಲೌಡ್ ಸಂಗ್ರಹಣೆಯಲ್ಲಿ ಸೇವ್ ಮಾಡಲು ಅಥವಾ ತ್ಯಜಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ</translation> <translation id="7408080603962564527">ಇದು ಇತರರಿಗೆ ಗೋಚರಿಸುತ್ತದೆ</translation> <translation id="740810853557944681">ಪ್ರಿಂಟ್ ಸರ್ವರ್ ಒಂದನ್ನು ಸೇರಿಸಿ</translation> <translation id="7409549334477097887">ತುಂಬಾ ದೊಡ್ಡದು</translation> @@ -9260,6 +9257,7 @@ <translation id="7434969625063495310">ಪ್ರಿಂಟ್ ಸರ್ವರ್ ಅನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಸರ್ವರ್ನ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ ಮತ್ತು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="7436921188514130341">ಓಹ್, ಹೋಯ್ತು! ಮರುಹೆಸರಿಸುವ ಸಂದರ್ಭದಲ್ಲಿ ದೋಷ ಕಂಡುಬಂದಿದೆ.</translation> <translation id="7439519621174723623">ಮುಂದುವರಿಸಲು ಸಾಧನದ ಹೆಸರನ್ನು ಸೇರಿಸಿ</translation> +<translation id="743982235360757672">ನೀವು ಬ್ರೌಸ್ ಮಾಡುವಾಗ AI ಮೋಡ್ ಅನ್ನು ಸಮೀಪದಲ್ಲಿ ಇರಿಸಿ</translation> <translation id="7441736532026945583">ನಿಮ್ಮ ಟ್ಯಾಬ್ ಸ್ಟ್ರೈಪ್ನಿಂದ ಗುಂಪನ್ನು ತೆಗೆದುಹಾಕಲು "ಗುಂಪನ್ನು ಮರೆಮಾಡಿ" ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="7441736921018636843">ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬದಲಾಯಿಸಲು, ನಿಮ್ಮ ಸಿಂಕ್ ಪಾಸ್ಫ್ರೇಸ್ ಅನ್ನು ತೆಗೆದುಹಾಕಲು <ph name="BEGIN_LINK" />ಸಿಂಕ್ ಮರುಹೊಂದಿಸಿ<ph name="END_LINK" /></translation> <translation id="7441830548568730290">ಇತರ ಬಳಕೆದಾರರು</translation> @@ -9998,7 +9996,6 @@ <translation id="794676567536738329">ಅನುಮತಿಗಳನ್ನು ದೃಡೀಕರಿಸಿ</translation> <translation id="7947962633355574091">ವೀಡಿಯೋ ವಿಳಾಸ ನ&ಕಲಿಸಿ</translation> <translation id="7947964080535614577">ಕಂಟೆಂಟ್ ಅಥವಾ ಸೇವೆಗಳನ್ನು ಉಚಿತವಾಗಿ ಒದಗಿಸುವ ಸಲುವಾಗಿ ಸೈಟ್ಗಳು ಸಾಮಾನ್ಯವಾಗಿ ಜಾಹೀರಾತುಗಳನ್ನು ತೋರಿಸುತ್ತವೆ. ಆದರೆ, ಕೆಲವು ಸೈಟ್ಗಳು ಅನಪೇಕ್ಷಿತ ಅಥವಾ ದಾರಿತಪ್ಪಿಸುವ ಜಾಹೀರಾತುಗಳನ್ನು ತೋರಿಸುವ ಸಾಧ್ಯತೆಯಿರುತ್ತದೆ.</translation> -<translation id="7948239795436419268">ವಿಂಡೋಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸಬೇಡಿ</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" /> ನ ಎಲ್ಲಾ ಪುಟಗಳು</translation> <translation id="7950629216186736592">ಕಾರಣ: LBS http://, https://, and file:// URLs ಅನ್ನು ಮಾತ್ರ ಬೆಂಬಲಿಸುತ್ತದೆ.</translation> <translation id="7950814699499457511">ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ • ಈ ಎಕ್ಸ್ಟೆನ್ಶನ್ ಡೇಟಾವನ್ನು ಹೇಗೆ ಸಂಗ್ರಹಿಸುತ್ತದೆ ಮತ್ತು ಬಳಸುತ್ತದೆ ಎಂಬಂತಹ ಗೌಪ್ಯತೆಯ ರೂಢಿಗಳನ್ನು ಪ್ರಕಟಿಸಿಲ್ಲ</translation> @@ -11184,7 +11181,6 @@ <translation id="8751034568832412184">ಶಾಲೆ</translation> <translation id="8751329102746373229">ನಿಮ್ಮ ನಿರ್ವಾಹಕರಿಂದ</translation> <translation id="8752451679755290210">ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಐಟಂಗಳ ನಡುವೆ ಸರಿಸಿ</translation> -<translation id="8753948258138515839">ನೀವು Google Drive, ಬಾಹ್ಯ ಸಂಗ್ರಹಣೆ ಅಥವಾ ನಿಮ್ಮ ChromeOS Flex ಸಾಧನದಲ್ಲಿ ಉಳಿಸಿರುವ ಫೈಲ್ಗಳಿಗೆ Files ಆ್ಯಪ್ ತ್ವರಿತ ಆ್ಯಕ್ಸೆಸ್ ಒದಗಿಸುತ್ತದೆ.</translation> <translation id="8754200782896249056"><p>ಬೆಂಬಲಿತ ಡೆಸ್ಕ್ಟಾಪ್ ಪರಿಸರದ ಅಡಿಯಲ್ಲಿ <ph name="PRODUCT_NAME" /> ಅನ್ನು ರನ್ ಮಾಡುವಾಗ, ಸಿಸ್ಟಂನ ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬಳಸಲಾಗುತ್ತದೆ. ಆದಾಗ್ಯೂ ನಿಮ್ಮ ಸಿಸ್ಟಂಗೆ ಬೆಂಬಲ ಸಿಗುತ್ತಿಲ್ಲ ಇಲ್ಲವೇ ನಿಮ್ಮ ಸಿಸ್ಟಂ ಕಾನ್ಫಿಗರೇಶನ್ ಪ್ರಾರಂಭಿಸುವಲ್ಲಿ ಸಮಸ್ಯೆ ಇದೆ.</p> <p>ಆದರೆ ಕಮಾಂಡ್ ಸಾಲಿನ ಮೂಲಕ ನೀವು ಇನ್ನೂ ಕಾನ್ಫಿಗರ್ ಮಾಡಬಹುದಾಗಿದೆ. ಫ್ಲ್ಯಾಗ್ಗಳು ಮತ್ತು ಪರಿಸರ ವೇರಿಯಬಲ್ಗಳ ಕುರಿತ ಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ ದಯವಿಟ್ಟು <code>ಕೈಪಿಡಿ <ph name="PRODUCT_BINARY_NAME" /></code> ಅನ್ನು ವೀಕ್ಷಿಸಿ.</p></translation> @@ -11979,6 +11975,7 @@ <translation id="992778845837390402">ಪ್ರಸ್ತುತವಾಗಿ Linux ಬ್ಯಾಕಪ್ ಪ್ರಗತಿಯಲ್ಲಿದೆ</translation> <translation id="994087375490600917">ಸೈಡ್ ಪ್ಯಾನೆಲ್ಗಳು</translation> <translation id="994289308992179865">&ಲೂಪ್</translation> +<translation id="995420352808264005">ಸಾಧನ ನೋಂದಣಿ ಪ್ರಕಾರವನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="995755448277384931">IBAN ಅನ್ನು ಸೇರಿಸಿ</translation> <translation id="996250603853062861">ಸುರಕ್ಷಿತ ಸಂಪರ್ಕವನ್ನು ಸ್ಥಾಪಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="997143476478634194">ನೀವು ಸೈಟ್ಗಳಿಗೆ ಭೇಟಿ ನೀಡಿದಾಗ, ಅವು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಅನುಸರಿಸುತ್ತವೆ. ಸ್ಫೋಟಕ ಸುದ್ದಿಗಳು ಅಥವಾ ಚಾಟ್ ಸಂದೇಶಗಳ ಕುರಿತು ನಿಮಗೆ ತಿಳಿಸುವುದಕ್ಕಾಗಿ ಸೈಟ್ಗಳು ಸಾಮಾನ್ಯವಾಗಿ ಅಧಿಸೂಚನೆಗಳನ್ನು ಕಳುಹಿಸುತ್ತವೆ.</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 6de7adae..13f9e87 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">기본 노드 사이트설정 파일을 다운로드할 수 없습니다. 나중에 다시 시도해 주세요.</translation> <translation id="1103523840287552314"><ph name="LANGUAGE" /> 항상 번역</translation> <translation id="1104098698795583187">이 탭 그룹에 대한 액세스 권한을 즉시 잃게 되며 탭 그룹이 모든 기기에서 삭제됩니다.</translation> +<translation id="1105934302947321130">Google Beam with Zoom</translation> <translation id="1106270460549661906">Gemini와 공유 해제</translation> <translation id="1106350001632362876">기준 높이기</translation> <translation id="110850812463801904">수동으로 OneDrive에 연결</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">보안 키가 PIN으로 보호되어 있지 않습니다. 로그인 데이터를 관리하려면 PIN을 만드세요.</translation> <translation id="1179400851034021914">IBAN이 잘못되었습니다.</translation> <translation id="1179902906564467236">휴대전화의 안내를 따르거나 카메라 앱을 사용하세요.</translation> -<translation id="1180117276105724040">이전 세션의 창을 복원 중…</translation> <translation id="118057123461613219">메모리 최대 절약</translation> <translation id="1181037720776840403">삭제</translation> <translation id="1182876754474670069">Home</translation> @@ -762,7 +762,6 @@ <translation id="151501797353681931">Safari에서 가져온 북마크</translation> <translation id="1515163294334130951">실행</translation> <translation id="1517467582299994451">코드로 전송하려면 Chrome 브라우저 동기화 설정을 사용 설정하세요.</translation> -<translation id="1519090060276706457">창 복원이 예상보다 오래 걸림</translation> <translation id="1521442365706402292">인증서 관리</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">오늘 사용</translation> @@ -1111,6 +1110,7 @@ <translation id="1745732479023874451">연락처 관리</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{이 웹 앱에서 # 파일을 열고 수정하시겠습니까?}}</translation> <translation id="1748563609363301860">이 비밀번호는 Google 계정이나 이 기기에만 저장할 수 있습니다.</translation> +<translation id="1749645492410897998">소프트웨어 설치 중</translation> <translation id="1749733017156547309">비밀번호를 입력해야 합니다.</translation> <translation id="1750172676754093297">보안 키에 지문을 저장할 수 없습니다.</translation> <translation id="1750238553597293878">Google 계정의 비밀번호를 계속 사용하세요.</translation> @@ -1182,7 +1182,6 @@ <translation id="1796460466266263589">계속 Gemini를 사용하려면 본인 인증을 진행하세요</translation> <translation id="1796588414813960292">소리가 필요한 기능이 작동하지 않습니다</translation> <translation id="1798726622311813209">신용카드 및 체크카드</translation> -<translation id="1799852120691957794">이전 세션의 창을 복원할 수 없음</translation> <translation id="180203835522132923">검색 + O를 누른 후 W</translation> <translation id="1802624026913571222">커버를 닫으면 절전 모드 진입</translation> <translation id="1802687198411089702">페이지가 응답하지 않습니다. 페이지가 응답할 때까지 기다리거나 종료할 수 있습니다.</translation> @@ -2381,7 +2380,6 @@ <translation id="2610374175948698697">기기에 있는 파일 또는 폴더를 볼 수 있음</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">Microsoft 계정에 로그인한 후 다시 시도해 보세요</translation> -<translation id="2611702650078660078">오류가 발생했습니다</translation> <translation id="2611776654555141051">직사각형 도구</translation> <translation id="2611885296070244383">마이크(내부)</translation> <translation id="2612676031748830579">카드 번호</translation> @@ -2745,7 +2743,6 @@ <translation id="285033512555869047">닫힘</translation> <translation id="2850541429955027218">테마 추가</translation> <translation id="2851291081585704741">오프라인 상태입니다</translation> -<translation id="2852045827873867442">인터넷 연결이 필요합니다</translation> <translation id="285237063405807022">(로드 중)</translation> <translation id="2853121255651601031">비밀번호 저장됨</translation> <translation id="2854453262159518435">기존 탭 그룹 바꾸기</translation> @@ -3612,6 +3609,7 @@ <translation id="3473241910002674503">태블릿 모드에서 버튼을 사용하여 홈이나 뒤로 이동하고 앱 간에 전환합니다.</translation> <translation id="3473479545200714844">화면 돋보기</translation> <translation id="3474218480460386727">새 단어는 99자 이하(영문 기준)여야 합니다.</translation> +<translation id="3474330892505468100">Google Beam with Meet</translation> <translation id="3474624961160222204"><ph name="NAME" /> 계정으로 계속</translation> <translation id="3477772589943384839">메모리를 적당히 절약할 수 있습니다. 좀 더 긴 시간이 지나면 탭이 비활성화됩니다.</translation> <translation id="347785443197175480"><ph name="HOST" />에서 카메라와 마이크에 액세스하도록 계속 허용</translation> @@ -5498,7 +5496,6 @@ <translation id="4779766576531456629">eSIM 셀룰러 네트워크 이름 바꾸기</translation> <translation id="4780321648949301421">페이지를 다른 이름으로 저장...</translation> <translation id="4780558987886269159">업무용</translation> -<translation id="4781633367688946589">새 세션으로 계속</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" />에서 디지털 지갑의 개인 정보를 사용하려고 합니다.</translation> <translation id="4785719467058219317">이 웹사이트에 등록되지 않은 보안 키를 사용하고 있습니다.</translation> <translation id="4785914069240823137">자르기 취소</translation> @@ -6287,6 +6284,7 @@ <translation id="5337926771328966926">현재 기기 이름: <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">시크릿 창을 사용하면 비공개로 탐색할 수 있습니다.</translation> <translation id="5338503421962489998">로컬 저장소</translation> +<translation id="5340620183031438925">페이지를 나가지 않고 탭에 관해 AI 모드에게 물어보려면 본인 인증을 진행하세요. 이렇게 하면 이용 중인 모든 기기에서 비밀번호 등도 사용할 수 있습니다.</translation> <translation id="5340787663756381836">찾기 및 수정하기(&F)</translation> <translation id="5340900621595888432">진단 및 사용 데이터 전송</translation> <translation id="5341793073192892252">다음 쿠키가 차단됨(타사 쿠키는 예외 없이 차단됨)</translation> @@ -7473,7 +7471,6 @@ <translation id="6180550893222597997"><ph name="APP_NAME" />에 어떤 패스키를 사용하시겠습니까?</translation> <translation id="6181218116951226898">앱에서 브랜딩을 업데이트하는 경우가 있습니다. 업데이트 전에 모든 변경사항을 검토해 변경사항이 적용되어도 괜찮은지 확인하세요.</translation> <translation id="6181431612547969857">다운로드 차단됨</translation> -<translation id="6182100780603067202">모든 창에서 애플리케이션 오디오도 공유</translation> <translation id="6183369864942961155">밝은 테마/어두운 테마 자동 전환</translation> <translation id="6183773856988300112">Chrome의 Gemini는 자동 탐색을 사용하여 탭에서 작동하고 사용자가 지정한 작업을 완료합니다. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> <translation id="6184099524311454384">탭 검색</translation> @@ -8266,7 +8263,6 @@ <translation id="6754359471209693699">새 검색 시작</translation> <translation id="6754918760968695779">빠른 입력</translation> <translation id="6755702685749429945">사전 추가</translation> -<translation id="6756157672127672536">파일 앱을 사용하면 Google Drive, 외부 저장소, ChromeOS 기기에 저장한 파일에 신속하게 액세스할 수 있습니다.</translation> <translation id="6756643207511618722">음성 엔진</translation> <translation id="6757431299485455321">다른 기기가 이 핫스팟을 찾도록 돕습니다.</translation> <translation id="6758056191028427665">개선할 점이나 격려하고 싶은 점을 알려주세요.</translation> @@ -9213,6 +9209,7 @@ <translation id="7406912950279255498">색상 반전 모드</translation> <translation id="7407430846095439694">가져오기 및 연결</translation> <translation id="7407504355934009739">대부분의 사용자가 이 사이트의 알림을 차단합니다.</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" />에 민감한 정보가 있습니다. 조직에서 클라우드 스토리지에 저장하거나 삭제하도록 허용합니다.</translation> <translation id="7408080603962564527">다른 사용자에게 표시됩니다.</translation> <translation id="740810853557944681">인쇄 서버 추가</translation> <translation id="7409549334477097887">아주 크게</translation> @@ -9265,6 +9262,7 @@ <translation id="7434969625063495310">인쇄 서버를 추가할 수 없습니다. 서버 설정을 확인하고 다시 시도해 보세요.</translation> <translation id="7436921188514130341">이름 변경 중에 오류가 발생했습니다.</translation> <translation id="7439519621174723623">계속하려면 기기 이름을 추가하세요.</translation> +<translation id="743982235360757672">탐색할 때 AI 모드에 언제나 손쉽게 액세스하세요</translation> <translation id="7441736532026945583">'그룹 숨기기'를 선택하여 탭 표시줄에서 그룹을 삭제합니다.</translation> <translation id="7441736921018636843">이 설정을 변경하려면 <ph name="BEGIN_LINK" />동기화를 재설정<ph name="END_LINK" />하여 동기화 암호를 삭제하세요.</translation> <translation id="7441830548568730290">다른 사용자</translation> @@ -10003,7 +10001,6 @@ <translation id="794676567536738329">권한 확인</translation> <translation id="7947962633355574091">동영상 주소 복사(&O)</translation> <translation id="7947964080535614577">사이트에서는 일반적으로 콘텐츠나 서비스를 무료로 제공하기 위해 광고를 표시합니다. 그러나 일부 사이트는 방해가 되거나 사용자를 현혹하는 광고를 표시하는 것으로 알려져 있습니다.</translation> -<translation id="7948239795436419268">창 복원 안함</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" />의 모든 페이지</translation> <translation id="7950629216186736592">이유: LBS는 http://, https:// 및 file:// URL만 지원합니다.</translation> <translation id="7950814699499457511">사용 • 이 확장 프로그램은 데이터 수집 및 사용 방식과 같은 개인 정보 보호 관행을 게시하지 않았습니다.</translation> @@ -11192,7 +11189,6 @@ <translation id="8751034568832412184">학교</translation> <translation id="8751329102746373229">관리자 제공 인증서</translation> <translation id="8752451679755290210">항목 간 자동 이동</translation> -<translation id="8753948258138515839">파일 앱을 사용하면 Google 드라이브, 외부 저장소, ChromeOS Flex 기기에 저장한 파일에 신속하게 액세스할 수 있습니다.</translation> <translation id="8754200782896249056"><p>지원되는 데스크톱 환경에서 <ph name="PRODUCT_NAME" />을(를) 실행하는 경우 시스템 프록시 설정이 사용됩니다. 하지만 시스템이 지원되지 않거나 시스템 설정을 실행하는 데 문제가 있었습니다.</p> <p>이 경우 명령줄을 사용하여 설정할 수 있습니다. 플래그와 환경 변수에 대한 자세한 내용은 <code>man <ph name="PRODUCT_BINARY_NAME" /></code>을(를) 참조하세요.</p></translation> @@ -11985,6 +11981,7 @@ <translation id="992778845837390402">현재 Linux 백업이 진행 중입니다.</translation> <translation id="994087375490600917">측면 패널</translation> <translation id="994289308992179865">연속 재생(&L)</translation> +<translation id="995420352808264005">기기 등록 유형 선택</translation> <translation id="995755448277384931">IBAN 추가</translation> <translation id="996250603853062861">안전한 연결 설정 중...</translation> <translation id="997143476478634194">사이트를 방문할 때 사이트에서 자동으로 이 설정을 따릅니다. 사이트에서는 보통 속보 또는 채팅 메시지에 관한 알림을 전송합니다.</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index 351582d..6fcf0cec 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Негизги түйүндүн аннотация файлдары жүктөлгөн жок. Кийинчерээк кайталап көрүңүз.</translation> <translation id="1103523840287552314"><ph name="LANGUAGE" /> тилин ар дайым которуу</translation> <translation id="1104098698795583187">Сиз дароо бул өтмөктөр тобуна кирүү мүмкүнчүлүгүн жоготуп, ал бардык түзмөктөрүңүздөн жок кылынат</translation> +<translation id="1105934302947321130">Zoom менен Google Beam</translation> <translation id="1106270460549661906">Gemini менен бөлүшүүнү токтотуу</translation> <translation id="1106350001632362876">Босого маанисин жогорулатуу</translation> <translation id="110850812463801904">OneDrive'га кол менен туташуу</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Коопсуздук ачкычы PIN код менен корголгон эмес. Кирүү дайындарын башкаруу үчүн, адегенде PIN код тузуңуз.</translation> <translation id="1179400851034021914">IBAN коду жараксыз</translation> <translation id="1179902906564467236">Телефонуңуздагы нускамаларды аткарып же камера колдонмосун пайдаланыңыз</translation> -<translation id="1180117276105724040">Мурунку сеансыңыздагы терезелер калыбына келтирилүүдө...</translation> <translation id="118057123461613219">Өтө чоң үнөмдөөлөр</translation> <translation id="1181037720776840403">Алып салуу</translation> <translation id="1182876754474670069">Home</translation> @@ -762,7 +762,6 @@ <translation id="151501797353681931">Safari'ден импорттолгон</translation> <translation id="1515163294334130951">Ишке киргизүү</translation> <translation id="1517467582299994451">Код менен тышкы экранга чыгаруу үчүн Chrome серепчисинин шайкештирүү параметрлерин күйгүзүңүз</translation> -<translation id="1519090060276706457">Терезелерди калыбына келтирүү күтүлгөндөн узакка созулуп жатат</translation> <translation id="1521442365706402292">Тастыктамаларды башкаруу</translation> <translation id="1521655867290435174">Google Таблицалары</translation> <translation id="1521774566618522728">Соңку аракеттер: бүгүн</translation> @@ -1111,6 +1110,7 @@ <translation id="1745732479023874451">Байланыштарды башкаруу</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{# файлды ушул веб-колдонмодо ачып, түзөтөсүзбү?}}</translation> <translation id="1748563609363301860">Бул сырсөздү Google аккаунтуңузда же ушул түзмөктө гана сактап койсоңуз болот</translation> +<translation id="1749645492410897998">Программа орнотулууда</translation> <translation id="1749733017156547309">Сырсөз талап кылынат</translation> <translation id="1750172676754093297">Коопсуздук ачкычыңызда манжаларыңыздын издерин сактоого болбойт</translation> <translation id="1750238553597293878">Google аккаунтуңуздагы сырсөздөрдү колдоно бериңиз</translation> @@ -1182,7 +1182,6 @@ <translation id="1796460466266263589">Gemini'ды колдонуу үчүн бул сиз экениңизди ырастаңыз</translation> <translation id="1796588414813960292">Добушту колдонгон функциялар иштебей калат</translation> <translation id="1798726622311813209">Насыя жана дебет карталары</translation> -<translation id="1799852120691957794">Мурунку сеансыңыздагы терезелерди калыбына келтирүү мүмкүн эмес</translation> <translation id="180203835522132923">Search + O, анан W</translation> <translation id="1802624026913571222">Уйку режимине капкагы жабылып турганда өтсүн</translation> <translation id="1802687198411089702">Бул баракча жооп бербей жатат. Аны күтсөңүз же болбосо чыгып кетсеңиз болот.</translation> @@ -2379,7 +2378,6 @@ <translation id="2610374175948698697">Түзмөгүңүздөгү файлдарды же папкаларды көрө алат</translation> <translation id="2610780100389066815">Microsoft Ишеним тизмесине кол коюу</translation> <translation id="261114180663074524">Microsoft аккаунтуңузга кирип, кайталап көрүңүз</translation> -<translation id="2611702650078660078">Ката кетти</translation> <translation id="2611776654555141051">"Тик бурчтук" куралы</translation> <translation id="2611885296070244383">Микрофон (ички)</translation> <translation id="2612676031748830579">Картанын номери</translation> @@ -2743,7 +2741,6 @@ <translation id="285033512555869047">Жабык</translation> <translation id="2850541429955027218">Тема кошуу</translation> <translation id="2851291081585704741">Интернет жок</translation> -<translation id="2852045827873867442">Интернет байланышы талап кылынат.</translation> <translation id="285237063405807022">(жүктөлүүдө)</translation> <translation id="2853121255651601031">Сырсөз сакталды</translation> <translation id="2854453262159518435">Учурдагы өтмөктөр тобун алмаштыруу</translation> @@ -3610,6 +3607,7 @@ <translation id="3473241910002674503">Планшет режиминде баскычтарды басып, Башкы бетке, артка өтүп жана колдонмолорду которуштуруңуз.</translation> <translation id="3473479545200714844">Экран чоңойткуч</translation> <translation id="3474218480460386727">Жаңы сөздөр үчүн 99 же андан аз тамгаларды колдонуңуз</translation> +<translation id="3474330892505468100">Google Beam менен Meet</translation> <translation id="3474624961160222204"><ph name="NAME" /> катары улантуу</translation> <translation id="3477772589943384839">Эстутум орточо деңгээлде үнөмдөлөт. Узак убакыттан кийин өтмөктөр жигерсиз болуп калат.</translation> <translation id="347785443197175480"><ph name="HOST" /> камераңыз менен микрофонуңузду колдоно берсин</translation> @@ -5498,7 +5496,6 @@ <translation id="4779766576531456629">Мобилдик тармактын eSIM-картасынын аталышын өзгөртүү</translation> <translation id="4780321648949301421">Бетти төмөнкүдөй сактоо…</translation> <translation id="4780558987886269159">Жумуш үчүн</translation> -<translation id="4781633367688946589">Жаңы сеансты баштоо</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> электрондук капчыгыңыздагы жеке маалыматтарыңызды колдонгону жатат.</translation> <translation id="4785719467058219317">Бул вебсайтта катталбаган коопсуздук ачкычын колдонуп жатасыз</translation> <translation id="4785914069240823137">Кесүүнү жокко чыгаруу</translation> @@ -6287,6 +6284,7 @@ <translation id="5337926771328966926">Түзмөктүн учурдагы аталышы: <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Жашыруун терезени ачып алып, купуя серептей аласыз</translation> <translation id="5338503421962489998">Жергиликтүү сактагыч</translation> +<translation id="5340620183031438925">Барактан чыкпай эле ЖИ режимине өтмөгүңүз тууралуу суроо берүү үчүн бул сиз экениңизди ырастаңыз. Мындан тышкары, сырсөздөрүңүздү жана башкаларды бардык түзмөктөрүңүздө колдоно аласыз.</translation> <translation id="5340787663756381836">&Таап, түзөтүү</translation> <translation id="5340900621595888432">Мүчүлүштүктөрдү аныктоо маалыматын жана колдонуу статистикасын жөнөтүү</translation> <translation id="5341793073192892252">Төмөнкү кукилер бөгөттөлгөн (үчүнчү тараптардын кукилери жалпы шарттарда бөгөттөлөт)</translation> @@ -7473,7 +7471,6 @@ <translation id="6180550893222597997"><ph name="APP_NAME" /> үчүн кайсы киргизүүчү ачкычты колдонгуңуз келет?</translation> <translation id="6181218116951226898">Колдонмолордун бренди кээде өзгөрүп турат. Жаңыртуудан мурун бардык өзгөрүүлөр сизге ыңгайлуу экенин текшериңиз.</translation> <translation id="6181431612547969857">Жүктөп алуу бөгөттөлдү</translation> -<translation id="6182100780603067202">Колдонмодогу аудиону да бөлүшүү (бардык терезелеринен)</translation> <translation id="6183369864942961155">Автоматтык жарык/караңгы тема</translation> <translation id="6183773856988300112">Chrome'догу Gemini өтмөктөрүңүздө иштеп, сиз берген тапшырмаларды аткаруу үчүн маалыматтарды автоматтык түрдө издейт. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Издөө өтмөктөрү</translation> @@ -8266,7 +8263,6 @@ <translation id="6754359471209693699">Башка нерсени издөө</translation> <translation id="6754918760968695779">Ыкчам киргизүү</translation> <translation id="6755702685749429945">Сөздүк кошуу</translation> -<translation id="6756157672127672536">Файлдар колдонмосу Google Drive'да, тышкы сактагычта же ChromeOS түзмөгүңүздө сакталган файлдарды ыкчам колдонуу мүмкүнчүлүгүн берет.</translation> <translation id="6756643207511618722">Кеп синтезаторлору</translation> <translation id="6757431299485455321">Башка түзмөктөргө бул байланыш түйүнүн табууга жардам бериңиз.</translation> <translation id="6758056191028427665">Биздин ишибиз тууралуу билдирип коюңуз.</translation> @@ -9212,6 +9208,7 @@ <translation id="7406912950279255498">Түстөрдү инверсиялоо режими</translation> <translation id="7407430846095439694">Өткөрүп алып, бекитүү</translation> <translation id="7407504355934009739">Көпчүлүк адамдар сайттарга билдирмелерди жөнөтүүгө тыюу салышат</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> файлында купуя маалымат бар. Уюмуңуз аны булуттагы сактагычка сактоого же жоюуга уруксат берет</translation> <translation id="7408080603962564527">Бул башкаларга көрүнөт</translation> <translation id="740810853557944681">Басып чыгаруу серверин кошуу</translation> <translation id="7409549334477097887">Өтө чоң</translation> @@ -9265,6 +9262,7 @@ <translation id="7434969625063495310">Басып чыгаруу сервери кошулган жок. Сервердин конфигурациясын текшерип, кайталап көрүңүз.</translation> <translation id="7436921188514130341">Ка-ап! Аталышы өзгөртүлүп жатканда ката кетти.</translation> <translation id="7439519621174723623">Улантуу үчүн түзмөктүн аталышын кошуңуз</translation> +<translation id="743982235360757672">Серептеп жатканда ЖИ режимин жакын жерде кармаңыз</translation> <translation id="7441736532026945583">Топту өтмөктөр тактасынан алып салуу үчүн "Топту жашыруу" параметрин тандаңыз</translation> <translation id="7441736921018636843">Бул параметрди өзгөртүү үчүн <ph name="BEGIN_LINK" />шайкештирүү параметрлерин баштапкы абалга келтирип<ph name="END_LINK" />, купуя сөз айкашын алып салыңыз</translation> <translation id="7441830548568730290">Башка колдонуучулар</translation> @@ -10003,7 +10001,6 @@ <translation id="794676567536738329">Уруксаттарды ырастоо</translation> <translation id="7947962633355574091">В&идео дарегин көчүрүү</translation> <translation id="7947964080535614577">Сайттар жарнамаларды көрсөтүп, акысыз кызматтар жана материалдар менен камсыздайт. Бирок айрым сайттар тажатма же адаштыруучу жарнамаларды көрсөтөт.</translation> -<translation id="7948239795436419268">Терезелер калыбына келтирилбесин</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" /> сайтынын бардык барактары</translation> <translation id="7950629216186736592">Себеби: LBS http://, https://, and file:// URL'дерин гана колдоого алат.</translation> <translation id="7950814699499457511">Күйүк • Бул кеңейтүү маалыматты кантип чогултуу жана колдонуу сыяктуу купуялыкты камсыз кылуу ыкмаларын жарыялаган эмес</translation> @@ -11192,7 +11189,6 @@ <translation id="8751034568832412184">Мектеп</translation> <translation id="8751329102746373229">Администраторуңуздан билдирүү</translation> <translation id="8752451679755290210">Элементтерге автоматтык түрдө өтүү</translation> -<translation id="8753948258138515839">Файлдар колдонмосу Google Drive'да, тышкы сактагычта же ChromeOS Flex түзмөгүңүздө сакталган файлдарды ыкчам колдонуу мүмкүнчүлүгүн берет.</translation> <translation id="8754200782896249056"><p><ph name="PRODUCT_NAME" /> колдоого алынган иштакта чөйрөсүндө иштеп жатканда, системанын прокси параметрлери колдонулат. Бирок системаңыз колдоого алынбайт же тутум конфигурациясын ишке киргизүүдө көйгөй келип чыгышы мүмкүн.</p> <p>Бирок буйрук сабы аркылуу баары бир конфигурациялай берсеңиз болот. Желек жана чөйрө өзгөрмөлөрү тууралуу көбүрөөк маалымат алуу үчүн <code>man <ph name="PRODUCT_BINARY_NAME" /></code> дегенди караңыз.</p></translation> @@ -11985,6 +11981,7 @@ <translation id="992778845837390402">Учурда Linux'тун камдык көчүрмөсү сакталууда</translation> <translation id="994087375490600917">Капталдагы тилкелер</translation> <translation id="994289308992179865">&Илмек</translation> +<translation id="995420352808264005">Түзмөктү каттоо түрүн тандаңыз</translation> <translation id="995755448277384931">IBAN кошуу</translation> <translation id="996250603853062861">Коопсуз туташуу орнотулууда…</translation> <translation id="997143476478634194">Сайттарга киргениңизде, ушул параметр автоматтык түрдө колдонулат. Адатта сайттар соңку жаңылыктар же чаттагы билдирүүлөр жөнүндө билдирмелерди жөнөтүшөт.</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index 62c26ef..1327ba2 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">ບໍ່ສາມາດດາວໂຫຼດໄຟລ໌ການອະທິບາຍຄວາມເຫັນຂອງໂໜດຫຼັກໄດ້. ກະລຸນາລອງໃໝ່ໃນພາຍຫຼັງ.</translation> <translation id="1103523840287552314">ແປ <ph name="LANGUAGE" /> ຢູ່ສະເໝີ</translation> <translation id="1104098698795583187">ທ່ານຈະສູນເສຍສິດເຂົ້າເຖິງກຸ່ມແຖບກຸ່ມທັນທີ ແລະ ມັນຈະຖືກລຶບຈາກອຸປະກອນທັງໝົດຂອງທ່ານ</translation> +<translation id="1105934302947321130">Google Beam ກັບ Zoom</translation> <translation id="1106270460549661906">ຍົກເລີກການແບ່ງປັນກັບ Gemini</translation> <translation id="1106350001632362876">ເພີ່ມເກນຂຶ້ນ</translation> <translation id="110850812463801904">ເຊື່ອມຕໍ່ກັບ OneDrive ດ້ວຍຕົນເອງ</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">ກະແຈຄວາມປອດໄພຂອງທ່ານບໍ່ໄດ້ຮັບການປົກປ້ອງດ້ວຍ PIN. ເພື່ອຈັດການຂໍ້ມູນການເຂົ້າສູ່ລະບົບ, ກ່ອນອື່ນໃຫ້ສ້າງ PIN.</translation> <translation id="1179400851034021914">IBAN ບໍ່ຖືກຕ້ອງ</translation> <translation id="1179902906564467236">ປະຕິບັດຕາມຄຳແນະນຳຢູ່ໂທລະສັບຂອງທ່ານ ຫຼື ໃຊ້ແອັບກ້ອງຖ່າຍຮູບ</translation> -<translation id="1180117276105724040">ກຳລັງກູ້ຄືນໜ້າຈໍຈາກເຊດຊັນກ່ອນໜ້າຂອງທ່ານ...</translation> <translation id="118057123461613219">ປະຢັດໜ່ວຍຄວາມຈຳໄດ້ຫຼາຍເປັນຢ່າງຍິ່ງ</translation> <translation id="1181037720776840403">ລຶບອອກ</translation> <translation id="1182876754474670069">ໜ້າຫຼັກ</translation> @@ -760,7 +760,6 @@ <translation id="151501797353681931">ນໍາເຂົ້າຈາກ Safari ແລ້ວ</translation> <translation id="1515163294334130951">ເປີດໃຊ້</translation> <translation id="1517467582299994451">ເພື່ອສົ່ງສັນຍານດ້ວຍລະຫັດ, ກະລຸນາເປີດການຕັ້ງຄ່າການຊິ້ງໂປຣແກຣມທ່ອງເວັບ Chrome</translation> -<translation id="1519090060276706457">ການກູ້ຄືນໜ້າຈໍໃຊ້ເວລາດົນກວ່າທີ່ຄາດໄວ້</translation> <translation id="1521442365706402292">ຈັດການໃບຢັ້ງຢືນ</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">ເປີດນຳໃຊ້ມື້ນີ້</translation> @@ -1109,6 +1108,7 @@ <translation id="1745732479023874451">ຈັດການລາຍຊື່ຜູ້ຕິດຕໍ່</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{ເປີດ ແລະ ແກ້ໄຂ # ໄຟລ໌ໃນເວັບແອັບນີ້ບໍ?}}</translation> <translation id="1748563609363301860">ທ່ານສາມາດບັນທຶກລະຫັດຜ່ານນີ້ໄວ້ໃນບັນຊີ Google ຂອງທ່ານ ຫຼື ໃນອຸປະກອນນີ້ໄດ້ເທົ່ານັ້ນ</translation> +<translation id="1749645492410897998">ກຳລັງຕິດຕັ້ງຊອບແວ</translation> <translation id="1749733017156547309">ຕ້ອງໃສ່ລະຫັດຜ່ານ</translation> <translation id="1750172676754093297">ກະແຈຄວາມປອດໄພຂອງທ່ານບໍ່ສາມາດເກັບຮັກສາລາຍນິ້ວມືໄວ້ໄດ້</translation> <translation id="1750238553597293878">ໃຊ້ລະຫັດຜ່ານໃນບັນຊີ Google ຂອງທ່ານຕໍ່ໄປ</translation> @@ -1180,7 +1180,6 @@ <translation id="1796460466266263589">ເພື່ອສືບຕໍ່ໃຊ້ Gemini, ໃຫ້ຢັ້ງຢືນວ່າແມ່ນທ່ານ</translation> <translation id="1796588414813960292">ຄຸນສົມບັດທີ່ຕ້ອງການສຽງຈະໃຊ້ບໍ່ໄດ້</translation> <translation id="1798726622311813209">ບັດເຄຣດິດ ແລະ ບັດເດບິດ</translation> -<translation id="1799852120691957794">ບໍ່ສາມາດກູ້ຄືນໜ້າຈໍຈາກເຊດຊັນກ່ອນໜ້າຂອງທ່ານໄດ້</translation> <translation id="180203835522132923">ຊອກຫາ + O, ຈາກນັ້ນ W</translation> <translation id="1802624026913571222">ພັກເຄື່ອງເມື່ອປິດຝາ</translation> <translation id="1802687198411089702">ໜ້ານີ້ບໍ່ຕອບສະໜອງ. ທ່ານສາມາດລໍຖ້າມັນ ຫຼື ອອກໄດ້.</translation> @@ -2378,7 +2377,6 @@ <translation id="2610374175948698697">ສາມາດເບິ່ງໄຟລ໌ ຫຼື ໂຟນເດີຢູ່ອຸປະກອນຂອງທ່ານໄດ້</translation> <translation id="2610780100389066815">ການລົງຊື່ເຂົ້າໃຊ້ລາຍຊື່ເຊື່ອໝັ້ນຂອງ Microsoft</translation> <translation id="261114180663074524">ເຂົ້າສູ່ລະບົບບັນຊີ Microsoft ຂອງທ່ານ ແລ້ວລອງໃໝ່</translation> -<translation id="2611702650078660078">ເກີດຂໍ້ຜິດພາດ</translation> <translation id="2611776654555141051">ເຄື່ອງມືສີ່ຫຼ່ຽມ</translation> <translation id="2611885296070244383">ໄມ (ພາຍໃນ)</translation> <translation id="2612676031748830579">ເລກບັດ</translation> @@ -2742,7 +2740,6 @@ <translation id="285033512555869047">ປິດແລ້ວ</translation> <translation id="2850541429955027218">ເພີ່ມຊຸດຮູບແບບ</translation> <translation id="2851291081585704741">ທ່ານອອບລາຍຢູ່</translation> -<translation id="2852045827873867442">ຕ້ອງມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ.</translation> <translation id="285237063405807022">(ກຳລັງໂຫຼດ)</translation> <translation id="2853121255651601031">ບັນທຶກລະຫັດຜ່ານໄວ້ແລ້ວ</translation> <translation id="2854453262159518435">ປ່ຽນແທນກຸ່ມແຖບທີ່ມີຢູ່</translation> @@ -3609,6 +3606,7 @@ <translation id="3473241910002674503">ໄປຫາໜ້າຫຼັກ, ກັບຄືນ ແລະ ສະຫຼັບແອັບດ້ວຍປຸ່ມໃນໂໝດແທັບເລັດ.</translation> <translation id="3473479545200714844">ເຄື່ອງຂະຫຍາຍໜ້າຈໍ</translation> <translation id="3474218480460386727">ໃຊ້ຕົວອັກສອນ 99 ຕົວລົງມາສຳລັບຄຳໃໝ່</translation> +<translation id="3474330892505468100">Google Beam ກັບ Meet</translation> <translation id="3474624961160222204">ສືບຕໍ່ໃຊ້ໃນຊື່ <ph name="NAME" /></translation> <translation id="3477772589943384839">ປະຢັດໜ່ວຍຄວາມຈຳໃນລະດັບປານກາງ. ແຖບຂອງທ່ານຈະບໍ່ເຮັດວຽກຫຼັງຈາກໄລຍະເວລາດົນປະມານໜຶ່ງ.</translation> <translation id="347785443197175480">ສືບຕໍ່ອະນຸຍາດໃຫ້ <ph name="HOST" /> ເຂົ້າຫາກ້ອງຖ່າຍຮູບ ແລະໄມໂຄຣໂຟນຂອງທ່ານບໍ່</translation> @@ -5497,7 +5495,6 @@ <translation id="4779766576531456629">ປ່ຽນຊື່ເຄືອຂ່າຍມືຖືຂອງ eSIM</translation> <translation id="4780321648949301421">ບັນທຶກໜ້າເປັນ...</translation> <translation id="4780558987886269159">ສໍາລັບການເຮັດວຽກ</translation> -<translation id="4781633367688946589">ດຳເນີນການຕໍ່ໄປຫາເຊດຊັນໃໝ່</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> ຕ້ອງການໃຊ້ຂໍ້ມູນສ່ວນຕົວຈາກກະເປົາດິຈິຕອນຂອງທ່ານ.</translation> <translation id="4785719467058219317">ທ່ານກຳລັງໃຊ້ກະແຈຄວາມປອດໄພທີ່ບໍ່ໄດ້ລົງທະບຽນນຳເວັບໄຊນີ້</translation> <translation id="4785914069240823137">ຍົກເລີກການຕັດ</translation> @@ -6286,6 +6283,7 @@ <translation id="5337926771328966926">ຊື່ອຸປະກອນປັດຈຸບັນແມ່ນ <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">ທ່ານສາມາດທ່ອງເວັບແບບສ່ວນຕົວໄດ້ໂດຍໃຊ້ໜ້າຈໍທີ່ບໍ່ເປີດເຜີຍຕົວຕົນ</translation> <translation id="5338503421962489998">ບ່ອນເກັບມ້ຽນຂໍ້ມູນໃນເຄື່ອງ</translation> +<translation id="5340620183031438925">ເພື່ອຖາມໂໝດ AI ກ່ຽວກັບແຖບຂອງທ່ານໂດຍບໍ່ຕ້ອງອອກຈາກໜ້າ, ໃຫ້ຢັ້ງຢືນວ່າແມ່ນທ່ານ. ນອກຈາກນີ້, ທ່ານຍັງຈະຮັບລະຫັດຜ່ານ ແລະ ຂໍ້ມູນອື່ນໆໃນອຸປະກອນທຸກເຄື່ອງຂອງທ່ານໄດ້ນຳ.</translation> <translation id="5340787663756381836">&ຊອກຫາ ແລະ ແກ້ໄຂ</translation> <translation id="5340900621595888432">ສົ່ງຂໍ້ມູນການວິນິໄສ ແລະ ການນຳໃຊ້</translation> <translation id="5341793073192892252">ບລັອກຄຸກກີ້ຕໍ່ໄປນີ້ໄວ້ແລ້ວ (ຄຸກກີ້ພາກສ່ວນທີສາມຖືກບລັອກໄວ້ໂດຍບໍ່ມີຂໍ້ຍົກເວັ້ນ)</translation> @@ -7471,7 +7469,6 @@ <translation id="6180550893222597997">ທ່ານຕ້ອງການໃຊ້ກະແຈຜ່ານໃດສຳລັບ <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">ບາງເທື່ອແອັບຈະອັບເດດການສ້າງແບຣນຂອງຕົນເອງ. ກະລຸນາກວດສອບການປ່ຽນແປງທັງໝົດເພື່ອໃຫ້ໝັ້ນໃຈວ່າທ່ານສະບາຍໃຈກັບການປ່ຽນແປງດັ່ງກ່າວກ່ອນທີ່ຈະອັບເດດ.</translation> <translation id="6181431612547969857">ບລັອກດາວໂຫຼດແລ້ວ</translation> -<translation id="6182100780603067202">ແບ່ງປັນສຽງຂອງແອັບພລິເຄຊັນ (ຈາກໜ້າຈໍທັງໝົດ) ນຳ</translation> <translation id="6183369864942961155">ຮູບແບບສີສັນແຈ້ງ/ຮູບແບບສີສັນມືດອັດຕະໂນມັດ</translation> <translation id="6183773856988300112">Gemini ໃນ Chrome ໃຊ້ການທ່ອງເວັບອັດຕະໂນມັດເພື່ອເຮັດວຽກໃນແຖບຂອງທ່ານ ແລະ ເຮັດໜ້າວຽກທີ່ທ່ານກຳນົດໃຫ້ສຳເລັດ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="6184099524311454384">ຊອກຫາແຖບ</translation> @@ -8264,7 +8261,6 @@ <translation id="6754359471209693699">ເລີ່ມການຊອກຫາໃໝ່</translation> <translation id="6754918760968695779">ແຊກດ່ວນ</translation> <translation id="6755702685749429945">ເພີ່ມວັດຈະນານຸກົມ</translation> -<translation id="6756157672127672536">ແອັບໄຟລ໌ຈະມອບການເຂົ້າເຖິງດ່ວນໄປຫາໄຟລ໌ທີ່ທ່ານບັນທຶກໄວ້ຢູ່ Google Drive, ບ່ອນຈັດເກັບຂໍ້ມູນພາຍນອກ ຫຼື ອຸປະກອນ ChromeOS ຂອງທ່ານ.</translation> <translation id="6756643207511618722">ໂປຣແກຣມສຽງເວົ້າ</translation> <translation id="6757431299485455321">ຊ່ວຍອຸປະກອນອື່ນຊອກຫາຮັອດສະປອດນີ້.</translation> <translation id="6758056191028427665">ໃຫ້ພວກເຮົາຮູ້ວ່າພວກເຮົາກຳລັງເຮັດໄດ້ດີສໍ່າໃດ.</translation> @@ -9210,6 +9206,7 @@ <translation id="7406912950279255498">ໂໝດການປີ້ນສີ</translation> <translation id="7407430846095439694">ນຳເຂົ້າ ແລະ ຜູກມັດ</translation> <translation id="7407504355934009739">ຄົນສ່ວນໃຫຍ່ບລັອກການແຈ້ງເຕືອນຈາກເວັບໄຊນີ້</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> ມີຂໍ້ມູນລະອຽດອ່ອນ. ອົງກອນຂອງທ່ານຈະອະນຸຍາດໃຫ້ທ່ານບັນທຶກຂໍ້ມູນໃສ່ໃນບ່ອນຈັດເກັບຂໍ້ມູນຄລາວ ຫຼື ຖິ້ມຂໍ້ມູນ</translation> <translation id="7408080603962564527">ສິ່ງນີ້ຈະເຫັນໄດ້ໂດຍຜູ້ອື່ນ</translation> <translation id="740810853557944681">ເພີ່ມເຊີບເວີການພິມ</translation> <translation id="7409549334477097887">ໃຫຍ່ພິເສດ</translation> @@ -9262,6 +9259,7 @@ <translation id="7434969625063495310">ບໍ່ສາມາດເພີ່ມເຊີບເວີການພິມໄດ້. ກະລຸນາກວດເບິ່ງການຕັ້ງຄ່າເຊີບເວີ ແລ້ວລອງໃໝ່.</translation> <translation id="7436921188514130341">ໂອ໋ຍ, ໂຊກຮ້າຍແທ້! ເກີດຄວາມຜິດພາດຂຶ້ນໃນເວລາປ່ຽນຊື່.</translation> <translation id="7439519621174723623">ເພີ່ມຊື່ອຸປະກອນເພື່ອສືບຕໍ່</translation> +<translation id="743982235360757672">ໃຫ້ໂໝດ AI ຢູ່ໃກ້ມືສະເໝີໃນລະຫວ່າງທີ່ທ່ານເລືອກເບິ່ງ</translation> <translation id="7441736532026945583">ເລືອກ "ເຊື່ອງກຸ່ມ" ເພື່ອລຶບກຸ່ມອອກຈາກລາຍແຖບຂອງທ່ານ</translation> <translation id="7441736921018636843">ເພື່ອປ່ຽນການຕັ້ງຄ່ານີ້, ກະລຸນາ <ph name="BEGIN_LINK" />ຣີເຊັດການຊິ້ງຂໍ້ມູນ<ph name="END_LINK" /> ເພື່ອລຶບລະຫັດຜ່ານການຊິ້ງຂໍ້ມູນຂອງທ່ານອອກ</translation> <translation id="7441830548568730290">ຜູ້ໃຊ້ອື່ນ</translation> @@ -10000,7 +9998,6 @@ <translation id="794676567536738329">ຢືນຢັນການອະນຸຍາດ</translation> <translation id="7947962633355574091">ອັດສຳເນົາທີ່ຢູ່ວິດີໂອ</translation> <translation id="7947964080535614577">ປົກກະຕິເວັບໄຊຈະສະແດງໂຄສະນາເພື່ອໃຫ້ເຂົາເຈົ້າສາມາດສະໜອງເນື້ອຫາ ຫຼື ບໍລິການໄດ້ໂດຍບໍ່ມີຄ່າໃຊ້ຈ່າຍ. ແຕ່ກໍມີບາງເວັບໄຊສະແດງໂຄສະນາທີ່ລົບກວນ ຫຼື ເຮັດໃຫ້ເຂົ້າໃຈຜິດ.</translation> -<translation id="7948239795436419268">ບໍ່ຕ້ອງກູ້ຄືນໜ້າຈໍ</translation> <translation id="7948407723851303488">ໜ້າທັງໝົດຂອງ <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">ເຫດຜົນ: LBS ຮອງຮັບ URL ແບບ http://, https:// ແລະ file:// ເທົ່ານັ້ນ.</translation> <translation id="7950814699499457511">ເປີດ • ສ່ວນຂະຫຍາຍນີ້ບໍ່ໄດ້ເຜີຍແຜ່ຂໍ້ປະຕິບັດຄວາມເປັນສ່ວນຕົວ, ເຊັ່ນ: ວິທີທີ່ມັນຮວບຮວມ ແລະ ໃຊ້ຂໍ້ມູນ</translation> @@ -11189,7 +11186,6 @@ <translation id="8751034568832412184">ໂຮງຮຽນ</translation> <translation id="8751329102746373229">ຈາກຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ</translation> <translation id="8752451679755290210">ຍ້າຍໄປມາລະຫວ່າງລາຍການໂດຍອັດຕະໂນມັດ</translation> -<translation id="8753948258138515839">ແອັບໄຟລ໌ໃຫ້ການເຂົ້າເຖິງດ່ວນຫາໄຟລ໌ທີ່ທ່ານບັນທຶກໄວ້ຢູ່ Google Drive, ບ່ອນຈັດເກັບຂໍ້ມູນພາຍນອກ ຫຼື ອຸປະກອນ ChromeOS Flex ຂອງທ່ານ.</translation> <translation id="8754200782896249056"><p>ເມື່ອແລ່ນ <ph name="PRODUCT_NAME" /> ຢູ່ພາຍໃຕ້ສະພາບແວດລ້ອມເດັສທັອບທີ່ຮອງຮັບ, ການຕັ້ງຄ່າພຣັອກຊີລະບົບຈະຖືກນໍາໄປໃຊ້. ເຖິງແນວໃດກໍ່ຕາມ, ລະບົບຂອງທ່ານບໍ່ຮອງຮັບ ຫຼືມີບັນຫາການເປີດໃຊ້ການກຳນົດຄ່າລະບົບຂອງທ່ານ.</p> <p>ແຕ່ທ່ານຍັງສາມາດກຳນົດຄ່າໄດ້ຜ່ານແຖວຄໍາສັ່ງ. ກະລຸນາເບິ່ງ <code>ຄູ່ມື <ph name="PRODUCT_BINARY_NAME" /></code> ສຳລັບຂໍ້ມູນເພີ່ມເຕີມກ່ຽວກັບທຸງ ແລະຕົວລັບສະພາບແວດລ້ອມ.</p></translation> @@ -11982,6 +11978,7 @@ <translation id="992778845837390402">ການສຳຮອງຂໍ້ມູນ Linux ພວມດຳເນີນຢູ່ໃນປັດຈຸບັນນີ້</translation> <translation id="994087375490600917">ແຜງຄວບຄຸມດ້ານຂ້າງ</translation> <translation id="994289308992179865">ຫ່ວງ</translation> +<translation id="995420352808264005">ເລືອກປະເພດການລົງທະບຽນອຸປະກອນ</translation> <translation id="995755448277384931">ເພີ່ມ IBAN</translation> <translation id="996250603853062861">ກໍາລັງຕັ້ງການເຊື່ອມຕໍ່ທີ່ປອດໄພ...</translation> <translation id="997143476478634194">ເວັບໄຊຈະປະຕິບັດຕາມການຕັ້ງຄ່ານີ້ໂດຍອັດຕະໂນມັດເມື່ອທ່ານເຂົ້າເບິ່ງພວກມັນ. ໂດຍປົກກະຕິແລ້ວເວັບໄຊຈະສົ່ງການແຈ້ງເຕືອນເພື່ອແຈ້ງໃຫ້ທ່ານຮັບຊາບກ່ຽວກັບຂ່າວດ່ວນ ຫຼື ຂໍ້ຄວາມສົນທະນາ.</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 5c40e4d..ae072f4a9 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Nepavyko atsisiųsti pagrindinio mazgo anotacijų failų. Bandykite dar kartą vėliau.</translation> <translation id="1103523840287552314">Visada versti <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Iš karto neteksite prieigos prie skirtukų grupės, o ji bus ištrinta iš visų jūsų įrenginių</translation> +<translation id="1105934302947321130">„Google Beam“ su „Zoom“</translation> <translation id="1106270460549661906">Bendrinimo panaikinimas naudojant „Gemini“</translation> <translation id="1106350001632362876">Padidinti slenkstį</translation> <translation id="110850812463801904">Neautomatinis prisijungimas prie „OneDrive“</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Saugos raktas neapsaugotas PIN kodu. Kad galėtumėte tvarkyti prisijungimo duomenis, pirmiausia sukurkite PIN kodą.</translation> <translation id="1179400851034021914">IBAN netinkamas</translation> <translation id="1179902906564467236">Vadovaukitės telefone pateikiamomis instrukcijomis arba naudokite Fotoaparato programą</translation> -<translation id="1180117276105724040">Atkuriami langai iš ankstesnio seanso...</translation> <translation id="118057123461613219">Labai daug sutaupoma</translation> <translation id="1181037720776840403">Pašalinti</translation> <translation id="1182876754474670069">klavišas „Home“</translation> @@ -765,7 +765,6 @@ <translation id="151501797353681931">Importuota iš „Safari“</translation> <translation id="1515163294334130951">Paleidimas</translation> <translation id="1517467582299994451">Jei norite perduoti naudodami kodą, įjunkite „Chrome“ naršyklės sinchronizavimo nustatymus.</translation> -<translation id="1519090060276706457">Langų atkūrimas trunka ilgiau, nei tikėtasi</translation> <translation id="1521442365706402292">Valdyti sertifikatus</translation> <translation id="1521655867290435174">„Google“ skaičiuoklės</translation> <translation id="1521774566618522728">Aktyvus šiandien</translation> @@ -1114,6 +1113,7 @@ <translation id="1745732479023874451">Tvarkyti kontaktus</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}one{Atidaryti ir redaguoti # failą šioje žiniatinklio programoje?}few{Atidaryti ir redaguoti # failus šioje žiniatinklio programoje?}many{Atidaryti ir redaguoti # failo šioje žiniatinklio programoje?}other{Atidaryti ir redaguoti # failų šioje žiniatinklio programoje?}}</translation> <translation id="1748563609363301860">Šį slaptažodį galite išsaugoti „Google“ paskyroje arba tik šiame įrenginyje</translation> +<translation id="1749645492410897998">Įdiegiama programinė įranga</translation> <translation id="1749733017156547309">Būtina nurodyti slaptažodį</translation> <translation id="1750172676754093297">Jūsų saugos rakte negalima išsaugoti kontrolinių kodų</translation> <translation id="1750238553597293878">Toliau naudokite slaptažodžius „Google“ paskyroje</translation> @@ -1185,7 +1185,6 @@ <translation id="1796460466266263589">Jei norite toliau naudoti „Gemini“, patvirtinkite savo tapatybę</translation> <translation id="1796588414813960292">Funkcijos, kurioms reikalingas garsas, neveiks</translation> <translation id="1798726622311813209">Kredito ir debeto kortelės</translation> -<translation id="1799852120691957794">Nepavyko atkurti langų iš ankstesnio seanso</translation> <translation id="180203835522132923">Paieškos klavišas + O, tada W</translation> <translation id="1802624026913571222">Įjungti miego būseną, kai dangtelis uždarytas</translation> <translation id="1802687198411089702">Puslapis neatsako. Galite palaukti arba išeiti.</translation> @@ -2382,7 +2381,6 @@ <translation id="2610374175948698697">Gali peržiūrėti failus ar aplankus jūsų įrenginyje</translation> <translation id="2610780100389066815">„Microsoft“ patikimo sąrašo pasirašymas</translation> <translation id="261114180663074524">Prisijunkite prie „Microsoft“ paskyros ir bandykite dar kartą</translation> -<translation id="2611702650078660078">Įvyko klaida</translation> <translation id="2611776654555141051">Stačiakampio įrankis</translation> <translation id="2611885296070244383">Mikrofonas (vidinis)</translation> <translation id="2612676031748830579">Kortelės numeris</translation> @@ -2746,7 +2744,6 @@ <translation id="285033512555869047">Uždaryta</translation> <translation id="2850541429955027218">Pridėti temą</translation> <translation id="2851291081585704741">Jūs neprisijungę</translation> -<translation id="2852045827873867442">Reikalingas interneto ryšys.</translation> <translation id="285237063405807022">(įkeliama)</translation> <translation id="2853121255651601031">Slaptažodis išsaugotas</translation> <translation id="2854453262159518435">Pakeisti esamą skirtukų grupę</translation> @@ -3613,6 +3610,7 @@ <translation id="3473241910002674503">Eikite į pagrindinį puslapį, naršykite atgal ir perjunkite programas naudodami mygtukus planšetinio kompiuterio režimu.</translation> <translation id="3473479545200714844">Ekrano didintuvas</translation> <translation id="3474218480460386727">Naujus žodžius gali sudaryti ne daugiau nei 99 raidės</translation> +<translation id="3474330892505468100">„Google Beam“ su „Meet“</translation> <translation id="3474624961160222204">Tęsti kaip <ph name="NAME" /></translation> <translation id="3477772589943384839">Sutaupote vidutinį kiekį atminties. Skirtukai tampa neaktyvūs po ilgesnio laikotarpio.</translation> <translation id="347785443197175480">Toliau leisti <ph name="HOST" /> pasiekti fotoaparatą ir mikrofoną</translation> @@ -5501,7 +5499,6 @@ <translation id="4779766576531456629">Pervardyti „eSIM“ kortelės mobiliojo ryšio tinklą</translation> <translation id="4780321648949301421">Išsaugoti puslapį kaip...</translation> <translation id="4780558987886269159">Darbui</translation> -<translation id="4781633367688946589">Tęsti naują seansą</translation> <translation id="4784349455504343791">„<ph name="WEBSITE_ORIGIN" />“ nori naudoti asmens informaciją iš skaitmeninės piniginės.</translation> <translation id="4785719467058219317">Naudojate saugos raktą, kuris nėra užregistruotas šioje svetainėje</translation> <translation id="4785914069240823137">Atšaukti apkirpimą</translation> @@ -6290,6 +6287,7 @@ <translation id="5337926771328966926">Dabartinis įrenginio pavadinimas yra „<ph name="DEVICE_NAME" />“</translation> <translation id="5338338064218053691">Galite naršyti privačiai naudodami inkognito langą</translation> <translation id="5338503421962489998">Vietinė atmintinė</translation> +<translation id="5340620183031438925">Jei norite paklausti DI režimo apie skirtuką neišeidami iš puslapio, patvirtinkite savo tapatybę. Be to, slaptažodžius ir kitas funkcijas pasieksite visuose įrenginiuose.</translation> <translation id="5340787663756381836">&Rasti ir redaguoti</translation> <translation id="5340900621595888432">Siųsti diagnostikos ir naudojimo duomenis</translation> <translation id="5341793073192892252">Užblokuoti toliau nurodyti slapukai (trečiųjų šalių slapukai blokuojami be išimčių)</translation> @@ -7477,7 +7475,6 @@ <translation id="6180550893222597997">Kurį „passkey“ norite naudoti su „<ph name="APP_NAME" />“?</translation> <translation id="6181218116951226898">Programos kartais atnaujina savo prekės ženklą. Peržiūrėkite visus pakeitimus, kad įsitikintumėte, jog esate patenkinti jais, prieš atnaujindami.</translation> <translation id="6181431612547969857">Atsisiuntimas užblokuotas</translation> -<translation id="6182100780603067202">Taip pat bendrinti programos garsą (iš visų jos langų)</translation> <translation id="6183369864942961155">Automatinė šviesioji / tamsioji tema</translation> <translation id="6183773856988300112">„Gemini“ naršyklėje „Chrome“ naudoja automatinį naršymą, kad veiktų jūsų skirtukuose ir atliktų jūsų pateiktas užduotis. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Ieškoti skirtukų</translation> @@ -8276,7 +8273,6 @@ <translation id="6754359471209693699">Pradėti naują paiešką</translation> <translation id="6754918760968695779">Spartusis įterpimas</translation> <translation id="6755702685749429945">Pridėti žodyną</translation> -<translation id="6756157672127672536">Naudodami programą „Failai“ greitai pasieksite „Google“ diske, išorinėje saugykloje ar „Chrome“ OS įrenginyje išsaugotus failus.</translation> <translation id="6756643207511618722">Kalbų varikliai</translation> <translation id="6757431299485455321">Padėkite kitiems įrenginiams rasti šį viešosios interneto prieigos tašką.</translation> <translation id="6758056191028427665">Pateikite atsiliepimų.</translation> @@ -9223,6 +9219,7 @@ <translation id="7406912950279255498">Spalvų inversijos režimas</translation> <translation id="7407430846095439694">Importuoti ir susaistyti</translation> <translation id="7407504355934009739">Dauguma žmonių blokuoja pranešimus šioje svetainėje</translation> +<translation id="7407578029724074226">Faile „<ph name="FILE_NAME" />“ yra neskelbtinų duomenų. Organizacija leis išsaugoti jį saugykloje debesyje arba atmesti</translation> <translation id="7408080603962564527">Tai matys kiti žmonės</translation> <translation id="740810853557944681">Spausdinimo serverio pridėjimas</translation> <translation id="7409549334477097887">Itin didelis</translation> @@ -9276,6 +9273,7 @@ <translation id="7434969625063495310">Nepavyko pridėti spausdinimo serverio. Patikrinkite serverio konfigūraciją ir bandykite dar kartą.</translation> <translation id="7436921188514130341">Oi, pervardijant įvyko klaida.</translation> <translation id="7439519621174723623">Jei norite tęsti, pridėkite įrenginio pavadinimą</translation> +<translation id="743982235360757672">Naršykite ir patogiai pasiekite DI režimą</translation> <translation id="7441736532026945583">Pasirinkite „Slėpti grupę“, kad pašalintumėte grupę iš skirtuko juostelės</translation> <translation id="7441736921018636843">Jei norite pakeisti šį nustatymą, <ph name="BEGIN_LINK" />nustatykite sinchronizavimą iš naujo<ph name="END_LINK" />, kad pašalintumėte sinchronizavimo slaptafrazę</translation> <translation id="7441830548568730290">Kiti naudotojai</translation> @@ -10014,7 +10012,6 @@ <translation id="794676567536738329">Patvirtinti leidimus</translation> <translation id="7947962633355574091">K&opijuoti vaizdo įrašo adresą</translation> <translation id="7947964080535614577">Paprastai svetainėse rodomi skelbimai, kad būtų galima be mokesčio teikti turinį ar paslaugas. Tačiau žinoma, kad kai kuriose svetainėse rodomi nepageidaujami arba klaidinantys skelbimai.</translation> -<translation id="7948239795436419268">Neatkurti langų</translation> <translation id="7948407723851303488">Visi <ph name="DOMAIN_NAME" /> puslapiai</translation> <translation id="7950629216186736592">Priežastis: LBS palaiko tik „http://“, „https://“ ir „file://“ URL.</translation> <translation id="7950814699499457511">Įjungta • Šis plėtinys nepaskelbė privatumo praktikos, pvz., kaip renka ir naudoja duomenis</translation> @@ -11203,7 +11200,6 @@ <translation id="8751034568832412184">Mokykla</translation> <translation id="8751329102746373229">Iš administratoriaus</translation> <translation id="8752451679755290210">Automatinis perėjimas nuo vieno elemento prie kito</translation> -<translation id="8753948258138515839">Naudodami Failų programą sparčiai pasieksite „Google“ diske, išorinėje saugykloje ar „ChromeOS Flex“ įrenginyje išsaugotus failus.</translation> <translation id="8754200782896249056"><p>Paleidus „<ph name="PRODUCT_NAME" />“ palaikomoje darbalaukio aplinkoje, bus naudojami tarpinio sistemos serverio nustatymai. Tačiau jūsų sistema nepalaikoma arba iškilo problemų paleidžiant sistemos konfigūraciją.</p> <p>Vis tiek galite konfigūruoti naudodami komandų eilutę. Žr. <code><ph name="PRODUCT_BINARY_NAME" /></code>, jei norite gauti daugiau informacijos apie žymas ir aplinkos variantus.</translation> @@ -11999,6 +11995,7 @@ <translation id="992778845837390402">Šiuo metu kuriama „Linux“ atsarginė kopija</translation> <translation id="994087375490600917">Šoniniai skydeliai</translation> <translation id="994289308992179865">&Ciklas</translation> +<translation id="995420352808264005">Pasirinkite įrenginio registracijos tipą</translation> <translation id="995755448277384931">IBAN pridėjimas</translation> <translation id="996250603853062861">Kuriamas saugus ryšys...</translation> <translation id="997143476478634194">Šis nustatymas automatiškai pritaikomas svetainėms, kai jose apsilankote. Svetainės paprastai siunčia pranešimus informuodamos apie karščiausias naujienas ar pokalbių pranešimus.</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 0d61b38e..17374b5 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Nevar lejupielādēt galvenā mezgla anotāciju failus. Vēlāk mēģiniet vēlreiz.</translation> <translation id="1103523840287552314">Vienmēr tulkot <ph name="LANGUAGE" /> valodas saturu</translation> <translation id="1104098698795583187">Jūs uzreiz zaudēsiet piekļuvi šai ciļņu grupai, un tā tiks izdzēsta no visām jūsu ierīcēm.</translation> +<translation id="1105934302947321130">Google Beam ar Zoom</translation> <translation id="1106270460549661906">Pārtraukt kopīgošanu ar Gemini</translation> <translation id="1106350001632362876">Paaugstināt slieksni</translation> <translation id="110850812463801904">Manuāli saistīt ar OneDrive</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Jūsu drošības atslēga nav aizsargāta ar PIN. Lai pārvaldītu pierakstīšanās datus, vispirms izveidojiet PIN.</translation> <translation id="1179400851034021914">IBAN nav derīgs</translation> <translation id="1179902906564467236">Izpildiet tālrunī sniegtos norādījumus vai izmantojiet kameras lietotni.</translation> -<translation id="1180117276105724040">Notiek logu atjaunošana no iepriekšējās sesijas…</translation> <translation id="118057123461613219">Milzīgs ietaupījums</translation> <translation id="1181037720776840403">Noņemt</translation> <translation id="1182876754474670069">sākumlapa</translation> @@ -763,7 +763,6 @@ <translation id="151501797353681931">Importēts no Safari</translation> <translation id="1515163294334130951">Palaist</translation> <translation id="1517467582299994451">Lai varētu apraidīt saturu, izmantojot kodu, ieslēdziet pārlūka Chrome sinhronizācijas iestatījumus</translation> -<translation id="1519090060276706457">Logu atjaunošana aizņem ilgāku laiku, nekā paredzēts</translation> <translation id="1521442365706402292">Pārvaldīt sertifikātus</translation> <translation id="1521655867290435174">Google izklājlapas</translation> <translation id="1521774566618522728">Aktīvs šodien</translation> @@ -1104,6 +1103,7 @@ <translation id="1745732479023874451">Pārvaldīt kontaktpersonas</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}zero{Vai atvērt un rediģēt # failus šajā tīmekļa lietotnē?}one{Vai atvērt un rediģēt # failu šajā tīmekļa lietotnē?}other{Vai atvērt un rediģēt # failus šajā tīmekļa lietotnē?}}</translation> <translation id="1748563609363301860">Varat saglabāt šo paroli Google kontā vai tikai šajā ierīcē</translation> +<translation id="1749645492410897998">Notiek programmatūras instalēšana…</translation> <translation id="1749733017156547309">Jānorāda parole.</translation> <translation id="1750172676754093297">Jūsu drošības atslēgā nevar saglabāt pirkstu nospiedumus.</translation> <translation id="1750238553597293878">Turpiniet izmantot Google kontā saglabātās paroles</translation> @@ -1175,7 +1175,6 @@ <translation id="1796460466266263589">Lai turpinātu izmantot Gemini, verificējiet savu identitāti.</translation> <translation id="1796588414813960292">Funkcijas, kurām nepieciešama skaņa, nedarbosies</translation> <translation id="1798726622311813209">Kredītkartes un debetkartes</translation> -<translation id="1799852120691957794">Nevar atjaunot logus no iepriekšējās sesijas</translation> <translation id="180203835522132923">Search+O, pēc tam W</translation> <translation id="1802624026913571222">Ieslēgt miega režīmu, aizverot vāku</translation> <translation id="1802687198411089702">Lapa nereaģē. Varat uzgaidīt vai iziet no lapas.</translation> @@ -2368,7 +2367,6 @@ <translation id="2610374175948698697">Var skatīt failus vai mapes jūsu ierīcē</translation> <translation id="2610780100389066815">Microsoft uzticamības saraksta parakstīšana</translation> <translation id="261114180663074524">Pierakstieties savā Microsoft kontā un pēc tam mēģiniet vēlreiz</translation> -<translation id="2611702650078660078">Radās kļūda</translation> <translation id="2611776654555141051">Taisnstūra rīks</translation> <translation id="2611885296070244383">Mikrofons (iebūvētais)</translation> <translation id="2612676031748830579">Kartes numurs</translation> @@ -2732,7 +2730,6 @@ <translation id="285033512555869047">Aizvērta</translation> <translation id="2850541429955027218">Pievienot motīvu</translation> <translation id="2851291081585704741">Jūs esat bezsaistē</translation> -<translation id="2852045827873867442">Ir nepieciešams interneta savienojums.</translation> <translation id="285237063405807022">(notiek ielāde)</translation> <translation id="2853121255651601031">Parole saglabāta</translation> <translation id="2854453262159518435">Aizstāt esošo ciļņu grupu</translation> @@ -3597,6 +3594,7 @@ <translation id="3473241910002674503">Pārejiet uz sākumu, atpakaļ un pārslēdziet lietotnes, izmantojot pogas planšetdatora režīmā.</translation> <translation id="3473479545200714844">Ekrāna lupa</translation> <translation id="3474218480460386727">Jaunajiem vārdiem neizmantojiet vairāk par 99 burtiem</translation> +<translation id="3474330892505468100">Google Beam ar Meet</translation> <translation id="3474624961160222204">Turpināt kā: <ph name="NAME" /></translation> <translation id="3477772589943384839">Ietaupiet vidēji daudz vietas atmiņā. Cilnes kļūs neaktīvas pēc ilgāka laika perioda.</translation> <translation id="347785443197175480">Arī turpmāk ļaut vietnei <ph name="HOST" /> piekļūt kamerai un mikrofonam</translation> @@ -5485,7 +5483,6 @@ <translation id="4779766576531456629">Pārdēvēt eSIM mobilo tīklu</translation> <translation id="4780321648949301421">Saglabāt lapu kā...</translation> <translation id="4780558987886269159">Darbam</translation> -<translation id="4781633367688946589">Turpināt jaunā sesijā</translation> <translation id="4784349455504343791">Vietne <ph name="WEBSITE_ORIGIN" /> vēlas izmantot personas informāciju no jūsu digitālā maka.</translation> <translation id="4785719467058219317">Jūs izmantojat drošības atslēgu, kas nav reģistrēta šajā vietnē</translation> <translation id="4785914069240823137">Atcelt apgriešanu</translation> @@ -6273,6 +6270,7 @@ <translation id="5337926771328966926">Pašreizējais ierīces nosaukums: <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Varat pārlūkot tīmekli privāti, izmantojot inkognito režīma logu.</translation> <translation id="5338503421962489998">Vietējā krātuve</translation> +<translation id="5340620183031438925">Lai MI režīmā uzdotu jautājumus par savu cilni, nepametot lapu, verificējiet savu identitāti. Jūs arī varēsiet piekļūt parolēm un citiem datiem visās savās ierīcēs.</translation> <translation id="5340787663756381836">&Atrast un rediģēt</translation> <translation id="5340900621595888432">Sūtīt diagnostikas un lietojuma datus</translation> <translation id="5341793073192892252">Tālāk norādītie sīkfaili tika bloķēti (trešo pušu sīkfaili tiek bloķēti bez izņēmumiem).</translation> @@ -7456,7 +7454,6 @@ <translation id="6180550893222597997">Kuru piekļuves atslēgu vēlaties izmantot vietnei <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Dažkārt lietotnes atjaunina savu zīmolu. Pirms atjaunināšanas pārskatiet visas izmaiņas, lai pārliecinātos, ka jums tās ir pieņemamas.</translation> <translation id="6181431612547969857">Lejupielāde ir bloķēta.</translation> -<translation id="6182100780603067202">Kopīgot arī lietojumprogrammas audio (no visiem tās logiem)</translation> <translation id="6183369864942961155">Automātisks gaišais/tumšais motīvs</translation> <translation id="6183773856988300112">Gemini pārlūkā Chrome izmanto automātisko pārlūkošanu, lai darbotos jūsu cilnēs un veiktu jūsu dotos uzdevumus. <ph name="LINK_BEGIN" />Uzziniet vairāk<ph name="LINK_END" />.</translation> <translation id="6184099524311454384">Meklēt cilnēs</translation> @@ -8253,7 +8250,6 @@ <translation id="6754359471209693699">Sākt jaunu meklēšanu</translation> <translation id="6754918760968695779">Ātrā ievietošana</translation> <translation id="6755702685749429945">Pievienot vārdnīcu</translation> -<translation id="6756157672127672536">Izmantojot lietotni Faili, varat ērti piekļūt failiem, kas saglabāti Google diskā, ārējā krātuvē vai Chrome OS ierīcē.</translation> <translation id="6756643207511618722">Runas programmas</translation> <translation id="6757431299485455321">Varat palīdzēt citām ierīcēm atrast šo tīklāju.</translation> <translation id="6758056191028427665">Sniedziet atsauksmes par pakalpojuma darbību.</translation> @@ -9200,6 +9196,7 @@ <translation id="7406912950279255498">Krāsu inversijas režīms</translation> <translation id="7407430846095439694">Importēt un saistīt</translation> <translation id="7407504355934009739">Vairums cilvēku bloķē visus paziņojumus no šīs vietnes</translation> +<translation id="7407578029724074226">Fails “<ph name="FILE_NAME" />” ietver sensitīvus datus. Jūsu organizācija ļaus jums to saglabāt mākoņa krātuvē vai atmest.</translation> <translation id="7408080603962564527">Tas būs redzams citiem lietotājiem</translation> <translation id="740810853557944681">Drukas servera pievienošana</translation> <translation id="7409549334477097887">Īpaši augsts</translation> @@ -9253,6 +9250,7 @@ <translation id="7434969625063495310">Nevarēja pievienot drukas serveri. Lūdzu, pārbaudiet servera konfigurāciju un mēģiniet vēlreiz.</translation> <translation id="7436921188514130341">Diemžēl pārdēvēšanas laikā radās kļūda.</translation> <translation id="7439519621174723623">Lai turpinātu, pievienojiet ierīces nosaukumu</translation> +<translation id="743982235360757672">Pārlūkošanas laikā ērti pieejams MI režīms</translation> <translation id="7441736532026945583">Atlasiet vienumu “Paslēpt grupu”, lai noņemtu grupu no ciļņu joslas</translation> <translation id="7441736921018636843">Lai mainītu šo iestatījumu, <ph name="BEGIN_LINK" />atiestatiet sinhronizāciju<ph name="END_LINK" />, lai noņemtu sinhronizācijas ieejas frāzi.</translation> <translation id="7441830548568730290">Citi lietotāji</translation> @@ -9991,7 +9989,6 @@ <translation id="794676567536738329">Apstiprināt atļaujas</translation> <translation id="7947962633355574091">Kopēt videoklipa adresi</translation> <translation id="7947964080535614577">Parasti vietnēs tiek rādītas reklāmas, lai vietnes saturs vai pakalpojumi jums būtu pieejami bez maksas. Taču dažās vietnēs tiek rādītas traucējošas vai maldinošas reklāmas.</translation> -<translation id="7948239795436419268">Neatjaunot logus</translation> <translation id="7948407723851303488">Visas domēna <ph name="DOMAIN_NAME" /> lapas</translation> <translation id="7950629216186736592">Iemesls: funkcijā “Mantoto pārlūku atbalsts” tiek atbalstīti tikai vietrāži URL ar http://, https:// un file://.</translation> <translation id="7950814699499457511">Ieslēgts • Nav norādīta konfidencialitātes prakse šim paplašinājumam, piemēram, kā tas vāc un izmanto datus.</translation> @@ -11180,7 +11177,6 @@ <translation id="8751034568832412184">Skola</translation> <translation id="8751329102746373229">No administratora</translation> <translation id="8752451679755290210">Automātiska pārvietošanās pa vienumiem</translation> -<translation id="8753948258138515839">Izmantojot lietotni Faili, varat ērti piekļūt failiem, kas saglabāti Google diskā, ārējā krātuvē vai Chrome OS Flex ierīcē.</translation> <translation id="8754200782896249056"><p>Lietojot pārlūkprogrammu <ph name="PRODUCT_NAME" /> atbalstītā darbvirsmas vidē, tiks izmantoti sistēmas starpniekservera iestatījumi. Tomēr vai nu sistēma netiek atbalstīta, vai arī radās problēma ar sistēmas konfigurācijas palaišanu.</p> <p>Konfigurēšanai joprojām varat izmantot komandrindu. Plašāku informāciju par karogiem un vides mainīgajiem, lūdzu, skatiet pārlūkprogrammā <code>man <ph name="PRODUCT_BINARY_NAME" /></code>.</p></translation> @@ -11975,6 +11971,7 @@ <translation id="992778845837390402">Šobrīd notiek Linux dublēšana</translation> <translation id="994087375490600917">Sānu paneļi</translation> <translation id="994289308992179865">A&utomātiski atkārtot</translation> +<translation id="995420352808264005">Ierīces reģistrācijas veida izvēle</translation> <translation id="995755448277384931">IBAN pievienošana</translation> <translation id="996250603853062861">Notiek droša savienojuma izveidošana...</translation> <translation id="997143476478634194">Vietnēs tiks automātiski lietots šis iestatījums, kad tās apmeklēsiet. Vietnēs parasti tiek sūtīti paziņojumi, lai informētu par svarīgiem jaunumiem vai tērzēšanas ziņojumiem.</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index 3d90f5ec..b6727d2c 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Не може да се преземат датотеки со прибелешки за главниот нод. Обидете се повторно подоцна.</translation> <translation id="1103523840287552314">Секогаш преведувај <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Веднаш ќе го изгубите пристапот до групава картички и таа ќе се избрише од сите ваши уреди</translation> +<translation id="1105934302947321130">Google Beam со Zoom</translation> <translation id="1106270460549661906">Сопри го споделувањето со Gemini</translation> <translation id="1106350001632362876">Зголеми го прагот</translation> <translation id="110850812463801904">Поврзете се на OneDrive рачно</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Вашиот безбедносен клуч не е заштитен со PIN. За да управувате со податоците за најавување, прво создајте PIN.</translation> <translation id="1179400851034021914">IBAN е неважечки</translation> <translation id="1179902906564467236">Следете ги упатствата на телефонот или користете ја апликацијата за камера</translation> -<translation id="1180117276105724040">Се враќаат прозорците од претходната сесија…</translation> <translation id="118057123461613219">Огромни заштеди</translation> <translation id="1181037720776840403">Отстрани</translation> <translation id="1182876754474670069">home</translation> @@ -763,7 +763,6 @@ <translation id="151501797353681931">Увезени од Safari</translation> <translation id="1515163294334130951">Стартувај</translation> <translation id="1517467582299994451">За да емитувате со код, вклучете ги поставките за синхронизација на прелистувачот Chrome</translation> -<translation id="1519090060276706457">Враќањето на прозорците трае подолго од очекуваното</translation> <translation id="1521442365706402292">Управување со сертификати</translation> <translation id="1521655867290435174">Табели на Google</translation> <translation id="1521774566618522728">Активен денес</translation> @@ -1112,6 +1111,7 @@ <translation id="1745732479023874451">Управувајте со контакти</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}one{Да се отворат и изменат # датотека во оваа веб-апликација?}other{Да се отворат и изменат # датотеки во оваа веб-апликација?}}</translation> <translation id="1748563609363301860">Отсега може да ја зачувате лозинкава во сметката на Google или само на уредов</translation> +<translation id="1749645492410897998">Софтверот се инсталира</translation> <translation id="1749733017156547309">Полето за лозинката е задолжително</translation> <translation id="1750172676754093297">Вашиот безбедносен клуч не може да складира отпечатоци</translation> <translation id="1750238553597293878">Продолжете да ги користите лозинките во вашата сметка на Google</translation> @@ -1183,7 +1183,6 @@ <translation id="1796460466266263589">За да продолжите да го користите Gemini, потврдете дека сте вие</translation> <translation id="1796588414813960292">Функциите на коишто им требаат звуци нема да работат</translation> <translation id="1798726622311813209">Кредитни и дебитни картички</translation> -<translation id="1799852120691957794">Не може да се вратат прозорците од претходната сесија</translation> <translation id="180203835522132923">Search + O, потоа W</translation> <translation id="1802624026913571222">Режим во мирување кога капакот е затворен</translation> <translation id="1802687198411089702">Страницава не реагира. Може да почекате или да излезете.</translation> @@ -2380,7 +2379,6 @@ <translation id="2610374175948698697">Може да ги гледаат датотеките или папките на уредот</translation> <translation id="2610780100389066815">Запишување во список за доверба на Microsoft</translation> <translation id="261114180663074524">Најавете се на вашата сметка на Microsoft, па обидете се повторно</translation> -<translation id="2611702650078660078">Се јави грешка</translation> <translation id="2611776654555141051">Алатка за правоаголник</translation> <translation id="2611885296070244383">Микрофон (внатрешен)</translation> <translation id="2612676031748830579">Број на картичка</translation> @@ -2744,7 +2742,6 @@ <translation id="285033512555869047">Затворено</translation> <translation id="2850541429955027218">Додај тема</translation> <translation id="2851291081585704741">Офлајн сте</translation> -<translation id="2852045827873867442">Интернет‑врската е задолжителна.</translation> <translation id="285237063405807022">(се вчитува)</translation> <translation id="2853121255651601031">Лозинката е зачувана</translation> <translation id="2854453262159518435">Заменете ја постојната група картички</translation> @@ -3611,6 +3608,7 @@ <translation id="3473241910002674503">Одете на почетен екран, вратете се назад и префрлајте меѓу апликации со копчиња во режим на таблет.</translation> <translation id="3473479545200714844">Лупа за екран</translation> <translation id="3474218480460386727">Користете до 99 букви за новите зборови</translation> +<translation id="3474330892505468100">Google Beam со Meet</translation> <translation id="3474624961160222204">Продолжете како <ph name="NAME" /></translation> <translation id="3477772589943384839">Умерена заштеда на меморија. Вашите картички стануваат неактивни по подолг временски период.</translation> <translation id="347785443197175480">Продолжи дозволувајќи <ph name="HOST" /> да пристапи до вашата камера и микрофон</translation> @@ -5499,7 +5497,6 @@ <translation id="4779766576531456629">Преименувајте ја мобилната мрежа на eSIM</translation> <translation id="4780321648949301421">Зачувај страница како...</translation> <translation id="4780558987886269159">За работа</translation> -<translation id="4781633367688946589">Продолжи во нова сесија</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> сака да користи лични податоци од вашиот дигитален паричник.</translation> <translation id="4785719467058219317">Користите безбедносен клуч што не е регистриран на веб-сајтов</translation> <translation id="4785914069240823137">Откажи го сечењето</translation> @@ -6288,6 +6285,7 @@ <translation id="5337926771328966926">Името на тековниот уред е <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Може да прелистувате приватно во прозорец „Инкогнито“</translation> <translation id="5338503421962489998">Локално складирање</translation> +<translation id="5340620183031438925">Потврдете дека сте вие за да го прашате „AI-режимот“ за вашата картичка без да ја напуштите страницата. Ќе ги добиете и вашите лозинки и друго на сите ваши уреди.</translation> <translation id="5340787663756381836">&Најдете и изменете</translation> <translation id="5340900621595888432">Испраќај дијагностички податоци и податоци за користењето</translation> <translation id="5341793073192892252">Следниве колачиња се блокирани (колачињата од трети лица се блокираат без исклучок)</translation> @@ -7474,7 +7472,6 @@ <translation id="6180550893222597997">Кој криптографски клуч сакате да го користите за <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Апликациите понекогаш го променуваат своето брендирање. Пред да промените, прегледајте ги сите промени за да потврдите дека ви одговараат.</translation> <translation id="6181431612547969857">Преземањето е блокирано</translation> -<translation id="6182100780603067202">Споделувај и аудио од апликацијата (од сите нејзини прозорци)</translation> <translation id="6183369864942961155">Автоматска „Светла тема“/„Темна тема“</translation> <translation id="6183773856988300112">Gemini во Chrome ја користи „Автоматско прелистување“ за да функционира во вашите картички и да ги завршува задачите што му ги задавате. <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Пребарајте ги картичките</translation> @@ -8269,7 +8266,6 @@ <translation id="6754359471209693699">Започни ново пребарување</translation> <translation id="6754918760968695779">Брзо вметнување</translation> <translation id="6755702685749429945">Додајте речник</translation> -<translation id="6756157672127672536">Апликацијата „Датотеки“ овозможува брз пристап до датотеките што сте ги зачувале на Google Drive, екстерен капацитет или уред со Chrome OS.</translation> <translation id="6756643207511618722">Софтвер за говор</translation> <translation id="6757431299485455321">Помогни другите уреди да ја најдат точкава на пристап.</translation> <translation id="6758056191028427665">Оценете ја нашата работа.</translation> @@ -9215,6 +9211,7 @@ <translation id="7406912950279255498">Режим за инверзија на боите</translation> <translation id="7407430846095439694">Увези и врзи</translation> <translation id="7407504355934009739">Повеќето луѓе ги блокираат известувањата од сајтов</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> содржи чувствителни податоци. Вашата организација ќе ви дозволи да ја зачувате во просторот во облакот или да ја отфрлите</translation> <translation id="7408080603962564527">Други ќе можат да го видат ова</translation> <translation id="740810853557944681">Додајте сервер за печатење</translation> <translation id="7409549334477097887">Многу голем</translation> @@ -9268,6 +9265,7 @@ <translation id="7434969625063495310">Не може да се додаде серверот за печатење. Проверете ја конфигурацијата на серверот и обидете се повторно.</translation> <translation id="7436921188514130341">Да му се сневиди! Настана грешка за време на форматирањето.</translation> <translation id="7439519621174723623">Додајте име на уредот за да продолжите</translation> +<translation id="743982235360757672">„AI-режимот“ нека биде во близина додека прелистувате</translation> <translation id="7441736532026945583">Изберете „Криење група“ за да ја отстраните групата од лентата за картички</translation> <translation id="7441736921018636843">За да ја измените поставкава, <ph name="BEGIN_LINK" />ресетирајте ја синхронизацијата<ph name="END_LINK" /> и отстранете ја лозинката за синхронизација</translation> <translation id="7441830548568730290">Други корисници</translation> @@ -10006,7 +10004,6 @@ <translation id="794676567536738329">Потврди дозволи</translation> <translation id="7947962633355574091">К&опирај ја адресата на видеото</translation> <translation id="7947964080535614577">Сајтовите обично прикажуваат реклами за да понудат бесплатни содржини или услуги. Но, за некои сајтови е познато дека прикажуваат нападни или лажни реклами.</translation> -<translation id="7948239795436419268">Не враќај ги прозорците</translation> <translation id="7948407723851303488">Сите страници од <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Причина: LBS поддржува само http://, https:// и file:// URL-адреси.</translation> <translation id="7950814699499457511">Вклучено • Екстензијава нема објавено практики за приватност, како на пример, како прибира и користи податоци</translation> @@ -11195,7 +11192,6 @@ <translation id="8751034568832412184">Училиште</translation> <translation id="8751329102746373229">Од администраторот</translation> <translation id="8752451679755290210">Автоматски преместувајте се од ставка на ставка</translation> -<translation id="8753948258138515839">Апликацијата Датотеки овозможува брз пристап до датотеки што сте ги зачувале на Google Drive, надворешен склад или уред со ChromeOS Flex.</translation> <translation id="8754200782896249056"><p>Кога <ph name="PRODUCT_NAME" /> работи во поддржана околина за работна површина, ќе се користат поставките за прокси на системот. Меѓутоа, или системот не е поддржан или имаше проблем при стартувањето на системската конфигурација.</p> <p>Сепак, сѐ уште може да конфигурирате преку командната линија. Погледнете <code>man <ph name="PRODUCT_BINARY_NAME" /></code> за повеќе информации за знаменцата и променливите на околината.</p></translation> @@ -11989,6 +11985,7 @@ <translation id="992778845837390402">Во моментов се врши бекап на Linux</translation> <translation id="994087375490600917">Странични табли</translation> <translation id="994289308992179865">&Повторувај</translation> +<translation id="995420352808264005">Изберете го типот регистрирање на уредот</translation> <translation id="995755448277384931">Додајте IBAN</translation> <translation id="996250603853062861">Се воспоставува безбедна врска...</translation> <translation id="997143476478634194">Сајтовите автоматски ја следат оваа поставка кога ги посетувате. Сајтовите обично испраќаат известувања за да ве информираат за ударни вести или пораки од разговорите.</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 991b6e6..61b2fd1 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -285,7 +285,6 @@ <translation id="117916940443676133">പിൻ ഉപയോഗിച്ച് നിങ്ങളുടെ സുരക്ഷാ കീ പരിരക്ഷിച്ചിട്ടില്ല. സൈൻ ഇൻ ഡാറ്റ മാനേജ് ചെയ്യാൻ, ആദ്യം ഒരു പിൻ സൃഷ്ടിക്കുക.</translation> <translation id="1179400851034021914">IBAN അസാധുവാണ്</translation> <translation id="1179902906564467236">നിങ്ങളുടെ ഫോണിലെ നിർദ്ദേശങ്ങൾ പാലിക്കുക അല്ലെങ്കിൽ ക്യാമറാ ആപ്പ് ഉപയോഗിക്കുക</translation> -<translation id="1180117276105724040">നിങ്ങളുടെ മുമ്പത്തെ സെഷനിൽ നിന്ന് വിൻഡോകൾ പുനഃസ്ഥാപിക്കുന്നു...</translation> <translation id="118057123461613219">വളരെയധികം ലാഭിക്കൽ</translation> <translation id="1181037720776840403">നീക്കംചെയ്യൂ</translation> <translation id="1182876754474670069">വീട്</translation> @@ -759,7 +758,6 @@ <translation id="151501797353681931">Safari യില് നിന്നും ഇറക്കുമതി ചെയ്തത്</translation> <translation id="1515163294334130951">ലോഞ്ച് ചെയ്യുക</translation> <translation id="1517467582299994451">കോഡ് ഉപയോഗിച്ച് കാസ്റ്റ് ചെയ്യാൻ, Chrome ബ്രൗസർ സമന്വയിപ്പിക്കൽ ക്രമീകരണം ഓണാക്കുക</translation> -<translation id="1519090060276706457">വിൻഡോകൾ പുനഃസ്ഥാപിക്കുന്നതിന് പ്രതീക്ഷിച്ചതിലും കൂടുതൽ സമയമെടുക്കുന്നു</translation> <translation id="1521442365706402292">സര്ട്ടിഫിക്കറ്റുകള് മാനേജ് ചെയ്യുക</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">ഇന്ന് സജീവമായിരുന്നു</translation> @@ -1172,7 +1170,6 @@ <translation id="1796460466266263589">Gemini ഉപയോഗിക്കുന്നത് തുടരാൻ, ഇത് നിങ്ങൾ തന്നെയാണെന്ന് പരിശോധിച്ചുറപ്പിക്കൂ</translation> <translation id="1796588414813960292">ശബ്ദം ആവശ്യമായ ഫീച്ചറുകൾ പ്രവർത്തിക്കില്ല</translation> <translation id="1798726622311813209">ക്രെഡിറ്റ്, ഡെബിറ്റ് കാർഡുകൾ</translation> -<translation id="1799852120691957794">നിങ്ങളുടെ മുമ്പത്തെ സെഷനിൽ നിന്ന് വിൻഡോകൾ പുനഃസ്ഥാപിക്കാൻ കഴിയുന്നില്ല</translation> <translation id="180203835522132923">Search + O, തുടർന്ന് W</translation> <translation id="1802624026913571222">കവർ അടയ്ക്കുമ്പോൾ ഉറക്ക മോഡിലേക്ക് മാറുന്നു</translation> <translation id="1802687198411089702">പേജ് പ്രതികരിക്കുന്നില്ല. പ്രതികരണത്തിനായി കാത്തിരിക്കുകയോ പുറത്ത് കടക്കുകയോ ചെയ്യാം.</translation> @@ -2364,7 +2361,6 @@ <translation id="2610374175948698697">നിങ്ങളുടെ ഉപകരണത്തിലെ ഫയലുകളോ ഫോൾഡറുകളോ കാണാനാകും</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">നിങ്ങളുടെ Microsoft അക്കൗണ്ടിൽ സൈൻ ഇൻ ചെയ്ത് വീണ്ടും ശ്രമിക്കുക</translation> -<translation id="2611702650078660078">പിശക് സംഭവിച്ചു</translation> <translation id="2611776654555141051">ദീർഘചതുര ടൂൾ</translation> <translation id="2611885296070244383">മൈക്ക് (ഇന്റേണൽ)</translation> <translation id="2612676031748830579">കാർഡ് നമ്പർ</translation> @@ -2728,7 +2724,6 @@ <translation id="285033512555869047">അടച്ചു</translation> <translation id="2850541429955027218">തീം ചേർക്കുക</translation> <translation id="2851291081585704741">നിങ്ങൾ ഓഫ്ലൈനാണ്</translation> -<translation id="2852045827873867442">ഇന്റർനെറ്റ് കണക്ഷൻ ആവശ്യമാണ്.</translation> <translation id="285237063405807022">(ലോഡ് ചെയ്യുന്നു)</translation> <translation id="2853121255651601031">പാസ്വേഡ് സംരക്ഷിച്ചു</translation> <translation id="2854453262159518435">നിലവിലുള്ള ടാബ് ഗ്രൂപ്പ് റീപ്ലെയ്സ് ചെയ്യുക</translation> @@ -5483,7 +5478,6 @@ <translation id="4779766576531456629">ഇ-സിം സെല്ലുലാർ നെറ്റ്വർക്കിന്റെ പേര് മാറ്റുക</translation> <translation id="4780321648949301421">പേജ് ഇതുപോലെ സംരക്ഷിക്കുക...</translation> <translation id="4780558987886269159">ഔദ്യോഗികം</translation> -<translation id="4781633367688946589">പുതിയ സെഷനിലേക്ക് തുടരുക</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> എന്നതിന് നിങ്ങളുടെ ഡിജിറ്റൽ വാലറ്റിൽ നിന്ന് വ്യക്തിപരമായ വിവരങ്ങൾ ഉപയോഗിക്കണമെന്നുണ്ട്.</translation> <translation id="4785719467058219317">ഈ വെബ്സൈറ്റിൽ രജിസ്റ്റർ ചെയ്തിട്ടില്ലാത്ത ഒരു സുരക്ഷാ കീ ആണ് നിങ്ങൾ ഉപയോഗിക്കുന്നത്</translation> <translation id="4785914069240823137">അരിക് വെട്ടൽ റദ്ദാക്കുക</translation> @@ -7459,7 +7453,6 @@ <translation id="6180550893222597997"><ph name="APP_NAME" /> എന്നതിനായി ഏത് പാസ്കീ ഉപയോഗിക്കാനാണ് നിങ്ങൾ ആഗ്രഹിക്കുന്നത്?</translation> <translation id="6181218116951226898">ആപ്പുകൾ ചിലപ്പോൾ അവയുടെ ബ്രാൻഡിംഗ് അപ്ഡേറ്റ് ചെയ്യാറുണ്ട്. അപ്ഡേറ്റ് ചെയ്യുന്നതിനുമുമ്പ്, എല്ലാ മാറ്റങ്ങളും അവലോകനം ചെയ്ത് അവ സ്വീകാര്യമാണെന്ന് ഉറപ്പാക്കുക.</translation> <translation id="6181431612547969857">ഡൗൺലോഡ് തടഞ്ഞു</translation> -<translation id="6182100780603067202">ആപ്പ് ഓഡിയോയും പങ്കിടുക (അതിന്റെ എല്ലാ വിൻഡോകളിൽ നിന്നും)</translation> <translation id="6183369864942961155">സ്വയമേവയുള്ള ലൈറ്റ്/ഡാർക്ക് തീം</translation> <translation id="6183773856988300112">നിങ്ങളുടെ ടാബുകളിൽ പ്രവർത്തിക്കാനും നിങ്ങൾ നൽകുന്ന ടാസ്ക്കുകൾ പൂർത്തിയാക്കാനും Chrome-ലെ Gemini ഓട്ടോ ബ്രൗസ് ഉപയോഗിക്കുന്നു. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="6184099524311454384">ടാബുകൾ തിരയുക</translation> @@ -8252,7 +8245,6 @@ <translation id="6754359471209693699">പുതിയ തിരയൽ ആരംഭിക്കുക</translation> <translation id="6754918760968695779">ക്വിക്ക് ഇൻസേർട്ട്</translation> <translation id="6755702685749429945">നിഘണ്ടു ചേർക്കുക</translation> -<translation id="6756157672127672536">Files ആപ്പ്, നിങ്ങൾ Google Drive-ലോ എക്സ്റ്റേണൽ സ്റ്റോറേജിലോ ChromeOS ഉപകരണത്തിലോ സംരക്ഷിച്ചിരിക്കുന്ന ഫയലുകളിലേക്ക് അതിവേഗ ആക്സസ് നൽകുന്നു.</translation> <translation id="6756643207511618722">സ്പീച്ച് എഞ്ചിനുകൾ</translation> <translation id="6757431299485455321">ഈ ഹോട്ട്സ്പോട്ട് കണ്ടെത്താൻ മറ്റ് ഉപകരണങ്ങളെ സഹായിക്കുക.</translation> <translation id="6758056191028427665">ഞങ്ങളുടെ പ്രവർത്തനത്തെക്കുറിച്ചുള്ള അഭിപ്രായം അറിയിക്കൂ.</translation> @@ -9991,7 +9983,6 @@ <translation id="794676567536738329">അനുവാദങ്ങൾ സ്ഥിരീകരിക്കുക</translation> <translation id="7947962633355574091">വീഡിയോ വിലാസം പകർത്തുക</translation> <translation id="7947964080535614577">സേവനങ്ങളും ഉള്ളടക്കവും നിരക്കില്ലാതെ നൽകാൻ സൈറ്റുകൾ സാധാരണയായി പരസ്യങ്ങൾ കാണിക്കുന്നു. എന്നാൽ ചില സൈറ്റുകൾ അനാവശ്യമോ തെറ്റിദ്ധരിപ്പിക്കുന്നതോ ആയ പരസ്യങ്ങൾ കാണിക്കുന്നു.</translation> -<translation id="7948239795436419268">വിൻഡോകൾ പുനഃസ്ഥാപിക്കരുത്</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" /> എന്നതിന്റെ എല്ലാ പേജുകളും</translation> <translation id="7950629216186736592">കാരണം: http://, https://, file:// എന്നീ URL-കൾ മാത്രമേ LBS പിന്തുണയ്ക്കുന്നുള്ളൂ.</translation> <translation id="7950814699499457511">ഓണാണ് • ഡാറ്റ ശേഖരിക്കുന്നതും ഉപയോഗിക്കുന്നതും എങ്ങനെയാണെന്നത് പോലുള്ള സ്വകാര്യതാ വ്യവസ്ഥകൾ ഈ വിപുലീകരണം പ്രസിദ്ധീകരിച്ചിട്ടില്ല</translation> @@ -11180,7 +11171,6 @@ <translation id="8751034568832412184">സ്കൂൾ</translation> <translation id="8751329102746373229">നിങ്ങളുടെ അഡ്മിനിൽ നിന്നുള്ളവ</translation> <translation id="8752451679755290210">ഇനങ്ങളിലൂടെ സ്വയമേവ നീങ്ങുക</translation> -<translation id="8753948258138515839">Files ആപ്പ്, നിങ്ങൾ Google Drive-ലോ ബാഹ്യ സ്റ്റോറേജിലോ നിങ്ങളുടെ ChromeOS Flex ഉപകരണത്തിലോ സംരക്ഷിച്ചിരിക്കുന്ന ഫയലുകളിലേക്ക് അതിവേഗ ആക്സസ് നൽകുന്നു.</translation> <translation id="8754200782896249056"><p> ഒരു പിന്തുണ ഡെസ്ക്ടോപ്പ് പരിതസ്ഥിതിയ്ക്ക് കീഴിൽ <ph name="PRODUCT_NAME" /> പ്രവർത്തിക്കുമ്പോൾ, സിസ്റ്റം പ്രോക്സി ക്രമീകരണം ഉപയോഗിക്കും. നിങ്ങളുടെ സിസ്റ്റം പിന്തുണച്ചില്ല അല്ലെങ്കിൽ നിങ്ങളുടെ സിസ്റ്റം കോൺഫിഗറേഷൻ സമാരംഭിക്കുന്നതിൽ ഒരു പ്രശ്നമുണ്ടായി.</p> <p>പക്ഷേ കമാൻഡ് ലൈൻ വഴി നിങ്ങൾക്ക് ഇപ്പോഴും കോൺഫിഗർ ചെയ്യാനാവും. ഫ്ലാഗുകളെയും പരിതസ്ഥിതി വേരിയബിളുകളെയും കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾക്ക് <code>man <ph name="PRODUCT_BINARY_NAME" /></code>കാണുക .</p></translation> <translation id="8755175579224030324">ഉപകരണത്തിൽ സംഭരിച്ചിരിക്കുന്ന സർട്ടിഫിക്കറ്റുകളും കീകളും മാനേജ് ചെയ്യുന്നത് പോലുള്ള സുരക്ഷയുമായി ബന്ധപ്പെട്ട ടാസ്കുകൾ നിങ്ങളുടെ സ്ഥാപനത്തിനായി നിർവഹിക്കുക</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index afc45e8..c17bc43 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Үндсэн зангилааны тэмдэглэгээний файлуудыг татаж чадсангүй. Дараа дахин оролдоно уу.</translation> <translation id="1103523840287552314"><ph name="LANGUAGE" />-ийг үргэлж орчуулах</translation> <translation id="1104098698795583187">Та энэ табын бүлэгт хандах эрхээ тэр даруй алдах ба уг бүлгийг таны бүх төхөөрөмжөөс устгана</translation> +<translation id="1105934302947321130">Zoom-тэй Google Beam</translation> <translation id="1106270460549661906">Gemini-тай хуваалцахыг болих</translation> <translation id="1106350001632362876">Босгыг нэмэх</translation> <translation id="110850812463801904">OneDrive-т гар аргаар холбогдох</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Таны аюулгүй байдлын түлхүүр ПИН-р хамгаалагдаагүй байна. Нэвтрэх өгөгдлийг удирдахын тулд эхлээд ПИН үүсгэнэ үү.</translation> <translation id="1179400851034021914">IBAN буруу байна</translation> <translation id="1179902906564467236">Утасныхаа зааварчилгааг дагах эсвэл камерын аппыг ашиглана уу</translation> -<translation id="1180117276105724040">Таны өмнөх харилцан үйлдлээс цонхнуудыг сэргээж байна...</translation> <translation id="118057123461613219">Маш том хэмнэлт</translation> <translation id="1181037720776840403">Хасах</translation> <translation id="1182876754474670069">үндсэн нүүр</translation> @@ -759,7 +759,6 @@ <translation id="151501797353681931">Safari-аас импортолж авсан</translation> <translation id="1515163294334130951">Эхлүүлэх</translation> <translation id="1517467582299994451">Кодоор дамжуулахын тулд Chrome хөтчийн синк хийх тохиргоог асаана уу</translation> -<translation id="1519090060276706457">Цонхыг сэргээхэд тооцоолсноос удаж байна</translation> <translation id="1521442365706402292">Гэрчилгээг удирдан зохион байгуулах</translation> <translation id="1521655867290435174">Google Хүснэгт</translation> <translation id="1521774566618522728">Өнөөдөр идэвхтэй</translation> @@ -1108,6 +1107,7 @@ <translation id="1745732479023874451">Харилцагчдыг удирдах</translation> <translation id="1748283190377208783">{0,plural, =1{ашиглаагүй олон тооны төлөв}other{# файлыг энэ веб аппад нээж, засах уу?}}</translation> <translation id="1748563609363301860">Та энэ нууц үгийг Google Бүртгэлдээ эсвэл зөвхөн энэ төхөөрөмж дээр хадгалах боломжтой</translation> +<translation id="1749645492410897998">Программ хангамжийг суулгаж байна</translation> <translation id="1749733017156547309">Нууц үг шаардлагатай</translation> <translation id="1750172676754093297">Таны аюулгүй байдлын түлхүүрт хурууны хээ хадгалах боломжгүй</translation> <translation id="1750238553597293878">Google Бүртгэлдээ нууц үгнүүдийг үргэлжлүүлэн ашиглана уу</translation> @@ -1179,7 +1179,6 @@ <translation id="1796460466266263589">Gemini-г үргэлжлүүлэн ашиглахын тулд өөрийгөө мөн болохыг баталгаажуулна уу</translation> <translation id="1796588414813960292">Дуу чимээ шаардлагатай онцлогууд ажиллахгүй</translation> <translation id="1798726622311813209">Кредит, дебит карт</translation> -<translation id="1799852120691957794">Таны өмнөх харилцан үйлдлээс цонх сэргээх боломжгүй</translation> <translation id="180203835522132923">Search + O, дараа нь W</translation> <translation id="1802624026913571222">Хавтас хаалттай үед идэвхгүй болгох</translation> <translation id="1802687198411089702">Хуудас хариу өгөхгүй байна. Та хариу өгтөл нь хүлээх эсвэл гарах боломжтой.</translation> @@ -2375,7 +2374,6 @@ <translation id="2610374175948698697">Таны төхөөрөмжийн файл эсвэл фолдеруудыг харах боломжтой</translation> <translation id="2610780100389066815">Microsoft-ын Итгэлцлийн Жагсаалтад гарын үсэг зурах явц</translation> <translation id="261114180663074524">Microsoft бүртгэлдээ нэвтэрч, дараа дахин оролдоно уу</translation> -<translation id="2611702650078660078">Алдаа гарлаа</translation> <translation id="2611776654555141051">Тэгш өнцөгтийн хэрэгсэл</translation> <translation id="2611885296070244383">Микрофон (дотоод)</translation> <translation id="2612676031748830579">Картын дугаар</translation> @@ -2739,7 +2737,6 @@ <translation id="285033512555869047">Хаалттай</translation> <translation id="2850541429955027218">Загвар нэмэх</translation> <translation id="2851291081585704741">Та офлайн байна</translation> -<translation id="2852045827873867442">Интернэтэд холбогдох шаардлагатай.</translation> <translation id="285237063405807022">(ачаалж байна)</translation> <translation id="2853121255651601031">Нууц үгийг хадгалсан</translation> <translation id="2854453262159518435">Одоо байгаа табын бүлгийг солих</translation> @@ -3606,6 +3603,7 @@ <translation id="3473241910002674503">Таблет горимд товчлуур ашиглан нүүр лүү шилжих, буцах, аппуудын хооронд сэлгэх.</translation> <translation id="3473479545200714844">Дэлгэц Томруулах</translation> <translation id="3474218480460386727">Шинэ үгэнд 99 эсвэл үүнээс цөөн үсэг ашиглана уу</translation> +<translation id="3474330892505468100">Meet-тэй Google Beam</translation> <translation id="3474624961160222204"><ph name="NAME" />-р үргэлжлүүлэх</translation> <translation id="3477772589943384839">Санах ойн дунд зэргийн хэмнэлт хийгээрэй. Илүү урт хугацааны дараа таны табууд идэвхгүй болно.</translation> <translation id="347785443197175480"><ph name="HOST" />-д таны камер болон микрофон руу нэвтрэхийг үргэлжлүүлэн зөвшөөр</translation> @@ -5493,7 +5491,6 @@ <translation id="4779766576531456629">eSIM-н үүрэн холбооны сүлжээний нэрийг өөрчлөх</translation> <translation id="4780321648949301421">Хуудсыг... хэлбэрээр хадгалах</translation> <translation id="4780558987886269159">Ажилд зориулсан</translation> -<translation id="4781633367688946589">Шинэ харилцан үйлдэл рүү үргэлжлүүлэх</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> таны дижитал түрийвчээс хувийн мэдээллийг ашиглахыг хүсэж байна.</translation> <translation id="4785719467058219317">Та энэ веб сайтад бүртгүүлээгүй аюулгүй байдлын түлхүүрийг ашиглаж байна</translation> <translation id="4785914069240823137">Тайралтыг цуцална уу</translation> @@ -6282,6 +6279,7 @@ <translation id="5337926771328966926">Одоогийн төхөөрөмжийн нэр <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Та Нууцлалтай цонхыг ашиглан нууцлалтайгаар үзэх боломжтой</translation> <translation id="5338503421962489998">Суурин хадгалалт</translation> +<translation id="5340620183031438925">Хуудаснаас гарахгүйгээр ХОУ-ы горимоос табынхаа талаар асуухын тулд өөрийгөө мөн болохыг баталгаажуулна уу. Та мөн бүх төхөөрөмж дээрээ нууц үг болон бусад зүйлээ авна.</translation> <translation id="5340787663756381836">&Олоод засах</translation> <translation id="5340900621595888432">Оношилгоо болон ашиглалтын өгөгдлийг илгээнэ үү</translation> <translation id="5341793073192892252">Дараах күүкийг блоклосон байна (гуравдагч талын күүкийг ямар нэгэн сонголтгүйгээр блоклосон)</translation> @@ -7468,7 +7466,6 @@ <translation id="6180550893222597997">Та <ph name="APP_NAME" />-д ямар passkey ашиглахыг хүсэж байна вэ?</translation> <translation id="6181218116951226898">Апп заримдаа брэндингээ шинэчилдэг. Шинэчлэхээсээ өмнө бүх өөрчлөлтийг хянаж танд тохиромжтой эсэхийг нягтлаарай.</translation> <translation id="6181431612547969857">Татаж авах ажиллагаа хаагдлаа</translation> -<translation id="6182100780603067202">Мөн аппликейшны аудиог хуваалцах (бүх цонхноос нь)</translation> <translation id="6183369864942961155">Автомат цайвар/бараан загвар</translation> <translation id="6183773856988300112">Chrome дахь Gemini таны табд ажиллаж, таны өгсөн даалгаврыг гүйцэтгэхийн тулд автоматаар үзэх онцлогийг ашигладаг. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Табыг хайх</translation> @@ -8261,7 +8258,6 @@ <translation id="6754359471209693699">Шинээр хайж эхлэх</translation> <translation id="6754918760968695779">Шуурхай оруулга</translation> <translation id="6755702685749429945">Толь бичиг нэмэх</translation> -<translation id="6756157672127672536">Файлс апп нь таны Google Драйв, гадаад хадгалах сан эсвэл ChromeOS төхөөрөмж дээр хадгалсан файлуудад шуурхай хандалт олгоно.</translation> <translation id="6756643207511618722">Ярианы хөдөлгүүр</translation> <translation id="6757431299485455321">Бусад төхөөрөмжүүдэд энэ сүлжээний цэгийг олоход тусална уу.</translation> <translation id="6758056191028427665">Биднийг хэр ажиллаж байгааг мэдэгдэнэ үү.</translation> @@ -9207,6 +9203,7 @@ <translation id="7406912950279255498">Өнгө урвуулах горим</translation> <translation id="7407430846095439694">Импортлох, батлах</translation> <translation id="7407504355934009739">Ихэнх хүн энэ сайтын мэдэгдлийг хориглодог</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" />-д эмзэг өгөгдөл байна. Танай байгууллага үүнийг үүлэн хадгалах санд хадгалах эсвэл устгах боломжийг танд олгоно.</translation> <translation id="7408080603962564527">Энэ нь бусдад харагдах болно</translation> <translation id="740810853557944681">Хэвлэх сервер нэмэх</translation> <translation id="7409549334477097887">Маш том</translation> @@ -9260,6 +9257,7 @@ <translation id="7434969625063495310">Хэвлэх серверийг нэмж чадсангүй. Серверийн тохируулгыг шалгаад дахин оролдоно уу.</translation> <translation id="7436921188514130341">Уучлаарай! Нэр өөрчлөхөд алдаа гарлаа.</translation> <translation id="7439519621174723623">Үргэлжлүүлэхийн тулд төхөөрөмжийн нэр нэмнэ үү</translation> +<translation id="743982235360757672">Үзэж байхдаа ХОУ-ы горимыг ойр байлгаарай</translation> <translation id="7441736532026945583">Таб зурвасаасаа бүлгийг хасахын тулд "Бүлгийг нуух"-ыг сонгоно уу</translation> <translation id="7441736921018636843">Энэ тохиргоог өөрчлөхийн тулд <ph name="BEGIN_LINK" />синкийг шинэчилж<ph name="END_LINK" />, синкийн нэвтрэх үгийг устгана уу</translation> <translation id="7441830548568730290">Бусад хэрэглэгч</translation> @@ -9998,7 +9996,6 @@ <translation id="794676567536738329">Зөвшөөрлүүдийг баталгаажуул</translation> <translation id="7947962633355574091">Видеоны хаягийг хуулах</translation> <translation id="7947964080535614577">Сайтууд ихэвчлэн үнэ төлбөргүй контент харуулах эсвэл үйлчилгээ үзүүлэхийн тулд зар харуулдаг. Гэсэн хэдий ч зарим сайт төвөгтэй эсвэл хуурамч зар харуулдаг.</translation> -<translation id="7948239795436419268">Цонхыг бүү сэргээ</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" />-н бүх хуудас</translation> <translation id="7950629216186736592">Шалтгаан: LBS нь зөвхөн http://, https://, болон file:// гэсэн URL-уудыг дэмждэг.</translation> <translation id="7950814699499457511">Асаалттай • Энэ өргөтгөл өгөгдлийг хэрхэн цуглуулж, ашигладаг гэх мэт нууцлалын практикаа нийтлээгүй байна</translation> @@ -11186,7 +11183,6 @@ <translation id="8751034568832412184">Сургууль</translation> <translation id="8751329102746373229">Таны администратораас</translation> <translation id="8752451679755290210">Зүйлс хооронд автоматаар шилжих</translation> -<translation id="8753948258138515839">Files апп нь таны Google Драйв, гадаад хадгалах сан эсвэл ChromeOS Flex төхөөрөмж дээр хадгалсан файлуудад шуурхай хандалт олгоно.</translation> <translation id="8754200782896249056"><p> Дэмжлэг бүхий дэлгэцийн орчинд <ph name="PRODUCT_NAME" />-г ачаалж байх үед системийн proxy тохиргоог ашиглана. Гэхдээ таны систед аливаа дэмжлэг байхгүй эсвэл таны системийн тохиргоо нь алдаатай байж болох юм.</p> <p>Та системын тохиргоог тушаалын мөрөөр дамжуулан хийх боломжтой. <code>man <ph name="PRODUCT_BINARY_NAME" /></code> -с туг болон орчны хувьсагчийн талаарх нэмэлт мэдээллийг авах боломжтой.</p></translation> <translation id="8755175579224030324">Төхөөрөмжид хадгалсан гэрчилгээ болон түлхүүрийг удирдах зэрэг танай байгууллагын аюулгүй байдалтай холбоотой ажлуудыг гүйцэтгэх</translation> <translation id="875532100880844232"><ph name="DEVICE_NAME" />-д товч бүрд үйлдэл сонгоно уу</translation> @@ -11977,6 +11973,7 @@ <translation id="992778845837390402">Linux-г одоогоор нөөцөлж байна</translation> <translation id="994087375490600917">Хажуугийн самбар</translation> <translation id="994289308992179865">& Гогцоо</translation> +<translation id="995420352808264005">Төхөөрөмжийн бүртгэлийн төрлийг сонгох</translation> <translation id="995755448277384931">Олон улсын банк акаунтны дугаар нэмэх</translation> <translation id="996250603853062861">Аюулгүй холболт хийж байна...</translation> <translation id="997143476478634194">Таныг сайтуудад зочлоход тэд энэ тохиргоог автоматаар дагана Сайтууд ихэвчлэн танд шуурхай мэдээ эсвэл чатын мессежийн талаар мэдэгдэхийн тулд мэдэгдэл илгээдэг.</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 1aae920..67fa72ee 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -285,7 +285,6 @@ <translation id="117916940443676133">तुमची सिक्युरिटी की पिनने संरक्षित केलेली नाही. साइन इन डेटा व्यवस्थापित करण्यासाठी, प्रथम पिन तयार करा.</translation> <translation id="1179400851034021914">IBAN चुकीचा आहे</translation> <translation id="1179902906564467236">तुमच्या फोनवरील सूचना फॉलो करा किंवा Camera अॅप वापरा</translation> -<translation id="1180117276105724040">तुमच्या मागील सेशनमधून विंडो रिस्टोअर करत आहे...</translation> <translation id="118057123461613219">खूप मोठ्या प्रमाणातील बचती</translation> <translation id="1181037720776840403">काढून टाका</translation> <translation id="1182876754474670069">होम</translation> @@ -763,7 +762,6 @@ <translation id="151501797353681931">Safari मधून इंपोर्ट केलेले</translation> <translation id="1515163294334130951">लाँच करा</translation> <translation id="1517467582299994451">कोड वापरून कास्ट करण्यासाठी, Chrome ब्राउझर सिंक सेटिंग्ज बदला हे सुरू करा</translation> -<translation id="1519090060276706457">विंडो रिस्टोअर करण्यासाठी अपेक्षेहून अधिक वेळ लागत आहे</translation> <translation id="1521442365706402292">प्रमाणपत्रे व्यवस्थापित करा</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">आज ॲक्टिव्ह होते</translation> @@ -1184,7 +1182,6 @@ <translation id="1796460466266263589">Gemini वापरणे सुरू ठेवण्यासाठी, हे तुम्हीच असल्याची पडताळणी करा</translation> <translation id="1796588414813960292">साउंडची आवश्यकता असलेली वैशिष्ट्ये काम करणार नाहीत</translation> <translation id="1798726622311813209">क्रेडिट आणि डेबिट कार्ड</translation> -<translation id="1799852120691957794">तुमच्या खाजगी सेशनमधील विंडो रिस्टोअर करू शकत नाही</translation> <translation id="180203835522132923">Search + O, त्यानंतर W</translation> <translation id="1802624026913571222">कव्हर बंद केल्यावर स्लीप मोड ऑन करा</translation> <translation id="1802687198411089702">पेज प्रतिसाद देत नाही. तुम्ही वाट पाहू शकता किंवा बाहेर पडू शकता.</translation> @@ -2381,7 +2378,6 @@ <translation id="2610374175948698697">तुमच्या डिव्हाइसवरील फाइल किंवा फोल्डर पाहू शकते</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">तुमच्या Microsoft खात्यामध्ये साइन इन करून पुन्हा प्रयत्न करा</translation> -<translation id="2611702650078660078">एरर आली:</translation> <translation id="2611776654555141051">आयत टूल</translation> <translation id="2611885296070244383">माइक (अंतर्गत)</translation> <translation id="2612676031748830579">कार्ड नंबर</translation> @@ -2745,7 +2741,6 @@ <translation id="285033512555869047">बंद आहे</translation> <translation id="2850541429955027218">थीम जोडा</translation> <translation id="2851291081585704741">तुम्ही ऑफलाइन आहात</translation> -<translation id="2852045827873867442">इंटरनेट कनेक्शन आवश्यक आहे.</translation> <translation id="285237063405807022">(लोड करत आहे)</translation> <translation id="2853121255651601031">पासवर्ड सेव्ह केला</translation> <translation id="2854453262159518435">सद्य टॅब गट बदला</translation> @@ -5499,7 +5494,6 @@ <translation id="4779766576531456629">eSIM मोबाइल नेटवर्कचे नाव बदला</translation> <translation id="4780321648949301421">पेज या फॉरमॅटमध्ये सेव्ह करा...</translation> <translation id="4780558987886269159">ऑफिससाठी</translation> -<translation id="4781633367688946589">नवीन सेशनमध्ये पुढे सुरू ठेवा</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> ला तुमच्या डिजिटल वॉलेटमधून वैयक्तिक माहिती वापरायची आहे.</translation> <translation id="4785719467058219317">तुम्ही या वेबसाइटवर नोंदणीकृत नसलेली सिक्युरिटी की वापरत आहात</translation> <translation id="4785914069240823137">क्रॉप रद्द करा</translation> @@ -7478,7 +7472,6 @@ <translation id="6180550893222597997">तुम्हाला <ph name="APP_NAME" /> साठी कोणती पासकी वापरायची आहे?</translation> <translation id="6181218116951226898">कधीकधी अॅप्स त्यांचे ब्रँडिंग अपडेट करतात. अपडेट करण्यापूर्वी सर्व बदल तुमच्यासाठी सोयीस्कर असल्याची खात्री करण्यासाठी त्यांचे पुनरावलोकन करा.</translation> <translation id="6181431612547969857">डाउनलोड ब्लॉक केले</translation> -<translation id="6182100780603067202">अॅप्लिकेशनचा ऑडिओदेखील शेअर करा (त्याच्या सर्व विंडोमधून)</translation> <translation id="6183369864942961155">ऑटोमॅटिक फिकट/गडद थीम</translation> <translation id="6183773856988300112">Chrome मधील Gemini तुमच्या टॅबमध्ये काम करण्यासाठी आणि तुम्ही त्याला दिलेल्या टास्क पूर्ण करण्यासाठी ऑटोमॅटिक ब्राउझ वापरते. <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation> <translation id="6184099524311454384">टॅब शोधा</translation> @@ -8271,7 +8264,6 @@ <translation id="6754359471209693699">नवीन शोध सुरू करा</translation> <translation id="6754918760968695779">क्विक इन्सर्ट</translation> <translation id="6755702685749429945">शब्दकोश जोडा</translation> -<translation id="6756157672127672536">Files अॅप हे तुम्ही Google Drive, बाह्य स्टोरेज किंवा तुमच्या ChromeOS डिव्हाइसवर सेव्ह केलेल्या फाइलचा जलद ॲक्सेस देते.</translation> <translation id="6756643207511618722">स्पीच इंजीन</translation> <translation id="6757431299485455321">इतर डिव्हाइसना हा हॉटस्पॉट शोधण्यात मदत करा.</translation> <translation id="6758056191028427665">आम्ही आमचे काम कसे करत आहोत त्याबद्दल आम्हाला कळवा.</translation> @@ -10011,7 +10003,6 @@ <translation id="794676567536738329">परवानग्यांची पुष्टी करा</translation> <translation id="7947962633355574091">व्हिडिओ पत्ता कॉपी करा</translation> <translation id="7947964080535614577">आशय किंवा सेवा विनामूल्य पुरवता येण्यासाठी साइट सामान्यपणे जाहिराती दाखवतात. पण, काही साइट अनाहूत किंवा दिशाभूल करणार्या जाहिराती दाखवण्यासाठी ओळखल्या जातात.</translation> -<translation id="7948239795436419268">विंडो रिस्टोअर करू नका</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" /> ची सर्व पेज</translation> <translation id="7950629216186736592">कारण: LBS हे फक्त http://, https://, आणि file:// URLs ना सपोर्ट करते.</translation> <translation id="7950814699499457511">सुरू • या एक्स्टेंशनने गोपनीयता व्यवहार प्रकाशित केलेले नाहीत, जसे की ते डेटा कसे गोळा करते आणि वापरते</translation> @@ -11200,7 +11191,6 @@ <translation id="8751034568832412184">शाळा</translation> <translation id="8751329102746373229">तुमच्या अॅडमिनिस्ट्रेटरकडील</translation> <translation id="8752451679755290210">आयटमदरम्यान आपोआप नेव्हिगेट करा</translation> -<translation id="8753948258138515839">Files अॅप हे तुम्ही Google Drive, बाह्य स्टोरेज किंवा तुमच्या ChromeOS Flex डिव्हाइसवर सेव्ह केलेल्या फाइलचा झटपट अॅक्सेस पुरवते.</translation> <translation id="8754200782896249056"><p>सपोर्टेड डेस्कटॉप परिस्थिती अंतर्गत <ph name="PRODUCT_NAME" /> चालवताना, सिस्टीम प्रॉक्सी सेटिंग्ज वापरल्या जातील. तथापि, एकतर तुमची सिस्टीमला सपोर्ट नाही नसते किंवा तुमचे सिस्टीम कॉन्फिगरेशन लाँच करताना समस्या आली.</p> </p>परंतु तुम्ही अद्याप कमांड लाइन कॉन्फिगर करू शकता. कृपया फ्लॅग आणि परिस्थिती व्हेरिएबलवरील अधिक माहितीसाठी <code>man <ph name="PRODUCT_BINARY_NAME" /></code> पहा.</p></translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 606d37b..2cb9042 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -285,7 +285,6 @@ <translation id="117916940443676133">Kunci keselamatan anda tidak dilindungi dengan PIN. Untuk mengurus data log masuk, buat PIN terlebih dahulu.</translation> <translation id="1179400851034021914">IBAN tidak sah</translation> <translation id="1179902906564467236">Ikut arahan pada telefon anda atau gunakan apl kamera</translation> -<translation id="1180117276105724040">Memulihkan tetingkap daripada sesi anda sebelum ini...</translation> <translation id="118057123461613219">Penjimatan sangat besar</translation> <translation id="1181037720776840403">Alih keluar</translation> <translation id="1182876754474670069">home</translation> @@ -763,7 +762,6 @@ <translation id="151501797353681931">Dimport Daripada Safari</translation> <translation id="1515163294334130951">Lancarkan</translation> <translation id="1517467582299994451">Untuk menghantar dengan kod, hidupkan tetapan penyegerakan penyemak imbas Chrome</translation> -<translation id="1519090060276706457">Pemulihan tetingkap mengambil masa lebih lama daripada jangkaan</translation> <translation id="1521442365706402292">Uruskan sijil</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">Aktif hari ini</translation> @@ -1184,7 +1182,6 @@ <translation id="1796460466266263589">Untuk terus menggunakan Gemini, sahkan identiti anda</translation> <translation id="1796588414813960292">Ciri yang memerlukan bunyi tidak akan berfungsi</translation> <translation id="1798726622311813209">Kad kredit & debit</translation> -<translation id="1799852120691957794">Tidak dapat memulihkan tetingkap daripada sesi anda sebelum ini</translation> <translation id="180203835522132923">Cari + O, kemudian W</translation> <translation id="1802624026913571222">Tidur apabila penutup ditutup</translation> <translation id="1802687198411089702">Halaman tidak bertindak balas. Anda boleh menunggu atau keluar.</translation> @@ -2381,7 +2378,6 @@ <translation id="2610374175948698697">Boleh melihat fail atau folder pada peranti anda</translation> <translation id="2610780100389066815">Menandatangani Senarai Kepercayaan Microsoft</translation> <translation id="261114180663074524">Log masuk ke akaun Microsoft anda dan cuba lagi</translation> -<translation id="2611702650078660078">Ralat telah berlaku</translation> <translation id="2611776654555141051">Alat Segi Empat Tepat</translation> <translation id="2611885296070244383">Mikrofon (dalaman)</translation> <translation id="2612676031748830579">Nombor kad</translation> @@ -2745,7 +2741,6 @@ <translation id="285033512555869047">Tertutup</translation> <translation id="2850541429955027218">Tambahkan tema</translation> <translation id="2851291081585704741">Anda di luar talian</translation> -<translation id="2852045827873867442">Sambungan Internet diperlukan.</translation> <translation id="285237063405807022">(memuatkan)</translation> <translation id="2853121255651601031">Kata Laluan Disimpan</translation> <translation id="2854453262159518435">Gantikan kumpulan tab sedia ada</translation> @@ -5501,7 +5496,6 @@ <translation id="4779766576531456629">Namakan semula rangkaian Selular eSIM</translation> <translation id="4780321648949301421">Simpan Halaman Sebagai...</translation> <translation id="4780558987886269159">Untuk kerja</translation> -<translation id="4781633367688946589">Teruskan kepada sesi baharu</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> mahu menggunakan maklumat peribadi daripada dompet digital anda.</translation> <translation id="4785719467058219317">Anda menggunakan kunci keselamatan yang tidak berdaftar dengan laman web ini</translation> <translation id="4785914069240823137">Batalkan Pemangkasan</translation> @@ -7477,7 +7471,6 @@ <translation id="6180550893222597997">Manakah kunci laluan yang ingin digunakan untuk <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Kadangkala apl mengemaskinikan penjenamaan. Semak semua perubahan untuk memastikan anda selesa dengan perubahan tersebut sebelum dikemaskinikan.</translation> <translation id="6181431612547969857">Muat turun disekat</translation> -<translation id="6182100780603067202">Turut berkongsi audio aplikasi (daripada semua tetingkap aplikasi)</translation> <translation id="6183369864942961155">Tema cerah/gelap automatik</translation> <translation id="6183773856988300112">Gemini dalam Chrome menggunakan penyemakan imbas automatik untuk berfungsi dalam tab anda dan melengkapkan tugasan yang anda berikan kepada Gemini. <ph name="LINK_BEGIN" />Ketahui lebih lanjut<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Cari Tab</translation> @@ -8270,7 +8263,6 @@ <translation id="6754359471209693699">Mulakan carian baharu</translation> <translation id="6754918760968695779">Sisipan Pantas</translation> <translation id="6755702685749429945">Tambahkan kamus</translation> -<translation id="6756157672127672536">Apl Fail memberikan akses pantas kepada fail yang telah anda simpan di Google Drive, storan luaran atau peranti Chrome OS anda.</translation> <translation id="6756643207511618722">Enjin pertuturan</translation> <translation id="6757431299485455321">Membantu peranti lain menemukan tempat liputan ini.</translation> <translation id="6758056191028427665">Beritahu kami tentang prestasi kami.</translation> @@ -10010,7 +10002,6 @@ <translation id="794676567536738329">Sahkan Kebenaran</translation> <translation id="7947962633355574091">S&alin Alamat Video</translation> <translation id="7947964080535614577">Laman biasanya memaparkan iklan agar dapat memberikan kandungan atau perkhidmatan percuma. Akan tetapi, sesetengah laman diketahui memaparkan iklan yang mengganggu atau mengelirukan.</translation> -<translation id="7948239795436419268">Jangan pulihkan tetingkap</translation> <translation id="7948407723851303488">Semua halaman <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Sebab: LBS hanya menyokong URL http://, https://, dan file://.</translation> <translation id="7950814699499457511">Hidup • Sambungan ini belum menerbitkan amalan privasi, seperti cara sambungan ini mengumpulkan dan menggunakan data</translation> @@ -11200,7 +11191,6 @@ <translation id="8751034568832412184">Sekolah</translation> <translation id="8751329102746373229">Daripada pentadbir anda</translation> <translation id="8752451679755290210">Bergerak antara item secara automatik</translation> -<translation id="8753948258138515839">Apl Fail memberikan akses pantas kepada fail yang telah anda simpan di Google Drive, storan luaran atau peranti Chrome OS Flex anda.</translation> <translation id="8754200782896249056"><p>Apabila menjalankan <ph name="PRODUCT_NAME" /> di bawah persekitaran desktop yang disokong, tetapan proksi sistem akan digunakan. Bagaimanapun, sama ada sistem anda tidak disokong atau terdapat masalah melancarkan konfigurasi sistem anda.</p> <p>Tetapi anda masih boleh mengkonfigurasi melalui garis perintah. Sila lihat <code>man <ph name="PRODUCT_BINARY_NAME" /></code> untuk mendapatkan maklumat lanjut mengenai bendera dan pemboleh ubah persekitaran.</p></translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index 4d5fcc0b..02444c1 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">အဓိကနုတ် မှတ်ချက်ဖိုင်များကို ဒေါင်းလုဒ်လုပ်၍မရပါ။ နောက်မှ ထပ်စမ်းကြည့်ပါ။</translation> <translation id="1103523840287552314"><ph name="LANGUAGE" />ကို အမြဲတမ်း ဘာသာပြန်ရန်</translation> <translation id="1104098698795583187">သင်သည် ဤတဘ်အုပ်စုသုံးခွင့်ကို ချက်ချင်းဆုံးရှုံးမည်ဖြစ်ပြီး ၎င်းကို သင့်စက်အားလုံးမှ ဖျက်ပါမည်</translation> +<translation id="1105934302947321130">Google Beam with Zoom</translation> <translation id="1106270460549661906">Gemini နှင့် မမျှဝေတော့ရန်</translation> <translation id="1106350001632362876">သတ်မှတ်ချက်ကို တိုးရန်</translation> <translation id="110850812463801904">OneDrive နှင့် ကိုယ်တိုင် ချိတ်ဆက်ရန်</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">သင့်လုံခြုံရေးကီးကို ပင်နံပါတ်ဖြင့် ကာကွယ်မထားပါ။ လက်မှတ်ထိုးဝင်ခြင်း ဒေတာများကို စီမံရန် ပင်နံပါတ် ဦးစွာသတ်မှတ်ပါ။</translation> <translation id="1179400851034021914">IBAN မမှန်ကန်ပါ</translation> <translation id="1179902906564467236">သင့်ဖုန်းရှိ လမ်းညွှန်ချက်များအတိုင်း လုပ်ဆောင်ပါ (သို့) ကင်မရာအက်ပ်ကို သုံးပါ</translation> -<translation id="1180117276105724040">သင်၏ ယခင်စက်ရှင်မှ ဝင်းဒိုးများ ပြန်ယူနေသည်…</translation> <translation id="118057123461613219">အလွန်များပြားသော ချွေတာမှုများ</translation> <translation id="1181037720776840403">ဖယ်ရှားရန်</translation> <translation id="1182876754474670069">Home</translation> @@ -761,7 +761,6 @@ <translation id="151501797353681931">Safari ထဲမှ တင်သွင်းခဲ့</translation> <translation id="1515163294334130951">စဖွင့်တင်ရန်</translation> <translation id="1517467582299994451">ကုဒ်ဖြင့်ကာစ်လုပ်ရန် Chrome ဘရောင်ဇာ စင့်ခ်လုပ်ခြင်းဆက်တင်များ ဖွင့်ပါ</translation> -<translation id="1519090060276706457">ဝင်းဒိုးများ ပြန်ယူခြင်းသည် မျှော်မှန်းထားသည်ထက် ပိုကြာနေသည်</translation> <translation id="1521442365706402292">အသိမှတ်ပြုလက်မှတ်များ စီမံမည်</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">ယနေ့ အသုံးပြုထားသည်</translation> @@ -1110,6 +1109,7 @@ <translation id="1745732479023874451">အဆက်အသွယ်များ စီမံခန့်ခွဲရန်</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{ဤဝဘ်အက်ပ်တွင် ဖိုင် # ဖိုင်ကို ဖွင့်ပြီးတည်းဖြတ်မလား။}}</translation> <translation id="1748563609363301860">ဤစကားဝှက်ကို သင့် Google Account တွင် သို့မဟုတ် ဤစက်တွင်သာ သိမ်းပါ</translation> +<translation id="1749645492410897998">ဆော့ဖ်ဝဲကို ထည့်သွင်းနေသည်</translation> <translation id="1749733017156547309">စကားဝှက်လိုအပ်သည်</translation> <translation id="1750172676754093297">သင့်လုံခြုံရေးကီးတွင် လက်ဗွေရာများ သိမ်း၍မရပါ</translation> <translation id="1750238553597293878">သင့် Google Account တွင် စကားဝှက်များ ဆက်သုံးပါ</translation> @@ -1181,7 +1181,6 @@ <translation id="1796460466266263589">Gemini ဆက်သုံးရန် သင်ဖြစ်ကြောင်းအတည်ပြုပါ</translation> <translation id="1796588414813960292">အသံလိုအပ်သော ဝန်ဆောင်မှုများ အလုပ်လုပ်မည်မဟုတ်ပါ</translation> <translation id="1798726622311813209">ခရက်ဒစ်နှင့် ဒက်ဘစ်ကတ်များ</translation> -<translation id="1799852120691957794">ယခင်စက်ရှင်မှ ဝင်းဒိုးများကို ပြန်ယူ၍မရပါ</translation> <translation id="180203835522132923">Search + O၊ ၎င်းနောက် W</translation> <translation id="1802624026913571222">အဖုံးကို ပိတ်လိုက်သည့်အခါ နားရန်</translation> <translation id="1802687198411089702">စာမျက်နှာသည် ရပ်တန့်နေပါသည်။ ၎င်းကို စောင့်နိုင်သည် သို့မဟုတ် ထွက်နိုင်သည်။</translation> @@ -2377,7 +2376,6 @@ <translation id="2610374175948698697">သင့်စက်ရှိ ဖိုင် (သို့) ဖိုင်တွဲများကို ကြည့်နိုင်သည်</translation> <translation id="2610780100389066815">Microsoft ယုံကြည်မှု စာရင်းထက်မှတ်ထိုး</translation> <translation id="261114180663074524">သင့် Microsoft အကောင့်သို့လက်မှတ်ထိုးဝင်ပြီး ထပ်စမ်းကြည့်ပါ</translation> -<translation id="2611702650078660078">အမှားဖြစ်သွားသည်</translation> <translation id="2611776654555141051">ထောင့်မှန်စတုဂံပုံ တူးလ်</translation> <translation id="2611885296070244383">မိုက် (စက်တွင်း)</translation> <translation id="2612676031748830579">ကဒ်နံပါတ်</translation> @@ -2742,7 +2740,6 @@ <translation id="285033512555869047">ပိတ်ထားသည်</translation> <translation id="2850541429955027218">အပြင်အဆင် ပေါင်းထည့်ရန်</translation> <translation id="2851291081585704741">အော့ဖ်လိုင်းဖြစ်နေသည်</translation> -<translation id="2852045827873867442">အင်တာနက်ချိတ်ဆက်မှု လိုအပ်သည်။</translation> <translation id="285237063405807022">(ဖွင့်နေသည်)</translation> <translation id="2853121255651601031">စကားဝှက်ကို သိမ်းဆည်းပြီးပါပြီ</translation> <translation id="2854453262159518435">ရှိပြီးသား တဘ်အုပ်စုကို အစားထိုးရန်</translation> @@ -3609,6 +3606,7 @@ <translation id="3473241910002674503">တက်ဘလက်မုဒ်တွင် ခလုတ်များဖြင့် ပင်မစာမျက်နှာသို့ သွားခြင်း၊ နောက်ပြန်သွားခြင်းနှင့် အက်ပ်များပြောင်းခြင်းတို့ ပြုလုပ်နိုင်သည်။</translation> <translation id="3473479545200714844">မျက်နှာပြင် ပုံချဲ့ပေးသူ</translation> <translation id="3474218480460386727">စာလုံးအသစ်များအတွက် အက္ခရာ ၉၉ လုံးနှင့်အောက် အသုံးပြုပါ</translation> +<translation id="3474330892505468100">Google Beam with Meet</translation> <translation id="3474624961160222204"><ph name="NAME" /> အဖြစ် ရှေ့ဆက်ရန်</translation> <translation id="3477772589943384839">အသင့်အတင့် မှတ်ဉာဏ်ချွေတာမှုများ ရယူနိုင်သည်။ အချိန်အတော်ကြာပြီးနောက် သင့်တဘ်များကို အသုံးမပြုတော့ပါ။</translation> <translation id="347785443197175480"><ph name="HOST" />အား သင်၏ ကင်မရာ နှင့် မိုက်ခရိုဖုန်းကို ရယူသုံးမှု ဆက်ခွင့်ပြုရန်</translation> @@ -5496,7 +5494,6 @@ <translation id="4779766576531456629">eSIM ဆယ်လူလာကွန်ရက် အမည်ပြောင်းရန်</translation> <translation id="4780321648949301421">စာမျက်နှာကို...အဖြစ် သိမ်းရန်</translation> <translation id="4780558987886269159">အလုပ်အတွက်</translation> -<translation id="4781633367688946589">စက်ရှင်အသစ်သို့ ဆက်သွားရန်</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> က သင့်ဒစ်ဂျစ်တယ် ပိုက်ဆံအိတ်ရှိ ကိုယ်ရေးအချက်အလက်ကို သုံးလိုသည်။</translation> <translation id="4785719467058219317">သင်သည် ဤဝဘ်ဆိုက်တွင် မှတ်ပုံတင်မထားသော လုံခြုံရေးကီးတစ်ခုကို အသုံးပြုနေသည်</translation> <translation id="4785914069240823137">ဖြတ်ညှိမှု မလုပ်တော့ရန်</translation> @@ -6285,6 +6282,7 @@ <translation id="5337926771328966926">လက်ရှိစက်ပစ္စည်းအမည်သည် <ph name="DEVICE_NAME" /> ဖြစ်သည်</translation> <translation id="5338338064218053691">ရုပ်ဖျက် ဝင်းဒိုးသုံးပြီး သီးသန့်ကြည့်ရှုနိုင်သည်</translation> <translation id="5338503421962489998">အတွင်း သိုလှောင်မှု</translation> +<translation id="5340620183031438925">စာမျက်နှာမှ မထွက်ဘဲ သင့်တဘ်အကြောင်း ‘AI မုဒ်’ ကို မေးရန် သင်ဖြစ်ကြောင်း အတည်ပြုပါ။ သင့်စက်အားလုံးတွင် စကားဝှက်နှင့် အခြားအရာများကိုလည်း ရရှိပါမည်။</translation> <translation id="5340787663756381836">&ရှာရန်နှင့် ပြင်ရန်</translation> <translation id="5340900621595888432">အမှားရှာဖွေမှုနှင့် သုံးစွဲမှုဒေတာပို့ရန်</translation> <translation id="5341793073192892252">အောက်ပါကွတ်ကီးများကို ပိတ်ထားသည် (ပြင်ပကုမ္ပဏီ၏ ကွတ်ကီးများကို ခြွင်းချက်မရှိ ပိတ်ထားပါသည်)</translation> @@ -7470,7 +7468,6 @@ <translation id="6180550893222597997"><ph name="APP_NAME" /> အတွက် မည်သည့်လျှို့ဝှက်ကီးကို သုံးလိုပါသလဲ။</translation> <translation id="6181218116951226898">အက်ပ်များသည် တစ်ခါတစ်ရံတွင် ၎င်းတို့၏ကုန်အမှတ်တံဆိပ်ကို အပ်ဒိတ်လုပ်သည်။ အပ်ဒိတ်မလုပ်မီ အပြောင်းအလဲအားလုံးက သင်နှင့်အဆင်ပြေကြောင်း သေချာစေရန် ၎င်းတို့ကို ပြန်ကြည့်ပါ။</translation> <translation id="6181431612547969857">ဒေါင်းလုဒ် ပိတ်ဆို့ထား</translation> -<translation id="6182100780603067202">အပလီကေးရှင်းအသံ (၎င်း၏ဝင်းဒိုးအားလုံးမှ) ကိုလည်း မျှဝေရန်</translation> <translation id="6183369864942961155">အလိုအလျောက် အလင်း/အမှောင်နောက်ခံ</translation> <translation id="6183773856988300112">Chrome ရှိ Gemini သည် သင့်တဘ်များတွင် လုပ်ဆောင်ရန်နှင့် သင် ပေးထားသော လုပ်ဆောင်စရာများကို အပြီးသတ်ရန် အော်တို ဘရောက်စ်လုပ်ခြင်းကို သုံးသည်။ <ph name="LINK_BEGIN" />ပိုလေ့လာရန်<ph name="LINK_END" /></translation> <translation id="6184099524311454384">တဘ်များတွင် ရှာရန်</translation> @@ -8262,7 +8259,6 @@ <translation id="6754359471209693699">ရှာဖွေမှုအသစ် စတင်ရန်</translation> <translation id="6754918760968695779">အမြန်ထည့်</translation> <translation id="6755702685749429945">အဘိဓာန် ထည့်ရန်</translation> -<translation id="6756157672127672536">Files အက်ပ်က သင် Google Drive၊ ပြင်ပသိုလှောင်ခန်း (သို့) သင့် ChromeOS စက်များတွင် သိမ်းထားသော ဖိုင်များကို အမြန်သုံးခွင့်ပေးသည်။</translation> <translation id="6756643207511618722">စကားသံ အင်ဂျင်များ</translation> <translation id="6757431299485455321">အခြားစက်များ ဤဟော့စပေါ့ကို ရှာတွေ့ရန် ကူညီပေးသည်။</translation> <translation id="6758056191028427665">ကျွန်ုပ်တို့၏ ဝန်ဆောင်မှုများအတွက် စိတ်ကျေနပ်မှုမည်မျှရှိကြောင်း ပြောပြပေးပါ။</translation> @@ -9208,6 +9204,7 @@ <translation id="7406912950279255498">အရောင်ပြောင်းပြန်ပြုလုပ်သည့်မုဒ်</translation> <translation id="7407430846095439694">တင်သွင်းရန်နှင့် ချိတ်တွဲရန်</translation> <translation id="7407504355934009739">လူအများစုသည် ဤဝဘ်ဆိုက်မှ အကြောင်းကြားချက်များကို ပိတ်ကြသည်</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> တွင် သတိထားရမည့် ဒေတာ ပါဝင်သည်။ သင့်အဖွဲ့အစည်းသည် ၎င်းကို cloud သိုလှောင်ခန်းတွင် သိမ်းခွင့် (သို့) ဖယ်ပစ်ခွင့်ပြုမည်</translation> <translation id="7408080603962564527">၎င်းကို အခြားသူများ မြင်ရမည်</translation> <translation id="740810853557944681">ပုံနှိပ်စက်ဆာဗာတစ်ခု ထည့်ခြင်း</translation> <translation id="7409549334477097887">အလွန်ကြီး</translation> @@ -9261,6 +9258,7 @@ <translation id="7434969625063495310">ပုံနှိပ်စက်ဆာဗာကို ထည့်၍မရပါ။ ဆာဗာ၏ စီစဉ်သတ်မှတ်ချက်ကို စစ်ဆေးပြီး ထပ်စမ်းကြည့်ပါ။</translation> <translation id="7436921188514130341">စိတ်မကောင်းပါ။ အမည်ပြောင်းနေစဉ် မှားယွင်းမှုတစ်ခု ဖြစ်ပေါ်ခဲ့သည်။</translation> <translation id="7439519621174723623">ရှေ့ဆက်ရန် စက်အမည်ထည့်ပါ</translation> +<translation id="743982235360757672">ဘရောက်စ်လုပ်နေစဉ် ‘AI မုဒ်’ ကို အနီးတွင်ထားပါ</translation> <translation id="7441736532026945583">သင့်တဘ်ဘားတန်းမှ အုပ်စုကို ဖယ်ရှားရန် “အုပ်စုဖျောက်ရန်” ကို ရွေးချယ်နိုင်သည်</translation> <translation id="7441736921018636843">ဤဆက်တင်ကို ပြောင်းရန်အတွက် <ph name="BEGIN_LINK" />စင့်ခ်ကို ပြင်ဆင်သတ်မှတ်<ph name="END_LINK" /> ပြီး သင်၏ စင့်ခ်လုပ်ထားသည့် စကားဝှက်စာကို ဖယ်ရှားပါ</translation> <translation id="7441830548568730290">အခြားအသုံးပြုသူများ</translation> @@ -9999,7 +9997,6 @@ <translation id="794676567536738329">ခွင့်ပြုချက်များ အတည်ပြု</translation> <translation id="7947962633355574091">ဗီဒီယို လိပ်စာ မိ&တ္တူ ကူးပါ</translation> <translation id="7947964080535614577">ဝဘ်ဆိုက်များသည် အကြောင်းအရာ (သို့) ဝန်ဆောင်မှုများကို အခမဲ့ပေးနိုင်ရန် ကြော်ငြာများ ပြလေ့ရှိသည်။ သို့သော် ဝဘ်ဆိုက်အချို့က စိတ်အနှောင့်အယှက်ဖြစ်စေသော (သို့) အထင်အမြင်မှားစေသော ကြော်ငြာများကိုပြကြောင်း သိရသည်။</translation> -<translation id="7948239795436419268">ဝင်းဒိုးများ ပြန်မယူပါနှင့်</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" /> ၏ စာမျက်နှာအားလုံး</translation> <translation id="7950629216186736592">အကြောင်းရင်း- LBS က http://၊ https:// နှင့် file:// URL များကိုသာ ပံ့ပိုးသည်။</translation> <translation id="7950814699499457511">ဖွင့် • ဤနောက်ဆက်တွဲသည် ၎င်း၏ ဒေတာစုဆောင်းပုံ၊ အသုံးပြုပုံကဲ့သို့သော ကိုယ်ရေးအချက်အလက်လုံခြုံမှုဆိုင်ရာ လုပ်ဆောင်ချက်များကို မထုတ်ပြန်ပါ</translation> @@ -11188,7 +11185,6 @@ <translation id="8751034568832412184">ကျောင်း</translation> <translation id="8751329102746373229">သင်၏ စီမံခန့်ခွဲသူထံမှ</translation> <translation id="8752451679755290210">အကြောင်းအရာများအကြား အလိုအလျောက်ရွှေ့ခြင်း</translation> -<translation id="8753948258138515839">Files အက်ပ်က သင် Google Drive တွင် သိမ်းထားသော ဖိုင်များ၊ ပြင်ပသိုလှောင်ခန်း (သို့) သင့် ChromeOS Flex စက်များကို အမြန်သုံးခွင့်ပေးသည်။</translation> <translation id="8754200782896249056"><p> ပံ့ပိုးထားသော အလုပ်ခုံပတ်ဝန်းကျင်တွင် <ph name="PRODUCT_NAME" /> အား လည်ပတ်စဉ်၊ စနစ်ပရောက်စီ ကြိုတင်ချိန်ညှိချက်များကို အသုံးပြုပါမည်။ သို့သော်၊ သင့်စနစ်အား မပံ့ပိုးခြင်း သို့မဟုတ် သင့်စနစ် ပြုပြင်မှုအားဖွင့်ရန် ပြဿနာတက်နေခြင်း တစ်ခုခုဖြစ်နိုင်ပါသည်။</p> <p>သို့သော် command line မှတစ်ဆင့်သင် ပြုပြင်နိုင်ပါသေးသည်။ အလံများနှင့် ပတ်ဝန်းကျင် ပြောင်းလဲခြင်းများဆိုင်ရာ အချက်လက်များအတွက် ကျေးဇူးပြု၍ <code>အသုံးပြုသူလမ်းညွှန် <ph name="PRODUCT_BINARY_NAME" /></code> ကိုကြည့်ပါ။</p></translation> @@ -11981,6 +11977,7 @@ <translation id="992778845837390402">Linux အရန်သိမ်းခြင်းကို လောလောဆယ် လုပ်ဆောင်နေသည်</translation> <translation id="994087375490600917">ဘေးအကန့်</translation> <translation id="994289308992179865">&လည်ပတ်</translation> +<translation id="995420352808264005">စက်မှတ်ပုံတင်ခြင်း အမျိုးအစား ရွေးပါ</translation> <translation id="995755448277384931">IBAN ထည့်ခြင်း</translation> <translation id="996250603853062861">လုံခြုံသည့် ချိတ်ဆက်မှုကို ထူထောင်နေ...</translation> <translation id="997143476478634194">ဝဘ်ဆိုက်များသို့ ဝင်ကြည့်သောအခါ ၎င်းတို့က ဤဆက်တင်အတိုင်း အလိုအလျောက်လုပ်ဆောင်သည်။ သတင်းထူး (သို့) ချတ်မက်ဆေ့ဂျ်များအကြောင်း အသိပေးရန် ဝဘ်ဆိုက်များက အကြောင်းကြားချက် ပို့လေ့ရှိသည်။</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index c86eb31..622a1bd 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">मुख्य नोड एनोटेसन फाइलहरू डाउनलोड गर्न सकिएन। पछि फेरि प्रयास गर्नुहोस्।</translation> <translation id="1103523840287552314">सँधै अनुवाद गर्नुहोस् <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">तपाईं तुरुन्तै यो ट्याब समूहको एक्सेस गुमाउनु हुने छ र यो ट्याब समूह सबै डिभाइसबाट मेटाइने छ</translation> +<translation id="1105934302947321130">Google Beam with Zoom</translation> <translation id="1106270460549661906">Gemini सँग अनसेयर गर्नुहोस्</translation> <translation id="1106350001632362876">थ्रेसहोल्ड बढाउनुहोस्</translation> <translation id="110850812463801904">OneDrive मा म्यानुअल तरिकाले कनेक्ट गर्नुहोस्</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">तपाईंको सुरक्षा साँचो PIN प्रयोग गरी सुरक्षित गरिएको छैन। साइन इन गर्न चाहिने डेटा व्यवस्थित गर्न सर्वप्रथम एउटा PIN सिर्जना गर्नुहोस्।</translation> <translation id="1179400851034021914">IBAN अवैध छ</translation> <translation id="1179902906564467236">आफ्नो फोनमा दिइएका निर्देशनहरू पालना गर्नुहोस् वा क्यामेरा एप प्रयोग गर्नुहोस्</translation> -<translation id="1180117276105724040">तपाईंको पछिल्लो सत्रबाट विन्डोहरू रिस्टोर गरिँदै छ...</translation> <translation id="118057123461613219">एकदमै ठुला बचतहरू</translation> <translation id="1181037720776840403">हटाउनुहोस्</translation> <translation id="1182876754474670069">होम की</translation> @@ -762,7 +762,6 @@ <translation id="151501797353681931">Safari बाट आयात गरिएको</translation> <translation id="1515163294334130951">प्रवर्तन गर्नुहोस्</translation> <translation id="1517467582299994451">कोड हालेर कास्ट गर्न Chrome ब्राउजरको सिंकसम्बन्धी सेटिङ अन गर्नुहोस्</translation> -<translation id="1519090060276706457">विन्डोहरू रिस्टोर गर्न अपेक्षा गरिएभन्दा बढी समय लागिरहेको छ</translation> <translation id="1521442365706402292">प्रमाणपत्रहरू व्यवस्थित गर्नुहोस्</translation> <translation id="1521655867290435174">Google पाना</translation> <translation id="1521774566618522728">आज सक्रिय गरिएको समय</translation> @@ -1103,6 +1102,7 @@ <translation id="1745732479023874451">सम्पर्क सूची व्यवस्थापन गर्नुहोस्</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{# वटा फाइल यो वेब एपमा खोलेर सम्पादन गर्ने हो?}}</translation> <translation id="1748563609363301860">तपाईं आफ्नो Google खाता वा यस यन्त्रमा मात्र यो पासवर्ड सुरक्षित गर्न सक्नुहुन्छ।</translation> +<translation id="1749645492410897998">सफ्टवेयर इन्स्टल गरिँदै छ</translation> <translation id="1749733017156547309">पासवर्ड हालिएको छैन</translation> <translation id="1750172676754093297">तपाईंको सुरक्षा साँचोले फिंगरप्रिन्टहरू भण्डारण गर्न सक्दैन</translation> <translation id="1750238553597293878">आफ्नो Google खातामा सेभ गरिएका पासवर्डहरू प्रयोग गरिराख्नुहोस्</translation> @@ -1174,7 +1174,6 @@ <translation id="1796460466266263589">Gemini प्रयोग गरिराख्न आफ्नो पहिचान पुष्टि गर्नुहोस्</translation> <translation id="1796588414813960292">जुन सुविधा चल्न ध्वनि चाहिन्छ ती सुविधाले काम गर्ने छैनन्</translation> <translation id="1798726622311813209">क्रेडिट तथा डेबिट कार्डहरू</translation> -<translation id="1799852120691957794">तपाईंको पछिल्लो सत्रका विन्डोहरू रिस्टोर गर्न सकिएन</translation> <translation id="180203835522132923">Search + O, त्यसपछि W</translation> <translation id="1802624026913571222">कभर बन्द गरिएको बेला शयन अवस्थामा लानुहोस्</translation> <translation id="1802687198411089702">उक्त पृष्ठ चलिरहेको छैन। तपाईं प्रतीक्षा गर्न वा पृष्ठबाट बाहिरिन सक्नुहुन्छ।</translation> @@ -2366,7 +2365,6 @@ <translation id="2610374175948698697">यसले तपाईंको डिभाइसमा भएका फाइल वा फोल्डरहरू हेर्न सक्छ</translation> <translation id="2610780100389066815">Microsoft विश्वास सूची साइनिङ</translation> <translation id="261114180663074524">आफ्नो Microsoft खातामा साइन इन गर्नुहोस् र फेरि प्रयास गर्नुहोस्</translation> -<translation id="2611702650078660078">कुनै त्रुटि भयो</translation> <translation id="2611776654555141051">आयात बनाउने टुल</translation> <translation id="2611885296070244383">माइक (अन्तर्निर्मित)</translation> <translation id="2612676031748830579">कार्ड नम्बर</translation> @@ -2730,7 +2728,6 @@ <translation id="285033512555869047">बन्द छ</translation> <translation id="2850541429955027218">विषयवस्तु थप्नुहोस्</translation> <translation id="2851291081585704741">तपाईं अफलाइन हुनुहुन्छ</translation> -<translation id="2852045827873867442">इन्टरनेट कनेक्सन चाहिन्छ।</translation> <translation id="285237063405807022">(लोड गरिँदै छ)</translation> <translation id="2853121255651601031">पासवर्ड सेभ गरियो</translation> <translation id="2854453262159518435">हालको ट्याब समूह बदल्नुहोस्</translation> @@ -3596,6 +3593,7 @@ <translation id="3473241910002674503">ट्याब्लेट मोडमा हुँदा बटनहरूको प्रयोग गरी गृह स्क्रिनमा जानुहोस्, पछाडि फर्कनुहोस् र एउटा अनुप्रयोगबाट अर्को एपमा जानुहोस्।</translation> <translation id="3473479545200714844">स्क्रिन म्याग्निफायर</translation> <translation id="3474218480460386727">नयाँ शब्द लेख्न ९९ वा सोभन्दा कम अक्षर प्रयोग गर्नुहोस्</translation> +<translation id="3474330892505468100">Google Beam with Meet</translation> <translation id="3474624961160222204"><ph name="NAME" /> का रूपमा जारी राख्नुहोस्</translation> <translation id="3477772589943384839">मध्यम रूपमा मेमोरी बचत गर्नुहोस्। लामो समयसम्म प्रयोग नगरेपछि तपाईंका ट्याबहरू निष्क्रिय हुने छन्।</translation> <translation id="347785443197175480"><ph name="HOST" /> लाई तपाइँको क्यामेरा र माइक्रोफोन पहुँच गर्न अनुमति दिन जारी राख्नुहोस्</translation> @@ -5483,7 +5481,6 @@ <translation id="4779766576531456629">eSIM मोबाइल नेटवर्कको नाम बदल्नुहोस्</translation> <translation id="4780321648949301421">पृष्ठलाई निम्न रूपमा बचत गर्नुहोस्...</translation> <translation id="4780558987886269159">कार्यालयका लागि</translation> -<translation id="4781633367688946589">नयाँ सत्रमा जारी राख्नुहोस्</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> ले तपाईंको डिजिटल वालेटमा भएको व्यक्तिगत जानकारी प्रयोग गर्ने अनुमति माग्दै छ।</translation> <translation id="4785719467058219317">तपाईं यस वेबसाइटमा दर्ता नगरिएको सुरक्षा साँचो प्रयोग गर्दै हुनुहुन्छ</translation> <translation id="4785914069240823137">क्रप गर्ने कार्य रद्द गर्नुहोस्</translation> @@ -6272,6 +6269,7 @@ <translation id="5337926771328966926">यन्त्रको हालको नाम <ph name="DEVICE_NAME" /> हो</translation> <translation id="5338338064218053691">तपाईं इन्कोग्निटो विन्डो प्रयोग गरी गोप्य रूपमा ब्राउज गर्न सक्नुहुन्छ</translation> <translation id="5338503421962489998">स्थानीय भण्डारण</translation> +<translation id="5340620183031438925">यो पेजबाट नबाहिरिकनै AI मोडलाई आफ्नो ट्याबका बारेमा सोध्न आफ्नो पहिचान पुष्टि गर्नुहोस्। तपाईं सबै डिभाइसमा रहेका आफ्ना पासवर्डलगायतका थप कुराहरू पनि प्राप्त गर्नु हुने छ।</translation> <translation id="5340787663756381836">&भेट्टाउनुहोस् र सम्पादन गर्नुहोस्</translation> <translation id="5340900621595888432">डाइग्नोस्टिक र प्रयोगसम्बन्धी डेटा पठाउनुहोस्</translation> <translation id="5341793073192892252">निम्न कुकीहरूमाथि रोक लगाइयो (तेस्रो पक्षीय कुकीहरूमाथि बिना अपवाद रोक लागिरहेको छ)</translation> @@ -7457,7 +7455,6 @@ <translation id="6180550893222597997">तपाईं <ph name="APP_NAME" /> मा कुन पासकी प्रयोग गर्न चाहनुहुन्छ?</translation> <translation id="6181218116951226898">एपहरूले कहिलेकाहीँ आफ्नो ब्रान्डिङ परिवर्तन गर्छन्। तपाईंलाई ती परिवर्तनहरूका कारणले असुविधा हुँदैन भन्ने कुरा सुनिश्चित गर्न एप अपडेट गर्नुअघि सबै परिवर्तनको समीक्षा गर्नुहोस्।</translation> <translation id="6181431612547969857">डाउनलोड रोकिएको</translation> -<translation id="6182100780603067202">एपका सबै विन्डोको अडियो पनि सेयर गर्नुहोस्</translation> <translation id="6183369864942961155">स्वचालित उज्यालो/अँध्यारो थिम</translation> <translation id="6183773856988300112">Chrome मा उपलब्ध Gemini ले तपाईंका ट्याबहरूमा काम गर्न र तपाईंले यसलाई दिएका कार्यहरू पूरा गर्न स्वतः ब्राउज गर्ने सुविधा प्रयोग गर्छ। <ph name="LINK_BEGIN" />थप जान्नुहोस्<ph name="LINK_END" /></translation> <translation id="6184099524311454384">ट्याब खोज्नुहोस्</translation> @@ -8250,7 +8247,6 @@ <translation id="6754359471209693699">नयाँ कुरा खोज्न थाल्नुहोस्</translation> <translation id="6754918760968695779">क्विक इन्सर्ट</translation> <translation id="6755702685749429945">शब्दकोश हाल्नुहोस्</translation> -<translation id="6756157672127672536">तपाईं Files एपका सहायताले आफूले Google Drive, बाह्य भण्डारण वा ChromeOS चल्ने डिभाइसमा सेभ गरेका फाइलहरू द्रुत रूपमा एक्सेस गर्न सक्नुहुन्छ।</translation> <translation id="6756643207511618722">स्पिच इन्जिनहरू</translation> <translation id="6757431299485455321">अन्य डिभाइसलाई यो हटस्पट भेट्टाउन मद्दत गर्नुहोस्।</translation> <translation id="6758056191028427665">हामी कस्तो काम गर्दैछौं भन्नेबारे प्रतिक्रिया दिनुहोस्।</translation> @@ -9196,6 +9192,7 @@ <translation id="7406912950279255498">कलर इन्भर्सन मोड</translation> <translation id="7407430846095439694">आयात गनुहोस् र बाँध्नुहोस्</translation> <translation id="7407504355934009739">धेरैजसो मान्छेहरू यो साइटका सूचनाहरूमाथि रोक लगाउँछन्</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> मा संवेदनशील जानकारी छ। तपाईंको सङ्गठनले तपाईंलाई यो फाइल क्लाउड भण्डारणमा सेभ गर्ने वा हटाउने विकल्प दिने छ</translation> <translation id="7408080603962564527">अरूले हटस्पटको यो नाम देख्ने छन्</translation> <translation id="740810853557944681">प्रिन्ट सर्भर थप्नुहोस्</translation> <translation id="7409549334477097887">ज्यादै ठुलो</translation> @@ -9249,6 +9246,7 @@ <translation id="7434969625063495310">छपाइसम्बन्धी सर्भर थप्न पार्न सकिएन। कृपया सर्भरको कन्फिगुरेसन जाँच गरी फेरि प्रयास गर्नुहोस्।</translation> <translation id="7436921188514130341">ओहो! पुनः नामकरण गर्ने क्रममा कुनै त्रुटि भयो।</translation> <translation id="7439519621174723623">जारी राख्न कुनै डिभाइसको नाम राख्नुहोस्</translation> +<translation id="743982235360757672">ब्राउज गरिरहेका बेला AI मोड प्रयोग गरिहाल्न मिल्ने बनाउनुहोस्</translation> <translation id="7441736532026945583">तपाईंको ट्याब स्ट्रिपबाट यो समूह हटाउन "समूह लुकाउनुहोस्" चयन गर्नुहोस्</translation> <translation id="7441736921018636843">यो सेटिङ परिवर्तन गर्ने प्रयोजनका लागि आफ्नो सिंकसम्बन्धी पासफ्रेज हटाउन <ph name="BEGIN_LINK" />सिंक गर्ने सेवा रिसेट गर्नुहोस्<ph name="END_LINK" /></translation> <translation id="7441830548568730290">अन्य प्रयोगकर्ताहरू</translation> @@ -9987,7 +9985,6 @@ <translation id="794676567536738329">अनुमतिहरू पक्का गर्नुहोस्</translation> <translation id="7947962633355574091">भिडियो ठेगाना कपी गर्नुहोस्</translation> <translation id="7947964080535614577">सामग्री वा सेवाहरू निःशुल्क रूपमा प्रदान गर्न सकियोस् भन्नाका लागि साइटहरूले सामान्यतया विज्ञापनहरू देखाउँछन्। तर केही साइटहरूले हस्तक्षेपकारी वा भ्रामक विज्ञापनहरू देखाउन सक्छन्।</translation> -<translation id="7948239795436419268">विन्डोहरू रिस्टोर नगर्नुहोस्</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" /> का सबै पेजहरू</translation> <translation id="7950629216186736592">कारण: LBS http://, https:// र file:// URL हरूमा मात्र चल्छ।</translation> <translation id="7950814699499457511">अन छ • यो एक्स्टेन्सनले गोपनीयतासम्बन्धी अभ्यासहरू (जस्तै, डेटा सङ्कलन तथा प्रयोग गर्ने तरिका) प्रकाशित गरेको छैन</translation> @@ -11176,7 +11173,6 @@ <translation id="8751034568832412184">विद्यालय</translation> <translation id="8751329102746373229">तपाईंका एड्मिनले हालेका</translation> <translation id="8752451679755290210">एउटा वस्तुबाट अर्को वस्तुमा स्वतः जानुहोस्</translation> -<translation id="8753948258138515839">तपाईं Files एपका सहायताले आफूले Google Drive, बाह्य भण्डारण वा ChromeOS Flex चल्ने डिभाइसमा सेभ गरेका फाइलहरू द्रुत रूपमा एक्सेस गर्न सक्नुहुन्छ।</translation> <translation id="8754200782896249056"><p>जब <ph name="PRODUCT_NAME" /> लाई एक समर्थित डेस्कटप वातावरण अन्तर्गत चालू गरिन्छ, प्रणाली प्रोक्सी सेटिङहरू प्रयोग हुनेछन्। तथापि, या त तपाईँको प्रणाली समर्थित छैन वा तपाईँको प्रणाली विन्यास सुरु गर्नमा समस्या थियो।</p> <p>तर तपाईँले अझै पनि आदेश रेखा मार्फत कन्फिगर गर्न सक्नुहुन्छ। कृपया फ्ल्याग र वातावरण चलहरूमा थप जानकारीको लागि <code>man <ph name="PRODUCT_BINARY_NAME" /></code> हेर्नुहोस्।</p></translation> @@ -11969,6 +11965,7 @@ <translation id="992778845837390402">हाल Linux को ब्याकअप हुँदै छ</translation> <translation id="994087375490600917">साइड प्यानलहरू</translation> <translation id="994289308992179865">&लुप</translation> +<translation id="995420352808264005">डिभाइस दर्ता गर्ने प्रकार छनौट गर्नुहोस्</translation> <translation id="995755448277384931">IBAN हाल्नुहोस्</translation> <translation id="996250603853062861">सुरक्षित जडान स्थापना गर्दै...</translation> <translation id="997143476478634194">तपाईं कुनै साइटमा जाँदा उक्त साइटमा यो सेटिङ स्वतः लागू हुन्छ। साइटहरूले सामान्यतया सनसनीपूर्ण समाचार वा च्याट म्यासेजका बारेमा तपाईंलाई जानकारी गराउन सूचना पठाउँछन्।</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 27f8062..ef077778 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -285,7 +285,6 @@ <translation id="117916940443676133">Je beveiligingssleutel is niet beveiligd met een pincode. Maak eerst een pincode als je de inloggegevens wilt beheren.</translation> <translation id="1179400851034021914">IBAN is ongeldig</translation> <translation id="1179902906564467236">Volg de instructies op je telefoon of gebruik de camera-app</translation> -<translation id="1180117276105724040">Vensters van je vorige sessie herstellen...</translation> <translation id="118057123461613219">Enorme besparingen</translation> <translation id="1181037720776840403">Verwijderen</translation> <translation id="1182876754474670069">home</translation> @@ -762,7 +761,6 @@ <translation id="151501797353681931">Geïmporteerd uit Safari</translation> <translation id="1515163294334130951">Starten</translation> <translation id="1517467582299994451">Als je wilt casten met een code, zet je de synchronisatie-instellingen van de Chrome-browser aan</translation> -<translation id="1519090060276706457">Het herstellen van vensters duurt langer dan verwacht</translation> <translation id="1521442365706402292">Certificaten beheren</translation> <translation id="1521655867290435174">Google Spreadsheets</translation> <translation id="1521774566618522728">Vandaag actief</translation> @@ -1175,7 +1173,6 @@ <translation id="1796460466266263589">Laat verifiëren dat jij het bent om Gemini te blijven gebruiken</translation> <translation id="1796588414813960292">Functies die afhankelijk zijn van geluid, werken niet</translation> <translation id="1798726622311813209">Creditcards en betaalpassen</translation> -<translation id="1799852120691957794">Kan vensters van je vorige sessie niet herstellen</translation> <translation id="180203835522132923">Zoeken + O, dan W</translation> <translation id="1802624026913571222">Slaapstand als de klep wordt gesloten</translation> <translation id="1802687198411089702">De pagina reageert niet. Je kunt wachten tot deze reageert of de pagina afsluiten.</translation> @@ -2368,7 +2365,6 @@ <translation id="2610374175948698697">Kan bestanden of mappen op je apparaat bekijken</translation> <translation id="2610780100389066815">Microsoft-vertrouwenslijsthandtekening</translation> <translation id="261114180663074524">Log in op je Microsoft-account en probeer het opnieuw</translation> -<translation id="2611702650078660078">Er is een fout opgetreden</translation> <translation id="2611776654555141051">Tool Rechthoek</translation> <translation id="2611885296070244383">Microfoon (intern)</translation> <translation id="2612676031748830579">Kaartnummer</translation> @@ -2409,7 +2405,7 @@ <translation id="2635164452434513092">Waarschuwt je niet voor privésites, zoals het intranet van je bedrijf</translation> <translation id="2635276683026132559">Ondertekening</translation> <translation id="2636266464805306348">Venstertitels</translation> -<translation id="2637313651144986786">Tabbladen doorzoeken...</translation> +<translation id="2637313651144986786">Tabbladen zoeken...</translation> <translation id="2637400434494156704">Onjuiste pincode. Je hebt nog één poging over.</translation> <translation id="263796568413910992">Vraag het aan <ph name="SEARCH_ENGINE_NAME" /> of typ een URL</translation> <translation id="2638662041295312666">Inlogafbeelding</translation> @@ -2527,7 +2523,7 @@ <translation id="2719936478972253983">De volgende cookies zijn geblokkeerd</translation> <translation id="2721037002783622288">Afbeelding &zoeken in <ph name="SEARCH_ENGINE" /></translation> <translation id="2721334646575696520">Microsoft Edge</translation> -<translation id="2721695630904737430">Gebruikers met beperkte rechten zijn uitgezet door je beheerder.</translation> +<translation id="2721695630904737430">Gebruikers onder toezicht zijn uitgezet door je beheerder.</translation> <translation id="2722540561488096675">Je apparaat wordt uitgezet over <ph name="TIME_LEFT" />. Verwijder het USB-apparaat voordat je het apparaat weer aanzet. Je kunt dan aan de slag gaan met <ph name="DEVICE_OS" />.</translation> <translation id="2722547199758472013">ID: <ph name="EXTENSION_ID" /></translation> <translation id="2722817840640790566">Gastprofiel openen</translation> @@ -2732,7 +2728,6 @@ <translation id="285033512555869047">Gesloten</translation> <translation id="2850541429955027218">Thema toevoegen</translation> <translation id="2851291081585704741">Je bent offline</translation> -<translation id="2852045827873867442">Internetverbinding vereist.</translation> <translation id="285237063405807022">(laden)</translation> <translation id="2853121255651601031">Wachtwoord opgeslagen</translation> <translation id="2854453262159518435">Bestaande tabbladgroep vervangen</translation> @@ -3511,7 +3506,7 @@ <translation id="3415580428903497523">Geïmporteerde lokale certificaten van je besturingssysteem gebruiken</translation> <translation id="341589277604221596">Live ondertiteling - <ph name="LANGUAGE" /></translation> <translation id="3416468988018290825">Altijd volledige URL's bekijken</translation> -<translation id="3417835166382867856">Tabbladen doorzoeken</translation> +<translation id="3417835166382867856">Tabbladen zoeken</translation> <translation id="3417836307470882032">Militaire tijd</translation> <translation id="3418798368381485936">Je kunt niet inloggen met dit account</translation> <translation id="3421387094817716717">Openbare sleutel voor elliptische kromme</translation> @@ -5485,7 +5480,6 @@ <translation id="4779766576531456629">Naam van mobiel netwerk voor e-simkaart wijzigen</translation> <translation id="4780321648949301421">Bewaar pagina als...</translation> <translation id="4780558987886269159">Voor het werk</translation> -<translation id="4781633367688946589">Doorgaan naar nieuwe sessie</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> wil persoonlijke informatie uit je digitale portemonnee gebruiken.</translation> <translation id="4785719467058219317">Je gebruikt een beveiligingssleutel die niet is geregistreerd voor deze website</translation> <translation id="4785914069240823137">Bijsnijden annuleren</translation> @@ -7456,10 +7450,9 @@ <translation id="6180550893222597997">Welke toegangssleutel wil je gebruiken voor <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Apps updaten soms hun branding. Controleer alle wijzigingen om er zeker van te zijn dat je ermee akkoord gaat voordat je een update uitvoert.</translation> <translation id="6181431612547969857">Download geblokkeerd</translation> -<translation id="6182100780603067202">App-audio ook delen (van alle vensters)</translation> <translation id="6183369864942961155">Automatisch licht/donker thema</translation> <translation id="6183773856988300112">Gemini in Chrome gebruikt automatisch browsen om in je tabbladen te werken en taken uit te voeren die je Gemini geeft. <ph name="LINK_BEGIN" />Meer informatie<ph name="LINK_END" /></translation> -<translation id="6184099524311454384">Tabbladen doorzoeken</translation> +<translation id="6184099524311454384">Tabbladen zoeken</translation> <translation id="6185132558746749656">Apparaatlocatie</translation> <translation id="6185151644843671709">Toegangssleutel opgeslagen en pincode gemaakt</translation> <translation id="6185353868193925315">{PASSWORD_COUNT,plural, =1{1 wachtwoord en andere items worden alleen op dit apparaat opgeslagen. Als je ze wilt gebruiken op je andere apparaten, sla je ze op in je Google-account. Hiermee worden ook eventuele duplicaten opgeschoond.}other{{PASSWORD_COUNT} wachtwoorden en andere items worden alleen op dit apparaat opgeslagen. Als je ze wilt gebruiken op je andere apparaten, sla je ze op in je Google-account. Hiermee worden ook eventuele duplicaten opgeschoond.}}</translation> @@ -8249,7 +8242,6 @@ <translation id="6754359471209693699">Nieuwe zoekopdracht starten</translation> <translation id="6754918760968695779">Snel invoegen</translation> <translation id="6755702685749429945">Woordenboek toevoegen</translation> -<translation id="6756157672127672536">De app Bestanden biedt snelle toegang tot bestanden die je op Google Drive, externe opslag of je Chrome OS-apparaat hebt opgeslagen.</translation> <translation id="6756643207511618722">Spraakengines</translation> <translation id="6757431299485455321">Help andere apparaten deze hotspot te vinden.</translation> <translation id="6758056191028427665">Laat ons weten of we goed bezig zijn.</translation> @@ -9988,7 +9980,6 @@ <translation id="794676567536738329">Rechten bevestigen</translation> <translation id="7947962633355574091">Videolink kopiëren</translation> <translation id="7947964080535614577">Sites kiezen er vaak voor advertenties te laten zien zodat ze hun content en services kosteloos kunnen aanbieden. Het is wel bekend dat bepaalde sites opdringerige of misleidende advertenties tonen.</translation> -<translation id="7948239795436419268">Vensters niet herstellen</translation> <translation id="7948407723851303488">Alle pagina's van <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Reden: LBS ondersteunt alleen URL's met http://, https:// en file://.</translation> <translation id="7950814699499457511">Aan • Deze extensie heeft geen privacyprocedures gepubliceerd, zoals hoe de extensie gegevens verzamelt en gebruikt</translation> @@ -11177,7 +11168,6 @@ <translation id="8751034568832412184">School</translation> <translation id="8751329102746373229">Van je beheerder</translation> <translation id="8752451679755290210">Automatisch tussen items navigeren</translation> -<translation id="8753948258138515839">De app Bestanden biedt snelle toegang tot bestanden die je op Google Drive, externe opslag of je Chrome OS Flex-apparaat hebt opgeslagen.</translation> <translation id="8754200782896249056"><p>Wanneer je <ph name="PRODUCT_NAME" /> uitvoert in een ondersteunde desktopomgeving, worden de proxyinstellingen van het systeem gebruikt. Je systeem wordt echter niet ondersteund of er is een probleem opgetreden met het lanceren van je systeemconfiguratie.</p> @@ -11337,7 +11327,7 @@ <translation id="8864104359314908853">Je wachtwoord is opgeslagen</translation> <translation id="8864458770072227512"><ph name="EMAIL" /> is verwijderd van dit apparaat</translation> <translation id="8865112428068029930">Gebruik je een gedeelde computer? Open een incognitovenster.</translation> -<translation id="8867102760244540173">Tabbladen doorzoeken...</translation> +<translation id="8867102760244540173">Tabbladen zoeken...</translation> <translation id="8867228703146808825">Details van build kopiëren naar klembord</translation> <translation id="8868333925931032127">Demomodus starten</translation> <translation id="8868626022555786497">In gebruik</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index c0476453..020d6432 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Kan ikke laste ned kommentarfiler for hovednoden. Prøv igjen senere.</translation> <translation id="1103523840287552314">Oversett alltid <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Du mister umiddelbart tilgangen til denne fanegruppen, og den blir slettet fra alle enhetene dine</translation> +<translation id="1105934302947321130">Google Beam med Zoom</translation> <translation id="1106270460549661906">Fjern deling med Gemini</translation> <translation id="1106350001632362876">Øk terskelen</translation> <translation id="110850812463801904">Koble til OneDrive manuelt</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Sikkerhetsnøkkelen din er ikke beskyttet med PIN-kode. For å administrere påloggingsinformasjon må du opprette en PIN-kode først.</translation> <translation id="1179400851034021914">IBAN-nummeret er ugyldig</translation> <translation id="1179902906564467236">Følg veiledningen på telefonen, eller bruk kameraappen</translation> -<translation id="1180117276105724040">Gjenoppretter vinduer fra forrige økt …</translation> <translation id="118057123461613219">Enorme besparelser</translation> <translation id="1181037720776840403">Fjern</translation> <translation id="1182876754474670069">home</translation> @@ -393,6 +393,7 @@ <translation id="1252987234827889034">Det oppsto en profilfeil</translation> <translation id="1254034280040157728">Grand Canyon</translation> <translation id="1254593899333212300">Direkte internettilkobling</translation> +<translation id="1254767904958485584">Delt visning er opprettet</translation> <translation id="1255095393630332248">Når faner deles, sendes sideinnhold, media og nettadresser til Google</translation> <translation id="1256143630373008432">Selvtesten mislyktes</translation> <translation id="1256588359404100567">Innstillingen er synkronisert fra den forrige enheten din.</translation> @@ -759,7 +760,6 @@ <translation id="151501797353681931">Importert fra Safari</translation> <translation id="1515163294334130951">Start</translation> <translation id="1517467582299994451">For å caste med kode, slå på synkroniseringsinnstillingene for Chrome-nettleseren</translation> -<translation id="1519090060276706457">Det tar lengre tid enn forventet å gjenopprette vinduer</translation> <translation id="1521442365706402292">Administrer sertifikater</translation> <translation id="1521655867290435174">Google Regneark</translation> <translation id="1521774566618522728">Aktiv i dag</translation> @@ -1106,6 +1106,7 @@ <translation id="1745732479023874451">Administrer kontakter</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{Vil du åpne og redigere # filer i denne nettappen?}}</translation> <translation id="1748563609363301860">Du kan lagre dette passordet i Google-kontoen din eller bare på denne enheten</translation> +<translation id="1749645492410897998">Installerer programvaren</translation> <translation id="1749733017156547309">Et passord kreves</translation> <translation id="1750172676754093297">Sikkerhetsnøkkelen din kan ikke lagre fingeravtrykk</translation> <translation id="1750238553597293878">Fortsett å bruke passordene i Google-kontoen din</translation> @@ -1177,7 +1178,6 @@ <translation id="1796460466266263589">For å fortsette å bruke Gemini må du bekrefte at det er deg</translation> <translation id="1796588414813960292">Funksjoner som krever lyd, kommer ikke til å virke</translation> <translation id="1798726622311813209">Kreditt- og debetkort</translation> -<translation id="1799852120691957794">Kan ikke gjenopprette vinduer fra forrige økt</translation> <translation id="180203835522132923">Søk + O og deretter W</translation> <translation id="1802624026913571222">Gå i hvilemodus når dekselet lukkes</translation> <translation id="1802687198411089702">Siden svarer ikke. Du kan vente på den eller avslutte.</translation> @@ -2268,6 +2268,7 @@ <translation id="2526590354069164005">Skrivebordet</translation> <translation id="2526619973349913024">Se etter oppdateringer</translation> <translation id="2527167509808613699">Alle typer tilkobling</translation> +<translation id="2528487766183344810">Lås opp <ph name="TOKEN_NAME" /> for å eksportere klientsertifikatet.</translation> <translation id="2529887123641260401">Du kan når som helst endre innstillingene eller åpne konfigureringsveiledningen igjen i innstillingene for brytertilgang.</translation> <translation id="2530166226437958497">Feilsøking</translation> <translation id="2531530485656743109"><ph name="BEGIN_PARAGRAPH1" />Noe gikk galt, og <ph name="DEVICE_OS" /> kunne ikke installeres.<ph name="END_PARAGRAPH1" /> @@ -2373,7 +2374,6 @@ <translation id="2610374175948698697">Kan se filer og mapper på enheten</translation> <translation id="2610780100389066815">Signering med Microsoft-klareringsliste</translation> <translation id="261114180663074524">Logg på Microsoft-kontoen, og prøv igjen</translation> -<translation id="2611702650078660078">Det oppstod en feil:</translation> <translation id="2611776654555141051">Rektangelverktøy</translation> <translation id="2611885296070244383">Mikrofon (intern)</translation> <translation id="2612676031748830579">Kortnummer</translation> @@ -2473,6 +2473,7 @@ <translation id="2670403088701171361">Ikke la nettsteder se tekst eller bilder på utklippstavlen</translation> <translation id="2671423594960767771">Del gruppe</translation> <translation id="2671451824761031126">Bokmerkene og innstillingene dine er klare</translation> +<translation id="267276224968585180">Chrome laster inn flagg fra en kommandolinjefil. Stabiliteten og sikkerheten kan bli påvirket.</translation> <translation id="2673135533890720193">lese nettleserloggen din</translation> <translation id="2673848446870717676">Sørg for at Bluetooth-enheten din er i sammenkoblingsmodus og i nærheten. Koble bare til enheter du stoler på. Sammenkoblede enheter er synlige for alle kontoer på denne Chromebooken.</translation> <translation id="2673873887296220733">Vil du kopiere 1 fil til <ph name="CLOUD_PROVIDER" /> for å åpne den?</translation> @@ -2737,7 +2738,6 @@ <translation id="285033512555869047">Lukket</translation> <translation id="2850541429955027218">Legg til temaet</translation> <translation id="2851291081585704741">Du er uten nett</translation> -<translation id="2852045827873867442">Internettilkobling er nødvendig.</translation> <translation id="285237063405807022">(laster inn)</translation> <translation id="2853121255651601031">Passordet er lagret</translation> <translation id="2854453262159518435">Erstatt den eksisterende fanegruppen</translation> @@ -2833,6 +2833,7 @@ <translation id="2916745397441987255">Søk i utvidelser</translation> <translation id="2918484639460781603">Gå til Innstillinger</translation> <translation id="2918484644467055090">Denne enheten kan ikke registreres i organisasjonen som kontoen din tilhører. Enheten er merket for administrering av en annen organisasjon.</translation> +<translation id="2920257489056757859">Et ikon som indikerer at denne profilen administreres av organisasjonen din</translation> <translation id="2920346489891435227">Åpne linken i høyre visning</translation> <translation id="2920852127376356161">Nettsteder som ikke har lov til å behandle protokoller</translation> <translation id="2921081876747860777">Opprett et passord for å beskytte de lokale dataene dine.</translation> @@ -3281,6 +3282,7 @@ <translation id="3241638166094654466">Celler i hver linje:</translation> <translation id="3241680850019875542">Velg rotkatalogen til utvidelsen som skal pakkes. Hvis du vil oppdatere en utvidelse, velger du også den private nøkkelfilen.</translation> <translation id="3241810535741601486">Denne endringen er permanent og kan ikke angres. Forlenget periode for oppdateringer gjelder for alle brukere av denne enheten. <ph name="LINK_START" />Finn ut mer<ph name="LINK_END" /></translation> +<translation id="324205398936770726">Brukerbildet ditt</translation> <translation id="3243017971870859287">lese serienumrene til ChromeOS Flex-enheten og -komponenter</translation> <translation id="324366796737464147">Støyreduksjon</translation> <translation id="3244271242291266297">MM</translation> @@ -3604,6 +3606,7 @@ <translation id="3473241910002674503">Bruk knapper til å navigere hjem og tilbake samt bytte app i nettbrettmodus.</translation> <translation id="3473479545200714844">Skjermforstørrer</translation> <translation id="3474218480460386727">Bruk 99 eller færre bokstaver for nye ord</translation> +<translation id="3474330892505468100">Google Beam med Meet</translation> <translation id="3474624961160222204">Fortsett som <ph name="NAME" /></translation> <translation id="3477772589943384839">Middels minnebesparelser. Fanene dine blir inaktive etter en lengre periode.</translation> <translation id="347785443197175480">Fortsett å gi <ph name="HOST" /> tillatelse til å bruke kameraet og mikrofonen</translation> @@ -4494,6 +4497,7 @@ <translation id="405181879009056822">ChromeOS-innstillinger</translation> <translation id="4052120076834320548">Bitteliten</translation> <translation id="4052913941260326985">Opprett &QR-kode</translation> +<translation id="4053028343167125998">Lås opp <ph name="TOKEN_NAME" /> for å importere klientsertifikatet.</translation> <translation id="4053833479432165765">&Installer siden som en app…</translation> <translation id="4054070260844648638">Synlig for alle</translation> <translation id="4056908315660577142">Du har nådd tidsgrensen som forelderen din har angitt for Chrome-appen <ph name="APP_NAME" />. Du kan bruke den i <ph name="TIME_LIMIT" /> i morgen.</translation> @@ -4707,6 +4711,7 @@ <translation id="4226303886821889519">Oppdateringsversjon: <ph name="VERSION" /></translation> <translation id="4228071595943929139">Bruk organisasjonens e-postadresse</translation> <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Denne utvidelsen er ikke tillatt}other{Noen utvidelser er ikke tillatt}}</translation> +<translation id="4229538146709970028">Lås opp <ph name="TOKEN_NAME" /> for å autentisere deg for <ph name="HOST_NAME" /> med sertifikatet ditt.</translation> <translation id="4231053948789591973">Castingen er satt på pause. Du kan når som helst gjenoppta eller stoppe castingen av skjermen.</translation> <translation id="4231095370974836764">Installer apper og spill fra Google Play på <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> <translation id="4232375817808480934">Konfigurer Kerberos</translation> @@ -5490,7 +5495,6 @@ <translation id="4779766576531456629">Gi nytt navn til mobilnettverket for eSIM-kortet</translation> <translation id="4780321648949301421">L&agre side som</translation> <translation id="4780558987886269159">For jobb</translation> -<translation id="4781633367688946589">Fortsett til en ny økt</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> vil bruke personopplysninger fra den digitale lommeboken din.</translation> <translation id="4785719467058219317">Du bruker en sikkerhetsnøkkel som ikke er registrert på dette nettstedet</translation> <translation id="4785914069240823137">Avbryt beskjæring</translation> @@ -5845,6 +5849,7 @@ <translation id="5026874946691314267">Ikke vis dette igjen.</translation> <translation id="5027550639139316293">E-postsertifikat</translation> <translation id="5027562294707732951">Legg til utvidelsen</translation> +<translation id="502811790397568978">Lås opp <ph name="TOKEN_NAME" /> for å importere klientsertifikatet fra <ph name="HOST_NAME" />.</translation> <translation id="5029287942302939687">Passordet ditt er angitt</translation> <translation id="5029873138381728058">Kunne ikke kontrollere VM-er</translation> <translation id="503155457707535043">Apper lastes ned</translation> @@ -6046,6 +6051,7 @@ <translation id="5172855596271336236">Det er 1 administrert skriver.</translation> <translation id="5173668317844998239">Legg til og slett fingeravtrykk som er lagret på sikkerhetsnøkkelen</translation> <translation id="5174169235862638850">Passordet er kopiert til utklippstavlen</translation> +<translation id="517488401359338823">Lås opp sikkerhetsenheten</translation> <translation id="5177479852722101802">Fortsett blokkering av kamera- og mikrofontilgang</translation> <translation id="5177549709747445269">Du bruker mobildata</translation> <translation id="5178667623289523808">Finn forrige</translation> @@ -6277,6 +6283,7 @@ <translation id="5337926771328966926">Det nåværende enhetsnavnet er <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Med et inkognitovindu kan du surfe privat på nettet</translation> <translation id="5338503421962489998">Lokal lagring</translation> +<translation id="5340620183031438925">For å spørre AI-modusen om fanen din uten å forlate siden, bekreft at det er deg. Du får også passordene dine med mer på alle enhetene dine.</translation> <translation id="5340787663756381836">&Finn og rediger</translation> <translation id="5340900621595888432">Send diagnostikk og bruksdata</translation> <translation id="5341793073192892252">Følgende informasjonskapsler er blokkert (informasjonskapsler fra tredjeparter blokkeres uten unntak)</translation> @@ -7462,7 +7469,6 @@ <translation id="6180550893222597997">Hvilken passnøkkel vil du bruke for <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Apper oppdaterer noen ganger merkevarebyggingen sin. Gjennomgå alle endringene for å forsikre deg om at du er fornøyd med dem, før du oppdaterer.</translation> <translation id="6181431612547969857">Nedlastingen ble blokkert</translation> -<translation id="6182100780603067202">Del også lyd fra appen (fra alle vinduene)</translation> <translation id="6183369864942961155">Automatisk lyst/mørkt tema</translation> <translation id="6183773856988300112">Gemini i Chrome bruker automatisk surfing for å jobbe i fanene dine og fullføre oppgaver du gir den. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Søk i faner</translation> @@ -8255,9 +8261,9 @@ <translation id="6754359471209693699">Start et nytt søk</translation> <translation id="6754918760968695779">Hurtiginnsetting</translation> <translation id="6755702685749429945">Legg til ordliste</translation> -<translation id="6756157672127672536">Med Filer-appen får du rask tilgang til filer du har lagret på Google Disk, eksterne lagringsenheter eller ChromeOS-enheten din.</translation> <translation id="6756643207511618722">Talemotorer</translation> <translation id="6757431299485455321">Hjelp andre enheter med å finne denne wifi-sonen.</translation> +<translation id="6757615605516049275">Lås opp <ph name="TOKEN_NAME" />.</translation> <translation id="6758056191028427665">Gi oss tilbakemelding.</translation> <translation id="6759193508432371551">Tilbakestilling til fabrikkstandard</translation> <translation id="6760354150216532978">Advarsel: Dette nettstedet kan se endringer du gjør</translation> @@ -8453,6 +8459,7 @@ <translation id="6871644448911473373">OCSP-svarer: <ph name="LOCATION" /></translation> <translation id="6871860225073478239">Språk…</translation> <translation id="6872859537300194762"><ph name="TASK_TITLE" />\nJeg har satt oppgaven på pause på grunn av annen aktivitet. Du kan gå tilbake til Chrome for å se den når den er klar.</translation> +<translation id="6873156759937047811">PIN-kode:</translation> <translation id="6873571253135628430">Endre nettstedstillatelser</translation> <translation id="6876155724392614295">Sykkel</translation> <translation id="6876469544038980967">Ikke nyttig</translation> @@ -9202,6 +9209,7 @@ <translation id="7406912950279255498">Modus for fargeinvertering</translation> <translation id="7407430846095439694">Importér og bind</translation> <translation id="7407504355934009739">De fleste blokkerer varsler fra dette nettstedet</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> inneholder sensitive data. Organisasjonen din lar deg lagre den i skylagring eller forkaste den</translation> <translation id="7408080603962564527">Dette blir synlig for andre</translation> <translation id="740810853557944681">Legg til en utskriftstjener</translation> <translation id="7409549334477097887">Ekstra stor</translation> @@ -9255,6 +9263,7 @@ <translation id="7434969625063495310">Kunne ikke legge til utskriftstjeneren. Kontroller tjenerens konfigurasjon, og prøv på nytt.</translation> <translation id="7436921188514130341">Æsj! Det oppsto en feil under navneendringen.</translation> <translation id="7439519621174723623">Legg til et enhetsnavn for å fortsette</translation> +<translation id="743982235360757672">Ha AI-modusen i nærheten mens du surfer</translation> <translation id="7441736532026945583">Velg «Skjul gruppen» for å fjerne gruppen fra faneraden</translation> <translation id="7441736921018636843">For å endre denne innstillingen, <ph name="BEGIN_LINK" />tilbakestill synkronisering<ph name="END_LINK" /> for å fjerne passordfrasen din for synkronisering</translation> <translation id="7441830548568730290">Andre brukere</translation> @@ -9993,7 +10002,6 @@ <translation id="794676567536738329">Bekreftelse av tillatelser</translation> <translation id="7947962633355574091">K&opiér videoadressen</translation> <translation id="7947964080535614577">Nettsteder viser vanligvis annonser for å kunne tilby innhold eller tjenester kostnadsfritt. Men noen nettsteder er kjent for å vise forstyrrende eller villedende annonser.</translation> -<translation id="7948239795436419268">Ikke gjenopprett vinduer</translation> <translation id="7948407723851303488">Alle sider på <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Årsak: Støtte for eldre nettlesere støtter kun http://-, https://- og file://-nettadresser.</translation> <translation id="7950814699499457511">På • Denne utvidelsen har ikke publisert retningslinjer for personvern, for eksempel hvordan den samler inn og bruker data</translation> @@ -10541,6 +10549,7 @@ <translation id="8317965619823678157">kopiere passord</translation> <translation id="8318266828739827371">Bruk en delt skjermvisning for å se det forstørrede området på skjermen. Bruk søketasten + Ctrl + D for å slå på og av dokket lupe.</translation> <translation id="8318680582681577962">Inkognito-underramme for PDF: <ph name="SUBFRAME_SITE" /></translation> +<translation id="8319105959731007612">Prosessisolering hindrer andre apper i å tukle med <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> <translation id="8319414634934645341">Utvidet bruk av nøkkel</translation> <translation id="8320212361750431956">Nylig aktivitet</translation> <translation id="8321476692217554900">varsler</translation> @@ -11182,7 +11191,6 @@ <translation id="8751034568832412184">Skole</translation> <translation id="8751329102746373229">Fra administratoren din</translation> <translation id="8752451679755290210">Gå automatisk mellom elementer</translation> -<translation id="8753948258138515839">Med Filer-appen får du rask tilgang til filer du har lagret på Google Disk, eksterne lagringsenheter eller ChromeOS Flex-enheten din.</translation> <translation id="8754200782896249056"><p>Når <ph name="PRODUCT_NAME" /> kjører i et støttet skrivebordsmiljø, brukes systemets proxy-tjenerinnstillinger. Men enten støttes ikke systemet, eller så oppsto det et problem under oppstart av systemkonfigurasjonen.</p> <p>Du kan likevel konfigurere via kommandolinjen. Les mer om flagg og miljøvariabler i <code>man <ph name="PRODUCT_BINARY_NAME" /></code>.</p></translation> @@ -11835,6 +11843,7 @@ <translation id="9186743636216815027">{NUM_APPS,plural,offset:2 =1{Administratoren din kan gjøre opptak av skjermen din med <ph name="APP0_NAME" />. Du varsles ikke når opptaket starter.}=2{Administratoren din kan gjøre opptak av skjermen din med <ph name="APP0_NAME" /> og <ph name="APP1_NAME" />. Du varsles ikke når opptaket starter.}=3{Administratoren din gjøre opptak av skjermen din med <ph name="APP0_NAME" />, <ph name="APP1_NAME" /> og 1 annen app. Du blir ikke varslet når opptaket starter.}other{Administratoren din kan gjøre opptak av skjermen din med <ph name="APP0_NAME" />, <ph name="APP1_NAME" /> og # andre apper. Du varsles ikke når opptaket starter.}}</translation> <translation id="9186963452600581158">Logg på med Google-kontoen til et barn</translation> <translation id="9187967020623675250">Tastene stemmer ikke overens. Trykk på en tast for å <ph name="RESPONSE" />.</translation> +<translation id="9188142767272053574">Slå på prosessisolering</translation> <translation id="9189618485998894982">Dette programmet er blokkert. Kontakt utvikleren</translation> <translation id="9192019773545828776">Hør taletilbakemeldinger, slik at du kan bruke enheten uten å se på skjermen. Tilbakemelding med punktskrift er tilgjengelig med en tilkoblet enhet. Bruk Ctrl + Alt + Z for å slå ChromeVox på og av. Bruk søketasten + venstrepil eller høyrepil for å navigere. Bruk Søk + mellomromstasten for å velge (aktivere).</translation> <translation id="9195969368671142407">Når organisasjonen din begrenser lagring i Google-kontoen din, kan du ikke dele eller bli med i fanegrupper</translation> @@ -11975,6 +11984,7 @@ <translation id="992778845837390402">Linux-sikkerhetskopiering pågår</translation> <translation id="994087375490600917">Sidepaneler</translation> <translation id="994289308992179865">&Gjenta</translation> +<translation id="995420352808264005">Velg type enhetsregistrering</translation> <translation id="995755448277384931">Legg til IBAN-nummer</translation> <translation id="996250603853062861">Etablerer sikker tilkobling ...</translation> <translation id="997143476478634194">Nettsteder følger automatisk denne innstillingen når du besøker dem. Nettsteder sender vanligvis varsler for å informere deg om siste nytt eller chatmeldinger.</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index 074d9c5..6014077 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -285,7 +285,6 @@ <translation id="117916940443676133">ଆପଣଙ୍କର ସୁରକ୍ଷା କୀ ଏକ ପିନ୍ ଦ୍ୱାରା ସୁରକ୍ଷିତ ନୁହେଁ। ସାଇନ୍-ଇନ୍ ଡାଟା ପରିଚାଳନା କରିବାକୁ ପ୍ରଥମେ ଏକ ପିନ୍ ତିଆରି କରନ୍ତୁ।</translation> <translation id="1179400851034021914">IBAN ଅବୈଧ ଅଟେ</translation> <translation id="1179902906564467236">ଆପଣଙ୍କ ଫୋନରେ ନିର୍ଦ୍ଦେଶାବଳୀକୁ ଫଲୋ କରନ୍ତୁ କିମ୍ବା କେମେରା ଆପକୁ ବ୍ୟବହାର କରନ୍ତୁ</translation> -<translation id="1180117276105724040">ଆପଣଙ୍କ ପୂର୍ବ ସେସନରୁ ୱିଣ୍ଡୋଗୁଡ଼ିକୁ ରିଷ୍ଟୋର କରାଯାଉଛି…</translation> <translation id="118057123461613219">ବଡ଼ ସେଭିଂସ</translation> <translation id="1181037720776840403">କାଢ଼ି ଦିଅନ୍ତୁ</translation> <translation id="1182876754474670069">ହୋମ</translation> @@ -760,7 +759,6 @@ <translation id="151501797353681931">ସଫାରୀରୁ ଇମ୍ପୋର୍ଟ କରାଯାଇଛି</translation> <translation id="1515163294334130951">ଲଞ୍ଚ କରନ୍ତୁ</translation> <translation id="1517467582299994451">ଏକ କୋଡ ମାଧ୍ୟମରେ କାଷ୍ଟ କରିବା ପାଇଁ, Chrome ବ୍ରାଉଜର ସିଙ୍କ ସେଟିଂସ ଚାଲୁ କରନ୍ତୁ</translation> -<translation id="1519090060276706457">ୱିଣ୍ଡୋଗୁଡ଼ିକୁ ରିଷ୍ଟୋର କରିବା ପାଇଁ ଆଶା କରାଯାଉଥିବା ସମୟଠାରୁ ଅଧିକ ସମୟ ଲାଗୁଛି</translation> <translation id="1521442365706402292">ସାର୍ଟିଫିକେଟଗୁଡିକୁ ପରିଚାଳନା କରନ୍ତୁ</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">ଆଜି ସକ୍ରିୟ ଅଛି</translation> @@ -1173,7 +1171,6 @@ <translation id="1796460466266263589">Gemini ବ୍ୟବହାର କରିବା ଜାରି ରଖିବା ପାଇଁ ଏହା ଆପଣ ବୋଲି ଯାଞ୍ଚ କରନ୍ତୁ</translation> <translation id="1796588414813960292">ସାଉଣ୍ଡ ଆବଶ୍ୟକ କରୁଥିବା ଫିଚରଗୁଡ଼ିକ କାମ କରିବ ନାହିଁ</translation> <translation id="1798726622311813209">କ୍ରେଡିଟ ଏବଂ ଡେବିଟ କାର୍ଡ</translation> -<translation id="1799852120691957794">ଆପଣଙ୍କ ପୂର୍ବ ସେସନରୁ ୱିଣ୍ଡୋଗୁଡ଼ିକୁ ରିଷ୍ଟୋର କରାଯାଇପାରିବ ନାହିଁ</translation> <translation id="180203835522132923">"ସର୍ଚ୍ଚ କରନ୍ତୁ" ବଟନ + O, ତାପରେ W</translation> <translation id="1802624026913571222">କଭର୍ ବନ୍ଦ ହେବା ପରେ ସ୍ଲିପ୍ ମୋଡ୍ ଚାଲୁ କରନ୍ତୁ</translation> <translation id="1802687198411089702">ପୃଷ୍ଠାଟି କାମ କରୁନାହିଁ। ଆପଣ ଏଥିପାଇଁ ଅପେକ୍ଷା କରିପାରିବେ କିମ୍ବା ପ୍ରସ୍ଥାନ କରିପାରିବେ।</translation> @@ -2367,7 +2364,6 @@ <translation id="2610374175948698697">ଆପଣଙ୍କ ଡିଭାଇସରେ ଫାଇଲ କିମ୍ୱା ଫୋଲ୍ଡରଗୁଡ଼ିକୁ ଭ୍ୟୁ କରାଯାଇପାରିବ</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">ଆପଣଙ୍କ Microsoft ଆକାଉଣ୍ଟରେ ସାଇନ ଇନ କରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ</translation> -<translation id="2611702650078660078">ଏକ ତ୍ରୁଟି ହୋଇଛି</translation> <translation id="2611776654555141051">ରେକ୍ଟାଙ୍ଗଲ ଟୁଲ</translation> <translation id="2611885296070244383">ମାଇକ (ଇଣ୍ଟର୍ନଲ)</translation> <translation id="2612676031748830579">କାର୍ଡ ସଂଖ୍ୟା</translation> @@ -2731,7 +2727,6 @@ <translation id="285033512555869047">ବନ୍ଦ ଅଛି</translation> <translation id="2850541429955027218">ଥିମ୍ ଯୋଗ କରନ୍ତୁ</translation> <translation id="2851291081585704741">ଆପଣ ଅଫଲାଇନ ଅଛନ୍ତି</translation> -<translation id="2852045827873867442">ଇଣ୍ଟର୍ନେଟ କନେକ୍ସନ ଆବଶ୍ୟକ।</translation> <translation id="285237063405807022">(ଲୋଡ ହେଉଛି)</translation> <translation id="2853121255651601031">ପାସୱାର୍ଡ ସେଭ କରାଯାଇଛି</translation> <translation id="2854453262159518435">ପୂର୍ବରୁ ଥିବା ଟାବ ଗ୍ରୁପକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ</translation> @@ -5486,7 +5481,6 @@ <translation id="4779766576531456629">eSIM ସେଲ୍ୟୁଲାର୍ ନେଟୱାର୍କକୁ ଆଉ ଗୋଟିଏ ନାମ ଦିଅନ୍ତୁ</translation> <translation id="4780321648949301421">ଏହିପରି ଭାବେ ପୃଷ୍ଠାଟିକୁ ସେଭ୍ କରନ୍ତୁ...</translation> <translation id="4780558987886269159">ୱାର୍କ ପାଇଁ</translation> -<translation id="4781633367688946589">ନୂଆ ସେସନରେ ଜାରି ରଖନ୍ତୁ</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> ଆପଣଙ୍କ ଡିଜିଟାଲ ୱାଲେଟରୁ ବ୍ୟକ୍ତିଗତ ସୂଚନା ବ୍ୟବହାର କରିବାକୁ ଚାହେଁ।</translation> <translation id="4785719467058219317">ଆପଣ ଏପରି ଏକ କୀ ବ୍ୟବହାର କରୁଛନ୍ତି, ଯାହାକୁ ଏହି ୱେବସାଇଟ୍ରେ ପଞ୍ଜୀକୃତ କରାଯାଇ ନାହିଁ</translation> <translation id="4785914069240823137">କ୍ରପ ବାତିଲ କରନ୍ତୁ</translation> @@ -7458,7 +7452,6 @@ <translation id="6180550893222597997"><ph name="APP_NAME" /> ପାଇଁ ଆପଣ କେଉଁ ପାସକୀ ବ୍ୟବହାର କରିବାକୁ ଚାହାଁନ୍ତି?</translation> <translation id="6181218116951226898">ଆପ୍ସ ବେଳେବେଳେ ସେଗୁଡ଼ିକର ବ୍ରାଣ୍ଡିଂକୁ ଅପଡେଟ କରେ। ଅପଡେଟ କରିବା ପୂର୍ବରୁ ଆପଣ ପରିବର୍ତ୍ତନଗୁଡ଼ିକ ସହିତ ସନ୍ତୁଷ୍ଟ ଅଛନ୍ତି ନା ନାହିଁ ତାହା ସୁନିଶ୍ଚିତ କରିବା ପାଇଁ ସମସ୍ତ ପରିବର୍ତ୍ତନର ରିଭ୍ୟୁ କରନ୍ତୁ।</translation> <translation id="6181431612547969857">ଡାଉନ୍ଲୋଡ୍ ବ୍ଲକ୍ କରାଯାଇଛି</translation> -<translation id="6182100780603067202">ଆପ୍ଲିକେସନ ଅଡିଓ (ଏହାର ସମସ୍ତ ୱିଣ୍ଡୋରୁ) ମଧ୍ୟ ସେୟାର କରନ୍ତୁ</translation> <translation id="6183369864942961155">ସ୍ୱତଃ ଲାଇଟ/ଡାର୍କ ଥିମ</translation> <translation id="6183773856988300112">ଆପଣଙ୍କ ଟାବଗୁଡ଼ିକରେ କାମ କରିବା ଏବଂ ଆପଣ Geminiକୁ ଦେଉଥିବା ଟାସ୍କଗୁଡ଼ିକୁ ସମ୍ପୂର୍ଣ୍ଣ କରିବା ପାଇଁ Chromeରେ Gemini ସ୍ୱତଃ ବ୍ରାଉଜକୁ ବ୍ୟବହାର କରେ। <ph name="LINK_BEGIN" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="LINK_END" /></translation> <translation id="6184099524311454384">ଟାବଗୁଡ଼ିକୁ ସର୍ଚ୍ଚ କରନ୍ତୁ</translation> @@ -8253,7 +8246,6 @@ <translation id="6754359471209693699">ନୂଆ ସର୍ଚ୍ଚ ଆରମ୍ଭ କରନ୍ତୁ</translation> <translation id="6754918760968695779">କୁଇକ ଇନସାର୍ଟ</translation> <translation id="6755702685749429945">ଅଭିଧାନ ଯୋଗ କରନ୍ତୁ</translation> -<translation id="6756157672127672536">Files ଆପ, ଆପଣ Google Drive, ଏକ୍ସଟର୍ନଲ ଷ୍ଟୋରେଜ କିମ୍ବା ଆପଣଙ୍କ ChromeOS ଡିଭାଇସରେ ସେଭ କରିଥିବା ଫାଇଲଗୁଡ଼ିକୁ କ୍ୱିକ ଆକ୍ସେସ ପ୍ରଦାନ କରେ।</translation> <translation id="6756643207511618722">ସ୍ପିଚ ଇଞ୍ଜିନ</translation> <translation id="6757431299485455321">ଏହି ହଟସ୍ପଟକୁ ଖୋଜିବାରେ ଅନ୍ୟ ଡିଭାଇସଗୁଡ଼ିକୁ ସାହାଯ୍ୟ କରନ୍ତୁ।</translation> <translation id="6758056191028427665">ଆମେ କେଉଁଭଳି କାମ କରୁଛୁ, ତାହା ଆମକୁ ଜଣାନ୍ତୁ।</translation> @@ -9992,7 +9984,6 @@ <translation id="794676567536738329">ଅନୁମତିଗୁଡ଼ିକ ସୁନିଶ୍ଚିତ କରନ୍ତୁ</translation> <translation id="7947962633355574091">&ଭିଡିଓ ଠିକଣା କପି କରନ୍ତୁ</translation> <translation id="7947964080535614577">ସାଇଟଗୁଡ଼ିକ ସାଧାରଣତଃ ବିଜ୍ଞାପନଗୁଡ଼ିକ ଦେଖାଇଥାଏ ଯାହା ଫଳରେ ସେଗୁଡ଼ିକ ବିଷୟବସ୍ତୁ କିମ୍ବା ସେବାଗୁଡ଼ିକୁ ମାଗଣାରେ ପ୍ରଦାନ କରିପାରିବ। କିନ୍ତୁ, କିଛି ସାଇଟ ଅନଧିକାର ପ୍ରବେଶ କରିଥିବା କିମ୍ବା ବିଭ୍ରାନ୍ତିକର ବିଜ୍ଞାପନଗୁଡ଼ିକ ଦେଖାଉଥିବା ଭାବେ ଜଣାଶୁଣା।</translation> -<translation id="7948239795436419268">ୱିଣ୍ଡୋଗୁଡ଼ିକୁ ରିଷ୍ଟୋର କରନ୍ତୁ ନାହିଁ</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" />ର ସମସ୍ତ ପୃଷ୍ଠା</translation> <translation id="7950629216186736592">କାରଣ: LBS କେବଳ http://, https:// ଏବଂ file:// URLsକୁ ସମର୍ଥନ କରେ।</translation> <translation id="7950814699499457511">ଚାଲୁ ଅଛି • ଏହି ଏକ୍ସଟେନସନ ଏହା କିପରି ଡାଟା ସଂଗ୍ରହ ଏବଂ ବ୍ୟବହାର କରେ ପରି ଗୋପନୀୟତା କାର୍ଯ୍ୟଗୁଡ଼ିକ ପବ୍ଲିସ କରିନାହିଁ</translation> @@ -11180,7 +11171,6 @@ <translation id="8751034568832412184">ସ୍କୁଲ</translation> <translation id="8751329102746373229">ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟରଙ୍କଠାରୁ</translation> <translation id="8752451679755290210">ସ୍ୱଚାଳିତ ଭାବେ ଆଇଟମଗୁଡ଼ିକ ମଧ୍ୟରେ ମୁଭ କରନ୍ତୁ</translation> -<translation id="8753948258138515839">Files ଆପ, ଆପଣ Google Drive, ଏକ୍ସଟର୍ନଲ ଷ୍ଟୋରେଜ କିମ୍ବା ଆପଣଙ୍କ ChromeOS Flex ଡିଭାଇସରେ ସେଭ କରିଥିବା ଫାଇଲଗୁଡ଼ିକୁ କ୍ୱିକ ଆକ୍ସେସ ପ୍ରଦାନ କରେ।</translation> <translation id="8754200782896249056"><p>ଯେତେବେଳେ <ph name="PRODUCT_NAME" /> ଏକ ସମର୍ଥିତ ଡେକ୍ସଟପ୍ ପରିବେଶରେ ଚାଲୁଛି, ସେତେବେଳେ ସିଷ୍ଟମ୍ ପ୍ରୋକ୍ସି ସେଟିଂସ୍ ବ୍ୟବହାର କରାଯିବ। ତଥାପି, ଆପଣଙ୍କର ସିଷ୍ଟମ୍ ସମର୍ଥିତ ନୁହେଁ କିମ୍ବା ଆପଣଙ୍କର ସିଷ୍ଟମ୍ କନ୍ଫିଗରେସନ୍ ଲଞ୍ଚ କରିବାରେ ଏକ ସମସ୍ୟା ହୋଇଥିଲା।</p> <p>କିନ୍ତୁ, ଆପଣ ଏବେ ମଧ୍ୟ କମାଣ୍ଡ ଲାଇନ୍ ମାଧ୍ୟମରେ କନ୍ଫିଗର୍ କରିପାରେ। ଫ୍ଲାଗ୍ ଏବଂ ପରିବର୍ତ୍ତନଶୀଳ ପରିବେଶରେ ଅଧିକ ସୂଚନା ପାଇଁ ଦୟାକରି <code>man <ph name="PRODUCT_BINARY_NAME" /></code> ଦେଖନ୍ତୁ।</p></translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 6dc8655..01ec1c7 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">ਮੁੱਖ ਨੋਡ ਐਨੋਟੇਸ਼ਨ ਫ਼ਾਈਲਾਂ ਨੂੰ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="1103523840287552314"><ph name="LANGUAGE" /> ਦਾ ਹਮੇਸ਼ਾਂ ਅਨੁਵਾਦ ਕਰੋ</translation> <translation id="1104098698795583187">ਤੁਸੀਂ ਤੁਰੰਤ ਇਸ ਟੈਬ ਗਰੁੱਪ ਤੱਕ ਪਹੁੰਚ ਗੁਆ ਬੈਠੋਗੇ ਅਤੇ ਇਸਨੂੰ ਤੁਹਾਡੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ ਤੋਂ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ</translation> +<translation id="1105934302947321130">Zoom ਨਾਲ Google Beam</translation> <translation id="1106270460549661906">Gemini ਨਾਲ ਸਾਂਝਾ ਨਾ ਕਰੋ</translation> <translation id="1106350001632362876">ਨਿਊਨਤਮ ਸੀਮਾ ਨੂੰ ਵਧਾਓ</translation> <translation id="110850812463801904">OneDrive ਨਾਲ ਹੱਥੀਂ ਕਨੈਕਟ ਕਰੋ</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਕੁੰਜੀ ਕਿਸੇ ਪਿੰਨ ਦੇ ਨਾਲ ਸੁਰੱਖਿਅਤ ਨਹੀਂ ਹੈ। ਸਾਈਨ-ਇਨ ਡਾਟੇ ਨੂੰ ਸੁਰੱਖਿਅਤ ਰੱਖਣ ਲਈ, ਪਹਿਲਾਂ ਕੋਈ ਪਿੰਨ ਬਣਾਓ।</translation> <translation id="1179400851034021914">IBAN ਅਵੈਧ ਹੈ</translation> <translation id="1179902906564467236">ਆਪਣੇ ਫ਼ੋਨ 'ਤੇ ਦਿੱਤੀਆਂ ਹਿਦਾਇਤਾਂ ਦੀ ਪਾਲਣਾ ਕਰੋ ਜਾਂ ਕੈਮਰਾ ਐਪ ਦੀ ਵਰਤੋਂ ਕਰੋ</translation> -<translation id="1180117276105724040">ਤੁਹਾਡੇ ਪਿਛਲੇ ਸੈਸ਼ਨ ਤੋਂ ਵਿੰਡੋ ਨੂੰ ਮੁੜ-ਬਹਾਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation> <translation id="118057123461613219">ਬਹੁਤ ਜ਼ਿਆਦਾ ਬਚਤਾਂ</translation> <translation id="1181037720776840403">ਹਟਾਓ</translation> <translation id="1182876754474670069">ਹੋਮ</translation> @@ -763,7 +763,6 @@ <translation id="151501797353681931">Safari ਤੋਂ ਆਯਾਤ ਕੀਤਾ</translation> <translation id="1515163294334130951">ਲਾਂਚ ਕਰੋ</translation> <translation id="1517467582299994451">ਕੋਡ ਨਾਲ ਕਾਸਟ ਕਰਨ ਲਈ, Chrome ਬ੍ਰਾਊਜ਼ਰ ਸਿੰਕ ਸੈਟਿੰਗਾਂ ਚਾਲੂ ਕਰੋ</translation> -<translation id="1519090060276706457">ਵਿੰਡੋ ਨੂੰ ਮੁੜ-ਬਹਾਲ ਕਰਨ ਨਾਲ ਉਮੀਦ ਨਾਲੋਂ ਵੱਧ ਸਮਾਂ ਲੱਗ ਰਿਹਾ ਹੈ</translation> <translation id="1521442365706402292">ਸਰਟੀਫਿਕੇਟ ਵਿਵਸਥਿਤ ਕਰੋ</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">ਅੱਜ ਕਿਰਿਆਸ਼ੀਲ</translation> @@ -1112,6 +1111,7 @@ <translation id="1745732479023874451">ਸੰਪਰਕਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}one{ਕੀ ਇਸ ਵੈੱਬ ਐਪ ਵਿੱਚ # ਫ਼ਾਈਲ ਖੋਲ੍ਹਣਾ ਅਤੇ ਉਸਦਾ ਸੰਪਾਦਨ ਕਰਨਾ ਹੈ?}other{ਕੀ ਇਸ ਵੈੱਬ ਐਪ ਵਿੱਚ # ਫ਼ਾਈਲਾਂ ਖੋਲ੍ਹਣਾ ਅਤੇ ਉਨ੍ਹਾਂ ਦਾ ਸੰਪਾਦਨ ਕਰਨਾ ਹੈ?}}</translation> <translation id="1748563609363301860">ਤੁਸੀਂ ਇਸ ਪਾਸਵਰਡ ਨੂੰ ਆਪਣੇ Google ਖਾਤੇ ਵਿੱਚ ਜਾਂ ਸਿਰਫ਼ ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਰੱਖਿਅਤ ਕਰ ਸਕਦੇ ਹੋ</translation> +<translation id="1749645492410897998">ਸਾਫ਼ਟਵੇਅਰ ਸਥਾਪਤ ਹੋ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="1749733017156547309">ਪਾਸਵਰਡ ਲੋੜੀਂਦਾ ਹੈ</translation> <translation id="1750172676754093297">ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਕੁੰਜੀ ਫਿੰਗਰਪ੍ਰਿੰਟਾਂ ਨੂੰ ਸਟੋਰ ਨਹੀਂ ਕਰ ਸਕਦੀ</translation> <translation id="1750238553597293878">ਆਪਣੇ Google ਖਾਤੇ ਵਿੱਚ ਪਾਸਵਰਡਾਂ ਨੂੰ ਵਰਤਣਾ ਜਾਰੀ ਰੱਖੋ</translation> @@ -1183,7 +1183,6 @@ <translation id="1796460466266263589">Gemini ਦੀ ਵਰਤੋਂ ਜਾਰੀ ਰੱਖਣ ਲਈ, ਆਪਣੀ ਪਛਾਣ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ</translation> <translation id="1796588414813960292">ਜਿਨ੍ਹਾਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਧੁਨੀ ਦੀ ਲੋੜ ਹੈ ਉਹ ਕੰਮ ਨਹੀਂ ਕਰਨਗੀਆਂ</translation> <translation id="1798726622311813209">ਕ੍ਰੈਡਿਟ ਅਤੇ ਡੈਬਿਟ ਕਾਰਡ</translation> -<translation id="1799852120691957794">ਤੁਹਾਡੇ ਪਿਛਲੇ ਸੈਸ਼ਨ ਤੋਂ ਵਿੰਡੋਆਂ ਨੂੰ ਮੁੜ-ਬਹਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ</translation> <translation id="180203835522132923">Search + O, ਫਿਰ W</translation> <translation id="1802624026913571222">ਕਵਰ ਬੰਦ ਹੋਣ 'ਤੇ ਸਲੀਪ ਮੋਡ ਵਿੱਚ ਜਾਓ</translation> <translation id="1802687198411089702">ਇਹ ਪੰਨਾ ਪ੍ਰਤਿਕਿਰਿਆ ਨਹੀਂ ਦੇ ਰਿਹਾ ਹੈ। ਤੁਸੀਂ ਉਡੀਕ ਕਰ ਸਕਦੇ ਹੋ ਜਾਂ ਬਾਹਰ ਜਾ ਸਕਦੇ ਹੋ।</translation> @@ -2380,7 +2379,6 @@ <translation id="2610374175948698697">ਤੁਹਾਡੇ ਡੀਵਾਈਸ 'ਤੇ ਫ਼ਾਈਲਾਂ ਜਾਂ ਫੋਲਡਰਾਂ ਨੂੰ ਦੇਖਣ ਦੀ ਆਗਿਆ ਹੈ</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">ਆਪਣੇ Microsoft ਖਾਤੇ ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰ ਕੇ ਫਿਰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ</translation> -<translation id="2611702650078660078">ਕੋਈ ਗੜਬੜ ਹੋ ਗਈ</translation> <translation id="2611776654555141051">ਆਇਤਾਕਾਰ ਟੂਲ</translation> <translation id="2611885296070244383">ਮਾਈਕ (ਅੰਦਰੂਨੀ)</translation> <translation id="2612676031748830579">ਕਾਰਡ ਨੰਬਰ</translation> @@ -2746,7 +2744,6 @@ <translation id="285033512555869047">ਬੰਦ ਹੈ</translation> <translation id="2850541429955027218">ਥੀਮ ਜੋੜੋ</translation> <translation id="2851291081585704741">ਤੁਸੀਂ ਆਫ਼ਲਾਈਨ ਹੋ</translation> -<translation id="2852045827873867442">ਇੰਟਰਨੈੱਟ ਕਨੈਕਸ਼ਨ ਲੋੜੀਂਦਾ ਹੈ।</translation> <translation id="285237063405807022">(ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ)</translation> <translation id="2853121255651601031">ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ</translation> <translation id="2854453262159518435">ਮੌਜੂਦਾ ਟੈਬ ਗਰੁੱਪ ਨੂੰ ਬਦਲੋ</translation> @@ -3612,6 +3609,7 @@ <translation id="3473241910002674503">ਟੈਬਲੈੱਟ ਮੋਡ ਵਿੱਚ ਬਟਨਾਂ ਨਾਲ ਹੋਮ 'ਤੇ ਜਾਓ, ਵਾਪਸ ਜਾਓ ਅਤੇ ਐਪਾਂ ਬਦਲੋ।</translation> <translation id="3473479545200714844">ਸਕ੍ਰੀਨ ਵਿਸਤਾਰਕ</translation> <translation id="3474218480460386727">ਨਵੇਂ ਸ਼ਬਦਾਂ ਲਈ 99 ਜਾਂ ਘੱਟ ਅੱਖਰ ਵਰਤੋ</translation> +<translation id="3474330892505468100">Meet ਨਾਲ Google Beam</translation> <translation id="3474624961160222204"><ph name="NAME" /> ਵਜੋਂ ਜਾਰੀ ਰੱਖੋ</translation> <translation id="3477772589943384839">ਔਸਤ ਮੈਮੋਰੀ ਬਚਤ ਪਾਓ। ਤੁਹਾਡੀਆਂ ਟੈਬਾਂ ਲੰਬੇ ਸਮੇਂ ਤੋਂ ਬਾਅਦ ਅਕਿਰਿਆਸ਼ੀਲ ਹੋ ਜਾਂਦੀਆਂ ਹਨ।</translation> <translation id="347785443197175480"><ph name="HOST" /> ਨੂੰ ਆਪਣੇ ਕੈਮਰੇ ਅਤੇ ਮਾਈਕ੍ਰੋਫੋਨ ਤੇ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦੇਣਾ ਜਾਰੀ ਰੱਖੋ</translation> @@ -5500,7 +5498,6 @@ <translation id="4779766576531456629">ਈ-ਸਿਮ ਦੇ ਸੈਲਿਊਲਰ ਨੈੱਟਵਰਕ ਦਾ ਨਾਮ ਬਦਲੋ</translation> <translation id="4780321648949301421">ਪੰਨੇ ਨੂੰ ਇਸ ਵਜੋਂ ਰੱਖਿਅਤ ਕਰੋ...</translation> <translation id="4780558987886269159">ਕਾਰਜ-ਸਥਾਨ ਲਈ</translation> -<translation id="4781633367688946589">ਨਵੇਂ ਸੈਸ਼ਨ 'ਤੇ ਜਾਰੀ ਰੱਖੋ</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> ਦੀ ਤੁਹਾਡੇ ਡਿਜੀਟਲ ਵਾਲੇਟ ਤੋਂ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਇੱਛਾ ਹੈ।</translation> <translation id="4785719467058219317">ਤੁਸੀਂ ਇੱਕ ਅਜਿਹੀ ਸੁਰੱਖਿਆ ਕੁੰਜੀ ਵਰਤ ਰਹੇ ਹੋ ਜੋ ਇਸ ਵੈੱਬਸਾਈਟ ਨਾਲ ਰਜਿਸਟਰ ਨਹੀਂ ਹੈ</translation> <translation id="4785914069240823137">ਕਾਂਟ-ਛਾਂਟ ਰੱਦ ਕਰੋ</translation> @@ -6288,6 +6285,7 @@ <translation id="5337926771328966926">ਮੌਜੂਦਾ ਡੀਵਾਈਸ ਦਾ ਨਾਮ <ph name="DEVICE_NAME" /> ਹੈ</translation> <translation id="5338338064218053691">ਤੁਸੀਂ ਕਿਸੇ ਇਨਕੋਗਨਿਟੋ ਵਿੰਡੋ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਨਿੱਜੀ ਤੌਰ 'ਤੇ ਬ੍ਰਾਊਜ਼ ਕਰ ਸਕਦੇ ਹੋ</translation> <translation id="5338503421962489998">ਸਥਾਨਕ ਸਟੋਰੇਜ</translation> +<translation id="5340620183031438925">ਪੰਨਾ ਛੱਡੇ ਬਿਨਾਂ ਆਪਣੀ ਟੈਬ ਬਾਰੇ AI ਮੋਡ ਨੂੰ ਪੁੱਛਣ ਲਈ, ਆਪਣੀ ਪਛਾਣ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ। ਤੁਸੀਂ ਆਪਣੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ 'ਤੇ ਆਪਣੇ ਪਾਸਵਰਡ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਪ੍ਰਾਪਤ ਕਰ ਸਕੋਗੇ।</translation> <translation id="5340787663756381836">&ਲੱਭੋ ਅਤੇ ਸੰਪਾਦਨ ਕਰੋ</translation> <translation id="5340900621595888432">ਤਸ਼ਖੀਸੀ ਅਤੇ ਵਰਤੋਂ ਡਾਟਾ ਭੇਜੋ</translation> <translation id="5341793073192892252">ਅੱਗੇ ਦਿੱਤੀਆਂ ਕੁਕੀਜ਼ ਬਲਾਕ ਕੀਤੀਆਂ ਗਈਆਂ (ਤੀਜੀ-ਪਾਰਟੀ ਦੀਆਂ ਕੁਕੀਜ਼ ਬਿਨਾਂ ਅਪਵਾਦ ਦੇ ਬਲਾਕ ਕੀਤੀਆਂ ਜਾਂਦੀਆਂ ਹਨ)</translation> @@ -7474,7 +7472,6 @@ <translation id="6180550893222597997"><ph name="APP_NAME" /> ਲਈ ਤੁਸੀਂ ਕਿਹੜੀ ਪਾਸਕੀ ਵਰਤਣਾ ਚਾਹੁੰਦੇ ਹੋ?</translation> <translation id="6181218116951226898">ਐਪਾਂ ਕਈ ਵਾਰ ਆਪਣੀ ਬ੍ਰਾਂਡਿੰਗ ਨੂੰ ਅੱਪਡੇਟ ਕਰਦੀਆਂ ਹਨ। ਅੱਪਡੇਟ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਇਹ ਪੱਕਾ ਕਰਨ ਲਈ ਕਿ ਤੁਸੀਂ ਉਨ੍ਹਾਂ ਨਾਲ ਸਹਿਜ ਹੋ, ਸਾਰੀਆਂ ਤਬਦੀਲੀਆਂ ਦੀ ਸਮੀਖਿਆ ਕਰੋ।</translation> <translation id="6181431612547969857">ਡਾਊਨਲੋਡ ਬਲਾਕ ਕੀਤੀ</translation> -<translation id="6182100780603067202">ਐਪਲੀਕੇਸ਼ਨ ਆਡੀਓ ਨੂੰ (ਇਸ ਦੀਆਂ ਸਾਰੀਆਂ ਵਿੰਡੋਆਂ ਤੋਂ) ਵੀ ਸਾਂਝਾ ਕਰੋ</translation> <translation id="6183369864942961155">ਸਵੈਚਲਿਤ ਹਲਕਾ/ਗੂੜ੍ਹਾ ਥੀਮ</translation> <translation id="6183773856988300112">Chrome ਵਿੱਚ Gemini ਤੁਹਾਡੀਆਂ ਟੈਬਾਂ ਵਿੱਚ ਕੰਮ ਕਰਨ ਅਤੇ ਤੁਹਾਡੇ ਵੱਲੋਂ ਦਿੱਤੇ ਗਏ ਕਾਰਜਾਂ ਨੂੰ ਪੂਰਾ ਕਰਨ ਲਈ ਸਵੈਚਲਿਤ ਬ੍ਰਾਊਜ਼ ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="6184099524311454384">ਖੋਜ ਟੈਬਾਂ</translation> @@ -8269,7 +8266,6 @@ <translation id="6754359471209693699">ਨਵੀਂ ਖੋਜ ਸ਼ੁਰੂ ਕਰੋ</translation> <translation id="6754918760968695779">ਕਵਿੱਕ ਇੰਸਰਟ</translation> <translation id="6755702685749429945">ਸ਼ਬਦਕੋਸ਼ ਸ਼ਾਮਲ ਕਰੋ</translation> -<translation id="6756157672127672536">Files ਐਪ ਉਨ੍ਹਾਂ ਫ਼ਾਈਲਾਂ ਤੱਕ ਤਤਕਾਲ ਪਹੁੰਚ ਮੁਹੱਈਆ ਕਰਵਾਉਂਦੀ ਹੈ ਜਿਨ੍ਹਾਂ ਨੂੰ ਤੁਸੀਂ Google Drive, ਬਾਹਰੀ ਸਟੋਰੇਜ ਜਾਂ ਆਪਣੇ ChromeOS ਡੀਵਾਈਸ 'ਤੇ ਰੱਖਿਅਤ ਕੀਤਾ ਹੈ।</translation> <translation id="6756643207511618722">ਬੋਲੀ ਇੰਜਣ</translation> <translation id="6757431299485455321">ਇਸ ਹੌਟਸਪੌਟ ਨੂੰ ਲੱਭਣ ਵਿੱਚ ਦੂਜੇ ਡੀਵਾਈਸਾਂ ਦੀ ਮਦਦ ਕਰੋ।</translation> <translation id="6758056191028427665">ਸਾਨੂੰ ਦੱਸੋ ਕਿ ਸਾਡਾ ਪ੍ਰਦਰਸ਼ਨ ਕਿਹੋ ਜਿਹਾ ਹੈ।</translation> @@ -9215,6 +9211,7 @@ <translation id="7406912950279255498">ਰੰਗ ਪਲਟਨਾ ਮੋਡ</translation> <translation id="7407430846095439694">ਆਯਾਤ ਕਰੋ ਅਤੇ ਜੋੜੋ</translation> <translation id="7407504355934009739">ਜ਼ਿਆਦਾਤਰ ਲੋਕ ਇਸ ਸਾਈਟ ਤੋਂ ਸੂਚਨਾਵਾਂ ਬਲਾਕ ਕਰਦੇ ਹਨ</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> ਵਿੱਚ ਸੰਵੇਦਨਸ਼ੀਲ ਡਾਟਾ ਹੈ। ਤੁਹਾਡੀ ਸੰਸਥਾ ਤੁਹਾਨੂੰ ਇਸਨੂੰ ਕਲਾਊਡ ਸਟੋਰੇਜ ਵਿੱਚ ਰੱਖਿਅਤ ਕਰਨ ਜਾਂ ਇਸਨੂੰ ਬਰਖਾਸਤ ਕਰਨ ਦੇਵੇਗੀ</translation> <translation id="7408080603962564527">ਇਹ ਹੋਰਾਂ ਨੂੰ ਦਿਸੇਗਾ</translation> <translation id="740810853557944681">ਕੋਈ ਪ੍ਰਿੰਟ ਸਰਵਰ ਸ਼ਾਮਲ ਕਰੋ</translation> <translation id="7409549334477097887">ਬਹੁਤ ਜ਼ਿਆਦਾ</translation> @@ -9268,6 +9265,7 @@ <translation id="7434969625063495310">ਪ੍ਰਿੰਟ ਸਰਵਰ ਨੂੰ ਸ਼ਾਮਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਕਿਰਪਾ ਕਰਕੇ ਸਰਵਰ ਦੇ ਸੰਰੂਪਣ ਦੀ ਜਾਂਚ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="7436921188514130341">ਓਹੋ! ਨਾਮ ਬਦਲਣ ਦੌਰਾਨ ਗੜਬੜ ਹੋ ਗਈ।</translation> <translation id="7439519621174723623">ਜਾਰੀ ਰੱਖਣ ਲਈ ਇੱਕ ਡੀਵਾਈਸ ਦਾ ਨਾਮ ਸ਼ਾਮਲ ਕਰੋ</translation> +<translation id="743982235360757672">ਬ੍ਰਾਊਜ਼ ਕਰਨ ਵੇਲੇ AI ਮੋਡ ਨੂੰ ਨੇੜੇ ਰੱਖੋ</translation> <translation id="7441736532026945583">ਆਪਣੀ ਟੈਬ ਪੱਟੀ ਤੋਂ ਗਰੁੱਪ ਨੂੰ ਹਟਾਉਣ ਲਈ "ਗਰੁੱਪ ਲੁਕਾਓ" ਨੂੰ ਚੁਣੋ</translation> <translation id="7441736921018636843">ਇਸ ਸੈਟਿੰਗ ਨੂੰ ਬਦਲਣ ਲਈ, ਆਪਣਾ ਸਿੰਕ ਪਾਸਫਰੇਜ਼ ਹਟਾਉਣ ਵਾਸਤੇ <ph name="BEGIN_LINK" />ਸਿੰਕ ਰੀਸੈੱਟ ਕਰੋ<ph name="END_LINK" /></translation> <translation id="7441830548568730290">ਹੋਰ ਵਰਤੋਂਕਾਰ</translation> @@ -10006,7 +10004,6 @@ <translation id="794676567536738329">ਅਨੁਮਤੀਆਂ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ</translation> <translation id="7947962633355574091">ਵੀਡੀਓ ਪਤਾ ਕਾ&ਪੀ ਕਰੋ</translation> <translation id="7947964080535614577">ਸਾਈਟਾਂ ਆਮ ਤੌਰ 'ਤੇ ਵਿਗਿਆਪਨ ਇਸ ਲਈ ਦਿਖਾਉਂਦੀਆਂ ਹਨ ਤਾਂ ਕਿ ਉਹ ਮੁਫ਼ਤ ਵਿੱਚ ਸਮੱਗਰੀ ਜਾਂ ਸੇਵਾਵਾਂ ਮੁਹੱਈਆ ਕਰਵਾ ਸਕਣ। ਪਰ ਕੁਝ ਸਾਈਟਾਂ ਨੂੰ ਦਖਲਅੰਦਾਜ਼ੀ ਅਤੇ ਗੁਮਰਾਹ ਕਰਨ ਵਾਲੇ ਵਿਗਿਆਪਨ ਦਿਖਾਉਣ ਵਾਲੀਆਂ ਜਾਣਿਆ ਜਾਂਦਾ ਹੈ।</translation> -<translation id="7948239795436419268">ਵਿੰਡੋ ਨੂੰ ਮੁੜ-ਬਹਾਲ ਨਾ ਕਰੋ</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" /> ਦੇ ਸਾਰੇ ਪੰਨੇ</translation> <translation id="7950629216186736592">ਕਾਰਨ: LBS ਸਿਰਫ਼ http://, https://, ਅਤੇ ਫ਼ਾਈਲ:// URL ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ।</translation> <translation id="7950814699499457511">ਚਾਲੂ ਹੈ • ਇਸ ਐਕਸਟੈਂਸ਼ਨ ਨੇ ਇਸ ਵੱਲੋਂ ਡਾਟੇ ਨੂੰ ਇਕੱਤਰ ਕਰਨ ਅਤੇ ਉਸਦੀ ਵਰਤੋਂ ਦੇ ਤਰੀਕੇ ਵਰਗੇ ਪਰਦੇਦਾਰੀ ਵਿਹਾਰਾਂ ਨੂੰ ਪ੍ਰਕਾਸ਼ਿਤ ਨਹੀਂ ਕੀਤਾ ਹੈ</translation> @@ -11195,7 +11192,6 @@ <translation id="8751034568832412184">ਸਕੂਲ</translation> <translation id="8751329102746373229">ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ</translation> <translation id="8752451679755290210">ਆਈਟਮਾਂ ਵਿਚਾਲੇ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਜਾਓ</translation> -<translation id="8753948258138515839">Files ਐਪ ਉਨ੍ਹਾਂ ਫ਼ਾਈਲਾਂ ਤੱਕ ਤਤਕਾਲ ਪਹੁੰਚ ਮੁਹੱਈਆ ਕਰਵਾਉਂਦੀ ਹੈ ਜਿਨ੍ਹਾਂ ਨੂੰ ਤੁਸੀਂ Google Drive, ਬਾਹਰੀ ਸਟੋਰੇਜ ਜਾਂ ਆਪਣੇ ChromeOS Flex ਡੀਵਾਈਸ 'ਤੇ ਰੱਖਿਅਤ ਕੀਤਾ ਹੈ।</translation> <translation id="8754200782896249056"><p>ਜਦੋਂ <ph name="PRODUCT_NAME" /> ਇੱਕ ਸਮਰਥਿਤ ਡੈਸਕਟਾਪ ਵਾਤਾਵਰਨ ਦੇ ਅਧੀਨ ਚੱਲ ਰਿਹਾ ਹੋਵੇ, ਤਾਂ ਸਿਸਟਮ ਪ੍ਰੌਕਸੀ ਸੈਟਿੰਗਾਂ ਵਰਤੀਆਂ ਜਾਣਗੀਆਂ। ਹਾਲਾਂਕਿ, ਜਾਂ ਤਾਂ ਤੁਹਾਡਾ ਸਿਸਟਮ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ ਜਾਂ ਤੁਹਾਡੇ ਸਿਸਟਮ ਸੰਰੂਪਣ ਨੂੰ ਲਾਂਚ ਕਰਨ ਵਿੱਚ ਕੋਈ ਸਮੱਸਿਆ ਹੋ ਗਈ।</p> <p>ਪਰ ਤੁਸੀਂ ਤਦ ਵੀ ਕਮਾਂਡ ਫ਼ਾਈਲ ਰਾਹੀਂ ਸੰਰੂਪਿਤ ਕਰ ਸਕਦੇ ਹੋ। ਕਿਰਪਾ ਕਰਕੇ ਫਲੈਗ ਅਤੇ ਵਾਤਾਵਰਨ ਵੈਰੀਏਬਲਾਂ 'ਤੇ ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ <code>man <ph name="PRODUCT_BINARY_NAME" /></code> ਦੇਖੋ।</p></translation> @@ -11989,6 +11985,7 @@ <translation id="992778845837390402">ਇਸ ਵੇਲੇ Linux ਦਾ ਬੈਕਅੱਪ ਜਾਰੀ ਹੈ</translation> <translation id="994087375490600917">ਸਾਈਡ ਪੈਨਲ</translation> <translation id="994289308992179865">&ਲੂਪ</translation> +<translation id="995420352808264005">ਡੀਵਾਈਸ ਦਰਜਾਬੰਦੀ ਦੀ ਕਿਸਮ ਚੁਣੋ</translation> <translation id="995755448277384931">IBAN ਨੂੰ ਸ਼ਾਮਲ ਕਰੋ</translation> <translation id="996250603853062861">ਸੁਰੱਖਿ੍ਤ ਕਨੈਕਸ਼ਨ ਸਥਾਪਿਤ ਕਰ ਰਿਹਾ ਹੈ...</translation> <translation id="997143476478634194">ਜਦੋਂ ਤੁਸੀਂ ਸਾਈਟਾਂ 'ਤੇ ਜਾਂਦੇ ਹੋ, ਤਾਂ ਉਹ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਇਸ ਸੈਟਿੰਗ ਦੀ ਪਾਲਣਾ ਕਰਦੀਆਂ ਹਨ। ਸਾਈਟਾਂ ਆਮ ਤੌਰ 'ਤੇ ਤੁਹਾਨੂੰ ਤਾਜ਼ਾ ਖਬਰਾਂ ਜਾਂ ਚੈਟ ਸੁਨੇਹਿਆਂ ਬਾਰੇ ਦੱਸਣ ਲਈ ਸੂਚਨਾਵਾਂ ਭੇਜਦੀਆਂ ਹਨ।</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 9155579..ff188568 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -285,7 +285,6 @@ <translation id="117916940443676133">Klucz bezpieczeństwa nie jest zabezpieczony kodem PIN. Aby zarządzać danymi logowania, najpierw utwórz kod PIN.</translation> <translation id="1179400851034021914">Nieprawidłowy numer IBAN</translation> <translation id="1179902906564467236">Postępuj zgodnie z instrukcjami wyświetlanymi na telefonie lub użyj aplikacji Aparat</translation> -<translation id="1180117276105724040">Przywracam okna z poprzedniej sesji…</translation> <translation id="118057123461613219">Bardzo duża oszczędność</translation> <translation id="1181037720776840403">Usuń</translation> <translation id="1182876754474670069">Home</translation> @@ -764,7 +763,6 @@ <translation id="151501797353681931">Zaimportowane z przeglądarki Safari</translation> <translation id="1515163294334130951">Uruchom</translation> <translation id="1517467582299994451">Aby przesyłać treści na podstawie kodu, włącz ustawienia synchronizacji przeglądarki Chrome</translation> -<translation id="1519090060276706457">Przywracanie okien trwa dłużej niż zwykle</translation> <translation id="1521442365706402292">Zarządzaj certyfikatami</translation> <translation id="1521655867290435174">Arkusze Google</translation> <translation id="1521774566618522728">Aktywność: dzisiaj</translation> @@ -1177,7 +1175,6 @@ <translation id="1796460466266263589">Aby nadal korzystać z Gemini, potwierdź swoją tożsamość</translation> <translation id="1796588414813960292">Funkcje, które wymagają dźwięku, nie będą działać</translation> <translation id="1798726622311813209">Karty kredytowe i debetowe</translation> -<translation id="1799852120691957794">Nie można przywrócić okien z poprzedniej sesji</translation> <translation id="180203835522132923">Wyszukaj + O, a następnie W</translation> <translation id="1802624026913571222">Uśpij po zamknięciu pokrywy</translation> <translation id="1802687198411089702">Strona nie odpowiada. Możesz zaczekać lub ją zamknąć.</translation> @@ -2353,7 +2350,6 @@ <translation id="2610374175948698697">Możliwość wyświetlania plików i folderów na urządzeniu</translation> <translation id="2610780100389066815">Podpisywanie listy zaufania firmy Microsoft</translation> <translation id="261114180663074524">Zaloguj się na konto Microsoft i spróbuj jeszcze raz</translation> -<translation id="2611702650078660078">Wystąpił błąd</translation> <translation id="2611776654555141051">Narzędzie Prostokąt</translation> <translation id="2611885296070244383">Mikrofon (wewnętrzny)</translation> <translation id="2612676031748830579">Numer karty</translation> @@ -2717,7 +2713,6 @@ <translation id="285033512555869047">Zamknięta</translation> <translation id="2850541429955027218">Dodaj motyw</translation> <translation id="2851291081585704741">Jesteś offline</translation> -<translation id="2852045827873867442">Wymagane jest połączenie z internetem.</translation> <translation id="285237063405807022">(wczytuję)</translation> <translation id="2853121255651601031">Hasło zostało zapisane</translation> <translation id="2854453262159518435">Zastąp istniejącą grupę kart</translation> @@ -5467,7 +5462,6 @@ <translation id="4779766576531456629">Zmień nazwę sieci komórkowej eSIM</translation> <translation id="4780321648949301421">Zapisz stronę jako...</translation> <translation id="4780558987886269159">Do pracy</translation> -<translation id="4781633367688946589">Przejdź do nowej sesji</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> chce używać danych osobowych z Twojego cyfrowego portfela.</translation> <translation id="4785719467058219317">Używasz klucza bezpieczeństwa, który nie jest zarejestrowany w tej witrynie</translation> <translation id="4785914069240823137">Anuluj przycinanie</translation> @@ -7440,7 +7434,6 @@ <translation id="6180550893222597997">Którego klucza chcesz używać dla aplikacji <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Aplikacje czasami aktualizują swój wizerunek marki. Przed aktualizacją sprawdź wszystkie zmiany, aby upewnić się, że Ci odpowiadają.</translation> <translation id="6181431612547969857">Pobieranie zostało zablokowane</translation> -<translation id="6182100780603067202">Udostępnij też dźwięk z aplikacji (ze wszystkich jej okien)</translation> <translation id="6183369864942961155">Automatyczny jasny/ciemny motyw</translation> <translation id="6183773856988300112">Gemini w Chrome używa automatycznego przeglądania, aby działać na kartach i realizować zadania, o których wykonanie poprosisz. <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Wyszukaj karty</translation> @@ -8237,7 +8230,6 @@ <translation id="6754359471209693699">Rozpocznij nowe wyszukiwanie</translation> <translation id="6754918760968695779">Szybkie wstawianie</translation> <translation id="6755702685749429945">Dodaj słownik</translation> -<translation id="6756157672127672536">Aplikacja Pliki daje szybki dostęp do plików zapisanych na Dysku Google, urządzeniu z Chrome OS lub w pamięci zewnętrznej.</translation> <translation id="6756643207511618722">Mechanizmy syntezy mowy</translation> <translation id="6757431299485455321">Pomóż innym urządzeniom znaleźć ten hotspot.</translation> <translation id="6758056191028427665">Co sądzisz o efektach naszej pracy?</translation> @@ -9974,7 +9966,6 @@ <translation id="794676567536738329">Potwierdź uprawnienia</translation> <translation id="7947962633355574091">K&opiuj adres filmu</translation> <translation id="7947964080535614577">Strony zwykle wyświetlają reklamy, aby móc dostarczać treści i usługi bezpłatnie. Istnieją jednak strony, które wyświetlają reklamy uciążliwe lub wprowadzające w błąd.</translation> -<translation id="7948239795436419268">Nie przywracaj okien</translation> <translation id="7948407723851303488">Wszystkie strony w domenie <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Przyczyna: obsługa starszych przeglądarek działa tylko z adresami URL http://, https:// i file://.</translation> <translation id="7950814699499457511">Włączono • Dla tego rozszerzenia nie opublikowano procedur ochrony prywatności, na przykład informacji o tym, jak zbiera i wykorzystuje ono dane</translation> @@ -11159,7 +11150,6 @@ <translation id="8751034568832412184">Szkoła</translation> <translation id="8751329102746373229">Od administratora</translation> <translation id="8752451679755290210">Automatyczne przechodzenie między elementami</translation> -<translation id="8753948258138515839">Aplikacja Pliki zapewnia szybki dostęp do plików zapisanych na Dysku Google, urządzeniu z ChromeOS Flex lub w pamięci zewnętrznej.</translation> <translation id="8754200782896249056"><p>Po uruchomieniu programu <ph name="PRODUCT_NAME" /> w obsługiwanym środowisku pulpitu są używane systemowe ustawienia serwera proxy. Jednak ten system nie jest obsługiwany lub wystąpił problem z zastosowaniem konfiguracji systemu.</p> <p>Serwer proxy można jeszcze skonfigurować za pomocą wiersza poleceń. Więcej informacji na temat flag i zmiennych środowiskowych zawiera instrukcja <code>man <ph name="PRODUCT_BINARY_NAME" /></code>.</p></translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 47812af..e488ac4f 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -285,7 +285,6 @@ <translation id="117916940443676133">Sua chave de segurança não está protegida com um PIN. Para gerenciar dados de login, crie um PIN primeiro.</translation> <translation id="1179400851034021914">O IBAN é inválido</translation> <translation id="1179902906564467236">Siga as instruções no smartphone ou use o app de câmera</translation> -<translation id="1180117276105724040">Restaurando as janelas da sessão anterior…</translation> <translation id="118057123461613219">Imensa economia</translation> <translation id="1181037720776840403">Remover</translation> <translation id="1182876754474670069">início</translation> @@ -764,7 +763,6 @@ <translation id="151501797353681931">Importados do Safari</translation> <translation id="1515163294334130951">Iniciar</translation> <translation id="1517467582299994451">Para transmitir com um código, ative as configurações de sincronização do navegador Chrome</translation> -<translation id="1519090060276706457">A restauração das janelas está demorando mais do que o esperado</translation> <translation id="1521442365706402292">Gerenciar certificados</translation> <translation id="1521655867290435174">Google Planilhas</translation> <translation id="1521774566618522728">Ativo hoje</translation> @@ -1185,7 +1183,6 @@ <translation id="1796460466266263589">Para continuar usando o Gemini, confirme sua identidade</translation> <translation id="1796588414813960292">Os recursos que precisam de som não funcionarão</translation> <translation id="1798726622311813209">Cartões de débito e de crédito</translation> -<translation id="1799852120691957794">Não foi possível restaurar as janelas da sessão anterior</translation> <translation id="180203835522132923">Pesquisa + O e depois W</translation> <translation id="1802624026913571222">Suspender quando a capa for fechada</translation> <translation id="1802687198411089702">A página não está respondendo. Você pode esperar até que ele volte a responder ou sair.</translation> @@ -2382,7 +2379,6 @@ <translation id="2610374175948698697">Podem acessar arquivos ou pastas no seu dispositivo</translation> <translation id="2610780100389066815">Assinatura da lista de confiabilidade da Microsoft</translation> <translation id="261114180663074524">Faça login na sua conta da Microsoft e tente de novo</translation> -<translation id="2611702650078660078">Ocorreu um erro</translation> <translation id="2611776654555141051">Ferramenta de retângulo</translation> <translation id="2611885296070244383">Microfone (interno)</translation> <translation id="2612676031748830579">Número do cartão</translation> @@ -2745,7 +2741,6 @@ <translation id="285033512555869047">Fechado</translation> <translation id="2850541429955027218">Adicionar tema</translation> <translation id="2851291081585704741">Você está off-line</translation> -<translation id="2852045827873867442">É necessário ter uma conexão de Internet.</translation> <translation id="285237063405807022">(carregando)</translation> <translation id="2853121255651601031">Senha salva</translation> <translation id="2854453262159518435">Substituir o grupo de guias atual</translation> @@ -5502,7 +5497,6 @@ <translation id="4779766576531456629">Renomear rede celular do eSIM</translation> <translation id="4780321648949301421">Salvar página como...</translation> <translation id="4780558987886269159">Para o trabalho</translation> -<translation id="4781633367688946589">Continuar para a nova sessão</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> quer usar informações pessoais da sua carteira digital.</translation> <translation id="4785719467058219317">Você está usando uma chave de segurança que não está registrada neste site</translation> <translation id="4785914069240823137">Cancelar corte</translation> @@ -7479,7 +7473,6 @@ <translation id="6180550893222597997">Qual senha de acesso você quer usar no app <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Às vezes, os apps atualizam a marca. Revise todas as mudanças para garantir que você concorda com elas antes de atualizar.</translation> <translation id="6181431612547969857">Download bloqueado</translation> -<translation id="6182100780603067202">Compartilhar também o áudio do aplicativo (de todas as janelas)</translation> <translation id="6183369864942961155">Tema claro/escuro automático</translation> <translation id="6183773856988300112">O Gemini no Chrome usa a navegação automática para acessar suas guias e realizar as tarefas que você pedir. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Pesquisar guias</translation> @@ -8274,7 +8267,6 @@ <translation id="6754359471209693699">Começar nova pesquisa</translation> <translation id="6754918760968695779">Inserção multimídia</translation> <translation id="6755702685749429945">Adicionar dicionário</translation> -<translation id="6756157672127672536">O aplicativo Arquivos fornece acesso rápido a arquivos que foram salvos no Google Drive, em armazenamento externo ou no seu dispositivo ChromeOS.</translation> <translation id="6756643207511618722">Mecanismos de fala</translation> <translation id="6757431299485455321">Ajude outros dispositivos a encontrarem esse ponto de acesso.</translation> <translation id="6758056191028427665">Diga como estamos nos saindo.</translation> @@ -10014,7 +10006,6 @@ <translation id="794676567536738329">Confirmar permissões</translation> <translation id="7947962633355574091">C&opiar endereço do vídeo</translation> <translation id="7947964080535614577">Os sites geralmente mostram anúncios para oferecer conteúdo ou serviços sem custo financeiro. No entanto, alguns sites têm anúncios invasivos ou enganosos.</translation> -<translation id="7948239795436419268">Não restaurar janelas</translation> <translation id="7948407723851303488">Todas as páginas de <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Motivo: o LBS tem suporte apenas a URLs http://, https:// e file://.</translation> <translation id="7950814699499457511">Ativada • A extensão não publicou práticas de privacidade, como a forma de coleta e uso dos dados</translation> @@ -11203,7 +11194,6 @@ <translation id="8751034568832412184">Escola</translation> <translation id="8751329102746373229">Do seu administrador</translation> <translation id="8752451679755290210">Navegar pelos itens automaticamente</translation> -<translation id="8753948258138515839">O app Arquivos fornece acesso rápido a arquivos que foram salvos no Google Drive, em armazenamento externo ou no seu dispositivo ChromeOS Flex.</translation> <translation id="8754200782896249056"><p> Durante a execução do <ph name="PRODUCT_NAME" /> em um ambiente de computador compatível, serão utilizadas as configurações de proxy do sistema. No entanto, seu sistema não é suportado ou ocorreu um problema ao iniciar a configuração do sistema.</p> <p>Porém, você ainda pode configurar por meio da linha de comando. Consulte <code>man <ph name="PRODUCT_BINARY_NAME" /></code> para ver mais informações sobre variáveis de sinalizadores e ambiente.</p></translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index ad388e7..b48a3d7 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -225,6 +225,7 @@ <translation id="114715166554490743">Ponteiro de cabeça</translation> <translation id="114721135501989771">Inteligên. Google no Chrome</translation> <translation id="1147322039136785890">Agora é a vez de <ph name="SUPERVISED_USER_NAME" /></translation> +<translation id="1147867844630510586">Inicie sessão com <ph name="IDP_NAME" /></translation> <translation id="1148464196693569530">Permitir scripts do utilizador</translation> <translation id="1148624853678088576">Está tudo pronto!</translation> <translation id="1148669835763563782">Está a receber a mais recente atualização de software para obter uma segurança otimizada e as funcionalidades mais recentes do Chromebook. Esta atualização inclui uma experiência de configuração melhorada para ajudar a começar sem problemas no seu Chromebook.</translation> @@ -285,7 +286,6 @@ <translation id="117916940443676133">A sua chave de segurança não está protegida com um PIN. Para gerir os dados de início de sessão, crie primeiro um PIN.</translation> <translation id="1179400851034021914">O IBAN é inválido</translation> <translation id="1179902906564467236">Siga as instruções no telemóvel ou use a app da câmara</translation> -<translation id="1180117276105724040">A restaurar as janelas da sua sessão anterior…</translation> <translation id="118057123461613219">Enormes poupanças</translation> <translation id="1181037720776840403">Remover</translation> <translation id="1182876754474670069">início</translation> @@ -762,7 +762,6 @@ <translation id="151501797353681931">Importado do Safari</translation> <translation id="1515163294334130951">Iniciar</translation> <translation id="1517467582299994451">Para transmitir com um código, ative as definições de sincronização do navegador Chrome</translation> -<translation id="1519090060276706457">A restauração de janelas está a demorar mais do que o esperado</translation> <translation id="1521442365706402292">Gerir certificados</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">Ativo hoje</translation> @@ -1006,6 +1005,7 @@ <translation id="1674073353928166410">Abrir todos (<ph name="URL_COUNT" />) numa janela de navegação anónima</translation> <translation id="1674142805528405174">O Gestor de Palavras-passe da Google pode atualizar a sua conta com uma palavra-passe forte que está guardada para si na sua conta <ph name="EMAIL" />.</translation> <translation id="1674945585974615438">Desativar automaticamente os otimizadores do JavaScript em sites desconhecidos</translation> +<translation id="1675964862374196038">Inscreva-se com <ph name="IDP_NAME" /></translation> <translation id="1677306805708094828">Não é possível adicionar <ph name="EXTENSION_TYPE_PARAMETER" /></translation> <translation id="1677472565718498478"><ph name="TIME" /> restante(s)</translation> <translation id="1678849866171627536">Falha ao analisar. Este ficheiro pode ser um vírus ou software malicioso.</translation> @@ -1175,7 +1175,6 @@ <translation id="1796460466266263589">Para continuar a usar o Gemini, valide a sua identidade</translation> <translation id="1796588414813960292">As funcionalidades que necessitam de som não funcionarão</translation> <translation id="1798726622311813209">Cartões de crédito e débito</translation> -<translation id="1799852120691957794">Não é possível restaurar as janelas da sua sessão anterior</translation> <translation id="180203835522132923">Pesquisa + O e, em seguida, W</translation> <translation id="1802624026913571222">Suspender quando a tampa for fechada</translation> <translation id="1802687198411089702">A página não responde. Pode esperar pela resposta ou sair.</translation> @@ -2368,7 +2367,6 @@ <translation id="2610374175948698697">Pode ver ficheiros ou pastas no seu dispositivo</translation> <translation id="2610780100389066815">Assinatura de lista fidedigna da Microsoft</translation> <translation id="261114180663074524">Inicie sessão na sua conta Microsoft e tente novamente</translation> -<translation id="2611702650078660078">Ocorreu um erro</translation> <translation id="2611776654555141051">Ferramenta de retângulo</translation> <translation id="2611885296070244383">Microfone (interno)</translation> <translation id="2612676031748830579">Número do cartão</translation> @@ -2732,7 +2730,6 @@ <translation id="285033512555869047">Fechado</translation> <translation id="2850541429955027218">Adicionar tema</translation> <translation id="2851291081585704741">Está offline</translation> -<translation id="2852045827873867442">É necessária ligação à Internet.</translation> <translation id="285237063405807022">(a carregar)</translation> <translation id="2853121255651601031">Palavra-passe guardada</translation> <translation id="2854453262159518435">Substituir grupo de separadores existente</translation> @@ -5489,7 +5486,6 @@ <translation id="4779766576531456629">Mudar o nome da rede móvel do eSIM</translation> <translation id="4780321648949301421">Guardar página como...</translation> <translation id="4780558987886269159">Para trabalho</translation> -<translation id="4781633367688946589">Continuar para nova sessão</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> quer usar informações pessoais da sua carteira digital.</translation> <translation id="4785719467058219317">Está a utilizar uma chave de segurança que não está registada neste Website.</translation> <translation id="4785914069240823137">Cancele o recorte</translation> @@ -7466,7 +7462,6 @@ <translation id="6180550893222597997">Que token de acesso quer usar para a app <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Por vezes, as apps atualizam o respetivo branding. Reveja todas as alterações para se certificar de que concorda com estas antes de atualizar.</translation> <translation id="6181431612547969857">Transferência bloqueada</translation> -<translation id="6182100780603067202">Partilhar também o áudio da aplicação (de todas as respetivas janelas)</translation> <translation id="6183369864942961155">Tema claro/escuro automático</translation> <translation id="6183773856988300112">O Gemini no Chrome usa a procura automática para trabalhar nos seus separadores e concluir as tarefas que lhe atribuir. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Pesquisar separadores</translation> @@ -8259,7 +8254,6 @@ <translation id="6754359471209693699">Iniciar nova pesquisa</translation> <translation id="6754918760968695779">Inserção rápida</translation> <translation id="6755702685749429945">Adicionar dicionário</translation> -<translation id="6756157672127672536">A app Files proporciona um acesso rápido aos ficheiros que guardou no Google Drive, armazenamento externo ou dispositivo com ChromeOS.</translation> <translation id="6756643207511618722">Motores de voz</translation> <translation id="6757431299485455321">Ajude outros dispositivos a encontrar esta zona Wi-Fi.</translation> <translation id="6758056191028427665">Dê-nos a sua opinião acerca do nosso desempenho.</translation> @@ -9999,7 +9993,6 @@ <translation id="794676567536738329">Confirmar Permissões</translation> <translation id="7947962633355574091">C&opiar Endereço do vídeo</translation> <translation id="7947964080535614577">Normalmente, os sites mostram anúncios para poderem fornecer conteúdos ou serviços sem custo financeiro. No entanto, alguns sites são conhecidos por mostrarem anúncios intrusivos ou enganadores.</translation> -<translation id="7948239795436419268">Não restaurar janelas</translation> <translation id="7948407723851303488">Todas as páginas de <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Motivo: a LBS (Compatibilidade com o navegador antigo) apenas suporta URLs http://, https:// e file://.</translation> <translation id="7950814699499457511">Ativada • Esta extensão não publicou Práticas de Privacidade, por exemplo, a forma como recolhe e usa os dados</translation> @@ -11188,7 +11181,6 @@ <translation id="8751034568832412184">Escola</translation> <translation id="8751329102746373229">Do seu administrador</translation> <translation id="8752451679755290210">Mova-se entre os itens automaticamente</translation> -<translation id="8753948258138515839">A app Files fornece um acesso rápido aos ficheiros que guardou no Google Drive, armazenamento externo ou dispositivo com ChromeOS Flex.</translation> <translation id="8754200782896249056"><p>Ao executar o <ph name="PRODUCT_NAME" /> num ambiente de trabalho suportado, são utilizadas as definições de proxy do sistema. No entanto, o seu sistema não é suportado ou ocorreu um problema no início da configuração do sistema.</p> <p>Porém, pode ainda configurar através da linha de comandos. Consulte <code>man <ph name="PRODUCT_BINARY_NAME" /></code> para obter mais informações acerca de sinalizadores e variáveis do ambiente.</p></translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index da4e0f20..d4e7dc31 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Nu se pot descărca fișierele cu adnotări pentru nodurile principale. Încearcă din nou mai târziu.</translation> <translation id="1103523840287552314">Tradu întotdeauna din <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Vei pierde imediat accesul la acest grup de file și el va fi șters de pe toate dispozitivele tale</translation> +<translation id="1105934302947321130">Google Beam cu Zoom</translation> <translation id="1106270460549661906">Nu mai permite accesul Gemini</translation> <translation id="1106350001632362876">Mărește pragul</translation> <translation id="110850812463801904">Conectează-te manual la OneDrive</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Cheia de securitate nu este protejată printr-un cod PIN. Pentru a gestiona datele de conectare, creează mai întâi un cod PIN.</translation> <translation id="1179400851034021914">Codul IBAN este nevalid</translation> <translation id="1179902906564467236">Urmează instrucțiunile de pe telefon sau folosește aplicația camerei foto</translation> -<translation id="1180117276105724040">Se restabilesc ferestrele din sesiunea anterioară...</translation> <translation id="118057123461613219">Economii uriașe de memorie</translation> <translation id="1181037720776840403">Elimină</translation> <translation id="1182876754474670069">acasă</translation> @@ -762,7 +762,6 @@ <translation id="151501797353681931">Importate din Safari</translation> <translation id="1515163294334130951">Lansați</translation> <translation id="1517467582299994451">Ca să proiectezi folosind un cod, activează setările de sincronizare a browserului Chrome</translation> -<translation id="1519090060276706457">Restabilirea ferestrelor durează mai mult decât s-a estimat</translation> <translation id="1521442365706402292">Gestionează certificatele</translation> <translation id="1521655867290435174">Foi de calcul Google</translation> <translation id="1521774566618522728">Activ astăzi</translation> @@ -1103,6 +1102,7 @@ <translation id="1745732479023874451">Gestionează agenda</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}few{Deschizi și editezi # fișiere în această aplicație web?}other{Deschizi și editezi # de fișiere în această aplicație web?}}</translation> <translation id="1748563609363301860">Poți salva parola în Contul Google sau numai pe acest dispozitiv</translation> +<translation id="1749645492410897998">Se instalează software-ul</translation> <translation id="1749733017156547309">Este necesară o parolă</translation> <translation id="1750172676754093297">Cheia ta de securitate nu poate stoca amprente digitale</translation> <translation id="1750238553597293878">Folosește în continuare parolele din Contul Google</translation> @@ -1174,7 +1174,6 @@ <translation id="1796460466266263589">Confirmă-ți identitatea pentru a folosi în continuare Gemini</translation> <translation id="1796588414813960292">Opțiunile care au nevoie de sunet nu vor funcționa</translation> <translation id="1798726622311813209">Carduri de credit și de debit</translation> -<translation id="1799852120691957794">Nu se pot restabili ferestrele din sesiunea anterioară</translation> <translation id="180203835522132923">Tasta de căutare + O, apoi W</translation> <translation id="1802624026913571222">Când capacul este închis: modul inactiv</translation> <translation id="1802687198411089702">Pagina nu răspunde. Poți aștepta să răspundă sau o poți închide.</translation> @@ -2367,7 +2366,6 @@ <translation id="2610374175948698697">Poate să vadă fișierele sau dosarele de pe dispozitiv</translation> <translation id="2610780100389066815">Semnarea listei de încredere Microsoft</translation> <translation id="261114180663074524">Conectează-te la contul Microsoft și încearcă din nou</translation> -<translation id="2611702650078660078">A apărut o eroare</translation> <translation id="2611776654555141051">Instrument pentru dreptunghiuri</translation> <translation id="2611885296070244383">Microfon (intern)</translation> <translation id="2612676031748830579">Număr card</translation> @@ -2731,7 +2729,6 @@ <translation id="285033512555869047">Închis</translation> <translation id="2850541429955027218">Adaugă o temă</translation> <translation id="2851291081585704741">Ești offline</translation> -<translation id="2852045827873867442">Este necesară o conexiune la internet.</translation> <translation id="285237063405807022">(se încarcă)</translation> <translation id="2853121255651601031">Parola a fost salvată</translation> <translation id="2854453262159518435">Înlocuiește grupul de file existent</translation> @@ -3597,6 +3594,7 @@ <translation id="3473241910002674503">Navighează la ecranul de pornire, înapoi și comută între aplicații folosind butoanele în modul tabletă.</translation> <translation id="3473479545200714844">Lupă de ecran</translation> <translation id="3474218480460386727">Folosește maximum 99 de litere pentru cuvintele noi</translation> +<translation id="3474330892505468100">Google Beam cu Meet</translation> <translation id="3474624961160222204">Continuă ca <ph name="NAME" /></translation> <translation id="3477772589943384839">Fă economii moderate de memorie. Filele devin inactive după o perioadă mai lungă.</translation> <translation id="347785443197175480">Permiteți în continuare accesul <ph name="HOST" /> la camera și microfonul dvs.</translation> @@ -5485,7 +5483,6 @@ <translation id="4779766576531456629">Redenumește rețeaua de date mobile eSIM</translation> <translation id="4780321648949301421">Salvează pagina ca...</translation> <translation id="4780558987886269159">Pentru serviciu</translation> -<translation id="4781633367688946589">Continuă cu noua sesiune</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> dorește să-ți folosească informațiile cu caracter personal din portofelul digital.</translation> <translation id="4785719467058219317">Folosești o cheie de securitate care nu este înregistrată pe acest site</translation> <translation id="4785914069240823137">Anulează decuparea</translation> @@ -6272,6 +6269,7 @@ <translation id="5337926771328966926">Numele actual al dispozitivului este <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Poți naviga privat folosind o fereastră incognito</translation> <translation id="5338503421962489998">Stocare la nivel local</translation> +<translation id="5340620183031438925">Pentru a întreba Modul AI despre filă fără să părăsești pagina, confirmă-ți identitatea. În plus, vei putea accesa parolele și multe altele pe toate dispozitivele.</translation> <translation id="5340787663756381836">&Găsește și modifică</translation> <translation id="5340900621595888432">Trimite date de diagnosticare și de utilizare</translation> <translation id="5341793073192892252">Următoarele cookie-uri au fost blocate (cookie-urile terță parte sunt blocate fără excepții)</translation> @@ -7458,7 +7456,6 @@ <translation id="6180550893222597997">Ce cheie de acces vrei să folosești pentru <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Uneori, aplicațiile își actualizează brandingul. Examinează toate modificările pentru a te asigura că ești de acord cu ele înainte de a actualiza.</translation> <translation id="6181431612547969857">Descărcarea a fost blocată</translation> -<translation id="6182100780603067202">Permite accesul și la conținutul audio al aplicației (din toate ferestrele sale).</translation> <translation id="6183369864942961155">Temă luminoasă / întunecată automată</translation> <translation id="6183773856988300112">Gemini folosește navigarea automată în Chrome ca să lucreze în filele tale și să finalizeze activitățile pe care i le aloci. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Caută în file</translation> @@ -8253,7 +8250,6 @@ <translation id="6754359471209693699">Începe o căutare nouă</translation> <translation id="6754918760968695779">Inserare rapidă</translation> <translation id="6755702685749429945">Adaugă un dicționar</translation> -<translation id="6756157672127672536">Aplicația Fișiere oferă acces rapid la fișierele pe care le-ai salvat în Google Drive, în spațiul de stocare extern sau pe dispozitivul cu sistemul de operare Chrome.</translation> <translation id="6756643207511618722">Motoare de vorbire</translation> <translation id="6757431299485455321">Ajută alte dispozitive să găsească acest hotspot.</translation> <translation id="6758056191028427665">Spune-ne cum ne descurcăm.</translation> @@ -9200,6 +9196,7 @@ <translation id="7406912950279255498">Modul de inversare a culorilor</translation> <translation id="7407430846095439694">Importă și asociază</translation> <translation id="7407504355934009739">Majoritatea utilizatorilor blochează notificările de la acest site</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> conține date sensibile. Organizația ta îți va permite să le salvezi în stocarea în cloud sau să le ștergi.</translation> <translation id="7408080603962564527">Acesta va fi vizibil pentru alte persoane</translation> <translation id="740810853557944681">Adaugă un server de imprimare</translation> <translation id="7409549334477097887">Foarte mare</translation> @@ -9253,6 +9250,7 @@ <translation id="7434969625063495310">Nu s-a putut adăuga serverul de imprimare. Verifică ce configurație are serverul și încearcă din nou.</translation> <translation id="7436921188514130341">Of, nu mai merge! A apărut o eroare la redenumire.</translation> <translation id="7439519621174723623">Adaugă un nume de dispozitiv pentru a continua</translation> +<translation id="743982235360757672">Ține Modul AI la îndemână în timp ce navighezi</translation> <translation id="7441736532026945583">Selectează „Ascunde grupul” pentru a elimina grupul din bara de file</translation> <translation id="7441736921018636843">Ca să modifici setarea, <ph name="BEGIN_LINK" />resetează sincronizarea<ph name="END_LINK" /> pentru a elimina expresia de acces pentru sincronizare</translation> <translation id="7441830548568730290">Alți utilizatori</translation> @@ -9991,7 +9989,6 @@ <translation id="794676567536738329">Confirmați permisiunile</translation> <translation id="7947962633355574091">C&opiază adresa videoclipului</translation> <translation id="7947964080535614577">În general, site-urile afișează anunțuri pentru a putea oferi conținut sau servicii fără costuri. Însă, unele site-uri afișează anunțuri deranjante sau înșelătoare.</translation> -<translation id="7948239795436419268">Nu restabili ferestrele</translation> <translation id="7948407723851303488">Toate paginile din <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Motivul: LBS acceptă numai adresele URL http://, https:// și file://.</translation> <translation id="7950814699499457511">Activată • Extensia nu a publicat practici de confidențialitate, cum ar fi modul în care colectează și folosește date</translation> @@ -11180,7 +11177,6 @@ <translation id="8751034568832412184">Școală</translation> <translation id="8751329102746373229">De la administrator</translation> <translation id="8752451679755290210">Treci automat de la un element la altul</translation> -<translation id="8753948258138515839">Aplicația Fișiere oferă acces rapid la fișierele pe care le-ai salvat în Google Drive, în spațiul de stocare extern sau pe dispozitivul cu sistemul de operare Chrome Flex.</translation> <translation id="8754200782896249056"><p>Când rulezi <ph name="PRODUCT_NAME" /> într-un mediu de desktop acceptat, vor fi utilizate setările de proxy ale sistemului. Cu toate acestea, fie sistemul nu este acceptat, fie a existat o problemă la lansarea configurației sistemului.</p> <p>Poți totuși să configurezi prin linia de comandă. Accesează <code>man <ph name="PRODUCT_BINARY_NAME" /></code> pentru mai multe informații despre semnalizatori și variabile de mediu.</p></translation> @@ -11974,6 +11970,7 @@ <translation id="992778845837390402">Se face backup pentru Linux</translation> <translation id="994087375490600917">Panouri laterale</translation> <translation id="994289308992179865">&Redă în buclă</translation> +<translation id="995420352808264005">Alege tipul de înregistrare a dispozitivului</translation> <translation id="995755448277384931">Adaugă codul IBAN</translation> <translation id="996250603853062861">Se stabilește conexiunea securizată...</translation> <translation id="997143476478634194">Site-urile aplică automat această setare când le accesezi. De obicei, site-urile trimit notificări ca să te informeze cu privire la știri de ultimă oră sau mesaje de chat.</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 06cc3c41..2d7a41a 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Не удалось скачать файлы аннотаций основного узла. Повторите попытку позже.</translation> <translation id="1103523840287552314">Всегда переводить <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Эта группа сразу станет вам недоступна и будет удалена со всех ваших устройств.</translation> +<translation id="1105934302947321130">Google Beam с Zoom</translation> <translation id="1106270460549661906">Отменить доступ для Gemini</translation> <translation id="1106350001632362876">Повысить порог</translation> <translation id="110850812463801904">Подключиться к OneDrive вручную</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Ваш электронный ключ не защищен PIN-кодом. Чтобы управлять учетными данными, создайте PIN-код.</translation> <translation id="1179400851034021914">Недействительный код IBAN.</translation> <translation id="1179902906564467236">Следуйте инструкциям на телефоне или используйте приложение "Камера".</translation> -<translation id="1180117276105724040">Восстановление окон из предыдущего сеанса…</translation> <translation id="118057123461613219">Очень большая экономия</translation> <translation id="1181037720776840403">Удалить</translation> <translation id="1182876754474670069">Home</translation> @@ -763,7 +763,6 @@ <translation id="151501797353681931">Импортированные из Safari</translation> <translation id="1515163294334130951">Запустить</translation> <translation id="1517467582299994451">Чтобы трансляцию можно было запускать с помощью кода, включите синхронизацию в браузере Chrome.</translation> -<translation id="1519090060276706457">Восстановление окон занимает больше времени, чем обычно</translation> <translation id="1521442365706402292">Настроить сертификаты</translation> <translation id="1521655867290435174">Google Таблицы</translation> <translation id="1521774566618522728">Последние действия: сегодня</translation> @@ -1104,6 +1103,7 @@ <translation id="1745732479023874451">Управление контактами</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}one{Использовать это веб-приложение для просмотра и редактирования # файла?}few{Использовать это веб-приложение для просмотра и редактирования # файлов?}many{Использовать это веб-приложение для просмотра и редактирования # файлов?}other{Использовать это веб-приложение для просмотра и редактирования # файла?}}</translation> <translation id="1748563609363301860">Вы можете сохранить пароль в аккаунте Google или только на этом устройстве.</translation> +<translation id="1749645492410897998">Установка ПО…</translation> <translation id="1749733017156547309">Необходимо указать пароль.</translation> <translation id="1750172676754093297">На этом электронном ключе не сохраняются цифровые отпечатки.</translation> <translation id="1750238553597293878">Продолжайте использовать пароли в аккаунте Google.</translation> @@ -1175,7 +1175,6 @@ <translation id="1796460466266263589">Чтобы продолжить использовать Gemini, подтвердите личность.</translation> <translation id="1796588414813960292">Функции, которые используют звук, не будут работать</translation> <translation id="1798726622311813209">Кредитные и дебетовые карты</translation> -<translation id="1799852120691957794">Не удалось восстановить окна из предыдущего сеанса</translation> <translation id="180203835522132923">Поиск + O, затем W</translation> <translation id="1802624026913571222">Переходить в спящий режим при закрытии крышки</translation> <translation id="1802687198411089702">Страница не отвечает. Вы можете закрыть ее или дождаться ответа сервера.</translation> @@ -2368,7 +2367,6 @@ <translation id="2610374175948698697">Файлы, которым разрешено просматривать файлы и папки на устройстве</translation> <translation id="2610780100389066815">Подписывание списка доверия (Microsoft)</translation> <translation id="261114180663074524">Войдите в аккаунт Microsoft и повторите попытку.</translation> -<translation id="2611702650078660078">Произошла ошибка.</translation> <translation id="2611776654555141051">Инструмент "Прямоугольник"</translation> <translation id="2611885296070244383">Встроенный микрофон</translation> <translation id="2612676031748830579">Номер карты</translation> @@ -2732,7 +2730,6 @@ <translation id="285033512555869047">Закрытая</translation> <translation id="2850541429955027218">Добавить тему</translation> <translation id="2851291081585704741">Нет подключения к интернету</translation> -<translation id="2852045827873867442">Требуется подключение к интернету.</translation> <translation id="285237063405807022">(загружается)</translation> <translation id="2853121255651601031">Пароль сохранен</translation> <translation id="2854453262159518435">Заменить существующую</translation> @@ -3599,6 +3596,7 @@ <translation id="3473241910002674503">В режиме планшета будут видны кнопки для перехода к панели запуска, возврата на предыдущий экран и переключения между приложениями.</translation> <translation id="3473479545200714844">Лупа</translation> <translation id="3474218480460386727">В новых словах не должно быть больше 99 букв.</translation> +<translation id="3474330892505468100">Google Beam с Meet</translation> <translation id="3474624961160222204">Продолжить как <ph name="NAME" /></translation> <translation id="3477772589943384839">Умеренная экономия памяти. Вкладки становятся неактивными по истечении длительного периода времени.</translation> <translation id="347785443197175480">Предоставить сайту <ph name="HOST" /> доступ к камере и микрофону</translation> @@ -5487,7 +5485,6 @@ <translation id="4779766576531456629">Переименовать мобильную сеть eSIM</translation> <translation id="4780321648949301421">Сохранить страницу как...</translation> <translation id="4780558987886269159">Для работы</translation> -<translation id="4781633367688946589">Начать новый сеанс</translation> <translation id="4784349455504343791">Сайт <ph name="WEBSITE_ORIGIN" /> запрашивает разрешение на использование вашей личной информации из электронного кошелька.</translation> <translation id="4785719467058219317">Вы используете электронный ключ, который не зарегистрирован на этом сайте.</translation> <translation id="4785914069240823137">Отменить кадрирование</translation> @@ -6275,6 +6272,7 @@ <translation id="5337926771328966926">Текущее название устройства: <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">В режиме инкогнито можно просматривать сайты анонимно</translation> <translation id="5338503421962489998">Локальное хранилище</translation> +<translation id="5340620183031438925">Подтвердите личность, чтобы задать вопрос о вкладке в режиме ИИ, не покидая страницу. Пароли и другие данные также появятся на всех ваших устройствах.</translation> <translation id="5340787663756381836">&Найти и изменить</translation> <translation id="5340900621595888432">Отправка данных об использовании и диагностике</translation> <translation id="5341793073192892252">Были заблокированы следующие файлы cookie (сторонние файлы cookie блокируются без исключения):</translation> @@ -7461,7 +7459,6 @@ <translation id="6180550893222597997">Какой ключ доступа вы хотите использовать для <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Фирменная символика приложений иногда меняется. Проверяйте изменения перед обновлением, чтобы убедиться, что вас все устраивает.</translation> <translation id="6181431612547969857">Скачивание запрещено</translation> -<translation id="6182100780603067202">Также передавать аудио из приложения (из всех его окон)</translation> <translation id="6183369864942961155">Автоматическое включение светлой/тёмной темы</translation> <translation id="6183773856988300112">Gemini в Chrome будет автоматически искать информацию, чтобы выполнять задачи на вкладках браузера. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Поиск по вкладкам</translation> @@ -8251,7 +8248,7 @@ <translation id="6745592621698551453">Обновить сейчас</translation> <translation id="6746124502594467657">Переместить вниз</translation> <translation id="67465227497040338">Показать пароль для <ph name="DOMAIN" /></translation> -<translation id="6746834324024491643">Чтобы синхронизировать пароли и другие данные на всех устройствах, войдите в аккаунт <ph name="EMAIL" /></translation> +<translation id="6746834324024491643">Чтобы синхронизировать пароли и другие данные на всех устройствах, войдите в аккаунт <ph name="EMAIL" />.</translation> <translation id="6748980958975836188">Я принимаю <ph name="BEGIN_LINK1" />Условия использования<ph name="END_LINK1" /> и <ph name="BEGIN_LINK2" />Дополнительные условия использования Chrome и Chrome OS<ph name="END_LINK2" /></translation> <translation id="6749077623962119521">Сбросить разрешения?</translation> <translation id="6749473226660745022">Фото</translation> @@ -8260,7 +8257,6 @@ <translation id="6754359471209693699">Начать новый поиск</translation> <translation id="6754918760968695779">Быстрая вставка</translation> <translation id="6755702685749429945">Добавить словарь</translation> -<translation id="6756157672127672536">С помощью приложения "Файлы" можно быстро открывать документы, сохраненные на Google Диске, внешнем накопителе или устройстве с Chrome OS.</translation> <translation id="6756643207511618722">Синтезаторы речи</translation> <translation id="6757431299485455321">Помочь другим устройствам найти эту точку доступа</translation> <translation id="6758056191028427665">Расскажите, как у вас дела.</translation> @@ -9207,6 +9203,7 @@ <translation id="7406912950279255498">Режим инверсии цветов</translation> <translation id="7407430846095439694">Импортировать и подключить</translation> <translation id="7407504355934009739">Большинство пользователей блокируют уведомления с этого сайта.</translation> +<translation id="7407578029724074226">Файл "<ph name="FILE_NAME" />" содержит конфиденциальные данные. Согласно правилам организации, вы можете сохранить его в облачном хранилище или удалить.</translation> <translation id="7408080603962564527">Будет видно всем пользователям</translation> <translation id="740810853557944681">Добавьте сервер печати</translation> <translation id="7409549334477097887">Максимальный</translation> @@ -9259,6 +9256,7 @@ <translation id="7434969625063495310">Не удалось добавить сервер печати. Проверьте его настройки и повторите попытку.</translation> <translation id="7436921188514130341">При изменении названия произошла ошибка.</translation> <translation id="7439519621174723623">Чтобы продолжить, добавьте имя устройства.</translation> +<translation id="743982235360757672">Быстрый доступ к режиму ИИ в браузере</translation> <translation id="7441736532026945583">Выберите "Скрыть группу", чтобы убрать группу с панели вкладок.</translation> <translation id="7441736921018636843">Чтобы изменить этот параметр, <ph name="BEGIN_LINK" />сбросьте настройки синхронизации<ph name="END_LINK" /> и удалите кодовую фразу</translation> <translation id="7441830548568730290">Другие пользователи</translation> @@ -9997,7 +9995,6 @@ <translation id="794676567536738329">Подтверждение разрешений</translation> <translation id="7947962633355574091">&Копировать URL видео</translation> <translation id="7947964080535614577">Обычно сайты показывают рекламу, чтобы зарабатывать на ней и иметь возможность бесплатно предоставлять свой контент или сервисы. Однако на некоторых страницах используется навязчивая или вводящая в заблуждение реклама.</translation> -<translation id="7948239795436419268">Не восстанавливать окна</translation> <translation id="7948407723851303488">Все страницы <ph name="DOMAIN_NAME" />.</translation> <translation id="7950629216186736592">Причина: функция поддержки альтернативного браузера позволяет использовать только URL с протоколами HTTP, HTTPS и FILE.</translation> <translation id="7950814699499457511">Включено • Для этого расширения не опубликованы меры по обеспечению конфиденциальности, например сведения о том, как оно собирает и использует данные.</translation> @@ -11186,7 +11183,6 @@ <translation id="8751034568832412184">Учебный</translation> <translation id="8751329102746373229">От администратора</translation> <translation id="8752451679755290210">Перемещайтесь между объектами автоматически</translation> -<translation id="8753948258138515839">С помощью приложения "Файлы" можно быстро открывать документы, сохраненные на Google Диске, внешнем накопителе или устройстве с Chrome OS Flex.</translation> <translation id="8754200782896249056"><p>При работе <ph name="PRODUCT_NAME" /> в поддерживаемой среде на компьютере используются системные настройки прокси-сервера. Однако либо ваша система не поддерживается, либо возникли неполадки при запуске системной конфигурации.</p> <p>Но вы все же можете выполнить конфигурацию с помощью командной строки. Подробнее о флагах и переменных окружения вы можете узнать в <code>руководстве к <ph name="PRODUCT_BINARY_NAME" /></code>.</p></translation> @@ -11982,6 +11978,7 @@ <translation id="992778845837390402">Выполняется резервное копирование Linux.</translation> <translation id="994087375490600917">Боковые панели</translation> <translation id="994289308992179865">&Повтор</translation> +<translation id="995420352808264005">Выберите тип регистрации устройства</translation> <translation id="995755448277384931">Добавить код IBAN</translation> <translation id="996250603853062861">Создание безопасного подключения...</translation> <translation id="997143476478634194">Когда вы посещаете сайты, эти настройки используются автоматически. Обычно сайты показывают уведомления, чтобы оповестить вас о сообщениях в чате или срочных новостях.</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index d81f999..4dcd1fb 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">ප්රධාන නෝඩ් අනුසටහන් ගොනු බාගත නොහැක. පසුව නැවත උත්සාහ කරන්න.</translation> <translation id="1103523840287552314">සැමවිටම <ph name="LANGUAGE" /> පරිවර්තනය කරන්න</translation> <translation id="1104098698795583187">ඔබට වහාම මෙම පටිති සමූහයට ප්රවේශය අහිමි වනු ඇති අතර, එය ඔබේ සියලු උපාංගවලින් මකනු ඇත</translation> +<translation id="1105934302947321130">Zoom සමග Google Beam</translation> <translation id="1106270460549661906">Gemini සමග බෙදා නොගන්න</translation> <translation id="1106350001632362876">සීමාව වැඩි කරන්න</translation> <translation id="110850812463801904">OneDrive වෙත හස්තීයව සම්බන්ධ වන්න</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">ඔබේ ආරක්ෂක යතුරු රහස් අංකයකින් ආරක්ෂා නොකෙරේ. පුරන දත්ත කළමනා කිරීමට, පළමුව රහස් අංකයක් නිර්මාණ කරන්න.</translation> <translation id="1179400851034021914">IBAN අවලංගුයි</translation> <translation id="1179902906564467236">ඔබේ දුරකථනයේ උපදෙස් අනුගමනය කරන්න හෝ කැමරා යෙදුම භාවිතා කරන්න</translation> -<translation id="1180117276105724040">ඔබගේ පෙර සැසියෙන් කවුළු ප්රතිසාධනය කරමින්...</translation> <translation id="118057123461613219">විශාල ඉතුරුම්</translation> <translation id="1181037720776840403">ඉවත් කරන්න</translation> <translation id="1182876754474670069">නිවස</translation> @@ -759,7 +759,6 @@ <translation id="151501797353681931">Safari වෙතින් අනායනයන කරන ලදී</translation> <translation id="1515163294334130951">දියත් කරන්න</translation> <translation id="1517467582299994451">කේතයක් සමග විකාශය කිරීමට, Chrome බ්රව්සර සමමුහුර්ත සැකසීම් ක්රියාත්මක කරන්න</translation> -<translation id="1519090060276706457">කවුළු ප්රතිසාධනය කිරීමට බලාපොරොත්තු වූවාට වඩා වැඩි කාලයක් ගතවේ.</translation> <translation id="1521442365706402292">සහතික කළමනාකරණය කරන්න</translation> <translation id="1521655867290435174">Google පත්ර</translation> <translation id="1521774566618522728">අද ක්රියාත්මකයි</translation> @@ -1100,6 +1099,7 @@ <translation id="1745732479023874451">සම්බන්ධතා කළමනාකරණය කරන්න</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}one{මෙම වෙබ් යෙදුමේ ගොනු #ක් විවෘත කර සංස්කරණය කරන්නද?}other{මෙම වෙබ් යෙදුමේ ගොනු #ක් විවෘත කර සංස්කරණය කරන්නද?}}</translation> <translation id="1748563609363301860">ඔබට මෙම මුරපදය ඔබේ Google ගිණුම තුළ හෝ මෙම උපාංගයේ පමණක් සුරකිය හැක</translation> +<translation id="1749645492410897998">මෘදුකාංගය ස්ථාපනය කරමින්</translation> <translation id="1749733017156547309">මුරපදයක් අවශ්යයි</translation> <translation id="1750172676754093297">ඔබේ ආරක්ෂක යතුරට ඇඟිලි සලකුණු ගබඩා කළ නොහැක.</translation> <translation id="1750238553597293878">ඔබේ Google ගිණුමේ ඇති මුරපද දිගටම භාවිතා කරන්න</translation> @@ -1171,7 +1171,6 @@ <translation id="1796460466266263589">Gemini භාවිත කිරීම දිගටම කරගෙන යාමට, ඒ ඔබ බව සත්යාපනය කරන්න</translation> <translation id="1796588414813960292">හඬ අවශ්ය විශේෂාංග ක්රියා නොකරනු ඇත</translation> <translation id="1798726622311813209">ණය සහ හර කාඩ්පත්</translation> -<translation id="1799852120691957794">ඔබේ පෙර සැසියෙන් කවුළු ප්රතිස්ථාපනය කළ නොහැක</translation> <translation id="180203835522132923">සොයන්න + O, පසුව W</translation> <translation id="1802624026913571222">ආවරණය වැසුණු විට නිදා ගන්න</translation> <translation id="1802687198411089702">පිටුව ප්රතිචාර නොදක්වයි. ඔබට එය සඳහා රැඳී සිටීමට හෝ පිටවීමට හැකිය.</translation> @@ -2367,7 +2366,6 @@ <translation id="2610374175948698697">ඔබේ උපාංගයෙහි ගොනු හෝ ෆෝල්ඩර බැලිය හැක</translation> <translation id="2610780100389066815">Microsoft විශ්වාසදායී ලැයිස්තු ප්රවිෂ්ටය</translation> <translation id="261114180663074524">ඔබේ Microsoft ගිණුමට පුරනය වී නැවත උත්සාහ කරන්න</translation> -<translation id="2611702650078660078">දෝෂයක් ඇති විය</translation> <translation id="2611776654555141051">සෘජුකෝණාස්ර මෙවලම</translation> <translation id="2611885296070244383">මයික්රෆෝනය (අභ්යන්තර)</translation> <translation id="2612676031748830579">කාඩ්පත් අංකය</translation> @@ -2731,7 +2729,6 @@ <translation id="285033512555869047">වසා ඇත</translation> <translation id="2850541429955027218">තේමාව එක් කරන්න</translation> <translation id="2851291081585704741">ඔබ නොබැඳි වේ</translation> -<translation id="2852045827873867442">අන්තර්ජාල සම්බන්ධතාවය අවශ්යයි.</translation> <translation id="285237063405807022">(පූරණ කෙරේ)</translation> <translation id="2853121255651601031">මුරපදය සුරැකිණි</translation> <translation id="2854453262159518435">පවතින පටිති සමූහය ප්රතිස්ථාපනය කරන්න</translation> @@ -3596,6 +3593,7 @@ <translation id="3473241910002674503">ටැබ්ලට් ප්රකාරය තුළ බොත්තම් මඟින් නිවසට සංචලන වීම, ආපසු යාම, සහ යෙදුම් මාරු කිරීම.</translation> <translation id="3473479545200714844">තිර විශාලකය</translation> <translation id="3474218480460386727">නව වචන සඳහා අකුරු 99ක් හෝ ඊට අඩු ගණනක් භාවිත කරන්න</translation> +<translation id="3474330892505468100">Meet සමග Google Beam</translation> <translation id="3474624961160222204"><ph name="NAME" /> ලෙස දිගටම කර ගෙන යන්න</translation> <translation id="3477772589943384839">තරමක් මතකය සුරැකීම් ලබා ගන්න. දිගු කාල සීමාවකට පසු ඔබේ පටිති අකර්මණ්ය වෙයි.</translation> <translation id="347785443197175480"><ph name="HOST" /> හට ඔබේ කැමරාවට සහ මයික්රෆෝනයට පිවිසීමට අඛණ්ඩව ඉඩ දෙන්න</translation> @@ -5485,7 +5483,6 @@ <translation id="4779766576531456629">eSIM සෙලියුලර් ජාලය යළි නම් කරන්න</translation> <translation id="4780321648949301421">පිටුව මෙලෙස සුරකින්න...</translation> <translation id="4780558987886269159">කාර්යාලය සඳහා</translation> -<translation id="4781633367688946589">නව සැසියට ඉදිරියට යන්න</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> හට ඔබේ ඩිජිටල් මුදල් පසුම්බියේ පුද්ගලික තතු භාවිතා කිරීමට අවශ්ය වේ.</translation> <translation id="4785719467058219317">ඔබ මෙම වෙබ් අඩවිය සමඟ ලියාපදිංචි නොකළ ආරක්ෂක යතුරක් භාවිත කරයි</translation> <translation id="4785914069240823137">කප්පාදු කිරීම අවලංගු කරන්න</translation> @@ -6273,6 +6270,7 @@ <translation id="5337926771328966926">වත්මන් උපාංග නම වන්නේ <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">ඔබට අප්රසිද්ධ කවුළුවක් භාවිතයෙන් රහසිගතව බ්රවුස් කළ හැකිය</translation> <translation id="5338503421962489998">ප්රාදේශීය ගබඩාව</translation> +<translation id="5340620183031438925">පිටුව හැර යාමෙන් තොරව ඔබේ පටිත්ත ගැන AI මාදිලියෙන් ඇසීමට, ඒ ඔබ බව සත්යාපනය කරන්න. ඔබේ සියලු උපාංගවල ඔබේ මුරපද සහ තවත් දේ ඔබට ලැබෙනු ඇත.</translation> <translation id="5340787663756381836">&සොයා ගන්න සහ සංස්කරණය කරන්න</translation> <translation id="5340900621595888432">නිර්ණය කිරීම් සහ භාවිත දත්ත යවන්න</translation> <translation id="5341793073192892252">පහත කුකීස් අවහිර කරන ලදී (තෙවැනි පාර්ශ්ව කුකීස් ව්යතිරේකයක් නොමැතිවම අවහිර වේ)</translation> @@ -7460,7 +7458,6 @@ <translation id="6180550893222597997"><ph name="APP_NAME" /> සඳහා ඔබට භාවිතා කිරීමට අවශ්ය කුමන මුරයතුර ද?</translation> <translation id="6181218116951226898">යෙදුම් සමහර විට ඒවායේ සන්නම්කරණය යාවත්කාලීන කරයි. යාවත්කාලීන කිරීමට පෙර ඔබ ඒවා සමග සැපපහසු දැයි සහතික කර ගැනීම සඳහා සියලු වෙනස්කම් සමාලෝචනය කරන්න.</translation> <translation id="6181431612547969857">බාගැනීම අවහිර කරන ලදි</translation> -<translation id="6182100780603067202">යෙදුම් ශ්රව්ය ද බෙදා ගන්න (එහි සියලු කවුළු වලින්)</translation> <translation id="6183369864942961155">ස්වයංක්රීය ආලෝක/අඳුරු තේමාව</translation> <translation id="6183773856988300112">Chrome හි Gemini ඔබේ පටිතිවල වැඩ කිරීමට සහ ඔබ එයට දෙන කාර්යයන් සම්පූර්ණ කිරීමට ස්වයං බ්රවුස් භාවිත කරයි. <ph name="LINK_BEGIN" />තව දැන ගන්න<ph name="LINK_END" /></translation> <translation id="6184099524311454384">ටැබ සොයන්න</translation> @@ -8253,7 +8250,6 @@ <translation id="6754359471209693699">නව සෙවීම ආරම්භ කරන්න</translation> <translation id="6754918760968695779">ඉක්මන් ඇතුළත් කිරීම</translation> <translation id="6755702685749429945">ශබ්දකෝෂය එක් කරන්න</translation> -<translation id="6756157672127672536">ගොනු යෙදුම, Google Drive, බාහිර ගබඩාව හෝ ඔබගේ ChromeOS උපාංගයෙහි ඔබ සුරැක ඇති ගොනු වෙත ඉක්මන් ප්රවේශය සපයයි.</translation> <translation id="6756643207511618722">කථන එන්ජින්</translation> <translation id="6757431299485455321">මෙම හොට්ස්පොට් සොයා ගැනීමට වෙනත් උපාංගවලට උදවු කරන්න.</translation> <translation id="6758056191028427665">අපි සිදු කරන්නේ කෙසේදැයි අපට දන්වන්න.</translation> @@ -9199,6 +9195,7 @@ <translation id="7406912950279255498">වර්ණ අපවර්තන ප්රකාරය</translation> <translation id="7407430846095439694">ආයාත කිරීම සහ බැදීම</translation> <translation id="7407504355934009739">බොහෝ අය මෙම වෙබ් අඩවියෙන් එන දැනුම් දීම් අවහිර කරති</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> හට සංවේදී දත්ත ඇත. ඔබේ සංවිධානය ඔබට එය ක්ලවුඩ් ආචයනයට සුරැකීමට හෝ එය ඉවත දැමීමට ඉඩ දෙනු ඇත</translation> <translation id="7408080603962564527">මෙය අන් අයට දෘශ්යමාන වනු ඇත</translation> <translation id="740810853557944681">මුද්රණ සේවාදායකයක් එක් කරන්න</translation> <translation id="7409549334477097887">ඉතා විශාල</translation> @@ -9252,6 +9249,7 @@ <translation id="7434969625063495310">මුද්රණ සේවාදායකය එක් කළ නොහැකි විය. සේවාදායකයේ වින්යාසය පරීක්ෂා කර නැවත උත්සාහ කරන්න.</translation> <translation id="7436921188514130341">අනේ, අපොයි! යළි නම් කිරීමේ දී ගැටලුවක් ඇති විය.</translation> <translation id="7439519621174723623">ඉදිරියට යාමට උපාංග නමක් එක් කරන්න</translation> +<translation id="743982235360757672">ඔබ බ්රවුස් කරන අතරේ AI මාදිලිය ළඟ තබා ගන්න</translation> <translation id="7441736532026945583">ඔබේ පටිති තීරුවෙන් සමූහය ඉවත් කිරීමට "සමූහය සඟවන්න" තෝරන්න</translation> <translation id="7441736921018636843">මෙම සැකසීම වෙනස් කිරීමට, ඔබේ සමුමුහුර්ත මුර-වැකිකඩ ඉවත් කිරීමට <ph name="BEGIN_LINK" />සමමුහුර්තය යළි සකසන්න<ph name="END_LINK" /></translation> <translation id="7441830548568730290">වෙනත් පරිශීලකයන්</translation> @@ -9990,7 +9988,6 @@ <translation id="794676567536738329">අවසරයන් තහවුරු කරන්න</translation> <translation id="7947962633355574091">වීඩියෝ ලිපිනය පිටපත් කරන්න</translation> <translation id="7947964080535614577">අඩවි සාමාන්යයෙන් වෙළඳ දැන්වීම් පෙන්වන බැවින් ඒවාට ගාස්තු රහිත අන්තර්ගතය හෝ සේවා සැපයිය හැකිය. නමුත්, සමහර අඩවි ආක්රමණශීලී හෝ නොමඟ යවන වෙළඳ දැන්වීම් සඳහා ප්රසිද්ධය.</translation> -<translation id="7948239795436419268">කවුළු ප්රතිසාධනය නොකරන්න</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" /> හි සියලු පිටු</translation> <translation id="7950629216186736592">හේතුව: LBS http://, https:// සහ file:// URL සඳහා පමණක් සහාය දක්වයි.</translation> <translation id="7950814699499457511">සක්රීය • මෙම දිගුව මෙය දත්ත රැස් කර භාවිත කරන ආකාරය වැනි පෞද්ගලිකත්ව පුරුදු ප්රකාශන කර නැත.</translation> @@ -11179,7 +11176,6 @@ <translation id="8751034568832412184">පාසල</translation> <translation id="8751329102746373229">ඔබේ පරිපාලක වෙතින්</translation> <translation id="8752451679755290210">අයිතම අතර ස්වයංක්රියව ගමන් කරන්න</translation> -<translation id="8753948258138515839">ගොනු යෙදුම, Google Drive, බාහිර ගබඩාව හෝ ඔබගේ ChromeOS Flex උපාංගයෙහි ඔබ සුරැක ඇති ගොනු වෙත ඉක්මන් ප්රවේශය සපයයි.</translation> <translation id="8754200782896249056"><p>සහාය දක්වන වැඩතල පරිසරයක් යටතේ <ph name="PRODUCT_NAME" /> ධාවන වන විට, පද්ධති ප්රොක්සි සැකසුම් භාවිතා කරනු ඇත. කෙසේ වුවත්, එක්කෝ ඔබගේ පද්ධතිය සහාය නොදක්වයි නැතහොත් ඔබගේ පද්ධති වින්යාසය දියත් කිරීමේ ගැටලුවක් විය.</p> <p>නමුත් තවමත් ඔබට විධාන පේළිය හරහා වින්යාස කළ හැක. කරුණාකර සලකුණු සහ පරිසර විචල්යවල වැඩිදුර තොරතුරු සඳහා <code>man <ph name="PRODUCT_BINARY_NAME" /></code> බලන්න.</p></translation> @@ -11973,6 +11969,7 @@ <translation id="992778845837390402">ලිනක්ස් උපස්ථය සිදු වෙමින් පවතියි</translation> <translation id="994087375490600917">පැති පැනල</translation> <translation id="994289308992179865">නැවත නැවතත් වාදනය</translation> +<translation id="995420352808264005">උපාංග ලියාපදිංචි කිරීමේ වර්ගය තෝරා ගන්න</translation> <translation id="995755448277384931">IBAN එක් කරන්න</translation> <translation id="996250603853062861">ආරක්ෂිත සබඳතාවක් ස්ථාපිත කරමින්...</translation> <translation id="997143476478634194">ඔබ මෙම අඩවිවලට පිවිසෙන විට ඒවා ස්වයංක්රීයව මෙම සැකසීම අනුගමනය කරයි. ඔබට උණුසුම් පුවත් හෝ කතාබස් පණිවිඩ ගැන දැන්වීමට අඩවි සාමාන්යයෙන් දැනුම්දීම් එවයි.</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index 0d780f2..af1a6c5e 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Súbory s anotáciami hlavného uzla sa nedajú stiahnuť. Skúste to neskôr.</translation> <translation id="1103523840287552314">Vždy preložiť nasledujúci jazyk: <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Okamžite stratíte prístup k tejto skupine kariet, ktorá bude odstránená zo všetkých vašich zariadení</translation> +<translation id="1105934302947321130">Google Beam so službou Zoom</translation> <translation id="1106270460549661906">Zrušiť zdieľanie s Gemini</translation> <translation id="1106350001632362876">Zvýšiť prah</translation> <translation id="110850812463801904">Pripojiť sa k službe OneDrive manuálne</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Váš bezpečnostný kľúč nie je chránený kódom PIN. Ak chcete spravovať prihlasovacie údaje, najprv vytvorte PIN.</translation> <translation id="1179400851034021914">Číslo IBAN je neplatné</translation> <translation id="1179902906564467236">Postupujte podľa pokynov v telefóne alebo použite aplikáciu Fotoaparát</translation> -<translation id="1180117276105724040">Obnovujú sa okná z predchádzajúcej relácie…</translation> <translation id="118057123461613219">Obrovské úspory</translation> <translation id="1181037720776840403">Odstrániť</translation> <translation id="1182876754474670069">home (na začiatok)</translation> @@ -763,7 +763,6 @@ <translation id="151501797353681931">Importované zo Safari</translation> <translation id="1515163294334130951">Spustiť</translation> <translation id="1517467582299994451">Ak chcete prenášať prostredníctvom kódu, zapnite nastavenia synchronizácie prehliadača Chrome</translation> -<translation id="1519090060276706457">Obnova okien trvá dlhšie, ako sa očakávalo</translation> <translation id="1521442365706402292">Spravovať certifikáty</translation> <translation id="1521655867290435174">Tabuľky Google</translation> <translation id="1521774566618522728">Aktívne dnes</translation> @@ -1104,6 +1103,7 @@ <translation id="1745732479023874451">Spravovať kontakty</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}few{Chcete otvoriť a upraviť # súbory v tejto webovej aplikácii?}many{Open and edit # files in this web app?}other{Chcete otvoriť a upraviť # súborov v tejto webovej aplikácii?}}</translation> <translation id="1748563609363301860">Toto heslo môžete uložiť vo svojom účte Google alebo iba v tomto zariadení</translation> +<translation id="1749645492410897998">Inštalácia softvéru</translation> <translation id="1749733017156547309">Heslo je povinné</translation> <translation id="1750172676754093297">Váš bezpečnostný kľúč nedokáže ukladať odtlačky prstov</translation> <translation id="1750238553597293878">Naďalej používajte heslá vo svojom účte Google</translation> @@ -1175,7 +1175,6 @@ <translation id="1796460466266263589">Ak chcete pokračovať v používaní Gemini, overte svoju totožnosť</translation> <translation id="1796588414813960292">Funkcie vyžadujúce zvuk nebudú podporované</translation> <translation id="1798726622311813209">Kreditné a debetné karty</translation> -<translation id="1799852120691957794">Okná z predchádzajúcej relácie sa nedajú obnoviť</translation> <translation id="180203835522132923">Tlačidlo vyhľadávania + O, potom W</translation> <translation id="1802624026913571222">Po zavretí krytu prejsť do režimu spánku</translation> <translation id="1802687198411089702">Stránka nereaguje. Môžete na ňu počkať alebo rozhranie ukončiť.</translation> @@ -2368,7 +2367,6 @@ <translation id="2610374175948698697">Môžu zobrazovať súbory alebo priečinky vo vašom zariadení</translation> <translation id="2610780100389066815">Podpisovanie zoznamu dôveryhodných inštitúcií spoločnosti Microsoft</translation> <translation id="261114180663074524">Prihláste sa do účtu Microsoft a skúste to znova</translation> -<translation id="2611702650078660078">Vyskytla sa chyba</translation> <translation id="2611776654555141051">Nástroj na kreslenie obdĺžnikov</translation> <translation id="2611885296070244383">Mikrofón (interný)</translation> <translation id="2612676031748830579">Číslo karty</translation> @@ -2732,7 +2730,6 @@ <translation id="285033512555869047">Zavretá</translation> <translation id="2850541429955027218">Pridať motív</translation> <translation id="2851291081585704741">Ste offline</translation> -<translation id="2852045827873867442">Vyžaduje sa internetové pripojenie.</translation> <translation id="285237063405807022">(načítava sa)</translation> <translation id="2853121255651601031">Heslo bolo uložené</translation> <translation id="2854453262159518435">Nahradiť existujúcu skupinu kariet</translation> @@ -3599,6 +3596,7 @@ <translation id="3473241910002674503">Pomocou tlačidiel v režime tabletu môžete prejsť na plochu, späť a prepínať aplikácie.</translation> <translation id="3473479545200714844">Lupa</translation> <translation id="3474218480460386727">V prípade nových slov použite maximálne 99 písmen</translation> +<translation id="3474330892505468100">Google Beam so službou Meet</translation> <translation id="3474624961160222204">Pokračovať ako <ph name="NAME" /></translation> <translation id="3477772589943384839">Získate priemernú úsporu pamäte. Karty sa po dlhšom čase deaktivujú.</translation> <translation id="347785443197175480">Aj naďalej povoliť stránkam <ph name="HOST" /> prístup ku kamere a mikrofónu</translation> @@ -5487,7 +5485,6 @@ <translation id="4779766576531456629">Premenovať mobilnú sieť eSIM</translation> <translation id="4780321648949301421">Uložiť stránku ako...</translation> <translation id="4780558987886269159">Na prácu</translation> -<translation id="4781633367688946589">Pokračovať v novej relácii</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> chce používať osobné údaje z vašej digitálnej peňaženky.</translation> <translation id="4785719467058219317">Používate bezpečnostný kľúč, ktorý nie je registrovaný s týmto webom</translation> <translation id="4785914069240823137">Zrušiť orezanie</translation> @@ -6274,6 +6271,7 @@ <translation id="5337926771328966926">Aktuálny názov zariadenia: <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Prehliadať v súkromí môžete v okne inkognito</translation> <translation id="5338503421962489998">Miestny ukladací priestor</translation> +<translation id="5340620183031438925">Ak sa chcete režimu AI spýtať na svoju kartu bez opustenia stránky, absolvujte overenie totožnosti. Navyše budete mať k dispozícii heslá a ďalší obsah vo všetkých svojich zariadeniach.</translation> <translation id="5340787663756381836">&Nájsť a upraviť</translation> <translation id="5340900621595888432">Odosielať diagnostiku a údaje o využití</translation> <translation id="5341793073192892252">Nasledujúce súbory cookie boli zablokované (súbory cookie tretej strany sú blokované bez výnimky):</translation> @@ -7460,7 +7458,6 @@ <translation id="6180550893222597997">Ktorý prístupový kľúč chcete používať pre aplikáciu <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Aplikácie niekedy aktualizujú svoju prezentáciu značky. Pred aktualizáciou skontrolujte všetky zmeny a uistite sa, že vám vyhovujú.</translation> <translation id="6181431612547969857">Stiahnutie bolo zablokované</translation> -<translation id="6182100780603067202">Zdieľať aj zvuk aplikácie (zo všetkých jej okien)</translation> <translation id="6183369864942961155">Automatický svetlý alebo tmavý motív</translation> <translation id="6183773856988300112">Gemini v Chrome používa automatické prehliadanie, aby mohol pracovať vo vašich kartách a dokončovať úlohy, ktoré mu zadáte. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Vyhľadajte karty</translation> @@ -8257,7 +8254,6 @@ <translation id="6754359471209693699">Spustenie nového vyhľadávania</translation> <translation id="6754918760968695779">Rýchlo vložiť</translation> <translation id="6755702685749429945">Pridať slovník</translation> -<translation id="6756157672127672536">Aplikácia Súbory poskytuje rýchly prístup k súborom, ktoré ste uložili na Disk Google, do externého úložiska alebo zariadenia so systémom Chrome OS.</translation> <translation id="6756643207511618722">Hlasové nástroje</translation> <translation id="6757431299485455321">Umožnite ostatným zariadeniam nájsť tento hotspot.</translation> <translation id="6758056191028427665">Dajte nám tak vedieť, ako sa nám darí v našom úsilí.</translation> @@ -9204,6 +9200,7 @@ <translation id="7406912950279255498">Režim inverzie farieb</translation> <translation id="7407430846095439694">Importovať a spojiť</translation> <translation id="7407504355934009739">Väčšina ľudí blokuje upozornenia z tohto webu</translation> +<translation id="7407578029724074226">Súbor <ph name="FILE_NAME" /> obsahuje citlivé údaje. Vaša organizácia vám umožní uložiť ho do cloudového priestoru alebo zahodiť.</translation> <translation id="7408080603962564527">Uvidia ho ostatní</translation> <translation id="740810853557944681">Pridanie tlačového servera</translation> <translation id="7409549334477097887">Veľmi veľký</translation> @@ -9256,6 +9253,7 @@ <translation id="7434969625063495310">Tlačový server sa nepodarilo pridať. Skontrolujte jeho konfiguráciu a skúste to znova.</translation> <translation id="7436921188514130341">Ojoj! Pri premenovaní sa vyskytla chyba.</translation> <translation id="7439519621174723623">Ak chcete pokračovať, pridajte názov zariadenia</translation> +<translation id="743982235360757672">Majte pri prehliadaní poruke režim AI</translation> <translation id="7441736532026945583">Ak chcete skupinu odstrániť z panela kariet, vyberte Skryť skupinu</translation> <translation id="7441736921018636843">Ak chcete zmeniť toto nastavenie, <ph name="BEGIN_LINK" />resetujte synchronizáciu<ph name="END_LINK" /> a odstráňte tak prístupovú frázu synchronizácie</translation> <translation id="7441830548568730290">Ostatní používatelia</translation> @@ -9994,7 +9992,6 @@ <translation id="794676567536738329">Potvrdiť povolenia</translation> <translation id="7947962633355574091">K&opírovať adresu videa</translation> <translation id="7947964080535614577">Weby zvyčajne zobrazujú reklamy, aby mohli poskytovať obsah či služby bez peňažného poplatku. Niektoré weby sú však známe tým, že zobrazujú obťažujúce alebo zavádzajúce reklamy.</translation> -<translation id="7948239795436419268">Neobnovovať okná</translation> <translation id="7948407723851303488">Všetky stránky domény <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Dôvod: PSP podporuje iba webové adresy http://, https:// a file://.</translation> <translation id="7950814699499457511">Zapnuté • Toto rozšírenie nemá zverejnené spôsoby ochrany súkromia, napríklad to, ako zhromažďuje a používa údaje.</translation> @@ -11183,7 +11180,6 @@ <translation id="8751034568832412184">Školský</translation> <translation id="8751329102746373229">Od vášho správcu</translation> <translation id="8752451679755290210">Prechádzajte medzi položkami automaticky</translation> -<translation id="8753948258138515839">Aplikácia Súbory poskytuje rýchly prístup k súborom, ktoré ste uložili na Disk Google, do externého úložiska alebo zariadenia so systémom Chrome OS Flex.</translation> <translation id="8754200782896249056"><p>Pri spustení aplikácie <ph name="PRODUCT_NAME" /> v podporovanom prostredí počítača sa použijú systémové nastavenia servera proxy. Váš systém však nie je podporovaný alebo sa pri spúšťaní konfigurácie vášho systému vyskytol problém.</p> <p>Stále však môžete nastavenia nakonfigurovať pomocou príkazového riadka. Ďalšie informácie o príznakoch a premenných prostredia nájdete v príručke <code>man <ph name="PRODUCT_BINARY_NAME" /></code>.</p></translation> @@ -11978,6 +11974,7 @@ <translation id="992778845837390402">Prebieha zálohovanie systému Linux</translation> <translation id="994087375490600917">Bočné panely</translation> <translation id="994289308992179865">Opa&kovať</translation> +<translation id="995420352808264005">Vyberte typ registrácie zariadenia</translation> <translation id="995755448277384931">Pridanie čísla IBAN</translation> <translation id="996250603853062861">Prebieha nadväzovanie zabezpečeného spojenia...</translation> <translation id="997143476478634194">Weby sa automaticky riadia týmto nastavením, keď ich navštívite. Zvyčajne odosielajú upozornenia, aby vás informovali o mimoriadnych alebo četových správach.</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index e76350b0..1401796 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Datotek z obvestili glavnega vozlišča ni mogoče prenesti. Poskusite pozneje.</translation> <translation id="1103523840287552314">Vedno prevedi ta jezik: <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Takoj boste izgubili dostop do te skupine zavihkov in izbrisana bo iz vseh vaših naprav</translation> +<translation id="1105934302947321130">Google Beam z Zoomom</translation> <translation id="1106270460549661906">Preklic deljenja z Geminijem</translation> <translation id="1106350001632362876">Povečaj prag</translation> <translation id="110850812463801904">Ročna povezava s storitvijo OneDrive</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Vaš varnostni ključ ni zaščiten s kodo PIN. Če želite upravljati podatke za prijavo, naprej ustvarite kodo PIN.</translation> <translation id="1179400851034021914">Številka IBAN ni veljavna</translation> <translation id="1179902906564467236">Upoštevajte navodila v telefonu ali uporabite aplikacijo Fotoaparat</translation> -<translation id="1180117276105724040">Obnavljanje oken iz prejšnje seje …</translation> <translation id="118057123461613219">Ogromni prihranki</translation> <translation id="1181037720776840403">Odstrani</translation> <translation id="1182876754474670069">tipka home</translation> @@ -765,7 +765,6 @@ <translation id="151501797353681931">Uvoženo iz Safarija</translation> <translation id="1515163294334130951">Zagon</translation> <translation id="1517467582299994451">Če želite predvajati s kodo, vklopite nastavitve sinhronizacije v brskalniku Chrome.</translation> -<translation id="1519090060276706457">Obnovitev oken traja dlje, kot je pričakovano</translation> <translation id="1521442365706402292">Upravljanje certifikatov</translation> <translation id="1521655867290435174">Google Preglednice</translation> <translation id="1521774566618522728">Aktivno danes</translation> @@ -1114,6 +1113,7 @@ <translation id="1745732479023874451">Upravljanje stikov</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}one{Želite odpreti in urediti # datoteko v tej spletni aplikaciji?}two{Želite odpreti in urediti # datoteki v tej spletni aplikaciji?}few{Želite odpreti in urediti # datoteke v tej spletni aplikaciji?}other{Želite odpreti in urediti # datotek v tej spletni aplikaciji?}}</translation> <translation id="1748563609363301860">To geslo lahko shranite v računu Google ali samo v tej napravi</translation> +<translation id="1749645492410897998">Nameščanje programske opreme</translation> <translation id="1749733017156547309">Vnesti morate geslo.</translation> <translation id="1750172676754093297">Vaš varnostni ključ ne more shranjevati prstnih odtisov</translation> <translation id="1750238553597293878">Še naprej uporabljajte gesla v računu Google</translation> @@ -1185,7 +1185,6 @@ <translation id="1796460466266263589">Potrdite, da ste to vi, če želite še naprej uporabljati Geminija</translation> <translation id="1796588414813960292">Funkcije, ki potrebujejo zvok, ne bodo delovale.</translation> <translation id="1798726622311813209">Kreditne in debetne kartice</translation> -<translation id="1799852120691957794">Oken iz prejšnje seje ni mogoče obnoviti</translation> <translation id="180203835522132923">Tipka za iskanje + O, nato W</translation> <translation id="1802624026913571222">Preklop v stanje pripravljenosti, ko je pokrov zaprt</translation> <translation id="1802687198411089702">Ta spletna stran se ne odziva. Lahko počakate ali jo zaprete.</translation> @@ -2381,7 +2380,6 @@ <translation id="2610374175948698697">Omogočen je ogled datotek ali map v napravi</translation> <translation id="2610780100389066815">Podpisovanje Microsoftovega seznama zaupanja</translation> <translation id="261114180663074524">Prijavite se v račun Microsoft in poskusite znova</translation> -<translation id="2611702650078660078">Prišlo je do napake</translation> <translation id="2611776654555141051">Orodje za pravokotnike</translation> <translation id="2611885296070244383">Mikrofon (notranji)</translation> <translation id="2612676031748830579">Številka kartice</translation> @@ -2745,7 +2743,6 @@ <translation id="285033512555869047">Zaprto</translation> <translation id="2850541429955027218">Dodaj temo</translation> <translation id="2851291081585704741">Nimate vzpostavljene povezave</translation> -<translation id="2852045827873867442">Potrebna je internetna povezava.</translation> <translation id="285237063405807022">(nalaganje)</translation> <translation id="2853121255651601031">Geslo je shranjeno</translation> <translation id="2854453262159518435">Zamenjava obstoječe skupine zavihkov</translation> @@ -3612,6 +3609,7 @@ <translation id="3473241910002674503">Premikanje na začetni zaslon in nazaj ter preklop med aplikacijami z gumbi v načinu tabličnega računalnika.</translation> <translation id="3473479545200714844">Lupa</translation> <translation id="3474218480460386727">Za nove besede uporabite 99 črk ali manj</translation> +<translation id="3474330892505468100">Google Beam z Meetom</translation> <translation id="3474624961160222204">Nadaljuj kot <ph name="NAME" /></translation> <translation id="3477772589943384839">Zmerni prihranki količine uporabljenega pomnilnika. Zavihki po daljšem časovnem obdobju postanejo neaktivni.</translation> <translation id="347785443197175480">Še naprej omogočaj gostitelju <ph name="HOST" /> dostop do kamere in mikrofona</translation> @@ -5500,7 +5498,6 @@ <translation id="4779766576531456629">Preimenovanje mobilnega omrežja eSIM</translation> <translation id="4780321648949301421">Shrani stran &kot ...</translation> <translation id="4780558987886269159">Za delo</translation> -<translation id="4781633367688946589">Nadaljuj v novi seji</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> želi uporabiti osebne podatke iz vaše digitalne denarnice.</translation> <translation id="4785719467058219317">Varnostni ključ, ki ga uporabljate, ni registriran na tem spletnem mestu</translation> <translation id="4785914069240823137">Prekliči obrezovanje</translation> @@ -6289,6 +6286,7 @@ <translation id="5337926771328966926">Trenutno ime naprave je <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Z anonimnim oknom lahko zasebno brskate.</translation> <translation id="5338503421962489998">Lokalna shramba</translation> +<translation id="5340620183031438925">Če želite v načinu umetne inteligence postaviti vprašanje o zavihku, ne da bi zapustili stran, preverite svojo identiteto. V vseh svojih napravah boste imeli na voljo tudi gesla in drugo.</translation> <translation id="5340787663756381836">&Iskanje in urejanje</translation> <translation id="5340900621595888432">Pošiljanje diagnostičnih podatkov in podatkov o uporabi</translation> <translation id="5341793073192892252">Ti piškotki so bili blokirani (piškotki tretjih oseb se blokirajo brez izjeme)</translation> @@ -7476,7 +7474,6 @@ <translation id="6180550893222597997">Kateri ključ za dostop želite uporabiti za aplikacijo <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Aplikacije včasih posodobijo blagovne znamke. Preglejte vse spremembe in se prepričajte, da se vam zdijo primerne, preden posodobite.</translation> <translation id="6181431612547969857">Prenos je bil blokiran</translation> -<translation id="6182100780603067202">Deli tudi zvok aplikacije (iz vseh njenih oken)</translation> <translation id="6183369864942961155">Samodejna svetla/temna tema</translation> <translation id="6183773856988300112">Gemini v Chromu uporablja samodejno brskanje za delo na vaših zavihkih in dokončanje opravil, ki mu jih dodelite. <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Iskanje zavihkov</translation> @@ -8275,7 +8272,6 @@ <translation id="6754359471209693699">Začni novo iskanje</translation> <translation id="6754918760968695779">Hitro vstavljanje</translation> <translation id="6755702685749429945">Dodaj slovar</translation> -<translation id="6756157672127672536">Aplikacija Datoteke omogoča hiter dostop do datotek, ki ste jih shranili v Googlu Drive, v zunanji shrambi ali v napravi s sistemom Chrome OS.</translation> <translation id="6756643207511618722">Mehanizmi za govor</translation> <translation id="6757431299485455321">Drugim napravam pomagajte najti to dostopno točko.</translation> <translation id="6758056191028427665">Sporočite nam, kako ste zadovoljni z nami.</translation> @@ -9222,6 +9218,7 @@ <translation id="7406912950279255498">Način inverzije barv</translation> <translation id="7407430846095439694">Uvozi in poveži</translation> <translation id="7407504355934009739">Večina ljudi blokira obvestila s tega spletnega mesta</translation> +<translation id="7407578029724074226">V datoteki <ph name="FILE_NAME" /> so občutljivi podatki. Vaša organizacija vam bo omogočila, da jih shranite v shrambo v oblaku ali zavržete.</translation> <translation id="7408080603962564527">To bo vidno drugim.</translation> <translation id="740810853557944681">Dodajanje tiskalnega strežnika</translation> <translation id="7409549334477097887">Zelo veliko</translation> @@ -9275,6 +9272,7 @@ <translation id="7434969625063495310">Tiskalnega strežnika ni bilo mogoče dodati. Preverite konfiguracijo strežnika in poskusite znova.</translation> <translation id="7436921188514130341">Ti šment! Napaka med preimenovanjem.</translation> <translation id="7439519621174723623">Dodajte ime naprave, če želite nadaljevati.</translation> +<translation id="743982235360757672">Med brskanjem imejte način umetne inteligence pri roki</translation> <translation id="7441736532026945583">Če želite skupino odstraniti s traku z zavihki, izberite možnost »Skrij skupino«</translation> <translation id="7441736921018636843">Če želite spremeniti to nastavitev, <ph name="BEGIN_LINK" />ponastavite sinhronizacijo<ph name="END_LINK" />, da odstranite geslo za sinhronizacijo</translation> <translation id="7441830548568730290">Drugi uporabniki</translation> @@ -10013,7 +10011,6 @@ <translation id="794676567536738329">Potrditev dovoljenj</translation> <translation id="7947962633355574091">Kopiraj naslov videoposnetka</translation> <translation id="7947964080535614577">Spletna mesta običajno prikazujejo oglase zato, da vam lahko zagotovijo vsebino ali storitve brez stroškov. Vseeno pa so nekatera spletna mesta znana po tem, da prikazujejo vsiljive ali zavajajoče oglase.</translation> -<translation id="7948239795436419268">Ne obnovi oken</translation> <translation id="7948407723851303488">Vse strani domene <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Razlog: LBS podpira samo URL-je s protokoli http://, https:// in file://.</translation> <translation id="7950814699499457511">Izklopljeno • Ta razširitev še ni objavila postopkov zagotavljanja zasebnosti, na primer kako zbira in uporablja podatke</translation> @@ -11202,7 +11199,6 @@ <translation id="8751034568832412184">Šola</translation> <translation id="8751329102746373229">Od skrbnika</translation> <translation id="8752451679755290210">Samodejno premikanje med elementi</translation> -<translation id="8753948258138515839">Aplikacija Datoteke omogoča hiter dostop do datotek, ki ste jih shranili v Googlu Drive, v zunanji shrambi ali v napravi ChromeOS Flex.</translation> <translation id="8754200782896249056"><p>Ko se <ph name="PRODUCT_NAME" /> izvaja v podprtem namiznem okolju, se uporabijo sistemske nastavitve strežnika proxy. Morda vaš sistem ni podprt ali pa je med zagonom sistemske konfiguracije prišlo do težave.</p> <p>Kljub temu ga lahko nastavite z ukazno vrstico. Glejte <code>man <ph name="PRODUCT_BINARY_NAME" /></code> za več informacij o zastavicah in spremenljivkah okolja.</p></translation> @@ -11998,6 +11994,7 @@ <translation id="992778845837390402">Trenutno poteka varnostno kopiranje vsebnika za Linux</translation> <translation id="994087375490600917">Stranska podokna</translation> <translation id="994289308992179865">Ponav&ljaj</translation> +<translation id="995420352808264005">Izbira vrste včlanitve naprave</translation> <translation id="995755448277384931">Dodajanje IBAN-a</translation> <translation id="996250603853062861">Vzpostavljanje varne povezave ...</translation> <translation id="997143476478634194">Spletna mesta ob vašem obisku samodejno upoštevajo to nastavitev. Spletna mesta običajno pošiljajo obvestila, da vas obvestijo glede zadnjih novic ali sporočil v klepetih.</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index 209444ca..1e9c9528 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Skedarët e shënimeve të nyjës kryesore nuk mund të shkarkohen. Provo përsëri më vonë.</translation> <translation id="1103523840287552314">Përkthe gjithmonë nga <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Do të humbasësh menjëherë qasjen në ky grup skedash dhe ai do të fshihet nga të gjitha pajisjet e tua</translation> +<translation id="1105934302947321130">Google Beam me Zoom</translation> <translation id="1106270460549661906">Anulo ndarjen me Gemini</translation> <translation id="1106350001632362876">Rrit pragun</translation> <translation id="110850812463801904">Lidhe manualisht me OneDrive</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Çelësi yt i sigurisë nuk është i mbrojtur me një kod PIN. Për të menaxhuar të dhënat e identifikimit, në fillim krijo një kod PIN.</translation> <translation id="1179400851034021914">IBAN është i pavlefshëm</translation> <translation id="1179902906564467236">Ndiq udhëzimet në telefon ose përdor aplikacionin e kamerës</translation> -<translation id="1180117276105724040">Po restaurohen dritaret nga seanca jote e mëparshme...</translation> <translation id="118057123461613219">Kursime shumë të mëdha</translation> <translation id="1181037720776840403">Hiq</translation> <translation id="1182876754474670069">tasti Home</translation> @@ -758,7 +758,6 @@ <translation id="151501797353681931">Importuar nga Safari</translation> <translation id="1515163294334130951">Hap</translation> <translation id="1517467582299994451">Për të transmetuar me një kod, aktivizo cilësimet e sinkronizimit të shfletuesit Chrome</translation> -<translation id="1519090060276706457">Restaurimi i dritareve po zgjat më shumë nga sa pritej</translation> <translation id="1521442365706402292">Menaxho certifikatat</translation> <translation id="1521655867290435174">Fletët e Google</translation> <translation id="1521774566618522728">Aktiv sot</translation> @@ -1099,6 +1098,7 @@ <translation id="1745732479023874451">Menaxho kontaktet</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{Të hapen dhe të modifikohen # skedarë në këtë aplikacion uebi?}}</translation> <translation id="1748563609363301860">Mund ta ruash këtë fjalëkalim në "Llogarinë tënde të Google" ose vetëm në këtë pajisje</translation> +<translation id="1749645492410897998">Po instalohet softueri</translation> <translation id="1749733017156547309">Kërkohet një fjalëkalim</translation> <translation id="1750172676754093297">Çelësi yt i sigurisë nuk mund t'i ruajë gjurmët e gishtave</translation> <translation id="1750238553597293878">Vazhdo të përdorësh fjalëkalimet në "Llogarinë tënde të Google"</translation> @@ -1170,7 +1170,6 @@ <translation id="1796460466266263589">Për të vazhduar të përdorësh Gemini, verifiko që je ti</translation> <translation id="1796588414813960292">Veçoritë që kanë nevojë për tingujt nuk do të funksionojnë</translation> <translation id="1798726622311813209">Kartat e kreditit dhe të debitit</translation> -<translation id="1799852120691957794">Dritaret nga seanca jote e mëparshme nuk mund të restaurohen</translation> <translation id="180203835522132923">Tasti "Search" + O, më pas W</translation> <translation id="1802624026913571222">Në gjumë kur mbyllet kapaku</translation> <translation id="1802687198411089702">Faqja nuk po përgjigjet. Mund të presësh ose mund të dalësh.</translation> @@ -2363,7 +2362,6 @@ <translation id="2610374175948698697">Mund të shikojnë skedarët ose dosjet në pajisjen tënde</translation> <translation id="2610780100389066815">Nënshkrimi i "Microsoft Trust List"</translation> <translation id="261114180663074524">Identifikohu në llogarinë tënde të Microsoft dhe më pas provo përsëri</translation> -<translation id="2611702650078660078">Ndodhi një gabim</translation> <translation id="2611776654555141051">Vegla e drejtkëndëshit</translation> <translation id="2611885296070244383">Mikrofon (i brenshëm)</translation> <translation id="2612676031748830579">Numri i kartës</translation> @@ -2727,7 +2725,6 @@ <translation id="285033512555869047">Mbyllur</translation> <translation id="2850541429955027218">Shto një temë</translation> <translation id="2851291081585704741">Je offline</translation> -<translation id="2852045827873867442">Kërkohet lidhja e internetit.</translation> <translation id="285237063405807022">(po ngarkohet)</translation> <translation id="2853121255651601031">Fjalëkalimi u ruajt</translation> <translation id="2854453262159518435">Zëvendëso grupin ekzistues të skedave</translation> @@ -3594,6 +3591,7 @@ <translation id="3473241910002674503">Navigo për në faqen kryesore, kthehu prapa dhe ndërro aplikacionet me butonat në modalitetin e tabletit.</translation> <translation id="3473479545200714844">Zmadhuesi i ekranit</translation> <translation id="3474218480460386727">Përdor 99 shkronja ose më pak për fjalët e reja</translation> +<translation id="3474330892505468100">Google Beam me Meet</translation> <translation id="3474624961160222204">Vazhdo si <ph name="NAME" /></translation> <translation id="3477772589943384839">Merr kursim mesatar të memories. Skedat e tua bëhen joaktive pas një periudhe më të gjatë kohore.</translation> <translation id="347785443197175480">Vazhdo të lejosh <ph name="HOST" /> që të qaset te kamera dhe mikrofoni</translation> @@ -5482,7 +5480,6 @@ <translation id="4779766576531456629">Riemërto rrjetin celular të eSIM</translation> <translation id="4780321648949301421">Ruaje faqen si...</translation> <translation id="4780558987886269159">Për punë</translation> -<translation id="4781633367688946589">Vazhdo te seanca e re</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> kërkon të përdorë informacionet e tua personale nga portofoli yt dixhital.</translation> <translation id="4785719467058219317">Po përdor një çelës sigurie që nuk është i regjistruar me këtë uebsajt</translation> <translation id="4785914069240823137">Anulo prerjen</translation> @@ -6269,6 +6266,7 @@ <translation id="5337926771328966926">Emri i pajisjes aktuale është <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Mund të shfletosh në mënyrë private duke përdorur një dritare "të fshehtë"</translation> <translation id="5338503421962489998">Hapësira ruajtëse lokale</translation> +<translation id="5340620183031438925">Për t'i kërkuar "Modalitetit të IA-së" për skedën tënde pa u larguar nga faqja, verifiko që je ti. Do të marrësh gjithashtu fjalëkalimet dhe më shumë në të gjitha pajisjet e tua.</translation> <translation id="5340787663756381836">&Gjej dhe modifiko</translation> <translation id="5340900621595888432">Dërgo të dhënat e përdorimit dhe të dhënat diagnostikuese</translation> <translation id="5341793073192892252">Kukit e mëposhtme u bllokuan (kukit e palëve të treta po bllokohen pa përjashtim)</translation> @@ -7455,7 +7453,6 @@ <translation id="6180550893222597997">Cilin çelës kalimi dëshiron të përdorësh për <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Ndonjëherë, aplikacionet e përditësojnë markën e tyre. Rishiko të gjitha ndryshimet për t'u siguruar që janë të duhurat përpara se t'i përditësosh.</translation> <translation id="6181431612547969857">Shkarkimi u bllokua</translation> -<translation id="6182100780603067202">Ndaj edhe audion e aplikacionit (nga të gjitha dritaret e tij)</translation> <translation id="6183369864942961155">Tema automatike e ndriçuar/errët</translation> <translation id="6183773856988300112">Gemini në Chrome përdor shfletimin automatik për të punuar në skedat e tua dhe për të përfunduar detyrat që ti i jep. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Kërko skedat</translation> @@ -8248,7 +8245,6 @@ <translation id="6754359471209693699">Fillo një kërkim të ri</translation> <translation id="6754918760968695779">Fut shpejt</translation> <translation id="6755702685749429945">Shto fjalorin</translation> -<translation id="6756157672127672536">Aplikacioni "Skedarët" siguron qasje të shpejtë te skedarët që ke ruajtur në "Diskun e Google", në hapësirën ruajtëse të jashtme ose në pajisjen tënde me ChromeOS.</translation> <translation id="6756643207511618722">Motorët e ligjërimit</translation> <translation id="6757431299485455321">Ndihmoji pajisjet e tjera të gjejnë këtë zonë të qasjes për internet.</translation> <translation id="6758056191028427665">Na trego se si po ecim.</translation> @@ -9194,6 +9190,7 @@ <translation id="7406912950279255498">Modaliteti i anasjelljes së ngjyrës</translation> <translation id="7407430846095439694">Importo dhe lidh</translation> <translation id="7407504355934009739">Shumica e personave i bllokojnë njoftimet nga ky sajt</translation> +<translation id="7407578029724074226">"<ph name="FILE_NAME" />" ka të dhëna delikate. Organizata jote do të të lejojë që ta ruash atë në hapësirën ruajtëse në renë kompjuterike ose ta heqësh atë</translation> <translation id="7408080603962564527">Kjo do të jetë e dukshme për të tjerët</translation> <translation id="740810853557944681">Shto një server printimi</translation> <translation id="7409549334477097887">Tepër i madh</translation> @@ -9247,6 +9244,7 @@ <translation id="7434969625063495310">Serveri i printimit nuk mund të shtohej. Kontrollo konfigurimin e serverit dhe provo përsëri.</translation> <translation id="7436921188514130341">Mos! Pati një gabim gjatë riemërtimit.</translation> <translation id="7439519621174723623">Shto një pajisje për të vazhduar</translation> +<translation id="743982235360757672">Mbaje "Modalitetin e IA-së" në afërsi ndërkohë që shfleton</translation> <translation id="7441736532026945583">Zgjidh "Fshih grupin" për ta hequr grupin nga shiriti i skedave</translation> <translation id="7441736921018636843">Për të ndryshuar këtë cilësim, <ph name="BEGIN_LINK" />rivendos sinkronizimin<ph name="END_LINK" /> për të hequr frazën e kalimit për sinkronizimin</translation> <translation id="7441830548568730290">Përdoruesit e tjerë</translation> @@ -9985,7 +9983,6 @@ <translation id="794676567536738329">Konfirmo lejet</translation> <translation id="7947962633355574091">K&opjo adresën e videos</translation> <translation id="7947964080535614577">Sajtet shfaqin zakonisht reklama që të mund të ofrojnë përmbajtje ose shërbime falas. Por disa sajte dihet se shfaqin reklama ndërhyrëse ose mashtruese.</translation> -<translation id="7948239795436419268">Mos i restauro dritaret</translation> <translation id="7948407723851303488">Të gjitha faqet e <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Arsyeja: LBS mbështet vetëm URL-të në formatin http://, https:// dhe file://.</translation> <translation id="7950814699499457511">Aktive • Kjo shtesë nuk i ka publikuar praktikat e privatësisë, si p.sh. se si i mbledh dhe i përdor të dhënat</translation> @@ -11174,7 +11171,6 @@ <translation id="8751034568832412184">Shkollë</translation> <translation id="8751329102746373229">Nga administratori yt</translation> <translation id="8752451679755290210">Kalo automatikisht mes artikujve</translation> -<translation id="8753948258138515839">Aplikacioni "Skedarët" siguron qasje të shpejtë te skedarët që ke ruajtur në "Diskun e Google", në hapësirën ruajtëse të jashtme ose në pajisjen tënde Chrome OS Flex.</translation> <translation id="8754200782896249056"><p>Kur <ph name="PRODUCT_NAME" /> ekzekutohet në një mjedis të mbështetur për desktop, do të përdoren cilësimet e përfaqësuesit të sistemit. Megjithatë, sistemi yt nuk mbështetet ose pati një problem në nisjen e konfigurimit të sistemit.</p> <p>Por, mund të vazhdosh konfigurimin përmes rreshtit të komandës. Shiko <code>man <ph name="PRODUCT_BINARY_NAME" /></code> për më shumë informacion rreth flamujve dhe ndryshoreve të mjedisit.</p></translation> @@ -11967,6 +11963,7 @@ <translation id="992778845837390402">Rezervimi i Linux aktualisht në vazhdim</translation> <translation id="994087375490600917">Panelet anësore</translation> <translation id="994289308992179865">&Pambarimisht</translation> +<translation id="995420352808264005">Zgjidh llojin e regjistrimit të pajisjes</translation> <translation id="995755448277384931">Shto numrin IBAN</translation> <translation id="996250603853062861">Po vendos një lidhje të sigurt...</translation> <translation id="997143476478634194">Sajtet e ndjekin automatikisht këtë cilësim kur i viziton ato. Sajtet zakonisht dërgojnë njoftime për të të njoftuar rreth lajmeve më të fundit ose mesazheve të bisedës.</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index dc9b574..80b1c8a 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Preuzimanje fajlova sa komentarima o glavnom čvoru nije uspelo. Probajte ponovo kasnije.</translation> <translation id="1103523840287552314">Uvek prevodi <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Odmah ćete izgubiti pristup ovoj grupi kartica i ona će biti izbrisana sa svih uređaja</translation> +<translation id="1105934302947321130">Google Beam sa Zoom-om</translation> <translation id="1106270460549661906">Opozovi deljenje sa Gemini-jem</translation> <translation id="1106350001632362876">Povećajte graničnu vrednost</translation> <translation id="110850812463801904">Ručno povežite sa OneDrive-om</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Bezbednosni ključ nije zaštićen PIN-om. Da biste upravljali podacima za prijavljivanje, prvo napravite PIN.</translation> <translation id="1179400851034021914">IBAN je nevažeći</translation> <translation id="1179902906564467236">Pratite uputstva na telefonu ili koristite aplikaciju kamere</translation> -<translation id="1180117276105724040">Vraćaju se prozori iz prethodne sesije…</translation> <translation id="118057123461613219">Ogromne uštede</translation> <translation id="1181037720776840403">Ukloni</translation> <translation id="1182876754474670069">home</translation> @@ -760,7 +760,6 @@ <translation id="151501797353681931">Uvoz iz pregledača Safari</translation> <translation id="1515163294334130951">Pokreni</translation> <translation id="1517467582299994451">Da biste prebacivali pomoću koda, uključite podešavanja sinhronizacije Chrome pregledača</translation> -<translation id="1519090060276706457">Vraćanje prozora traje duže nego što je očekivano</translation> <translation id="1521442365706402292">Upravljaj sertifikatima</translation> <translation id="1521655867290435174">Google tabele</translation> <translation id="1521774566618522728">Aktivan je danas</translation> @@ -1101,6 +1100,7 @@ <translation id="1745732479023874451">Upravljajte kontaktima</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}one{Želite da otvorite i izmenite # fajl u ovoj veb-aplikaciji?}few{Želite da otvorite i izmenite # fajla u ovoj veb-aplikaciji?}other{Želite da otvorite i izmenite # fajlova u ovoj veb-aplikaciji?}}</translation> <translation id="1748563609363301860">Možete da sačuvate ovu lozinku na Google nalogu ili samo na ovom uređaju</translation> +<translation id="1749645492410897998">Softver se instalira</translation> <translation id="1749733017156547309">Lozinka je obavezna</translation> <translation id="1750172676754093297">Bezbednosni ključ ne može da čuva otiske prstiju</translation> <translation id="1750238553597293878">Nastavite da koristite lozinke na Google nalogu</translation> @@ -1172,7 +1172,6 @@ <translation id="1796460466266263589">Da biste nastavili da koristite Gemini, potvrdite svoj identitet</translation> <translation id="1796588414813960292">Funkcije kojima treba zvuk neće raditi</translation> <translation id="1798726622311813209">Kreditne i debitne kartice</translation> -<translation id="1799852120691957794">Vraćanje prozora iz prethodne sesije nije uspelo</translation> <translation id="180203835522132923">Taster za pretragu + O, a zatim W</translation> <translation id="1802624026913571222">Pređi u stanje spavanja kada se poklopac zatvori</translation> <translation id="1802687198411089702">Stranica se ne odaziva. Možete da sačekate da počne da se odaziva ili da je zatvorite.</translation> @@ -2364,7 +2363,6 @@ <translation id="2610374175948698697">Fajlovi koji mogu da pregledaju fajlove ili foldere na uređaju</translation> <translation id="2610780100389066815">Potpisivanje Microsoft liste pouzdanih</translation> <translation id="261114180663074524">Prijavite se na Microsoft nalog i probajte ponovo</translation> -<translation id="2611702650078660078">Došlo je do greške</translation> <translation id="2611776654555141051">Alatka za proavougaonike</translation> <translation id="2611885296070244383">Mikrofon (interni)</translation> <translation id="2612676031748830579">Broj kartice</translation> @@ -2728,7 +2726,6 @@ <translation id="285033512555869047">Zatvoreno</translation> <translation id="2850541429955027218">Dodaj temu</translation> <translation id="2851291081585704741">Oflajn ste</translation> -<translation id="2852045827873867442">Treba vam internet veza.</translation> <translation id="285237063405807022">(učitavanje)</translation> <translation id="2853121255651601031">Lozinka je sačuvana</translation> <translation id="2854453262159518435">Zameni postojeću grupu kartica</translation> @@ -3595,6 +3592,7 @@ <translation id="3473241910002674503">Idite na početnu stranicu ili nazad i menjajte aplikacije pomoću dugmadi u režimu tableta.</translation> <translation id="3473479545200714844">Lupa ekrana</translation> <translation id="3474218480460386727">Koristite 99 slova ili manje za nove reči</translation> +<translation id="3474330892505468100">Google Beam sa Meet-om</translation> <translation id="3474624961160222204">Nastavi kao <ph name="NAME" /></translation> <translation id="3477772589943384839">Ostvarite umerenu uštedu memorije. Kartice postaju neaktivne posle dužeg vremenskog perioda.</translation> <translation id="347785443197175480">I dalje dozvoljavaj sajtu <ph name="HOST" /> da pristupa kameri i mikrofonu</translation> @@ -5483,7 +5481,6 @@ <translation id="4779766576531456629">Preimenujte mobilnu mrežu za eSIM</translation> <translation id="4780321648949301421">Sačuvaj stranicu kao...</translation> <translation id="4780558987886269159">Za posao</translation> -<translation id="4781633367688946589">Pređi na novu sesiju</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> želi da koristi lične podatke iz digitalnog novčanika.</translation> <translation id="4785719467058219317">Koristite bezbednosni ključ koji nije registrovan za ovaj veb-sajt</translation> <translation id="4785914069240823137">Otkažite opsecanje</translation> @@ -6271,6 +6268,7 @@ <translation id="5337926771328966926">Aktuelan naziv uređaja je <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Možete da pregledate privatno u prozoru bez arhiviranja</translation> <translation id="5338503421962489998">Lokalni memorijski prostor</translation> +<translation id="5340620183031438925">Da biste postavili pitanje AI režimu o kartici bez napuštanja stranice, potvrdite identitet. Moći ćete i da pristupate lozinkama i drugom sadržaju na svim uređajima.</translation> <translation id="5340787663756381836">&Pronađi i izmeni</translation> <translation id="5340900621595888432">Šaljite podatke o dijagnostici i korišćenju</translation> <translation id="5341793073192892252">Sledeći kolačići su blokirani (kolačići treće strane se blokiraju bez izuzetka)</translation> @@ -7457,7 +7455,6 @@ <translation id="6180550893222597997">Koji pristupni kôd želite da koristite za aplikaciju <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Aplikacije ponekad ažuriraju svoje brendiranje. Pregledajte sve promene da biste bili sigurni da vam odgovaraju pre ažuriranja.</translation> <translation id="6181431612547969857">Preuzimanje je blokirano</translation> -<translation id="6182100780603067202">Deli i zvuk aplikacije (iz svih prozora)</translation> <translation id="6183369864942961155">Automatska svetla/tamna tema</translation> <translation id="6183773856988300112">Gemini u Chrome-u koristi automatsko pregledanje za rad na karticama i obavljanje zadataka koje mu dodelite. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Pretražite kartice</translation> @@ -8254,7 +8251,6 @@ <translation id="6754359471209693699">Započnite novu pretragu</translation> <translation id="6754918760968695779">Brzo umetanje</translation> <translation id="6755702685749429945">Dodaj rečnik</translation> -<translation id="6756157672127672536">Aplikacija Fajlovi pruža brz pristup fajlovima koje ste sačuvali na Google disku, u spoljnoj memoriji ili na Chrome OS uređaju.</translation> <translation id="6756643207511618722">Mehanizmi govora</translation> <translation id="6757431299485455321">Pomaže drugim uređajima da pronađu ovaj hotspot.</translation> <translation id="6758056191028427665">Podelite utiske o našem učinku.</translation> @@ -9201,6 +9197,7 @@ <translation id="7406912950279255498">Režim inverzije boja</translation> <translation id="7407430846095439694">Uvezi i obaveži se</translation> <translation id="7407504355934009739">Većina ljudi blokira obaveštenja sa ovog sajta</translation> +<translation id="7407578029724074226">Fajl <ph name="FILE_NAME" /> sadrži osetljive podatke. Organizacija će vam omogućiti da ga sačuvate u prostoru u klaudu ili da ga odbacite</translation> <translation id="7408080603962564527">To će biti vidljivo drugima</translation> <translation id="740810853557944681">Dodajte server za štampanje</translation> <translation id="7409549334477097887">Veoma velika</translation> @@ -9254,6 +9251,7 @@ <translation id="7434969625063495310">Dodavanje servera za štampanje nije uspelo. Proverite konfiguraciju servera i probajte ponovo.</translation> <translation id="7436921188514130341">O, ne! Došlo je do greške tokom promene naziva.</translation> <translation id="7439519621174723623">Dodajte naziv uređaja da biste nastavili</translation> +<translation id="743982235360757672">Neka vam AI režim bude pri ruci dok pregledate</translation> <translation id="7441736532026945583">Izaberite Sakrij grupu da biste uklonili grupu sa trake sa karticama</translation> <translation id="7441736921018636843">Da biste promenili ovo podešavanje, <ph name="BEGIN_LINK" />resetujte sinhronizaciju<ph name="END_LINK" /> da biste uklonili pristupnu frazu za sinhronizaciju</translation> <translation id="7441830548568730290">Drugi korisnici</translation> @@ -9992,7 +9990,6 @@ <translation id="794676567536738329">Potvrđivanje dozvola</translation> <translation id="7947962633355574091">K&opiraj adresu videa</translation> <translation id="7947964080535614577">Sajtovi obično prikazuju oglase da bi mogli besplatno da pružaju sadržaj ili usluge. Ali, ima i sajtova koji prikazuju oglase koji ometaju aktivnosti ili obmanjujuće oglase.</translation> -<translation id="7948239795436419268">Ne vraćaj prozore</translation> <translation id="7948407723851303488">Sve stranice sa <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Razlog: LBS podržava samo http://, https:// i file:// URL-ove.</translation> <translation id="7950814699499457511">Uključeno • Ovaj dodatak nije objavio prakse privatnosti, na primer, kako prikuplja i koristi podatke</translation> @@ -11181,7 +11178,6 @@ <translation id="8751034568832412184">Škola</translation> <translation id="8751329102746373229">Od administratora</translation> <translation id="8752451679755290210">Automatski se krećite između stavki</translation> -<translation id="8753948258138515839">Aplikacija Fajlovi pruža brz pristup fajlovima koje ste sačuvali na Google disku, u spoljnoj memoriji ili na Chrome OS Flex uređaju.</translation> <translation id="8754200782896249056"><p>Kada koristite <ph name="PRODUCT_NAME" /> u podržanom računarskom okruženju, koristiće se podešavanja proksija sistema. Međutim, ili sistem nije podržan ili je došlo do problema pri pokretanju konfiguracije sistema.</p> <p>Ali i dalje možete da konfigurišete preko komandne linije. Pogledajte <code>man <ph name="PRODUCT_BINARY_NAME" /></code> za više informacija o obeležjima i promenljivama okruženja.</p></translation> @@ -11976,6 +11972,7 @@ <translation id="992778845837390402">U toku je pravljenje rezervne kopije Linux podataka</translation> <translation id="994087375490600917">Bočne table</translation> <translation id="994289308992179865">&Ponavljaj</translation> +<translation id="995420352808264005">Izaberite tip registracije uređaja</translation> <translation id="995755448277384931">Dodajte IBAN</translation> <translation id="996250603853062861">Uspostavljanje bezbedne veze...</translation> <translation id="997143476478634194">Sajtovi automatski prate ovo podešavanje kada ih posetite. Sajtovi obično šalju obaveštenja da bi vas obavestili o udarnim vestima ili porukama četa.</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index a437a33..8bb20a7 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Преузимање фајлова са коментарима о главном чвору није успело. Пробајте поново касније.</translation> <translation id="1103523840287552314">Увек преводи <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Одмах ћете изгубити приступ овој групи картица и она ће бити избрисана са свих уређаја</translation> +<translation id="1105934302947321130">Google Beam са Zoom-ом</translation> <translation id="1106270460549661906">Опозови дељење са Gemini-јем</translation> <translation id="1106350001632362876">Повећајте граничну вредност</translation> <translation id="110850812463801904">Ручно повежите са OneDrive-ом</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Безбедносни кључ није заштићен PIN-ом. Да бисте управљали подацима за пријављивање, прво направите PIN.</translation> <translation id="1179400851034021914">IBAN је неважећи</translation> <translation id="1179902906564467236">Пратите упутства на телефону или користите апликацију камере</translation> -<translation id="1180117276105724040">Враћају се прозори из претходне сесије…</translation> <translation id="118057123461613219">Огромне уштеде</translation> <translation id="1181037720776840403">Уклони</translation> <translation id="1182876754474670069">home</translation> @@ -760,7 +760,6 @@ <translation id="151501797353681931">Увоз из прегледача Safari</translation> <translation id="1515163294334130951">Покрени</translation> <translation id="1517467582299994451">Да бисте пребацивали помоћу кода, укључите подешавања синхронизације Chrome прегледача</translation> -<translation id="1519090060276706457">Враћање прозора траје дуже него што је очекивано</translation> <translation id="1521442365706402292">Управљај сертификатима</translation> <translation id="1521655867290435174">Google табеле</translation> <translation id="1521774566618522728">Активан је данас</translation> @@ -1101,6 +1100,7 @@ <translation id="1745732479023874451">Управљајте контактима</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}one{Желите да отворите и измените # фајл у овој веб-апликацији?}few{Желите да отворите и измените # фајла у овој веб-апликацији?}other{Желите да отворите и измените # фајлова у овој веб-апликацији?}}</translation> <translation id="1748563609363301860">Можете да сачувате ову лозинку на Google налогу или само на овом уређају</translation> +<translation id="1749645492410897998">Софтвер се инсталира</translation> <translation id="1749733017156547309">Лозинка је обавезна</translation> <translation id="1750172676754093297">Безбедносни кључ не може да чува отиске прстију</translation> <translation id="1750238553597293878">Наставите да користите лозинке на Google налогу</translation> @@ -1172,7 +1172,6 @@ <translation id="1796460466266263589">Да бисте наставили да користите Gemini, потврдите свој идентитет</translation> <translation id="1796588414813960292">Функције којима треба звук неће радити</translation> <translation id="1798726622311813209">Кредитне и дебитне картице</translation> -<translation id="1799852120691957794">Враћање прозора из претходне сесије није успело</translation> <translation id="180203835522132923">Тастер за претрагу + O, а затим W</translation> <translation id="1802624026913571222">Пређи у стање спавања када се поклопац затвори</translation> <translation id="1802687198411089702">Страница се не одазива. Можете да сачекате да почне да се одазива или да је затворите.</translation> @@ -2364,7 +2363,6 @@ <translation id="2610374175948698697">Фајлови који могу да прегледају фајлове или фолдере на уређају</translation> <translation id="2610780100389066815">Потписивање Microsoft листе поузданих</translation> <translation id="261114180663074524">Пријавите се на Microsoft налог и пробајте поново</translation> -<translation id="2611702650078660078">Дошло је до грешке</translation> <translation id="2611776654555141051">Алатка за проавоугаонике</translation> <translation id="2611885296070244383">Микрофон (интерни)</translation> <translation id="2612676031748830579">Број картице</translation> @@ -2728,7 +2726,6 @@ <translation id="285033512555869047">Затворено</translation> <translation id="2850541429955027218">Додај тему</translation> <translation id="2851291081585704741">Офлајн сте</translation> -<translation id="2852045827873867442">Треба вам интернет веза.</translation> <translation id="285237063405807022">(учитавање)</translation> <translation id="2853121255651601031">Лозинка је сачувана</translation> <translation id="2854453262159518435">Замени постојећу групу картица</translation> @@ -3595,6 +3592,7 @@ <translation id="3473241910002674503">Идите на почетну страницу или назад и мењајте апликације помоћу дугмади у режиму таблета.</translation> <translation id="3473479545200714844">Лупа екрана</translation> <translation id="3474218480460386727">Користите 99 слова или мање за нове речи</translation> +<translation id="3474330892505468100">Google Beam са Meet-ом</translation> <translation id="3474624961160222204">Настави као <ph name="NAME" /></translation> <translation id="3477772589943384839">Остварите умерену уштеду меморије. Картице постају неактивне после дужег временског периода.</translation> <translation id="347785443197175480">И даље дозвољавај сајту <ph name="HOST" /> да приступа камери и микрофону</translation> @@ -5483,7 +5481,6 @@ <translation id="4779766576531456629">Преименујте мобилну мрежу за eSIM</translation> <translation id="4780321648949301421">Сачувај страницу као...</translation> <translation id="4780558987886269159">За посао</translation> -<translation id="4781633367688946589">Пређи на нову сесију</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> жели да користи личне податке из дигиталног новчаника.</translation> <translation id="4785719467058219317">Користите безбедносни кључ који није регистрован за овај веб-сајт</translation> <translation id="4785914069240823137">Откажите опсецање</translation> @@ -6271,6 +6268,7 @@ <translation id="5337926771328966926">Актуелан назив уређаја је <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Можете да прегледате приватно у прозору без архивирања</translation> <translation id="5338503421962489998">Локални меморијски простор</translation> +<translation id="5340620183031438925">Да бисте поставили питање AI режиму о картици без напуштања странице, потврдите идентитет. Моћи ћете и да приступате лозинкама и другом садржају на свим уређајима.</translation> <translation id="5340787663756381836">&Пронађи и измени</translation> <translation id="5340900621595888432">Шаљите податке о дијагностици и коришћењу</translation> <translation id="5341793073192892252">Следећи колачићи су блокирани (колачићи треће стране се блокирају без изузетка)</translation> @@ -7457,7 +7455,6 @@ <translation id="6180550893222597997">Који приступни кôд желите да користите за апликацију <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Апликације понекад ажурирају своје брендирање. Прегледајте све промене да бисте били сигурни да вам одговарају пре ажурирања.</translation> <translation id="6181431612547969857">Преузимање је блокирано</translation> -<translation id="6182100780603067202">Дели и звук апликације (из свих прозора)</translation> <translation id="6183369864942961155">Аутоматска светла/тамна тема</translation> <translation id="6183773856988300112">Gemini у Chrome-у користи аутоматско прегледање за рад на картицама и обављање задатака које му доделите. <ph name="LINK_BEGIN" />Сазнајте више<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Претражите картице</translation> @@ -8254,7 +8251,6 @@ <translation id="6754359471209693699">Започните нову претрагу</translation> <translation id="6754918760968695779">Брзо уметање</translation> <translation id="6755702685749429945">Додај речник</translation> -<translation id="6756157672127672536">Апликација Фајлови пружа брз приступ фајловима које сте сачували на Google диску, у спољној меморији или на Chrome ОС уређају.</translation> <translation id="6756643207511618722">Механизми говора</translation> <translation id="6757431299485455321">Помаже другим уређајима да пронађу овај хотспот.</translation> <translation id="6758056191028427665">Поделите утиске о нашем учинку.</translation> @@ -9201,6 +9197,7 @@ <translation id="7406912950279255498">Режим инверзије боја</translation> <translation id="7407430846095439694">Увези и обавежи се</translation> <translation id="7407504355934009739">Већина људи блокира обавештења са овог сајта</translation> +<translation id="7407578029724074226">Фајл <ph name="FILE_NAME" /> садржи осетљиве податке. Организација ће вам омогућити да га сачувате у простору у клауду или да га одбаците</translation> <translation id="7408080603962564527">То ће бити видљиво другима</translation> <translation id="740810853557944681">Додајте сервер за штампање</translation> <translation id="7409549334477097887">Веома велика</translation> @@ -9254,6 +9251,7 @@ <translation id="7434969625063495310">Додавање сервера за штампање није успело. Проверите конфигурацију сервера и пробајте поново.</translation> <translation id="7436921188514130341">О, не! Дошло је до грешке током промене назива.</translation> <translation id="7439519621174723623">Додајте назив уређаја да бисте наставили</translation> +<translation id="743982235360757672">Нека вам AI режим буде при руци док прегледате</translation> <translation id="7441736532026945583">Изаберите Сакриј групу да бисте уклонили групу са траке са картицама</translation> <translation id="7441736921018636843">Да бисте променили ово подешавање, <ph name="BEGIN_LINK" />ресетујте синхронизацију<ph name="END_LINK" /> да бисте уклонили приступну фразу за синхронизацију</translation> <translation id="7441830548568730290">Други корисници</translation> @@ -9992,7 +9990,6 @@ <translation id="794676567536738329">Потврђивање дозвола</translation> <translation id="7947962633355574091">К&опирај адресу видеа</translation> <translation id="7947964080535614577">Сајтови обично приказују огласе да би могли бесплатно да пружају садржај или услуге. Али, има и сајтова који приказују огласе који ометају активности или обмањујуће огласе.</translation> -<translation id="7948239795436419268">Не враћај прозоре</translation> <translation id="7948407723851303488">Све странице са <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Разлог: LBS подржава само http://, https:// и file:// URL-ове.</translation> <translation id="7950814699499457511">Укључено • Овај додатак није објавио праксе приватности, на пример, како прикупља и користи податке</translation> @@ -11181,7 +11178,6 @@ <translation id="8751034568832412184">Школа</translation> <translation id="8751329102746373229">Од администратора</translation> <translation id="8752451679755290210">Аутоматски се крећите између ставки</translation> -<translation id="8753948258138515839">Апликација Фајлови пружа брз приступ фајловима које сте сачували на Google диску, у спољној меморији или на Chrome OS Flex уређају.</translation> <translation id="8754200782896249056"><p>Када користите <ph name="PRODUCT_NAME" /> у подржаном рачунарском окружењу, користиће се подешавања проксија система. Међутим, или систем није подржан или је дошло до проблема при покретању конфигурације система.</p> <p>Али и даље можете да конфигуришете преко командне линије. Погледајте <code>man <ph name="PRODUCT_BINARY_NAME" /></code> за више информација о обележјима и променљивама окружења.</p></translation> @@ -11976,6 +11972,7 @@ <translation id="992778845837390402">У току је прављење резервне копије Linux података</translation> <translation id="994087375490600917">Бочне табле</translation> <translation id="994289308992179865">&Понављај</translation> +<translation id="995420352808264005">Изаберите тип регистрације уређаја</translation> <translation id="995755448277384931">Додајте IBAN</translation> <translation id="996250603853062861">Успостављање безбедне везе...</translation> <translation id="997143476478634194">Сајтови аутоматски прате ово подешавање када их посетите. Сајтови обично шаљу обавештења да би вас обавестили о ударним вестима или порукама чета.</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 1cb0898e..b9e1ea7 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Det gick inte att ladda ned kommentarsfiler för huvudnoden. Försök igen senare.</translation> <translation id="1103523840287552314">Översätt alltid <ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Du förlorar omedelbart åtkomst till flikgruppen och den raderas från alla dina enheter</translation> +<translation id="1105934302947321130">Google Beam med Zoom</translation> <translation id="1106270460549661906">Sluta dela med Gemini</translation> <translation id="1106350001632362876">Höj gränsen</translation> <translation id="110850812463801904">Anslut manuellt till OneDrive</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Säkerhetsnyckeln skyddas inte av en pinkod. Skapa en pinkod först innan du hanterar inloggningsuppgifter.</translation> <translation id="1179400851034021914">Ogiltig IBAN</translation> <translation id="1179902906564467236">Följ anvisningarna på telefonen eller använd kameraappen</translation> -<translation id="1180117276105724040">Återställer fönster från din senaste session …</translation> <translation id="118057123461613219">Stora besparingar</translation> <translation id="1181037720776840403">Ta bort</translation> <translation id="1182876754474670069">hem</translation> @@ -762,7 +762,6 @@ <translation id="151501797353681931">Importerat från Safari</translation> <translation id="1515163294334130951">Starta</translation> <translation id="1517467582299994451">Om du vill casta med en kod aktiverar du synkroniseringsinställningarna i webbläsaren Chrome</translation> -<translation id="1519090060276706457">Det tar längre tid än väntat att återställa fönster</translation> <translation id="1521442365706402292">Hantera certifikat</translation> <translation id="1521655867290435174">Google Kalkylark</translation> <translation id="1521774566618522728">Aktiv idag</translation> @@ -1111,6 +1110,7 @@ <translation id="1745732479023874451">Hantera kontakter</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{Vill du öppna och redigera # filer i den här webbappen?}}</translation> <translation id="1748563609363301860">Du kan spara det här lösenordet i Google-kontot eller endast på den här enheten</translation> +<translation id="1749645492410897998">Mjukvaran installeras</translation> <translation id="1749733017156547309">Ett lösenord krävs</translation> <translation id="1750172676754093297">Det går inte att lagra fingeravtryck på säkerhetsnyckeln</translation> <translation id="1750238553597293878">Fortsätt använda lösenorden i Google-kontot</translation> @@ -1182,7 +1182,6 @@ <translation id="1796460466266263589">Verifiera din identitet för att fortsätta använda Gemini</translation> <translation id="1796588414813960292">Funktioner som kräver ljud slutar fungera</translation> <translation id="1798726622311813209">Kredit- och bankkort</translation> -<translation id="1799852120691957794">Det gick inte att återställa fönster från din senaste session</translation> <translation id="180203835522132923">Sök + O, sedan W</translation> <translation id="1802624026913571222">Aktivera viloläge när fodralet stängs</translation> <translation id="1802687198411089702">Sidan svarar inte. Vänta tills den svarar eller avbryt.</translation> @@ -2379,7 +2378,6 @@ <translation id="2610374175948698697">Får visa filer eller mappar på enheten</translation> <translation id="2610780100389066815">Microsofts Signering av lista över betrodda certifikat</translation> <translation id="261114180663074524">Logga in på Microsoft-kontot och försök igen</translation> -<translation id="2611702650078660078">Något gick fel</translation> <translation id="2611776654555141051">Rektangelverktyg</translation> <translation id="2611885296070244383">Mikrofon (inbyggd)</translation> <translation id="2612676031748830579">Kortnummer</translation> @@ -2743,7 +2741,6 @@ <translation id="285033512555869047">Stängd</translation> <translation id="2850541429955027218">Lägg till tema</translation> <translation id="2851291081585704741">Du är offline</translation> -<translation id="2852045827873867442">Internetanslutning krävs.</translation> <translation id="285237063405807022">(läser in)</translation> <translation id="2853121255651601031">Lösenordet sparades</translation> <translation id="2854453262159518435">Ersätt befintlig flikgrupp</translation> @@ -3610,6 +3607,7 @@ <translation id="3473241910002674503">Navigera till startsidan, tillbaka och byt appar med knappar i surfplatteläget.</translation> <translation id="3473479545200714844">Skärmförstorare</translation> <translation id="3474218480460386727">Nya ord får inte vara längre än 99 tecken</translation> +<translation id="3474330892505468100">Google Beam med Meet</translation> <translation id="3474624961160222204">Fortsätt som <ph name="NAME" /></translation> <translation id="3477772589943384839">Spara måttligt mycket minne. Flikarna blir inaktiva efter en längre tid.</translation> <translation id="347785443197175480">Fortsätt tillåta att <ph name="HOST" /> använder kameran och mikrofonen</translation> @@ -5498,7 +5496,6 @@ <translation id="4779766576531456629">Byt namn på eSIM-mobilnätverket</translation> <translation id="4780321648949301421">Spara sida som...</translation> <translation id="4780558987886269159">För arbete</translation> -<translation id="4781633367688946589">Fortsätt till ny session</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> vill använda personliga uppgifter från din digitala plånbok.</translation> <translation id="4785719467058219317">Säkerhetsnyckeln som du använder är inte registrerad på den här webbplatsen</translation> <translation id="4785914069240823137">Avbryt beskärning</translation> @@ -6287,6 +6284,7 @@ <translation id="5337926771328966926">Enhetens nuvarande namn är <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Du kan surfa privat med ett inkognitofönster</translation> <translation id="5338503421962489998">Lokal lagring</translation> +<translation id="5340620183031438925">Verifiera din identitet om du vill fråga AI-läget om fliken utan att lämna sidan. Du får även dina lösenord med mera på alla dina enheter.</translation> <translation id="5340787663756381836">Hitta och redigera</translation> <translation id="5340900621595888432">Skicka diagnostik- och användningsdata</translation> <translation id="5341793073192892252">Följande cookies har blockerats (cookies från tredje part blockeras alltid)</translation> @@ -7473,7 +7471,6 @@ <translation id="6180550893222597997">Vilken nyckel vill du använda för <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Appar uppdaterar ibland sitt varumärke. Granska alla ändringar och se till att du är nöjd med dem innan du uppdaterar.</translation> <translation id="6181431612547969857">Nedladdningen blockerades</translation> -<translation id="6182100780603067202">Dela även ljud från appen (från alla dess fönster)</translation> <translation id="6183369864942961155">Automatiskt ljust/mörkt tema</translation> <translation id="6183773856988300112">Gemini i Chrome använder automatisk surfning för att arbeta i dina flikar och utföra uppgifter du ger den. <ph name="LINK_BEGIN" />Läs mer<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Sök bland flikar</translation> @@ -8266,7 +8263,6 @@ <translation id="6754359471209693699">Starta en ny sökning</translation> <translation id="6754918760968695779">Snabbinfogning</translation> <translation id="6755702685749429945">Lägg till ordbok</translation> -<translation id="6756157672127672536">Med appen Filer kommer du snabbt åt filer som du har sparat på Google Drive, externa lagringsenheter eller din ChromeOS-enhet.</translation> <translation id="6756643207511618722">Talmotorer</translation> <translation id="6757431299485455321">Hjälp andra enheter att hitta surfzonen.</translation> <translation id="6758056191028427665">Berätta hur vi sköter oss.</translation> @@ -9213,6 +9209,7 @@ <translation id="7406912950279255498">Läge för inverterade färger</translation> <translation id="7407430846095439694">Importera och bind</translation> <translation id="7407504355934009739">De flesta användarna blockerar aviseringar från den här webbplatsen</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> har känsliga uppgifter. Organisationen låter dig spara den i molnlagringen eller slänga den.</translation> <translation id="7408080603962564527">Det här visas för andra</translation> <translation id="740810853557944681">Lägg till en utskriftsserver</translation> <translation id="7409549334477097887">Extra stor</translation> @@ -9266,6 +9263,7 @@ <translation id="7434969625063495310">Det gick inte att lägga till utskriftsservern. Kontrollera serverns konfiguration och försök igen.</translation> <translation id="7436921188514130341">Ett fel uppstod när namnet skulle bytas.</translation> <translation id="7439519621174723623">Lägg till ett enhetsnamn om du vill fortsätta</translation> +<translation id="743982235360757672">Ha AI-läget nära till hands när du surfar</translation> <translation id="7441736532026945583">Välj Dölj grupp om du vill ta bort gruppen från flikhuvudet</translation> <translation id="7441736921018636843"><ph name="BEGIN_LINK" />Återställ synkroniseringen<ph name="END_LINK" /> så att lösenfrasen för synkronisering tas bort om du vill ändra den här inställningen</translation> <translation id="7441830548568730290">Andra användare</translation> @@ -10004,7 +10002,6 @@ <translation id="794676567536738329">Bekräfta behörigheter</translation> <translation id="7947962633355574091">K&opiera videoadress</translation> <translation id="7947964080535614577">Webbplatser som visar annonser brukar göra det så att de kan tillhandahålla innehåll eller tjänster utan kostnad. Men vissa webbplatser kan visa påträngande eller vilseledande annonser.</translation> -<translation id="7948239795436419268">Återställ inte fönster</translation> <translation id="7948407723851303488">Alla sidor av <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Orsak: Stöd för äldre webbläsare fungerar bara med webbadresser som har protokollen http://, https:// och file://.</translation> <translation id="7950814699499457511">På • Tillägget har ingen publicerad integritetspraxis, till exempel hur det samlar in och använder data</translation> @@ -11193,7 +11190,6 @@ <translation id="8751034568832412184">Skola</translation> <translation id="8751329102746373229">Från administratören</translation> <translation id="8752451679755290210">Flytta mellan objekt automatiskt</translation> -<translation id="8753948258138515839">Med appen Filer kommer du snabbt åt filer som du har sparat på Google Drive, externa lagringsenheter eller din ChromeOS Flex-enhet.</translation> <translation id="8754200782896249056"><p>När <ph name="PRODUCT_NAME" /> körs i en skrivbordsmiljö som stöds används datorns proxyinställningar. Det kan hända att din dator inte stöds eller att det uppstod ett problem vid start av systemkonfigurationen.</p> <p>Du kan fortfarande konfigurera via kommandoraden. Läs <code>man <ph name="PRODUCT_BINARY_NAME" /></code> om du vill veta mer om flaggningar och miljövariabler.</p></translation> @@ -11986,6 +11982,7 @@ <translation id="992778845837390402">Säkerhetskopiering av Linux pågår</translation> <translation id="994087375490600917">Sidopaneler</translation> <translation id="994289308992179865">&Repetera</translation> +<translation id="995420352808264005">Välj typ av enhetsregistrering</translation> <translation id="995755448277384931">Lägg till IBAN</translation> <translation id="996250603853062861">Upprättar en säker anslutning...</translation> <translation id="997143476478634194">Webbplatser som du besöker följer automatiskt den här inställningen. Webbplatser skickar vanligen aviseringar om senaste nytt eller chattmeddelanden.</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index f9e08a0..8945170 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Imeshindwa kupakua faili za ufafanuzi wa kipengele kikuu. Jaribu tena baadaye.</translation> <translation id="1103523840287552314">Tafsiri <ph name="LANGUAGE" /> kila wakati</translation> <translation id="1104098698795583187">Utapoteza papo hapo uwezo wa kufikia kikundi hiki cha vichupo na kitafutwa kwenye vifaa vyako vyote</translation> +<translation id="1105934302947321130">Google Beam kwenye Zoom</translation> <translation id="1106270460549661906">Acha kuruhusu ufikiaji ukitumia Gemini</translation> <translation id="1106350001632362876">Ongeza upeo</translation> <translation id="110850812463801904">Unganisha mwenyewe kwenye OneDrive</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Ufunguo wako wa usalama haujalindwa kwa PIN. Ili udhibiti data ya kuingia katika akaunti, tunga PIN kwanza.</translation> <translation id="1179400851034021914">IBAN si sahihi</translation> <translation id="1179902906564467236">Fuata maagizo kwenye simu yako au utumie programu ya kamera</translation> -<translation id="1180117276105724040">Inarejesha madirisha kutoka kwenye kipindi chako cha awali...</translation> <translation id="118057123461613219">Nafasi kubwa zaidi iliyookolewa na kiokoa hifadhi</translation> <translation id="1181037720776840403">Ondoa</translation> <translation id="1182876754474670069">home</translation> @@ -759,7 +759,6 @@ <translation id="151501797353681931">Zilizoingizwa Kutoka Safari</translation> <translation id="1515163294334130951">Zindua</translation> <translation id="1517467582299994451">Ili utume maudhui kwa kutumia msimbo, washa mipangilio ya usawazishaji ya kivinjari cha Chrome</translation> -<translation id="1519090060276706457">Hatua ya kurejesha madirisha inachukua muda mrefu zaidi kuliko inavyotarajiwa</translation> <translation id="1521442365706402292">Dhibiti vyeti</translation> <translation id="1521655867290435174">Majedwali ya Google</translation> <translation id="1521774566618522728">Ameitumia leo</translation> @@ -1108,6 +1107,7 @@ <translation id="1745732479023874451">Dhibiti anwani</translation> <translation id="1748283190377208783">{0,plural, =1{wingi usiotumika}other{Ungependa kufungua na kubadilisha faili # katika programu hizi za wavuti?}}</translation> <translation id="1748563609363301860">Unaweza kuhifadhi nenosiri hili kwenye Akaunti yako ya Google au kwenye kifaa hiki pekee</translation> +<translation id="1749645492410897998">Inaweka programu</translation> <translation id="1749733017156547309">Nenosiri linahitajika</translation> <translation id="1750172676754093297">Ufunguo wako wa usalama hauwezi kuhifadhi alama bainifu</translation> <translation id="1750238553597293878">Endelea kutumia manenosiri katika Akaunti yako ya Google</translation> @@ -1179,7 +1179,6 @@ <translation id="1796460466266263589">Ili uendelee kutumia Gemini, thibitisha kuwa ni wewe</translation> <translation id="1796588414813960292">Vipengele vinavyohitaji sauti havitafanya kazi</translation> <translation id="1798726622311813209">Kadi za mikopo na za malipo</translation> -<translation id="1799852120691957794">Imeshindwa kurejesha madirisha kutoka kwenye kipindi chako cha awali</translation> <translation id="180203835522132923">Search + O, kisha W</translation> <translation id="1802624026913571222">Iwe katika hali tuli kifuniko kikifungwa</translation> <translation id="1802687198411089702">Ukurasa huu haufanyi kazi. Unaweza kuusubiri au uufunge.</translation> @@ -2376,7 +2375,6 @@ <translation id="2610374175948698697">Zinaweza kuangalia faili au folda kwenye kifaa chako</translation> <translation id="2610780100389066815">Uwekaji Sahihi wa Orodha ya Zinazoaminiwa kutoka Microsoft</translation> <translation id="261114180663074524">Ingia kwenye akaunti yako ya Microsoft kisha ujaribu tena</translation> -<translation id="2611702650078660078">Hitilafu fulani imetokea</translation> <translation id="2611776654555141051">Zana ya kuhariri picha za Mstatiili</translation> <translation id="2611885296070244383">Maikrofoni (ya ndani)</translation> <translation id="2612676031748830579">Nambari ya kadi</translation> @@ -2740,7 +2738,6 @@ <translation id="285033512555869047">Kimefungwa</translation> <translation id="2850541429955027218">Ongeza mandhari</translation> <translation id="2851291081585704741">Haupo mtandaoni</translation> -<translation id="2852045827873867442">Muunganisho wa intaneti unahitajika.</translation> <translation id="285237063405807022">(inapakia)</translation> <translation id="2853121255651601031">Nenosiri Limehifadhiwa</translation> <translation id="2854453262159518435">Badilisha kikundi cha vichupo kilichopo</translation> @@ -3607,6 +3604,7 @@ <translation id="3473241910002674503">Nenda kwenye kifungua programu, rudi nyuma na ubadilishe programu ukitumia vitufe katika hali ya kompyuta kibao.</translation> <translation id="3473479545200714844">Kikuza skrini</translation> <translation id="3474218480460386727">Tumia herufi 99 au chache kwa maneno mapya</translation> +<translation id="3474330892505468100">Google Beam kwenye Meet</translation> <translation id="3474624961160222204">Endelea ukitumia <ph name="NAME" /></translation> <translation id="3477772589943384839">Okoa nafasi ya wastani ya hifadhi. Vichupo vyako huacha kutumika baada ya muda mrefu zaidi.</translation> <translation id="347785443197175480">Endelea kuruhusu <ph name="HOST" /> kufikia kamera na maikrofoni yako</translation> @@ -5493,7 +5491,6 @@ <translation id="4779766576531456629">Badilisha jina la Mtandao wa simu wa eSIM</translation> <translation id="4780321648949301421">Hifadhi Ukurasa Kama...</translation> <translation id="4780558987886269159">Cha kazini</translation> -<translation id="4781633367688946589">Endelea kwenye kipindi kipya</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> ingependa kutumia taarifa binafsi zilizo kwenye pochi yako dijitali.</translation> <translation id="4785719467058219317">Unatumia ufunguo wa usalama ambao haujasajiliwa kwenye tovuti hii</translation> <translation id="4785914069240823137">Ghairi Kupunguza</translation> @@ -6282,6 +6279,7 @@ <translation id="5337926771328966926">Jina la sasa la kifaa ni <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Unaweza kuvinjari kwa faragha ukitumia dirisha fiche</translation> <translation id="5338503421962489998">Hifadhi ya ndani</translation> +<translation id="5340620183031438925">Ili uulize Matumizi ya AI kuhusu kichupo chako bila kufunga ukurasa, thibitisha kuwa ni wewe. Pia utapata manenosiri yako na zaidi kwenye vifaa vyako vyote.</translation> <translation id="5340787663756381836">&Tafuta na ubadilishe</translation> <translation id="5340900621595888432">Tuma data ya matumizi na uchunguzi</translation> <translation id="5341793073192892252">Vidakuzi vifuatavyo vilizuiwa (vidakuzi vyote vya washirika wengine vinazuiwa)</translation> @@ -7468,7 +7466,6 @@ <translation id="6180550893222597997">Je, ni ufunguo upi wa siri ungependa kutumia kwenye <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Wakati mwingine programu husasisha chapa zao. Kagua mabadiliko yote ili uhakikishe kuwa umeridhishwa nayo kabla ya kusasisha.</translation> <translation id="6181431612547969857">Upakuaji umezuiwa</translation> -<translation id="6182100780603067202">Pia, ruhusu sauti ya programu ifikiwe (kutoka kwenye madirisha yake yote)</translation> <translation id="6183369864942961155">Mandhari meupe au meusi ya kiotomatiki</translation> <translation id="6183773856988300112">Gemini kwenye Chrome hutumia kipengele cha kuvinjari kiotomatiki kufanya kazi katika vichupo vyako na kukamilisha majukumu unayoipa. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Tafuta Vichupo</translation> @@ -8261,7 +8258,6 @@ <translation id="6754359471209693699">Anzisha utafutaji mpya</translation> <translation id="6754918760968695779">Kuingiza Haraka</translation> <translation id="6755702685749429945">Weka kamusi</translation> -<translation id="6756157672127672536">Programu ya Faili inatoa ufikiaji wa haraka kwenye faili ambazo umeweka kwenye Hifadhi ya Google, hifadhi ya nje au kifaa chako chenye Mfumo wa Uendeshaji wa Chrome.</translation> <translation id="6756643207511618722">Mitambo ya matamshi</translation> <translation id="6757431299485455321">Saidia vifaa vingine kupata mtandao pepe huu.</translation> <translation id="6758056191028427665">Tueleze jinsi huduma inavyokuridhisha.</translation> @@ -9208,6 +9204,7 @@ <translation id="7406912950279255498">Hali ya ugeuzaji rangi</translation> <translation id="7407430846095439694">Leta na Ufunge</translation> <translation id="7407504355934009739">Watu wengi huzuia arifa kutoka tovuti hii</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> ina data nyeti. Shirika lako litakuruhusu uihifadhi kwenye hifadhi ya wingu au uifute</translation> <translation id="7408080603962564527">Jina hili litaonekana kwa wengine</translation> <translation id="740810853557944681">Weka seva ya kuchapisha</translation> <translation id="7409549334477097887">Mkubwa zaidi</translation> @@ -9261,6 +9258,7 @@ <translation id="7434969625063495310">Imeshindwa kuweka seva ya kuchapisha. Tafadhali kagua mipangilio ya seva yako kisha ujaribu tena.</translation> <translation id="7436921188514130341">Samahani. Hitilafu imetokea wakati wa kubadilisha jina.</translation> <translation id="7439519621174723623">Weka jina la kifaa ili uendelee</translation> +<translation id="743982235360757672">Ruhusu Matumizi ya AI yafikiwe unapovinjari</translation> <translation id="7441736532026945583">Chagua "Ficha Kikundi" ili uondoe kikundi kwenye ukanda wa vichupo vyako</translation> <translation id="7441736921018636843">Ili ubadilishe mipangilio hii, <ph name="BEGIN_LINK" />weka upya kipengele cha usawazishaji<ph name="END_LINK" /> ili kuondoa kauli yako ya siri ya usawazishaji</translation> <translation id="7441830548568730290">Watumiaji wengine</translation> @@ -9999,7 +9997,6 @@ <translation id="794676567536738329">Thibitisha Vibali</translation> <translation id="7947962633355574091">Nakili Anwani ya Video</translation> <translation id="7947964080535614577">Kwa kawaida tovuti huonyesha matangazo ili ziweze kutoa maudhui au huduma bila malipo. Lakini, baadhi ya tovuti huonyesha matangazo yanayopotosha au yanayokatiza matumizi.</translation> -<translation id="7948239795436419268">Usirejeshe madirisha</translation> <translation id="7948407723851303488">Kurasa zote za <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Sababu: LBS inaweza kutumia URL za http://, https:// na file:// pekee.</translation> <translation id="7950814699499457511">Kimewashwa • Kiendelezi hiki hakijachapisha desturi za faragha, kama vile jinsi kinavyokusanya na kutumia data</translation> @@ -11188,7 +11185,6 @@ <translation id="8751034568832412184">Shule</translation> <translation id="8751329102746373229">Kutoka kwa msimamizi wako</translation> <translation id="8752451679755290210">Sogea kati ya vipengee mbalimbali kiotomatiki</translation> -<translation id="8753948258138515839">Programu ya Faili inatoa ufikiaji wa haraka kwenye faili ambazo umeweka kwenye Hifadhi ya Google, hifadhi ya nje au kwenye kifaa chako cha ChromeOS Flex.</translation> <translation id="8754200782896249056"><p>Unapotekeleza <ph name="PRODUCT_NAME" /> chini ya mazingira ya eneo-kazi yanayotumika, mipangilio ya mfumo ya proksi itatumiwa. Hata hivyo, huenda mfumo wako hautumiki au kulikuwa na tatizo wakati wa kufungua usanidi wako wa mfumo.</p> <p>Lakini bado unaweza kusanidi kupitia mstari amri. Tafadhali angalia <code>man <ph name="PRODUCT_BINARY_NAME" /></code> kwa maelezo zaidi kuhusu ripoti na vigezo vya mazingira.</p></translation> @@ -11981,6 +11977,7 @@ <translation id="992778845837390402">Shughuli ya kuhifadhi nakala ya Linux inaendelea wakati huu</translation> <translation id="994087375490600917">Vidirisha vya pembeni</translation> <translation id="994289308992179865">&Rudia-Rudia</translation> +<translation id="995420352808264005">Chagua aina ya uandikishaji wa kifaa</translation> <translation id="995755448277384931">Weka IBAN</translation> <translation id="996250603853062861">Inaanzisha muunganisho salama...</translation> <translation id="997143476478634194">Tovuti hufuata mipangilio hii kiotomatiki unapozitembelea. Tovuti hutuma arifa kukujulisha kuhusu habari zinazojiri au ujumbe wa gumzo.</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 48b11356..0f7c6bd 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -285,7 +285,6 @@ <translation id="117916940443676133">'பின்' மூலம் உங்கள் பாதுகாப்பு விசை பாதுகாக்கப்படவில்லை. உள்நுழைவுத் தரவை நிர்வகிக்க முதலில் 'பின்னை' அமைக்கவும்.</translation> <translation id="1179400851034021914">தவறான IBAN</translation> <translation id="1179902906564467236">உங்கள் ஃபோனில் காட்டப்படும் வழிமுறைகளைப் பின்பற்றவும் அல்லது கேமரா ஆப்ஸைப் பயன்படுத்தவும்</translation> -<translation id="1180117276105724040">உங்களின் முந்தைய அமர்வில் இருந்து சாளரங்களை மீட்டெடுக்கிறது...</translation> <translation id="118057123461613219">மிகப் பெரியளவில் சேமிப்புகள்</translation> <translation id="1181037720776840403">அகற்று</translation> <translation id="1182876754474670069">முகப்பு</translation> @@ -763,7 +762,6 @@ <translation id="151501797353681931">Safari இலிருந்து இறக்குமதி செய்யப்பட்டவை</translation> <translation id="1515163294334130951">தொடங்கு</translation> <translation id="1517467582299994451">குறியீட்டைப் பயன்படுத்தி அலைபரப்ப, Chrome உலாவி ஒத்திசைவு அமைப்புகளை இயக்கவும்</translation> -<translation id="1519090060276706457">சாளரங்களை மீட்டெடுக்க எதிர்பார்த்ததைவிட அதிக நேரம் எடுக்கிறது</translation> <translation id="1521442365706402292">சான்றிதழ்களை நிர்வகி</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">இன்று பயன்படுத்தியுள்ளார்</translation> @@ -1184,7 +1182,6 @@ <translation id="1796460466266263589">தொடர்ந்து Geminiயைப் பயன்படுத்த, இது நீங்கள்தான் என்பதை உறுதிப்படுத்தவும்</translation> <translation id="1796588414813960292">ஒலியுடன் இயங்கும் அம்சங்கள் செயல்படாது</translation> <translation id="1798726622311813209">கிரெடிட் மற்றும் டெபிட் கார்டுகள்</translation> -<translation id="1799852120691957794">உங்களின் முந்தைய அமர்வில் இருந்து சாளரங்களை மீட்டெடுக்க முடியவில்லை</translation> <translation id="180203835522132923">Search + O, அதன் பின்னர் W</translation> <translation id="1802624026913571222">கவர் மூடப்பட்டிருக்கும்போது உறக்கநிலைக்குச் செல்</translation> <translation id="1802687198411089702">பக்கம் செயல்படவில்லை. காத்திருக்கவும் அல்லது வெளியேறவும்.</translation> @@ -2381,7 +2378,6 @@ <translation id="2610374175948698697">உங்கள் சாதனத்தில் பார்ப்பதற்கான அணுகல் உள்ள ஃபைல்கள் அல்லது ஃபோல்டர்கள்</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">Microsoft கணக்கில் உள்நுழைந்து மீண்டும் முயலவும்</translation> -<translation id="2611702650078660078">பிழை ஏற்பட்டது</translation> <translation id="2611776654555141051">செவ்வகத்தைச் சேர்ப்பதற்கான கருவி</translation> <translation id="2611885296070244383">மைக் (பிரவுசர் பயன்பாடு)</translation> <translation id="2612676031748830579">கார்டு எண்</translation> @@ -2745,7 +2741,6 @@ <translation id="285033512555869047">மூடப்பட்டுள்ளது</translation> <translation id="2850541429955027218">தீமினைச் சேர்</translation> <translation id="2851291081585704741">ஆஃப்லைனில் உள்ளீர்கள்</translation> -<translation id="2852045827873867442">இணைய இணைப்பு தேவை.</translation> <translation id="285237063405807022">(ஏற்றுகிறது)</translation> <translation id="2853121255651601031">கடவுச்சொல் சேமிக்கப்பட்டது</translation> <translation id="2854453262159518435">ஏற்கெனவே உள்ள பக்கக் குழுவை மாற்றியமை</translation> @@ -5501,7 +5496,6 @@ <translation id="4779766576531456629">eSIM மொபைல் நெட்வொர்க்கின் பெயரை மாற்றுதல்</translation> <translation id="4780321648949301421">பக்கத்தை இவ்வாறு சேமி...</translation> <translation id="4780558987886269159">பணிக்கானது</translation> -<translation id="4781633367688946589">புதிய அமர்விற்குச் செல்லுங்கள்</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> உங்கள் டிஜிட்டல் வாலட்டில் உள்ள தனிப்பட்ட தகவல்களைப் பயன்படுத்த விரும்புகிறது.</translation> <translation id="4785719467058219317">இந்த இணையதளத்தில் பதிவுசெய்யப்படாத பாதுகாப்பு விசையைப் பயன்படுத்துகிறீர்கள்</translation> <translation id="4785914069240823137">செதுக்கியதை ரத்துசெய்யும்</translation> @@ -7478,7 +7472,6 @@ <translation id="6180550893222597997"><ph name="APP_NAME" />க்கு எந்தக் கடவுச்சாவியைப் பயன்படுத்த விரும்புகிறீர்கள்?</translation> <translation id="6181218116951226898">சில சமயம் ஆப்ஸ் அவற்றின் பிராண்டிங்கை மாற்றலாம். மாற்றுவதற்கு முன்னர், எல்லா மாற்றங்களையும் ஒரு முறை பார்த்து அவை உங்களுக்கு ஏற்புடையதாக இருப்பதை உறுதிசெய்துகொள்ளுங்கள்.</translation> <translation id="6181431612547969857">பதிவிறக்கம் தடுக்கப்பட்டுள்ளது</translation> -<translation id="6182100780603067202">ஆப்ஸ் ஆடியோவையும் பகிர் (அதன் எல்லாச் சாளரங்களில் இருந்தும்)</translation> <translation id="6183369864942961155">தானியங்கு லைட்/டார்க் தீம்</translation> <translation id="6183773856988300112">உங்கள் பக்கங்களில் வேலை செய்யவும் நீங்கள் வழங்கும் பணிகளை நிறைவுசெய்யவும் தானியங்கு பிரவுசிங்கை Chromeமில் Gemini பயன்படுத்துகிறது. <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation> <translation id="6184099524311454384">தாவல்களைத் தேடுக</translation> @@ -8271,7 +8264,6 @@ <translation id="6754359471209693699">புதிய தேடலைத் தொடங்கும்</translation> <translation id="6754918760968695779">விரைவாகச் சேர்த்தல்</translation> <translation id="6755702685749429945">அகராதியைச் சேர்</translation> -<translation id="6756157672127672536">Google Drive, வெளிப்புறச் சேமிப்பகம், உங்கள் ChromeOS சாதனம் போன்றவற்றில் சேமித்துள்ள ஃபைல்களுக்கான விரைவு அணுகலை Files ஆப்ஸ் வழங்குகிறது.</translation> <translation id="6756643207511618722">பேச்சு இன்ஜின்கள்</translation> <translation id="6757431299485455321">இந்த ஹாட்ஸ்பாட்டைப் பிற சாதனங்கள் கண்டறிய உதவும்.</translation> <translation id="6758056191028427665">எவ்வாறு செயல்படுகிறோம் என்பதை எங்களுக்குத் தெரிவிக்கவும்.</translation> @@ -10011,7 +10003,6 @@ <translation id="794676567536738329">அனுமதிகளை உறுதிப்படுத்து</translation> <translation id="7947962633355574091">வீடியோ முகவரியை ந&கலெடு</translation> <translation id="7947964080535614577">உள்ளடக்கம், சேவைகள் ஆகியவற்றைக் கட்டணமின்றி வழங்குவதற்காக விளம்பரங்களைத் தளங்கள் வழக்கமாகக் காட்டும். ஆனால் சில தளங்கள் குறுக்கிடும்/தவறாக வழிநடத்தும் விளம்பரங்களைக் காட்டலாம்.</translation> -<translation id="7948239795436419268">சாளரங்களை மீட்டெடுக்க வேண்டாம்</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" /> டொமைனின் அனைத்துப் பக்கங்களும்</translation> <translation id="7950629216186736592">காரணம்: http://, https://, file:// URLகள் ஆகியவற்றை மட்டுமே LBSஸில் பயன்படுத்த முடியும்.</translation> <translation id="7950814699499457511">இயக்கப்பட்டுள்ளது • இந்த நீட்டிப்பு, தனியுரிமை நடைமுறைகளை (தரவை எப்படிச் சேகரித்துப் பயன்படுத்தும் போன்றவை)) வெளியிடவில்லை</translation> @@ -11200,7 +11191,6 @@ <translation id="8751034568832412184">பள்ளி</translation> <translation id="8751329102746373229">உங்கள் நிர்வாகியிடம் இருந்து</translation> <translation id="8752451679755290210">திரையில் இருப்பவற்றைத் தானாகவே ஒவ்வொன்றாக ஃபோகஸ் செய்தல்</translation> -<translation id="8753948258138515839">Google Drive, வெளிப்புறச் சேமிப்பகம், உங்கள் ChromeOS Flex சாதனம் போன்றவற்றில் சேமித்துள்ள ஃபைல்களுக்கான விரைவான அணுகலை Files ஆப்ஸ் வழங்குகிறது.</translation> <translation id="8754200782896249056"><p>ஆதரிக்கப்பட்ட டெஸ்க்டாப் சூழலில் <ph name="PRODUCT_NAME" /> இயங்கும்போது, கம்ப்யூட்டர் ப்ராக்ஸி அமைப்புகள் பயன்படுத்தப்படும். எனினும், உங்கள் கம்ப்யூட்டர் ஆதரிக்கப்படாமல் இருக்கலாம் அல்லது உங்கள் கம்ப்யூட்டர் உள்ளமைவை தொடங்குவதில் சிக்கல் இருக்கலாம்.</p> <p>ஆனால் கட்டளை வரியின் வழியாக நீங்கள் இப்போதும் உள்ளமைக்க முடியும். கொடிகள் மற்றும் சூழ்நிலை மாறிகள் தொடர்பான கூடுதல் தகவல்களை அறிய <code>கைமுறை <ph name="PRODUCT_BINARY_NAME" />PRODUCT_BINARY_NAME</code>ஐப் பார்க்கவும்.</p></translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 10d8be59..dbb4352 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -285,7 +285,6 @@ <translation id="117916940443676133">మీ 'సెక్యూరిటీ కీ'కి పిన్ రక్షణ లేదు. సైన్-ఇన్ డేటాను మేనేజ్ చేయడానికి, ముందు పిన్ను క్రియేట్ చేయండి.</translation> <translation id="1179400851034021914">IBAN చెల్లదు</translation> <translation id="1179902906564467236">మీ ఫోన్లోని సూచనలను ఫాలో అవ్వండి లేదా కెమెరా యాప్ను ఉపయోగించండి</translation> -<translation id="1180117276105724040">మీ మునుపటి సెషన్ నుండి విండోలను రీస్టోర్ చేస్తోంది...</translation> <translation id="118057123461613219">భారీ మెమరీ సేవింగ్స్</translation> <translation id="1181037720776840403">తీసివేయండి</translation> <translation id="1182876754474670069">వర్చువల్ హోమ్</translation> @@ -762,7 +761,6 @@ <translation id="151501797353681931">Safari నుండి దిగుమతి చేయబడింది</translation> <translation id="1515163294334130951">ప్రారంభించండి</translation> <translation id="1517467582299994451">కోడ్తో ప్రసారం చేయడానికి, Chrome బ్రౌజర్ సింక్ సెట్టింగ్లను ఆన్ చేయండి</translation> -<translation id="1519090060276706457">విండోలను రీస్టోర్ చేయడానికి ఊహించిన దానికంటే ఎక్కువ సమయం పడుతోంది</translation> <translation id="1521442365706402292">సర్టిఫికెట్లను మేనేజ్ చేయండి</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">ఈ రోజు యాక్టివ్గా ఉంది</translation> @@ -1181,7 +1179,6 @@ <translation id="1796460466266263589">Geminiని ఉపయోగించడాన్ని కొనసాగించడానికి, మీ గుర్తింపును వెరిఫై చేయండి</translation> <translation id="1796588414813960292">సౌండ్ అవసరం అయ్యే ఫీచర్లు పని చేయవు</translation> <translation id="1798726622311813209">క్రెడిట్ & డెబిట్ కార్డ్లు</translation> -<translation id="1799852120691957794">మీ మునుపటి సెషన్ నుండి విండోలను రీస్టోర్ చేయడం సాధ్యం కాలేదు</translation> <translation id="180203835522132923">Search + O, తర్వాత W</translation> <translation id="1802624026913571222">కవర్ మూసి ఉన్నప్పుడు స్లీప్ స్థితికి వెళ్లు</translation> <translation id="1802687198411089702">పేజీ ప్రతిస్పందించడం లేదు. మీరు దాని కోసం వేచి ఉండవచ్చు లేదా మూసివేయవచ్చు.</translation> @@ -2378,7 +2375,6 @@ <translation id="2610374175948698697">మీ పరికరంలో ఫైళ్లు లేదా ఫోల్డర్లను చూడవచ్చు</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">మీ Microsoft ఖాతాకు సైన్ ఇన్ చేసి, ఆపై మళ్లీ ట్రై చేయండి</translation> -<translation id="2611702650078660078">ఎర్రర్ ఏర్పడింది</translation> <translation id="2611776654555141051">దీర్ఘచతురస్ర టూల్</translation> <translation id="2611885296070244383">మైక్ (ఇంటర్నల్)</translation> <translation id="2612676031748830579">కార్డ్ నంబర్</translation> @@ -2742,7 +2738,6 @@ <translation id="285033512555869047">మూసివేసి ఉంది</translation> <translation id="2850541429955027218">థీమ్ను జోడించండి</translation> <translation id="2851291081585704741">మీరు ఆఫ్లైన్లో ఉన్నారు</translation> -<translation id="2852045827873867442">ఇంటర్నెట్ కనెక్షన్ అవసరం.</translation> <translation id="285237063405807022">(లోడ్ అవుతోంది)</translation> <translation id="2853121255651601031">పాస్వర్డ్ సేవ్ చేయబడింది</translation> <translation id="2854453262159518435">ఇప్పటికే ఉన్న ట్యాబ్ గ్రూప్ను రీప్లేస్ చేయండి</translation> @@ -5498,7 +5493,6 @@ <translation id="4779766576531456629">eSIM సెల్యులర్ నెట్వర్క్కు పేరు మార్చండి</translation> <translation id="4780321648949301421">ఇలా పేజీని సేవ్ చేయండి...</translation> <translation id="4780558987886269159">ఆఫీస్ కోసం</translation> -<translation id="4781633367688946589">కొత్త సెషన్ను కొనసాగించండి</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> మీ డిజిటల్ వాలెట్ నుండి వ్యక్తిగత సమాచారాన్ని ఉపయోగించాలనుకుంటోంది.</translation> <translation id="4785719467058219317">మీరు ఈ వెబ్సైట్తో నమోదు కాని సెక్యూరిటీ కీని ఉపయోగిస్తున్నారు</translation> <translation id="4785914069240823137">కత్తిరింపును రద్దు చేయండి</translation> @@ -7473,7 +7467,6 @@ <translation id="6180550893222597997"><ph name="APP_NAME" /> కోసం మీరు ఏ పాస్-కీని ఉపయోగించాలనుకుంటున్నారు?</translation> <translation id="6181218116951226898">యాప్ల విషయంలో కొన్నిసార్లు వాటి బ్రాండింగ్ అప్డేట్ అవుతుంది. అప్డేట్ చేసే ముందు అవి మీకు అనుకూలంగా ఉన్నాయని నిర్ధారించుకోవడానికి అన్ని మార్పులను రివ్యూ చేయండి.</translation> <translation id="6181431612547969857">డౌన్లోడ్ బ్లాక్ చేయబడింది</translation> -<translation id="6182100780603067202">అప్లికేషన్ ఆడియోను (దాని అన్ని విండోల నుండి) కూడా షేర్ చేయండి</translation> <translation id="6183369864942961155">ఆటోమేటిక్ లేత రంగు రూపం/డార్క్ థీమ్</translation> <translation id="6183773856988300112">Chromeలో Gemini మీ ట్యాబ్లలో పని చేయడానికి, మీరు ఇచ్చిన టాస్క్లను పూర్తి చేయడానికి ఆటోమేటిక్ బ్రౌజ్ను ఉపయోగిస్తుంది. <ph name="LINK_BEGIN" />మరింత తెలుసుకోండి<ph name="LINK_END" /></translation> <translation id="6184099524311454384">ట్యాబ్లలో సెర్చ్ చేయండి</translation> @@ -8266,7 +8259,6 @@ <translation id="6754359471209693699">కొత్త సెర్చ్ను ప్రారంభించండి</translation> <translation id="6754918760968695779">క్విక్ ఇన్సర్ట్</translation> <translation id="6755702685749429945">డిక్షనరీని జోడించండి</translation> -<translation id="6756157672127672536">మీరు Google Drive, బాహ్య స్టోరేజ్ లేదా మీ ChromeOS పరికరంలో సేవ్ చేసిన ఫైల్స్కు Files యాప్, క్విక్ యాక్సెస్ను అందిస్తుంది.</translation> <translation id="6756643207511618722">స్పీచ్ ఇంజిన్లు</translation> <translation id="6757431299485455321">ఈ హాట్స్పాట్ను కనుగొనడానికి ఇతర పరికరాలకు సహాయపడండి.</translation> <translation id="6758056191028427665">మేము అందించే సేవలు ఎలా ఉన్నాయో మాకు తెలియజేయండి.</translation> @@ -10006,7 +9998,6 @@ <translation id="794676567536738329">అనుమతులు నిర్ధారించండి</translation> <translation id="7947962633355574091">వీడియో అడ్రస్ను కా&పీ చేయండి</translation> <translation id="7947964080535614577">సైట్లు సాధారణంగా యాడ్లను చూపిస్తాయి, తద్వారా అవి కంటెంట్ లేదా సర్వీస్లను ఎటువంటి ఛార్జీ లేకుండా అందించగలవు. కానీ, కొన్ని సైట్లు అనుచితమైన లేదా తప్పుదారి పట్టించే యాడ్లను చూపిస్తాయి.</translation> -<translation id="7948239795436419268">విండోలను రీస్టోర్ చేయవద్దు</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" />లోని అన్ని పేజీలు</translation> <translation id="7950629216186736592">కారణం: LBS http://, https://, file:// URLలను మాత్రమే సపోర్ట్ చేస్తాయి.</translation> <translation id="7950814699499457511">ఆన్లో ఉంది • ఈ ఎక్స్టెన్షన్ అది డేటాను ఎలా సేకరిస్తుంది, దాన్ని ఎలా ఉపయోగిస్తుంది వంటి గోప్యతా పద్ధతులను పబ్లిష్ చేయలేదు</translation> @@ -11192,7 +11183,6 @@ <translation id="8751034568832412184">స్కూల్</translation> <translation id="8751329102746373229">మీ అడ్మినిస్ట్రేటర్ నుండి</translation> <translation id="8752451679755290210">ఆటోమేటిక్గా ఐటెమ్లను మార్చండి</translation> -<translation id="8753948258138515839">మీరు Google Drive, బాహ్య స్టోరేజ్ లేదా మీ ChromeOS Flex పరికరంలో సేవ్ చేసిన ఫైల్స్కు Files యాప్, క్విక్ యాక్సెస్ను అందిస్తుంది.</translation> <translation id="8754200782896249056"><p>When running <ph name="PRODUCT_NAME" />ను మద్దతు ఉన్న డెస్క్టాప్ పరిసరంలో అమలు చేస్తున్నప్పుడు, సిస్టమ్ ప్రాక్సీ సెట్టింగ్లు ఉపయోగించబడతాయి. అయితే, మీ సిస్టమ్ మద్దతు ఇవ్వడం లేదు లేదా మీ సిస్టమ్ కాన్ఫిగరేషన్ను ప్రారంభించడంలో సమస్య ఉంది.</p> <p>కానీ మీరు ఇప్పటికీ ఆదేశ పంక్తి ద్వారా కాన్ఫిగర్ చేయవచ్చు. దయచేసి ఫ్లాగ్లు మరియు పరిసర చరరాశులకు సంబంధించిన మరింత సమాచారం కోసం <code>man <ph name="PRODUCT_BINARY_NAME" /></code> ని సందర్శించండి.</p></translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 47eea41..f85614ac 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">ดาวน์โหลดไฟล์คำอธิบายประกอบของโหนดหลักไม่ได้ โปรดลองอีกครั้งในภายหลัง</translation> <translation id="1103523840287552314">แปลภาษา<ph name="LANGUAGE" />ทุกครั้ง</translation> <translation id="1104098698795583187">คุณจะเสียสิทธิ์เข้าถึงกลุ่มแท็บนี้ทันที และระบบจะลบกลุ่มออกจากอุปกรณ์ทั้งหมดของคุณ</translation> +<translation id="1105934302947321130">Google Beam with Zoom</translation> <translation id="1106270460549661906">เลิกแชร์กับ Gemini</translation> <translation id="1106350001632362876">เพิ่มเกณฑ์</translation> <translation id="110850812463801904">เชื่อมต่อกับ OneDrive ด้วยตนเอง</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">คีย์ความปลอดภัยไม่มีการป้องกันด้วย PIN หากต้องการจัดการข้อมูลการลงชื่อเข้าใช้ ให้สร้าง PIN ขึ้นมาก่อน</translation> <translation id="1179400851034021914">IBAN ไม่ถูกต้อง</translation> <translation id="1179902906564467236">ทำตามวิธีการในโทรศัพท์หรือใช้แอปกล้อง</translation> -<translation id="1180117276105724040">กำลังคืนค่าหน้าต่างจากเซสชันก่อนหน้า...</translation> <translation id="118057123461613219">ประหยัดหน่วยความจำได้มากเป็นอย่างยิ่ง</translation> <translation id="1181037720776840403">นำออก</translation> <translation id="1182876754474670069">Home</translation> @@ -761,12 +761,12 @@ <translation id="151501797353681931">นำเข้าจาก Safari</translation> <translation id="1515163294334130951">เริ่มต้น</translation> <translation id="1517467582299994451">หากต้องการแคสต์ด้วยรหัส ให้เปิดการตั้งค่าการซิงค์เบราว์เซอร์ Chrome</translation> -<translation id="1519090060276706457">การคืนค่าหน้าต่างใช้เวลานานกว่าที่คาดไว้</translation> <translation id="1521442365706402292">จัดการใบรับรอง</translation> <translation id="1521655867290435174">Google ชีต</translation> <translation id="1521774566618522728">ใช้งานวันนี้</translation> <translation id="1521933835545997395">เชื่อมต่อกับโทรศัพท์ Android แล้ว</translation> <translation id="1523279371236772909">ดูในเดือนที่ผ่านมา</translation> +<translation id="1523486680453956384">ดูงาน</translation> <translation id="1523978563989812243">เครื่องมือการอ่านออกเสียงข้อความ</translation> <translation id="1524563461097350801">ไม่เป็นไร ขอบคุณ</translation> <translation id="1525740877599838384">ใช้ Wi-Fi เพื่อระบุตำแหน่งเท่านั้น</translation> @@ -1088,8 +1088,10 @@ <translation id="1732380773380808394">อีกทั้งคุณยังรับรหัสผ่านและข้อมูลอื่นๆ จากบัญชี Google ได้ด้วย</translation> <translation id="1734212868489994726">สีฟ้าอ่อน</translation> <translation id="1734824808160898225"><ph name="PRODUCT_NAME" /> อาจอัปเดตตัวเองตลอดเวลาไม่ได้</translation> +<translation id="1735636854292329504"><ph name="TASK_TITLE" />\nฉันกำลังทำงานของคุณ และจะแจ้งให้คุณทราบหากต้องดำเนินการเพิ่มเติม</translation> <translation id="1735983780784385591">นำเข้าจาก Linux</translation> <translation id="173628468822554835">รับทราบ โดยค่าเริ่มต้นแล้ว เว็บไซต์ใหม่ที่คุณเข้าชมจะไม่ส่งการแจ้งเตือนให้คุณ</translation> +<translation id="1737228213718001685">กำลังทำงานของคุณ</translation> <translation id="1737968601308870607">ข้อบกพร่องของไฟล์</translation> <translation id="1740414789702358061"><ph name="SITE_ACCESS" /> เลือกเพื่อเปลี่ยนสิทธิ์ของเว็บไซต์</translation> <translation id="1741190788710022490">การชาร์จแบบปรับอัตโนมัติ</translation> @@ -1099,6 +1101,7 @@ <translation id="1745732479023874451">จัดการรายชื่อติดต่อ</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{เปิดและแก้ไข # ไฟล์ในเว็บแอปนี้ใช่ไหม}}</translation> <translation id="1748563609363301860">คุณบันทึกรหัสผ่านนี้ได้ในบัญชี Google หรือเฉพาะในอุปกรณ์นี้</translation> +<translation id="1749645492410897998">กำลังติดตั้งซอฟต์แวร์</translation> <translation id="1749733017156547309">ต้องระบุรหัสผ่าน</translation> <translation id="1750172676754093297">คีย์ความปลอดภัยบันทึกลายนิ้วมือไม่ได้</translation> <translation id="1750238553597293878">ใช้รหัสผ่านในบัญชี Google ต่อไป</translation> @@ -1170,7 +1173,6 @@ <translation id="1796460466266263589">ยืนยันว่าเป็นคุณเพื่อใช้ Gemini ต่อ</translation> <translation id="1796588414813960292">ฟีเจอร์ที่ต้องใช้เสียงจะไม่ทำงาน</translation> <translation id="1798726622311813209">บัตรเครดิตและบัตรเดบิต</translation> -<translation id="1799852120691957794">กู้คืนหน้าต่างจากเซสชันก่อนหน้าไม่ได้</translation> <translation id="180203835522132923">ค้นหา + O ตามด้วย W</translation> <translation id="1802624026913571222">สลีปเมื่อปิดเคส</translation> <translation id="1802687198411089702">หน้านี้ไม่ตอบสนอง คุณจะรอหรือออกก็ได้</translation> @@ -2128,6 +2130,7 @@ <translation id="2450849356604136918">ไม่มีมุมมองที่เปิดอยู่</translation> <translation id="2451298179137331965">2x</translation> <translation id="2453045048779611513">องค์กรของคุณจำกัดสิ่งที่คุณสามารถบันทึก</translation> +<translation id="245307875355990880">กลับมาทำงานอีกครั้ง</translation> <translation id="245322989586167203">โดยปกติแล้วเว็บไซต์จะเชื่อมต่อกับพอร์ตอนุกรมเพื่อดำเนินการตามฟีเจอร์ในการโอนข้อมูล เช่น การตั้งค่าเครือข่าย</translation> <translation id="2453860139492968684">เสร็จสิ้น</translation> <translation id="2454206500483040640">แบ่งพาร์ติชันแล้ว</translation> @@ -2192,6 +2195,7 @@ <translation id="2485681265915754872">ข้อกำหนดในการให้บริการของ Google Play</translation> <translation id="248676429071089168">ปัดขึ้นเพื่อเลื่อนหน้าลง</translation> <translation id="2487067538648443797">เพิ่มบุ๊กมาร์กใหม่</translation> +<translation id="2487602042876349837"><ph name="VIEW_ONE_ORIENTATION" /> ดูเลย กว้าง <ph name="VIEW_ONE_PERCENT" />, <ph name="VIEW_TWO_ORIENTATION" /> ดูเลย กว้าง <ph name="VIEW_TWO_PERCENT" /></translation> <translation id="2489686758589235262">กำหนดสวิตช์เพิ่มอีก 2 อัน</translation> <translation id="2489829450872380594">โทรศัพท์เครื่องใหม่จะปลดล็อก <ph name="DEVICE_TYPE" /> เครื่องนี้ในครั้งถัดไป คุณปิด Smart Lock ได้ในการตั้งค่า</translation> <translation id="2489918096470125693">เพิ่ม&โฟลเดอร์...</translation> @@ -2361,7 +2365,6 @@ <translation id="2610374175948698697">ดูไฟล์หรือโฟลเดอร์ในอุปกรณ์ได้</translation> <translation id="2610780100389066815">การรับรองรายการที่เชื่อถือของ Microsoft</translation> <translation id="261114180663074524">ลงชื่อเข้าใช้บัญชี Microsoft แล้วลองอีกครั้ง</translation> -<translation id="2611702650078660078">เกิดข้อผิดพลาด</translation> <translation id="2611776654555141051">เครื่องมือสี่เหลี่ยมผืนผ้า</translation> <translation id="2611885296070244383">ไมค์ (ภายใน)</translation> <translation id="2612676031748830579">หมายเลขบัตร</translation> @@ -2725,7 +2728,6 @@ <translation id="285033512555869047">ปิดอยู่</translation> <translation id="2850541429955027218">เพิ่มธีม</translation> <translation id="2851291081585704741">คุณออฟไลน์อยู่</translation> -<translation id="2852045827873867442">ต้องมีการเชื่อมต่ออินเทอร์เน็ต</translation> <translation id="285237063405807022">(กำลังโหลด)</translation> <translation id="2853121255651601031">บันทึกรหัสผ่านแล้ว</translation> <translation id="2854453262159518435">แทนที่กลุ่มแท็บที่มีอยู่</translation> @@ -3590,6 +3592,7 @@ <translation id="3473241910002674503">ไปยังหน้าแรก ย้อนกลับ และสลับแอปด้วยปุ่มในโหมดแท็บเล็ต</translation> <translation id="3473479545200714844">แว่นขยายหน้าจอ</translation> <translation id="3474218480460386727">ใช้ตัวอักษรไม่เกิน 99 ตัวสำหรับคำใหม่</translation> +<translation id="3474330892505468100">Google Beam with Meet</translation> <translation id="3474624961160222204">ดำเนินการต่อในชื่อ <ph name="NAME" /></translation> <translation id="3477772589943384839">ประหยัดหน่วยความจำได้ปานกลาง แท็บจะไม่ทำงานหลังจากผ่านไปช่วงระยะเวลาหนึ่ง</translation> <translation id="347785443197175480">อนุญาตให้ <ph name="HOST" /> เข้าถึงกล้องถ่ายรูปและไมโครโฟนของคุณต่อไป</translation> @@ -4605,6 +4608,7 @@ <translation id="4152011295694446843">คุณจะเห็นบุ๊กมาร์กที่นี่</translation> <translation id="4152670763139331043">{NUM_TABS,plural, =1{1 แท็บ}other{# แท็บ}}</translation> <translation id="4153858337812834972">แท็บล่าสุด</translation> +<translation id="4154323711269699738">หยุดงานชั่วคราวแล้ว</translation> <translation id="4154658846204884961">ดาวหาง</translation> <translation id="4154664944169082762">ลายนิ้วมือ</translation> <translation id="4156297721709710037"><ph name="WINDOW_TITLE" /> - มุมมองด้านซ้าย</translation> @@ -4829,6 +4833,7 @@ <translation id="4314497418046265427">เพิ่มประสิทธิภาพการทำงานเมื่อคุณเชื่อมต่อโทรศัพท์กับ <ph name="DEVICE_TYPE" /></translation> <translation id="4314561087119792062">เพิ่มชื่อจุดเข้าใช้งานใหม่</translation> <translation id="4314815835985389558">จัดการการซิงค์</translation> +<translation id="4314821834464582073">หยุดงานชั่วคราว</translation> <translation id="4316850752623536204">เว็บไซต์นักพัฒนาซอฟต์แวร์</translation> <translation id="43176328751044557">{NUM_SITES,plural, =1{นำสิทธิ์สำหรับ 1 เว็บไซต์ออกแล้ว}other{นำสิทธิ์สำหรับ {NUM_SITES} เว็บไซต์ออกแล้ว}}</translation> <translation id="4317733381297736564">การซื้อในแอป</translation> @@ -5476,7 +5481,6 @@ <translation id="4779766576531456629">เปลี่ยนชื่อเครือข่ายมือถือของ eSIM</translation> <translation id="4780321648949301421">บันทึกหน้าเป็น...</translation> <translation id="4780558987886269159">สำหรับการทำงาน</translation> -<translation id="4781633367688946589">ดำเนินการต่อไปยังเซสชันใหม่</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> ต้องการใช้ข้อมูลส่วนบุคคลจากกระเป๋าเงินดิจิทัล</translation> <translation id="4785719467058219317">คุณกำลังใช้คีย์ความปลอดภัยที่ไม่ได้ลงทะเบียนกับเว็บไซต์นี้</translation> <translation id="4785914069240823137">ยกเลิกการครอบตัด</translation> @@ -6263,6 +6267,7 @@ <translation id="5337926771328966926">อุปกรณ์ปัจจุบันชื่อ <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">คุณจะท่องเว็บแบบส่วนตัวได้โดยใช้หน้าต่างที่ไม่ระบุตัวตน</translation> <translation id="5338503421962489998">พื้นที่จัดเก็บในตัวเครื่อง</translation> +<translation id="5340620183031438925">หากต้องการถามโหมด AI เกี่ยวกับแท็บโดยไม่ต้องออกจากหน้า ให้ยืนยันตัวตน นอกจากนี้ คุณยังรับรหัสผ่านและข้อมูลอื่นๆ ในอุปกรณ์ทุกเครื่องได้ด้วย</translation> <translation id="5340787663756381836">ค้นหาและแก้ไข</translation> <translation id="5340900621595888432">ส่งข้อมูลการวินิจฉัยและการใช้งาน</translation> <translation id="5341793073192892252">บล็อกคุกกี้ต่อไปนี้แล้ว (บล็อกคุกกี้ของบุคคลที่สามอยู่โดยไม่มีข้อยกเว้น)</translation> @@ -7446,7 +7451,6 @@ <translation id="6180550893222597997">คุณต้องการใช้พาสคีย์ใดสําหรับ "<ph name="APP_NAME" />"</translation> <translation id="6181218116951226898">บางครั้งแอปจะอัปเดตการสร้างแบรนด์ของตน โปรดตรวจสอบการเปลี่ยนแปลงทั้งหมดเพื่อให้แน่ใจว่าคุณพอใจกับการเปลี่ยนแปลงเหล่านั้นก่อนทำการอัปเดต</translation> <translation id="6181431612547969857">การดาวน์โหลดถูกบล็อก</translation> -<translation id="6182100780603067202">แชร์เสียงของแอปพลิเคชันด้วย (จากหน้าต่างทั้งหมด)</translation> <translation id="6183369864942961155">ธีมสว่าง/ธีมมืดอัตโนมัติ</translation> <translation id="6183773856988300112">Gemini ใน Chrome ใช้การท่องเว็บอัตโนมัติเพื่อทำงานในแท็บและดำเนินงานที่คุณมอบหมายให้เสร็จสมบูรณ์ <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> <translation id="6184099524311454384">ค้นหาแท็บ</translation> @@ -7704,6 +7708,7 @@ <translation id="6367097275976877956">คุณต้องการเปิดใช้งาน ChromeVox ซึ่งเป็นโปรแกรมอ่านหน้าจอในตัวสำหรับ Chrome OS ไหม ถ้าต้องการ ให้กดแป้นเว้นวรรค</translation> <translation id="6367196786591004737">ลบรายการข้อมูล</translation> <translation id="6367396429435748845">กด <ph name="ALT" /> + <ph name="LAUNCHER" /> + <ph name="NUM_4" /> เพื่อหยุดชั่วคราวและใช้งานแป้นเมาส์ต่อ</translation> +<translation id="6367428649223439405"><ph name="TASK_TITLE" />\nฉันได้หยุดงานของคุณชั่วคราวแล้ว</translation> <translation id="6367853307713830174">Gemini จะแสดงขั้นตอนและพยายามยืนยันก่อนดำเนินการขั้นตอนที่ละเอียดอ่อน ซึ่งคุณสามารถหยุดหรือควบคุมได้ทุกเมื่อ</translation> <translation id="6367985768157257101">ต้องการรับด้วยการแชร์ใกล้เคียงไหม</translation> <translation id="6368157733310917710">ที่อยู่และอื่นๆ</translation> @@ -8238,7 +8243,6 @@ <translation id="6754359471209693699">เริ่มค้นหาใหม่</translation> <translation id="6754918760968695779">Quick Insert</translation> <translation id="6755702685749429945">เพิ่มพจนานุกรม</translation> -<translation id="6756157672127672536">แอป Files ให้การเข้าถึงไฟล์ที่คุณบันทึกไว้ใน Google ไดรฟ์ ที่จัดเก็บข้อมูลภายนอก หรืออุปกรณ์ Chrome OS ของคุณอย่างรวดเร็ว</translation> <translation id="6756643207511618722">เครื่องมืออ่านออกเสียง</translation> <translation id="6757431299485455321">ช่วยให้อุปกรณ์อื่นค้นพบฮอตสปอตนี้</translation> <translation id="6758056191028427665">แจ้งให้เราทราบถึงความพึงพอใจ</translation> @@ -8435,6 +8439,7 @@ <translation id="6870953451576517204">การทดสอบด้วยตนเองสำเร็จ</translation> <translation id="6871644448911473373">OCSP Responder: <ph name="LOCATION" /></translation> <translation id="6871860225073478239">ภาษา...</translation> +<translation id="6872859537300194762"><ph name="TASK_TITLE" />\nฉันได้หยุดงานของคุณไว้ชั่วคราวเนื่องจากมีกิจกรรมอื่น คุณกลับไปที่ Chrome เพื่อดูได้เมื่อพร้อม</translation> <translation id="6873571253135628430">เปลี่ยนสิทธิ์ของเว็บไซต์</translation> <translation id="6876155724392614295">จักรยาน</translation> <translation id="6876469544038980967">ไม่มีประโยชน์</translation> @@ -9184,6 +9189,7 @@ <translation id="7406912950279255498">โหมดการกลับสี</translation> <translation id="7407430846095439694">นำเข้าและเชื่อมโยง</translation> <translation id="7407504355934009739">คนส่วนใหญ่บล็อกการแจ้งเตือนจากเว็บไซต์นี้</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> มีข้อมูลที่ละเอียดอ่อน องค์กรจะอนุญาตให้คุณบันทึกลงในพื้นที่เก็บข้อมูลระบบคลาวด์หรือทิ้ง</translation> <translation id="7408080603962564527">ผู้อื่นจะมองเห็นข้อมูลนี้</translation> <translation id="740810853557944681">เพิ่มเซิร์ฟเวอร์การพิมพ์</translation> <translation id="7409549334477097887">ใหญ่พิเศษ</translation> @@ -9236,6 +9242,7 @@ <translation id="7434969625063495310">เพิ่มเซิร์ฟเวอร์การพิมพ์ไม่ได้ โปรดตรวจสอบการกำหนดค่าของเซิร์ฟเวอร์แล้วลองอีกครั้ง</translation> <translation id="7436921188514130341">แย่จัง! เกิดข้อผิดพลาดในระหว่างการตั้งชื่อ</translation> <translation id="7439519621174723623">เพิ่มชื่ออุปกรณ์เพื่อดำเนินการต่อ</translation> +<translation id="743982235360757672">ให้โหมด AI อยู่ใกล้มือเสมอขณะท่องเว็บ</translation> <translation id="7441736532026945583">เลือก "ซ่อนกลุ่ม" เพื่อนำกลุ่มออกจากแนวแท็บ</translation> <translation id="7441736921018636843">หากต้องการเปลี่ยนการตั้งค่านี้ ให้<ph name="BEGIN_LINK" />รีเซ็ตการซิงค์<ph name="END_LINK" />เพื่อนำรหัสผ่านการซิงค์ออก</translation> <translation id="7441830548568730290">ผู้ใช้รายอื่น</translation> @@ -9245,6 +9252,7 @@ <translation id="7444176988908839653">{COUNT,plural, =0{คุกกี้จะถูกบล็อกอีกครั้งในวันนี้}=1{คุกกี้จะถูกบล็อกอีกครั้งในวันพรุ่งนี้}other{คุกกี้จะถูกบล็อกอีกครั้งในอีก # วัน}}</translation> <translation id="7446716846072322308">การดำเนินการนี้จะลบข้อมูลที่ <ph name="SITE_NAME" /> และเว็บไซต์ที่เกี่ยวข้องจัดเก็บไว้รวมทั้งสิ้น <ph name="TOTAL_USAGE" /></translation> <translation id="7448430327655618736">ติดตั้งแอปโดยอัตโนมัติ</translation> +<translation id="7448639287059644731"><ph name="TASK_TITLE" />\nฉันต้องการความช่วยเหลือจากคุณเพื่อทำงานของคุณต่อ</translation> <translation id="7448664748118305024">ลบเว็บไซต์ข้อมูลที่บันทึกไว้ในอุปกรณ์เมื่อคุณปิดหน้าต่างทั้งหมด</translation> <translation id="7450761244949417357">เปิดอยู่ใน <ph name="ALTERNATIVE_BROWSER_NAME" /></translation> <translation id="7450926666485653189">นำเฉพาะบางส่วนของ URL มาปรับให้ยากต่อการอ่าน (Obfuscate) แล้วส่งไปยัง Google ผ่านเซิร์ฟเวอร์ส่วนตัวที่ซ่อนที่อยู่ IP ของคุณ</translation> @@ -9973,7 +9981,6 @@ <translation id="794676567536738329">ยืนยันการอนุญาต</translation> <translation id="7947962633355574091">คัด&ลอกที่อยู่วิดีโอ</translation> <translation id="7947964080535614577">โดยปกติแล้วเว็บไซต์จะแสดงโฆษณาเพื่อให้จัดเตรียมเนื้อหาหรือให้บริการได้โดยไม่คิดค่าใช้จ่าย แต่บางเว็บไซต์นั้นเป็นที่ทราบว่าแสดงโฆษณาที่รบกวนหรือทำให้เข้าใจผิด</translation> -<translation id="7948239795436419268">ไม่คืนค่าหน้าต่าง</translation> <translation id="7948407723851303488">ทุกหน้าของ <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">เหตุผล: LBS รองรับ URL รูปแบบ http://, https:// และ file:// เท่านั้น</translation> <translation id="7950814699499457511">เปิด • ส่วนขยายนี้ไม่ได้เผยแพร่หลักปฏิบัติเกี่ยวกับนโยบายความเป็นส่วนตัว เช่น วิธีเก็บรวบรวมและใช้ข้อมูล</translation> @@ -11134,6 +11141,7 @@ <translation id="8732844209475700754">การตั้งค่าเพิ่มเติมเกี่ยวกับความเป็นส่วนตัว ความปลอดภัย และการรวบรวมข้อมูล</translation> <translation id="8733779588180110397">⌥+คลิก</translation> <translation id="8734755021067981851">ไม่ได้ต่ออุปกรณ์ USB</translation> +<translation id="8735290640701782320">ตรวจสอบสิ่งที่คุณต้องทำ</translation> <translation id="8736288397686080465">มีการอัปเดตไซต์นี้ในพื้นหลัง</translation> <translation id="8737709691285775803">Shill</translation> <translation id="8737914367566358838">เลือกภาษาปลายทางของหน้าเว็บ</translation> @@ -11161,7 +11169,6 @@ <translation id="8751034568832412184">โรงเรียน</translation> <translation id="8751329102746373229">จากผู้ดูแลระบบ</translation> <translation id="8752451679755290210">เลื่อนไปยังรายการต่างๆ โดยอัตโนมัติ</translation> -<translation id="8753948258138515839">แอป Files มอบการเข้าถึงไฟล์ที่คุณบันทึกไว้ใน Google ไดรฟ์ ที่จัดเก็บข้อมูลภายนอก หรืออุปกรณ์ Chrome OS Flex อย่างรวดเร็ว</translation> <translation id="8754200782896249056"><p>เมื่อเรียกใช้ <ph name="PRODUCT_NAME" /> ภายใต้สภาพแวดล้อมของเดสก์ท็อปที่สนับสนุน จะมีการใช้การตั้งค่าพร็อกซีของระบบ อย่างไรก็ตาม ระบบของคุณอาจไม่ได้รับการสนับสนุนหรือมีปัญหาในการเปิดการกำหนดค่าระบบ</p> <p>แต่คุณยังคงสามารถกำหนดค่าผ่านบรรทัดคำสั่งได้ โปรดดูที่ <code>man <ph name="PRODUCT_BINARY_NAME" /></code> สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าสถานะและตัวแปรแวดล้อม</p></translation> @@ -11528,6 +11535,7 @@ <translation id="8999560016882908256">ข้อผิดพลาดทางไวยากรณ์ของส่วน: <ph name="ERROR_LINE" /></translation> <translation id="8999651235576960439">การเคลื่อนไหวบนหน้าจอลดลง</translation> <translation id="9000185763019430629">แตะเซ็นเซอร์ลายนิ้วมือที่ด้านขวาของ <ph name="DEVICE_TYPE" /> ข้อมูลลายนิ้วมือจะจัดเก็บไว้อย่างปลอดภัยและอยู่ใน <ph name="DEVICE_TYPE" /> ของคุณเสมอ</translation> +<translation id="9000341229894259710"><ph name="TASK_TITLE" />\nฉันดำเนินการตามคำขอของคุณได้ ซึ่งคุณสามารถดูใน Chrome</translation> <translation id="9000529821022336229">ไม่พบการติดตั้งโปรแกรมอัปเดต</translation> <translation id="900267527532832868">พาสคีย์นี้ใช้งานไม่ได้แล้ว ระบบจะลบออกจาก <ph name="GOOGLE_PASSWORD_MANAGER" /> ในเร็วๆ นี้</translation> <translation id="9003031149571024583">ป้อนหมายเลข PIN ลำดับที่ <ph name="NUM_DIGIT" /> จาก 6 กด Backspace หรือ Delete เพื่อนำตัวเลขสุดท้ายออก</translation> @@ -11953,6 +11961,7 @@ <translation id="992778845837390402">กำลังดำเนินการสำรองข้อมูล Linux</translation> <translation id="994087375490600917">แผงด้านข้าง</translation> <translation id="994289308992179865">ว&นกลับ</translation> +<translation id="995420352808264005">เลือกประเภทการลงทะเบียนอุปกรณ์</translation> <translation id="995755448277384931">เพิ่ม IBAN</translation> <translation id="996250603853062861">กำลังทำการเชื่อมต่ออย่างปลอดภัย...</translation> <translation id="997143476478634194">เว็บไซต์จะดำเนินการตามการตั้งค่านี้โดยอัตโนมัติเมื่อคุณเข้าชม เว็บไซต์มักจะส่งการแจ้งเตือนเพื่อแจ้งให้คุณทราบเกี่ยวกับข่าวด่วนหรือข้อความแชท</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 4b1b80d..84ca8b3 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Ana düğüm ek açıklama dosyaları indirilemiyor. Daha sonra tekrar deneyin.</translation> <translation id="1103523840287552314"><ph name="LANGUAGE" /> dilini daima çevir</translation> <translation id="1104098698795583187">Sekme grubuna erişiminizi anında kaybedersiniz ve grup tüm cihazlarınızdan silinir</translation> +<translation id="1105934302947321130">Zoom içeren Google Beam</translation> <translation id="1106270460549661906">Gemini ile paylaşımı kaldır</translation> <translation id="1106350001632362876">Eşiği artır</translation> <translation id="110850812463801904">OneDrive'a manuel olarak bağlanın</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Güvenlik anahtarınız PIN ile korunmuyor. Oturum açma verilerini yönetmek için önce PIN oluşturun.</translation> <translation id="1179400851034021914">IBAN geçersiz</translation> <translation id="1179902906564467236">Telefonunuzdaki talimatları uygulayın veya kamera uygulamasını kullanın</translation> -<translation id="1180117276105724040">Önceki oturumunuzdaki pencereler geri yükleniyor...</translation> <translation id="118057123461613219">Çok büyük tasarruf</translation> <translation id="1181037720776840403">Kaldır</translation> <translation id="1182876754474670069">home</translation> @@ -761,7 +761,6 @@ <translation id="151501797353681931">Safari'den Aktarıldı</translation> <translation id="1515163294334130951">Başlat</translation> <translation id="1517467582299994451">Kod kullanarak yayınlamak için Chrome tarayıcı senkronizasyon ayarlarını etkinleştirin</translation> -<translation id="1519090060276706457">Pencerelerin geri yüklenmesi beklenenden uzun sürüyor</translation> <translation id="1521442365706402292">Sertifikaları yönet</translation> <translation id="1521655867290435174">Google E-Tablolar</translation> <translation id="1521774566618522728">Bugün etkindi</translation> @@ -1102,6 +1101,7 @@ <translation id="1745732479023874451">Kişileri yönet</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{# dosyayı bu web uygulamasında açıp düzenlemek istiyor musunuz?}}</translation> <translation id="1748563609363301860">Bu şifreyi Google Hesabınızda veya yalnızca bu cihazda kaydedebilirsiniz</translation> +<translation id="1749645492410897998">Yazılım yükleniyor</translation> <translation id="1749733017156547309">Bir şifre gerekli</translation> <translation id="1750172676754093297">Güvenlik anahtarınız parmak izlerinizi depolayamaz</translation> <translation id="1750238553597293878">Google Hesabınızdaki şifreleri kullanmaya devam edin</translation> @@ -1173,7 +1173,6 @@ <translation id="1796460466266263589">Gemini'ı kullanmaya devam etmek için kimliğinizi doğrulayın</translation> <translation id="1796588414813960292">Ses kullanılmasını gerektiren özellikler çalışmaz</translation> <translation id="1798726622311813209">Kredi ve banka kartları</translation> -<translation id="1799852120691957794">Önceki oturumunuzdaki pencereler geri yüklenemiyor</translation> <translation id="180203835522132923">Ara + O, ardından W</translation> <translation id="1802624026913571222">Kapak kapatıldığında uyku moduna geç</translation> <translation id="1802687198411089702">Sayfa yanıt vermiyor. Sayfanın yanıt vermesini bekleyebilir veya sayfadan çıkabilirsiniz.</translation> @@ -1738,7 +1737,7 @@ <translation id="2182058453334755893">Panonuza Kopyalandı</translation> <translation id="2182419606502127232">Sunucu günlüklerimi ekle.</translation> <translation id="2183570493397356669">Devam düğmesi devre dışı bırakıldı</translation> -<translation id="2184272387334793084">Yer işaretlerinize, şifrelerinize ve daha fazlasına tüm cihazlarınızdan ulaşmak için oturum açın.</translation> +<translation id="2184272387334793084">Yer işaretlerinize, şifrelerinize ve daha fazlasına tüm cihazlarınızdan ulaşmak için oturum açın</translation> <translation id="2184515124301515068">Sitelerin ne zaman ses çalacağını Chrome'un seçmesine izin verin (önerilir)</translation> <translation id="2184754597051264978">Gemini artık <ph name="URL" /> sitesinde sizin adınıza oturum açamayacak</translation> <translation id="2186206192313702726">Google Lens</translation> @@ -2364,7 +2363,6 @@ <translation id="2610374175948698697">Cihazınızdaki dosyaları veya klasörleri görüntüleyebilir</translation> <translation id="2610780100389066815">Microsoft Güven Listesi İmzalama</translation> <translation id="261114180663074524">Microsoft hesabınızda oturum açıp tekrar deneyin</translation> -<translation id="2611702650078660078">Bir hata oluştu</translation> <translation id="2611776654555141051">Dikdörtgen Aracı</translation> <translation id="2611885296070244383">Mikrofon (dahili)</translation> <translation id="2612676031748830579">Kart numarası</translation> @@ -2728,7 +2726,6 @@ <translation id="285033512555869047">Kapatıldı</translation> <translation id="2850541429955027218">Tema ekle</translation> <translation id="2851291081585704741">İnternete bağlı değilsiniz</translation> -<translation id="2852045827873867442">İnternet bağlantısı gereklidir.</translation> <translation id="285237063405807022">(yükleniyor)</translation> <translation id="2853121255651601031">Şifre Kaydedildi</translation> <translation id="2854453262159518435">Mevcut sekme grubunu değiştir</translation> @@ -3593,6 +3590,7 @@ <translation id="3473241910002674503">Tablet modunda düğmelerle ana ekrana gidin, geri dönün ve uygulamalar arasında geçiş yapın.</translation> <translation id="3473479545200714844">Ekran büyüteci</translation> <translation id="3474218480460386727">Yeni kelimeler için 99 veya daha az harf kullanın</translation> +<translation id="3474330892505468100">Meet ile Google Beam</translation> <translation id="3474624961160222204"><ph name="NAME" /> olarak devam et</translation> <translation id="3477772589943384839">Orta düzeyde bellek tasarrufu sağlar. Sekmeleriniz daha uzun süre sonra devre dışı kalır.</translation> <translation id="347785443197175480"><ph name="HOST" /> sitesinin kamerama ve mikrofonuma erişmesine izin vermeye devam et</translation> @@ -5481,7 +5479,6 @@ <translation id="4779766576531456629">eSIM Hücresel ağını yeniden adlandır</translation> <translation id="4780321648949301421">Sayfayı Farklı Kaydet...</translation> <translation id="4780558987886269159">İş için</translation> -<translation id="4781633367688946589">Yeni oturuma devam et</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" />, dijital cüzdanınızdaki kişisel bilgileri kullanmak istiyor.</translation> <translation id="4785719467058219317">Bu web sitesine kaydettirilmemiş bir anahtar kullanıyorsunuz</translation> <translation id="4785914069240823137">Kırpmayı İptal Et</translation> @@ -6269,6 +6266,7 @@ <translation id="5337926771328966926">Geçerli cihazının adı: <ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Gizli pencere kullanarak İnternette gizli olarak dolaşabilirsiniz</translation> <translation id="5338503421962489998">Yerel depolama</translation> +<translation id="5340620183031438925">Sayfadan ayrılmadan AI Modu'na sekmenizle ilgili soru sormak için kimliğinizi doğrulayın. Ayrıca, şifrelerinize ve diğer öğelerinize tüm cihazlarınızdan erişebilirsiniz.</translation> <translation id="5340787663756381836">&Bul ve düzenle</translation> <translation id="5340900621595888432">Teşhis ve kullanım verilerini gönderin</translation> <translation id="5341793073192892252">Aşağıdaki çerezler engellendi (üçüncü taraf çerezleri istisnasız engelleniyor)</translation> @@ -7456,7 +7454,6 @@ <translation id="6180550893222597997"><ph name="APP_NAME" /> için hangi geçiş anahtarını kullanmak istersiniz?</translation> <translation id="6181218116951226898">Uygulamalar bazen marka öğelerini günceller. Güncelleme yapmadan önce tüm değişiklikleri inceleyerek bunların sizin için uygun olduğundan emin olun.</translation> <translation id="6181431612547969857">İndirme engellendi</translation> -<translation id="6182100780603067202">Uygulama sesini de paylaş (tüm pencerelerinden)</translation> <translation id="6183369864942961155">Otomatik açık/koyu tema</translation> <translation id="6183773856988300112">Chrome'da Gemini, sekmelerinizde çalışmak ve verdiğiniz görevleri tamamlamak için otomatik göz atma özelliğini kullanır. <ph name="LINK_BEGIN" />Daha fazla bilgi edinin<ph name="LINK_END" />.</translation> <translation id="6184099524311454384">Sekme Ara</translation> @@ -8249,7 +8246,6 @@ <translation id="6754359471209693699">Yeni arama başlat</translation> <translation id="6754918760968695779">Hızlı Yapıştır</translation> <translation id="6755702685749429945">Sözlük ekle</translation> -<translation id="6756157672127672536">Dosyalar uygulaması; Google Drive'a, harici depolama birimine veya ChromeOS cihazınıza kaydettiğiniz dosyalara hızlı bir şekilde erişebilmenizi sağlar.</translation> <translation id="6756643207511618722">Konuşma motorları</translation> <translation id="6757431299485455321">Diğer cihazların bu hotspot'u bulmasına yardımcı olun.</translation> <translation id="6758056191028427665">Bizimle ilgili görüşünüzü bildirin.</translation> @@ -9196,6 +9192,7 @@ <translation id="7406912950279255498">Rengi ters çevirme modu</translation> <translation id="7407430846095439694">İçe Aktar ve Bağla</translation> <translation id="7407504355934009739">Çoğu kullanıcı bu siteden gelen bildirimleri engelliyor</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> hassas veriler içeriyor. Kuruluşunuz, dosyayı bulut depolama alanına kaydetmenize veya silmenize izin verecektir.</translation> <translation id="7408080603962564527">Bu adı diğer kullanıcılar görebilir</translation> <translation id="740810853557944681">Yazdırma sunucusu ekleyin</translation> <translation id="7409549334477097887">Çok büyük</translation> @@ -9248,6 +9245,7 @@ <translation id="7434969625063495310">Yazdırma sunucusu eklenemedi. Lütfen sunucunun yapılandırmasını kontrol edip tekrar deneyin.</translation> <translation id="7436921188514130341">Hay aksi! Yeniden adlandırma sırasında bir hata oluştu.</translation> <translation id="7439519621174723623">Devam etmek için bir cihaz adı ekleyin</translation> +<translation id="743982235360757672">İnternette gezinirken AI Modu'nu yakınınızda bulundurun</translation> <translation id="7441736532026945583">Grubu sekme şeridinizden kaldırmak için "Grubu Gizle"yi seçin</translation> <translation id="7441736921018636843">Bu ayarı değiştirmek için <ph name="BEGIN_LINK" />senkronizasyonu sıfırlayarak<ph name="END_LINK" /> senkronizasyon parolanızı kaldırın</translation> <translation id="7441830548568730290">Diğer kullanıcılar</translation> @@ -9986,7 +9984,6 @@ <translation id="794676567536738329">İzinleri Onayla</translation> <translation id="7947962633355574091">Video Adresini K&opyala</translation> <translation id="7947964080535614577">Siteler genellikle içerik veya hizmetlerini ücretsiz olarak sunabilmek için reklam gösterirler. Ancak araya giren veya yanıltıcı reklamlar gösterdiği bilinen bazı siteler vardır.</translation> -<translation id="7948239795436419268">Pencereler geri yüklenmesin</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" /> alanının tüm sayfaları</translation> <translation id="7950629216186736592">Neden: Eski Tarayıcı Desteği yalnızca http://, https:// ve file:// URL'lerini destekler.</translation> <translation id="7950814699499457511">Açık • Bu uzantı, verileri nasıl topladığı ve kullandığı gibi gizlilik uygulamalarını yayınlamadı</translation> @@ -11175,7 +11172,6 @@ <translation id="8751034568832412184">Okul</translation> <translation id="8751329102746373229">Yöneticinizden</translation> <translation id="8752451679755290210">Öğeler arasında otomatik olarak gezinin</translation> -<translation id="8753948258138515839">Files uygulaması; Google Drive'a, harici depolama birimine veya ChromeOS Flex cihazınıza kaydettiğiniz dosyalara hızlı bir şekilde erişebilmenizi sağlar.</translation> <translation id="8754200782896249056"><p><ph name="PRODUCT_NAME" />, desteklenen bir masaüstü ortamında çalışırken sistem proxy ayarları kullanılır. Ancak, ya sisteminiz desteklenmiyor ya da sistem yapılandırmanız başlatılırken bir hata oluştu.</p> <p>Yine de, yapılandırmayı komut satırını kullanarak yapabilirsiniz. Bayraklar ve ortam değişkenleri için lütfen <code>man <ph name="PRODUCT_BINARY_NAME" /></code> içeriğine bakın.</p></translation> @@ -11968,6 +11964,7 @@ <translation id="992778845837390402">Linux için yedekleme şu anda devam ediyor</translation> <translation id="994087375490600917">Yan paneller</translation> <translation id="994289308992179865">&Döngü</translation> +<translation id="995420352808264005">Cihaz kaydı türünü seçin</translation> <translation id="995755448277384931">IBAN ekleyin</translation> <translation id="996250603853062861">Güvenli bağlantı oluşturuluyor...</translation> <translation id="997143476478634194">Ziyaret ettiğinizde siteler otomatik olarak bu ayarı uygular. Siteler genellikle son dakika haberleri veya sohbet mesajları konusunda sizi bilgilendirmek için bildirim gönderir.</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index dc2f4424..7bf2fe0 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -285,7 +285,6 @@ <translation id="117916940443676133">Ваш ключ безпеки не захищено PIN-кодом. Щоб керувати даними для входу, спершу створіть PIN-код.</translation> <translation id="1179400851034021914">Недійсний номер IBAN</translation> <translation id="1179902906564467236">Дотримуйтеся вказівок на телефоні або скористайтеся додатком Камера</translation> -<translation id="1180117276105724040">Відновлення вікон із попереднього сеансу…</translation> <translation id="118057123461613219">Дуже значне заощадження</translation> <translation id="1181037720776840403">Видалити</translation> <translation id="1182876754474670069">home</translation> @@ -766,7 +765,6 @@ <translation id="151501797353681931">Імпортовано з Safari</translation> <translation id="1515163294334130951">Запустити</translation> <translation id="1517467582299994451">Щоб транслювати контент за допомогою коду, увімкніть синхронізацію в налаштуваннях веб-переглядача Chrome</translation> -<translation id="1519090060276706457">Відновлення вікон триває довше, ніж очікувалося</translation> <translation id="1521442365706402292">Керувати сертифікатами</translation> <translation id="1521655867290435174">Google Таблиці</translation> <translation id="1521774566618522728">У мережі сьогодні</translation> @@ -1187,7 +1185,6 @@ <translation id="1796460466266263589">Щоб і далі використовувати Gemini, підтвердьте свою особу</translation> <translation id="1796588414813960292">Функції, яким потрібен звук, не працюватимуть</translation> <translation id="1798726622311813209">Кредитні й дебетові картки</translation> -<translation id="1799852120691957794">Не вдалося відновити вікна з попереднього сеансу</translation> <translation id="180203835522132923">Клавіша пошуку + O, а потім – W</translation> <translation id="1802624026913571222">Переходити в режим сну, коли кришка закрита</translation> <translation id="1802687198411089702">Сторінка не відповідає. Зачекайте або закрийте її.</translation> @@ -2384,7 +2381,6 @@ <translation id="2610374175948698697">Може переглядати файли або папки на пристрої</translation> <translation id="2610780100389066815">Підписування списку довіри Microsoft</translation> <translation id="261114180663074524">Увійдіть в обліковий запис Microsoft і повторіть спробу</translation> -<translation id="2611702650078660078">Сталася помилка</translation> <translation id="2611776654555141051">Інструмент "Прямокутник"</translation> <translation id="2611885296070244383">Мікрофон (внутрішній)</translation> <translation id="2612676031748830579">Номер картки</translation> @@ -2748,7 +2744,6 @@ <translation id="285033512555869047">Закрито</translation> <translation id="2850541429955027218">Додати тему</translation> <translation id="2851291081585704741">Ви не в мережі</translation> -<translation id="2852045827873867442">Потрібне інтернет-з’єднання.</translation> <translation id="285237063405807022">(завантажується)</translation> <translation id="2853121255651601031">Пароль збережено</translation> <translation id="2854453262159518435">Замінити наявну групу вкладок</translation> @@ -5504,7 +5499,6 @@ <translation id="4779766576531456629">Перейменувати мобільну мережу eSIM-карти</translation> <translation id="4780321648949301421">Зберегти сторінку як...</translation> <translation id="4780558987886269159">Для роботи</translation> -<translation id="4781633367688946589">Почати новий сеанс</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> хоче використовувати особисту інформацію з вашого цифрового гаманця.</translation> <translation id="4785719467058219317">Ви використовуєте ключ безпеки, не зареєстрований на цьому веб-сайті</translation> <translation id="4785914069240823137">Скасувати обрізування</translation> @@ -7475,7 +7469,6 @@ <translation id="6180550893222597997">Який ключ доступу ви хочете використовувати для додатка <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Іноді фірмова символіка додатків змінюється. Перевірте всі зміни перед оновленням і переконайтеся, що вони вам підходять.</translation> <translation id="6181431612547969857">Завантаження заблоковано</translation> -<translation id="6182100780603067202">Також надати доступ до аудіо з додатка (з усіх вікон)</translation> <translation id="6183369864942961155">Автоматичне застосування світлої / темної теми</translation> <translation id="6183773856988300112">Gemini у Chrome використовує функцію автоматичного перегляду, щоб шукати інформацію на ваших вкладках і виконувати для вас завдання. <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Шукати вкладки</translation> @@ -8274,7 +8267,6 @@ <translation id="6754359471209693699">Почати новий пошук</translation> <translation id="6754918760968695779">Швидке вставлення</translation> <translation id="6755702685749429945">Додати словник</translation> -<translation id="6756157672127672536">Додаток Файли надає швидкий доступ до файлів, збережених на Google Диску, у зовнішньому сховищі або на пристрої з ОС Chrome.</translation> <translation id="6756643207511618722">Системи синтезу мовлення</translation> <translation id="6757431299485455321">Допомагати іншим пристроям знайти цю точку доступу.</translation> <translation id="6758056191028427665">Поділіться з нами своїми враженнями.</translation> @@ -10013,7 +10005,6 @@ <translation id="794676567536738329">Підтвердити дозволи</translation> <translation id="7947962633355574091">Копіювати адресу відео</translation> <translation id="7947964080535614577">Сайти зазвичай показують рекламу, щоб пропонувати контент або послуги без оплати. Однак деякі сайти показують нав’язливі чи оманливі оголошення.</translation> -<translation id="7948239795436419268">Не відновлювати вікна</translation> <translation id="7948407723851303488">Усі сторінки <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Причина: підтримка застарілих веб-переглядачів працює лише з URL-адресами http://, https:// і file://.</translation> <translation id="7950814699499457511">Увімкнено • Немає відомостей про конфіденційність цього розширення, зокрема про те, як воно збирає і використовує дані</translation> @@ -11202,7 +11193,6 @@ <translation id="8751034568832412184">Освіта</translation> <translation id="8751329102746373229">Від вашого адміністратора</translation> <translation id="8752451679755290210">Автоматичне переміщення між елементами</translation> -<translation id="8753948258138515839">Додаток Файли надає швидкий доступ до файлів, збережених на Google Диску, у зовнішньому сховищі або на пристрої з ОС Chrome Flex.</translation> <translation id="8754200782896249056"><p>Коли <ph name="PRODUCT_NAME" /> працює в підтримуваному середовищі настільного комп’ютера використовуються налаштування проксі-сервера системи. Однак ваша система не підтримується або виникла проблема із запуском її конфігурації.</p> <p>Проте ви можете виконати конфігурацію за допомогою командного рядка. Щоб отримати докладнішу інформацію про прапорці та змінні середовища, відвідайте <code>man <ph name="PRODUCT_BINARY_NAME" /></code>.</p></translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index ecdcff2..e608b0f5 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">اصل نوڈ تشریح والی فائلوں کو ڈاؤن لوڈ نہیں کیا جا سکتا۔ بعد میں دوبارہ کوشش کریں۔</translation> <translation id="1103523840287552314"><ph name="LANGUAGE" /> کو ہمیشہ ترجمہ کریں</translation> <translation id="1104098698795583187">آپ فوری طور پر اس ٹیب گروپ تک رسائی سے محروم ہو جائیں گے اور اسے آپ کے تمام آلات سے حذف کر دیا جائے گا</translation> +<translation id="1105934302947321130">Zoom کے ساتھ Google Beam</translation> <translation id="1106270460549661906">Gemini کے ساتھ اشتراک ختم کریں</translation> <translation id="1106350001632362876">حد بڑھائیں</translation> <translation id="110850812463801904">دستی طور پر OneDrive سے منسلک کریں</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">آپ کی سیکیورٹی کلید PIN کے ذریعے محفوظ نہیں ہے۔ سائن ان ڈیٹا کا نظم کرنے کے لیے پہلے ایک PIN تخلیق کریں۔</translation> <translation id="1179400851034021914">IBAN غلط ہے</translation> <translation id="1179902906564467236">اپنے فون پر دی گئی ہدایات پر عمل کریں یا کیمرا ایپ استعمال کریں</translation> -<translation id="1180117276105724040">آپ کے پچھلے سیشن سے ونڈوز کو بحال کیا جا رہا ہے...</translation> <translation id="118057123461613219">بڑی بچتیں</translation> <translation id="1181037720776840403">ہٹائیں</translation> <translation id="1182876754474670069">گھر</translation> @@ -761,7 +761,6 @@ <translation id="151501797353681931">Safari سے درآمد کردہ</translation> <translation id="1515163294334130951">شروع کریں</translation> <translation id="1517467582299994451">کوڈ کا استعمال کر کے کاسٹ کرنے کے لیے، اپنے Chrome براؤزر کی مطابقت پذیری کی ترتیبات کو آن کریں</translation> -<translation id="1519090060276706457">ونڈوز کو بحال کرنے میں توقع سے زیادہ وقت لگ رہا ہے</translation> <translation id="1521442365706402292">سرٹیفیکیٹس کا نظم کریں</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">آج فعال کیا گیا</translation> @@ -1102,6 +1101,7 @@ <translation id="1745732479023874451">رابطوں کا نظم کریں</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{اس ویب ایپ میں # فائلز کھولیں اور ان میں ترمیم کریں؟}}</translation> <translation id="1748563609363301860">آپ اس پاس ورڈ کو اپنے Google اکاؤنٹ میں یا صرف اس آلے پر محفوظ کر سکتے ہیں</translation> +<translation id="1749645492410897998">سافٹ ویئر انسٹال ہو رہا ہے</translation> <translation id="1749733017156547309">ایک پاس ورڈ درکار ہے</translation> <translation id="1750172676754093297">آپ کی سیکیورٹی کلید فنگر پرنٹس اسٹور نہیں کر سکتی</translation> <translation id="1750238553597293878">اپنے Google اکاؤنٹ میں پاس ورڈز استعمال کرتے رہیں</translation> @@ -1173,7 +1173,6 @@ <translation id="1796460466266263589">Gemini کا استعمال جاری رکھنے کیلئے، توثیق کریں کہ یہ آپ ہی ہیں</translation> <translation id="1796588414813960292">وہ خصوصیات کام نہیں کریں گی جن کیلئے آواز کی ضرورت ہوتی ہے</translation> <translation id="1798726622311813209">کریڈٹ اور ڈیبٹ کارڈز</translation> -<translation id="1799852120691957794">آپ کے گزشتہ سیشن سے ونڈوز کو بحال نہیں کیا جا سکتا</translation> <translation id="180203835522132923">Search + O، پھر W</translation> <translation id="1802624026913571222">کوَر بند ہونے پر سلیپ وضع میں بھیجیں</translation> <translation id="1802687198411089702">صفحہ کھل نہیں رہا ہے۔ آپ اس کے کھلنے انتظار کر سکتے ہیں یا باہر نکل سکتے ہیں۔</translation> @@ -2368,7 +2367,6 @@ <translation id="2610374175948698697">آپ کے آلے پر فائلز یا فولڈر دیکھ سکتے ہیں</translation> <translation id="2610780100389066815">Microsoft ٹرسٹ لسٹ سائننگ</translation> <translation id="261114180663074524">اپنے Microsoft اکاؤنٹ میں سائن ان کریں اور پھر دوبارہ کوشش کریں</translation> -<translation id="2611702650078660078">ایک خرابی پیش آ گئی</translation> <translation id="2611776654555141051">ٹول کا مستطیل</translation> <translation id="2611885296070244383">مائیکروفون (داخلی)</translation> <translation id="2612676031748830579">کارڈ نمبر</translation> @@ -2732,7 +2730,6 @@ <translation id="285033512555869047">بند</translation> <translation id="2850541429955027218">تھیم شامل کریں</translation> <translation id="2851291081585704741">آپ آف لائن ہیں</translation> -<translation id="2852045827873867442">انٹرنیٹ کنکشن درکار ہے۔</translation> <translation id="285237063405807022">(لوڈ ہو رہا ہے)</translation> <translation id="2853121255651601031">پاس ورڈ محفوظ ہو گیا</translation> <translation id="2854453262159518435">موجودہ ٹیب گروپ کو تبدیل کریں</translation> @@ -3597,6 +3594,7 @@ <translation id="3473241910002674503">ٹیبلیٹ موڈ میں بٹنز کے ساتھ ہوم پر جائیں، واپس جائیں اور ایپس سوئچ کریں۔</translation> <translation id="3473479545200714844">اسکرین میگنیفائر</translation> <translation id="3474218480460386727">نئے الفاظ کے لیے 99 حروف یا کم استعمال کریں</translation> +<translation id="3474330892505468100">Meet کے ساتھ Google Beam</translation> <translation id="3474624961160222204">بطور <ph name="NAME" /> جاری رکھیں</translation> <translation id="3477772589943384839">میموری کی معتدل بچتیں حاصل کریں۔ آپ کے ٹیبز لمبے وقفے کے بعد غیر فعال ہو جاتے ہیں۔</translation> <translation id="347785443197175480"><ph name="HOST" /> کو اپنے کیمرا اور مائیکروفون تک حاصل کرنے کی اجازت دینا جاری رکھیں</translation> @@ -5485,7 +5483,6 @@ <translation id="4779766576531456629">eSIM سیلولر نیٹ ورک کا نام تبدیل کریں</translation> <translation id="4780321648949301421">صفحہ محفوظ کریں بطور…</translation> <translation id="4780558987886269159">کام کیلئے</translation> -<translation id="4781633367688946589">نئے سیشن میں جاری رکھیں</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> آپ کے ڈیجیٹل والٹ سے ذاتی معلومات استعمال کرنا چاہتی ہے۔</translation> <translation id="4785719467058219317">آپ اس سیکیورٹی کلید کا استعمال کر رہے ہیں جو اس ویب سائٹ کے ساتھ رجسٹرڈ نہیں ہے</translation> <translation id="4785914069240823137">کراپ کو منسوخ کریں</translation> @@ -6272,6 +6269,7 @@ <translation id="5337926771328966926">موجودہ آلے کا نام <ph name="DEVICE_NAME" /> ہے</translation> <translation id="5338338064218053691">آپ پوشیدگی ونڈو کا استعمال کر کے نجی طور پر براؤز کر سکتے ہيں</translation> <translation id="5338503421962489998">مقامی اسٹوریج</translation> +<translation id="5340620183031438925">صفحہ چھوڑے بغیر اپنے ٹیب کے بارے میں AI وضع سے پوچھنے کے لیے، تصدیق کریں کہ یہ آپ ہی ہیں۔ آپ کو اپنے تمام آلات پر اپنے پاس ورڈز اور مزید چیزیں بھی مل جائیں گی۔</translation> <translation id="5340787663756381836">&تلاش اور ترمیم کریں</translation> <translation id="5340900621595888432">ڈائیگناسٹک اور استعمال کا ڈیٹا بھیجیں</translation> <translation id="5341793073192892252">مندرجہ ذیل کوکیز کو مسدود کر دیا گیا (فریق ثالث کوکیز کو استثناء کے بغیر مسدود کیا جا رہا ہے)</translation> @@ -7457,7 +7455,6 @@ <translation id="6180550893222597997"><ph name="APP_NAME" /> کے لئے آپ کون سی پاس کی استعمال کرنا چاہتے ہیں؟</translation> <translation id="6181218116951226898">ایپس کبھی کبھی اپنی برانڈنگ کو اپ ڈیٹ کرتی ہیں۔ اپ ڈیٹ کرنے سے پہلے یہ یقینی بنانے کے لیے تمام تبدیلیوں کا جائزہ لیں کہ آپ ان کے ساتھ سہولت بخش ہیں۔</translation> <translation id="6181431612547969857">ڈاؤن لوڈ مسدود ہوگیا</translation> -<translation id="6182100780603067202">ایپلیکیشن آڈیو کا بھی اشتراک کریں (اس کی تمام ونڈوز سے)</translation> <translation id="6183369864942961155">خودکار ہکی/گہری تھیم</translation> <translation id="6183773856988300112">Chrome میں Gemini آپ کے ٹیبز میں کام کرنے اور آپ کے دیے گئے ٹاسکس کو مکمل کرنے کے لیے خودکار براؤز کا استعمال کرتا ہے۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="6184099524311454384">ٹیبز تلاش کریں</translation> @@ -8250,7 +8247,6 @@ <translation id="6754359471209693699">نئی تلاش شروع کریں</translation> <translation id="6754918760968695779">فوری اندراج</translation> <translation id="6755702685749429945">لغت شامل کریں</translation> -<translation id="6756157672127672536">فائل ایپ ان فائلوں تک فوری رسائی فراہم کرتی ہے جنہیں آپ نے Google Drive، خارجی اسٹوریج یا اپنے ChromeOS آلے پر محفوظ کیا ہے۔</translation> <translation id="6756643207511618722">اسپیچ انجنز</translation> <translation id="6757431299485455321">اس ہاٹ اسپاٹ کو تلاش کرنے میں دیگر آلات کی مدد کریں۔</translation> <translation id="6758056191028427665">ہماری کارکردگی کے بارے میں ہمیں بتائیں۔</translation> @@ -9196,6 +9192,7 @@ <translation id="7406912950279255498">رنگوں کی تقلیب کی وضع</translation> <translation id="7407430846095439694">درآمد کریں اور پابند بنائیں</translation> <translation id="7407504355934009739">زیادہ تر لوگ اس سائٹ سے اطلاعات کو مسدود کرتے ہیں</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> میں حساس ڈیٹا ہے۔ آپ کی تنظیم آپ کو اسے کلاؤڈ اسٹوریج میں محفوظ کرنے یا اسے مسترد کرنے کی اجازت دے گی</translation> <translation id="7408080603962564527">یہ دوسروں کو بھی دکھائی دے گا</translation> <translation id="740810853557944681">پرنٹ سرور شامل کریں</translation> <translation id="7409549334477097887">بہت ہی زیادہ</translation> @@ -9249,6 +9246,7 @@ <translation id="7434969625063495310">پرنٹ سرور شامل نہیں کر سکا۔ براہ کرم سرور کی کنفیگریشن کو چیک کریں اور دوبارہ کوشش کریں۔</translation> <translation id="7436921188514130341">افوہ! نام کی تبدیلی کے دوران ایک خرابی تھی۔</translation> <translation id="7439519621174723623">جاری رکھنے کیلئے ایک آلے کا نام شامل کریں</translation> +<translation id="743982235360757672">براؤز کرتے وقت AI وضع کو قریب رکھیں</translation> <translation id="7441736532026945583">اپنی ٹیب اسٹرپ سے گروپ کو ہٹانے کے لیے "گروپ چھپائیں" کو منتخب کریں</translation> <translation id="7441736921018636843">اس ترتیب کو تبدیل کرنے کے لیے، اپنی مطابقت پذیری کے پاس فریز کو ہٹانے کے لیے <ph name="BEGIN_LINK" />مطابقت پذیری کو ری سیٹ کریں<ph name="END_LINK" /></translation> <translation id="7441830548568730290">دیگر صارفین</translation> @@ -9987,7 +9985,6 @@ <translation id="794676567536738329">اجازتوں کی توثیق کریں</translation> <translation id="7947962633355574091">ویڈیو پتہ کا&پی کریں</translation> <translation id="7947964080535614577">سائٹس عام طور پر اشتہارات دکھاتی ہیں تاکہ وہ بغیر کسی چارج کے مواد یا سروسز فراہم کر سکیں۔ لیکن کچھ سائٹس دخل انداز یا گمراہ کن اشتہارات دکھانے کے لیے جانی جاتی ہیں۔</translation> -<translation id="7948239795436419268">ونڈوز کو بحال نہ کریں</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" /> کے سبھی صفحات</translation> <translation id="7950629216186736592">وجہ: LBS صرف http://ِ، https://، اور file:// والے URLs کو سپورٹ کرتا ہے۔</translation> <translation id="7950814699499457511">آن ہے• اس ایکسٹینشن نے رازداری کے ضوابط کو شائع نہیں کیا ہے، جیسے کہ اس کا ڈیٹا کو اکٹھا اور استعمال کرنے کا طریقہ</translation> @@ -11176,7 +11173,6 @@ <translation id="8751034568832412184">اسکول</translation> <translation id="8751329102746373229">آپ کے منتظم کی جانب سے</translation> <translation id="8752451679755290210">خودکار طور پر ایک آئٹم سے دوسرے آئٹم پر جائیں</translation> -<translation id="8753948258138515839">فائلز ایپ ان فائلوں تک فوری رسائی فراہم کرتی ہے جنہیں آپ نے Google Drive، خارجی اسٹوریج یا اپنے ChromeOS Flex آلے پر محفوظ کیا ہے۔</translation> <translation id="8754200782896249056"><p>تعاون یافتہ ڈیسک ٹاپ ماحول کے تحت <ph name="PRODUCT_NAME" /> کو چلانے پر، سسٹم کی پراکسی ترتیبات استعمال کی جائیں گی۔ تاہم، یا تو آپ کا سسٹم تعاون یافتہ نہیں ہے یا آپ کے سسٹم کا کنفیگریشن شروع کرنے میں ایک مسئلہ پیش آ گیا۔</p> <p>لیکن آپ اب بھی کمانڈ لائن کے ذریعے کنفیگر کر سکتے ہیں۔ پرچموں اور ماحول کے تغیرات پر مزید معلومات کیلئے براہ کرم <code>man <ph name="PRODUCT_BINARY_NAME" /></code> دیکھیں۔</p></translation> @@ -11969,6 +11965,7 @@ <translation id="992778845837390402">Linux بیک اپ فی الحال جاری ہے</translation> <translation id="994087375490600917">سائیڈ پینلز</translation> <translation id="994289308992179865">&لوپ</translation> +<translation id="995420352808264005">آلہ کے اندراج کی قسم منتخب کریں</translation> <translation id="995755448277384931">IBAN شامل کریں</translation> <translation id="996250603853062861">محفوظ کنکشن تشکیل دیا جا رہا ہے…</translation> <translation id="997143476478634194">آپ کی سائٹس کو ملاحظہ کرنے پر وہ خود کار طور پر اس ترتیب کی پیروی کرتی ہیں۔ سائٹس عام طور پر اہم خبروں یا چیٹ پیغامات کے بارے میں آپ کو مطلع کرنے کے لیے اطلاعات بھیجتی ہیں۔</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index 994ff509e..f638ac9 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -285,7 +285,6 @@ <translation id="117916940443676133">Elektron kalit PIN kod bilan himoyalanmagan. Kirish maʼlumotlarini boshqarish uchun avval PIN kod yarating.</translation> <translation id="1179400851034021914">IBAN raqami yaroqsiz</translation> <translation id="1179902906564467236">Telefonda koʻrsatmalarni bajaring yoki kamera ilovasidan foydalaning</translation> -<translation id="1180117276105724040">Avvalgi seans oynalari tiklanmoqda...</translation> <translation id="118057123461613219">Yirik tejash</translation> <translation id="1181037720776840403">Olib tashlash</translation> <translation id="1182876754474670069">home</translation> @@ -761,7 +760,6 @@ <translation id="151501797353681931">Safari brauzeridan import qilinganlar</translation> <translation id="1515163294334130951">Ishga tushirish</translation> <translation id="1517467582299994451">Kod bilan namoyish qilish uchun Chrome brauzeri sinxronizatsiya sozlamalarini yoqing</translation> -<translation id="1519090060276706457">Oynalarni tiklash kutilganidan ortiq vaqt olmoqda</translation> <translation id="1521442365706402292">Sertifikatlarni boshqarish</translation> <translation id="1521655867290435174">Google Sheets</translation> <translation id="1521774566618522728">Bugun onlayn edi</translation> @@ -1174,7 +1172,6 @@ <translation id="1796460466266263589">Gemini ishlatishda davom etish uchun shaxsingizni tasdiqlang</translation> <translation id="1796588414813960292">Ovozdan foydalanadigan funksiyalar ishlamaydi</translation> <translation id="1798726622311813209">Kredit va debet kartalar</translation> -<translation id="1799852120691957794">Avvalgi seans oynalarini tiklash imkonsiz</translation> <translation id="180203835522132923">Search + O, keyin W</translation> <translation id="1802624026913571222">Muqova yopilganda uyqu rejimiga oʻtish</translation> <translation id="1802687198411089702">Sahifa javob bermayapti. Server javobini kutishingiz yoki sahifani tark etishingiz mumkin.</translation> @@ -2372,7 +2369,6 @@ <translation id="2610374175948698697">Qurilmadagi fayl yoki jildlarni koʻrish mumkin</translation> <translation id="2610780100389066815">Microsoft ishonch ro‘yxatini imzolash</translation> <translation id="261114180663074524">Microsoft hisobingizga kiring va qayta urining</translation> -<translation id="2611702650078660078">Xatolik yuz berdi</translation> <translation id="2611776654555141051">Toʻrtburchak vositasi</translation> <translation id="2611885296070244383">Mikrofon (ichki)</translation> <translation id="2612676031748830579">Karta raqami</translation> @@ -2737,7 +2733,6 @@ <translation id="285033512555869047">Yopilgan</translation> <translation id="2850541429955027218">Mavzuni o‘rnatish</translation> <translation id="2851291081585704741">Internetga ulanmagansiz</translation> -<translation id="2852045827873867442">Internet aloqasi zarur.</translation> <translation id="285237063405807022">(yuklanmoqda)</translation> <translation id="2853121255651601031">Parol saqlandi</translation> <translation id="2854453262159518435">Mavjud varaqlar guruhini almashtirish</translation> @@ -5495,7 +5490,6 @@ <translation id="4779766576531456629">eSIM mobil tarmoqni qayta nomlash</translation> <translation id="4780321648949301421">Sahifani saqlab olish...</translation> <translation id="4780558987886269159">Ish uchun</translation> -<translation id="4781633367688946589">Yangi seansda davom ettirish</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> elektron hamyoningizdagi shaxsiy maʼlumotlardan foydalanmoqchi.</translation> <translation id="4785719467058219317">Elektron kalitingiz bu sayt roʻyxatidan oʻtkazilmagan</translation> <translation id="4785914069240823137">Qirqib olishni bekor qilish</translation> @@ -7472,7 +7466,6 @@ <translation id="6180550893222597997"><ph name="APP_NAME" /> ilovasida qaysi kod ishlatilsin?</translation> <translation id="6181218116951226898">Ayrim holatlarda ilovalarning brend elementlari oʻzgarib turadi. Yangilashdan oldin rozilik bildirish uchun barcha oʻzgarishlar bilan tanishing.</translation> <translation id="6181431612547969857">Yuklash olish taqiqlangan</translation> -<translation id="6182100780603067202">Ilova audiosini ham ulashish (barcha oynalaridan)</translation> <translation id="6183369864942961155">Kunduzi va tungi mavzuni avtomatik yoqish</translation> <translation id="6183773856988300112">Chrome ichidagi Gemini varaqlardan qidirish va siz bergan vazifalarni bajarish uchun avtomatik kezish funksiyasidan foydalanadi. <ph name="LINK_BEGIN" />Batafsil<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Varaqlar ichidan qidirish</translation> @@ -8265,7 +8258,6 @@ <translation id="6754359471209693699">Yangi qidiruvni boshlash</translation> <translation id="6754918760968695779">Tezkor joylash</translation> <translation id="6755702685749429945">Lugʻat kiritish</translation> -<translation id="6756157672127672536">Fayllar ilovasi yordamida Google Drive, ChromeOS qurilmalari yoki tashqi xotira qurilmasidagi hujjatlarni tezkor ochish mumkin.</translation> <translation id="6756643207511618722">Nutq sintezatorlari</translation> <translation id="6757431299485455321">Boshqa qurilmalarga ushbu hotspotni topishga yordam bering</translation> <translation id="6757615605516049275"><ph name="TOKEN_NAME" /> qurilmasini qulfdan chiqaring.</translation> @@ -10006,7 +9998,6 @@ <translation id="794676567536738329">Ruxsatlarni tasdiqlash</translation> <translation id="7947962633355574091">Videoning URL manzilini nusxalash</translation> <translation id="7947964080535614577">Saytlar odatda bepul kontent yoki xizmatlar taqdim qilish maqsadida reklama chiqaradi. Lekin ayrim saytlarda yoqimsiz yoki befoyda reklamalar chiqishi ham mumkin.</translation> -<translation id="7948239795436419268">Oynalar tiklanmasin</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" /> barcha sahifalari</translation> <translation id="7950629216186736592">Sababi: LBS faqat quyidagilar bilan ishlaydi: http://, https:// va file:// URL.</translation> <translation id="7950814699499457511">Yoniq • Bu kengaytma axborot jamlashi va ishlatishi kabi maxfiylikka oid ochiqlama joylamagan</translation> @@ -11196,7 +11187,6 @@ <translation id="8751034568832412184">Maktab</translation> <translation id="8751329102746373229">Administratordan</translation> <translation id="8752451679755290210">Elementlarni avtomatik varaqlash</translation> -<translation id="8753948258138515839">Fayllar ilovasi yordamida Google Drive, ChromeOS Flex qurilmalari yoki tashqi xotira qurilmasidagi hujjatlarni tezkor ochish mumkin.</translation> <translation id="8754200782896249056"><p><ph name="PRODUCT_NAME" /> qo‘llab-quvvatlanadigan muhitda ishga tushirilganda, kompyuterda proksi-server uchun tizim sozlamalaridan foydalaniladi. Lekin noma’lum sabablarga ko‘ra, sizning tizimingizda ishga tushmadi, balki tizim sozlamalarini ishga tushirishda xatolik yuz bergandir.</p> <p>Shunday bo‘lishiga qaramay, siz baribir buyruqlar qatori yordamida sozlab olishingiz mumkin. Bayroqlar va muhit vositalari haqida batafsil ma’lumot olishni istasangiz, <code><ph name="PRODUCT_BINARY_NAME" /> yo‘riqnomasi</code> bilan tanishib chiqing.</p></translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index e66cab2..c9bdc28 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -285,7 +285,6 @@ <translation id="117916940443676133">Bạn chưa thiết lập mã PIN để bảo vệ khóa bảo mật. Để quản lý dữ liệu đăng nhập, trước tiên, hãy tạo một mã PIN.</translation> <translation id="1179400851034021914">IBAN không hợp lệ</translation> <translation id="1179902906564467236">Làm theo hướng dẫn trên điện thoại hoặc sử dụng ứng dụng máy ảnh</translation> -<translation id="1180117276105724040">Đang khôi phục cửa sổ từ phiên trước đó...</translation> <translation id="118057123461613219">Mức tiết kiệm rất lớn</translation> <translation id="1181037720776840403">Xoá</translation> <translation id="1182876754474670069">home</translation> @@ -763,7 +762,6 @@ <translation id="151501797353681931">Đã nhập Từ Safari</translation> <translation id="1515163294334130951">Chạy</translation> <translation id="1517467582299994451">Để truyền bằng mã, hãy bật chế độ cài đặt đồng bộ hoá trình duyệt Chrome</translation> -<translation id="1519090060276706457">Quá trình khôi phục cửa sổ mất nhiều thời gian hơn dự kiến</translation> <translation id="1521442365706402292">Quản lý chứng chỉ</translation> <translation id="1521655867290435174">Google Trang tính</translation> <translation id="1521774566618522728">Hoạt động hôm nay</translation> @@ -1184,7 +1182,6 @@ <translation id="1796460466266263589">Để tiếp tục sử dụng Gemini, hãy xác minh danh tính của bạn</translation> <translation id="1796588414813960292">Các tính năng cần dùng âm thanh sẽ không hoạt động</translation> <translation id="1798726622311813209">Thẻ tín dụng và thẻ ghi nợ</translation> -<translation id="1799852120691957794">Không thể khôi phục cửa sổ từ phiên trước đó</translation> <translation id="180203835522132923">Nhấn tổ hợp phím Tìm kiếm + O, sau đó nhấn W</translation> <translation id="1802624026913571222">Chuyển sang chế độ ngủ khi đóng nắp màn hình</translation> <translation id="1802687198411089702">Trang không phản hồi. Bạn có thể chờ hoặc thoát khỏi trang này.</translation> @@ -2381,7 +2378,6 @@ <translation id="2610374175948698697">Có thể xem tệp hoặc thư mục trên thiết bị</translation> <translation id="2610780100389066815">Ký Danh sách Tin cậy của Microsoft</translation> <translation id="261114180663074524">Đăng nhập vào tài khoản Microsoft rồi thử lại</translation> -<translation id="2611702650078660078">Đã xảy ra lỗi</translation> <translation id="2611776654555141051">Công cụ hình chữ nhật</translation> <translation id="2611885296070244383">Micrô (bên trong)</translation> <translation id="2612676031748830579">Số thẻ</translation> @@ -2745,7 +2741,6 @@ <translation id="285033512555869047">Đã đóng</translation> <translation id="2850541429955027218">Thêm chủ đề</translation> <translation id="2851291081585704741">Bạn hiện không có kết nối mạng</translation> -<translation id="2852045827873867442">Cần có kết nối Internet.</translation> <translation id="285237063405807022">(đang tải)</translation> <translation id="2853121255651601031">Đã lưu mật khẩu</translation> <translation id="2854453262159518435">Thay thế nhóm thẻ hiện có</translation> @@ -5501,7 +5496,6 @@ <translation id="4779766576531456629">Đổi tên mạng di động của eSIM</translation> <translation id="4780321648949301421">Lưu trang dưới dạng...</translation> <translation id="4780558987886269159">Dành cho công việc</translation> -<translation id="4781633367688946589">Tiếp tục với phiên mới</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> muốn sử dụng thông tin cá nhân trong ví điện tử của bạn.</translation> <translation id="4785719467058219317">Bạn đang sử dụng một khóa bảo mật chưa đăng ký với trang web này</translation> <translation id="4785914069240823137">Huỷ cắt</translation> @@ -7477,7 +7471,6 @@ <translation id="6180550893222597997">Bạn muốn sử dụng khoá đăng nhập nào cho <ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Đôi khi, các ứng dụng có thể cập nhật thương hiệu của mình. Hãy xem xét tất cả thay đổi để đảm bảo bạn hài lòng với những thay đổi đó trước khi cập nhật.</translation> <translation id="6181431612547969857">Thao tác tải xuống đã bị chặn</translation> -<translation id="6182100780603067202">Chia sẻ cả âm thanh của ứng dụng (từ tất cả cửa sổ của ứng dụng)</translation> <translation id="6183369864942961155">Giao diện sáng/tối tự động</translation> <translation id="6183773856988300112">Gemini trong Chrome sử dụng tính năng tự động duyệt web để hoạt động trong các thẻ của bạn và hoàn thành những nhiệm vụ bạn giao. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Tìm kiếm thẻ</translation> @@ -8270,7 +8263,6 @@ <translation id="6754359471209693699">Bắt đầu lượt tìm kiếm mới</translation> <translation id="6754918760968695779">Chèn nhanh</translation> <translation id="6755702685749429945">Thêm từ điển</translation> -<translation id="6756157672127672536">Ứng dụng Files cho phép truy cập nhanh vào các tệp mà bạn đã lưu trên Google Drive, bộ nhớ ngoài hoặc thiết bị ChromeOS.</translation> <translation id="6756643207511618722">Công cụ chuyển văn bản sang lời nói</translation> <translation id="6757431299485455321">Giúp các thiết bị khác tìm thấy điểm phát sóng này.</translation> <translation id="6758056191028427665">Hãy cho chúng tôi biết ý kiến của bạn về dịch vụ của chúng tôi.</translation> @@ -10012,7 +10004,6 @@ <translation id="794676567536738329">Xác nhận quyền</translation> <translation id="7947962633355574091">S&ao chép địa chỉ video</translation> <translation id="7947964080535614577">Các trang web thường hiện quảng cáo để có thể cung cấp miễn phí nội dung hoặc dịch vụ. Tuy nhiên, một số trang web được xác định là đưa ra quảng cáo xâm nhập hoặc quảng cáo gây hiểu lầm.</translation> -<translation id="7948239795436419268">Không khôi phục cửa sổ</translation> <translation id="7948407723851303488">Tất cả trang của <ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Lý do: Chế độ hỗ trợ trình duyệt cũ (LBS) chỉ hỗ trợ http://, https:// và file:// URL.</translation> <translation id="7950814699499457511">Đang bật • Tiện ích này chưa công bố các phương thức bảo vệ quyền riêng tư, chẳng hạn như cách tiện ích thu thập và sử dụng dữ liệu</translation> @@ -11201,7 +11192,6 @@ <translation id="8751034568832412184">Trường học</translation> <translation id="8751329102746373229">Từ quản trị viên của bạn</translation> <translation id="8752451679755290210">Tự động di chuyển giữa các mục</translation> -<translation id="8753948258138515839">Ứng dụng Files cho phép truy cập nhanh các tệp mà bạn đã lưu trên Google Drive, bộ nhớ ngoài hoặc thiết bị ChromeOS Flex.</translation> <translation id="8754200782896249056"><p>Khi chạy <ph name="PRODUCT_NAME" /> trong môi trường màn hình được hỗ trợ, cài đặt proxy hệ thống sẽ được sử dụng. Tuy nhiên, hệ thống của bạn không được hỗ trợ hoặc đã xảy ra sự cố khi khởi chạy cấu hình hệ thống của bạn.</p> <p>Tuy nhiên, bạn vẫn có thể định cấu hình qua dòng lệnh. Hãy xem <code>man <ph name="PRODUCT_BINARY_NAME" /></code> để biết thêm thông tin về cờ và biến môi trường.</p></translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 2ce982819..f480d34 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">无法下载主要节点标注文件。请稍后再试。</translation> <translation id="1103523840287552314">一律翻译<ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">您将立即失去对此标签页分组的访问权限,并且该分组将从您的所有设备中删除</translation> +<translation id="1105934302947321130">Google Beam with Zoom</translation> <translation id="1106270460549661906">取消与 Gemini 分享</translation> <translation id="1106350001632362876">提高阈值</translation> <translation id="110850812463801904">手动连接到 OneDrive</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">您尚未设置 PIN 码来保护您的安全密钥。要管理登录数据,请先创建一个 PIN 码。</translation> <translation id="1179400851034021914">IBAN 无效</translation> <translation id="1179902906564467236">按照手机上的说明操作或使用相机应用</translation> -<translation id="1180117276105724040">正在恢复上一次会话中的窗口…</translation> <translation id="118057123461613219">节省超大量内存</translation> <translation id="1181037720776840403">移除</translation> <translation id="1182876754474670069">光标移至行首</translation> @@ -756,7 +756,6 @@ <translation id="151501797353681931">从 Safari 中导入</translation> <translation id="1515163294334130951">启动</translation> <translation id="1517467582299994451">若要使用代码进行投放,请开启 Chrome 浏览器同步设置</translation> -<translation id="1519090060276706457">恢复窗口所用时间超出预期</translation> <translation id="1521442365706402292">管理证书</translation> <translation id="1521655867290435174">Google 表格</translation> <translation id="1521774566618522728">今天曾有活动</translation> @@ -1097,6 +1096,7 @@ <translation id="1745732479023874451">管理联系人</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{要在此 Web 应用中打开并修改 # 个文件吗?}}</translation> <translation id="1748563609363301860">您可以将这个密码保存到您的 Google 账号中,或者仅保存到此设备上</translation> +<translation id="1749645492410897998">正在安装软件</translation> <translation id="1749733017156547309">必须输入密码</translation> <translation id="1750172676754093297">您的安全密钥无法存储指纹</translation> <translation id="1750238553597293878">请继续使用您的 Google 账号的密码</translation> @@ -1168,7 +1168,6 @@ <translation id="1796460466266263589">若要继续使用 Gemini,请验证身份</translation> <translation id="1796588414813960292">所有需要使用声音的功能都将无法正常运行</translation> <translation id="1798726622311813209">信用卡和借记卡</translation> -<translation id="1799852120691957794">无法恢复上一次会话中的窗口</translation> <translation id="180203835522132923">搜索键 + O,然后按 W</translation> <translation id="1802624026913571222">合盖后休眠</translation> <translation id="1802687198411089702">该页面没有响应。您可以继续等待,也可以退出。</translation> @@ -2358,7 +2357,6 @@ <translation id="2610374175948698697">可以查看您设备上的文件或文件夹</translation> <translation id="2610780100389066815">Microsoft 信任列表签名</translation> <translation id="261114180663074524">请登录您的 Microsoft 账号,然后重试</translation> -<translation id="2611702650078660078">发生了错误</translation> <translation id="2611776654555141051">矩形工具</translation> <translation id="2611885296070244383">麦克风(内部)</translation> <translation id="2612676031748830579">卡号</translation> @@ -2722,7 +2720,6 @@ <translation id="285033512555869047">已关闭</translation> <translation id="2850541429955027218">添加主题背景</translation> <translation id="2851291081585704741">您目前处于离线状态</translation> -<translation id="2852045827873867442">需要联网。</translation> <translation id="285237063405807022">(加载中)</translation> <translation id="2853121255651601031">密码已保存</translation> <translation id="2854453262159518435">替换现有标签页分组</translation> @@ -2895,7 +2892,7 @@ <translation id="2975845084271617886">加入并打开</translation> <translation id="2976547701881428815">工具和操作</translation> <translation id="2976639738101799892">每次浏览时都可畅享 Google 搜索功能和 Google 智能工具</translation> -<translation id="2977480621796371840">从组中移除</translation> +<translation id="2977480621796371840">从分组中移除</translation> <translation id="2978697251742938065">与他人协作</translation> <translation id="2979493931538961252">当 Chromebook 处于离线状态且热点可用时</translation> <translation id="2979639724566107830">在新窗口中打开</translation> @@ -3587,6 +3584,7 @@ <translation id="3473241910002674503">在平板电脑模式下,使用相应按钮转到主屏幕、返回以及切换应用。</translation> <translation id="3473479545200714844">屏幕放大镜</translation> <translation id="3474218480460386727">新字词最多只能包含 99 个字母</translation> +<translation id="3474330892505468100">Google Beam with Meet</translation> <translation id="3474624961160222204">以“<ph name="NAME" />”的身份继续</translation> <translation id="3477772589943384839">节省适量内存。标签页会在较长的一段时间后变为非活跃状态。</translation> <translation id="347785443197175480">继续允许 <ph name="HOST" /> 使用您的摄像头和麦克风</translation> @@ -5474,7 +5472,6 @@ <translation id="4779766576531456629">重命名 eSIM 卡移动网络</translation> <translation id="4780321648949301421">页面存储为...</translation> <translation id="4780558987886269159">用于工作</translation> -<translation id="4781633367688946589">继续新会话</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> 想使用您数字钱包中的个人信息。</translation> <translation id="4785719467058219317">您使用的安全密钥尚未在此网站注册</translation> <translation id="4785914069240823137">取消剪裁</translation> @@ -6261,6 +6258,7 @@ <translation id="5337926771328966926">当前设备名称是“<ph name="DEVICE_NAME" />”</translation> <translation id="5338338064218053691">无痕式窗口可让您进行私密浏览</translation> <translation id="5338503421962489998">本地存储</translation> +<translation id="5340620183031438925">如需在不离开网页的情况下向 AI 模式询问有关标签页的问题,请验证您的身份。登录后,您还可在自己的所有设备上同步保存的密码等信息。</translation> <translation id="5340787663756381836">查找和修改(&F)</translation> <translation id="5340900621595888432">发送诊断数据和使用情况数据</translation> <translation id="5341793073192892252">已拦截以下 Cookie(所有第三方 Cookie 都会被拦截)</translation> @@ -7444,7 +7442,6 @@ <translation id="6180550893222597997">您要将哪个通行密钥用于<ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">应用有时会更新其品牌标识。请查看所有更改,确保您接受这些更改,然后再更新。</translation> <translation id="6181431612547969857">下载已被阻止</translation> -<translation id="6182100780603067202">同时分享应用音频(来自其所有窗口)</translation> <translation id="6183369864942961155">自动切换浅色/深色主题</translation> <translation id="6183773856988300112">Chrome 中的 Gemini 利用“自动浏览”功能在标签页中操作,完成您交代的各种任务。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> <translation id="6184099524311454384">搜索标签页</translation> @@ -8237,7 +8234,6 @@ <translation id="6754359471209693699">开始新的搜索</translation> <translation id="6754918760968695779">快捷插入</translation> <translation id="6755702685749429945">添加字典</translation> -<translation id="6756157672127672536">通过“文件”应用,您可以快速访问自己保存在 Google 云端硬盘、外部存储空间或 Chrome 操作系统设备上的文件。</translation> <translation id="6756643207511618722">语音引擎</translation> <translation id="6757431299485455321">有助于其他设备发现此热点。</translation> <translation id="6758056191028427665">让我们知道您的满意度。</translation> @@ -9184,6 +9180,7 @@ <translation id="7406912950279255498">颜色反转模式</translation> <translation id="7407430846095439694">导入并绑定</translation> <translation id="7407504355934009739">多数人会屏蔽来自此网站的通知</translation> +<translation id="7407578029724074226"><ph name="FILE_NAME" /> 包含敏感数据。根据您所属组织的政策,您可以将此文件保存到云端存储空间,也可以将其舍弃</translation> <translation id="7408080603962564527">他人将能看到此热点</translation> <translation id="740810853557944681">添加打印服务器</translation> <translation id="7409549334477097887">特大</translation> @@ -9237,6 +9234,7 @@ <translation id="7434969625063495310">无法添加打印服务器。请检查服务器的配置,然后重试。</translation> <translation id="7436921188514130341">糟糕!重命名过程中出错了。</translation> <translation id="7439519621174723623">您必须添加设备名称才能继续操作</translation> +<translation id="743982235360757672">在浏览时直接使用 AI 模式</translation> <translation id="7441736532026945583">选择“隐藏组”可将组从标签栏中移除</translation> <translation id="7441736921018636843">要更改此设置,请<ph name="BEGIN_LINK" />重置同步功能<ph name="END_LINK" />以移除同步密码</translation> <translation id="7441830548568730290">其他用户</translation> @@ -9975,7 +9973,6 @@ <translation id="794676567536738329">确认权限</translation> <translation id="7947962633355574091">复制视频地址(&O)</translation> <translation id="7947964080535614577">网站通常会显示广告,以便能够免费提供内容或服务。但是,我们已知某些网站会展示侵扰性或误导性广告。</translation> -<translation id="7948239795436419268">不恢复窗口</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" /> 的所有网页</translation> <translation id="7950629216186736592">原因:LBS 仅支持 http://、https:// 和 file:// 网址。</translation> <translation id="7950814699499457511">已开启 • 此扩展程序尚未发布隐私权规范,例如如何收集和使用数据</translation> @@ -11164,7 +11161,6 @@ <translation id="8751034568832412184">学校</translation> <translation id="8751329102746373229">来自您的管理员</translation> <translation id="8752451679755290210">自动在各项内容之间移动</translation> -<translation id="8753948258138515839">通过“文件”应用,您可以快速访问自己保存在 Google 云端硬盘、外部存储空间或 ChromeOS Flex 设备上的文件。</translation> <translation id="8754200782896249056"><p>在受支持的桌面环境中运行<ph name="PRODUCT_NAME" />时,将使用系统代理设置。但您的系统不受支持,或启动系统配置时出现问题。</p> <p>但您仍可通过命令行进行配置。如需详细了解各项实验功能和环境变量,请参见 <code>man <ph name="PRODUCT_BINARY_NAME" /></code>。</p></translation> @@ -11957,6 +11953,7 @@ <translation id="992778845837390402">正在进行 Linux 备份</translation> <translation id="994087375490600917">侧边栏</translation> <translation id="994289308992179865">循环(&L)</translation> +<translation id="995420352808264005">选择设备注册类型</translation> <translation id="995755448277384931">添加 IBAN</translation> <translation id="996250603853062861">正在建立安全连接...</translation> <translation id="997143476478634194">网站会在您访问时自动采用此设置。网站通常会发送通知,以便您知悉重大新闻或聊天消息。</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index 42b25991..80f4c584 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -285,7 +285,6 @@ <translation id="117916940443676133">您的安全密鑰並未受 PIN 保護。請先建立 PIN 以管理登入資料。</translation> <translation id="1179400851034021914">IBAN 無效</translation> <translation id="1179902906564467236">按照手機的指示操作,或使用相機應用程式</translation> -<translation id="1180117276105724040">正在還原上一個工作階段的視窗…</translation> <translation id="118057123461613219">節省極大量記憶體</translation> <translation id="1181037720776840403">移除</translation> <translation id="1182876754474670069">Home 鍵</translation> @@ -763,7 +762,6 @@ <translation id="151501797353681931">由 Safari 匯入</translation> <translation id="1515163294334130951">啟動</translation> <translation id="1517467582299994451">如要透過存取碼投放,請開啟 Chrome 瀏覽器同步設定</translation> -<translation id="1519090060276706457">還原視窗的時間比預期長</translation> <translation id="1521442365706402292">管理憑證</translation> <translation id="1521655867290435174">Google 試算表</translation> <translation id="1521774566618522728">今天已使用</translation> @@ -1183,7 +1181,6 @@ <translation id="1796460466266263589">驗證身分以繼續使用 Gemini</translation> <translation id="1796588414813960292">需要使用音訊的功能將無法運作</translation> <translation id="1798726622311813209">信用卡和扣帳卡</translation> -<translation id="1799852120691957794">無法從上一個工作階段還原視窗</translation> <translation id="180203835522132923">搜尋 + O,然後按 W</translation> <translation id="1802624026913571222">蓋上機蓋時進入休眠狀態</translation> <translation id="1802687198411089702">網頁沒有回應,您可以繼續等待或離開。</translation> @@ -2381,7 +2378,6 @@ <translation id="2610374175948698697">可查看裝置上的檔案或資料夾</translation> <translation id="2610780100389066815">Microsoft 信任清單簽署</translation> <translation id="261114180663074524">請登入 Microsoft 帳戶,然後再試一次</translation> -<translation id="2611702650078660078">發生錯誤</translation> <translation id="2611776654555141051">長方形工具</translation> <translation id="2611885296070244383">麥克風 (內部)</translation> <translation id="2612676031748830579">信用卡號碼</translation> @@ -2744,7 +2740,6 @@ <translation id="285033512555869047">已關閉</translation> <translation id="2850541429955027218">新增主題</translation> <translation id="2851291081585704741">您已離線</translation> -<translation id="2852045827873867442">需要互聯網連線。</translation> <translation id="285237063405807022">(正在載入)</translation> <translation id="2853121255651601031">密碼已儲存</translation> <translation id="2854453262159518435">取代現有分頁群組</translation> @@ -5498,7 +5493,6 @@ <translation id="4779766576531456629">重新命名 eSIM 卡的流動網絡</translation> <translation id="4780321648949301421">另存網頁…</translation> <translation id="4780558987886269159">工作時</translation> -<translation id="4781633367688946589">繼續新工作階段</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> 想使用你電子錢包中的個人資料。</translation> <translation id="4785719467058219317">您目前使用的安全密鑰並未在此網站註冊</translation> <translation id="4785914069240823137">取消裁剪</translation> @@ -7469,7 +7463,6 @@ <translation id="6180550893222597997">您要在 <ph name="APP_NAME" /> 上使用哪一個密鑰?</translation> <translation id="6181218116951226898">應用程式有時會更新品牌身分。請先查看所有變更,確保沒有問題再更新。</translation> <translation id="6181431612547969857">下載被封鎖</translation> -<translation id="6182100780603067202">同時分享應用程式音訊 (來自其所有視窗)</translation> <translation id="6183369864942961155">自動切換淺色/深色主題</translation> <translation id="6183773856988300112">Chrome 版 Gemini 會使用自動瀏覽功能在分頁中運作,完成你指派的任務。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="6184099524311454384">搜尋分頁</translation> @@ -8262,7 +8255,6 @@ <translation id="6754359471209693699">開始新搜尋</translation> <translation id="6754918760968695779">快速插入</translation> <translation id="6755702685749429945">新增字典</translation> -<translation id="6756157672127672536">「檔案」應用程式可讓您快速存取存放在 Google 雲端硬碟、外部儲存空間或 Chrome OS 裝置中的檔案。</translation> <translation id="6756643207511618722">語音引擎</translation> <translation id="6757431299485455321">協助其他裝置尋找此熱點。</translation> <translation id="6758056191028427665">請讓我們瞭解您的滿意度。</translation> @@ -9999,7 +9991,6 @@ <translation id="794676567536738329">確認權限</translation> <translation id="7947962633355574091">複製影片位址(&O)</translation> <translation id="7947964080535614577">網站通常要顯示廣告,才能免費提供內容或服務。不過,部分網站會顯示滋擾性或誤導廣告。</translation> -<translation id="7948239795436419268">不要還原視窗</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" /> 的所有頁面</translation> <translation id="7950629216186736592">原因:LBS 只支援 http://、https:// 和 file:// 網址。</translation> <translation id="7950814699499457511">已開啟 • 此擴充程式尚未發佈私隱守則,例如擴充程式如何收集和使用資料</translation> @@ -11188,7 +11179,6 @@ <translation id="8751034568832412184">學校</translation> <translation id="8751329102746373229">來自管理員的憑證</translation> <translation id="8752451679755290210">自動在項目之間移動</translation> -<translation id="8753948258138515839">「檔案」應用程式可供快速存取您存放在 Google 雲端硬碟」、外部儲存空間或 ChromeOS Flex 裝置中的檔案。</translation> <translation id="8754200782896249056"><p>在受支援的桌面環境下執行 <ph name="PRODUCT_NAME" /> 時,瀏覽器會使用系統的 Proxy 設定。不過,您的系統可能不受支援,或在啟動系統設定時發生問題。</p> <p>然而,您仍然可以透過命令列設定。如需標幟及環境變數的詳細資料,請參閱 <code>man <ph name="PRODUCT_BINARY_NAME" /></code>。</p></translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 2adc175..9569b183 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">無法下載主節點註解檔案,請稍後再試。</translation> <translation id="1103523840287552314">一律翻譯<ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">你將立即失去這個分頁群組的存取權,且該群組會從你的所有裝置中刪除</translation> +<translation id="1105934302947321130">Google Beam with Zoom</translation> <translation id="1106270460549661906">取消與 Gemini 分享</translation> <translation id="1106350001632362876">提高門檻</translation> <translation id="110850812463801904">手動連線至 OneDrive</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">你的安全金鑰未受 PIN 碼保護。如要管理登入資料,請先建立 PIN 碼。</translation> <translation id="1179400851034021914">IBAN 無效</translation> <translation id="1179902906564467236">按照手機上的指示操作或使用相機應用程式</translation> -<translation id="1180117276105724040">正在還原上一個工作階段中的視窗...</translation> <translation id="118057123461613219">節省量:極大</translation> <translation id="1181037720776840403">移除</translation> <translation id="1182876754474670069">home 鍵</translation> @@ -761,7 +761,6 @@ <translation id="151501797353681931">由 Safari 匯入</translation> <translation id="1515163294334130951">啟動</translation> <translation id="1517467582299994451">如要使用代碼建立投放連線,請開啟 Chrome 瀏覽器同步處理設定</translation> -<translation id="1519090060276706457">還原視窗的時間過長</translation> <translation id="1521442365706402292">管理憑證</translation> <translation id="1521655867290435174">Google 試算表</translation> <translation id="1521774566618522728">上次使用時間:今天</translation> @@ -1102,6 +1101,7 @@ <translation id="1745732479023874451">管理聯絡人</translation> <translation id="1748283190377208783">{0,plural, =1{unused plural form}other{要在這個網頁應用程式中開啟並編輯 # 個檔案嗎?}}</translation> <translation id="1748563609363301860">你可以將這組密碼儲存在 Google 帳戶中,也可以只儲存在這部裝置上</translation> +<translation id="1749645492410897998">正在安裝軟體</translation> <translation id="1749733017156547309">必須輸入密碼</translation> <translation id="1750172676754093297">你的安全金鑰無法儲存指紋</translation> <translation id="1750238553597293878">請繼續使用 Google 帳戶中的密碼</translation> @@ -1173,7 +1173,6 @@ <translation id="1796460466266263589">如要繼續使用 Gemini,請驗證身分</translation> <translation id="1796588414813960292">需要使用音訊的功能將無法運作</translation> <translation id="1798726622311813209">信用卡和簽帳金融卡</translation> -<translation id="1799852120691957794">無法還原上一個工作階段中的視窗</translation> <translation id="180203835522132923">搜尋鍵 + O 鍵,然後按下 W 鍵</translation> <translation id="1802624026913571222">蓋上機蓋時進入休眠狀態</translation> <translation id="1802687198411089702">網頁無回應。你可以等待網頁回應,也可以離開網頁。</translation> @@ -2366,7 +2365,6 @@ <translation id="2610374175948698697">可檢視裝置上的檔案或資料夾</translation> <translation id="2610780100389066815">Microsoft 信任清單簽署</translation> <translation id="261114180663074524">請登入 Microsoft 帳戶,然後再試一次</translation> -<translation id="2611702650078660078">發生錯誤</translation> <translation id="2611776654555141051">矩形工具</translation> <translation id="2611885296070244383">麥克風 (內部)</translation> <translation id="2612676031748830579">卡號</translation> @@ -2730,7 +2728,6 @@ <translation id="285033512555869047">已關閉</translation> <translation id="2850541429955027218">新增主題</translation> <translation id="2851291081585704741">你已離線</translation> -<translation id="2852045827873867442">必須連上網際網路。</translation> <translation id="285237063405807022">(載入中)</translation> <translation id="2853121255651601031">密碼已儲存</translation> <translation id="2854453262159518435">取代現有分頁群組</translation> @@ -3594,6 +3591,7 @@ <translation id="3473241910002674503">在平板電腦模式中,使用按鈕前往主畫面、返回及切換應用程式。</translation> <translation id="3473479545200714844">畫面放大鏡</translation> <translation id="3474218480460386727">新字詞請保持在 99 個字母以內</translation> +<translation id="3474330892505468100">Google Beam with Meet</translation> <translation id="3474624961160222204">以「<ph name="NAME" />」的身分繼續</translation> <translation id="3477772589943384839">取得中等記憶體節省量。分頁會在較長時段過後進入閒置狀態。</translation> <translation id="347785443197175480">繼續允許 <ph name="HOST" /> 存取你的攝影機和麥克風</translation> @@ -5478,7 +5476,6 @@ <translation id="4779766576531456629">重新命名 eSIM 的行動網路</translation> <translation id="4780321648949301421">另存網頁...</translation> <translation id="4780558987886269159">工作</translation> -<translation id="4781633367688946589">繼續進入新工作階段</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> 想要使用你在數位錢包中的個人資訊。</translation> <translation id="4785719467058219317">你目前使用的安全金鑰並未在這個網站註冊</translation> <translation id="4785914069240823137">取消裁剪</translation> @@ -6265,6 +6262,7 @@ <translation id="5337926771328966926">目前的裝置名稱為「<ph name="DEVICE_NAME" />」</translation> <translation id="5338338064218053691">使用無痕視窗,安心進行私密瀏覽</translation> <translation id="5338503421962489998">本機儲存空間</translation> +<translation id="5340620183031438925">完成身分驗證後,不必離開頁面就能用 AI 模式查詢分頁,並在所有裝置上同步密碼與其他資料。</translation> <translation id="5340787663756381836">尋找並編輯(&F)</translation> <translation id="5340900621595888432">傳送診斷和使用資料</translation> <translation id="5341793073192892252">已封鎖下列 Cookie (所有第三方 Cookie 都會遭到封鎖)</translation> @@ -7447,7 +7445,6 @@ <translation id="6180550893222597997">你要在「<ph name="APP_NAME" />」上使用哪一個密碼金鑰?</translation> <translation id="6181218116951226898">應用程式有時會更新品牌識別。請先查看所有異動,確認沒問題再更新。</translation> <translation id="6181431612547969857">下載遭封鎖</translation> -<translation id="6182100780603067202">一併分享應用程式所有視窗的音訊</translation> <translation id="6183369864942961155">自動切換淺色/深色主題</translation> <translation id="6183773856988300112">Chrome 內建 Gemini 使用自動瀏覽功能,能在分頁中完成你交辦的工作。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="6184099524311454384">搜尋分頁</translation> @@ -8240,7 +8237,6 @@ <translation id="6754359471209693699">開始新的搜尋</translation> <translation id="6754918760968695779">快速插入</translation> <translation id="6755702685749429945">新增字典</translation> -<translation id="6756157672127672536">「檔案」應用程式可讓你快速存取儲存在 Google 雲端硬碟、外部儲存空間或 Chrome OS 裝置中的檔案。</translation> <translation id="6756643207511618722">語音引擎</translation> <translation id="6757431299485455321">協助其他裝置找到這個無線基地台。</translation> <translation id="6758056191028427665">請讓我們瞭解你的滿意度。</translation> @@ -9186,6 +9182,7 @@ <translation id="7406912950279255498">色彩反轉模式</translation> <translation id="7407430846095439694">匯入和繫結</translation> <translation id="7407504355934009739">大多數使用者封鎖了這個網站傳送的通知</translation> +<translation id="7407578029724074226">「<ph name="FILE_NAME" />」含有機密資料。根據貴機構政策,你只能儲存到雲端空間或捨棄檔案</translation> <translation id="7408080603962564527">其他人將可看到這個名稱</translation> <translation id="740810853557944681">新增印表機伺服器</translation> <translation id="7409549334477097887">特大</translation> @@ -9239,6 +9236,7 @@ <translation id="7434969625063495310">無法新增印表機伺服器。請檢查伺服器設定,然後再試一次。</translation> <translation id="7436921188514130341">糟糕!重新命名過程中發生錯誤。</translation> <translation id="7439519621174723623">新增裝置名稱即可繼續</translation> +<translation id="743982235360757672">AI 模式陪你瀏覽</translation> <translation id="7441736532026945583">選取「隱藏群組」即可從分頁列中移除群組</translation> <translation id="7441736921018636843">如要變更這項設定,請<ph name="BEGIN_LINK" />重設同步處理功能<ph name="END_LINK" />以移除同步處理通關密語</translation> <translation id="7441830548568730290">其他使用者</translation> @@ -9977,7 +9975,6 @@ <translation id="794676567536738329">確認權限</translation> <translation id="7947962633355574091">複製影片位址(&O)</translation> <translation id="7947964080535614577">為了提供免付費的內容或服務,網站通常會放送廣告。不過,某些網站會放送干擾性或誤導性的廣告。</translation> -<translation id="7948239795436419268">不要還原視窗</translation> <translation id="7948407723851303488"><ph name="DOMAIN_NAME" /> 的所有頁面</translation> <translation id="7950629216186736592">原因:LBS 只支援 http://、https:// 和 file:// 網址。</translation> <translation id="7950814699499457511">已開啟 • 這項擴充功能尚未發布隱私權實務規範,例如擴充功能如何收集和使用資料</translation> @@ -11166,7 +11163,6 @@ <translation id="8751034568832412184">學校</translation> <translation id="8751329102746373229">來自系統管理員的憑證</translation> <translation id="8752451679755290210">自動在項目之間移動</translation> -<translation id="8753948258138515839">「檔案」應用程式可以讓你快速存取自己存放在 Google 雲端硬碟、外部儲存空間或 ChromeOS Flex 裝置中的檔案。</translation> <translation id="8754200782896249056"><p>在受支援的桌面環境下執行「<ph name="PRODUCT_NAME" />」時,瀏覽器會使用系統的 Proxy 設定。不過,您的系統可能不受支援,或在啟動系統設定時發生問題。</p> <p>無論如何,您仍然可以透過命令列進行設定。如需標記及環境變數的詳細資訊,請參閱 <code>man <ph name="PRODUCT_BINARY_NAME" /></code>。</p></translation> @@ -11959,6 +11955,7 @@ <translation id="992778845837390402">目前正在執行 Linux 備份作業</translation> <translation id="994087375490600917">側邊面板</translation> <translation id="994289308992179865">循環播放(&L)</translation> +<translation id="995420352808264005">選擇裝置註冊類型</translation> <translation id="995755448277384931">新增 IBAN</translation> <translation id="996250603853062861">正在建立安全連線...</translation> <translation id="997143476478634194">這項設定可以調整造訪網站時的通知行為。網站通知經常用來告知重大消息,或是發送即時通訊訊息。</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index e0f4adef..1f4cb03 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -162,6 +162,7 @@ <translation id="1102759278139578486">Ayikwazi ukudawuniloda amafayela okuthasisela inodi eyinhloko. Zama futhi kamuva.</translation> <translation id="1103523840287552314">Humusha njalo i-<ph name="LANGUAGE" /></translation> <translation id="1104098698795583187">Ngokushesha uzolahlekelwa ukufinyelela kuleli qembu lamathebhu, futhi lizosuswa kuwo wonke amadivayisi akho</translation> +<translation id="1105934302947321130">IGoogle Beam ngeZoom</translation> <translation id="1106270460549661906">Yeka ukwabelana ngeGemini</translation> <translation id="1106350001632362876">Khuphula umkhawulo</translation> <translation id="110850812463801904">Xhuma mathupha ku-OneDrive</translation> @@ -284,7 +285,6 @@ <translation id="117916940443676133">Ukhiye wakho wokuqinisekisa ubunikazi awuvunyelwe ngephinikhodi. Ukuze uphathe idatha yokungena ngemvume, qala udale iphinikhodi</translation> <translation id="1179400851034021914">I-IBAN ayivumelekile</translation> <translation id="1179902906564467236">Landela imiyalelo efonini yakho noma sebenzisa i-app yekhamera</translation> -<translation id="1180117276105724040">Ibuyisela amawindi avela kuseshini yakho yangaphambilini...</translation> <translation id="118057123461613219">Ukulondoloza okukhulu</translation> <translation id="1181037720776840403">Susa</translation> <translation id="1182876754474670069">ikhaya</translation> @@ -761,7 +761,6 @@ <translation id="151501797353681931">WECOPIEDAPPLE</translation> <translation id="1515163294334130951">Qalisa</translation> <translation id="1517467582299994451">Ukuze usakaze ngekhodi, vula amasethingi okuvumelanisa ibhrawuza ye-Chrome</translation> -<translation id="1519090060276706457">Ukubuyisela amawindi kuthatha isikhathi eside kunokulindelekile</translation> <translation id="1521442365706402292">Phatha izitifiketi</translation> <translation id="1521655867290435174">Amashidi we-Google</translation> <translation id="1521774566618522728">Iyasebenza namhlanje</translation> @@ -1110,6 +1109,7 @@ <translation id="1745732479023874451">Phatha oxhumana nabo</translation> <translation id="1748283190377208783">{0,plural, =1{ifomu yobuningi obungasetshenzisiwe}one{Vula futhi uhlele amafayela angu-# kule-app yewebhu?}other{Vula futhi uhlele amafayela angu-# kule-app yewebhu?}}</translation> <translation id="1748563609363301860">Ungalondoloza le phasiwedi ku-akhawunti yakho ye-Google noma kule divayisi kuphela</translation> +<translation id="1749645492410897998">Ifaka isofthiwe</translation> <translation id="1749733017156547309">Kudingeka iphasiwedi</translation> <translation id="1750172676754093297">Ukhiye wakho wokufakazela ubuqiniso awukwazi ukugcina izigxivizo zeminwe</translation> <translation id="1750238553597293878">Qhubeka usebenzisa amaphasiwedi ku-Google Account yakho</translation> @@ -1181,7 +1181,6 @@ <translation id="1796460466266263589">Ukuze uqhubeke nokusebenzisa iGemini, qinisekisa ukuthi nguwe</translation> <translation id="1796588414813960292">Izakhi ezidinga umsindo ngeke zisebenze</translation> <translation id="1798726622311813209">Amakhadi esikweletu nawe-debit</translation> -<translation id="1799852120691957794">Ayikwazi ukubuyisela amawindi avela kuseshini yakho yangaphambilini</translation> <translation id="180203835522132923">Sesha + O, bese u-W</translation> <translation id="1802624026913571222">Lala uma ikhava ivaliwe</translation> <translation id="1802687198411089702">Ikhasi aliphenduli. Ungalilinda noma uphume.</translation> @@ -2379,7 +2378,6 @@ <translation id="2610374175948698697">Ingakwazi ukubuka amafayela noma amafolda kudivayisi yakho</translation> <translation id="2610780100389066815">Ukusayina kohlu lokuthemba le-Microsoft</translation> <translation id="261114180663074524">Ngena ngemvume ku-akhawunti yakho ye-Microsoft bese uzama futhi</translation> -<translation id="2611702650078660078">Kuvele iphutha</translation> <translation id="2611776654555141051">Ithuluzi Elingunxande</translation> <translation id="2611885296070244383">Imakrofoni (ngaphakathi)</translation> <translation id="2612676031748830579">Inombolo yekhadi</translation> @@ -2743,7 +2741,6 @@ <translation id="285033512555869047">Valiwe</translation> <translation id="2850541429955027218">Engeza itimu</translation> <translation id="2851291081585704741">Awuxhunyiwe ku-inthanethi</translation> -<translation id="2852045827873867442">Kudingeka ukuxhumeka kwe-inthanethi.</translation> <translation id="285237063405807022">(iyalayisha)</translation> <translation id="2853121255651601031">Iphasiwedi ilondoloziwe</translation> <translation id="2854453262159518435">Shintsha iqembu lethebhu elikhona</translation> @@ -3610,6 +3607,7 @@ <translation id="3473241910002674503">Zulazula ekhaya, emuva bese ushintsha izinhlelo zokusebenza ngezinkinobho kumodi yethebulethi.</translation> <translation id="3473479545200714844">Isisondezi-skrini</translation> <translation id="3474218480460386727">Sebenzisa amaletha angu-99 noma ambalwa kumagama amasha</translation> +<translation id="3474330892505468100">IGoogle Beam neMeet</translation> <translation id="3474624961160222204">Qhubeka njengo-<ph name="NAME" /></translation> <translation id="3477772589943384839">Thola ukonga inkumbulo okumaphakathi. Amathebhu akho angasebenzi ngemva kwesikhathi eside.</translation> <translation id="347785443197175480">Qhubeka uvumele i-<ph name="HOST" /> ukuthi ifinyelele kukhamela yakho nemakrofoni</translation> @@ -5497,7 +5495,6 @@ <translation id="4779766576531456629">Qamba kabusha inethiwekhi ye-eSIM Cellular</translation> <translation id="4780321648949301421">Londoloza ikhasi njenge...</translation> <translation id="4780558987886269159">Okomsebenzi</translation> -<translation id="4781633367688946589">Qhubekela kuseshini entsha</translation> <translation id="4784349455504343791">I-<ph name="WEBSITE_ORIGIN" /> ifuna ukusebenzisa ulwazi lomuntu siqu oluphuma ku-wallet yakho edijithali.</translation> <translation id="4785719467058219317">Usebenzisa ukhiye wokuvikela ongabhalisiwe ngale webhusayithi</translation> <translation id="4785914069240823137">Khansela Ukunqampuna</translation> @@ -6286,6 +6283,7 @@ <translation id="5337926771328966926">Igama ledivayisi lamanje lingu-<ph name="DEVICE_NAME" /></translation> <translation id="5338338064218053691">Ungaphequlula ngokwemfihlo usebenzisa iwindi le-incognito</translation> <translation id="5338503421962489998">Ukulondoloza kwasendaweni</translation> +<translation id="5340620183031438925">Ukuze ubuze Imodi ye-AI mayelana nethebhu yakho ngaphandle kokushiya ikhasi, qinisekisa ukuthi nguwe. Uzophinde uthole namaphasiwedi akho nokuningi kuwo wonke amadivayisi akho.</translation> <translation id="5340787663756381836">&Thola futhi uhlele</translation> <translation id="5340900621595888432">Thumela idatha yokuxilonga neyokusetshenziswa</translation> <translation id="5341793073192892252">Amakhukhi alandelayo aye wavinjwa (amakhukhi wenkampani yangaphandle aye wavinjelwa ngaphandle kokukhishiwe)</translation> @@ -7473,7 +7471,6 @@ <translation id="6180550893222597997">Yimuphi ukhiye wokudlula ofuna ukuwusebenzisela i-<ph name="APP_NAME" />?</translation> <translation id="6181218116951226898">Ngezinye izikhathi ama-app athuthukisa indlela abhrendwe ngayo. Buyekeza lonke ushintsho ukuze uqiniseke ukuthi ukhululekile ngakho ngaphambi kokuba athuthukiswe.</translation> <translation id="6181431612547969857">Ukulanda kuvinjelwe</translation> -<translation id="6182100780603067202">Futhi yabelana ngomsindo we-application (kuwo wonke amawindi ayo)</translation> <translation id="6183369864942961155">Itimu ekhaya/emnyama ngokuzenzekela</translation> <translation id="6183773856988300112">IGemini kuChrome isebenzisa ukubhrawuza okuzenzekelayo ukuze isebenze kumathebhu akho futhi iqedele imisebenzi oyinikezayo. <ph name="LINK_BEGIN" />Funda kabanzi<ph name="LINK_END" /></translation> <translation id="6184099524311454384">Amathebhu Wokusesha</translation> @@ -8268,7 +8265,6 @@ <translation id="6754359471209693699">Qala ukusesha okusha</translation> <translation id="6754918760968695779">Ukufaka Ngokushesha</translation> <translation id="6755702685749429945">Faka isichazamazwi</translation> -<translation id="6756157672127672536">I-app ye-Files inikeza ukufinyelela okusheshayo kumafayela owalondoloze ku-Google Drive, isitoreji sangaphandle, noma idivayisi yakho ye-ChromeOS.</translation> <translation id="6756643207511618722">Izinjini zenkulumo</translation> <translation id="6757431299485455321">Siza amanye amadivayisi athole le hotspot.</translation> <translation id="6758056191028427665">Sazise ukuthi siqhuba kanjani.</translation> @@ -9214,6 +9210,7 @@ <translation id="7406912950279255498">Imodi yokuguqulwa kombala</translation> <translation id="7407430846095439694">Ngenisa uphinde ubophezele</translation> <translation id="7407504355934009739">Iningi labantu livimbela izaziso kusukela kuleli sayithi</translation> +<translation id="7407578029724074226">I-<ph name="FILE_NAME" /> inedatha ebucayi. Inhlangano yakho izokuvumela ukuthi uyilondoloze esitorejini se-cloud noma uyilahle</translation> <translation id="7408080603962564527">Lokhu kuzobonakala kwabanye</translation> <translation id="740810853557944681">Engeza iseva yephrinta</translation> <translation id="7409549334477097887">Kukhulu Kakhulu</translation> @@ -9267,6 +9264,7 @@ <translation id="7434969625063495310">Ayikwazanga ukungeza iseva yokuphrinta. Sicela uhlole ukulungiswa kweseva bese uyazama futhi.</translation> <translation id="7436921188514130341">Hawu, iphutha! Kube nephutha ngesikhathi sokuqamba kabusha.</translation> <translation id="7439519621174723623">Engeza igama ledivayisi ukuze uqhubeke</translation> +<translation id="743982235360757672">Gcina Imodi ye-AI iseduze ngenkathi ubhrawuza</translation> <translation id="7441736532026945583">Khetha okuthi "Fihla Iqembu" ukuze ususe iqembu emugqeni wamathebhu akho</translation> <translation id="7441736921018636843">Ukuze ushintshe lesi silungiselelo, <ph name="BEGIN_LINK" />setha kabusha ukuvumelanisa<ph name="END_LINK" /> ukuze ususe umshwana wakho wokuvumelanisa</translation> <translation id="7441830548568730290">Abanye abasebenzisi</translation> @@ -10005,7 +10003,6 @@ <translation id="794676567536738329">Qinisekisa izimvume</translation> <translation id="7947962633355574091">K&opisha ikheli levidiyo</translation> <translation id="7947964080535614577">Ngokuvamile amasayithi abonisa izikhangiso ukuze ahlinzeke ngokuqukethwe noma amasevisi mahhala. Kodwa, amanye amasayithi aziwa ngokubonisa izikhangiso ezisongelayo noma ezilahlekisayo.</translation> -<translation id="7948239795436419268">Ungabuyiseli amawindi</translation> <translation id="7948407723851303488">Wonke amakhasi we-<ph name="DOMAIN_NAME" /></translation> <translation id="7950629216186736592">Isizathu: I-LBS isekela kuphela ama-URL athi http://, https://, kanye nathi file://.</translation> <translation id="7950814699499457511">Kuvuliwe • Lesi sandiso asikashicileli izindlela zangasase zokuziphatha, siyiqoqa futhi siyisebenzise kanjani idatha.</translation> @@ -11194,7 +11191,6 @@ <translation id="8751034568832412184">Isikole</translation> <translation id="8751329102746373229">Ezivela kumlawuli wakho</translation> <translation id="8752451679755290210">Hamba phakathi kwezinto ngokuzenzakalelayo</translation> -<translation id="8753948258138515839">I-app ye-Files inikeza ukufinyelela okusheshayo kumafayela owalondoloze ku-Google Drive, isitoreji sangaphandle, noma idivayisi yakho ye-ChromeOS Flex.</translation> <translation id="8754200782896249056"><p>Uma isebenzisa i-<ph name="PRODUCT_NAME" /> ngaphansi kwemvelo esekelwe yedeskithophu, izilungiselelo zommeleli wesistimu zizosetshenziswa. Kodwa, kungenzeka ukuthi isistimu yakho ayisekelwe noma bekukhona inkinga yokuqalisa ukulungiselelwa kwesistimu yakho.</p> <p>Kodwa usengalungiselela ngomugqa womyalo. Sicela ubone i-<code>man <ph name="PRODUCT_BINARY_NAME" /></code> ukuze uthole olunye ulwazi kumafulegi nokuhlukile kwemvelo.</p></translation> @@ -11988,6 +11984,7 @@ <translation id="992778845837390402">Ukwenza isipele kwe-Linux manje kuyaqhubeka</translation> <translation id="994087375490600917">Amaphaneli aseceleni</translation> <translation id="994289308992179865">Iluphi</translation> +<translation id="995420352808264005">Khetha uhlobo lokubhalisa idivayisi</translation> <translation id="995755448277384931">Engeza i-IBAN</translation> <translation id="996250603853062861">Isungula ukuxhumeka okuvikelekile...</translation> <translation id="997143476478634194">Amasayithi alandela le sethingi ngokuzenzekelayo lapho uwavakashela. Ngokuvamile amasayithi athumela izaziso ukukwazisa ngezindaba eziphambili noma ngemiyalezo yengxoxo</translation>
diff --git a/chrome/app/resources/google_chrome_strings_af.xtb b/chrome/app/resources/google_chrome_strings_af.xtb index be9c1c1..7b2c81c 100644 --- a/chrome/app/resources/google_chrome_strings_af.xtb +++ b/chrome/app/resources/google_chrome_strings_af.xtb
@@ -782,6 +782,7 @@ <translation id="8862326446509486874">Jy het nie die gepaste regte vir stelselvlak-installering nie. Probeer om die installeerder weer te laat loop as Administrateur.</translation> <translation id="8865415417596392024">Chrome-data in jou rekening</translation> <translation id="8883862939660515976">Vra Google Lens oor hierdie prent</translation> +<translation id="8892956691293410744">Meld by Chrome aan om KI-modus oor jou oortjie te vra sonder om die bladsy te verlaat. Jy sal ook jou wagwoorde en meer op al jou toestelle kry.</translation> <translation id="8914504000324227558">Herbegin Chrome</translation> <translation id="8922193594870374009">Meld op albei toestelle by Chrome aan om 'n nommer van <ph name="ORIGIN" /> af na jou Android-foon te stuur.</translation> <translation id="8922998289262614701">Verwyder hierdie app se data uit Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_am.xtb b/chrome/app/resources/google_chrome_strings_am.xtb index 1d0d2e25..d78cb04 100644 --- a/chrome/app/resources/google_chrome_strings_am.xtb +++ b/chrome/app/resources/google_chrome_strings_am.xtb
@@ -782,6 +782,7 @@ <translation id="8862326446509486874">ለስርዓተ-ደረጃ ጭነት ተገቢ መብቶች የሉዎትም። ጫኚውን እንደ አስተዳዳሪ በማሄድ እንደገና ይሞክሩ።</translation> <translation id="8865415417596392024">በመለያዎ ውስጥ የChrome ውሂብ</translation> <translation id="8883862939660515976">ስለዚህ ምስል Google ሌንስን ይጠይቁ</translation> +<translation id="8892956691293410744">ገጹን ለቅቀው ሳይወጡ ስለ ትርዎ የሰው ሠራሽ አስተውሎት ሁነታን ለመጠየቅ ወደ Chrome ይግቡ። እንዲሁም የይለፍ ቃላትዎን እና ሌሎችንም በሁሉም መሣሪያዎችዎ ላይ ያገኛሉ።</translation> <translation id="8914504000324227558">Chromeን ዳግም አስጀምር</translation> <translation id="8922193594870374009">አንድ ቁጥር ከ<ph name="ORIGIN" /> ወደ የእርስዎ Android ስልክ ለመላክ በሁለቱም መሣሪያዎች ላይ በመለያ ወደ Chrome ይግቡ።</translation> <translation id="8922998289262614701">የዚህን መተግበሪያ ውሂብ ከChrome ላይ ያስወግዱ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb index d789746..71b2fdc 100644 --- a/chrome/app/resources/google_chrome_strings_ar.xtb +++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -778,6 +778,7 @@ <translation id="8862326446509486874">لا تملك الحقوق الكافية للتثبيت على مستوى النظام. جرّب تشغيل المثبِّت بصفة مشرف.</translation> <translation id="8865415417596392024">بيانات Chrome في حسابك</translation> <translation id="8883862939660515976">طرح أسئلة حول هذه الصورة باستخدام "عدسة Google"</translation> +<translation id="8892956691293410744">لطرح أسئلة في "وضع AI" حول علامة التبويب بدون مغادرة الصفحة، يُرجى تسجيل الدخول إلى Chrome. بإمكانك أيضًا الوصول إلى كلمات المرور وغيرها من البيانات على جميع أجهزتك.</translation> <translation id="8914504000324227558">إعادة تشغيل Chrome</translation> <translation id="8922193594870374009">لإرسال رقم من <ph name="ORIGIN" /> إلى هاتفك الذي يعمل بنظام التشغيل Android، يُرجى تسجيل الدخول إلى متصفِّح Chrome على الجهازَين.</translation> <translation id="8922998289262614701">إزالة بيانات هذا التطبيق من Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_as.xtb b/chrome/app/resources/google_chrome_strings_as.xtb index 6f3072f..54fcd0a 100644 --- a/chrome/app/resources/google_chrome_strings_as.xtb +++ b/chrome/app/resources/google_chrome_strings_as.xtb
@@ -782,6 +782,7 @@ <translation id="8862326446509486874">ছিষ্টেম-পৰ্যায়ৰ ইনষ্টলৰ বাবে আপোনাৰ সঠিক অধিকাৰ নাই। প্রশাসক হিচাপে ইনষ্টলাৰটো পুনৰ চলাই চাওক।</translation> <translation id="8865415417596392024">আপোনাৰ একাউণ্টত থকা Chromeৰ ডেটা</translation> <translation id="8883862939660515976">Google Lensক এই প্ৰতিচ্ছবিৰ বিষয়ে সোধক</translation> +<translation id="8892956691293410744">পৃষ্ঠাখন এৰি নোযোৱাকৈ আপোনাৰ টেবটোৰ বিষয়ে AI ম’ডক সুধিবলৈ, Chromeত ছাইন ইন কৰক। আপুনি লগতে আপোনাৰ আটাইবোৰ ডিভাইচত পাছৱৰ্ড আৰু অধিক লাভ কৰিব।</translation> <translation id="8914504000324227558">Chrome পুনৰ লঞ্চ কৰক</translation> <translation id="8922193594870374009"><ph name="ORIGIN" />ৰ পৰা এটা নম্বৰ আপোনাৰ Android ফ’নলৈ পঠিয়াবলৈ দুয়োটা ডিভাইচত Chromeত ছাইন ইন কৰক।</translation> <translation id="8922998289262614701">Chromeৰ পৰা এই এপৰ ডেটা আঁতৰাওক</translation>
diff --git a/chrome/app/resources/google_chrome_strings_az.xtb b/chrome/app/resources/google_chrome_strings_az.xtb index 2431bab..70c04149 100644 --- a/chrome/app/resources/google_chrome_strings_az.xtb +++ b/chrome/app/resources/google_chrome_strings_az.xtb
@@ -774,6 +774,7 @@ <translation id="8862326446509486874">Sistem səviyyəli quraşdırma üçün uyğun hüquqlarınız yoxdur. Quraşdırıcını yenidən Administrator olaraq işə salmağa cəhd edin.</translation> <translation id="8865415417596392024">Hesabdakı Chrome datası</translation> <translation id="8883862939660515976">Bu şəkil haqqında Google Linzadan soruşun</translation> +<translation id="8892956691293410744">Səhifədən çıxmadan Sİ rejimindən tab haqqında soruşmaq üçün Chrome-a daxil olun. Bütün cihazlarınızda parollarınızı və daha çoxunu da əldə edəcəksiniz.</translation> <translation id="8914504000324227558">Chrome'u yenidən başladın</translation> <translation id="8922193594870374009"><ph name="ORIGIN" /> cihazından Android telefonunuza nömrə göndərmək üçün hər iki cihazda Chrome'a daxil olun.</translation> <translation id="8922998289262614701">Bu tətbiqin datası Chrome-dan silinsin?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_be.xtb b/chrome/app/resources/google_chrome_strings_be.xtb index 0c47ffe4..f476791d 100644 --- a/chrome/app/resources/google_chrome_strings_be.xtb +++ b/chrome/app/resources/google_chrome_strings_be.xtb
@@ -781,6 +781,7 @@ <translation id="8862326446509486874">Для ўсталявання на сістэмным узроўні ў вас няма неабходных правоў. Паспрабуйце запусціць усталёўшчык ад імені адміністратара.</translation> <translation id="8865415417596392024">Даныя Chrome у вашым уліковым запісе</translation> <translation id="8883862939660515976">Спытаць пра гэты відарыс з дапамогай Google Аб’ектыва</translation> +<translation id="8892956691293410744">Каб задаць пытанне пра ўкладку ў рэжыме AI, не пакідаючы старонку, увайдзіце ў Chrome. Таксама вы атрымаеце доступ да сваіх пароляў і іншых даных на ўсіх сваіх прыладах.</translation> <translation id="8914504000324227558">Перазапусціць Chrome</translation> <translation id="8922193594870374009">Каб адпраўляць нумары з <ph name="ORIGIN" /> на свой тэлефон Android, увайдзіце ў Chrome на абедзвюх прыладах.</translation> <translation id="8922998289262614701">Выдаліць даныя гэтай праграмы з Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bg.xtb b/chrome/app/resources/google_chrome_strings_bg.xtb index d5d08546..2e62636 100644 --- a/chrome/app/resources/google_chrome_strings_bg.xtb +++ b/chrome/app/resources/google_chrome_strings_bg.xtb
@@ -776,6 +776,7 @@ <translation id="8862326446509486874">Нямате подходящи права за инсталация на ниво система. Опитайте да стартирате отново инсталационната програма като администратор.</translation> <translation id="8865415417596392024">Данни в Chrome в профила ви</translation> <translation id="8883862939660515976">Попитайте Google Обектив за това изображение</translation> +<translation id="8892956691293410744">За да попитате режима с AI за раздела си, без да напускате страницата, влезте в профила си в Chrome. Също така ще получите паролите си и др. на всичките си устройства.</translation> <translation id="8914504000324227558">Повторно стартиране на Chrome</translation> <translation id="8922193594870374009">За да изпратите номер от <ph name="ORIGIN" /> до телефона си с Android, влезте в Chrome и на двете устройства.</translation> <translation id="8922998289262614701">Премахване на данните за това приложение от Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bn.xtb b/chrome/app/resources/google_chrome_strings_bn.xtb index 738fb4583..264c3b4 100644 --- a/chrome/app/resources/google_chrome_strings_bn.xtb +++ b/chrome/app/resources/google_chrome_strings_bn.xtb
@@ -777,6 +777,7 @@ <translation id="8862326446509486874">সিস্টেম-স্তরীয় ইনস্টলের জন্য আপনার কাছে যথাযথ অধিকারগুলি নেই৷ অ্যাডমিনিস্ট্রেটর হিসেবে আবার ইনস্টলারটি চালানোর চেষ্টা করুন৷</translation> <translation id="8865415417596392024">আপনার অ্যাকাউন্টের Chrome ডেটা</translation> <translation id="8883862939660515976">Google Lens-কে এই ছবির ব্যাপারে জিজ্ঞাসা করুন</translation> +<translation id="8892956691293410744">পৃষ্ঠা ছেড়ে না বেরিয়েই AI মোডকে আপনার ট্যাব সম্পর্কে জিজ্ঞাসা করতে, Chrome-এ সাইন-ইন করুন। তাছাড়া, আপনার সব ডিভাইসে পাসওয়ার্ড এবং আরও অনেক কিছু পাবেন।</translation> <translation id="8914504000324227558">Chrome আবার লঞ্চ করুন</translation> <translation id="8922193594870374009"><ph name="ORIGIN" /> থেকে আপনার Android ফোনে একটি নম্বর পাঠাতে, উভয় ডিভাইসের Chrome-এ সাইন-ইন করুন।</translation> <translation id="8922998289262614701">Chrome থেকে এই অ্যাপের ডেটা সরিয়ে দিন</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bs.xtb b/chrome/app/resources/google_chrome_strings_bs.xtb index 54ccb47..eff0c4d 100644 --- a/chrome/app/resources/google_chrome_strings_bs.xtb +++ b/chrome/app/resources/google_chrome_strings_bs.xtb
@@ -782,6 +782,7 @@ <translation id="8862326446509486874">Nemate odgovarajuća prava za instalaciju na nivou sistema. Pokušajte ponovo pokrenuti instalaciju kao administrator.</translation> <translation id="8865415417596392024">Podaci Chromea na vašem računu</translation> <translation id="8883862939660515976">Postavite pitanje Google Objektivu o ovoj slici</translation> +<translation id="8892956691293410744">Da pitate AI način rada o kartici bez napuštanja stranice, prijavite se u Chrome. Također ćete dobiti svoje lozinke i druge stavke na svim svojim uređajima.</translation> <translation id="8914504000324227558">Ponovo pokreni Chrome</translation> <translation id="8922193594870374009">Da pošaljete broj s uređaja <ph name="ORIGIN" /> na svoj Android telefon, prijavite se u Chrome na oba uređaja.</translation> <translation id="8922998289262614701">Ukloni podatke aplikacije iz Chromea</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb index fe13a1c..f13e6502 100644 --- a/chrome/app/resources/google_chrome_strings_ca.xtb +++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -774,6 +774,7 @@ <translation id="8862326446509486874">No disposeu dels drets necessaris per instal·lar aplicacions al sistema. Proveu de tornar a executar l'instal·lador com a administrador.</translation> <translation id="8865415417596392024">Dades de Chrome al teu compte</translation> <translation id="8883862939660515976">Pregunta a Google Lens sobre aquesta imatge</translation> +<translation id="8892956691293410744">Per fer preguntes al mode IA sobre la pestanya sense sortir de la pàgina, inicia la sessió a Chrome. També obtindràs les contrasenyes i altres dades en tots els teus dispositius.</translation> <translation id="8914504000324227558">Torna a iniciar Chrome</translation> <translation id="8922193594870374009">Per enviar un número del dispositiu <ph name="ORIGIN" /> al teu telèfon Android, inicia la sessió a Chrome en tots dos dispositius.</translation> <translation id="8922998289262614701">Suprimeix les dades d'aquesta aplicació de Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cs.xtb b/chrome/app/resources/google_chrome_strings_cs.xtb index 625790b..9788594 100644 --- a/chrome/app/resources/google_chrome_strings_cs.xtb +++ b/chrome/app/resources/google_chrome_strings_cs.xtb
@@ -781,6 +781,7 @@ <translation id="8862326446509486874">Nemáte práva nutná k provádění instalací na úrovni systému. Zkuste spustit instalační program jako správce.</translation> <translation id="8865415417596392024">Data Chromu ve vašem účtu</translation> <translation id="8883862939660515976">Zeptat se Google Lens na tento obrázek</translation> +<translation id="8892956691293410744">Pokud se chcete režimu AI ptát ohledně karty bez opuštění stránky, přihlaste se do Chromu. Na všech svých zařízeních budete mít k dispozici i svá hesla a další informace.</translation> <translation id="8914504000324227558">Znovu spustit Chrome</translation> <translation id="8922193594870374009">Chcete-li poslat číslo z webu <ph name="ORIGIN" /> na svůj telefon Android, v obou zařízeních se přihlaste do Chromu.</translation> <translation id="8922998289262614701">Odstranit z Chromu data této aplikace</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cy.xtb b/chrome/app/resources/google_chrome_strings_cy.xtb index 366d28e..d816948 100644 --- a/chrome/app/resources/google_chrome_strings_cy.xtb +++ b/chrome/app/resources/google_chrome_strings_cy.xtb
@@ -782,6 +782,7 @@ <translation id="8862326446509486874">Nid oes gennych yr hawliau priodol ar gyfer gosod ar lefel system. Rhowch gynnig arall ar redeg y gosodwr fel Gweinyddwr.</translation> <translation id="8865415417596392024">Data Chrome yn eich cyfrif</translation> <translation id="8883862939660515976">Gofyn i Google Lens am y llun hwn</translation> +<translation id="8892956691293410744">I ofyn i'r Dull AI am eich tab heb adael y dudalen, mewngofnodwch i Chrome. Byddwch hefyd yn cael eich cyfrineiriau a rhagor ar eich holl ddyfeisiau.</translation> <translation id="8914504000324227558">Ail-lansio Chrome</translation> <translation id="8922193594870374009">I anfon rhif o <ph name="ORIGIN" /> i'ch ffôn Android, mewngofnodwch i Chrome ar y ddwy ddyfais.</translation> <translation id="8922998289262614701">Tynnu'r data'r ap hwn o Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_da.xtb b/chrome/app/resources/google_chrome_strings_da.xtb index 779dd91..498d646 100644 --- a/chrome/app/resources/google_chrome_strings_da.xtb +++ b/chrome/app/resources/google_chrome_strings_da.xtb
@@ -774,6 +774,7 @@ <translation id="8862326446509486874">Du har ikke de nødvendige rettigheder til en installation på systemniveau. Prøv at køre installationsprogrammet igen som administrator.</translation> <translation id="8865415417596392024">Chrome-data på din konto</translation> <translation id="8883862939660515976">Stil Google Lens spørgsmål om dette billede</translation> +<translation id="8892956691293410744">Hvis du vil spørge AI-tilstand om din fane uden at forlade siden, skal du logge ind i Chrome. Du kan også se dine adgangskoder m.m. på alle dine enheder.</translation> <translation id="8914504000324227558">Genstart Chrome</translation> <translation id="8922193594870374009">Hvis du vil sende et nummer fra <ph name="ORIGIN" /> til din Android-telefon, skal du logge ind på Chrome på begge enheder.</translation> <translation id="8922998289262614701">Fjern denne apps data fra Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_de.xtb b/chrome/app/resources/google_chrome_strings_de.xtb index 6b63010..0aeeab3 100644 --- a/chrome/app/resources/google_chrome_strings_de.xtb +++ b/chrome/app/resources/google_chrome_strings_de.xtb
@@ -773,6 +773,7 @@ <translation id="8862326446509486874">Du verfügst nicht über die erforderlichen Rechte für eine systemweite Installation. Starte das Installationsprogramm noch einmal als Admin.</translation> <translation id="8865415417596392024">Chrome-Daten in meinem Konto</translation> <translation id="8883862939660515976">Google Lens nach Infos zu diesem Bild fragen</translation> +<translation id="8892956691293410744">Wenn du im KI-Modus Fragen zu Inhalten auf deinem Tab stellen möchtest, ohne die Seite zu verlassen, melde dich in Chrome an. Du kannst dann auch auf allen deinen Geräten auf deine Passwörter und weitere Daten zugreifen.</translation> <translation id="8914504000324227558">Chrome neu starten</translation> <translation id="8922193594870374009">Wenn du eine Nummer von <ph name="ORIGIN" /> an dein Android-Smartphone senden möchtest, musst du dich auf beiden Geräten in Chrome anmelden.</translation> <translation id="8922998289262614701">Daten dieser App aus Chrome entfernen</translation>
diff --git a/chrome/app/resources/google_chrome_strings_el.xtb b/chrome/app/resources/google_chrome_strings_el.xtb index 4e15a9d..994886f 100644 --- a/chrome/app/resources/google_chrome_strings_el.xtb +++ b/chrome/app/resources/google_chrome_strings_el.xtb
@@ -778,6 +778,7 @@ <translation id="8862326446509486874">Δεν έχετε τα απαραίτητα δικαιώματα για εγκατάσταση σε επίπεδο συστήματος. Δοκιμάστε να εκτελέσετε ξανά το πρόγραμμα εγκατάστασης ως Διαχειριστής.</translation> <translation id="8865415417596392024">Δεδομένα Chrome στον λογαριασμό σας</translation> <translation id="8883862939660515976">Ερώτηση στο Google Lens σχετικά με αυτή την εικόνα</translation> +<translation id="8892956691293410744">Για να κάνετε ερωτήσεις στη Λειτουργία AI σχετικά με την καρτέλα σας χωρίς να αποχωρήσετε από τη σελίδα, συνδεθείτε στο Chrome. Θα έχετε επίσης πρόσβαση στους κωδικούς πρόσβασής σας και σε άλλα στοιχεία σε όλες τις συσκευές σας.</translation> <translation id="8914504000324227558">Επανεκκίνηση του Chrome</translation> <translation id="8922193594870374009">Για να στείλετε έναν αριθμό από το <ph name="ORIGIN" /> στο τηλέφωνό σας Android, συνδεθείτε στο Chrome και στις δύο συσκευές.</translation> <translation id="8922998289262614701">Κατάργηση των δεδομένων αυτής της εφαρμογής από το Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb index ec8f981..93ff88e 100644 --- a/chrome/app/resources/google_chrome_strings_en-GB.xtb +++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -782,6 +782,7 @@ <translation id="8862326446509486874">You do not have appropriate rights for system-level installation. Try running the installer again as Administrator.</translation> <translation id="8865415417596392024">Chrome data in your account</translation> <translation id="8883862939660515976">Ask Google Lens about this image</translation> +<translation id="8892956691293410744">To ask AI Mode about your tab without leaving the page, sign in to Chrome. You'll also get your passwords and more on all your devices.</translation> <translation id="8914504000324227558">Relaunch Chrome</translation> <translation id="8922193594870374009">To send a number from <ph name="ORIGIN" /> to your Android phone, sign in to Chrome on both devices.</translation> <translation id="8922998289262614701">Remove this app's data from Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es-419.xtb b/chrome/app/resources/google_chrome_strings_es-419.xtb index eef29dbc..4d810ef5 100644 --- a/chrome/app/resources/google_chrome_strings_es-419.xtb +++ b/chrome/app/resources/google_chrome_strings_es-419.xtb
@@ -774,6 +774,7 @@ <translation id="8862326446509486874">No tienes los derechos que se requieren para realizar la instalación al nivel del sistema. Intenta ejecutar el instalador nuevamente como Administrador.</translation> <translation id="8865415417596392024">Datos de Chrome de tu cuenta</translation> <translation id="8883862939660515976">Preguntar a Google Lens acerca de esta imagen</translation> +<translation id="8892956691293410744">Accede a Chrome para preguntarle al Modo IA sobre tu pestaña sin salir de la página. También obtendrás tus contraseñas y más en todos tus dispositivos.</translation> <translation id="8914504000324227558">Volver a iniciar Chrome</translation> <translation id="8922193594870374009">Para enviar un número de <ph name="ORIGIN" /> a tu teléfono Android, accede a Chrome en ambos dispositivos.</translation> <translation id="8922998289262614701">Quitar los datos de esta app de Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_et.xtb b/chrome/app/resources/google_chrome_strings_et.xtb index af06702..0d42501 100644 --- a/chrome/app/resources/google_chrome_strings_et.xtb +++ b/chrome/app/resources/google_chrome_strings_et.xtb
@@ -778,6 +778,7 @@ <translation id="8862326446509486874">Teil ei ole süsteemi tasemel installimiseks sobivaid õigusi. Proovige installijat administraatorina uuesti käivitada.</translation> <translation id="8865415417596392024">Chrome'i andmed teie kontol</translation> <translation id="8883862939660515976">Küsige Google Lensilt selle pildi kohta</translation> +<translation id="8892956691293410744">AI-režiimilt vahelehe kohta küsimiseks ilma lehelt lahkumata logige Chrome'i sisse. Lisaks saate kõigis oma seadmetes oma paroole ja muud kasutada.</translation> <translation id="8914504000324227558">Käivita Chrome uuesti</translation> <translation id="8922193594870374009">Numbri saatmiseks asukohast <ph name="ORIGIN" /> Android-telefoni logige mõlemas seadmes Chrome'i sisse.</translation> <translation id="8922998289262614701">Eemalda selle rakenduse andmed Chrome’ist</translation>
diff --git a/chrome/app/resources/google_chrome_strings_eu.xtb b/chrome/app/resources/google_chrome_strings_eu.xtb index de3a27e..4867ff2c 100644 --- a/chrome/app/resources/google_chrome_strings_eu.xtb +++ b/chrome/app/resources/google_chrome_strings_eu.xtb
@@ -781,6 +781,7 @@ <translation id="8862326446509486874">Ez dituzu eskubide egokiak sistema mailako instalazio bat egiteko. Saiatu instalatzailea administratzaile gisa abiarazten.</translation> <translation id="8865415417596392024">Kontuan gordeta dauzkazun Chrome-ko datuak</translation> <translation id="8883862939660515976">Egin irudi honi buruzko galdera bat Google Lens-i</translation> +<translation id="8892956691293410744">AA moduari fitxari buruzko galderak egiteko orritik irten gabe, hasi saioa Chrome-n. Pasahitzak eta beste ere izango dituzu gailu guztietan.</translation> <translation id="8914504000324227558">Berrabiarazi Chrome</translation> <translation id="8922193594870374009">Zenbaki bat <ph name="ORIGIN" /> webgunetik Android-eko telefonora bidaltzeko, hasi Chrome-ko saioa bi gailuetan.</translation> <translation id="8922998289262614701">Kendu aplikazio honetako datuak Chrome-tik</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fa.xtb b/chrome/app/resources/google_chrome_strings_fa.xtb index ca4daee..7da03d78 100644 --- a/chrome/app/resources/google_chrome_strings_fa.xtb +++ b/chrome/app/resources/google_chrome_strings_fa.xtb
@@ -34,7 +34,7 @@ <translation id="1330562121671411446">تشخیص دادن زبان</translation> <translation id="1335640173511558774"><ph name="MANAGER" /> لازم میداند که پیشاز استفاده از این دستگاه، «شرایط خدمات» زیر را بخوانید و آنها را بپذیرید. این شرایط باعث بسط داده شدن، تغییر یافتن، یا محدود شدن «شرایط Google ChromeOS Flex» نمیشود.</translation> <translation id="1341711321000856656">برای دیدن گذرواژههای نمایه Chrome دیگر، میتوانید به آن نمایه بروید</translation> -<translation id="1343830902827845050">ورود به سیستم Chrome</translation> +<translation id="1343830902827845050">وارد سیستم Chrome شوید</translation> <translation id="1356661055722410047">جدید! میتوانید هم نوشتار و هم تصاویر روی صفحهنمایش را ترجمه کنید</translation> <translation id="1363996462118479832">بهدلیل بروز خطا هنگام ورود به سیستم، ChromeOS نتوانست دادههایتان را همگامسازی کند.</translation> <translation id="137466361146087520">Google Chrome نسخه بتا</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fi.xtb b/chrome/app/resources/google_chrome_strings_fi.xtb index 34c5c4a..b625f179 100644 --- a/chrome/app/resources/google_chrome_strings_fi.xtb +++ b/chrome/app/resources/google_chrome_strings_fi.xtb
@@ -774,6 +774,7 @@ <translation id="8862326446509486874">Sinulla ei ole käyttöoikeuksia järjestelmätason asennukseen. Kokeile asennusohjelman suorittamista uudelleen järjestelmänvalvojana.</translation> <translation id="8865415417596392024">Tilisi Chrome-data</translation> <translation id="8883862939660515976">Kysy Google Lensilta tästä kuvasta</translation> +<translation id="8892956691293410744">Jos haluat kysyä tekoälytilalta välilehdestä poistumatta sivulta, kirjaudu Chromeen. Voit myös käyttää salasanojasi ja muita tietoja kaikilla laitteillasi.</translation> <translation id="8914504000324227558">Käynnistä Chrome uudelleen</translation> <translation id="8922193594870374009">Jos haluat lähettää numeron osoitteesta <ph name="ORIGIN" /> Android-puhelimeesi, kirjaudu Chromeen molemmilla laitteilla.</translation> <translation id="8922998289262614701">Poista tämän sovelluksen data Chromesta</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr-CA.xtb b/chrome/app/resources/google_chrome_strings_fr-CA.xtb index 27a3d7e3..a7bd92e8 100644 --- a/chrome/app/resources/google_chrome_strings_fr-CA.xtb +++ b/chrome/app/resources/google_chrome_strings_fr-CA.xtb
@@ -780,6 +780,7 @@ <translation id="8862326446509486874">Vous ne disposez pas des droits requis pour faire une installation sur le système. Relancez l'installation une fois que vous serez connecté comme administrateur.</translation> <translation id="8865415417596392024">Données relatives à Chrome dans votre compte</translation> <translation id="8883862939660515976">Poser des questions à Lentille Google à propos de cette image</translation> +<translation id="8892956691293410744">Pour poser des questions au mode IA sur votre onglet sans quitter la page, connectez-vous à Chrome. Vous obtiendrez également vos mots de passe et bien plus encore sur tous vos appareils.</translation> <translation id="8914504000324227558">Relancer Google Chrome</translation> <translation id="8922193594870374009">Pour envoyer un numéro de <ph name="ORIGIN" /> vers votre téléphone Android, connectez-vous à Chrome sur les deux appareils.</translation> <translation id="8922998289262614701">Retirer les données de cette appli de Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr.xtb b/chrome/app/resources/google_chrome_strings_fr.xtb index 3142420..3b8d2c8 100644 --- a/chrome/app/resources/google_chrome_strings_fr.xtb +++ b/chrome/app/resources/google_chrome_strings_fr.xtb
@@ -781,6 +781,7 @@ <translation id="8862326446509486874">Vous ne disposez pas des droits requis pour installer la version système. Relancez l'installation en vous connectant comme administrateur.</translation> <translation id="8865415417596392024">Données Chrome de votre compte</translation> <translation id="8883862939660515976">Demander des infos sur cette image à Google Lens</translation> +<translation id="8892956691293410744">Pour poser des questions au Mode IA sur votre onglet sans quitter la page, connectez-vous à Chrome. Vous pourrez également accéder à vos mots de passe et à d'autres données sur tous vos appareils.</translation> <translation id="8914504000324227558">Relancer Google Chrome</translation> <translation id="8922193594870374009">Pour envoyer un numéro depuis <ph name="ORIGIN" /> vers votre téléphone Android, connectez-vous à Chrome sur les deux appareils.</translation> <translation id="8922998289262614701">Supprimer les données de cette appli de Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gl.xtb b/chrome/app/resources/google_chrome_strings_gl.xtb index 2d054c5..a9c394f 100644 --- a/chrome/app/resources/google_chrome_strings_gl.xtb +++ b/chrome/app/resources/google_chrome_strings_gl.xtb
@@ -782,6 +782,7 @@ <translation id="8862326446509486874">Non tes os dereitos apropiados para efectuar a instalación a nivel do sistema. Tenta volver executar o instalador como administrador.</translation> <translation id="8865415417596392024">Datos de Chrome na túa conta</translation> <translation id="8883862939660515976">Pregúntalle a Google Lens acerca desta imaxe</translation> +<translation id="8892956691293410744">Para preguntar co modo IA sobre a pestana sen saír da páxina, inicia sesión en Chrome. Tamén terás acceso aos teus contrasinais e moito máis en todos os teus dispositivos.</translation> <translation id="8914504000324227558">Reiniciar Chrome</translation> <translation id="8922193594870374009">Para enviar un número desde <ph name="ORIGIN" /> ao teu teléfono Android, inicia sesión en Chrome nos dous dispositivos.</translation> <translation id="8922998289262614701">Quitar de Chrome os datos desta aplicación</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb index fabbb83..f29ddcb8 100644 --- a/chrome/app/resources/google_chrome_strings_hi.xtb +++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -777,6 +777,7 @@ <translation id="8862326446509486874">सिस्टम-स्तर स्थापना के लिए आपके पास उचित अधिकार नहीं हैं. इंस्टॉलर को व्यवस्थापक के रूप में फिर से चलाने का प्रयास करें.</translation> <translation id="8865415417596392024">आपके खाते में मौजूद, Chrome का डेटा</translation> <translation id="8883862939660515976">Google Lens से इस इमेज के बारे में पूछें</translation> +<translation id="8892956691293410744">पेज छोड़े बिना एआई मोड से अपने टैब के बारे में सवाल पूछने के लिए, Chrome में साइन इन करें. आपको अपने सभी डिवाइसों पर अपने पासवर्ड वगैरह का ऐक्सेस भी मिलेगा.</translation> <translation id="8914504000324227558">Chrome को फिर से लॉन्च करें</translation> <translation id="8922193594870374009"><ph name="ORIGIN" /> से अपने Android फ़ोन पर नंबर भेजने के लिए, दोनों डिवाइस पर Chrome में साइन इन करें.</translation> <translation id="8922998289262614701">Chrome से इस ऐप्लिकेशन का डेटा हटाएं</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hr.xtb b/chrome/app/resources/google_chrome_strings_hr.xtb index 68305fa..abff5fc 100644 --- a/chrome/app/resources/google_chrome_strings_hr.xtb +++ b/chrome/app/resources/google_chrome_strings_hr.xtb
@@ -774,6 +774,7 @@ <translation id="8862326446509486874">Nemate odgovarajuća prava za instaliranje na razini sustava. Pokušajte ponovno pokrenuti program za instalaciju kao administrator.</translation> <translation id="8865415417596392024">Podaci iz Chromea na vašem računu</translation> <translation id="8883862939660515976">Postavite pitanja Google objektivu o toj slici</translation> +<translation id="8892956691293410744">Da biste postavili pitanje AI načinu o svojoj kartici bez napuštanja stranice, prijavite se u Chrome. Također ćete moći pristupati svojim zaporkama i drugim podacima na svim svojim uređajima.</translation> <translation id="8914504000324227558">Ponovo pokrenite Chrome</translation> <translation id="8922193594870374009">Da biste poslali broj s uređaja <ph name="ORIGIN" /> na svoj Android telefon, prijavite se na Chrome na oba uređaja.</translation> <translation id="8922998289262614701">Uklonite podatke ove aplikacije iz Chromea</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hu.xtb b/chrome/app/resources/google_chrome_strings_hu.xtb index 2b13b24..36e94d1 100644 --- a/chrome/app/resources/google_chrome_strings_hu.xtb +++ b/chrome/app/resources/google_chrome_strings_hu.xtb
@@ -774,6 +774,7 @@ <translation id="8862326446509486874">Nincsenek meg a megfelelő jogai a rendszerszintű telepítéshez. Indítsa újra a telepítőt rendszergazdaként.</translation> <translation id="8865415417596392024">A fiókjában található Chrome-adatok</translation> <translation id="8883862939660515976">Kérdés feltevése a Google Lensnek erről a képről</translation> +<translation id="8892956691293410744">Ha a lap elhagyása nélkül szeretne kérdéseket feltenni az AI-módnak a lapról, jelentkezzen be a Chrome-ba. Egyebek mellett a jelszavaihoz is hozzáférhet bármely eszközén.</translation> <translation id="8914504000324227558">A Chrome újraindítása</translation> <translation id="8922193594870374009">Ha innen: <ph name="ORIGIN" /> szeretne számot küldeni Android-telefonjára, jelentkezzen be a Chrome-ba mindkét eszközén.</translation> <translation id="8922998289262614701">Az alkalmazás adatainak eltávolítása a Chrome-ból</translation>
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb index 43d8060..e638fa6 100644 --- a/chrome/app/resources/google_chrome_strings_id.xtb +++ b/chrome/app/resources/google_chrome_strings_id.xtb
@@ -772,6 +772,7 @@ <translation id="8862326446509486874">Anda tidak memiliki hak yang diperlukan untuk penginstalan tingkat sistem. Coba jalankan lagi penginstal dengan login sebagai Administrator.</translation> <translation id="8865415417596392024">Data Chrome di akun Anda</translation> <translation id="8883862939660515976">Tanya Google Lens info tentang gambar ini</translation> +<translation id="8892956691293410744">Untuk bertanya kepada Mode AI tentang tab Anda tanpa keluar dari halaman, login ke Chrome. Anda juga akan mendapatkan sandi dan info Anda yang lain di semua perangkat Anda.</translation> <translation id="8914504000324227558">Luncurkan Ulang Chrome</translation> <translation id="8922193594870374009">Untuk mengirimkan nomor dari <ph name="ORIGIN" /> ke ponsel Android Anda, login ke Chrome di kedua perangkat.</translation> <translation id="8922998289262614701">Hapus data aplikasi ini dari Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_is.xtb b/chrome/app/resources/google_chrome_strings_is.xtb index da839c0..d88a617 100644 --- a/chrome/app/resources/google_chrome_strings_is.xtb +++ b/chrome/app/resources/google_chrome_strings_is.xtb
@@ -781,6 +781,7 @@ <translation id="8862326446509486874">Þú hefur ekki tilskilin réttindi til uppsetningar fyrir kerfið allt. Prófaðu að keyra uppsetningarforritið aftur sem stjórnandi.</translation> <translation id="8865415417596392024">Chrome-gögn á reikningnum þínum</translation> <translation id="8883862939660515976">Spyrja Google-linsu um þessa mynd</translation> +<translation id="8892956691293410744">Skráðu þig inn í Chrome til að spyrja gervigreindarstillingu um flipann þinn án þess að yfirgefa síðuna. Þú færð einnig aðgangsorðin þín og fleira í öllum tækjunum þínum.</translation> <translation id="8914504000324227558">Endurræsa Chrome</translation> <translation id="8922193594870374009">Til að senda númer úr <ph name="ORIGIN" /> í Android símann þinn skaltu skrá þig inn á Chrome í báðum tækjunum.</translation> <translation id="8922998289262614701">Fjarlægja þessi forritsgögn úr Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_it.xtb b/chrome/app/resources/google_chrome_strings_it.xtb index aac22ff6..dfb30bf 100644 --- a/chrome/app/resources/google_chrome_strings_it.xtb +++ b/chrome/app/resources/google_chrome_strings_it.xtb
@@ -772,6 +772,7 @@ <translation id="8862326446509486874">Non disponi dei diritti appropriati per l'installazione a livello di sistema. Prova a eseguire nuovamente il programma di installazione come Amministratore.</translation> <translation id="8865415417596392024">Dati di Chrome nel tuo account</translation> <translation id="8883862939660515976">Chiedi a Google Lens informazioni su questa immagine</translation> +<translation id="8892956691293410744">Per chiedere in AI Mode informazioni sulla tua scheda senza uscire dalla pagina, accedi a Chrome. Potrai anche usare le password e altri dati su tutti i tuoi dispositivi.</translation> <translation id="8914504000324227558">Riavvia Chrome</translation> <translation id="8922193594870374009">Per inviare un numero da <ph name="ORIGIN" /> al tuo telefono Android, accedi a Chrome su entrambi i dispositivi.</translation> <translation id="8922998289262614701">Rimuovi i dati di questa app da Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb index 5bee49f..2d2fe59 100644 --- a/chrome/app/resources/google_chrome_strings_iw.xtb +++ b/chrome/app/resources/google_chrome_strings_iw.xtb
@@ -774,6 +774,7 @@ <translation id="8862326446509486874">אין לך זכויות שמתאימות להתקנה ברמת המערכת. יש לנסות להפעיל שוב את המתקין כמנהל מערכת.</translation> <translation id="8865415417596392024">נתוני Chrome בחשבון שלך</translation> <translation id="8883862939660515976">רוצה לשאול ב-Google Lens על התמונה הזו?</translation> +<translation id="8892956691293410744">כדי לשאול במצב AI שאלות לגבי הכרטיסייה בלי לצאת מהדף, צריך להיכנס ל-Chrome. אחרי הכניסה לחשבון, אפשר גם לראות סיסמאות ופריטים נוספים בכל המכשירים.</translation> <translation id="8914504000324227558">הפעלה מחדש של Chrome</translation> <translation id="8922193594870374009">כדי לשלוח מספר מ-<ph name="ORIGIN" /> לטלפון Android, יש להיכנס אל Chrome בשני המכשירים.</translation> <translation id="8922998289262614701">להסיר את הנתונים של האפליקציה הזאת מ-Chrome?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ja.xtb b/chrome/app/resources/google_chrome_strings_ja.xtb index 89bf6cf..5cebf16b 100644 --- a/chrome/app/resources/google_chrome_strings_ja.xtb +++ b/chrome/app/resources/google_chrome_strings_ja.xtb
@@ -773,6 +773,7 @@ <translation id="8862326446509486874">権限が不十分なためシステムレベルのインストールができません。管理者権限でインストールしてください。</translation> <translation id="8865415417596392024">アカウント内の Chrome のデータ</translation> <translation id="8883862939660515976">Google レンズでこの画像について質問する</translation> +<translation id="8892956691293410744">ページを離れることなく、タブについて AI モードに質問するには、Chrome にログインしてください。これにより、すべてのデバイスでパスワードなどの設定も使用できるようになります。</translation> <translation id="8914504000324227558">Chrome の再起動</translation> <translation id="8922193594870374009"><ph name="ORIGIN" /> から Android スマートフォンに番号を送信するには、両方のデバイスで Chrome にログインしてください。</translation> <translation id="8922998289262614701">Chrome からこのアプリのデータを削除する</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kk.xtb b/chrome/app/resources/google_chrome_strings_kk.xtb index 048c8a1..e4a137f 100644 --- a/chrome/app/resources/google_chrome_strings_kk.xtb +++ b/chrome/app/resources/google_chrome_strings_kk.xtb
@@ -781,6 +781,7 @@ <translation id="8862326446509486874">Жүйе деңгейінде орнату үшін тиісті құқықтарыңыз жоқ. Әкімші ретінде орнату құралын қайта іске қосып көріңіз.</translation> <translation id="8865415417596392024">Аккаунтыңыздағы Chrome деректері</translation> <translation id="8883862939660515976">Google Lens-ден осы сурет жайында сұрау</translation> +<translation id="8892956691293410744">Беттен шықпай-ақ AI режиміне қойынды туралы сұрақ қою үшін Chrome-ға кіріңіз. Құпия сөздер мен басқа да деректеріңіз барлық құрылғыңызда қолжетімді болады.</translation> <translation id="8914504000324227558">Chrome қолданбасын қайта іске қосу</translation> <translation id="8922193594870374009">Нөмірді <ph name="ORIGIN" /> құрылғысынан Android телефонына жіберу үшін екі құрылғыда да Chrome браузеріне кіріңіз.</translation> <translation id="8922998289262614701">Chrome-нан бұл қолданба деректерін өшіру</translation>
diff --git a/chrome/app/resources/google_chrome_strings_km.xtb b/chrome/app/resources/google_chrome_strings_km.xtb index 676d53b..6b2c5dd2 100644 --- a/chrome/app/resources/google_chrome_strings_km.xtb +++ b/chrome/app/resources/google_chrome_strings_km.xtb
@@ -781,6 +781,7 @@ <translation id="8862326446509486874">អ្នកមិនមានសិទ្ធិសមស្របក្នុងការតំឡើងកម្រិតប្រព័ន្ធទេ។ សាកល្បងដំណើរការកម្មវិធីតំឡើងម្តងទៀតក្នុងរបៀបអ្នកគ្រប់គ្រង។</translation> <translation id="8865415417596392024">ទិន្នន័យ Chrome នៅក្នុងគណនីរបស់អ្នក</translation> <translation id="8883862939660515976">សួរ Google Lens អំពីរូបភាពនេះ</translation> +<translation id="8892956691293410744">ដើម្បីសួរមុខងារ AI អំពីផ្ទាំងរបស់អ្នកដោយមិនចាកចេញពីទំព័រ សូមចូលគណនី Chrome។ អ្នកក៏នឹងទទួលបានពាក្យសម្ងាត់របស់អ្នក និងអ្វីៗជាច្រើនទៀតនៅលើឧបករណ៍ទាំងអស់របស់អ្នកផងដែរ។</translation> <translation id="8914504000324227558">ដំណើរការ Chrome ឡើងវិញ</translation> <translation id="8922193594870374009">ដើម្បីផ្ញើលេខទូរសព្ទពី <ph name="ORIGIN" /> ទៅទូរសព្ទ Android របស់អ្នក សូមចូល Chrome នៅលើឧបករណ៍ទាំងពីរ។</translation> <translation id="8922998289262614701">ដកទិន្នន័យកម្មវិធីនេះចេញពី Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kn.xtb b/chrome/app/resources/google_chrome_strings_kn.xtb index b1815ae..0dacae9a 100644 --- a/chrome/app/resources/google_chrome_strings_kn.xtb +++ b/chrome/app/resources/google_chrome_strings_kn.xtb
@@ -777,6 +777,7 @@ <translation id="8862326446509486874">ಸಿಸ್ಟಂ ಮಟ್ಟದ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ನೀವು ಸರಿಯಾದ ಹಕ್ಕುಗಳನ್ನು ಹೊಂದಿಲ್ಲ. ನಿರ್ವಾಹಕರಂತೆ ಮತ್ತೆ ಇನ್ಸ್ಟಾಲರ್ ಅನ್ನು ರನ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="8865415417596392024">ನಿಮ್ಮ ಖಾತೆಯಲ್ಲಿರುವ Chrome ಡೇಟಾ</translation> <translation id="8883862939660515976">ಈ ಚಿತ್ರದ ಕುರಿತು Google Lens ಗೆ ಕೇಳಿ</translation> +<translation id="8892956691293410744">ಪುಟವನ್ನು ತೊರೆಯದೆಯೇ ನಿಮ್ಮ ಟ್ಯಾಬ್ ಕುರಿತು AI ಮೋಡ್ ಅನ್ನು ಕೇಳಲು, Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ. ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳು ಮತ್ತು ಇತ್ಯಾದಿಗಳನ್ನು ನೀವು ಪಡೆಯುತ್ತೀರಿ.</translation> <translation id="8914504000324227558">Chrome ಮರುಪ್ರಾರಂಭಿಸಿ</translation> <translation id="8922193594870374009"><ph name="ORIGIN" /> ನಿಂದ ನಿಮ್ಮ Android ಫೋನ್ಗೆ ಸಂಖ್ಯೆಯನ್ನು ಕಳುಹಿಸಲು, ಎರಡೂ ಸಾಧನಗಳಲ್ಲಿ Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation> <translation id="8922998289262614701">Chrome ನಿಂದ ಈ ಆ್ಯಪ್ನ ಡೇಟಾವನ್ನು ತೆಗೆದುಹಾಕಿ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb index 929f341..37c7e3a6 100644 --- a/chrome/app/resources/google_chrome_strings_ko.xtb +++ b/chrome/app/resources/google_chrome_strings_ko.xtb
@@ -781,6 +781,7 @@ <translation id="8862326446509486874">시스템 수준의 설치 권한이 없습니다. 관리자 권한으로 설치 프로그램을 다시 실행해 보세요.</translation> <translation id="8865415417596392024">계정의 Chrome 데이터</translation> <translation id="8883862939660515976">Google 렌즈에 이 이미지에 관해 질문하기</translation> +<translation id="8892956691293410744">페이지를 나가지 않고 탭에 관해 AI 모드에게 물어보려면 Chrome에 로그인하세요. 이렇게 하면 이용 중인 모든 기기에서 비밀번호 등도 사용할 수 있습니다.</translation> <translation id="8914504000324227558">Chrome 다시 시작</translation> <translation id="8922193594870374009"><ph name="ORIGIN" />에서 Android 휴대전화로 번호를 전송하려면 두 기기 모두에서 Chrome에 로그인하세요.</translation> <translation id="8922998289262614701">Chrome에서 이 앱 데이터 삭제</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ky.xtb b/chrome/app/resources/google_chrome_strings_ky.xtb index ed836ec..f528c50 100644 --- a/chrome/app/resources/google_chrome_strings_ky.xtb +++ b/chrome/app/resources/google_chrome_strings_ky.xtb
@@ -782,6 +782,7 @@ <translation id="8862326446509486874">Система деңгээлинде орнотууга тийиштүү укугуңуз жок. Орноткучту Администратор катары кайра иштетип көрүңүз.</translation> <translation id="8865415417596392024">Аккаунтуңуздагы Chrome дайын-даректери</translation> <translation id="8883862939660515976">Google Lens кызматынан бул сүрөт жөнүндө суроо</translation> +<translation id="8892956691293410744">Барактан чыкпай эле ЖИ режимине өтмөгүңүз тууралуу суроо берүү үчүн Chrome'го кириңиз. Мындан тышкары, сырсөздөрүңүздү жана башкаларды бардык түзмөктөрүңүздө колдоно аласыз.</translation> <translation id="8914504000324227558">Chrome'ду кайрадан ишке киргизүү</translation> <translation id="8922193594870374009">Номерди <ph name="ORIGIN" /> сайтынан Android телефонуңузга жөнөтүү үчүн эки түзмөгүңүздөн тең Chrome'го кириңиз.</translation> <translation id="8922998289262614701">Бул колдонмодогу нерселерди Chrome'дон өчүрүү</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lo.xtb b/chrome/app/resources/google_chrome_strings_lo.xtb index bf7621c..87f1f3c 100644 --- a/chrome/app/resources/google_chrome_strings_lo.xtb +++ b/chrome/app/resources/google_chrome_strings_lo.xtb
@@ -782,6 +782,7 @@ <translation id="8862326446509486874">ທ່ານບໍ່ມີສິດທິທີ່ເໝາະສົມສໍາລັບຕິດຕັ້ງໃນລະດັບລະບົບ. ລອງແລ່ນຕົວຕິດຕັ້ງນີ້ອີກໃນຖານະເປັນຜູ້ຄວບຄຸມ.</translation> <translation id="8865415417596392024">ຂໍ້ມູນ Chrome ໃນບັນຊີຂອງທ່ານ</translation> <translation id="8883862939660515976">ຖາມ Google Lens ກ່ຽວກັບຮູບນີ້</translation> +<translation id="8892956691293410744">ເພື່ອຖາມໂໝດ AI ກ່ຽວກັບແຖບຂອງທ່ານໂດຍບໍ່ຕ້ອງອອກຈາກໜ້າ, ໃຫ້ເຂົ້າສູ່ລະບົບ Chrome. ນອກຈາກນີ້, ທ່ານຍັງຈະຮັບລະຫັດຜ່ານ ແລະ ຂໍ້ມູນອື່ນໆໃນອຸປະກອນທຸກເຄື່ອງຂອງທ່ານໄດ້ນຳ.</translation> <translation id="8914504000324227558">ເປີດໃຊ້ Chrome ຄືນໃໝ່</translation> <translation id="8922193594870374009">ເພື່ອສົ່ງເບີຈາກ <ph name="ORIGIN" /> ໃຫ້ໂທລະສັບ Android ຂອງທ່ານ, ກະລຸນາເຂົ້າສູ່ລະບົບ Chrome ຢູ່ໃນທັງສອງອຸປະກອນ.</translation> <translation id="8922998289262614701">ລຶບຂໍ້ມູນຂອງແອັບນີ້ອອກຈາກ Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lt.xtb b/chrome/app/resources/google_chrome_strings_lt.xtb index 018ec57..1332392 100644 --- a/chrome/app/resources/google_chrome_strings_lt.xtb +++ b/chrome/app/resources/google_chrome_strings_lt.xtb
@@ -782,6 +782,7 @@ <translation id="8862326446509486874">Neturite reikiamų teisių sistemai įdiegti. Pamėginkite įdiegimo priemonę dar kartą paleisti kaip administratorius.</translation> <translation id="8865415417596392024">„Chrome“ duomenys jūsų paskyroje</translation> <translation id="8883862939660515976">Klausti „Google Lens“ apie šį vaizdą</translation> +<translation id="8892956691293410744">Jei norite paklausti DI režimo apie skirtuką neišeidami iš puslapio, prisijunkite prie „Chrome“. Be to, slaptažodžius ir kitas funkcijas pasieksite visuose įrenginiuose.</translation> <translation id="8914504000324227558">Iš naujo paleisti „Chrome“</translation> <translation id="8922193594870374009">Jei norite iš <ph name="ORIGIN" /> į „Android“ telefoną išsiųsti numerį, prisijunkite prie „Chrome“ abiejuose įrenginiuose.</translation> <translation id="8922998289262614701">Pašalinti šios programos duomenis iš „Chrome“</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lv.xtb b/chrome/app/resources/google_chrome_strings_lv.xtb index da603859..94805bf8 100644 --- a/chrome/app/resources/google_chrome_strings_lv.xtb +++ b/chrome/app/resources/google_chrome_strings_lv.xtb
@@ -777,6 +777,7 @@ <translation id="8862326446509486874">Jums nav vajadzīgo tiesību, lai instalētu sistēmas līmenī. Mēģiniet vēlreiz palaist instalēšanas programmu kā administrators.</translation> <translation id="8865415417596392024">Chrome dati jūsu kontā</translation> <translation id="8883862939660515976">Jautāt Google Lens par šo attēlu</translation> +<translation id="8892956691293410744">Lai MI režīmā uzdotu jautājumus par savu cilni, nepametot lapu, pierakstieties pārlūkā Chrome. Jūs arī varēsiet piekļūt parolēm un citiem datiem visās savās ierīcēs.</translation> <translation id="8914504000324227558">Atkārtoti palaist pārlūkprogrammu Chrome</translation> <translation id="8922193594870374009">Lai nosūtītu numuru no vietnes <ph name="ORIGIN" /> uz savu Android tālruni, abās ierīcēs pierakstieties pārlūkā Chrome.</translation> <translation id="8922998289262614701">Noņemt šīs lietotnes datus no pārlūka Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mk.xtb b/chrome/app/resources/google_chrome_strings_mk.xtb index 0af38fa2..995588fe 100644 --- a/chrome/app/resources/google_chrome_strings_mk.xtb +++ b/chrome/app/resources/google_chrome_strings_mk.xtb
@@ -781,6 +781,7 @@ <translation id="8862326446509486874">Немате соодветни права за инсталирање на системско ниво. Обидете се да го извршите инсталаторот повторно како администратор.</translation> <translation id="8865415417596392024">Податоци од Chrome во вашата сметка</translation> <translation id="8883862939660515976">Прашајте ја Google Lens за сликава</translation> +<translation id="8892956691293410744">Најавете се на Chrome за да го прашате „AI-режимот“ за вашата картичка без да ја напуштите страницата. Ќе ги добиете и вашите лозинки и друго на сите ваши уреди.</translation> <translation id="8914504000324227558">Рестартирајте го Chrome</translation> <translation id="8922193594870374009">За да испратите број од <ph name="ORIGIN" /> до телефонот со Android, најавете се на Chrome на двата уреда.</translation> <translation id="8922998289262614701">Отстрани ги податоците поврзани со апликацијава од Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mn.xtb b/chrome/app/resources/google_chrome_strings_mn.xtb index 0bb116317..3e46117 100644 --- a/chrome/app/resources/google_chrome_strings_mn.xtb +++ b/chrome/app/resources/google_chrome_strings_mn.xtb
@@ -779,6 +779,7 @@ <translation id="8862326446509486874">Танд системийн түвшинд суулгах зохих эрх байхгүй байна. Суулгагчийг админы хувиар дахин ажиллуулахыг оролдож үзнэ үү.</translation> <translation id="8865415417596392024">Таны бүртгэлийн Chrome-н өгөгдөл</translation> <translation id="8883862939660515976">Google Lens-с энэ зургийн тухай асуу</translation> +<translation id="8892956691293410744">Хуудаснаас гарахгүйгээр ХОУ-ы горимоос табынхаа талаар асуухын тулд Chrome-д нэвтэрнэ үү. Та мөн бүх төхөөрөмж дээрээ нууц үг болон бусад зүйлээ авна.</translation> <translation id="8914504000324227558">Chrome-г дахин эхлүүлэх</translation> <translation id="8922193594870374009"><ph name="ORIGIN" />-с Android утсандаа дугаар илгээхийн тулд хоёр төхөөрөмжийнхөө аль алинаас нь Chrome-д нэвтэрнэ үү.</translation> <translation id="8922998289262614701">Энэ аппын өгөгдлийг Chrome-с хасах</translation>
diff --git a/chrome/app/resources/google_chrome_strings_my.xtb b/chrome/app/resources/google_chrome_strings_my.xtb index a638da7..9f1550c 100644 --- a/chrome/app/resources/google_chrome_strings_my.xtb +++ b/chrome/app/resources/google_chrome_strings_my.xtb
@@ -781,6 +781,7 @@ <translation id="8862326446509486874">သင့်ဆီမှာ စနစ်အဆင့်မှာ တပ်ဆင်နိုင်ရန် အတွက် လိုအပ်သည့် လုပ်ပိုင်ခွင့်များ မရှိပါ။ တပ်ဆင်သူကို ထပ်ပြီး စီမံအုပ်ချုပ်သူ အဖြစ် ဖွင့်သုံးကြည့်ပါ။</translation> <translation id="8865415417596392024">သင့်အကောင့်ရှိ Chrome ဒေတာ</translation> <translation id="8883862939660515976">ဤပုံအကြောင်း Google Lens ကို မေးရန်</translation> +<translation id="8892956691293410744">စာမျက်နှာမှ မထွက်ဘဲ သင့်တဘ်အကြောင်း ‘AI မုဒ်’ ကို မေးရန် Chrome သို့ လက်မှတ်ထိုးဝင်ပါ။ သင့်စက်အားလုံးတွင် စကားဝှက်နှင့် အခြားအရာများကိုလည်း ရရှိပါမည်။</translation> <translation id="8914504000324227558">Chromium ကို အသစ်တစ်ဖန် ပြန်စရန်</translation> <translation id="8922193594870374009"><ph name="ORIGIN" /> မှ သင်၏ Android ဖုန်းသို့ နံပါတ်တစ်ခုပို့ရန် စက်နှစ်ခုလုံးတွင် Chrome သို့ လက်မှတ်ထိုးဝင်ပါ။</translation> <translation id="8922998289262614701">ဤအက်ပ်၏ဒေတာကို Chrome မှ ဖယ်ရှားရန်</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ne.xtb b/chrome/app/resources/google_chrome_strings_ne.xtb index 285b1d1..c8e521c1 100644 --- a/chrome/app/resources/google_chrome_strings_ne.xtb +++ b/chrome/app/resources/google_chrome_strings_ne.xtb
@@ -771,6 +771,7 @@ <translation id="8862326446509486874">तपाईंसँग सिस्टम-स्तरको स्थापनाको लागि उपयुक्त अधिकारहरू छैनन्। स्थापकलाई व्यवस्थापकको रूपमा पुन: चलाउने प्रयास गर्नुहोस्।</translation> <translation id="8865415417596392024">तपाईंको खातामा रहेको Chrome को डेटा</translation> <translation id="8883862939660515976">Google लेन्सलाई यो फोटोका बारेमा सोध्नुहोस्</translation> +<translation id="8892956691293410744">यो पेजबाट नबाहिरिकनै AI मोडलाई आफ्नो ट्याबका बारेमा सोध्न Chrome मा साइन इन गर्नुहोस्। तपाईं सबै डिभाइसमा रहेका आफ्ना पासवर्डलगायतका थप कुराहरू पनि प्राप्त गर्नु हुने छ।</translation> <translation id="8914504000324227558">Chrome पुनः सुरु गर्नुहोस्</translation> <translation id="8922193594870374009"><ph name="ORIGIN" /> बाट आफ्नो Android फोनमा कुनै नम्बर पठाउन दुवै यन्त्रमा Chrome मा साइन इन गर्नुहोस्।</translation> <translation id="8922998289262614701">Chrome बाट यो एपको डेटा हटाउनुहोस्</translation>
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb index 61ab3b5..01a7033 100644 --- a/chrome/app/resources/google_chrome_strings_no.xtb +++ b/chrome/app/resources/google_chrome_strings_no.xtb
@@ -774,6 +774,7 @@ <translation id="8862326446509486874">Du har ikke de nødvendige rettighetene for å installere på systemnivå. Prøv å kjøre installasjonsprogrammet som administrator.</translation> <translation id="8865415417596392024">Chrome-data i kontoen din</translation> <translation id="8883862939660515976">Spør Google Lens om dette bildet</translation> +<translation id="8892956691293410744">For å spørre AI-modusen om fanen din uten å forlate siden, logg på Chrome. Du får også passordene dine med mer på alle enhetene dine.</translation> <translation id="8914504000324227558">Start Chrome på nytt</translation> <translation id="8922193594870374009">For å sende numre fra <ph name="ORIGIN" /> til Android-telefonen din, logg på Chrome på begge enhetene.</translation> <translation id="8922998289262614701">Fjern data for disse appene fra Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pa.xtb b/chrome/app/resources/google_chrome_strings_pa.xtb index c87aca07..3d5e438 100644 --- a/chrome/app/resources/google_chrome_strings_pa.xtb +++ b/chrome/app/resources/google_chrome_strings_pa.xtb
@@ -782,6 +782,7 @@ <translation id="8862326446509486874">ਤੁਹਾਡੇ ਕੋਲ ਸਿਸਟਮ-ਪੱਧਰ ਸਥਾਪਤ ਕਰਨ ਲਈ ਉਚਿਤ ਅਧਿਕਾਰ ਨਹੀਂ ਹਨ। ਪ੍ਰਬੰਧਕ ਦੇ ਤੌਰ 'ਤੇ ਦੁਬਾਰਾ ਸਥਾਪਨਾਕਾਰ ਚਲਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="8865415417596392024">ਤੁਹਾਡੇ ਖਾਤੇ ਵਿਚਲਾ Chrome ਡਾਟਾ</translation> <translation id="8883862939660515976">ਇਸ ਚਿੱਤਰ ਬਾਰੇ Google Lens ਨੂੰ ਪੁੱਛੋ</translation> +<translation id="8892956691293410744">ਪੰਨੇ ਨੂੰ ਛੱਡੇ ਬਿਨਾਂ ਆਪਣੀ ਟੈਬ ਬਾਰੇ AI ਮੋਡ ਨੂੰ ਪੁੱਛਣ ਲਈ, Chrome ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰੋ। ਤੁਸੀਂ ਆਪਣੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ 'ਤੇ ਆਪਣੇ ਪਾਸਵਰਡ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਪ੍ਰਾਪਤ ਕਰ ਸਕੋਗੇ।</translation> <translation id="8914504000324227558">Chrome ਨੂੰ ਮੁੜ-ਲਾਂਚ ਕਰੋ</translation> <translation id="8922193594870374009"><ph name="ORIGIN" /> ਤੋਂ ਆਪਣੇ Android ਫ਼ੋਨ 'ਤੇ ਨੰਬਰ ਭੇਜਣ ਲਈ, ਦੋਵੇਂ ਡੀਵਾਈਸਾਂ 'ਤੇ Chrome ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰੋ।</translation> <translation id="8922998289262614701">Chrome ਤੋਂ ਇਸ ਐਪ ਦੇ ਡਾਟੇ ਨੂੰ ਹਟਾਓ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ro.xtb b/chrome/app/resources/google_chrome_strings_ro.xtb index 266d20f..ab691975 100644 --- a/chrome/app/resources/google_chrome_strings_ro.xtb +++ b/chrome/app/resources/google_chrome_strings_ro.xtb
@@ -774,6 +774,7 @@ <translation id="8862326446509486874">Nu ai drepturile adecvate pentru instalarea la nivel de sistem. Încearcă să rulezi din nou programul de instalare ca Administrator.</translation> <translation id="8865415417596392024">Datele Chrome din cont</translation> <translation id="8883862939660515976">Întreabă Google Lens despre această imagine</translation> +<translation id="8892956691293410744">Pentru a întreba Modul AI despre filă fără să părăsești pagina, conectează-te la Chrome. În plus, vei putea accesa parolele și multe altele pe toate dispozitivele.</translation> <translation id="8914504000324227558">Relansați Chrome</translation> <translation id="8922193594870374009">Pentru a trimite un număr de pe <ph name="ORIGIN" /> pe telefonul Android, conectează-te la Chrome pe ambele dispozitive.</translation> <translation id="8922998289262614701">Elimină datele aplicației din Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb index 943722a6..c2eb51b 100644 --- a/chrome/app/resources/google_chrome_strings_ru.xtb +++ b/chrome/app/resources/google_chrome_strings_ru.xtb
@@ -773,6 +773,7 @@ <translation id="8862326446509486874">У вас нет прав, необходимых для установки на системном уровне. Запустите программу установки еще раз в качестве администратора.</translation> <translation id="8865415417596392024">Данные Chrome в вашем аккаунте</translation> <translation id="8883862939660515976">Спросить об этом изображении у Google Объектива</translation> +<translation id="8892956691293410744">Войдите в Chrome, чтобы задать вопрос о вкладке в режиме ИИ, не покидая страницу. Пароли и другие данные также появятся на всех ваших устройствах.</translation> <translation id="8914504000324227558">Перезапустить Chrome</translation> <translation id="8922193594870374009">Чтобы отправить номер с сайта <ph name="ORIGIN" /> на свой телефон Android, войдите в Chrome на обоих устройствах.</translation> <translation id="8922998289262614701">Удалить данные этого приложения из Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_si.xtb b/chrome/app/resources/google_chrome_strings_si.xtb index 06df87a..2cf2de02 100644 --- a/chrome/app/resources/google_chrome_strings_si.xtb +++ b/chrome/app/resources/google_chrome_strings_si.xtb
@@ -780,6 +780,7 @@ <translation id="8862326446509486874">ඔබට පද්ධති මට්ටමේ ස්ථානපයකට අයිතිය නැත. නැවත පරිපාලක වශයෙන් ස්ථාපකය ධාවනය කිරීමට උත්සාහ කරන්න.</translation> <translation id="8865415417596392024">ඔබේ ගිණුමේ Chrome දත්ත</translation> <translation id="8883862939660515976">මෙම රූපය ගැන Google Lens වෙතින් විමසන්න</translation> +<translation id="8892956691293410744">පිටුවෙන් පිටව නොයා ඔබේ පටිත්ත ගැන AI මාදිලියෙන් ඇසීමට, Chrome වෙත පුරන්න. ඔබේ සියලු උපාංගවල ඔබේ මුරපද සහ තවත් දේ ඔබට ලැබෙනු ඇත.</translation> <translation id="8914504000324227558">Chrome නැවත දියත් කරන්න</translation> <translation id="8922193594870374009"><ph name="ORIGIN" /> වෙතින් ඔබගේ Android දුරකථනයට අංකයක් යැවීමට, උපාංග දෙකෙහිම Chrome වෙත පුරන්න.</translation> <translation id="8922998289262614701">Chrome වෙතින් මෙම යෙදුම් දත්ත ඉවත් කරන්න</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb index f15fb8d2..b8db345 100644 --- a/chrome/app/resources/google_chrome_strings_sk.xtb +++ b/chrome/app/resources/google_chrome_strings_sk.xtb
@@ -779,6 +779,7 @@ <translation id="8862326446509486874">Nemáte potrebné práva na inštaláciu na úrovni systému. Skúste inštalátor spustiť znova ako správca.</translation> <translation id="8865415417596392024">Údaje Chromu vo vašom účte</translation> <translation id="8883862939660515976">Spýtať sa funkcie Google Lens otázku o tomto obrázku</translation> +<translation id="8892956691293410744">Ak sa chcete režimu AI spýtať na svoju kartu bez opustenia stránky, prihláste sa do Chromu. Navyše budete mať k dispozícii heslá a ďalší obsah vo všetkých svojich zariadeniach.</translation> <translation id="8914504000324227558">Znova spustiť prehliadač Chrome</translation> <translation id="8922193594870374009">Ak chcete zo zariadenia <ph name="ORIGIN" /> odoslať číslo do svojho telefónu s Androidom, prihláste sa v oboch zariadeniach do Chromu.</translation> <translation id="8922998289262614701">Odstrániť dáta tejto aplikácie z Chromu</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb index 23a39692..35c7ec10 100644 --- a/chrome/app/resources/google_chrome_strings_sl.xtb +++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -782,6 +782,7 @@ <translation id="8862326446509486874">Nimate ustreznih pravic za namestitev na ravni sistema. Poskusite znova zagnati namestitveni program kot skrbnik.</translation> <translation id="8865415417596392024">Podatki v Chromu v računu</translation> <translation id="8883862939660515976">Vprašajte Google Lens o tej sliki</translation> +<translation id="8892956691293410744">Če želite v načinu umetne inteligence postaviti vprašanje o zavihku, ne da bi zapustili stran, se prijavite v Chrome. V vseh svojih napravah boste imeli na voljo tudi gesla in drugo.</translation> <translation id="8914504000324227558">Znova zaženi Chrome</translation> <translation id="8922193594870374009">Če želite telefonsko številko iz <ph name="ORIGIN" /> poslati v telefon Android, se prijavite v Chrome v obeh napravah.</translation> <translation id="8922998289262614701">Odstrani podatke te aplikacije iz Chroma</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sq.xtb b/chrome/app/resources/google_chrome_strings_sq.xtb index dcd4610..3da947e 100644 --- a/chrome/app/resources/google_chrome_strings_sq.xtb +++ b/chrome/app/resources/google_chrome_strings_sq.xtb
@@ -779,6 +779,7 @@ <translation id="8862326446509486874">Nuk ke të drejtat e duhura për instalimin në nivel sistemi. Provo ta ekzekutosh përsëri instaluesin si "Administrator".</translation> <translation id="8865415417596392024">Të dhënat e Chrome në llogarinë tënde</translation> <translation id="8883862939660515976">Pyet "Lenten e Google" për këtë imazh</translation> +<translation id="8892956691293410744">Për të pyetur "Modalitetin e IA-së" për skedën tënde pa u larguar nga faqja, identifikohu në Chrome. Do të marrësh gjithashtu fjalëkalimet dhe më shumë në të gjitha pajisjet e tua.</translation> <translation id="8914504000324227558">Rinis Chrome</translation> <translation id="8922193594870374009">Për të dërguar një numër nga <ph name="ORIGIN" /> te telefoni yt Android, identifikohu në Chrome në të dyja pajisjet.</translation> <translation id="8922998289262614701">Hiq të dhënat e këtij aplikacioni nga Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr-Latn.xtb b/chrome/app/resources/google_chrome_strings_sr-Latn.xtb index 1393ffaa..03df46a8 100644 --- a/chrome/app/resources/google_chrome_strings_sr-Latn.xtb +++ b/chrome/app/resources/google_chrome_strings_sr-Latn.xtb
@@ -782,6 +782,7 @@ <translation id="8862326446509486874">Nemate odgovarajuća prava za instalaciju na nivou sistema. Probajte ponovo da pokrenete program za instalaciju, ovoga puta kao administrator.</translation> <translation id="8865415417596392024">Chrome podaci na nalogu</translation> <translation id="8883862939660515976">Postavite pitanje Google objektivu o ovoj slici</translation> +<translation id="8892956691293410744">Da biste postavili pitanje AI režimu o kartici bez napuštanja stranice, prijavite se u Chrome. Moći ćete i da pristupate lozinkama i drugom sadržaju na svim uređajima.</translation> <translation id="8914504000324227558">Ponovo pokreni Chrome</translation> <translation id="8922193594870374009">Da biste poslali broj sa <ph name="ORIGIN" /> na Android telefon, prijavite se u Chrome na oba uređaja.</translation> <translation id="8922998289262614701">Ukloni podatke ove aplikacije iz Chrome-a</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr.xtb b/chrome/app/resources/google_chrome_strings_sr.xtb index 14f802ad..d7985bb 100644 --- a/chrome/app/resources/google_chrome_strings_sr.xtb +++ b/chrome/app/resources/google_chrome_strings_sr.xtb
@@ -782,6 +782,7 @@ <translation id="8862326446509486874">Немате одговарајућа права за инсталацију на нивоу система. Пробајте поново да покренете програм за инсталацију, овога пута као администратор.</translation> <translation id="8865415417596392024">Chrome подаци на налогу</translation> <translation id="8883862939660515976">Поставите питање Google објективу о овој слици</translation> +<translation id="8892956691293410744">Да бисте поставили питање AI режиму о картици без напуштања странице, пријавите се у Chrome. Моћи ћете и да приступате лозинкама и другом садржају на свим уређајима.</translation> <translation id="8914504000324227558">Поново покрени Chrome</translation> <translation id="8922193594870374009">Да бисте послали број са <ph name="ORIGIN" /> на Android телефон, пријавите се у Chrome на оба уређаја.</translation> <translation id="8922998289262614701">Уклони податке ове апликације из Chrome-а</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sv.xtb b/chrome/app/resources/google_chrome_strings_sv.xtb index bfd4d45ea..a9e4c5b 100644 --- a/chrome/app/resources/google_chrome_strings_sv.xtb +++ b/chrome/app/resources/google_chrome_strings_sv.xtb
@@ -782,6 +782,7 @@ <translation id="8862326446509486874">Du har inte behörighet att göra en installation på systemnivå. Försök köra installationsprogrammet igen som administratör.</translation> <translation id="8865415417596392024">Chrome-data i ditt konto</translation> <translation id="8883862939660515976">Fråga Google Lens om den här bilden</translation> +<translation id="8892956691293410744">Logga in i Chrome om du vill fråga AI-läget om fliken utan att lämna sidan. Du får även dina lösenord med mera på alla dina enheter.</translation> <translation id="8914504000324227558">Starta om Chrome</translation> <translation id="8922193594870374009">Logga in på Chrome på båda enheterna om du vill skicka ett nummer från <ph name="ORIGIN" /> till Android-telefonen.</translation> <translation id="8922998289262614701">Ta bort datan för den här appen från Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sw.xtb b/chrome/app/resources/google_chrome_strings_sw.xtb index 993755d..e1a9977a 100644 --- a/chrome/app/resources/google_chrome_strings_sw.xtb +++ b/chrome/app/resources/google_chrome_strings_sw.xtb
@@ -782,6 +782,7 @@ <translation id="8862326446509486874">Huna haki zifaazo ili kufanya usakinishaji wa kiwango cha mfumo. Jaribu kutumia kisakinishi kama msimamiaji kompyuta.</translation> <translation id="8865415417596392024">Data ya Chrome kwenye akaunti yako</translation> <translation id="8883862939660515976">Uliza Lenzi ya Google kuhusu picha hii</translation> +<translation id="8892956691293410744">Ili uulize Matumizi ya AI kuhusu kichupo chako bila kuondoka kwenye ukurasa, ingia katika akaunti kwenye Chrome. Pia utapata manenosiri yako na zaidi kwenye vifaa vyako vyote.</translation> <translation id="8914504000324227558">Zindua upya Chrome</translation> <translation id="8922193594870374009">Ili uweze kutuma namba kwa simu yako ya Android kutoka <ph name="ORIGIN" />, ingia katika akaunti kwenye Chrome ukitumia vifaa vyote viwili.</translation> <translation id="8922998289262614701">Ondoa data ya programu hii kwenye Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_th.xtb b/chrome/app/resources/google_chrome_strings_th.xtb index eb44223..708f7d1 100644 --- a/chrome/app/resources/google_chrome_strings_th.xtb +++ b/chrome/app/resources/google_chrome_strings_th.xtb
@@ -295,6 +295,7 @@ <translation id="4053720452172726777">กำหนดค่าและควบคุม Google Chrome</translation> <translation id="408393047846373801">ลงชื่อเข้าใช้ Chrome เพื่อรับรหัสผ่านและข้อมูลอื่นๆ ในทุกอุปกรณ์ ระบบจะบันทึกรหัสผ่านนี้ไว้ในบัญชี Google หลังจากที่คุณลงชื่อเข้าใช้</translation> <translation id="409936259433005390">หากจะอัปเกรดเป็น Windows 11 ในเร็วๆ นี้ ดาวน์โหลดโปรแกรมติดตั้ง Chrome ลงใน OneDrive เพื่อให้คุณพร้อมใช้งานตั้งแต่วันแรก</translation> +<translation id="4102173024714616627">ส่วนขยายคือส่วนเสริมที่ช่วยให้คุณปรับแต่ง Chrome ได้ ตั้งแต่การจัดระเบียบไปจนถึงการทำให้งานประจำวันง่ายขึ้น ส่วนขยายช่วยให้คุณปรับแต่ง Chrome ในรูปแบบของคุณเอง</translation> <translation id="4110895483821904099">ตั้งค่าโปรไฟล์ Chrome ใหม่</translation> <translation id="4111566860456076004">Chrome ไม่สามารถยืนยันได้ว่าส่วนขยายนี้มาจากไหนและอาจไม่ปลอดภัย นำส่วนขยายดังกล่าวออกจาก Chrome เพื่อไม่ให้ดูและเปลี่ยนแปลงข้อมูลของคุณในเว็บไซต์ที่เข้าชม รวมถึงข้อมูลส่วนบุคคลได้อีกต่อไป</translation> <translation id="4147555960264124640">คุณกำลังลงชื่อเข้าใช้ด้วยบัญชีที่จัดการ และให้การควบคุมระดับผู้ดูแลระบบของบัญชีดังกล่าวเหนือโปรไฟล์ Google Chrome ของคุณ ข้อมูล Chrome เช่น แอป บุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และการตั้งค่าอื่นๆ จะเชื่อมโยงอย่างถาวรกับ <ph name="USER_NAME" /> คุณจะสามารถลบข้อมูลนี้ผ่านทางแผงควบคุมบัญชี Google แต่คุณจะไม่สามารถเชื่อมโยงข้อมูลนี้กับบัญชีอื่น <ph name="LEARN_MORE" /></translation> @@ -772,6 +773,7 @@ <translation id="8862326446509486874">คุณไม่มีสิทธิ์ในการติดตั้งระดับระบบ ทดลองใช้งานโปรแกรมติดตั้งอีกครั้งโดยกำหนดให้เป็นผู้ดูแลระบบ</translation> <translation id="8865415417596392024">ข้อมูล Chrome ในบัญชี</translation> <translation id="8883862939660515976">ถาม Google Lens เกี่ยวกับรูปภาพนี้</translation> +<translation id="8892956691293410744">หากต้องการถามโหมด AI เกี่ยวกับแท็บโดยไม่ต้องออกจากหน้า ให้ลงชื่อเข้าใช้ Chrome นอกจากนี้ คุณยังรับรหัสผ่านและข้อมูลอื่นๆ ในอุปกรณ์ทุกเครื่องได้ด้วย</translation> <translation id="8914504000324227558">เปิด Chrome ขึ้นใหม่</translation> <translation id="8922193594870374009">หากต้องการส่งหมายเลขจาก <ph name="ORIGIN" /> ไปยังโทรศัพท์ Android ให้ลงชื่อเข้าใช้ Chrome ในอุปกรณ์ทั้งสองเครื่อง</translation> <translation id="8922998289262614701">นําข้อมูลแอปนี้ออกจาก Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_tr.xtb b/chrome/app/resources/google_chrome_strings_tr.xtb index 9bc2532..cfb8cfa 100644 --- a/chrome/app/resources/google_chrome_strings_tr.xtb +++ b/chrome/app/resources/google_chrome_strings_tr.xtb
@@ -775,6 +775,7 @@ <translation id="8862326446509486874">Sistem düzeyinde yükleme için gerekli haklara sahip değilsiniz. Yükleyiciyi Yönetici olarak tekrar çalıştırmayı deneyin.</translation> <translation id="8865415417596392024">Hesabınızdaki Chrome verileri</translation> <translation id="8883862939660515976">Google Lens'e bu görsel hakkında soru sorun</translation> +<translation id="8892956691293410744">Sayfadan ayrılmadan AI Modu'na sekmenizle ilgili soru sormak için Chrome'da oturum açın. Ayrıca, şifrelerinize ve diğer öğelerinize tüm cihazlarınızdan erişebilirsiniz.</translation> <translation id="8914504000324227558">Chrome'u Yeniden Başlat</translation> <translation id="8922193594870374009"><ph name="ORIGIN" /> sitesinden Android telefonunuza numara göndermek için iki cihazdan da Chrome'da oturum açın.</translation> <translation id="8922998289262614701">Bu uygulamanın verilerini Chrome'dan kaldır</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ur.xtb b/chrome/app/resources/google_chrome_strings_ur.xtb index 39a19d0a..f653ba20 100644 --- a/chrome/app/resources/google_chrome_strings_ur.xtb +++ b/chrome/app/resources/google_chrome_strings_ur.xtb
@@ -781,6 +781,7 @@ <translation id="8862326446509486874">سسٹم کی سطح پر انسٹال کرنے کیلئے آپ کے پاس مناسب حقوق نہیں ہیں۔ انسٹالر کو دوبارہ منتظم کے بطور چلانے کی کوشش کریں۔</translation> <translation id="8865415417596392024">آپ کے اکاؤنٹ میں Chrome کا ڈیٹا</translation> <translation id="8883862939660515976">Google لینز سے اس تصویر کے بارے میں پوچھیں</translation> +<translation id="8892956691293410744">صفحہ چھوڑے بغیر اپنے ٹیب کے بارے میں AI وضع سے پوچھنے کے لیے، Chrome میں سائن ان کریں۔ آپ کو اپنے تمام آلات پر اپنے پاس ورڈز اور مزید چیزیں بھی مل جائیں گی۔</translation> <translation id="8914504000324227558">Chrome کو دوبارہ شروع کریں</translation> <translation id="8922193594870374009"><ph name="ORIGIN" /> سے اپنے Android فون پر نمبر بھیجنے کے لئے دونوں آلات پر Chrome میں سائن ان کریں۔</translation> <translation id="8922998289262614701">Chrome سے اس ایپس کا ڈیٹا ہٹائیں</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-CN.xtb b/chrome/app/resources/google_chrome_strings_zh-CN.xtb index 70fd172..4d06dcb 100644 --- a/chrome/app/resources/google_chrome_strings_zh-CN.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
@@ -773,6 +773,7 @@ <translation id="8862326446509486874">您的权限不足,无法进行系统级安装。请尝试以管理员身份再次运行安装程序。</translation> <translation id="8865415417596392024">您账号中的 Chrome 数据</translation> <translation id="8883862939660515976">向 Google 智能镜头询问此图片</translation> +<translation id="8892956691293410744">如需在不离开网页的情况下向 AI 模式询问有关标签页的问题,请登录 Chrome。登录后,您还可在自己的所有设备上同步保存的密码等信息。</translation> <translation id="8914504000324227558">重启 Chrome</translation> <translation id="8922193594870374009">若要从 <ph name="ORIGIN" /> 向您的 Android 手机发送电话号码,请在这两部设备上分别登录 Chrome。</translation> <translation id="8922998289262614701">从 Chrome 中移除此应用的数据</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb index ff60bdc..0602c3d 100644 --- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -775,6 +775,7 @@ <translation id="8862326446509486874">你沒有在系統層級進行安裝的權限,請以管理員的身分執行安裝檔。</translation> <translation id="8865415417596392024">你帳戶中的 Chrome 資料</translation> <translation id="8883862939660515976">向 Google 智慧鏡頭詢問這張圖片的相關問題</translation> +<translation id="8892956691293410744">登入 Chrome 後,不必離開頁面就能用 AI 模式查詢分頁,並在所有裝置上同步密碼與其他資料。</translation> <translation id="8914504000324227558">重新啟動 Chrome</translation> <translation id="8922193594870374009">如要將號碼從 <ph name="ORIGIN" /> 傳送到 Android 手機,請在這兩部裝置上登入 Chrome。</translation> <translation id="8922998289262614701">從 Chrome 移除這個應用程式的資料</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zu.xtb b/chrome/app/resources/google_chrome_strings_zu.xtb index 67851dd..4a04c6b 100644 --- a/chrome/app/resources/google_chrome_strings_zu.xtb +++ b/chrome/app/resources/google_chrome_strings_zu.xtb
@@ -781,6 +781,7 @@ <translation id="8862326446509486874">Awunawo amalungelo afanele wokufakwa okukuleveli yesistimu. Zama ukuqalisa isifaki futhi njengomlawuli.</translation> <translation id="8865415417596392024">Idatha ye-Chrome eku-akhawunti yakho</translation> <translation id="8883862939660515976">Buza iGoogle Lens ngalesi sithombe</translation> +<translation id="8892956691293410744">Ukuze ubuze Imodi ye-AI mayelana nethebhu yakho ngaphandle kokushiya ikhasi, ngena ngemvume kuChrome. Uzophinde uthole namaphasiwedi akho nokuningi kuwo wonke amadivayisi akho.</translation> <translation id="8914504000324227558">Phinda uqalise i-Chrome</translation> <translation id="8922193594870374009">Ukuze uthumele inombolo kusukela ku-<ph name="ORIGIN" /> kufoni yakho ye-Android, ngena ngemvume ku-Chrome kuwo womabili amadivayisi.</translation> <translation id="8922998289262614701">Susa idatha yale app kusukela kuChrome</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index f5f1647..eaa9de9 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -3547,6 +3547,12 @@ <message name="IDS_SETTINGS_SITE_SETTINGS_SITE_RESET_CONFIRMATION" desc="Body text of a dialog that asks users to confirm that they want to reset all permissions for a site."> The next time you visit, <ph name="SITE">$1<ex>www.example.com</ex></ph> will use default permissions </message> + <message name="IDS_SETTINGS_SITE_SETTINGS_PARENT_APP_PERMISSION_EXPLANATION" desc="Explanation text that appears underneath the Permission header on an app's site settings page. Any changes the user makes to this app's permissions also apply to any installed sub apps."> + Permissions you allow for <ph name="APP_NAME">$1<ex>Parent app</ex></ph> will also be allowed for its installed apps. + </message> + <message name="IDS_SETTINGS_SITE_SETTINGS_SUB_APP_PERMISSION_EXPLANATION" desc="Explanation text that appears underneath the Permission header on an app's site settings page. Any changes the user makes to this app's permissions also apply to the parent app and its other sub apps."> + Permissions you allow for <ph name="APP_NAME">$1<ex>Sub app</ex></ph> will also be allowed for <ph name="PARENT_APP_NAME">$2<ex>Parent app</ex></ph> and its installed apps. + </message> <message name="IDS_SETTINGS_SITE_SETTINGS_SITE_DELETE_STORAGE_DIALOG_TITLE" desc="Title of the dialog that warns about deleting storage used by a site."> Delete site data? </message>
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_PARENT_APP_PERMISSION_EXPLANATION.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_PARENT_APP_PERMISSION_EXPLANATION.png.sha1 new file mode 100644 index 0000000..54d5c37 --- /dev/null +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_PARENT_APP_PERMISSION_EXPLANATION.png.sha1
@@ -0,0 +1 @@ +58cfdf7bb75a87769cbc888de8146aec6bd999d8 \ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_SUB_APP_PERMISSION_EXPLANATION.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_SUB_APP_PERMISSION_EXPLANATION.png.sha1 new file mode 100644 index 0000000..860ec6a2 --- /dev/null +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_SUB_APP_PERMISSION_EXPLANATION.png.sha1
@@ -0,0 +1 @@ +d4d80a64a43a6823d5036a73970c06692e5d5dd9 \ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index b582ee0..68978f92 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -1589,6 +1589,7 @@ "//chrome/browser/glic", "//chrome/browser/glic:impl", "//chrome/browser/glic/actor", + "//chrome/browser/glic/browser_ui", "//chrome/browser/glic/fre", "//chrome/browser/gpu", "//chrome/browser/gpu:impl", @@ -4003,7 +4004,6 @@ "//chrome/browser/direct_sockets:impl", "//chrome/browser/error_reporting", "//chrome/browser/feedback:feedback_enum", - "//chrome/browser/glic/browser_ui", "//chrome/browser/glic/media", "//chrome/browser/glic/selection", "//chrome/browser/hid", @@ -7321,18 +7321,14 @@ if (enable_extensions_core) { if (enable_guest_view) { - sources += [ - "guest_view/chrome_guest_view_manager_delegate.cc", - "guest_view/chrome_guest_view_manager_delegate.h", - "guest_view/extension_options/chrome_extension_options_guest_delegate.cc", - "guest_view/extension_options/chrome_extension_options_guest_delegate.h", - "guest_view/web_view/chrome_web_view_guest_delegate.cc", - "guest_view/web_view/chrome_web_view_guest_delegate.h", - "guest_view/web_view/chrome_web_view_permission_helper_delegate.cc", - "guest_view/web_view/chrome_web_view_permission_helper_delegate.h", - "guest_view/web_view/context_menu_content_type_web_view.cc", - "guest_view/web_view/context_menu_content_type_web_view.h", + deps += [ + "//chrome/browser/guest_view", + "//chrome/browser/guest_view:impl", ] + + # Any circular includes must depend on the target + # "browser_public_dependencies". + allow_circular_includes_from += [ "//chrome/browser/guest_view:impl" ] } sources += [ "download/download_crx_util.cc", @@ -7403,10 +7399,6 @@ "accessibility/animation_policy_prefs.h", "browsing_data/counters/hosted_apps_counter.cc", "browsing_data/counters/hosted_apps_counter.h", - "guest_view/app_view/chrome_app_view_guest_delegate.cc", - "guest_view/app_view/chrome_app_view_guest_delegate.h", - "guest_view/mime_handler_view/chrome_mime_handler_view_guest_delegate.cc", - "guest_view/mime_handler_view/chrome_mime_handler_view_guest_delegate.h", "media/extension_media_access_handler.cc", "media/extension_media_access_handler.h", "metrics/extensions_metrics_provider.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 3484367..f0e79533 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -106,6 +106,7 @@ #include "components/dom_distiller/core/dom_distiller_features.h" #include "components/dom_distiller/core/dom_distiller_switches.h" #include "components/download/public/common/download_features.h" +#include "components/enterprise/browser/reporting/reporting_features.h" #include "components/enterprise/client_certificates/core/features.h" #include "components/enterprise/data_controls/core/browser/features.h" #include "components/error_page/common/error_page_switches.h" @@ -868,10 +869,6 @@ {"Omnibox_AddContextButtonVariant", "inline"}, }; const FeatureEntry::FeatureParam - kWebUIOmniboxAimPopupAddContextButtonAboveResults[] = { - {"Omnibox_AddContextButtonVariant", "above_results"}, -}; -const FeatureEntry::FeatureParam kWebUIOmniboxAimPopupAddContextButtonBelowResultsNoContextualChips[] = { {"Omnibox_AddContextButtonVariant", "below_results"}, {"Omnibox_ShowRecentTabChip", "false"}, @@ -883,12 +880,6 @@ {"Omnibox_ShowRecentTabChip", "false"}, {"Omnibox_ShowLensSearchChip", "false"}, }; -const FeatureEntry::FeatureParam - kWebUIOmniboxAimPopupAddContextButtonAboveResultsNoContextualChips[] = { - {"Omnibox_AddContextButtonVariant", "above_results"}, - {"Omnibox_ShowRecentTabChip", "false"}, - {"Omnibox_ShowLensSearchChip", "false"}, -}; const FeatureEntry::FeatureVariation kWebUIOmniboxAimPopupVariations[] = { {"- \"Add Context\" button below results", @@ -899,13 +890,7 @@ {"- \"Add Context\" button inline", kWebUIOmniboxAimPopupAddContextButtonInline, nullptr}, {"- \"Add Context\" button inline - no contextual chips", - kWebUIOmniboxAimPopupAddContextButtonInlineNoContextualChips, nullptr}, - {"- \"Add Context\" button above results [deprecated]", - kWebUIOmniboxAimPopupAddContextButtonAboveResults, nullptr}, - {"- \"Add Context\" button above results - no contextual chips " - "[deprecated]", - kWebUIOmniboxAimPopupAddContextButtonAboveResultsNoContextualChips, - nullptr}}; + kWebUIOmniboxAimPopupAddContextButtonInlineNoContextualChips, nullptr}}; const FeatureEntry::FeatureParam kWebUIOmniboxPopupDebugSxS[] = { {"SxS", "true"}}; @@ -1106,7 +1091,6 @@ const FeatureEntry::FeatureParam kPageActionsMigrationParams[] = { {"ai_mode", "true"}, - {"autofill_address", "true"}, {"bookmark_star", "true"}, {"cookie_controls", "true"}, {"collaboration_messaging", "true"}, @@ -4773,6 +4757,15 @@ }; #endif // BUILDFLAG(ENABLE_DICE_SUPPORT) +// The choices for the connection allowlists feature. +const FeatureEntry::Choice kConnectionAllowlistsChoices[] = { + {flags_ui::kGenericExperimentChoiceDefault, "", ""}, + {flags_ui::kGenericExperimentChoiceEnabled, switches::kEnableFeatures, + "ConnectionAllowlists,OverrideConnectionAllowlistOriginTrial"}, + {flags_ui::kGenericExperimentChoiceDisabled, switches::kDisableFeatures, + "ConnectionAllowlists,OverrideConnectionAllowlistOriginTrial"}, +}; + // RECORDING USER METRICS FOR FLAGS: // ----------------------------------------------------------------------------- // The first line of the entry is the internal name. @@ -5495,16 +5488,6 @@ flag_descriptions::kNotificationsIgnoreRequireInteractionDescription, kOsCrOS, FEATURE_VALUE_TYPE(features::kNotificationsIgnoreRequireInteraction)}, - {"sys-ui-holdback-drive-integration", - flag_descriptions::kSysUiShouldHoldbackDriveIntegrationName, - flag_descriptions::kSysUiShouldHoldbackDriveIntegrationDescription, - kOsCrOS, - FEATURE_VALUE_TYPE(ash::features::kSysUiShouldHoldbackDriveIntegration)}, - {"sys-ui-holdback-task-management", - flag_descriptions::kSysUiShouldHoldbackTaskManagementName, - flag_descriptions::kSysUiShouldHoldbackTaskManagementDescription, kOsCrOS, - FEATURE_VALUE_TYPE(ash::features::kSysUiShouldHoldbackTaskManagement)}, - #endif // BUILDFLAG(IS_CHROMEOS) #if (BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID)) {"mojo-use-eventfd", flag_descriptions::kMojoUseEventFdName, @@ -7644,10 +7627,9 @@ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || \ BUILDFLAG(IS_CHROMEOS) - {"enable-clickjacking-protection", - flag_descriptions::kEnableClickjackingProtectionName, - flag_descriptions::kEnableClickjackingProtectionDescription, kOsDesktop, - FEATURE_VALUE_TYPE(views::features::kEnableClickjackingProtection)}, + {"enable-input-protection", flag_descriptions::kEnableInputProtectionName, + flag_descriptions::kEnableInputProtectionDescription, kOsDesktop, + FEATURE_VALUE_TYPE(views::features::kEnableInputProtection)}, #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || // BUILDFLAG(IS_CHROMEOS) @@ -9172,6 +9154,12 @@ FEATURE_VALUE_TYPE( blink::features::kBrowserInitiatedAutomaticPictureInPicture)}, + {"browser-launch-metadata-reporting", + flag_descriptions::kBrowserLaunchMetadataReportingName, + flag_descriptions::kBrowserLaunchMetadataReportingDescription, + kOsLinux | kOsMac | kOsWin, + FEATURE_VALUE_TYPE(enterprise_reporting::kBrowserLaunchMetadataReporting)}, + {"picture-in-picture-show-window-animation", flag_descriptions::kPictureInPictureShowWindowAnimationName, flag_descriptions::kPictureInPictureShowWindowAnimationDescription, @@ -11506,12 +11494,6 @@ FEATURE_VALUE_TYPE(blink::features::kSupportOpeningDraggedLinksInSameTab)}, #endif - {"enable-secure-payment-confirmation-fallback-ux", - flag_descriptions::kSecurePaymentConfirmationFallbackName, - flag_descriptions::kSecurePaymentConfirmationFallbackDescription, kOsAll, - FEATURE_VALUE_TYPE( - payments::features::kSecurePaymentConfirmationFallback)}, - #if BUILDFLAG(IS_ANDROID) {"android-use-display-topology", flag_descriptions::kAndroidUseDisplayTopologyName, @@ -12506,7 +12488,7 @@ {"connection-allowlists", flag_descriptions::kConnectionAllowlistsName, flag_descriptions::kConnectionAllowlistsDescription, kOsAll, - FEATURE_VALUE_TYPE(network::features::kConnectionAllowlists)}, + MULTI_VALUE_TYPE(kConnectionAllowlistsChoices)}, #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ BUILDFLAG(IS_CHROMEOS) @@ -13114,6 +13096,9 @@ flag_descriptions::kAutofillEnableWalletBrandingV2Name, flag_descriptions::kAutofillEnableWalletBrandingV2Description, kOsAll, FEATURE_VALUE_TYPE(autofill::features::kAutofillEnableWalletBrandingV2)}, + {"webcrypto-pqc", flag_descriptions::kWebCryptoPQCName, + flag_descriptions::kWebCryptoPQCDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kWebCryptoPQC)}, // Add new entries above this line. // NOTE: Adding a new flag requires adding a corresponding entry to enum // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
diff --git a/chrome/browser/accessibility/live_caption/live_caption_speech_recognition_host_browsertest.cc b/chrome/browser/accessibility/live_caption/live_caption_speech_recognition_host_browsertest.cc index 11c41317..78be513 100644 --- a/chrome/browser/accessibility/live_caption/live_caption_speech_recognition_host_browsertest.cc +++ b/chrome/browser/accessibility/live_caption/live_caption_speech_recognition_host_browsertest.cc
@@ -19,6 +19,7 @@ #include "components/live_caption/live_caption_controller.h" #include "components/live_caption/live_translate_controller.h" #include "components/live_caption/pref_names.h" +#include "components/live_caption/translation_dispatcher_on_device.h" #include "components/live_caption/translation_util.h" #include "components/prefs/pref_service.h" #include "content/public/browser/render_frame_host.h" @@ -61,6 +62,11 @@ content::BrowserContext* browser_context) : LiveTranslateController( profile_prefs, + std::make_unique<TranslationDispatcherOnDevice>( + std::make_unique< + on_device_translation::OnDeviceTranslationServiceController>( + profile_prefs, + "")), std::make_unique<GoogleApiTranslationDispatcher>("dummy_api_key", browser_context)) {}
diff --git a/chrome/browser/accessibility/live_translate_controller_factory.cc b/chrome/browser/accessibility/live_translate_controller_factory.cc index 76a73af..0ec2fb4 100644 --- a/chrome/browser/accessibility/live_translate_controller_factory.cc +++ b/chrome/browser/accessibility/live_translate_controller_factory.cc
@@ -12,6 +12,7 @@ #include "components/live_caption/google_api_translation_dispatcher.h" #include "components/live_caption/live_translate_controller.h" #include "components/live_caption/translation_dispatcher_on_device.h" +#include "components/on_device_translation/buildflags/buildflags.h" #include "components/on_device_translation/service_controller.h" #include "components/on_device_translation/service_controller_manager.h" #include "google_apis/google_api_keys.h" @@ -56,21 +57,23 @@ LiveTranslateControllerFactory::BuildServiceInstanceForBrowserContext( content::BrowserContext* context) const { Profile* profile = Profile::FromBrowserContext(context); - std::unique_ptr<TranslationDispatcher> dispatcher; + std::unique_ptr<TranslationDispatcher> on_device_dispatcher; + std::unique_ptr<TranslationDispatcher> google_api_dispatcher; - // Use the correct dispatcher based on the feature flag + // Only set on_device_dispatcher if feature flag is set. if (base::FeatureList::IsEnabled( live_caption::kLiveCaptionOnDeviceTranslation)) { - dispatcher = std::make_unique<TranslationDispatcherOnDevice>( + on_device_dispatcher = std::make_unique<TranslationDispatcherOnDevice>( std::make_unique< on_device_translation::OnDeviceTranslationServiceController>( profile->GetPrefs(), "")); - } else { - dispatcher = std::make_unique<GoogleApiTranslationDispatcher>( - google_apis::GetAPIKey(), context); } - return std::make_unique<LiveTranslateController>(profile->GetPrefs(), - std::move(dispatcher)); + google_api_dispatcher = std::make_unique<GoogleApiTranslationDispatcher>( + google_apis::GetAPIKey(), context); + + return std::make_unique<LiveTranslateController>( + profile->GetPrefs(), std::move(on_device_dispatcher), + std::move(google_api_dispatcher)); } } // namespace captions
diff --git a/chrome/browser/accessibility_annotator/content_annotator/content_annotator_tab_helper_unittest.cc b/chrome/browser/accessibility_annotator/content_annotator/content_annotator_tab_helper_unittest.cc index 48c41a1f..4a2ce33b 100644 --- a/chrome/browser/accessibility_annotator/content_annotator/content_annotator_tab_helper_unittest.cc +++ b/chrome/browser/accessibility_annotator/content_annotator/content_annotator_tab_helper_unittest.cc
@@ -17,6 +17,7 @@ #include "chromeos/constants/chromeos_features.h" #endif #include "chrome/test/base/testing_profile.h" +#include "components/accessibility_annotator/content/content_annotator/content_annotation_validator.h" #include "components/accessibility_annotator/content/content_annotator/content_annotator_service.h" #include "components/accessibility_annotator/content/content_annotator/content_classifier.h" #include "components/accessibility_annotator/core/accessibility_annotator_features.h" @@ -48,7 +49,8 @@ AccessibilityAnnotatorBackend& accessibility_annotator_backend, passage_embeddings::Embedder* embedder, passage_embeddings::EmbedderMetadataProvider* embedder_metadata_provider, - std::unique_ptr<ContentClassifier> content_classifier) + std::unique_ptr<ContentClassifier> content_classifier, + std::unique_ptr<ContentAnnotationValidator> validator) : ContentAnnotatorService(page_content_annotations_service, page_content_extraction_service, optimization_guide_remote_model_executor, @@ -56,7 +58,8 @@ accessibility_annotator_backend, embedder, embedder_metadata_provider, - std::move(content_classifier)) {} + std::move(content_classifier), + std::move(validator)) {} ~MockContentAnnotatorService() override = default; MOCK_METHOD(void, @@ -101,13 +104,17 @@ ContentClassifier::Create(mock_embedder_.get()); ASSERT_TRUE(content_classifier_); + std::unique_ptr<ContentAnnotationValidator> validator_ = + ContentAnnotationValidator::Create(); + ASSERT_TRUE(validator_); + mock_service_ = std::make_unique<testing::StrictMock<MockContentAnnotatorService>>( *page_content_annotations_service_, *page_content_extraction_service, mock_remote_model_executor_, *page_embeddings_service, *accessibility_annotator_backend, mock_embedder_.get(), mock_embedder_metadata_provider_.get(), - std::move(content_classifier_)); + std::move(content_classifier_), std::move(validator_)); tab_interface_ = std::make_unique<tabs::MockTabInterface>(); EXPECT_CALL(*tab_interface_, GetContents())
diff --git a/chrome/browser/actor/execution_engine.cc b/chrome/browser/actor/execution_engine.cc index 4cf5f72..6e91861 100644 --- a/chrome/browser/actor/execution_engine.cc +++ b/chrome/browser/actor/execution_engine.cc
@@ -1076,14 +1076,6 @@ TRACE_EVENT0("actor", "ExecutionEngine::PromptToSelectCredential"); CHECK(!credentials.empty()); - if (credential_selection_override_callback_ && - base::FeatureList::IsEnabled( - password_manager::features::kPasswordCheckupPrototype)) { - std::move(credential_selection_override_callback_) - .Run(credentials, std::move(callback)); - return; - } - if (!task_->delegate()) { // TODO(crbug.com/427817882): Explicit error reason (kNewLonginAttempt). std::move(callback).Run(/*selected_credential=*/webui::mojom:: @@ -1207,11 +1199,6 @@ origin_checker_.AllowNavigationTo(added_writable_mainframe_origins); } -void ExecutionEngine::PreHandleCredentialSelectionDialog( - CredentialSelectionOverrideCallback callback) { - credential_selection_override_callback_ = std::move(callback); -} - const ToolRequest& ExecutionEngine::GetNextAction() const { CHECK_LT(next_action_index_, action_sequence_.size()); return *action_sequence_.at(next_action_index_).get();
diff --git a/chrome/browser/actor/execution_engine.h b/chrome/browser/actor/execution_engine.h index 70c74b66..9ae029d 100644 --- a/chrome/browser/actor/execution_engine.h +++ b/chrome/browser/actor/execution_engine.h
@@ -184,14 +184,6 @@ void AddWritableMainframeOrigins( const absl::flat_hash_set<url::Origin>& added_writable_mainframe_origins); - // Callback to intercept and handle credential selection for actor login - // programmatically. - using CredentialSelectionOverrideCallback = - base::OnceCallback<void(const std::vector<actor_login::Credential>&, - ToolDelegate::CredentialSelectedCallback)>; - void PreHandleCredentialSelectionDialog( - CredentialSelectionOverrideCallback callback); - // Callback invoked when ConfirmCrossOriginNavigation, which spawns an IPC to // the web client, receives its response. This callback gets a boolean // indicating if navigation should continue. @@ -400,10 +392,6 @@ // the user has been prompted about. OriginChecker origin_checker_; - // For overwriting the actor login permission, currently only works for the - // feature `kPasswordCheckupPrototype` for automated password changes. - CredentialSelectionOverrideCallback credential_selection_override_callback_; - // For multi-step login, this is the credential that the user has chosen to // allow the actor to use. The key is the // `Credential::request_origin`.
diff --git a/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/BrowserServicesIntentDataProvider.java b/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/BrowserServicesIntentDataProvider.java index cc745ca..c7f9796 100644 --- a/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/BrowserServicesIntentDataProvider.java +++ b/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/BrowserServicesIntentDataProvider.java
@@ -13,10 +13,12 @@ import android.app.PendingIntent; import android.content.ComponentName; +import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; import android.widget.RemoteViews; +import androidx.annotation.ColorInt; import androidx.annotation.IntDef; import androidx.annotation.Px; import androidx.browser.customtabs.CustomContentAction; @@ -696,8 +698,16 @@ } /** + * Returns the background color in ARGB format. For now, used only by Partial Custom Tabs to + * have a transparency to keep the host app visible while the page is loading. + */ + public @ColorInt int getTranslucentBackgroundColor(Context context) { + return 0; + } + + /** * @return true, as by default having a PCCT launched still allows interaction with the - * background application + * background application */ public boolean canInteractWithBackground() { return false;
diff --git a/chrome/browser/android/locale/locale_manager.cc b/chrome/browser/android/locale/locale_manager.cc index 685310a..750d6834 100644 --- a/chrome/browser/android/locale/locale_manager.cc +++ b/chrome/browser/android/locale/locale_manager.cc
@@ -14,7 +14,7 @@ std::string LocaleManager::GetYandexReferralID() { JNIEnv* env = base::android::AttachCurrentThread(); base::android::ScopedJavaLocalRef<JLocaleManager> jlocale_manager = - JLocaleManagerJni::getInstance(env); + LocaleManagerJni::getInstance(env); if (jlocale_manager.is_null()) return ""; return jlocale_manager->getYandexReferralId(env); @@ -24,7 +24,7 @@ std::string LocaleManager::GetMailRUReferralID() { JNIEnv* env = base::android::AttachCurrentThread(); base::android::ScopedJavaLocalRef<JLocaleManager> jlocale_manager = - JLocaleManagerJni::getInstance(env); + LocaleManagerJni::getInstance(env); if (jlocale_manager.is_null()) return ""; return jlocale_manager->getMailRUReferralId(env);
diff --git a/chrome/browser/android/tab_state_storage_service_android.cc b/chrome/browser/android/tab_state_storage_service_android.cc index b3b7538..f8c29c0 100644 --- a/chrome/browser/android/tab_state_storage_service_android.cc +++ b/chrome/browser/android/tab_state_storage_service_android.cc
@@ -153,6 +153,13 @@ tab_state_storage_service_->ClearDivergenceWindow(window_tag); } +void TabStateStorageServiceAndroid::ClearAllWindowsExcept( + JNIEnv* env, + const std::vector<std::string>& window_tags) { + auto scoped_batch = tab_state_storage_service_->CreateScopedBatch(); + tab_state_storage_service_->ClearAllWindowsExcept(window_tags); +} + void TabStateStorageServiceAndroid::ClearWindowWithOtrStatus( JNIEnv* env, const std::string& window_tag,
diff --git a/chrome/browser/android/tab_state_storage_service_android.h b/chrome/browser/android/tab_state_storage_service_android.h index 6b7728c..3978b0d 100644 --- a/chrome/browser/android/tab_state_storage_service_android.h +++ b/chrome/browser/android/tab_state_storage_service_android.h
@@ -51,6 +51,9 @@ void ClearWindow(JNIEnv* env, const std::string& window_tag); + void ClearAllWindowsExcept(JNIEnv* env, + const std::vector<std::string>& window_tags); + void ClearWindowWithOtrStatus(JNIEnv* env, const std::string& window_tag, bool is_off_the_record);
diff --git a/chrome/browser/android/webapk/webapk_database.cc b/chrome/browser/android/webapk/webapk_database.cc index 106fda94..fa0dc493 100644 --- a/chrome/browser/android/webapk/webapk_database.cc +++ b/chrome/browser/android/webapk/webapk_database.cc
@@ -55,12 +55,10 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); CHECK(opened_); - std::unique_ptr<syncer::DataTypeStore::WriteBatch> write_batch = - store_->CreateWriteBatch(); - // |update_data| can be empty here but we should write |metadata_change_list| // anyway. - write_batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); + std::unique_ptr<syncer::DataTypeStore::WriteBatch> write_batch = + store_->CreateWriteBatch(std::move(metadata_change_list)); for (const std::unique_ptr<WebApkProto>& webapk : update_data.apps_to_create) {
diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc index 29877f4..cef928a9 100644 --- a/chrome/browser/apps/guest_view/web_view_browsertest.cc +++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
@@ -6329,11 +6329,10 @@ // The webview "simple" page is a first navigation to a raw data url. It is // currently considered public (internally // `network::mojom::IPAddressSpace::kUnknown`). - EXPECT_THAT(content::EvalJs( - guest_frame_host, - content::JsReplace("fetch($1).then(response => response.ok)", - fetch_url)), - content::EvalJsResult::IsError()); + EXPECT_FALSE(content::ExecJs( + guest_frame_host, + content::JsReplace("fetch($1).then(response => response.ok)", + fetch_url))); } // Verify that navigating a <webview> subframe to a disallowed extension
diff --git a/chrome/browser/ash/chromebox_for_meetings/artemis/data_aggregator_service.cc b/chrome/browser/ash/chromebox_for_meetings/artemis/data_aggregator_service.cc index bc8f752..09118446 100644 --- a/chrome/browser/ash/chromebox_for_meetings/artemis/data_aggregator_service.cc +++ b/chrome/browser/ash/chromebox_for_meetings/artemis/data_aggregator_service.cc
@@ -813,6 +813,9 @@ return; } + // TODO(crbug.com/475558926): Remove when fixed. + SYSLOG(INFO) << "Recent enqueue succeeded."; + VLOG(1) << "Recent enqueue succeeded."; enqueue_retry_backoff_.Reset();
diff --git a/chrome/browser/ash/login/debug_overlay_browsertest.cc b/chrome/browser/ash/login/debug_overlay_browsertest.cc index 7186a82f..e8b71a8 100644 --- a/chrome/browser/ash/login/debug_overlay_browsertest.cc +++ b/chrome/browser/ash/login/debug_overlay_browsertest.cc
@@ -21,7 +21,7 @@ constexpr char kDebugOverlay[] = "debuggerOverlay"; constexpr char kScreensPanel[] = "DebuggerPanelScreens"; -constexpr int kCommonScreensCount = 54; +constexpr int kCommonScreensCount = 53; constexpr int kOobeOnlyScreensCount = 10; constexpr int kLoginOnlyScreensCount = 4;
diff --git a/chrome/browser/ash/login/screens/osauth/BUILD.gn b/chrome/browser/ash/login/screens/osauth/BUILD.gn index df57ab8..b479bce 100644 --- a/chrome/browser/ash/login/screens/osauth/BUILD.gn +++ b/chrome/browser/ash/login/screens/osauth/BUILD.gn
@@ -28,8 +28,6 @@ "password_selection_screen.h", "recovery_eligibility_screen.cc", "recovery_eligibility_screen.h", - "remove_local_auth_factors_screen.cc", - "remove_local_auth_factors_screen.h", ] public_deps = [ @@ -81,7 +79,6 @@ "local_password_setup_screen_browsertest.cc", "password_selection_screen_browsertest.cc", "recovery_eligibility_screen_browsertest.cc", - "remove_local_auth_factors_screen_browsertest.cc", ] deps = [
diff --git a/chrome/browser/ash/login/screens/osauth/remove_local_auth_factors_screen.cc b/chrome/browser/ash/login/screens/osauth/remove_local_auth_factors_screen.cc deleted file mode 100644 index a867ce6..0000000 --- a/chrome/browser/ash/login/screens/osauth/remove_local_auth_factors_screen.cc +++ /dev/null
@@ -1,74 +0,0 @@ -// Copyright 2026 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/osauth/remove_local_auth_factors_screen.h" - -#include "base/check.h" -#include "base/memory/weak_ptr.h" -#include "base/values.h" -#include "chrome/browser/ash/login/oobe_screen.h" -#include "chrome/browser/ash/login/screens/base_screen.h" -#include "chrome/browser/ash/login/wizard_context.h" -#include "chrome/browser/ui/webui/ash/login/remove_local_auth_factors_screen_handler.h" - -namespace ash { -namespace { - -constexpr char kUserActionDoneButtonClicked[] = "done"; - -} // namespace - -// static -std::string RemoveLocalAuthFactorsScreen::GetResultString(Result result) { - // LINT.IfChange(UsageMetrics) - switch (result) { - case Result::kSuccess: - return "Next"; - case Result::kError: - return "Error"; - } - // LINT.ThenChange(//tools/metrics/histograms/metadata/oobe/histograms.xml) -} - -RemoveLocalAuthFactorsScreen::RemoveLocalAuthFactorsScreen( - base::WeakPtr<RemoveLocalAuthFactorsScreenView> view, - const ScreenExitCallback& exit_callback) - : BaseOSAuthSetupScreen(RemoveLocalAuthFactorsScreenView::kScreenId, - OobeScreenPriority::DEFAULT), - view_(std::move(view)), - exit_callback_(exit_callback) {} - -RemoveLocalAuthFactorsScreen::~RemoveLocalAuthFactorsScreen() = default; - -void RemoveLocalAuthFactorsScreen::InspectContext(UserContext* user_context) { - if (!user_context) { - LOG(ERROR) << "Session expired while waiting for user's decision"; - context()->osauth_error = WizardContext::OSAuthErrorKind::kFatal; - exit_callback_.Run(Result::kError); - return; - } - CHECK(user_context->HasAuthFactorsConfiguration()); -} - -void RemoveLocalAuthFactorsScreen::ShowImpl() { - if (!view_) { - return; - } - - view_->Show(); - view_->ShowRemoveLocalAuthFactorsSuccessStep(); -} - -void RemoveLocalAuthFactorsScreen::HideImpl() {} - -void RemoveLocalAuthFactorsScreen::OnUserAction(const base::ListValue& args) { - const std::string& action_id = args[0].GetString(); - if (action_id == kUserActionDoneButtonClicked) { - exit_callback_.Run(Result::kSuccess); - } else { - BaseScreen::OnUserAction(args); - } -} - -} // namespace ash
diff --git a/chrome/browser/ash/login/screens/osauth/remove_local_auth_factors_screen.h b/chrome/browser/ash/login/screens/osauth/remove_local_auth_factors_screen.h deleted file mode 100644 index 458109a..0000000 --- a/chrome/browser/ash/login/screens/osauth/remove_local_auth_factors_screen.h +++ /dev/null
@@ -1,60 +0,0 @@ -// Copyright 2026 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_OSAUTH_REMOVE_LOCAL_AUTH_FACTORS_SCREEN_H_ -#define CHROME_BROWSER_ASH_LOGIN_SCREENS_OSAUTH_REMOVE_LOCAL_AUTH_FACTORS_SCREEN_H_ - -#include <memory> -#include <string> - -#include "base/functional/callback.h" -#include "base/memory/weak_ptr.h" -#include "base/values.h" -#include "chrome/browser/ash/login/screens/base_screen.h" -#include "chrome/browser/ash/login/screens/osauth/base_osauth_setup_screen.h" -#include "chrome/browser/ash/login/wizard_context.h" -#include "chromeos/ash/components/login/auth/public/user_context.h" - -namespace ash { - -class RemoveLocalAuthFactorsScreenView; -// Screen that is shown when the user goes through remove local auth factors -// flow -// TODO: b/445628245 - Implement logic for the screen -class RemoveLocalAuthFactorsScreen : public BaseOSAuthSetupScreen { - public: - using TView = RemoveLocalAuthFactorsScreenView; - - enum class Result { kSuccess = 0, kError }; - - using ScreenExitCallback = base::RepeatingCallback<void(Result result)>; - - RemoveLocalAuthFactorsScreen( - base::WeakPtr<RemoveLocalAuthFactorsScreenView> view, - const ScreenExitCallback& exit_callback); - - RemoveLocalAuthFactorsScreen(const RemoveLocalAuthFactorsScreen&) = delete; - RemoveLocalAuthFactorsScreen& operator=(const RemoveLocalAuthFactorsScreen&) = - delete; - - ~RemoveLocalAuthFactorsScreen() override; - - static std::string GetResultString(Result result); - - private: - void InspectContext(UserContext* user_context); - - // BaseOSAuthSetupScreen: - void ShowImpl() override; - void HideImpl() override; - void OnUserAction(const base::ListValue& args) override; - - base::WeakPtr<RemoveLocalAuthFactorsScreenView> view_; - ScreenExitCallback exit_callback_; - base::WeakPtrFactory<RemoveLocalAuthFactorsScreen> weak_ptr_factory_{this}; -}; - -} // namespace ash - -#endif // CHROME_BROWSER_ASH_LOGIN_SCREENS_OSAUTH_REMOVE_LOCAL_AUTH_FACTORS_SCREEN_H_
diff --git a/chrome/browser/ash/login/screens/osauth/remove_local_auth_factors_screen_browsertest.cc b/chrome/browser/ash/login/screens/osauth/remove_local_auth_factors_screen_browsertest.cc deleted file mode 100644 index cf4ef3c..0000000 --- a/chrome/browser/ash/login/screens/osauth/remove_local_auth_factors_screen_browsertest.cc +++ /dev/null
@@ -1,85 +0,0 @@ -// Copyright 2026 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/osauth/remove_local_auth_factors_screen.h" - -#include "ash/constants/ash_features.h" -#include "ash/constants/ash_switches.h" -#include "base/test/scoped_feature_list.h" -#include "base/test/test_future.h" -#include "chrome/browser/ash/login/oobe_screen.h" -#include "chrome/browser/ash/login/test/js_checker.h" -#include "chrome/browser/ash/login/test/login_manager_mixin.h" -#include "chrome/browser/ash/login/test/oobe_base_test.h" -#include "chrome/browser/ash/login/test/oobe_screen_waiter.h" -#include "chrome/browser/ash/login/wizard_controller.h" -#include "chrome/browser/ui/webui/ash/login/cryptohome_recovery_setup_screen_handler.h" -#include "chrome/browser/ui/webui/ash/login/remove_local_auth_factors_screen_handler.h" -#include "chromeos/ash/components/login/auth/public/user_context.h" -#include "content/public/test/browser_test.h" - -namespace ash { - -class RemoveLocalAuthFactorsScreenTest : public OobeBaseTest { - public: - RemoveLocalAuthFactorsScreenTest() { - feature_list_.InitAndEnableFeature(features::kManagedLocalPinAndPassword); - } - ~RemoveLocalAuthFactorsScreenTest() override = default; - - void SetUpCommandLine(base::CommandLine* command_line) override { - OobeBaseTest::SetUpCommandLine(command_line); - command_line->AppendSwitch(switches::kAllowFailedPolicyFetchForTest); - } - - void LoginAndShowRemoveLocalAuthFactorsScreen() { - // TODO: b/445628245 - Remove the recovery setup interception once we - // integrate the screen in the actual flow. - - // Setup to intercept CryptohomeRecoverySetupScreen exit - CryptohomeRecoverySetupScreen* recovery_screen = - WizardController::default_controller() - ->GetScreen<CryptohomeRecoverySetupScreen>(); - recovery_original_callback_ = - recovery_screen->get_exit_callback_for_testing(); - recovery_screen->set_exit_callback_for_testing( - recovery_setup_result_test_future_.GetRepeatingCallback()); - - // Login as a new enterprise user - login_manager_mixin_.LoginAsNewEnterpriseUser(); - - // Wait for the CryptohomeRecoverySetupScreen to be shown and about to exit. - ASSERT_TRUE(recovery_setup_result_test_future_.Wait()); - - WizardController::default_controller()->AdvanceToScreen( - RemoveLocalAuthFactorsScreenView::kScreenId); - } - - protected: - LoginManagerMixin login_manager_mixin_{&mixin_host_}; - - private: - base::test::ScopedFeatureList feature_list_; - CryptohomeRecoverySetupScreen::ScreenExitCallback recovery_original_callback_; - base::test::TestFuture<CryptohomeRecoverySetupScreen::Result> - recovery_setup_result_test_future_; -}; - -// Test that the screen is shown and the Done button is visible and enabled. -IN_PROC_BROWSER_TEST_F(RemoveLocalAuthFactorsScreenTest, - ScreenShownWithDoneButton) { - LoginAndShowRemoveLocalAuthFactorsScreen(); - - OobeScreenWaiter(RemoveLocalAuthFactorsScreenView::kScreenId).Wait(); - - const test::UIPath kDoneButtonPath = {"remove-local-auth-factors", - "doneButton"}; - test::OobeJS().CreateVisibilityWaiter(true, kDoneButtonPath)->Wait(); - test::OobeJS().ExpectEnabledPath(kDoneButtonPath); - - // TODO: b/445628245 - Add test for clicking the done button and checking - // the screen exit result once the exit logic is implemented. -} - -} // namespace ash
diff --git a/chrome/browser/ash/login/wizard_controller.cc b/chrome/browser/ash/login/wizard_controller.cc index edc69669..273cc3d 100644 --- a/chrome/browser/ash/login/wizard_controller.cc +++ b/chrome/browser/ash/login/wizard_controller.cc
@@ -111,7 +111,6 @@ #include "chrome/browser/ash/login/screens/osauth/osauth_error_screen.h" #include "chrome/browser/ash/login/screens/osauth/password_selection_screen.h" #include "chrome/browser/ash/login/screens/osauth/recovery_eligibility_screen.h" -#include "chrome/browser/ash/login/screens/osauth/remove_local_auth_factors_screen.h" #include "chrome/browser/ash/login/screens/packaged_license_screen.h" #include "chrome/browser/ash/login/screens/perks_discovery_screen.h" #include "chrome/browser/ash/login/screens/personalized_recommend_apps_screen.h" @@ -227,7 +226,6 @@ #include "chrome/browser/ui/webui/ash/login/recommend_apps_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/recovery_eligibility_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/remote_activity_notification_screen_handler.h" -#include "chrome/browser/ui/webui/ash/login/remove_local_auth_factors_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/reset_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/saml_confirm_password_handler.h" #include "chrome/browser/ui/webui/ash/login/signin_fatal_error_screen_handler.h" @@ -1098,14 +1096,6 @@ } } - if (features::IsManagedLocalPinAndPasswordEnabled()) { - append(std::make_unique<RemoveLocalAuthFactorsScreen>( - oobe_ui->GetView<RemoveLocalAuthFactorsScreenHandler>()->AsWeakPtr(), - base::BindRepeating( - &WizardController::OnRemoveLocalAuthFactorsScreenExit, - weak_factory_.GetWeakPtr()))); - } - return result; } @@ -2830,19 +2820,6 @@ } } -void WizardController::OnRemoveLocalAuthFactorsScreenExit( - RemoveLocalAuthFactorsScreen::Result result) { - OnScreenExit(RemoveLocalAuthFactorsScreenView::kScreenId, - RemoveLocalAuthFactorsScreen::GetResultString(result)); - - switch (result) { - case RemoveLocalAuthFactorsScreen::Result::kSuccess: - case RemoveLocalAuthFactorsScreen::Result::kError: - // TODO: b/445628245 - Implement screen exit logic. - return; - } -} - void WizardController::ObtainContextAndFinalizeAuth() { CHECK(wizard_context_->extra_factors_token); auto token = std::move(wizard_context_->extra_factors_token); @@ -3625,8 +3602,7 @@ screen_id == FjordTouchControllerScreenView::kScreenId || screen_id == FjordImageSelectionScreenView::kScreenId || screen_id == FjordImageDownloadScreenView::kScreenId || - screen_id == FjordFwUpdateScreenView::kScreenId || - screen_id == RemoveLocalAuthFactorsScreenView::kScreenId) { + screen_id == FjordFwUpdateScreenView::kScreenId) { SetCurrentScreen(GetScreen(screen_id)); } else { NOTREACHED();
diff --git a/chrome/browser/ash/login/wizard_controller.h b/chrome/browser/ash/login/wizard_controller.h index ceb68c2c..13e1bf7 100644 --- a/chrome/browser/ash/login/wizard_controller.h +++ b/chrome/browser/ash/login/wizard_controller.h
@@ -67,7 +67,6 @@ #include "chrome/browser/ash/login/screens/osauth/osauth_error_screen.h" #include "chrome/browser/ash/login/screens/osauth/password_selection_screen.h" #include "chrome/browser/ash/login/screens/osauth/recovery_eligibility_screen.h" -#include "chrome/browser/ash/login/screens/osauth/remove_local_auth_factors_screen.h" #include "chrome/browser/ash/login/screens/packaged_license_screen.h" #include "chrome/browser/ash/login/screens/parental_handoff_screen.h" #include "chrome/browser/ash/login/screens/perks_discovery_screen.h" @@ -528,8 +527,6 @@ void OnFjordTouchControllerScreenExit(); void OnFjordStationSetupScreenExit(); void OnFjordFwUpdateScreenExit(); - void OnRemoveLocalAuthFactorsScreenExit( - RemoveLocalAuthFactorsScreen::Result result); // Callback invoked once it has been determined whether the device is disabled // or not.
diff --git a/chrome/browser/ash/phonehub/browser_tabs_model_provider_impl_unittest.cc b/chrome/browser/ash/phonehub/browser_tabs_model_provider_impl_unittest.cc index 9b89d80..b8d9878 100644 --- a/chrome/browser/ash/phonehub/browser_tabs_model_provider_impl_unittest.cc +++ b/chrome/browser/ash/phonehub/browser_tabs_model_provider_impl_unittest.cc
@@ -25,6 +25,7 @@ #include "components/policy/policy_constants.h" #include "components/sync/base/features.h" #include "components/sync/test/mock_sync_service.h" +#include "components/sync_sessions/mock_open_tabs_ui_delegate.h" #include "components/sync_sessions/open_tabs_ui_delegate.h" #include "components/sync_sessions/session_sync_service.h" #include "components/user_manager/scoped_user_manager.h" @@ -56,31 +57,6 @@ base::WeakPtr<syncer::DataTypeControllerDelegate>()); }; -class OpenTabsUIDelegateMock : public sync_sessions::OpenTabsUIDelegate { - public: - OpenTabsUIDelegateMock() = default; - ~OpenTabsUIDelegateMock() override = default; - - MOCK_METHOD1(GetAllForeignSessions, - bool(std::vector<raw_ptr<const sync_sessions::SyncedSession, - VectorExperimental>>* sessions)); - MOCK_CONST_METHOD0(GetAllForeignSessionLastModifiedTimes, - base::flat_map<std::string, base::Time>()); - MOCK_METHOD3(GetForeignTab, - bool(const std::string& tag, - const SessionID tab_id, - const sessions::SessionTab** tab)); - MOCK_METHOD1(DeleteForeignSession, void(const std::string& tag)); - MOCK_METHOD1( - GetForeignSession, - std::vector<const sessions::SessionWindow*>(const std::string& tag)); - MOCK_METHOD2(GetForeignSessionTabs, - bool(const std::string& tag, - std::vector<const sessions::SessionTab*>* tabs)); - MOCK_METHOD1(GetLocalSession, - bool(const sync_sessions::SyncedSession** local)); -}; - multidevice::RemoteDeviceRef CreatePhoneDevice(const std::string& pii_name) { multidevice::RemoteDeviceRefBuilder builder; builder.SetPiiFreeName(pii_name); @@ -165,7 +141,8 @@ return false; } - testing::NiceMock<OpenTabsUIDelegateMock>* open_tabs_ui_delegate() { + testing::NiceMock<sync_sessions::MockOpenTabsUIDelegate>* + open_tabs_ui_delegate() { return enable_tab_sync_ ? &open_tabs_ui_delegate_ : nullptr; } @@ -193,7 +170,8 @@ testing::NiceMock<SessionSyncServiceMock> mock_session_sync_service_; std::unique_ptr<BrowserTabsModelProviderImpl> provider_; - testing::NiceMock<OpenTabsUIDelegateMock> open_tabs_ui_delegate_; + testing::NiceMock<sync_sessions::MockOpenTabsUIDelegate> + open_tabs_ui_delegate_; bool enable_tab_sync_ = true; raw_ptr<std::vector<
diff --git a/chrome/browser/ash/printing/oauth2/profile_auth_servers_sync_bridge.cc b/chrome/browser/ash/printing/oauth2/profile_auth_servers_sync_bridge.cc index d2f16fbf..2322ac5 100644 --- a/chrome/browser/ash/printing/oauth2/profile_auth_servers_sync_bridge.cc +++ b/chrome/browser/ash/printing/oauth2/profile_auth_servers_sync_bridge.cc
@@ -187,7 +187,7 @@ std::set<std::string> unsynced_local_uris = servers_uris_; std::set<std::string> added_local_uris; std::unique_ptr<syncer::DataTypeStore::WriteBatch> batch = - store_->CreateWriteBatch(); + store_->CreateWriteBatch(std::move(metadata_change_list)); for (const std::unique_ptr<syncer::EntityChange>& change : entity_data) { const sync_pb::PrintersAuthorizationServerSpecifics& specifics = @@ -206,11 +206,10 @@ // Send unmatched local URIs to the server. for (const std::string& uri : unsynced_local_uris) { change_processor()->Put(uri, ToEntityDataPtr(uri), - metadata_change_list.get()); + batch->GetMetadataChangeList()); } // Save new local URIs to the local store. - batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); store_->CommitWriteBatch( std::move(batch), base::BindOnce(&ProfileAuthServersSyncBridge::OnCommit, weak_ptr_factory_.GetWeakPtr())); @@ -227,7 +226,7 @@ std::set<std::string> deleted_local_uris; std::unique_ptr<syncer::DataTypeStore::WriteBatch> batch = - store_->CreateWriteBatch(); + store_->CreateWriteBatch(std::move(metadata_change_list)); for (const std::unique_ptr<syncer::EntityChange>& change : entity_changes) { const std::string& uri = change->storage_key(); if (change->type() == syncer::EntityChange::ACTION_DELETE) { @@ -244,7 +243,6 @@ } } } - batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); store_->CommitWriteBatch( std::move(batch), base::BindOnce(&ProfileAuthServersSyncBridge::OnCommit, weak_ptr_factory_.GetWeakPtr()));
diff --git a/chrome/browser/ash/printing/printers_sync_bridge.cc b/chrome/browser/ash/printing/printers_sync_bridge.cc index 7e56714..7d9c6eb 100644 --- a/chrome/browser/ash/printing/printers_sync_bridge.cc +++ b/chrome/browser/ash/printing/printers_sync_bridge.cc
@@ -61,8 +61,9 @@ bool ResolveInvalidPpdReference(sync_pb::PrinterSpecifics* specifics) { auto* ppd_ref = specifics->mutable_ppd_reference(); - if (!ppd_ref->autoconf()) + if (!ppd_ref->autoconf()) { return false; + } if (!ppd_ref->has_user_supplied_ppd_url() && !ppd_ref->has_effective_make_and_model()) { @@ -89,10 +90,11 @@ // Returns true if the store has been initialized. bool Ready() { return store_.get() != nullptr; } - // Returns a new WriteBatch. - std::unique_ptr<DataTypeStore::WriteBatch> CreateWriteBatch() { - DCHECK(store_); - return store_->CreateWriteBatch(); + // Returns a new WriteBatch with metadata changes. + std::unique_ptr<DataTypeStore::WriteBatch> CreateWriteBatch( + std::unique_ptr<MetadataChangeList> metadata_change_list) { + CHECK(store_); + return store_->CreateWriteBatch(std::move(metadata_change_list)); } // Commits writes to the database and updates metadata. @@ -203,7 +205,7 @@ DCHECK(change_processor()->IsTrackingMetadata()); std::unique_ptr<DataTypeStore::WriteBatch> batch = - store_delegate_->CreateWriteBatch(); + store_delegate_->CreateWriteBatch(std::move(metadata_change_list)); std::set<std::string> sync_entity_ids; { base::AutoLock lock(data_lock_); @@ -236,13 +238,12 @@ // which there was a remote copy are overwritten. change_processor()->Put(local_entity_id, CopyToEntityData(*entry.second), - metadata_change_list.get()); + batch->GetMetadataChangeList()); } } } NotifyPrintersUpdated(); - batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); store_delegate_->Commit(std::move(batch)); return {}; } @@ -252,7 +253,7 @@ std::unique_ptr<MetadataChangeList> metadata_change_list, EntityChangeList entity_changes) { std::unique_ptr<DataTypeStore::WriteBatch> batch = - store_delegate_->CreateWriteBatch(); + store_delegate_->CreateWriteBatch(std::move(metadata_change_list)); { base::AutoLock lock(data_lock_); // For all the entities from the server, apply changes. @@ -276,9 +277,6 @@ } NotifyPrintersUpdated(); - // Update the local database with metadata for the incoming changes. - batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); - store_delegate_->Commit(std::move(batch)); return {}; } @@ -403,7 +401,7 @@ DCHECK(store_delegate_->Ready()); std::unique_ptr<DataTypeStore::WriteBatch> batch = - store_delegate_->CreateWriteBatch(); + store_delegate_->CreateWriteBatch(/*metadata_change_list=*/nullptr); { base::AutoLock lock(data_lock_); if (!DeleteSpecifics(id, batch.get())) { @@ -451,7 +449,7 @@ void PrintersSyncBridge::CommitPrinterPut( const sync_pb::PrinterSpecifics& printer) { std::unique_ptr<DataTypeStore::WriteBatch> batch = - store_delegate_->CreateWriteBatch(); + store_delegate_->CreateWriteBatch(/*metadata_change_list=*/nullptr); if (change_processor()->IsTrackingMetadata()) { change_processor()->Put(printer.id(), CopyToEntityData(printer), batch->GetMetadataChangeList());
diff --git a/chrome/browser/autofill/BUILD.gn b/chrome/browser/autofill/BUILD.gn index 866f6edf..3895465 100644 --- a/chrome/browser/autofill/BUILD.gn +++ b/chrome/browser/autofill/BUILD.gn
@@ -31,8 +31,6 @@ "autofill_optimization_guide_decider_factory.h", "gmail_otp_backend_factory.cc", "gmail_otp_backend_factory.h", - "iban_manager_factory.cc", - "iban_manager_factory.h", "merchant_promo_code_manager_factory.cc", "merchant_promo_code_manager_factory.h", "one_time_token_service_factory.cc", @@ -215,10 +213,7 @@ } if (!is_android) { - deps += [ - "//chrome/browser/autofill/actor:test_support", - "//components/autofill/core/browser:test_support", - ] + deps += [ "//components/autofill/core/browser:test_support" ] } }
diff --git a/chrome/browser/autofill/actor/BUILD.gn b/chrome/browser/autofill/actor/BUILD.gn index 900ad870d..9bc1df8e 100644 --- a/chrome/browser/autofill/actor/BUILD.gn +++ b/chrome/browser/autofill/actor/BUILD.gn
@@ -37,6 +37,7 @@ "actor_filling_observer_unittest.cc", "actor_form_filling_service_unittest.cc", "actor_form_section_splitter_unittest.cc", + "actor_key_metrics_recorder_unittest.cc", ] deps = [ @@ -58,6 +59,8 @@ sources = [ "actor_form_filling_service_impl_test_api.h", + "actor_test_utils.cc", + "actor_test_utils.h", "mock_actor_form_filling_service.cc", "mock_actor_form_filling_service.h", ] @@ -65,5 +68,8 @@ public_deps = [ ":actor", "//base", + "//chrome/test:test_support", + "//components/autofill/content/browser:test_support", + "//components/tabs:test_support", ] }
diff --git a/chrome/browser/autofill/actor/actor_form_filling_service_unittest.cc b/chrome/browser/autofill/actor/actor_form_filling_service_unittest.cc index 553443d4c..a52e06f 100644 --- a/chrome/browser/autofill/actor/actor_form_filling_service_unittest.cc +++ b/chrome/browser/autofill/actor/actor_form_filling_service_unittest.cc
@@ -15,32 +15,21 @@ #include "chrome/browser/autofill/actor/actor_filling_observer.h" #include "chrome/browser/autofill/actor/actor_form_filling_service_impl.h" #include "chrome/browser/autofill/actor/actor_form_filling_service_impl_test_api.h" -#include "chrome/test/base/chrome_render_view_host_test_harness.h" +#include "chrome/browser/autofill/actor/actor_test_utils.h" #include "chrome/test/base/testing_profile.h" #include "components/autofill/content/browser/content_autofill_client.h" -#include "components/autofill/content/browser/test_autofill_client_injector.h" -#include "components/autofill/content/browser/test_autofill_driver_injector.h" -#include "components/autofill/content/browser/test_autofill_manager_injector.h" -#include "components/autofill/content/browser/test_content_autofill_client.h" -#include "components/autofill/content/browser/test_content_autofill_driver.h" -#include "components/autofill/core/browser/data_manager/payments/test_payments_data_manager.h" #include "components/autofill/core/browser/field_types.h" -#include "components/autofill/core/browser/foundations/test_browser_autofill_manager.h" #include "components/autofill/core/browser/integrators/actor/actor_form_filling_types.h" -#include "components/autofill/core/browser/payments/credit_card_access_manager.h" #include "components/autofill/core/browser/payments/credit_card_access_manager_test_api.h" -#include "components/autofill/core/browser/payments/payments_autofill_client.h" #include "components/autofill/core/browser/test_utils/autofill_form_test_utils.h" #include "components/autofill/core/browser/test_utils/autofill_test_utils.h" #include "components/autofill/core/common/autofill_test_utils.h" #include "components/autofill/core/common/mojom/autofill_types.mojom-shared.h" -#include "components/tabs/public/mock_tab_interface.h" #include "content/public/browser/web_contents.h" #include "content/public/test/browser_task_environment.h" #include "content/public/test/test_web_contents_factory.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/abseil-cpp/absl/container/flat_hash_map.h" #include "third_party/skia/include/core/SkBitmap.h" #include "ui/gfx/image/image.h" #include "ui/gfx/image/image_unittest_util.h" @@ -161,217 +150,25 @@ location); } -class RecordingTestContentAutofillDriver : public TestContentAutofillDriver { +class ActorFormFillingServiceTest : public ActorTestBase { public: - using TestContentAutofillDriver::TestContentAutofillDriver; - ~RecordingTestContentAutofillDriver() override = default; - - MOCK_METHOD(void, RendererShouldClearPreviewedForm, (), (override)); - MOCK_METHOD(void, ScrollFieldIntoView, (FieldGlobalId), (override)); - - MOCK_METHOD( - base::flat_set<FieldGlobalId>, - ApplyFormAction, - (mojom::FormActionType action_type, - mojom::ActionPersistence action_persistence, - base::span<const FormFieldData> fields, - const FillId& fill_id, - bool supports_refill, - const url::Origin& triggered_origin, - (const absl::flat_hash_map<FieldGlobalId, FieldType>& field_type_map), - const Section& section_for_clear_form_on_ios), - (override)); - - base::flat_set<FieldGlobalId> BaseApplyFormAction( - mojom::FormActionType action_type, - mojom::ActionPersistence action_persistence, - base::span<const FormFieldData> fields, - const FillId& fill_id, - bool supports_refill, - const url::Origin& triggered_origin, - const absl::flat_hash_map<FieldGlobalId, FieldType>& field_type_map, - const Section& section_for_clear_form_on_ios) { - return TestContentAutofillDriver::ApplyFormAction( - action_type, action_persistence, fields, fill_id, supports_refill, - triggered_origin, field_type_map, section_for_clear_form_on_ios); - } -}; - -// A simple `CreditCardAccessManager` test class that allows intercepting the -// `FetchCreditCard` request. -class TestCreditCardAccessManager : public CreditCardAccessManager { - public: - explicit TestCreditCardAccessManager(BrowserAutofillManager* manager) - : CreditCardAccessManager(manager) {} - ~TestCreditCardAccessManager() override = default; - - void PrepareToFetchCreditCard() override {} - - void FetchCreditCard(const CreditCard*, - OnCreditCardFetchedCallback callback) override { - callback_ = std::move(callback); - } - - [[nodiscard]] bool RunCreditCardFetchedCallback(const CreditCard& card) { - if (!callback_) { - return false; - } - std::move(callback_).Run(card); - return true; - } - - private: - OnCreditCardFetchedCallback callback_; -}; - -// A `TestBrowserAutofillManager` with a custom `CreditCardAccessManager`. -class TestBrowserAutofillManagerWithTestCCAM - : public TestBrowserAutofillManager { - public: - explicit TestBrowserAutofillManagerWithTestCCAM(AutofillDriver* driver) - : TestBrowserAutofillManager(driver) { - test_api(*this).set_credit_card_access_manager( - std::make_unique<TestCreditCardAccessManager>(this)); - } - ~TestBrowserAutofillManagerWithTestCCAM() override = default; - - void Reset() override { - TestBrowserAutofillManager::Reset(); - test_api(*this).set_credit_card_access_manager( - std::make_unique<TestCreditCardAccessManager>(this)); - } - - void FillOrPreviewForm(mojom::ActionPersistence action_persistence, - const FormData& form, - const FieldGlobalId& field_id, - const FillingPayload& filling_payload, - AutofillTriggerSource trigger_source) override { - last_trigger_field_id_ = field_id; - TestBrowserAutofillManager::FillOrPreviewForm( - action_persistence, form, field_id, filling_payload, trigger_source); - } - - void FillOrPreviewFields( - mojom::ActionPersistence action_persistence, - const FormData& form, - const FieldGlobalId& field_id, - const FillingPayload& filling_payload, - AutofillTriggerSource trigger_source, - const base::flat_set<FieldGlobalId>& blocked_fields) override { - last_trigger_field_id_ = field_id; - TestBrowserAutofillManager::FillOrPreviewFields( - action_persistence, form, field_id, filling_payload, trigger_source, - blocked_fields); - } - - FieldGlobalId last_trigger_field_id() { return last_trigger_field_id_; } - - private: - FieldGlobalId last_trigger_field_id_; -}; - -class TestActorChromeAutofillClient : public TestContentAutofillClient { - public: - explicit TestActorChromeAutofillClient(content::WebContents* web_contents) - : TestContentAutofillClient(web_contents) { - recorder_ = std::make_unique<ActorKeyMetricsRecorder>(this); - } - - std::unique_ptr<AutofillManager> CreateManager( - base::PassKey<ContentAutofillDriver> pass_key, - ContentAutofillDriver& driver) override { - return std::make_unique<TestBrowserAutofillManagerWithTestCCAM>(&driver); - } - - ActorKeyMetricsRecorder* GetActorKeyMetricsRecorder() override { - return recorder_.get(); - } - - private: - std::unique_ptr<ActorKeyMetricsRecorder> recorder_; -}; - -class ActorFormFillingServiceTest : public ChromeRenderViewHostTestHarness { - public: - ActorFormFillingServiceTest() - : ChromeRenderViewHostTestHarness( - base::test::TaskEnvironment::TimeSource::MOCK_TIME) {} - void SetUp() override { - ChromeRenderViewHostTestHarness::SetUp(); - ON_CALL(mock_tab, GetContents()).WillByDefault(Return(web_contents())); + ActorTestBase::SetUp(); // Enable AutofillWalletImport so that custom credit card art is available. client() .GetPersonalDataManager() .test_payments_data_manager() .SetAutofillWalletImportEnabled(true); - NavigateAndCommit(GURL("about:blank")); client().GetPersonalDataManager().address_data_manager().AddProfile( GetProfile1()); client().GetPersonalDataManager().address_data_manager().AddProfile( GetProfile2()); - - ON_CALL(driver(), ApplyFormAction) - .WillByDefault([&](mojom::FormActionType action_type, - mojom::ActionPersistence action_persistence, - base::span<const FormFieldData> fields, - const FillId& fill_id, bool supports_refill, - const url::Origin& triggered_origin, - const absl::flat_hash_map<FieldGlobalId, FieldType>& - field_type_map, - const Section& section_for_clear_form_on_ios) { - base::flat_set<FieldGlobalId> filled_fields = - driver().BaseApplyFormAction(action_type, action_persistence, - fields, fill_id, supports_refill, - triggered_origin, field_type_map, - section_for_clear_form_on_ios); - for (const FormFieldData& field : fields) { - if (filled_fields.contains(field.global_id())) { - last_filled_values_[field.global_id()] = field.value(); - } - } - return filled_fields; - }); - } - - FormData SeeForm(test::FormDescription form_description) { - FormData form = test::GetFormData(form_description); - manager().AddSeenForm(form, test::GetHeuristicTypes(form_description), - test::GetServerTypes(form_description)); - return form; - } - - // Returns the values that this driver would have sent to the renderer for - // filling. - const absl::flat_hash_map<FieldGlobalId, std::u16string>& last_filled_values() - const { - return last_filled_values_; } protected: - TestActorChromeAutofillClient& client() { - return *static_cast<TestActorChromeAutofillClient*>( - autofill_client_injector_[web_contents()]); - } - TestCreditCardAccessManager& credit_card_access_manager() { - return CHECK_DEREF(static_cast<TestCreditCardAccessManager*>( - manager().GetCreditCardAccessManager())); - } payments::TestPaymentsAutofillClient& payments_client() { - return CHECK_DEREF(client().GetPaymentsAutofillClient()); + return *client().GetPaymentsAutofillClient(); } - PaymentsDataManager& payments_data_manager() { - return client().GetPersonalDataManager().payments_data_manager(); - } - RecordingTestContentAutofillDriver& driver() { - return CHECK_DEREF(autofill_driver_injector_[web_contents()]); - } - TestBrowserAutofillManagerWithTestCCAM& manager() { - return static_cast<TestBrowserAutofillManagerWithTestCCAM&>( - driver().GetAutofillManager()); - } - ActorFormFillingServiceImpl& service() { return service_; } - tabs::TabInterface& tab() { return mock_tab; } // Returns an address that is available in `AddressDataManager`. AutofillProfile GetProfile1() { return test::GetFullProfile(); } @@ -379,16 +176,6 @@ protected: base::test::ScopedFeatureList feature_list_; - - private: - test::AutofillUnitTestEnvironment autofill_test_environment_; - tabs::MockTabInterface mock_tab; - TestAutofillClientInjector<TestActorChromeAutofillClient> - autofill_client_injector_; - TestAutofillDriverInjector<RecordingTestContentAutofillDriver> - autofill_driver_injector_; - ActorFormFillingServiceImpl service_; - absl::flat_hash_map<FieldGlobalId, std::u16string> last_filled_values_; }; // Tests that a `kNoSuggestions` error is returned if we cannot find the form @@ -1153,727 +940,6 @@ service().ScrollToForm(tab(), /*form_index=*/1); } -// Tests that FillingAssistance metrics are correctly recorded when the actor -// fills an address form. -TEST_F(ActorFormFillingServiceTest, FillingAssistanceMetrics_AddressFilled) { - base::HistogramTester histogram_tester; - FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, - {.server_type = ADDRESS_HOME_LINE1}, - {.server_type = ADDRESS_HOME_CITY}}}); - - GetSuggestionsFuture future; - service().GetSuggestions(tab(), - {AddressFillRequest({form.fields()[0].global_id()})}, - future.GetCallback()); - std::vector<ActorFormFillingRequest> requests = future.Take().value(); - - service().FillForm(tab(), /*form_index=*/0, - ActorFormFillingSelection(requests[0].suggestions[0].id)); - - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - histogram_tester.ExpectUniqueSample( - "Autofill.Actor.KeyMetrics.FillingAssistance.Address", true, 1); -} - -// Tests that FillingAssistance metrics are correctly recorded as false when the -// actor does not fill an address form that the user was capable of filling. -TEST_F(ActorFormFillingServiceTest, FillingAssistanceMetrics_AddressNotFilled) { - base::HistogramTester histogram_tester; - FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, - {.server_type = ADDRESS_HOME_LINE1}, - {.server_type = ADDRESS_HOME_CITY}}}); - - // Trigger suggestions to ensure the manager is observed. - GetSuggestionsFuture future; - service().GetSuggestions(tab(), - {AddressFillRequest({form.fields()[0].global_id()})}, - future.GetCallback()); - EXPECT_THAT(future.Get(), HasValue()); - - // Do NOT fill. - - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - histogram_tester.ExpectUniqueSample( - "Autofill.Actor.KeyMetrics.FillingAssistance.Address", false, 1); -} - -// Tests that FillingAssistance metrics are correctly recorded when the actor -// fills a credit card form. -TEST_F(ActorFormFillingServiceTest, FillingAssistanceMetrics_CreditCardFilled) { - base::HistogramTester histogram_tester; - const CreditCard card = test::GetCreditCard(); - payments_data_manager().AddCreditCard(card); - FormData form = - SeeForm({.fields = {{.server_type = CREDIT_CARD_NAME_FULL}, - {.server_type = CREDIT_CARD_NUMBER}, - {.server_type = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR}}}); - - GetSuggestionsFuture future; - service().GetSuggestions( - tab(), {CreditCardFillRequest({form.fields()[0].global_id()})}, - future.GetCallback()); - std::vector<ActorFormFillingRequest> requests = future.Take().value(); - - service().FillForm(tab(), /*form_index=*/0, - ActorFormFillingSelection(requests[0].suggestions[0].id)); - ASSERT_TRUE(credit_card_access_manager().RunCreditCardFetchedCallback(card)); - - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - histogram_tester.ExpectUniqueSample( - "Autofill.Actor.KeyMetrics.FillingAssistance.CreditCard", true, 1); -} - -// Tests that FillingCorrectness metrics are correctly recorded as true when all -// fields filled by the actor are submitted unchanged. -TEST_F(ActorFormFillingServiceTest, FillingCorrectnessMetrics_AddressCorrect) { - base::HistogramTester histogram_tester; - FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, - {.server_type = ADDRESS_HOME_LINE1}}}); - - GetSuggestionsFuture future; - service().GetSuggestions(tab(), - {AddressFillRequest({form.fields()[0].global_id()})}, - future.GetCallback()); - std::vector<ActorFormFillingRequest> requests = future.Take().value(); - - service().FillForm(tab(), /*form_index=*/0, - ActorFormFillingSelection(requests[0].suggestions[0].id)); - - // Simulate all fields being submitted as autofilled (unchanged). - std::vector<FormFieldData> fields = form.ExtractFields(); - for (auto& field : fields) { - field.set_is_autofilled_according_to_renderer(true); - } - form.set_fields(std::move(fields)); - - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - histogram_tester.ExpectUniqueSample( - "Autofill.Actor.KeyMetrics.FillingCorrectness.Address", true, 1); -} - -// Tests that FillingCorrectness metrics are correctly recorded as false when at -// least one field filled by the actor is modified by the user. -TEST_F(ActorFormFillingServiceTest, - FillingCorrectnessMetrics_AddressIncorrect) { - base::HistogramTester histogram_tester; - FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, - {.server_type = ADDRESS_HOME_LINE1}}}); - - GetSuggestionsFuture future; - service().GetSuggestions(tab(), - {AddressFillRequest({form.fields()[0].global_id()})}, - future.GetCallback()); - std::vector<ActorFormFillingRequest> requests = future.Take().value(); - - service().FillForm(tab(), /*form_index=*/0, - ActorFormFillingSelection(requests[0].suggestions[0].id)); - - // Simulate one field being modified. - std::vector<FormFieldData> fields = form.ExtractFields(); - fields[0].set_is_autofilled_according_to_renderer(false); - fields[1].set_is_autofilled_according_to_renderer(true); - form.set_fields(std::move(fields)); - - manager().OnTextFieldValueChanged(form, form.fields()[0].global_id(), - base::TimeTicks::Now()); - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - histogram_tester.ExpectUniqueSample( - "Autofill.Actor.KeyMetrics.FillingCorrectness.Address", false, 1); -} - -// Tests that FillingCorrectness metrics are correctly recorded for credit cards -// if all fields are submitted unchanged. -TEST_F(ActorFormFillingServiceTest, - FillingCorrectnessMetrics_CreditCardCorrect) { - base::HistogramTester histogram_tester; - const CreditCard card = test::GetCreditCard(); - payments_data_manager().AddCreditCard(card); - FormData form = SeeForm({.fields = {{.server_type = CREDIT_CARD_NAME_FULL}, - {.server_type = CREDIT_CARD_NUMBER}}}); - - GetSuggestionsFuture future; - service().GetSuggestions( - tab(), {CreditCardFillRequest({form.fields()[0].global_id()})}, - future.GetCallback()); - std::vector<ActorFormFillingRequest> requests = future.Take().value(); - - service().FillForm(tab(), /*form_index=*/0, - ActorFormFillingSelection(requests[0].suggestions[0].id)); - ASSERT_TRUE(credit_card_access_manager().RunCreditCardFetchedCallback(card)); - - // Simulate all fields being submitted as autofilled. - std::vector<FormFieldData> fields = form.ExtractFields(); - for (auto& field : fields) { - field.set_is_autofilled_according_to_renderer(true); - } - form.set_fields(std::move(fields)); - - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - histogram_tester.ExpectUniqueSample( - "Autofill.Actor.KeyMetrics.FillingCorrectness.CreditCard", true, 1); -} - -// Tests that FillingCorrectness metrics are correctly recorded for credit cards -// if one field is modified by the user. -TEST_F(ActorFormFillingServiceTest, - FillingCorrectnessMetrics_CreditCardIncorrect) { - base::HistogramTester histogram_tester; - const CreditCard card = test::GetCreditCard(); - payments_data_manager().AddCreditCard(card); - FormData form = SeeForm({.fields = {{.server_type = CREDIT_CARD_NAME_FULL}, - {.server_type = CREDIT_CARD_NUMBER}}}); - - GetSuggestionsFuture future; - service().GetSuggestions( - tab(), {CreditCardFillRequest({form.fields()[0].global_id()})}, - future.GetCallback()); - std::vector<ActorFormFillingRequest> requests = future.Take().value(); - - service().FillForm(tab(), /*form_index=*/0, - ActorFormFillingSelection(requests[0].suggestions[0].id)); - ASSERT_TRUE(credit_card_access_manager().RunCreditCardFetchedCallback(card)); - - // Simulate one field being modified. - std::vector<FormFieldData> fields = form.ExtractFields(); - fields[1].set_is_autofilled_according_to_renderer(false); - form.set_fields(std::move(fields)); - - manager().OnTextFieldValueChanged(form, form.fields()[1].global_id(), - base::TimeTicks::Now()); - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - histogram_tester.ExpectUniqueSample( - "Autofill.Actor.KeyMetrics.FillingCorrectness.CreditCard", false, 1); -} - -// Tests that FillingCorrectness metrics are correctly recorded for both -// products in a mixed form. -TEST_F(ActorFormFillingServiceTest, FillingCorrectnessMetrics_MixedForm) { - base::HistogramTester histogram_tester; - const CreditCard card = test::GetCreditCard(); - payments_data_manager().AddCreditCard(card); - - FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, - {.server_type = ADDRESS_HOME_LINE1}, - {.server_type = CREDIT_CARD_NAME_FULL}, - {.server_type = CREDIT_CARD_NUMBER}}}); - - // Fill address. - GetSuggestionsFuture addr_future; - service().GetSuggestions(tab(), - {AddressFillRequest({form.fields()[0].global_id()})}, - addr_future.GetCallback()); - std::vector<ActorFormFillingRequest> addr_requests = - addr_future.Take().value(); - service().FillForm( - tab(), /*form_index=*/0, - ActorFormFillingSelection(addr_requests[0].suggestions[0].id)); - - // Fill credit card. - GetSuggestionsFuture cc_future; - service().GetSuggestions( - tab(), {CreditCardFillRequest({form.fields()[2].global_id()})}, - cc_future.GetCallback()); - std::vector<ActorFormFillingRequest> cc_requests = cc_future.Take().value(); - service().FillForm( - tab(), /*form_index=*/0, - ActorFormFillingSelection(cc_requests[0].suggestions[0].id)); - ASSERT_TRUE(credit_card_access_manager().RunCreditCardFetchedCallback(card)); - - // Simulate address being modified, but CC remains unchanged. - std::vector<FormFieldData> fields = form.ExtractFields(); - fields[0].set_is_autofilled_according_to_renderer(false); - fields[1].set_is_autofilled_according_to_renderer(true); - fields[2].set_is_autofilled_according_to_renderer(true); - fields[3].set_is_autofilled_according_to_renderer(true); - form.set_fields(std::move(fields)); - - manager().OnTextFieldValueChanged(form, form.fields()[0].global_id(), - base::TimeTicks::Now()); - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - - histogram_tester.ExpectUniqueSample( - "Autofill.Actor.KeyMetrics.FillingCorrectness.Address", false, 1); - histogram_tester.ExpectUniqueSample( - "Autofill.Actor.KeyMetrics.FillingCorrectness.CreditCard", true, 1); -} - -// Tests that FillingCorrectness metrics are correctly recorded as true when the -// actor only filled some fields, and the user manually filled the rest (but did -// not modify the actor-filled ones). -TEST_F(ActorFormFillingServiceTest, FillingCorrectnessMetrics_PartialFilling) { - base::HistogramTester histogram_tester; - FormData form = SeeForm( - {.fields = {{.server_type = NAME_FULL}, {.server_type = UNKNOWN_TYPE}}}); - - GetSuggestionsFuture future; - service().GetSuggestions(tab(), - {AddressFillRequest({form.fields()[0].global_id()})}, - future.GetCallback()); - std::vector<ActorFormFillingRequest> requests = future.Take().value(); - - service().FillForm(tab(), /*form_index=*/0, - ActorFormFillingSelection(requests[0].suggestions[0].id)); - - // Verify that only the NAME_FULL field was filled by the actor. - EXPECT_THAT(last_filled_values(), - AllOf(Contains(Pair(form.fields()[0].global_id(), _)), - Not(Contains(Pair(form.fields()[1].global_id(), _))))); - - // Simulate submission: - // - Field 0 (NAME_FULL): Filled by actor, unchanged (is_autofilled = true). - // - Field 1 (UNKNOWN_TYPE): Filled by user manually (is_autofilled = false). - std::vector<FormFieldData> fields = form.ExtractFields(); - fields[0].set_is_autofilled_according_to_renderer(true); - fields[1].set_is_autofilled_according_to_renderer(false); - fields[1].set_value(u"User Content"); - form.set_fields(std::move(fields)); - - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - - // Should be recorded as Correct (true) because the actor-filled field was not - // modified. - histogram_tester.ExpectUniqueSample( - "Autofill.Actor.KeyMetrics.FillingCorrectness.Address", true, 1); -} - -// Tests that the state for recorded forms is cleared when the forms are -// removed (e.g. on navigation). -TEST_F(ActorFormFillingServiceTest, - FillingAssistanceMetrics_StateClearedOnNavigation) { - base::HistogramTester histogram_tester; - // Use stable IDs so that the form has the same GlobalId when re-added. - test::FormDescription form_desc = { - .fields = {{.role = NAME_FULL, .renderer_id = FieldRendererId(1)}, - {.role = ADDRESS_HOME_LINE1, - .renderer_id = FieldRendererId(2)}}, - .host_frame = driver().GetFrameToken(), - .renderer_id = FormRendererId(1)}; - FormData form = SeeForm(form_desc); - - GetSuggestionsFuture future; - service().GetSuggestions(tab(), - {AddressFillRequest({form.fields()[0].global_id()})}, - future.GetCallback()); - std::vector<ActorFormFillingRequest> requests = future.Take().value(); - - service().FillForm(tab(), /*form_index=*/0, - ActorFormFillingSelection(requests[0].suggestions[0].id)); - - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - histogram_tester.ExpectUniqueSample( - "Autofill.Actor.KeyMetrics.FillingAssistance.Address", true, 1); - - // Now "navigate" away, which removes forms. - manager().OnFormsSeen(/*updated_forms=*/{}, - /*removed_forms=*/{form.global_id()}); - - // Re-add the same form (simulating coming back to the page). - FormData form2 = SeeForm(form_desc); - ASSERT_EQ(form.global_id(), form2.global_id()); - - // Record at submission. Should record false now because it's a new session - // and it wasn't filled by actor in this session. - manager().OnFormSubmitted(form2, mojom::SubmissionSource::FORM_SUBMISSION); - histogram_tester.ExpectBucketCount( - "Autofill.Actor.KeyMetrics.FillingAssistance.Address", false, 1); - histogram_tester.ExpectTotalCount( - "Autofill.Actor.KeyMetrics.FillingAssistance.Address", 2); -} - -// Tests that FillingReadiness metrics are correctly recorded when actor -// suggestions are available. -TEST_F(ActorFormFillingServiceTest, - FillingReadinessMetrics_SuggestionsAvailable) { - base::HistogramTester histogram_tester; - FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, - {.server_type = ADDRESS_HOME_LINE1}, - {.server_type = ADDRESS_HOME_CITY}}}); - - GetSuggestionsFuture future; - service().GetSuggestions(tab(), - {AddressFillRequest({form.fields()[0].global_id()})}, - future.GetCallback()); - EXPECT_THAT(future.Get(), HasValue()); - - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - histogram_tester.ExpectUniqueSample( - "Autofill.Actor.KeyMetrics.FillingReadiness.Address", true, 1); -} - -// Tests that FillingReadiness metrics are correctly recorded when actor -// suggestions are NOT available. -TEST_F(ActorFormFillingServiceTest, - FillingReadinessMetrics_SuggestionsNotAvailable) { - base::HistogramTester histogram_tester; - // Use a form type that won't have suggestions (e.g. by using an unfindable - // request or similar, but SeeForm needs to be called to cache it). - FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}}}); - - GetSuggestionsFuture future; - // Trigger on a field that doesn't exist in any form to fail suggestion - // generation. - service().GetSuggestions(tab(), {UnfindableFillRequest()}, - future.GetCallback()); - EXPECT_THAT(future.Get(), ErrorIs(ActorFormFillingError::kNoSuggestions)); - - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - histogram_tester.ExpectUniqueSample( - "Autofill.Actor.KeyMetrics.FillingReadiness.Address", false, 1); -} - -// Tests that FillingReadiness metrics are correctly recorded for credit cards. -TEST_F(ActorFormFillingServiceTest, FillingReadinessMetrics_CreditCard) { - base::HistogramTester histogram_tester; - const CreditCard card = test::GetCreditCard(); - payments_data_manager().AddCreditCard(card); - FormData form = - SeeForm({.fields = {{.server_type = CREDIT_CARD_NAME_FULL}, - {.server_type = CREDIT_CARD_NUMBER}, - {.server_type = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR}}}); - - GetSuggestionsFuture future; - service().GetSuggestions( - tab(), {CreditCardFillRequest({form.fields()[0].global_id()})}, - future.GetCallback()); - EXPECT_THAT(future.Get(), HasValue()); - - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - histogram_tester.ExpectUniqueSample( - "Autofill.Actor.KeyMetrics.FillingReadiness.CreditCard", true, 1); -} - -// Tests that PerfectFilling metrics are correctly recorded as true when all -// fields filled by the actor are submitted unchanged. -TEST_F(ActorFormFillingServiceTest, PerfectFilling_Address_Perfect) { - base::HistogramTester histogram_tester; - FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, - {.server_type = ADDRESS_HOME_LINE1}}}); - - GetSuggestionsFuture future; - service().GetSuggestions(tab(), - {AddressFillRequest({form.fields()[0].global_id()})}, - future.GetCallback()); - std::vector<ActorFormFillingRequest> requests = future.Take().value(); - - service().FillForm(tab(), /*form_index=*/0, - ActorFormFillingSelection(requests[0].suggestions[0].id)); - - // Simulate perfect filling (no user edits). - std::vector<FormFieldData> fields = form.ExtractFields(); - fields[0].set_is_autofilled_according_to_renderer(true); - fields[1].set_is_autofilled_according_to_renderer(true); - form.set_fields(std::move(fields)); - - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - - histogram_tester.ExpectUniqueSample("Autofill.Actor.PerfectFilling.Address", - true, 1); -} - -// Tests that PerfectFilling metrics are correctly recorded as false when at -// least one field filled by the actor is modified by the user. -TEST_F(ActorFormFillingServiceTest, PerfectFilling_Address_Imperfect) { - base::HistogramTester histogram_tester; - FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, - {.server_type = ADDRESS_HOME_LINE1}}}); - - GetSuggestionsFuture future; - service().GetSuggestions(tab(), - {AddressFillRequest({form.fields()[0].global_id()})}, - future.GetCallback()); - std::vector<ActorFormFillingRequest> requests = future.Take().value(); - - service().FillForm(tab(), /*form_index=*/0, - ActorFormFillingSelection(requests[0].suggestions[0].id)); - - // Simulate imperfect filling (user edit). - manager().OnTextFieldValueChanged(form, form.fields()[0].global_id(), - base::TimeTicks::Now()); - - // Simulate submission. - std::vector<FormFieldData> fields = form.ExtractFields(); - fields[0].set_is_autofilled_according_to_renderer(false); - fields[1].set_is_autofilled_according_to_renderer(true); - form.set_fields(std::move(fields)); - - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - - histogram_tester.ExpectUniqueSample("Autofill.Actor.PerfectFilling.Address", - false, 1); -} - -// Tests that PerfectFilling metrics are correctly recorded for credit cards -// if all fields are submitted unchanged. -TEST_F(ActorFormFillingServiceTest, PerfectFilling_CreditCard_Perfect) { - base::HistogramTester histogram_tester; - const CreditCard card = test::GetCreditCard(); - payments_data_manager().AddCreditCard(card); - FormData form = SeeForm({.fields = {{.server_type = CREDIT_CARD_NAME_FULL}, - {.server_type = CREDIT_CARD_NUMBER}}}); - - GetSuggestionsFuture future; - service().GetSuggestions( - tab(), {CreditCardFillRequest({form.fields()[0].global_id()})}, - future.GetCallback()); - std::vector<ActorFormFillingRequest> requests = future.Take().value(); - - service().FillForm(tab(), /*form_index=*/0, - ActorFormFillingSelection(requests[0].suggestions[0].id)); - ASSERT_TRUE(credit_card_access_manager().RunCreditCardFetchedCallback(card)); - - // Simulate perfect filling. - std::vector<FormFieldData> fields = form.ExtractFields(); - fields[0].set_is_autofilled_according_to_renderer(true); - fields[1].set_is_autofilled_according_to_renderer(true); - form.set_fields(std::move(fields)); - - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - - histogram_tester.ExpectUniqueSample( - "Autofill.Actor.PerfectFilling.CreditCard", true, 1); -} - -// Tests that PerfectFilling metrics are correctly recorded for credit cards -// if one field is modified by the user. -TEST_F(ActorFormFillingServiceTest, PerfectFilling_CreditCard_Imperfect) { - base::HistogramTester histogram_tester; - const CreditCard card = test::GetCreditCard(); - payments_data_manager().AddCreditCard(card); - FormData form = SeeForm({.fields = {{.server_type = CREDIT_CARD_NAME_FULL}, - {.server_type = CREDIT_CARD_NUMBER}}}); - - GetSuggestionsFuture future; - service().GetSuggestions( - tab(), {CreditCardFillRequest({form.fields()[0].global_id()})}, - future.GetCallback()); - std::vector<ActorFormFillingRequest> requests = future.Take().value(); - - service().FillForm(tab(), /*form_index=*/0, - ActorFormFillingSelection(requests[0].suggestions[0].id)); - ASSERT_TRUE(credit_card_access_manager().RunCreditCardFetchedCallback(card)); - - // Simulate imperfect filling. - manager().OnTextFieldValueChanged(form, form.fields()[1].global_id(), - base::TimeTicks::Now()); - - std::vector<FormFieldData> fields = form.ExtractFields(); - fields[1].set_is_autofilled_according_to_renderer(false); - form.set_fields(std::move(fields)); - - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - - histogram_tester.ExpectUniqueSample( - "Autofill.Actor.PerfectFilling.CreditCard", false, 1); -} - -// Tests that PerfectFilling metrics are correctly recorded for both products -// in a mixed form if all fields are submitted unchanged. -TEST_F(ActorFormFillingServiceTest, PerfectFilling_MixedForm_Perfect) { - base::HistogramTester histogram_tester; - const CreditCard card = test::GetCreditCard(); - payments_data_manager().AddCreditCard(card); - FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, - {.server_type = CREDIT_CARD_NUMBER}}}); - - // Fill address. - GetSuggestionsFuture addr_future; - service().GetSuggestions(tab(), - {AddressFillRequest({form.fields()[0].global_id()})}, - addr_future.GetCallback()); - std::vector<ActorFormFillingRequest> addr_requests = - addr_future.Take().value(); - service().FillForm( - tab(), /*form_index=*/0, - ActorFormFillingSelection(addr_requests[0].suggestions[0].id)); - - // Fill credit card. - GetSuggestionsFuture cc_future; - service().GetSuggestions( - tab(), {CreditCardFillRequest({form.fields()[1].global_id()})}, - cc_future.GetCallback()); - std::vector<ActorFormFillingRequest> cc_requests = cc_future.Take().value(); - service().FillForm( - tab(), /*form_index=*/0, - ActorFormFillingSelection(cc_requests[0].suggestions[0].id)); - ASSERT_TRUE(credit_card_access_manager().RunCreditCardFetchedCallback(card)); - - // Perfect filling. - std::vector<FormFieldData> fields = form.ExtractFields(); - fields[0].set_is_autofilled_according_to_renderer(true); - fields[1].set_is_autofilled_according_to_renderer(true); - form.set_fields(std::move(fields)); - - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - - histogram_tester.ExpectUniqueSample("Autofill.Actor.PerfectFilling.Address", - true, 1); - histogram_tester.ExpectUniqueSample( - "Autofill.Actor.PerfectFilling.CreditCard", true, 1); -} - -// Tests that PerfectFilling metrics are correctly recorded as false for both -// products in a mixed form, if one field is modified by the user. -TEST_F(ActorFormFillingServiceTest, PerfectFilling_MixedForm_Imperfect) { - base::HistogramTester histogram_tester; - const CreditCard card = test::GetCreditCard(); - payments_data_manager().AddCreditCard(card); - FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, - {.server_type = CREDIT_CARD_NUMBER}}}); - - // Fill address. - GetSuggestionsFuture addr_future; - service().GetSuggestions(tab(), - {AddressFillRequest({form.fields()[0].global_id()})}, - addr_future.GetCallback()); - std::vector<ActorFormFillingRequest> addr_requests = - addr_future.Take().value(); - service().FillForm( - tab(), /*form_index=*/0, - ActorFormFillingSelection(addr_requests[0].suggestions[0].id)); - - // Fill credit card. - GetSuggestionsFuture cc_future; - service().GetSuggestions( - tab(), {CreditCardFillRequest({form.fields()[1].global_id()})}, - cc_future.GetCallback()); - std::vector<ActorFormFillingRequest> cc_requests = cc_future.Take().value(); - service().FillForm( - tab(), /*form_index=*/0, - ActorFormFillingSelection(cc_requests[0].suggestions[0].id)); - ASSERT_TRUE(credit_card_access_manager().RunCreditCardFetchedCallback(card)); - - // Imperfect filling (address field edited). - manager().OnTextFieldValueChanged(form, form.fields()[0].global_id(), - base::TimeTicks::Now()); - - std::vector<FormFieldData> fields = form.ExtractFields(); - fields[0].set_is_autofilled_according_to_renderer(false); - fields[1].set_is_autofilled_according_to_renderer(true); - form.set_fields(std::move(fields)); - - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - - // Both should be false because the form as a whole is imperfect. - histogram_tester.ExpectUniqueSample("Autofill.Actor.PerfectFilling.Address", - false, 1); - histogram_tester.ExpectUniqueSample( - "Autofill.Actor.PerfectFilling.CreditCard", false, 1); -} - -// Tests that PerfectFilling metrics are correctly recorded as false when the -// actor did not fill all fields and the user manually filled the remaining one. -TEST_F(ActorFormFillingServiceTest, - PerfectFilling_Address_PartialFilling_ManualFallback) { - base::HistogramTester histogram_tester; - FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, - {.server_type = ADDRESS_HOME_LINE1}, - {.server_type = ADDRESS_HOME_CITY}, - {.server_type = UNKNOWN_TYPE}}}); - - GetSuggestionsFuture future; - service().GetSuggestions(tab(), - {AddressFillRequest({form.fields()[0].global_id()})}, - future.GetCallback()); - std::vector<ActorFormFillingRequest> requests = future.Take().value(); - - service().FillForm(tab(), /*form_index=*/0, - ActorFormFillingSelection(requests[0].suggestions[0].id)); - - // Simulate submission. - std::vector<FormFieldData> fields = form.ExtractFields(); - // First 3 filled by actor (unchanged). - fields[0].set_is_autofilled_according_to_renderer(true); - fields[1].set_is_autofilled_according_to_renderer(true); - fields[2].set_is_autofilled_according_to_renderer(true); - // 4th filled manually. - fields[3].set_is_autofilled_according_to_renderer(false); - fields[3].set_value(u"User Content"); - form.set_fields(std::move(fields)); - - manager().OnTextFieldValueChanged(form, form.fields()[3].global_id(), - base::TimeTicks::Now()); - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - - histogram_tester.ExpectUniqueSample("Autofill.Actor.PerfectFilling.Address", - false, 1); -} - -// Tests that PerfectFilling metrics are correctly recorded as false when the -// actor partially fills a form, and the user uses standard (non-actor) Autofill -// to complete the rest. -TEST_F(ActorFormFillingServiceTest, - PerfectFilling_PartialFilling_StandardAutofillFallback) { - base::HistogramTester histogram_tester; - FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, - {.server_type = CREDIT_CARD_NUMBER}}}); - - // Fill ONLY the address via Actor. - GetSuggestionsFuture addr_future; - service().GetSuggestions(tab(), - {AddressFillRequest({form.fields()[0].global_id()})}, - addr_future.GetCallback()); - std::vector<ActorFormFillingRequest> addr_requests = - addr_future.Take().value(); - service().FillForm( - tab(), /*form_index=*/0, - ActorFormFillingSelection(addr_requests[0].suggestions[0].id)); - - // Manually add the kAutofill modifier to the cached field to perfectly - // simulate standard Autofill stepping in where the Actor left off. - manager() - .FindCachedFormById(form.global_id()) - ->fields()[1] - ->AddFieldModifier(FieldModifier::kAutofill); - - std::vector<FormFieldData> fields = form.ExtractFields(); - fields[0].set_is_autofilled_according_to_renderer(true); - fields[1].set_is_autofilled_according_to_renderer(true); - form.set_fields(std::move(fields)); - - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - - // Should fail because the CC field has an autofill modifier, but wasn't - // filled by any Actor. - histogram_tester.ExpectUniqueSample("Autofill.Actor.PerfectFilling.Address", - false, 1); -} - -// Tests that PerfectFilling metrics are correctly recorded as true when the -// actor fills its relevant fields, and the remaining fields are left completely -// empty (or untouched by the user/autofill). -TEST_F(ActorFormFillingServiceTest, - PerfectFilling_Address_WithEmptyIgnoredFields) { - base::HistogramTester histogram_tester; - // Form has an extra unknown field that will just be left alone. - FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, - {.server_type = ADDRESS_HOME_LINE1}, - {.server_type = UNKNOWN_TYPE}}}); - - GetSuggestionsFuture future; - service().GetSuggestions(tab(), - {AddressFillRequest({form.fields()[0].global_id()})}, - future.GetCallback()); - std::vector<ActorFormFillingRequest> requests = future.Take().value(); - - service().FillForm(tab(), /*form_index=*/0, - ActorFormFillingSelection(requests[0].suggestions[0].id)); - - // Simulate submission. The actor fields are marked as autofilled. - // The UNKNOWN_TYPE field is completely untouched (empty modifiers). - std::vector<FormFieldData> fields = form.ExtractFields(); - fields[0].set_is_autofilled_according_to_renderer(true); - fields[1].set_is_autofilled_according_to_renderer(true); - fields[2].set_is_autofilled_according_to_renderer(false); // Left empty - form.set_fields(std::move(fields)); - - manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); - - // Should succeed because the untouched empty field does not penalize the - // metric. - histogram_tester.ExpectUniqueSample("Autofill.Actor.PerfectFilling.Address", - true, 1); -} - } // namespace } // namespace autofill
diff --git a/chrome/browser/autofill/actor/actor_key_metrics_recorder_unittest.cc b/chrome/browser/autofill/actor/actor_key_metrics_recorder_unittest.cc new file mode 100644 index 0000000..5aab4cc --- /dev/null +++ b/chrome/browser/autofill/actor/actor_key_metrics_recorder_unittest.cc
@@ -0,0 +1,910 @@ +// Copyright 2026 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/autofill/actor/actor_key_metrics_recorder.h" + +#include <vector> + +#include "base/check_deref.h" +#include "base/test/gmock_expected_support.h" +#include "base/test/metrics/histogram_tester.h" +#include "base/test/task_environment.h" +#include "base/test/test_future.h" +#include "base/types/expected.h" +#include "chrome/browser/autofill/actor/actor_form_filling_service.h" +#include "chrome/browser/autofill/actor/actor_form_filling_service_impl.h" +#include "chrome/browser/autofill/actor/actor_test_utils.h" +#include "components/autofill/core/browser/autofill_field.h" +#include "components/autofill/core/browser/field_types.h" +#include "components/autofill/core/browser/form_structure.h" +#include "components/autofill/core/browser/integrators/actor/actor_form_filling_types.h" +#include "components/autofill/core/browser/payments/credit_card_access_manager_test_api.h" +#include "components/autofill/core/browser/payments/test/mock_multiple_request_payments_network_interface.h" +#include "components/autofill/core/browser/test_utils/autofill_form_test_utils.h" +#include "components/autofill/core/browser/test_utils/autofill_test_utils.h" +#include "components/autofill/core/common/autofill_test_utils.h" +#include "components/autofill/core/common/mojom/autofill_types.mojom-shared.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace autofill { + +namespace { + +using ::base::test::ErrorIs; +using ::base::test::HasValue; +using ::testing::_; +using ::testing::AllOf; +using ::testing::Contains; +using ::testing::Not; +using ::testing::Pair; +using ::testing::Return; + +using GetSuggestionsFuture = + base::test::TestFuture<base::expected<std::vector<ActorFormFillingRequest>, + ActorFormFillingError>>; +using FillSuggestionsFuture = + base::test::TestFuture<base::expected<void, ActorFormFillingError>>; + +// Returns a fill-request with a non-sensical (because null) field id. +ActorFormFillingService::FillRequest UnfindableFillRequest() { + return {ActorFormFillingRequest::RequestedData::kAddress, {FieldGlobalId()}}; +} + +ActorFormFillingService::FillRequest AddressFillRequest( + std::vector<FieldGlobalId> field_ids) { + return {ActorFormFillingRequest::RequestedData::kAddress, + std::move(field_ids)}; +} + +ActorFormFillingService::FillRequest CreditCardFillRequest( + std::vector<FieldGlobalId> field_ids) { + return {ActorFormFillingRequest::RequestedData::kCreditCard, + std::move(field_ids)}; +} + +class ActorKeyMetricsRecorderTest : public ActorTestBase { + public: + void SetUp() override { + ActorTestBase::SetUp(); + client() + .GetPaymentsAutofillClient() + ->set_multiple_request_payments_network_interface( + std::make_unique< + payments::MockMultipleRequestPaymentsNetworkInterface>( + client().GetURLLoaderFactory(), + *client().GetIdentityManager())); + } +}; + +// Tests that FillingAssistance metrics are correctly recorded when the actor +// fills an address form. +TEST_F(ActorKeyMetricsRecorderTest, FillingAssistanceMetrics_AddressFilled) { + base::HistogramTester histogram_tester; + FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, + {.server_type = ADDRESS_HOME_LINE1}, + {.server_type = ADDRESS_HOME_CITY}}}); + + GetSuggestionsFuture future; + service().GetSuggestions(tab(), + {AddressFillRequest({form.fields()[0].global_id()})}, + future.GetCallback()); + std::vector<ActorFormFillingRequest> requests = future.Take().value(); + + service().FillForm(tab(), /*form_index=*/0, + ActorFormFillingSelection(requests[0].suggestions[0].id)); + FillSuggestionsFuture fill_future; + service().FillSuggestions( + tab(), {ActorFormFillingSelection(requests[0].suggestions[0].id)}, + fill_future.GetCallback()); + EXPECT_THAT(fill_future.Get(), HasValue()); + + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + histogram_tester.ExpectUniqueSample( + "Autofill.Actor.KeyMetrics.FillingAssistance.Address", true, 1); +} + +// Tests that FillingAssistance metrics are correctly recorded as false when the +// actor does not fill an address form that the user was capable of filling. +TEST_F(ActorKeyMetricsRecorderTest, FillingAssistanceMetrics_AddressNotFilled) { + base::HistogramTester histogram_tester; + FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, + {.server_type = ADDRESS_HOME_LINE1}, + {.server_type = ADDRESS_HOME_CITY}}}); + + // Trigger suggestions to ensure the manager is observed. + GetSuggestionsFuture future; + service().GetSuggestions(tab(), + {AddressFillRequest({form.fields()[0].global_id()})}, + future.GetCallback()); + EXPECT_THAT(future.Get(), HasValue()); + + // Do NOT fill. + + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + histogram_tester.ExpectUniqueSample( + "Autofill.Actor.KeyMetrics.FillingAssistance.Address", false, 1); +} + +// Tests that FillingAssistance metrics are correctly recorded when the actor +// fills a credit card form. +TEST_F(ActorKeyMetricsRecorderTest, FillingAssistanceMetrics_CreditCardFilled) { + base::HistogramTester histogram_tester; + const CreditCard card = test::GetCreditCard(); + payments_data_manager().AddCreditCard(card); + FormData form = + SeeForm({.fields = {{.server_type = CREDIT_CARD_NAME_FULL}, + {.server_type = CREDIT_CARD_NUMBER}, + {.server_type = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR}}}); + + GetSuggestionsFuture future; + service().GetSuggestions( + tab(), {CreditCardFillRequest({form.fields()[0].global_id()})}, + future.GetCallback()); + std::vector<ActorFormFillingRequest> requests = future.Take().value(); + + service().FillForm(tab(), /*form_index=*/0, + ActorFormFillingSelection(requests[0].suggestions[0].id)); + FillSuggestionsFuture fill_future; + service().FillSuggestions( + tab(), {ActorFormFillingSelection(requests[0].suggestions[0].id)}, + fill_future.GetCallback()); + ASSERT_TRUE(credit_card_access_manager().RunCreditCardFetchedCallback(card)); + EXPECT_THAT(fill_future.Get(), HasValue()); + + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + histogram_tester.ExpectUniqueSample( + "Autofill.Actor.KeyMetrics.FillingAssistance.CreditCard", true, 1); +} + +// Tests that FillingCorrectness metrics are correctly recorded as true when all +// fields filled by the actor are submitted unchanged. +TEST_F(ActorKeyMetricsRecorderTest, FillingCorrectnessMetrics_AddressCorrect) { + base::HistogramTester histogram_tester; + FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, + {.server_type = ADDRESS_HOME_LINE1}}}); + + GetSuggestionsFuture future; + service().GetSuggestions(tab(), + {AddressFillRequest({form.fields()[0].global_id()})}, + future.GetCallback()); + std::vector<ActorFormFillingRequest> requests = future.Take().value(); + + service().FillForm(tab(), /*form_index=*/0, + ActorFormFillingSelection(requests[0].suggestions[0].id)); + service().FillForm(tab(), /*form_index=*/0, + ActorFormFillingSelection(requests[0].suggestions[0].id)); + FillSuggestionsFuture fill_future; + service().FillSuggestions( + tab(), {ActorFormFillingSelection(requests[0].suggestions[0].id)}, + fill_future.GetCallback()); + EXPECT_THAT(fill_future.Get(), HasValue()); + + // Simulate all fields being submitted as autofilled (unchanged). + std::vector<FormFieldData> fields = form.ExtractFields(); + for (auto& field : fields) { + field.set_is_autofilled_according_to_renderer(true); + } + form.set_fields(std::move(fields)); + + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + histogram_tester.ExpectUniqueSample( + "Autofill.Actor.KeyMetrics.FillingCorrectness.Address", true, 1); +} + +// Tests that FillingCorrectness metrics are correctly recorded as false when at +// least one field filled by the actor is modified by the user. +TEST_F(ActorKeyMetricsRecorderTest, + FillingCorrectnessMetrics_AddressIncorrect) { + base::HistogramTester histogram_tester; + FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, + {.server_type = ADDRESS_HOME_LINE1}}}); + + GetSuggestionsFuture future; + service().GetSuggestions(tab(), + {AddressFillRequest({form.fields()[0].global_id()})}, + future.GetCallback()); + std::vector<ActorFormFillingRequest> requests = future.Take().value(); + + service().FillForm(tab(), /*form_index=*/0, + ActorFormFillingSelection(requests[0].suggestions[0].id)); + FillSuggestionsFuture fill_future; + service().FillSuggestions( + tab(), {ActorFormFillingSelection(requests[0].suggestions[0].id)}, + fill_future.GetCallback()); + EXPECT_THAT(fill_future.Get(), HasValue()); + + // Simulate one field being modified. + std::vector<FormFieldData> fields = form.ExtractFields(); + fields[0].set_is_autofilled_according_to_renderer(false); + fields[1].set_is_autofilled_according_to_renderer(true); + form.set_fields(std::move(fields)); + + manager().OnTextFieldValueChanged(form, form.fields()[0].global_id(), + base::TimeTicks::Now()); + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + histogram_tester.ExpectUniqueSample( + "Autofill.Actor.KeyMetrics.FillingCorrectness.Address", false, 1); +} + +// Tests that FillingCorrectness metrics are correctly recorded for credit cards +// if all fields are submitted unchanged. +TEST_F(ActorKeyMetricsRecorderTest, + FillingCorrectnessMetrics_CreditCardCorrect) { + base::HistogramTester histogram_tester; + const CreditCard card = test::GetCreditCard(); + payments_data_manager().AddCreditCard(card); + FormData form = SeeForm({.fields = {{.server_type = CREDIT_CARD_NAME_FULL}, + {.server_type = CREDIT_CARD_NUMBER}}}); + + GetSuggestionsFuture future; + service().GetSuggestions( + tab(), {CreditCardFillRequest({form.fields()[0].global_id()})}, + future.GetCallback()); + std::vector<ActorFormFillingRequest> requests = future.Take().value(); + + service().FillForm(tab(), /*form_index=*/0, + ActorFormFillingSelection(requests[0].suggestions[0].id)); + FillSuggestionsFuture fill_future; + service().FillSuggestions( + tab(), {ActorFormFillingSelection(requests[0].suggestions[0].id)}, + fill_future.GetCallback()); + ASSERT_TRUE(credit_card_access_manager().RunCreditCardFetchedCallback(card)); + EXPECT_THAT(fill_future.Get(), HasValue()); + + // Simulate all fields being submitted as autofilled. + std::vector<FormFieldData> fields = form.ExtractFields(); + for (auto& field : fields) { + field.set_is_autofilled_according_to_renderer(true); + } + form.set_fields(std::move(fields)); + + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + histogram_tester.ExpectUniqueSample( + "Autofill.Actor.KeyMetrics.FillingCorrectness.CreditCard", true, 1); +} + +// Tests that FillingCorrectness metrics are correctly recorded for credit cards +// if one field is modified by the user. +TEST_F(ActorKeyMetricsRecorderTest, + FillingCorrectnessMetrics_CreditCardIncorrect) { + base::HistogramTester histogram_tester; + const CreditCard card = test::GetCreditCard(); + payments_data_manager().AddCreditCard(card); + FormData form = SeeForm({.fields = {{.server_type = CREDIT_CARD_NAME_FULL}, + {.server_type = CREDIT_CARD_NUMBER}}}); + + GetSuggestionsFuture future; + service().GetSuggestions( + tab(), {CreditCardFillRequest({form.fields()[0].global_id()})}, + future.GetCallback()); + std::vector<ActorFormFillingRequest> requests = future.Take().value(); + + service().FillForm(tab(), /*form_index=*/0, + ActorFormFillingSelection(requests[0].suggestions[0].id)); + FillSuggestionsFuture fill_future; + service().FillSuggestions( + tab(), {ActorFormFillingSelection(requests[0].suggestions[0].id)}, + fill_future.GetCallback()); + ASSERT_TRUE(credit_card_access_manager().RunCreditCardFetchedCallback(card)); + EXPECT_THAT(fill_future.Get(), HasValue()); + + // Simulate one field being modified. + std::vector<FormFieldData> fields = form.ExtractFields(); + fields[1].set_is_autofilled_according_to_renderer(false); + form.set_fields(std::move(fields)); + + manager().OnTextFieldValueChanged(form, form.fields()[1].global_id(), + base::TimeTicks::Now()); + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + histogram_tester.ExpectUniqueSample( + "Autofill.Actor.KeyMetrics.FillingCorrectness.CreditCard", false, 1); +} + +// Tests that FillingCorrectness metrics are correctly recorded for both +// products in a mixed form. +TEST_F(ActorKeyMetricsRecorderTest, FillingCorrectnessMetrics_MixedForm) { + base::HistogramTester histogram_tester; + const CreditCard card = test::GetCreditCard(); + payments_data_manager().AddCreditCard(card); + + FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, + {.server_type = ADDRESS_HOME_LINE1}, + {.server_type = CREDIT_CARD_NAME_FULL}, + {.server_type = CREDIT_CARD_NUMBER}}}); + + // Fill address. + GetSuggestionsFuture addr_future; + service().GetSuggestions(tab(), + {AddressFillRequest({form.fields()[0].global_id()})}, + addr_future.GetCallback()); + std::vector<ActorFormFillingRequest> addr_requests = + addr_future.Take().value(); + service().FillForm( + tab(), /*form_index=*/0, + ActorFormFillingSelection(addr_requests[0].suggestions[0].id)); + FillSuggestionsFuture addr_fill_future; + service().FillSuggestions( + tab(), {ActorFormFillingSelection(addr_requests[0].suggestions[0].id)}, + addr_fill_future.GetCallback()); + EXPECT_THAT(addr_fill_future.Get(), HasValue()); + + // Fill credit card. + GetSuggestionsFuture cc_future; + service().GetSuggestions( + tab(), {CreditCardFillRequest({form.fields()[2].global_id()})}, + cc_future.GetCallback()); + std::vector<ActorFormFillingRequest> cc_requests = cc_future.Take().value(); + service().FillForm( + tab(), /*form_index=*/0, + ActorFormFillingSelection(cc_requests[0].suggestions[0].id)); + FillSuggestionsFuture cc_fill_future; + service().FillSuggestions( + tab(), {ActorFormFillingSelection(cc_requests[0].suggestions[0].id)}, + cc_fill_future.GetCallback()); + ASSERT_TRUE(credit_card_access_manager().RunCreditCardFetchedCallback(card)); + EXPECT_THAT(cc_fill_future.Get(), HasValue()); + + // Simulate address being modified, but CC remains unchanged. + std::vector<FormFieldData> fields = form.ExtractFields(); + fields[0].set_is_autofilled_according_to_renderer(false); + fields[1].set_is_autofilled_according_to_renderer(true); + fields[2].set_is_autofilled_according_to_renderer(true); + fields[3].set_is_autofilled_according_to_renderer(true); + form.set_fields(std::move(fields)); + + manager().OnTextFieldValueChanged(form, form.fields()[0].global_id(), + base::TimeTicks::Now()); + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + + histogram_tester.ExpectUniqueSample( + "Autofill.Actor.KeyMetrics.FillingCorrectness.Address", false, 1); + histogram_tester.ExpectUniqueSample( + "Autofill.Actor.KeyMetrics.FillingCorrectness.CreditCard", true, 1); +} + +// Tests that FillingCorrectness metrics are correctly recorded as true when the +// actor only filled some fields, and the user manually filled the rest (but did +// not modify the actor-filled ones). +TEST_F(ActorKeyMetricsRecorderTest, FillingCorrectnessMetrics_PartialFilling) { + base::HistogramTester histogram_tester; + FormData form = SeeForm( + {.fields = {{.server_type = NAME_FULL}, {.server_type = UNKNOWN_TYPE}}}); + + GetSuggestionsFuture future; + service().GetSuggestions(tab(), + {AddressFillRequest({form.fields()[0].global_id()})}, + future.GetCallback()); + std::vector<ActorFormFillingRequest> requests = future.Take().value(); + + service().FillForm(tab(), /*form_index=*/0, + ActorFormFillingSelection(requests[0].suggestions[0].id)); + FillSuggestionsFuture fill_future; + service().FillSuggestions( + tab(), {ActorFormFillingSelection(requests[0].suggestions[0].id)}, + fill_future.GetCallback()); + EXPECT_THAT(fill_future.Get(), HasValue()); + + // Verify that only the NAME_FULL field was filled by the actor. + EXPECT_THAT(last_filled_values(), + AllOf(Contains(Pair(form.fields()[0].global_id(), _)), + Not(Contains(Pair(form.fields()[1].global_id(), _))))); + + // Simulate submission: + // - Field 0 (NAME_FULL): Filled by actor, unchanged (is_autofilled = true). + // - Field 1 (UNKNOWN_TYPE): Filled by user manually (is_autofilled = false). + std::vector<FormFieldData> fields = form.ExtractFields(); + fields[0].set_is_autofilled_according_to_renderer(true); + fields[1].set_is_autofilled_according_to_renderer(false); + fields[1].set_value(u"User Content"); + form.set_fields(std::move(fields)); + + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + + // Should be recorded as Correct (true) because the actor-filled field was not + // modified. + histogram_tester.ExpectUniqueSample( + "Autofill.Actor.KeyMetrics.FillingCorrectness.Address", true, 1); +} + +// Tests that the state for recorded forms is cleared when the forms are +// removed (e.g. on navigation). +TEST_F(ActorKeyMetricsRecorderTest, + FillingAssistanceMetrics_StateClearedOnNavigation) { + base::HistogramTester histogram_tester; + // Use stable IDs so that the form has the same GlobalId when re-added. + test::FormDescription form_desc = { + .fields = {{.role = NAME_FULL, .renderer_id = FieldRendererId(1)}, + {.role = ADDRESS_HOME_LINE1, + .renderer_id = FieldRendererId(2)}}, + .host_frame = driver().GetFrameToken(), + .renderer_id = FormRendererId(1)}; + FormData form = SeeForm(form_desc); + + GetSuggestionsFuture future; + service().GetSuggestions(tab(), + {AddressFillRequest({form.fields()[0].global_id()})}, + future.GetCallback()); + std::vector<ActorFormFillingRequest> requests = future.Take().value(); + + service().FillForm(tab(), /*form_index=*/0, + ActorFormFillingSelection(requests[0].suggestions[0].id)); + FillSuggestionsFuture fill_future; + service().FillSuggestions( + tab(), {ActorFormFillingSelection(requests[0].suggestions[0].id)}, + fill_future.GetCallback()); + EXPECT_THAT(fill_future.Get(), HasValue()); + + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + histogram_tester.ExpectUniqueSample( + "Autofill.Actor.KeyMetrics.FillingAssistance.Address", true, 1); + + // Now "navigate" away, which removes forms. + manager().OnFormsSeen(/*updated_forms=*/{}, + /*removed_forms=*/{form.global_id()}); + + // Re-add the same form (simulating coming back to the page). + FormData form2 = SeeForm(form_desc); + ASSERT_EQ(form.global_id(), form2.global_id()); + + // Record at submission. Should record false now because it's a new session + // and it wasn't filled by actor in this session. + manager().OnFormSubmitted(form2, mojom::SubmissionSource::FORM_SUBMISSION); + histogram_tester.ExpectBucketCount( + "Autofill.Actor.KeyMetrics.FillingAssistance.Address", false, 1); + histogram_tester.ExpectTotalCount( + "Autofill.Actor.KeyMetrics.FillingAssistance.Address", 2); +} + +// Tests that FillingReadiness metrics are correctly recorded when actor +// suggestions are available. +TEST_F(ActorKeyMetricsRecorderTest, + FillingReadinessMetrics_SuggestionsAvailable) { + base::HistogramTester histogram_tester; + FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, + {.server_type = ADDRESS_HOME_LINE1}, + {.server_type = ADDRESS_HOME_CITY}}}); + + GetSuggestionsFuture future; + service().GetSuggestions(tab(), + {AddressFillRequest({form.fields()[0].global_id()})}, + future.GetCallback()); + EXPECT_THAT(future.Get(), HasValue()); + + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + histogram_tester.ExpectUniqueSample( + "Autofill.Actor.KeyMetrics.FillingReadiness.Address", true, 1); +} + +// Tests that FillingReadiness metrics are correctly recorded when actor +// suggestions are NOT available. +TEST_F(ActorKeyMetricsRecorderTest, + FillingReadinessMetrics_SuggestionsNotAvailable) { + base::HistogramTester histogram_tester; + // Use a form type that won't have suggestions (e.g. by using an unfindable + // request or similar, but SeeForm needs to be called to cache it). + FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}}}); + + GetSuggestionsFuture future; + // Trigger on a field that doesn't exist in any form to fail suggestion + // generation. + service().GetSuggestions(tab(), {UnfindableFillRequest()}, + future.GetCallback()); + EXPECT_THAT(future.Get(), ErrorIs(ActorFormFillingError::kNoSuggestions)); + + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + histogram_tester.ExpectUniqueSample( + "Autofill.Actor.KeyMetrics.FillingReadiness.Address", false, 1); +} + +// Tests that FillingReadiness metrics are correctly recorded for credit cards. +TEST_F(ActorKeyMetricsRecorderTest, FillingReadinessMetrics_CreditCard) { + base::HistogramTester histogram_tester; + const CreditCard card = test::GetCreditCard(); + payments_data_manager().AddCreditCard(card); + FormData form = + SeeForm({.fields = {{.server_type = CREDIT_CARD_NAME_FULL}, + {.server_type = CREDIT_CARD_NUMBER}, + {.server_type = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR}}}); + + GetSuggestionsFuture future; + service().GetSuggestions( + tab(), {CreditCardFillRequest({form.fields()[0].global_id()})}, + future.GetCallback()); + EXPECT_THAT(future.Get(), HasValue()); + + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + histogram_tester.ExpectUniqueSample( + "Autofill.Actor.KeyMetrics.FillingReadiness.CreditCard", true, 1); +} + +// Tests that PerfectFilling metrics are correctly recorded as true when all +// fields filled by the actor are submitted unchanged. +TEST_F(ActorKeyMetricsRecorderTest, PerfectFilling_Address_Perfect) { + base::HistogramTester histogram_tester; + FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, + {.server_type = ADDRESS_HOME_LINE1}}}); + + GetSuggestionsFuture future; + service().GetSuggestions(tab(), + {AddressFillRequest({form.fields()[0].global_id()})}, + future.GetCallback()); + std::vector<ActorFormFillingRequest> requests = future.Take().value(); + + service().FillForm(tab(), /*form_index=*/0, + ActorFormFillingSelection(requests[0].suggestions[0].id)); + FillSuggestionsFuture fill_future; + service().FillSuggestions( + tab(), {ActorFormFillingSelection(requests[0].suggestions[0].id)}, + fill_future.GetCallback()); + ASSERT_THAT(fill_future.Get(), HasValue()); + + // Simulate perfect filling (no user edits). + std::vector<FormFieldData> fields = form.ExtractFields(); + fields[0].set_is_autofilled_according_to_renderer(true); + fields[1].set_is_autofilled_according_to_renderer(true); + form.set_fields(std::move(fields)); + + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + + histogram_tester.ExpectUniqueSample("Autofill.Actor.PerfectFilling.Address", + true, 1); +} + +// Tests that PerfectFilling metrics are correctly recorded as false when at +// least one field filled by the actor is modified by the user. +TEST_F(ActorKeyMetricsRecorderTest, PerfectFilling_Address_Imperfect) { + base::HistogramTester histogram_tester; + FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, + {.server_type = ADDRESS_HOME_LINE1}}}); + + GetSuggestionsFuture future; + service().GetSuggestions(tab(), + {AddressFillRequest({form.fields()[0].global_id()})}, + future.GetCallback()); + std::vector<ActorFormFillingRequest> requests = future.Take().value(); + + service().FillForm(tab(), /*form_index=*/0, + ActorFormFillingSelection(requests[0].suggestions[0].id)); + FillSuggestionsFuture fill_future; + service().FillSuggestions( + tab(), {ActorFormFillingSelection(requests[0].suggestions[0].id)}, + fill_future.GetCallback()); + ASSERT_THAT(fill_future.Get(), HasValue()); + + // Simulate imperfect filling (user edit). + manager().OnTextFieldValueChanged(form, form.fields()[0].global_id(), + base::TimeTicks::Now()); + + // Simulate submission. + std::vector<FormFieldData> fields = form.ExtractFields(); + fields[0].set_is_autofilled_according_to_renderer(false); + fields[1].set_is_autofilled_according_to_renderer(true); + form.set_fields(std::move(fields)); + + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + + histogram_tester.ExpectUniqueSample("Autofill.Actor.PerfectFilling.Address", + false, 1); +} + +// Tests that PerfectFilling metrics are correctly recorded for credit cards +// if all fields are submitted unchanged. +TEST_F(ActorKeyMetricsRecorderTest, PerfectFilling_CreditCard_Perfect) { + base::HistogramTester histogram_tester; + const CreditCard card = test::GetCreditCard(); + payments_data_manager().AddCreditCard(card); + FormData form = SeeForm({.fields = {{.server_type = CREDIT_CARD_NAME_FULL}, + {.server_type = CREDIT_CARD_NUMBER}}}); + + GetSuggestionsFuture future; + service().GetSuggestions( + tab(), {CreditCardFillRequest({form.fields()[0].global_id()})}, + future.GetCallback()); + std::vector<ActorFormFillingRequest> requests = future.Take().value(); + + service().FillForm(tab(), /*form_index=*/0, + ActorFormFillingSelection(requests[0].suggestions[0].id)); + FillSuggestionsFuture fill_future; + service().FillSuggestions( + tab(), {ActorFormFillingSelection(requests[0].suggestions[0].id)}, + fill_future.GetCallback()); + ASSERT_TRUE(credit_card_access_manager().RunCreditCardFetchedCallback(card)); + ASSERT_THAT(fill_future.Get(), HasValue()); + + // Simulate perfect filling. + std::vector<FormFieldData> fields = form.ExtractFields(); + fields[0].set_is_autofilled_according_to_renderer(true); + fields[1].set_is_autofilled_according_to_renderer(true); + form.set_fields(std::move(fields)); + + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + + histogram_tester.ExpectUniqueSample( + "Autofill.Actor.PerfectFilling.CreditCard", true, 1); +} + +// Tests that PerfectFilling metrics are correctly recorded for credit cards +// if one field is modified by the user. +TEST_F(ActorKeyMetricsRecorderTest, PerfectFilling_CreditCard_Imperfect) { + base::HistogramTester histogram_tester; + const CreditCard card = test::GetCreditCard(); + payments_data_manager().AddCreditCard(card); + FormData form = SeeForm({.fields = {{.server_type = CREDIT_CARD_NAME_FULL}, + {.server_type = CREDIT_CARD_NUMBER}}}); + + GetSuggestionsFuture future; + service().GetSuggestions( + tab(), {CreditCardFillRequest({form.fields()[0].global_id()})}, + future.GetCallback()); + std::vector<ActorFormFillingRequest> requests = future.Take().value(); + + service().FillForm(tab(), /*form_index=*/0, + ActorFormFillingSelection(requests[0].suggestions[0].id)); + FillSuggestionsFuture fill_future; + service().FillSuggestions( + tab(), {ActorFormFillingSelection(requests[0].suggestions[0].id)}, + fill_future.GetCallback()); + ASSERT_TRUE(credit_card_access_manager().RunCreditCardFetchedCallback(card)); + ASSERT_THAT(fill_future.Get(), HasValue()); + + // Simulate imperfect filling. + manager().OnTextFieldValueChanged(form, form.fields()[1].global_id(), + base::TimeTicks::Now()); + + std::vector<FormFieldData> fields = form.ExtractFields(); + fields[1].set_is_autofilled_according_to_renderer(false); + form.set_fields(std::move(fields)); + + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + + histogram_tester.ExpectUniqueSample( + "Autofill.Actor.PerfectFilling.CreditCard", false, 1); +} + +// Tests that PerfectFilling metrics are correctly recorded for both products +// in a mixed form if all fields are submitted unchanged. +TEST_F(ActorKeyMetricsRecorderTest, PerfectFilling_MixedForm_Perfect) { + base::HistogramTester histogram_tester; + const CreditCard card = test::GetCreditCard(); + payments_data_manager().AddCreditCard(card); + FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, + {.server_type = CREDIT_CARD_NUMBER}}}); + + // Fill address. + GetSuggestionsFuture addr_future; + service().GetSuggestions(tab(), + {AddressFillRequest({form.fields()[0].global_id()})}, + addr_future.GetCallback()); + std::vector<ActorFormFillingRequest> addr_requests = + addr_future.Take().value(); + service().FillForm( + tab(), /*form_index=*/0, + ActorFormFillingSelection(addr_requests[0].suggestions[0].id)); + FillSuggestionsFuture addr_fill_future; + service().FillSuggestions( + tab(), {ActorFormFillingSelection(addr_requests[0].suggestions[0].id)}, + addr_fill_future.GetCallback()); + ASSERT_THAT(addr_fill_future.Get(), HasValue()); + + // Fill credit card. + GetSuggestionsFuture cc_future; + service().GetSuggestions( + tab(), {CreditCardFillRequest({form.fields()[1].global_id()})}, + cc_future.GetCallback()); + std::vector<ActorFormFillingRequest> cc_requests = cc_future.Take().value(); + service().FillForm( + tab(), /*form_index=*/0, + ActorFormFillingSelection(cc_requests[0].suggestions[0].id)); + FillSuggestionsFuture cc_fill_future; + service().FillSuggestions( + tab(), {ActorFormFillingSelection(cc_requests[0].suggestions[0].id)}, + cc_fill_future.GetCallback()); + ASSERT_TRUE(credit_card_access_manager().RunCreditCardFetchedCallback(card)); + ASSERT_THAT(cc_fill_future.Get(), HasValue()); + + // Perfect filling. + std::vector<FormFieldData> fields = form.ExtractFields(); + fields[0].set_is_autofilled_according_to_renderer(true); + fields[1].set_is_autofilled_according_to_renderer(true); + form.set_fields(std::move(fields)); + + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + + histogram_tester.ExpectUniqueSample("Autofill.Actor.PerfectFilling.Address", + true, 1); + histogram_tester.ExpectUniqueSample( + "Autofill.Actor.PerfectFilling.CreditCard", true, 1); +} + +// Tests that PerfectFilling metrics are correctly recorded as false for both +// products in a mixed form, if one field is modified by the user. +TEST_F(ActorKeyMetricsRecorderTest, PerfectFilling_MixedForm_Imperfect) { + base::HistogramTester histogram_tester; + const CreditCard card = test::GetCreditCard(); + payments_data_manager().AddCreditCard(card); + FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, + {.server_type = CREDIT_CARD_NUMBER}}}); + + // Fill address. + GetSuggestionsFuture addr_future; + service().GetSuggestions(tab(), + {AddressFillRequest({form.fields()[0].global_id()})}, + addr_future.GetCallback()); + std::vector<ActorFormFillingRequest> addr_requests = + addr_future.Take().value(); + service().FillForm( + tab(), /*form_index=*/0, + ActorFormFillingSelection(addr_requests[0].suggestions[0].id)); + FillSuggestionsFuture addr_fill_future; + service().FillSuggestions( + tab(), {ActorFormFillingSelection(addr_requests[0].suggestions[0].id)}, + addr_fill_future.GetCallback()); + ASSERT_THAT(addr_fill_future.Get(), HasValue()); + + // Fill credit card. + GetSuggestionsFuture cc_future; + service().GetSuggestions( + tab(), {CreditCardFillRequest({form.fields()[1].global_id()})}, + cc_future.GetCallback()); + std::vector<ActorFormFillingRequest> cc_requests = cc_future.Take().value(); + service().FillForm( + tab(), /*form_index=*/0, + ActorFormFillingSelection(cc_requests[0].suggestions[0].id)); + FillSuggestionsFuture cc_fill_future; + service().FillSuggestions( + tab(), {ActorFormFillingSelection(cc_requests[0].suggestions[0].id)}, + cc_fill_future.GetCallback()); + ASSERT_TRUE(credit_card_access_manager().RunCreditCardFetchedCallback(card)); + ASSERT_THAT(cc_fill_future.Get(), HasValue()); + + // Imperfect filling (address field edited). + manager().OnTextFieldValueChanged(form, form.fields()[0].global_id(), + base::TimeTicks::Now()); + + std::vector<FormFieldData> fields = form.ExtractFields(); + fields[0].set_is_autofilled_according_to_renderer(false); + fields[1].set_is_autofilled_according_to_renderer(true); + form.set_fields(std::move(fields)); + + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + + // Both should be false because the form as a whole is imperfect. + histogram_tester.ExpectUniqueSample("Autofill.Actor.PerfectFilling.Address", + false, 1); + histogram_tester.ExpectUniqueSample( + "Autofill.Actor.PerfectFilling.CreditCard", false, 1); +} + +// Tests that PerfectFilling metrics are correctly recorded as false when the +// actor did not fill all fields and the user manually filled the remaining one. +TEST_F(ActorKeyMetricsRecorderTest, + PerfectFilling_Address_PartialFilling_ManualFallback) { + base::HistogramTester histogram_tester; + FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, + {.server_type = ADDRESS_HOME_LINE1}, + {.server_type = ADDRESS_HOME_CITY}, + {.server_type = UNKNOWN_TYPE}}}); + + GetSuggestionsFuture future; + service().GetSuggestions(tab(), + {AddressFillRequest({form.fields()[0].global_id()})}, + future.GetCallback()); + std::vector<ActorFormFillingRequest> requests = future.Take().value(); + + service().FillForm(tab(), /*form_index=*/0, + ActorFormFillingSelection(requests[0].suggestions[0].id)); + FillSuggestionsFuture fill_future; + service().FillSuggestions( + tab(), {ActorFormFillingSelection(requests[0].suggestions[0].id)}, + fill_future.GetCallback()); + ASSERT_THAT(fill_future.Get(), HasValue()); + + // Simulate submission. + std::vector<FormFieldData> fields = form.ExtractFields(); + // First 3 filled by actor (unchanged). + fields[0].set_is_autofilled_according_to_renderer(true); + fields[1].set_is_autofilled_according_to_renderer(true); + fields[2].set_is_autofilled_according_to_renderer(true); + // 4th filled manually. + fields[3].set_is_autofilled_according_to_renderer(false); + fields[3].set_value(u"User Content"); + form.set_fields(std::move(fields)); + + manager().OnTextFieldValueChanged(form, form.fields()[3].global_id(), + base::TimeTicks::Now()); + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + + histogram_tester.ExpectUniqueSample("Autofill.Actor.PerfectFilling.Address", + false, 1); +} + +// Tests that PerfectFilling metrics are correctly recorded as false when the +// actor partially fills a form, and the user uses standard (non-actor) Autofill +// to complete the rest. +TEST_F(ActorKeyMetricsRecorderTest, + PerfectFilling_PartialFilling_StandardAutofillFallback) { + base::HistogramTester histogram_tester; + FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, + {.server_type = CREDIT_CARD_NUMBER}}}); + + // Fill ONLY the address via Actor. + GetSuggestionsFuture addr_future; + service().GetSuggestions(tab(), + {AddressFillRequest({form.fields()[0].global_id()})}, + addr_future.GetCallback()); + std::vector<ActorFormFillingRequest> addr_requests = + addr_future.Take().value(); + service().FillForm( + tab(), /*form_index=*/0, + ActorFormFillingSelection(addr_requests[0].suggestions[0].id)); + FillSuggestionsFuture addr_fill_future; + service().FillSuggestions( + tab(), {ActorFormFillingSelection(addr_requests[0].suggestions[0].id)}, + addr_fill_future.GetCallback()); + ASSERT_THAT(addr_fill_future.Get(), HasValue()); + + // Manually add the kAutofill modifier to the cached field to perfectly + // simulate standard Autofill stepping in where the Actor left off. + manager() + .FindCachedFormById(form.global_id()) + ->fields()[1] + ->AddFieldModifier(FieldModifier::kAutofill); + + std::vector<FormFieldData> fields = form.ExtractFields(); + fields[0].set_is_autofilled_according_to_renderer(true); + fields[1].set_is_autofilled_according_to_renderer(true); + form.set_fields(std::move(fields)); + + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + + // Should fail because the CC field has an autofill modifier, but wasn't + // filled by any Actor. + histogram_tester.ExpectUniqueSample("Autofill.Actor.PerfectFilling.Address", + false, 1); +} + +// Tests that PerfectFilling metrics are correctly recorded as true when the +// actor fills its relevant fields, and the remaining fields are left completely +// empty (or untouched by the user/autofill). +TEST_F(ActorKeyMetricsRecorderTest, + PerfectFilling_Address_WithEmptyIgnoredFields) { + base::HistogramTester histogram_tester; + // Form has an extra unknown field that will just be left alone. + FormData form = SeeForm({.fields = {{.server_type = NAME_FULL}, + {.server_type = ADDRESS_HOME_LINE1}, + {.server_type = UNKNOWN_TYPE}}}); + + GetSuggestionsFuture future; + service().GetSuggestions(tab(), + {AddressFillRequest({form.fields()[0].global_id()})}, + future.GetCallback()); + std::vector<ActorFormFillingRequest> requests = future.Take().value(); + + service().FillForm(tab(), /*form_index=*/0, + ActorFormFillingSelection(requests[0].suggestions[0].id)); + FillSuggestionsFuture fill_future; + service().FillSuggestions( + tab(), {ActorFormFillingSelection(requests[0].suggestions[0].id)}, + fill_future.GetCallback()); + ASSERT_THAT(fill_future.Get(), HasValue()); + + // Simulate submission. The actor fields are marked as autofilled. + // The UNKNOWN_TYPE field is completely untouched (empty modifiers). + std::vector<FormFieldData> fields = form.ExtractFields(); + fields[0].set_is_autofilled_according_to_renderer(true); + fields[1].set_is_autofilled_according_to_renderer(true); + fields[2].set_is_autofilled_according_to_renderer(false); // Left empty + form.set_fields(std::move(fields)); + + manager().OnFormSubmitted(form, mojom::SubmissionSource::FORM_SUBMISSION); + + // Should succeed because the untouched empty field does not penalize the + // metric. + histogram_tester.ExpectUniqueSample("Autofill.Actor.PerfectFilling.Address", + true, 1); +} + +} // namespace +} // namespace autofill
diff --git a/chrome/browser/autofill/actor/actor_test_utils.cc b/chrome/browser/autofill/actor/actor_test_utils.cc new file mode 100644 index 0000000..9fdfd5e --- /dev/null +++ b/chrome/browser/autofill/actor/actor_test_utils.cc
@@ -0,0 +1,196 @@ +// Copyright 2026 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/autofill/actor/actor_test_utils.h" + +#include <memory> +#include <utility> +#include <vector> + +#include "base/check_deref.h" +#include "base/functional/callback.h" +#include "base/memory/raw_ptr.h" +#include "base/test/metrics/histogram_tester.h" +#include "base/test/task_environment.h" +#include "chrome/test/base/chrome_render_view_host_test_harness.h" +#include "components/autofill/core/browser/foundations/browser_autofill_manager_test_api.h" +#include "components/autofill/core/browser/test_utils/autofill_test_utils.h" +#include "components/tabs/public/mock_tab_interface.h" +#include "content/public/browser/web_contents.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace autofill { + +TestActorContentAutofillDriver::TestActorContentAutofillDriver( + content::RenderFrameHost* rfh, + ContentAutofillDriverFactory* factory) + : TestContentAutofillDriver(rfh, factory) {} + +TestActorContentAutofillDriver::~TestActorContentAutofillDriver() = default; + +base::flat_set<FieldGlobalId> +TestActorContentAutofillDriver::BaseApplyFormAction( + mojom::FormActionType action_type, + mojom::ActionPersistence action_persistence, + base::span<const FormFieldData> fields, + const FillId& fill_id, + bool supports_refill, + const url::Origin& triggered_origin, + const absl::flat_hash_map<FieldGlobalId, FieldType>& field_type_map, + const Section& section_for_clear_form_on_ios) { + return TestContentAutofillDriver::ApplyFormAction( + action_type, action_persistence, fields, fill_id, supports_refill, + triggered_origin, field_type_map, section_for_clear_form_on_ios); +} + +TestCreditCardAccessManager::TestCreditCardAccessManager( + BrowserAutofillManager* manager) + : CreditCardAccessManager(manager) {} + +TestCreditCardAccessManager::~TestCreditCardAccessManager() = default; + +void TestCreditCardAccessManager::FetchCreditCard( + const CreditCard*, + OnCreditCardFetchedCallback callback) { + callback_ = std::move(callback); +} + +bool TestCreditCardAccessManager::RunCreditCardFetchedCallback( + const CreditCard& card) { + if (!callback_) { + return false; + } + std::move(callback_).Run(card); + return true; +} + +TestBrowserAutofillManagerWithTestCCAM::TestBrowserAutofillManagerWithTestCCAM( + AutofillDriver* driver) + : TestBrowserAutofillManager(driver) { + test_api(*this).set_credit_card_access_manager( + std::make_unique<TestCreditCardAccessManager>(this)); +} + +TestBrowserAutofillManagerWithTestCCAM:: + ~TestBrowserAutofillManagerWithTestCCAM() = default; + +void TestBrowserAutofillManagerWithTestCCAM::Reset() { + TestBrowserAutofillManager::Reset(); + test_api(*this).set_credit_card_access_manager( + std::make_unique<TestCreditCardAccessManager>(this)); +} + +void TestBrowserAutofillManagerWithTestCCAM::FillOrPreviewForm( + mojom::ActionPersistence action_persistence, + const FormData& form, + const FieldGlobalId& field_id, + const FillingPayload& filling_payload, + AutofillTriggerSource trigger_source) { + last_trigger_field_id_ = field_id; + TestBrowserAutofillManager::FillOrPreviewForm( + action_persistence, form, field_id, filling_payload, trigger_source); +} + +void TestBrowserAutofillManagerWithTestCCAM::FillOrPreviewFields( + mojom::ActionPersistence action_persistence, + const FormData& form, + const FieldGlobalId& field_id, + const FillingPayload& filling_payload, + AutofillTriggerSource trigger_source, + const base::flat_set<FieldGlobalId>& blocked_fields) { + last_trigger_field_id_ = field_id; + TestBrowserAutofillManager::FillOrPreviewFields( + action_persistence, form, field_id, filling_payload, trigger_source, + blocked_fields); +} + +TestActorChromeAutofillClient::TestActorChromeAutofillClient( + content::WebContents* web_contents) + : TestContentAutofillClient(web_contents) { + recorder_ = std::make_unique<ActorKeyMetricsRecorder>(this); +} + +TestActorChromeAutofillClient::~TestActorChromeAutofillClient() = default; + +std::unique_ptr<AutofillManager> TestActorChromeAutofillClient::CreateManager( + base::PassKey<ContentAutofillDriver> pass_key, + ContentAutofillDriver& driver) { + return std::make_unique<TestBrowserAutofillManagerWithTestCCAM>(&driver); +} + +ActorKeyMetricsRecorder* +TestActorChromeAutofillClient::GetActorKeyMetricsRecorder() { + return recorder_.get(); +} + +ActorTestBase::ActorTestBase() + : ChromeRenderViewHostTestHarness( + base::test::TaskEnvironment::TimeSource::MOCK_TIME), + service_(std::make_unique<ActorFormFillingServiceImpl>()) {} + +ActorTestBase::~ActorTestBase() = default; + +void ActorTestBase::SetUp() { + ChromeRenderViewHostTestHarness::SetUp(); + ON_CALL(mock_tab, GetContents()) + .WillByDefault(testing::Return(web_contents())); + NavigateAndCommit(GURL("about:blank")); + client().GetPersonalDataManager().address_data_manager().AddProfile( + test::GetFullProfile()); + + ON_CALL(driver(), ApplyFormAction) + .WillByDefault([&](mojom::FormActionType action_type, + mojom::ActionPersistence action_persistence, + base::span<const FormFieldData> fields, + const FillId& fill_id, bool supports_refill, + const url::Origin& triggered_origin, + const absl::flat_hash_map<FieldGlobalId, FieldType>& + field_type_map, + const Section& section_for_clear_form_on_ios) { + base::flat_set<FieldGlobalId> filled_fields = + driver().BaseApplyFormAction(action_type, action_persistence, + fields, fill_id, supports_refill, + triggered_origin, field_type_map, + section_for_clear_form_on_ios); + for (const FormFieldData& field : fields) { + if (filled_fields.contains(field.global_id())) { + last_filled_values_[field.global_id()] = field.value(); + } + } + return filled_fields; + }); +} + +FormData ActorTestBase::SeeForm(test::FormDescription form_description) { + FormData form = test::GetFormData(form_description); + manager().AddSeenForm(form, test::GetHeuristicTypes(form_description), + test::GetServerTypes(form_description)); + return form; +} + +TestActorChromeAutofillClient& ActorTestBase::client() { + return *static_cast<TestActorChromeAutofillClient*>( + autofill_client_injector_[web_contents()]); +} + +TestCreditCardAccessManager& ActorTestBase::credit_card_access_manager() { + return CHECK_DEREF(static_cast<TestCreditCardAccessManager*>( + manager().GetCreditCardAccessManager())); +} + +PaymentsDataManager& ActorTestBase::payments_data_manager() { + return client().GetPersonalDataManager().payments_data_manager(); +} + +TestActorContentAutofillDriver& ActorTestBase::driver() { + return CHECK_DEREF(autofill_driver_injector_[web_contents()]); +} + +TestBrowserAutofillManagerWithTestCCAM& ActorTestBase::manager() { + return static_cast<TestBrowserAutofillManagerWithTestCCAM&>( + driver().GetAutofillManager()); +} + +} // namespace autofill
diff --git a/chrome/browser/autofill/actor/actor_test_utils.h b/chrome/browser/autofill/actor/actor_test_utils.h new file mode 100644 index 0000000..efda15aa --- /dev/null +++ b/chrome/browser/autofill/actor/actor_test_utils.h
@@ -0,0 +1,157 @@ +// Copyright 2026 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_AUTOFILL_ACTOR_ACTOR_TEST_UTILS_H_ +#define CHROME_BROWSER_AUTOFILL_ACTOR_ACTOR_TEST_UTILS_H_ + +#include <string> +#include <vector> + +#include "base/memory/raw_ptr.h" +#include "base/types/expected.h" +#include "chrome/browser/autofill/actor/actor_form_filling_service_impl.h" +#include "chrome/test/base/chrome_render_view_host_test_harness.h" +#include "components/autofill/content/browser/test_autofill_client_injector.h" +#include "components/autofill/content/browser/test_autofill_driver_injector.h" +#include "components/autofill/content/browser/test_content_autofill_client.h" +#include "components/autofill/content/browser/test_content_autofill_driver.h" +#include "components/autofill/core/browser/foundations/test_browser_autofill_manager.h" +#include "components/autofill/core/browser/integrators/actor/actor_form_filling_types.h" +#include "components/autofill/core/browser/payments/credit_card_access_manager.h" +#include "components/autofill/core/browser/test_utils/autofill_form_test_utils.h" +#include "components/autofill/core/common/autofill_test_utils.h" +#include "components/tabs/public/mock_tab_interface.h" +#include "testing/gmock/include/gmock/gmock.h" + +namespace autofill { + +class TestActorContentAutofillDriver : public TestContentAutofillDriver { + public: + TestActorContentAutofillDriver(content::RenderFrameHost* rfh, + ContentAutofillDriverFactory* factory); + ~TestActorContentAutofillDriver() override; + + MOCK_METHOD(void, RendererShouldClearPreviewedForm, (), (override)); + MOCK_METHOD(void, ScrollFieldIntoView, (FieldGlobalId), (override)); + + MOCK_METHOD( + base::flat_set<FieldGlobalId>, + ApplyFormAction, + (mojom::FormActionType action_type, + mojom::ActionPersistence action_persistence, + base::span<const FormFieldData> fields, + const FillId& fill_id, + bool supports_refill, + const url::Origin& triggered_origin, + (const absl::flat_hash_map<FieldGlobalId, FieldType>& field_type_map), + const Section& section_for_clear_form_on_ios), + (override)); + + base::flat_set<FieldGlobalId> BaseApplyFormAction( + mojom::FormActionType action_type, + mojom::ActionPersistence action_persistence, + base::span<const FormFieldData> fields, + const FillId& fill_id, + bool supports_refill, + const url::Origin& triggered_origin, + const absl::flat_hash_map<FieldGlobalId, FieldType>& field_type_map, + const Section& section_for_clear_form_on_ios); +}; + +class TestCreditCardAccessManager : public CreditCardAccessManager { + public: + explicit TestCreditCardAccessManager(BrowserAutofillManager* manager); + ~TestCreditCardAccessManager() override; + + void PrepareToFetchCreditCard() override {} + + void FetchCreditCard(const CreditCard*, + OnCreditCardFetchedCallback callback) override; + + [[nodiscard]] bool RunCreditCardFetchedCallback(const CreditCard& card); + + private: + OnCreditCardFetchedCallback callback_; +}; + +class TestBrowserAutofillManagerWithTestCCAM + : public TestBrowserAutofillManager { + public: + explicit TestBrowserAutofillManagerWithTestCCAM(AutofillDriver* driver); + ~TestBrowserAutofillManagerWithTestCCAM() override; + + void Reset() override; + + void FillOrPreviewForm(mojom::ActionPersistence action_persistence, + const FormData& form, + const FieldGlobalId& field_id, + const FillingPayload& filling_payload, + AutofillTriggerSource trigger_source) override; + + void FillOrPreviewFields( + mojom::ActionPersistence action_persistence, + const FormData& form, + const FieldGlobalId& field_id, + const FillingPayload& filling_payload, + AutofillTriggerSource trigger_source, + const base::flat_set<FieldGlobalId>& blocked_fields) override; + + FieldGlobalId last_trigger_field_id() const { return last_trigger_field_id_; } + + private: + FieldGlobalId last_trigger_field_id_; +}; + +class TestActorChromeAutofillClient : public TestContentAutofillClient { + public: + explicit TestActorChromeAutofillClient(content::WebContents* web_contents); + ~TestActorChromeAutofillClient() override; + + std::unique_ptr<AutofillManager> CreateManager( + base::PassKey<ContentAutofillDriver> pass_key, + ContentAutofillDriver& driver) override; + + ActorKeyMetricsRecorder* GetActorKeyMetricsRecorder() override; + + private: + std::unique_ptr<ActorKeyMetricsRecorder> recorder_; +}; + +class ActorTestBase : public ChromeRenderViewHostTestHarness { + public: + ActorTestBase(); + ~ActorTestBase() override; + + void SetUp() override; + + FormData SeeForm(test::FormDescription form_description); + + const absl::flat_hash_map<FieldGlobalId, std::u16string>& last_filled_values() + const { + return last_filled_values_; + } + + protected: + TestActorChromeAutofillClient& client(); + TestCreditCardAccessManager& credit_card_access_manager(); + PaymentsDataManager& payments_data_manager(); + TestActorContentAutofillDriver& driver(); + TestBrowserAutofillManagerWithTestCCAM& manager(); + ActorFormFillingServiceImpl& service() { return *service_; } + tabs::TabInterface& tab() { return mock_tab; } + + private: + test::AutofillUnitTestEnvironment autofill_test_environment_; + tabs::MockTabInterface mock_tab; + TestAutofillClientInjector<TestActorChromeAutofillClient> + autofill_client_injector_; + TestAutofillDriverInjector<TestActorContentAutofillDriver> + autofill_driver_injector_; + std::unique_ptr<ActorFormFillingServiceImpl> service_; + absl::flat_hash_map<FieldGlobalId, std::u16string> last_filled_values_; +}; + +} // namespace autofill + +#endif // CHROME_BROWSER_AUTOFILL_ACTOR_ACTOR_TEST_UTILS_H_
diff --git a/chrome/browser/autofill/android/java/res/xml/home_of_transactions_preferences.xml b/chrome/browser/autofill/android/java/res/xml/home_of_transactions_preferences.xml index 329b155..2cd0d1e 100644 --- a/chrome/browser/autofill/android/java/res/xml/home_of_transactions_preferences.xml +++ b/chrome/browser/autofill/android/java/res/xml/home_of_transactions_preferences.xml
@@ -12,36 +12,42 @@ android:key="autofill_and_passwords_gpm" android:order="1" android:title="@string/password_manager_settings_title" - android:icon="@drawable/ic_password_manager_key"/> + android:icon="@drawable/ic_password_manager_key" + android:summary="@string/autofill_and_passwords_password_manager_summary"/> <org.chromium.components.browser_ui.settings.ChromeBasePreference android:key="autofill_and_passwords_payments" android:order="2" android:title="@string/autofill_payments_title" - android:icon="@drawable/credit_card"/> + android:icon="@drawable/credit_card" + android:summary="@string/autofill_and_passwords_payments_summary"/> <org.chromium.components.browser_ui.settings.ChromeBasePreference android:key="autofill_and_passwords_addresses" android:order="3" android:title="@string/autofill_contact_info_title" - android:icon="@drawable/ic_outline_email_24dp"/> + android:icon="@drawable/ic_outline_email_24dp" + android:summary="@string/autofill_and_passwords_contact_info_summary"/> <org.chromium.components.browser_ui.settings.ChromeBasePreference android:key="autofill_and_passwords_identity_docs" android:order="4" android:title="@string/autofill_identity_docs_title" - android:icon="@drawable/id_card"/> + android:icon="@drawable/id_card" + android:summary="@string/autofill_and_passwords_identity_docs_summary"/> <org.chromium.components.browser_ui.settings.ChromeBasePreference android:key="autofill_and_passwords_travel" android:order="5" android:title="@string/autofill_travel_title" - android:icon="@drawable/travel_trip"/> + android:icon="@drawable/travel_trip" + android:summary="@string/autofill_and_passwords_travel_summary"/> <org.chromium.components.browser_ui.settings.ChromeBasePreference android:key="autofill_and_passwords_settings" android:order="6" android:title="@string/autofill_settings_title" - android:icon="@drawable/ic_settings_24dp"/> + android:icon="@drawable/ic_settings_24dp" + android:summary="@string/autofill_and_passwords_settings_summary"/> </PreferenceScreen> \ No newline at end of file
diff --git a/chrome/browser/autofill/iban_manager_factory.cc b/chrome/browser/autofill/iban_manager_factory.cc deleted file mode 100644 index 5be9787..0000000 --- a/chrome/browser/autofill/iban_manager_factory.cc +++ /dev/null
@@ -1,54 +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/autofill/iban_manager_factory.h" - -#include "base/no_destructor.h" -#include "chrome/browser/autofill/personal_data_manager_factory.h" -#include "chrome/browser/profiles/profile.h" -#include "components/autofill/core/browser/data_manager/payments/payments_data_manager.h" -#include "components/autofill/core/browser/data_manager/personal_data_manager.h" -#include "components/autofill/core/browser/payments/iban_manager.h" - -namespace autofill { - -// static -IbanManager* IbanManagerFactory::GetForProfile(Profile* profile) { - return static_cast<IbanManager*>( - GetInstance()->GetServiceForBrowserContext(profile, true)); -} - -// static -IbanManagerFactory* IbanManagerFactory::GetInstance() { - static base::NoDestructor<IbanManagerFactory> instance; - return instance.get(); -} - -IbanManagerFactory::IbanManagerFactory() - : ProfileKeyedServiceFactory( - "IbanManager", - ProfileSelections::Builder() - .WithRegular(ProfileSelection::kOwnInstance) - // TODO(crbug.com/40257657): Check if this service is needed in - // Guest mode. - .WithGuest(ProfileSelection::kOwnInstance) - // TODO(crbug.com/41488885): Check if this service is needed for - // Ash Internals. - .WithAshInternals(ProfileSelection::kOwnInstance) - .Build()) { - DependsOn(PersonalDataManagerFactory::GetInstance()); -} - -IbanManagerFactory::~IbanManagerFactory() = default; - -std::unique_ptr<KeyedService> -IbanManagerFactory::BuildServiceInstanceForBrowserContext( - content::BrowserContext* context) const { - PersonalDataManager* pdm = - PersonalDataManagerFactory::GetForBrowserContext(context); - PaymentsDataManager* paydm = pdm ? &pdm->payments_data_manager() : nullptr; - return std::make_unique<IbanManager>(paydm); -} - -} // namespace autofill
diff --git a/chrome/browser/autofill/iban_manager_factory.h b/chrome/browser/autofill/iban_manager_factory.h deleted file mode 100644 index 0ddfb91..0000000 --- a/chrome/browser/autofill/iban_manager_factory.h +++ /dev/null
@@ -1,44 +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. - -#ifndef CHROME_BROWSER_AUTOFILL_IBAN_MANAGER_FACTORY_H_ -#define CHROME_BROWSER_AUTOFILL_IBAN_MANAGER_FACTORY_H_ - -#include "chrome/browser/profiles/profile_keyed_service_factory.h" -#include "components/keyed_service/core/keyed_service.h" - -namespace base { -template <typename T> -class NoDestructor; -} - -class Profile; - -namespace autofill { - -class IbanManager; - -// Singleton that owns all IbanManagers and associates them with Profiles. -class IbanManagerFactory : public ProfileKeyedServiceFactory { - public: - // Returns the IbanManager for `profile`, creating it if it is not yet - // created. - static IbanManager* GetForProfile(Profile* profile); - - static IbanManagerFactory* GetInstance(); - - private: - friend base::NoDestructor<IbanManagerFactory>; - - IbanManagerFactory(); - ~IbanManagerFactory() override; - - // BrowserContextKeyedServiceFactory: - std::unique_ptr<KeyedService> BuildServiceInstanceForBrowserContext( - content::BrowserContext* profile) const override; -}; - -} // namespace autofill - -#endif // CHROME_BROWSER_AUTOFILL_IBAN_MANAGER_FACTORY_H_
diff --git a/chrome/browser/chrome_web_platform_security_metrics_browsertest.cc b/chrome/browser/chrome_web_platform_security_metrics_browsertest.cc index 7a1f1c1d..4fcca17c 100644 --- a/chrome/browser/chrome_web_platform_security_metrics_browsertest.cc +++ b/chrome/browser/chrome_web_platform_security_metrics_browsertest.cc
@@ -313,11 +313,10 @@ https_server().GetURL(kPnaPath)))); CheckCounter(WebFeature::kPrivateNetworkAccessInsecureResourceNotKnownPrivate, 0); - EXPECT_THAT(content::EvalJs( - web_contents(), - content::JsReplace("fetch($1).then(response => response.ok)", - http_server().GetURL("b.com", kPnaPath))), - content::EvalJsResult::IsError()); + EXPECT_FALSE(content::ExecJs( + web_contents(), + content::JsReplace("fetch($1).then(response => response.ok)", + http_server().GetURL("b.com", kPnaPath)))); CheckCounter(WebFeature::kPrivateNetworkAccessInsecureResourceNotKnownPrivate, 0);
diff --git a/chrome/browser/context_sharing/tab_bottom_sheet/android/BUILD.gn b/chrome/browser/context_sharing/tab_bottom_sheet/android/BUILD.gn index baafa48..fe41d23 100644 --- a/chrome/browser/context_sharing/tab_bottom_sheet/android/BUILD.gn +++ b/chrome/browser/context_sharing/tab_bottom_sheet/android/BUILD.gn
@@ -58,6 +58,7 @@ "//chrome/browser/tab:java", "//chrome/browser/tabmodel:java", "//chrome/browser/ui/android/edge_to_edge:java", + "//chrome/browser/ui/android/layouts:java", "//chrome/browser/ui/android/multiwindow:java", "//chrome/browser/ui/android/omnibox:java", "//chrome/browser/ui/android/page_info:java", @@ -115,6 +116,7 @@ "//chrome/browser/flags:java", "//chrome/browser/profiles/android:java", "//chrome/browser/tab:java", + "//chrome/browser/ui/android/layouts:java", "//chrome/browser/ui/messages/android:java", "//chrome/test/android:chrome_java_integration_test_support", "//chrome/test/android:chrome_java_transit",
diff --git a/chrome/browser/context_sharing/tab_bottom_sheet/android/java/src/org/chromium/chrome/browser/tab_bottom_sheet/TabBottomSheetManager.java b/chrome/browser/context_sharing/tab_bottom_sheet/android/java/src/org/chromium/chrome/browser/tab_bottom_sheet/TabBottomSheetManager.java index aebbbe98..0296f48 100644 --- a/chrome/browser/context_sharing/tab_bottom_sheet/android/java/src/org/chromium/chrome/browser/tab_bottom_sheet/TabBottomSheetManager.java +++ b/chrome/browser/context_sharing/tab_bottom_sheet/android/java/src/org/chromium/chrome/browser/tab_bottom_sheet/TabBottomSheetManager.java
@@ -6,9 +6,14 @@ import android.view.View; +import org.chromium.base.CallbackController; import org.chromium.base.lifetime.Destroyable; +import org.chromium.base.supplier.OneshotSupplier; import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; +import org.chromium.chrome.browser.layouts.LayoutStateProvider; +import org.chromium.chrome.browser.layouts.LayoutStateProvider.LayoutStateObserver; +import org.chromium.chrome.browser.layouts.LayoutType; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController.SheetState; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController.StateChangeReason; @@ -39,9 +44,51 @@ void onBottomSheetClosed(); } + private final LayoutStateObserver mLayoutStateObserver = + new LayoutStateObserver() { + @Override + public void onStartedShowing(@LayoutType int layoutType) { + if (layoutType == LayoutType.TAB_SWITCHER) { + if (mTabBottomSheetCoordinator != null + && mNativeInterfaceDelegate != null) { + mSuppressedOnTabSwitcher = true; + mTabBottomSheetCoordinator.closeBottomSheet(); + } + } + } + + @Override + public void onStartedHiding(@LayoutType int layoutType) { + if (layoutType == LayoutType.TAB_SWITCHER) { + if (mLayoutStateProviderOneShotSupplier.get() != null) { + @LayoutType + int nextLayoutType = + mLayoutStateProviderOneShotSupplier.get().getNextLayoutType(); + if (nextLayoutType == LayoutType.BROWSING) { + if (mSuppressedOnTabSwitcher + && mTabBottomSheetCoordinator != null + && mNativeInterfaceDelegate != null) { + mSuppressedOnTabSwitcher = false; + if (mTabBottomSheetCoordinator.tryToShowBottomSheet( + /* animate= */ false, /* startsExpanded= */ false)) { + mBottomSheetController.addObserver(mBottomSheetObserver); + } else { + notifyOnClose(); + } + } + } + } + } + } + }; + private final WindowAndroid mWindowAndroid; private final BottomSheetController mBottomSheetController; private final BottomSheetObserver mBottomSheetObserver; + private final OneshotSupplier<LayoutStateProvider> mLayoutStateProviderOneShotSupplier; + private final CallbackController mCallbackController = new CallbackController(); + + private boolean mSuppressedOnTabSwitcher; private @Nullable TabBottomSheetCoordinator mTabBottomSheetCoordinator; private @Nullable NativeInterfaceDelegate mNativeInterfaceDelegate; @@ -51,11 +98,21 @@ * * @param windowAndroid The {@link WindowAndroid} for managing window-level operations. * @param bottomSheetController The {@link BottomSheetController} used to show the bottom sheet. + * @param tabModelSelector The {@link TabModelSelector} for managing tab models. + * @param layoutStateProviderOneShotSupplier The {@link LayoutStateProvider} for managing layout + * state. */ public TabBottomSheetManager( - WindowAndroid windowAndroid, BottomSheetController bottomSheetController) { + WindowAndroid windowAndroid, + BottomSheetController bottomSheetController, + OneshotSupplier<LayoutStateProvider> layoutStateProviderOneShotSupplier) { mWindowAndroid = windowAndroid; mBottomSheetController = bottomSheetController; + mLayoutStateProviderOneShotSupplier = layoutStateProviderOneShotSupplier; + + mLayoutStateProviderOneShotSupplier.onAvailable( + mCallbackController.makeCancelable( + (provider) -> provider.addObserver(mLayoutStateObserver))); mBottomSheetObserver = buildBottomSheetObserver(); TabBottomSheetUtils.attachManagerToWindow(windowAndroid, this); @@ -101,7 +158,13 @@ void tryToCloseBottomSheet() { if (mTabBottomSheetCoordinator != null) { - mTabBottomSheetCoordinator.closeBottomSheet(); + if (mSuppressedOnTabSwitcher) { + // The bottom sheet is already closed. just send a onClose event back to native. + mSuppressedOnTabSwitcher = false; + notifyOnClose(); + } else { + mTabBottomSheetCoordinator.closeBottomSheet(); + } } } @@ -124,6 +187,25 @@ return mTabBottomSheetCoordinator != null && mTabBottomSheetCoordinator.isSheetShowing(); } + @Override + public void destroy() { + mCallbackController.destroy(); + + // Destroy the coorinator in case the manager is abruptly destroyed before hiding the bottom + // sheet. + if (mTabBottomSheetCoordinator != null) { + mTabBottomSheetCoordinator.destroy(); + mTabBottomSheetCoordinator = null; + } + + var layoutStateProvider = mLayoutStateProviderOneShotSupplier.get(); + if (layoutStateProvider != null) { + layoutStateProvider.removeObserver(mLayoutStateObserver); + } + + TabBottomSheetUtils.detachManagerFromWindow(mWindowAndroid); + } + // Observer methods. private BottomSheetObserver buildBottomSheetObserver() { return new EmptyBottomSheetObserver() { @@ -131,29 +213,27 @@ public void onSheetStateChanged(@SheetState int state, @StateChangeReason int reason) { if (state == SheetState.HIDDEN) { mBottomSheetController.removeObserver(mBottomSheetObserver); - if (mNativeInterfaceDelegate != null) { - mNativeInterfaceDelegate.onBottomSheetClosed(); - mNativeInterfaceDelegate = null; - } - if (mTabBottomSheetCoordinator != null) { - mTabBottomSheetCoordinator.destroy(); - mTabBottomSheetCoordinator = null; + if (!mSuppressedOnTabSwitcher) { + notifyOnClose(); } } } - - @Override - public void onSheetClosed(@StateChangeReason int reason) {} }; } - @Override - public void destroy() { + private void notifyOnClose() { + if (mNativeInterfaceDelegate != null) { + mNativeInterfaceDelegate.onBottomSheetClosed(); + mNativeInterfaceDelegate = null; + } + // Destroy the sheet after notifying native of the close event. + // The only time the sheet isn't destroyed is if we enter the tab switcher, in which case + // we close the sheet but hold only the coordinator to reshow the sheet if we return to the + // same tab. if (mTabBottomSheetCoordinator != null) { mTabBottomSheetCoordinator.destroy(); mTabBottomSheetCoordinator = null; } - TabBottomSheetUtils.detachManagerFromWindow(mWindowAndroid); } /* Testing methods */
diff --git a/chrome/browser/context_sharing/tab_bottom_sheet/android/java/src/org/chromium/chrome/browser/tab_bottom_sheet/TabBottomSheetManagerTest.java b/chrome/browser/context_sharing/tab_bottom_sheet/android/java/src/org/chromium/chrome/browser/tab_bottom_sheet/TabBottomSheetManagerTest.java index 72102ea..1090f42 100644 --- a/chrome/browser/context_sharing/tab_bottom_sheet/android/java/src/org/chromium/chrome/browser/tab_bottom_sheet/TabBottomSheetManagerTest.java +++ b/chrome/browser/context_sharing/tab_bottom_sheet/android/java/src/org/chromium/chrome/browser/tab_bottom_sheet/TabBottomSheetManagerTest.java
@@ -50,7 +50,11 @@ mBottomSheetController = mActivity.getRootUiCoordinatorForTesting().getBottomSheetController(); mCoBrowseViews = new CoBrowseViews(mActivity, null, null, null); - mManager = new TabBottomSheetManager(mWindowAndroid, mBottomSheetController); + mManager = + new TabBottomSheetManager( + mWindowAndroid, + mBottomSheetController, + mActivity.getLayoutStateProviderSupplier()); }); }
diff --git a/chrome/browser/contextual_tasks/BUILD.gn b/chrome/browser/contextual_tasks/BUILD.gn index c691df3d..37fef68 100644 --- a/chrome/browser/contextual_tasks/BUILD.gn +++ b/chrome/browser/contextual_tasks/BUILD.gn
@@ -114,6 +114,7 @@ "//components/optimization_guide/proto:optimization_guide_proto", "//components/page_content_annotations/core", "//components/sessions:session_id", + "//components/sync/base", "//components/sync/model", "//components/tabs:public", "//components/url_deduplication", @@ -239,6 +240,7 @@ "//chrome/browser/contextual_search", "//chrome/browser/devtools", "//chrome/browser/feedback:feedback_enum", + "//chrome/browser/glic/browser_ui", "//chrome/browser/optimization_guide", "//chrome/browser/profiles:profile", "//chrome/browser/resources/contextual_tasks:resources", @@ -265,10 +267,8 @@ "//google_apis", "//net", ] - if (!is_android) { deps += [ - "//chrome/browser/glic/browser_ui", "//chrome/browser/resources/contextual_tasks:resources", "//chrome/browser/tab_list", "//chrome/browser/ui/contextual_search",
diff --git a/chrome/browser/contextual_tasks/contextual_tasks_service_factory.cc b/chrome/browser/contextual_tasks/contextual_tasks_service_factory.cc index f8955ec..eb70243 100644 --- a/chrome/browser/contextual_tasks/contextual_tasks_service_factory.cc +++ b/chrome/browser/contextual_tasks/contextual_tasks_service_factory.cc
@@ -26,6 +26,7 @@ #include "components/contextual_tasks/public/features.h" #include "components/favicon/core/favicon_service.h" #include "components/history/core/browser/history_service.h" +#include "components/sync/base/features.h" #include "components/sync/model/data_type_store_service.h" #include "content/public/browser/browser_context.h" @@ -116,7 +117,9 @@ std::unique_ptr<KeyedService> ContextualTasksServiceFactory::BuildServiceInstanceForBrowserContext( content::BrowserContext* context) const { - if (!base::FeatureList::IsEnabled(kContextualTasks)) { + if (!base::FeatureList::IsEnabled(kContextualTasks) && + !base::FeatureList::IsEnabled(syncer::kSyncAIThread) && + !base::FeatureList::IsEnabled(syncer::kSyncGeminiThread)) { return nullptr; }
diff --git a/chrome/browser/contextual_tasks/contextual_tasks_ui_service.cc b/chrome/browser/contextual_tasks/contextual_tasks_ui_service.cc index 852aabc..668eb16 100644 --- a/chrome/browser/contextual_tasks/contextual_tasks_ui_service.cc +++ b/chrome/browser/contextual_tasks/contextual_tasks_ui_service.cc
@@ -27,6 +27,7 @@ #include "chrome/browser/contextual_tasks/contextual_search_session_finder.h" #include "chrome/browser/contextual_tasks/contextual_tasks_panel_controller.h" #include "chrome/browser/contextual_tasks/contextual_tasks_service_factory.h" +#include "chrome/browser/contextual_tasks/contextual_tasks_ui.h" #include "chrome/browser/contextual_tasks/contextual_tasks_ui_interface.h" #include "chrome/browser/contextual_tasks/contextual_tasks_utils.h" #include "chrome/browser/profiles/profile.h" @@ -73,7 +74,6 @@ // TODO(crbug.com/483442073): Remove TabStripModel and WebUi once we finished // migrating other functions off TabStripModel and find alternatives to access // BrowserWindowInterface in Android. -#include "chrome/browser/contextual_tasks/contextual_tasks_ui.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/views/frame/browser_view.h" #endif @@ -345,14 +345,10 @@ base::WeakPtr<content::WebContents> web_contents) { content::WebUI* webui = web_contents->GetWebUI(); if (webui && webui->GetController()) { -#if !BUILDFLAG(IS_ANDROID) - // TODO(crbug.com/483442073): Remove the ifdef block once ContextualTasksUI - // is available on Android. auto* ui_controller = webui->GetController()->GetAs<ContextualTasksUI>(); if (ui_controller) { ui_controller->ShowOauthErrorDialog(); } -#endif } } @@ -549,7 +545,7 @@ "is tab, opening linked page in tab directly after"; // Get the index of the web contents. - const int current_index = tab_list->GetIndexOfTab(tab.get()->GetHandle()); + const int current_index = tab_list->GetIndexOfTab(tab->GetHandle()); // Open the linked page in a tab directly after this one. // To prevent side panel to close and reopen again, add the new tab, associate @@ -573,20 +569,15 @@ } // Detach the WebContents from tab. - content::WebContents* contextual_task_contents_ptr = nullptr; -#if !BUILDFLAG(IS_ANDROID) - // TODO(crbug.com/483442073): Remove TabStripModel once we add missing - // APIs to TabListInterface. std::unique_ptr<content::WebContents> contextual_task_contents = - browser->GetTabStripModel()->DetachWebContentsAtForInsertion( - current_index, TabRemovedReason::kInsertedIntoSidePanel); - contextual_task_contents_ptr = contextual_task_contents.get(); + tab_list->DetachWebContents(tab->GetHandle()); + content::WebContents* contextual_task_contents_ptr = + contextual_task_contents.get(); // Transfer the contextual task contents into the side panel cache. ContextualTasksPanelController::From(browser.get()) ->TransferWebContentsFromTab(task_id, std::move(contextual_task_contents)); -#endif // Open the side panel. ContextualTasksPanelController::From(browser.get()) @@ -895,9 +886,18 @@ tab ? tab->GetBrowserWindowInterface() : webui::GetBrowserWindowInterface(source_contents); + // Whether the navigation is from forward back navigation and originally from + // a link click. `page_transition` can contain both the original navigation + // information (from link click or typed, etc) and the modified one(from + // forward/back). + ui::PageTransition page_transition = url_params.transition; + bool is_forward_back_link_navigation = + (page_transition & ui::PAGE_TRANSITION_FORWARD_BACK) && + ui::PageTransitionCoreTypeIs(page_transition, ui::PAGE_TRANSITION_LINK); + // Intercept any navigation where the wrapping WebContents is the WebUI host // unless it is the embedded page. - if (is_from_embedded_page && + if ((is_from_embedded_page || is_forward_back_link_navigation) && IsContextualTasksUrl(source_contents->GetLastCommittedURL())) { if (IsShareUrl(url_params.url)) { OMNIBOX_LOG("nav_trace") @@ -913,8 +913,9 @@ return true; } - // Ignore navigation triggered by UI. - if (!url_params.is_renderer_initiated) { + // Ignore navigation triggered by UI except forward back link navigation. + if (!(url_params.is_renderer_initiated || + is_forward_back_link_navigation)) { OMNIBOX_LOG("nav_trace") << "ContextualTasks navigation trace: HandleNavigationImpl " "returning false, not renderer initiated"; @@ -1227,12 +1228,8 @@ Navigate(¶ms); } else { - std::unique_ptr<content::WebContents> web_contents = nullptr; -#if !BUILDFLAG(IS_ANDROID) - // TODO(crbug.com/483442073): Remove TabStripModel once we add missing - // APIs to TabListInterface. - web_contents = controller->DetachWebContentsForTask(task_id); -#endif + std::unique_ptr<content::WebContents> web_contents = + controller->DetachWebContentsForTask(task_id); if (!web_contents) { return; }
diff --git a/chrome/browser/contextual_tasks/contextual_tasks_ui_service.h b/chrome/browser/contextual_tasks/contextual_tasks_ui_service.h index 3bdc872b1..d7413259 100644 --- a/chrome/browser/contextual_tasks/contextual_tasks_ui_service.h +++ b/chrome/browser/contextual_tasks/contextual_tasks_ui_service.h
@@ -279,8 +279,6 @@ // compared without text selection directives as they don't change the page // content and only tell the browser what text to highlight on the page. A // pointer to the selected tab is returned if found. - // TODO(crbug.com/483442073): Remove the ifdef block once we remove - // TabStripModel from MaybeFocusExistingOpenTab. tabs::TabInterface* MaybeFocusExistingOpenTab(const GURL& url, TabListInterface* tab_list, const base::Uuid& task_id);
diff --git a/chrome/browser/contextual_tasks/contextual_tasks_ui_service_unittest.cc b/chrome/browser/contextual_tasks/contextual_tasks_ui_service_unittest.cc index 85c9364..9a2a8fd 100644 --- a/chrome/browser/contextual_tasks/contextual_tasks_ui_service_unittest.cc +++ b/chrome/browser/contextual_tasks/contextual_tasks_ui_service_unittest.cc
@@ -127,12 +127,15 @@ } }; -content::OpenURLParams CreateOpenUrlParams(const GURL& url, - bool is_renderer_initiated) { +content::OpenURLParams CreateOpenUrlParams( + const GURL& url, + bool is_renderer_initiated, + ui::PageTransition page_transition = + ui::PageTransition::PAGE_TRANSITION_AUTO_TOPLEVEL) { content::Referrer referrer; - return content::OpenURLParams( - url, referrer, WindowOpenDisposition::CURRENT_TAB, - ui::PageTransition::PAGE_TRANSITION_AUTO_TOPLEVEL, is_renderer_initiated); + return content::OpenURLParams(url, referrer, + WindowOpenDisposition::CURRENT_TAB, + page_transition, is_renderer_initiated); } // A matcher that checks that an OpenURLParams object has the specified URL. @@ -1222,6 +1225,7 @@ /*is_to_new_tab=*/false)); run_loop.Run(); } + TEST_F(ContextualTasksUiServiceTest, HandleNavigation_DisplayUrlRewritten) { GURL display_url("chrome://google.com/search?udm=50&q=test+query"); auto web_contents = content::WebContentsTester::CreateTestWebContents( @@ -1252,4 +1256,50 @@ run_loop.Run(); } +// Enter cobrowse if it's forward back navibation and is originally from link +// click. +TEST_F(ContextualTasksUiServiceTest, + HandleNavigation_ForwardButtonEnterCobrowseOnLink) { + auto web_contents = content::WebContentsTester::CreateTestWebContents( + profile_.get(), content::SiteInstance::Create(profile_.get())); + content::WebContentsTester::For(web_contents.get()) + ->SetLastCommittedURL(GURL("chrome://contextual-tasks")); + + base::RunLoop run_loop; + GURL navigated_url("https://example.com"); + EXPECT_CALL(*service_for_nav_, OnThreadLinkClicked(navigated_url, _, _, _)) + .WillOnce(testing::InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit)); + + EXPECT_TRUE(service_for_nav_->HandleNavigation( + CreateOpenUrlParams( + navigated_url, false, + ui::PageTransitionFromInt( + ui::PageTransition::PAGE_TRANSITION_LINK | + ui::PageTransition::PAGE_TRANSITION_FORWARD_BACK)), + web_contents.get(), + /*is_from_embedded_page=*/false, /*is_to_new_tab=*/false)); + + run_loop.Run(); +} + +// Do not enter cobrowse if it's forward back navibation and is originally from +// typed. +TEST_F(ContextualTasksUiServiceTest, + HandleNavigation_ForwardButtonNotEnterCobrowseOnType) { + auto web_contents = content::WebContentsTester::CreateTestWebContents( + profile_.get(), content::SiteInstance::Create(profile_.get())); + content::WebContentsTester::For(web_contents.get()) + ->SetLastCommittedURL(GURL("chrome://contextual-tasks")); + + GURL navigated_url("https://example.com"); + EXPECT_FALSE(service_for_nav_->HandleNavigation( + CreateOpenUrlParams( + navigated_url, false, + ui::PageTransitionFromInt( + ui::PageTransition::PAGE_TRANSITION_TYPED | + ui::PageTransition::PAGE_TRANSITION_FORWARD_BACK)), + web_contents.get(), + /*is_from_embedded_page=*/false, /*is_to_new_tab=*/false)); +} + } // namespace contextual_tasks
diff --git a/chrome/browser/device_reauth/chromeos/authenticator_chromeos.cc b/chrome/browser/device_reauth/chromeos/authenticator_chromeos.cc index b544e42..9a71619b 100644 --- a/chrome/browser/device_reauth/chromeos/authenticator_chromeos.cc +++ b/chrome/browser/device_reauth/chromeos/authenticator_chromeos.cc
@@ -57,7 +57,26 @@ void AuthenticatorChromeOS::AuthenticateUser( const std::u16string& message, + device_reauth::DeviceAuthSource source, base::OnceCallback<void(bool)> result_callback) { + ash::InSessionAuthDialogController::Reason reason; + switch (source) { + case device_reauth::DeviceAuthSource::kAutofill: + // TODO(b/493658798): Create a kPaymentsAutofill auth source and make sure + // that's set. + reason = + ash::InSessionAuthDialogController::Reason::kAccessAutofillPayments; + break; + case device_reauth::DeviceAuthSource::kPasswordManager: + case device_reauth::DeviceAuthSource::kIncognito: + case device_reauth::DeviceAuthSource::kDeviceLockPage: + case device_reauth::DeviceAuthSource::kSettingsBatchUpload: + case device_reauth::DeviceAuthSource::kBookmarkBatchUpload: + case device_reauth::DeviceAuthSource::kPasswordsCsvDownload: + reason = + ash::InSessionAuthDialogController::Reason::kAccessPasswordManager; + break; + } // Calls `InSessionAuthDialogController::ShowAuthDialog` to authenticate the // currently active user using configured auth factors. // On Lacros, makes a crosapi call to the @@ -65,8 +84,7 @@ // in turn calls `InSessionAuthDialogController::ShowAuthDialog` to // authenticate the currently active user using configured auth factors. ash::InSessionAuthDialogController::Get()->ShowAuthDialog( - ash::InSessionAuthDialogController::Reason::kAccessPasswordManager, - base::UTF16ToUTF8(message), + reason, base::UTF16ToUTF8(message), base::BindOnce(&OnAuthComplete, std::move(result_callback))); }
diff --git a/chrome/browser/device_reauth/chromeos/authenticator_chromeos.h b/chrome/browser/device_reauth/chromeos/authenticator_chromeos.h index 33ee0ded4..6a6b702 100644 --- a/chrome/browser/device_reauth/chromeos/authenticator_chromeos.h +++ b/chrome/browser/device_reauth/chromeos/authenticator_chromeos.h
@@ -7,6 +7,7 @@ #include "base/functional/callback.h" #include "base/functional/callback_forward.h" +#include "components/device_reauth/device_reauth_metrics_util.h" // Enum specifying possible states of biometric authentication availability on // ChromeOS. These values are persisted to logs. Entries should not be @@ -26,6 +27,7 @@ base::OnceCallback<void(BiometricsStatusChromeOS)>; virtual ~AuthenticatorChromeOSInterface() = default; virtual void AuthenticateUser(const std::u16string& message, + device_reauth::DeviceAuthSource source, base::OnceCallback<void(bool)> callback) = 0; virtual BiometricsStatusChromeOS CheckIfBiometricsAvailable() = 0; virtual void CheckIfPinIsAvailable( @@ -43,6 +45,7 @@ void AuthenticateUser( const std::u16string& message, + device_reauth::DeviceAuthSource source, base::OnceCallback<void(bool)> result_callback) override; // Returns the status for biometric authentication availability on the
diff --git a/chrome/browser/device_reauth/chromeos/device_authenticator_chromeos.cc b/chrome/browser/device_reauth/chromeos/device_authenticator_chromeos.cc index d6badcc..ad6b79b83 100644 --- a/chrome/browser/device_reauth/chromeos/device_authenticator_chromeos.cc +++ b/chrome/browser/device_reauth/chromeos/device_authenticator_chromeos.cc
@@ -20,7 +20,8 @@ : DeviceAuthenticatorCommon(proxy, params.GetAuthenticationValidityPeriod(), params.GetAuthResultHistogram()), - authenticator_(std::move(authenticator)) {} + authenticator_(std::move(authenticator)), + source_(params.GetDeviceAuthSource()) {} DeviceAuthenticatorChromeOS::~DeviceAuthenticatorChromeOS() = default; @@ -69,7 +70,7 @@ callback_ = std::move(callback); authenticator_->AuthenticateUser( - message, + message, source_, base::BindOnce(&DeviceAuthenticatorChromeOS::OnAuthenticationCompleted, weak_ptr_factory_.GetWeakPtr())); }
diff --git a/chrome/browser/device_reauth/chromeos/device_authenticator_chromeos.h b/chrome/browser/device_reauth/chromeos/device_authenticator_chromeos.h index 758aa3b..4e62944 100644 --- a/chrome/browser/device_reauth/chromeos/device_authenticator_chromeos.h +++ b/chrome/browser/device_reauth/chromeos/device_authenticator_chromeos.h
@@ -42,6 +42,11 @@ // Callback to be executed after the authentication completes. AuthenticateCallback callback_; + // Indicates the feature requesting the authentication (e.g., Autofill, + // Password Manager). This is used to determine the correct context and UI for + // the Ash in-session auth dialog. + const device_reauth::DeviceAuthSource source_; + // Factory for weak pointers to this class. base::WeakPtrFactory<DeviceAuthenticatorChromeOS> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/device_reauth/chromeos/device_authenticator_chromeos_unittest.cc b/chrome/browser/device_reauth/chromeos/device_authenticator_chromeos_unittest.cc index a59c0ae1..d229232d 100644 --- a/chrome/browser/device_reauth/chromeos/device_authenticator_chromeos_unittest.cc +++ b/chrome/browser/device_reauth/chromeos/device_authenticator_chromeos_unittest.cc
@@ -36,6 +36,7 @@ MOCK_METHOD(void, AuthenticateUser, (const std::u16string& message, + device_reauth::DeviceAuthSource source, base::OnceCallback<void(bool)> callback), (override)); MOCK_METHOD(BiometricsStatusChromeOS, @@ -98,7 +99,7 @@ void ExpectAuthenticationAndSetResult(bool result) { EXPECT_CALL(system_authenticator(), AuthenticateUser) - .WillOnce(testing::WithArg<1>([result](auto callback) { + .WillOnce(testing::WithArg<2>([result](auto callback) { base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, base::BindOnce(std::move(callback), /*auth_succeeded=*/result));
diff --git a/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc b/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc index 4c5f865a..157d0515 100644 --- a/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc +++ b/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc
@@ -2080,46 +2080,6 @@ } IN_PROC_BROWSER_TEST_F(DevToolsProtocolTest, - TargetCreateToFileUrlRequiresFileAccess) { - AttachToBrowserTarget(); - - base::DictValue params; - params.Set("url", "file:///some/path"); - SendCommandSync("Target.createTarget", params.Clone()); - EXPECT_TRUE(result()); - - DetachProtocolClient(); - SetMayReadLocalFiles(false); - - AttachToBrowserTarget(); - - SendCommandSync("Target.createTarget", params.Clone()); - ASSERT_TRUE(error()); - EXPECT_THAT(error()->FindInt("code"), - testing::Optional(-32000)); // SERVER_ERROR -} - -IN_PROC_BROWSER_TEST_F(DevToolsProtocolTest, - TargetCreateToViewSourceFileUrlRequiresFileAccess) { - AttachToBrowserTarget(); - - base::DictValue params; - params.Set("url", "view-source:file:///some/path"); - SendCommandSync("Target.createTarget", params.Clone()); - EXPECT_TRUE(result()); - - DetachProtocolClient(); - SetMayReadLocalFiles(false); - - AttachToBrowserTarget(); - - SendCommandSync("Target.createTarget", params.Clone()); - ASSERT_TRUE(error()); - EXPECT_THAT(error()->FindInt("code"), - testing::Optional(-32000)); // SERVER_ERROR -} - -IN_PROC_BROWSER_TEST_F(DevToolsProtocolTest, HiddenTargetIsNotVisibleInTabStrip) { AttachToBrowserTarget();
diff --git a/chrome/browser/devtools/protocol/target_handler.cc b/chrome/browser/devtools/protocol/target_handler.cc index 66c79d5..a80c171 100644 --- a/chrome/browser/devtools/protocol/target_handler.cc +++ b/chrome/browser/devtools/protocol/target_handler.cc
@@ -165,17 +165,12 @@ gurl = GURL(url::kAboutBlankURL); } - GURL inner_url = gurl; - if (gurl.SchemeIs(content::kViewSourceScheme)) { - inner_url = GURL(gurl.GetContent()); - } - - if (!is_trusted_ && inner_url.SchemeIs(content::kChromeUIUntrustedScheme)) { + if (!is_trusted_ && gurl.SchemeIs(content::kChromeUIUntrustedScheme)) { return protocol::Response::ServerError( "Refusing to create a target with the specified URL"); } - if (!may_read_local_files_ && inner_url.SchemeIsFile()) { + if (!may_read_local_files_ && gurl.SchemeIsFile()) { return protocol::Response::ServerError( "Creating a target with a local URL is not allowed"); }
diff --git a/chrome/browser/enterprise/connectors/reporting/realtime_reporting_client_unittest.cc b/chrome/browser/enterprise/connectors/reporting/realtime_reporting_client_unittest.cc index 3b24398..08f9041 100644 --- a/chrome/browser/enterprise/connectors/reporting/realtime_reporting_client_unittest.cc +++ b/chrome/browser/enterprise/connectors/reporting/realtime_reporting_client_unittest.cc
@@ -813,11 +813,15 @@ "Enterprise.ReportingEventUploadSuccess", EnterpriseReportingEventType::kSaasUsageReportEvent, 1); histogram_.ExpectTotalCount("Enterprise.ReportingEventUploadFailure", 0); + histogram_.ExpectTotalCount( + "Enterprise.ReportingEvent.SaasUsage.UploadSuccess.Duration", 1); } else { histogram_.ExpectUniqueSample( "Enterprise.ReportingEventUploadFailure", EnterpriseReportingEventType::kSaasUsageReportEvent, 1); histogram_.ExpectTotalCount("Enterprise.ReportingEventUploadSuccess", 0); + histogram_.ExpectTotalCount( + "Enterprise.ReportingEvent.SaasUsage.UploadFailure.Duration", 1); } }
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn index 9b3ee2c..34598b47 100644 --- a/chrome/browser/extensions/BUILD.gn +++ b/chrome/browser/extensions/BUILD.gn
@@ -694,6 +694,7 @@ if (enable_guest_view) { deps += [ + "//chrome/browser/guest_view", "//components/guest_view/browser", "//components/guest_view/common:mojom", ]
diff --git a/chrome/browser/extensions/api/identity/identity_apitest.cc b/chrome/browser/extensions/api/identity/identity_apitest.cc index 79991b5c..341160c 100644 --- a/chrome/browser/extensions/api/identity/identity_apitest.cc +++ b/chrome/browser/extensions/api/identity/identity_apitest.cc
@@ -295,13 +295,15 @@ break; } case MINT_TOKEN_FAILURE: { - GoogleServiceAuthError error(GoogleServiceAuthError::CONNECTION_FAILED); + GoogleServiceAuthError error = + GoogleServiceAuthError::FromConnectionError(net::ERR_FAILED); delegate_->OnMintTokenFailure(error); break; } case MINT_TOKEN_BAD_CREDENTIALS: { - GoogleServiceAuthError error( - GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); + GoogleServiceAuthError error = + GoogleServiceAuthError::FromInvalidGaiaCredentialsReason( + GoogleServiceAuthError::InvalidGaiaCredentialsReason::UNKNOWN); delegate_->OnMintTokenFailure(error); break; } @@ -439,8 +441,8 @@ GoogleServiceAuthError error = GoogleServiceAuthError::AuthErrorNone(); if (!login_access_token_result_) { access_token = std::nullopt; - error = GoogleServiceAuthError( - GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); + error = GoogleServiceAuthError::FromInvalidGaiaCredentialsReason( + GoogleServiceAuthError::InvalidGaiaCredentialsReason::UNKNOWN); } OnGetAccessTokenComplete(access_token, base::Time::Now() + base::Hours(1LL), error); @@ -2521,15 +2523,13 @@ RunFunctionAsync(func.get(), "[{}]"); run_loop.Run(); + GoogleServiceAuthError error = + GoogleServiceAuthError::FromServiceUnavailable(""); identity_test_env()->WaitForAccessTokenRequestIfNecessaryAndRespondWithError( - primary_account_id, - GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE)); + primary_account_id, error); - EXPECT_EQ( - std::string(errors::kAuthFailure) + - GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE) - .ToString(), - WaitForError(func.get())); + EXPECT_EQ(std::string(errors::kAuthFailure) + error.ToString(), + WaitForError(func.get())); histogram_tester()->ExpectUniqueSample( kGetAuthTokenResultHistogramName, IdentityGetAuthTokenError::State::kGetAccessTokenAuthFailure, 1);
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedListContentManager.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedListContentManager.java index e6720d2..a0fe3d4 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedListContentManager.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedListContentManager.java
@@ -181,6 +181,7 @@ /** * Clears existing handlers and sets current handlers to newHandlers. + * * @param newHandlers handlers to set. */ public void setHandlers(Map<String, Object> newHandlers) { @@ -445,6 +446,13 @@ mObservers.remove(observer); } + @Override + public void destroy() { + mObservers.clear(); + mFeedContentList.clear(); + mHandlers.clear(); + } + private @Nullable NativeViewContent findNativeViewByType(int viewType) { // Note: since there's relatively few native views, they're mostly at the front, a linear // search isn't terrible. This function is also called infrequently. @@ -456,4 +464,8 @@ } return null; } + + public boolean isObserversEmptyForTesting() { + return mObservers.isEmpty(); + } }
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedListContentManagerTest.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedListContentManagerTest.java index c73803f..eb78266 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedListContentManagerTest.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedListContentManagerTest.java
@@ -308,6 +308,23 @@ @Test @SmallTest + public void testDestroy() { + mManager.setHandlers(Map.of("HKEY1", "someHandler")); + FeedListContentManager.FeedContent c1 = createExternalViewContent("a"); + addContents(0, Arrays.asList(new FeedListContentManager.FeedContent[] {c1})); + assertEquals(1, mManager.getItemCount()); + assertEquals("someHandler", mManager.getContextValues(-1).get("HKEY1")); + assertFalse(mManager.isObserversEmptyForTesting()); + + mManager.destroy(); + + assertEquals(0, mManager.getItemCount()); + assertTrue(mManager.getContextValues(-1).isEmpty()); + assertTrue(mManager.isObserversEmptyForTesting()); + } + + @Test + @SmallTest public void testGetNativeViewAfterMove() { View v1 = new View(mContext); FeedListContentManager.FeedContent c1 = createNativeViewContent(v1);
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/NativeViewListRenderer.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/NativeViewListRenderer.java index 17ce3a7..6513cd37 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/NativeViewListRenderer.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/NativeViewListRenderer.java
@@ -102,6 +102,7 @@ onItemRangeRemoved(0, mManager.getItemCount()); mView.setAdapter(null); mView.setLayoutManager(null); + mManager.destroy(); mManager = null; }
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/SnapScrollHelper.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/SnapScrollHelper.java index 0fe63e3..93b3e177 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/SnapScrollHelper.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/SnapScrollHelper.java
@@ -31,4 +31,7 @@ * @return The modified scroll position that accounts for snap scroll. */ int calculateSnapPosition(int scrollPosition); + + /** Destroys the snap scroll helper and cleans up. */ + void destroy(); }
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index a90639a..410f325 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -696,6 +696,11 @@ "expiry_milestone": 126 }, { + "name": "assistant-side-panel", + "owners": [ "ewannpv@google.com", "bling-meridian@google.com" ], + "expiry_milestone": 153 + }, + { "name": "audio-ducking", "owners": ["steimel@chromium.org", "mfoltz@chromium.org"], "expiry_milestone": 150 @@ -1334,6 +1339,11 @@ "expiry_milestone": 150 }, { + "name": "browser-launch-metadata-reporting", + "owners": [ "qiutanw@google.com", "cbe-eng@google.com" ], + "expiry_milestone": 155 + }, + { "name": "browser-report-include-all-profiles", "owners": ["nicolaso@chromium.org", "zmin@chromium.org"], "expiry_milestone": 150 @@ -3075,11 +3085,6 @@ "expiry_milestone": 149 }, { - "name": "enable-clickjacking-protection", - "owners": [ "bkeen@google.com", "media-dev@chromium.org"], - "expiry_milestone": 155 - }, - { "name": "enable-client-certificate-provisioning-on-android", "owners": [ "eliashomsi@google.com", "cbe-cep-eng@google.com" ], "expiry_milestone": 145 @@ -3573,6 +3578,11 @@ "expiry_milestone": 160 }, { + "name": "enable-input-protection", + "owners": [ "bkeen@google.com", "media-dev@chromium.org"], + "expiry_milestone": 155 + }, + { "name": "enable-isolated-sandboxed-iframes", "owners": [ "wjmaclean@chromium.org", "alexmos@chromium.org", "creis@chromium.org" ], "expiry_milestone": 145 @@ -6946,11 +6956,6 @@ "expiry_milestone": 140 }, { - "name": "ntp-mia-entrypoint", - "owners": [ "radunitescu@google.com", "stkhapugin@chromium.org" ], - "expiry_milestone": 148 - }, - { "name": "ntp-microsoft-authentication-module", "owners": [ "pauladedeji@google.com", "rtatum@google.com", "tiborg@chromium.org" ], "expiry_milestone": 150 @@ -9147,16 +9152,6 @@ "expiry_milestone": 144 }, { - "name": "sys-ui-holdback-drive-integration", - "owners": ["newcomer@chromium.org"], - "expiry_milestone": 135 - }, - { - "name": "sys-ui-holdback-task-management", - "owners": ["newcomer@chromium.org"], - "expiry_milestone": 130 - }, - { "name": "system-keyboard-lock", "owners": [ "joedow@chromium.org", "garykac@chromium.org", "jamiewalch@chromium.org" ], // This flag allows users to prevent the keyboard-lock API from capturing @@ -10075,6 +10070,11 @@ "expiry_milestone": 150 }, { + "name": "webcrypto-pqc", + "owners": [ "hchao@chromium.org", "chrome-secure-web-and-net@chromium.org" ], + "expiry_milestone": 152 + }, + { "name": "webium", "owners": [ "robliao@chromium.org", "kerenzhu@chromium.org" ], "expiry_milestone": 150
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index c81ad76..36225cbb 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -1159,6 +1159,12 @@ inline constexpr char kBookmarkTabGroupConversionDescription[] = "Enable conversion between bookmark and tab group"; +inline constexpr char kBrowserLaunchMetadataReportingName[] = + "Browser launch metadata reporting"; +inline constexpr char kBrowserLaunchMetadataReportingDescription[] = + "Enables the collection and reporting of browser launch-related metadata " + "for Chrome Enterprise, including CLI switches and launch timestamp"; + inline constexpr char kBorealisBigGlName[] = "Borealis Big GL"; inline constexpr char kBorealisBigGlDescription[] = "Enable Big GL when running Borealis."; @@ -3998,12 +4004,6 @@ "This flag enables an additional browser-bound signature in secure payment " "confirmation in PaymentRequest and for WebAuthn payment credentials."; -inline constexpr char kSecurePaymentConfirmationFallbackName[] = - "Secure Payment Confirmation Fallback UX"; -inline constexpr char kSecurePaymentConfirmationFallbackDescription[] = - "Enable the fallback experience in Secure Payment Confirmation, where a " - "transaction dialog-like UX is shown even if no credentials match."; - inline constexpr char kSecurePaymentConfirmationUxRefreshName[] = "Secure Payment Confirmation UX Refresh"; inline constexpr char kSecurePaymentConfirmationUxRefreshDescription[] = @@ -4587,6 +4587,11 @@ "persistent storage of device permissions and Web Bluetooth features such " "as BluetoothDevice.watchAdvertisements() and Bluetooth.getDevices()"; +inline constexpr char kWebCryptoPQCName[] = "WebCrypto PQC"; +inline constexpr char kWebCryptoPQCDescription[] = + "Enables Post-Quantum Cryptography (PQC) algorithms (ML-DSA and ML-KEM) " + "and ChaCha20-Poly1305 in WebCrypto."; + inline constexpr char kWebiumName[] = "Webium"; inline constexpr char kWebiumDescription[] = "Webium Prototype Browser."; @@ -6102,20 +6107,19 @@ inline constexpr char kCastMirroringTargetPlayoutDelay350ms[] = "350ms."; inline constexpr char kCastMirroringTargetPlayoutDelay400ms[] = "400ms."; -inline constexpr char kEnableClickjackingProtectionName[] = - "Clickjacking protection"; -inline constexpr char kEnableClickjackingProtectionDescription[] = - "Enables clickjacking protection by blocking interaction with views that " - "are currently or were recently obscured by always-on-top windows, and " - "prevents unintended events on security-sensitive UI that appears and " - "activates unexpectedly."; - inline constexpr char kEnableHeadlessLiveCaptionName[] = "Headless Live Captions"; inline constexpr char kEnableHeadlessLiveCaptionDescription[] = "Enable features related to headless captions exploration. These are " "very likely unstable."; +inline constexpr char kEnableInputProtectionName[] = "Input protection"; +inline constexpr char kEnableInputProtectionDescription[] = + "Enables input protection by blocking interaction with views that are " + "currently or were recently obscured by always-on-top windows, and " + "prevents unintended events on security-sensitive UI that appears and " + "activates unexpectedly."; + inline constexpr char kHeadlessCaptionEarlyStartName[] = "Headless Caption Early Start"; inline constexpr char kHeadlessCaptionEarlyStartDescription[] = @@ -7855,16 +7859,6 @@ "Feature to allow MAC address randomization to be enabled for WiFi " "networks."; -inline constexpr char kSysUiShouldHoldbackDriveIntegrationName[] = - "Holdback for Drive Integration on chromeOS"; -inline constexpr char kSysUiShouldHoldbackDriveIntegrationDescription[] = - "Enables holdback for Drive Integration."; - -inline constexpr char kSysUiShouldHoldbackTaskManagementName[] = - "Holdback for Task Management on chromeOS"; -inline constexpr char kSysUiShouldHoldbackTaskManagementDescription[] = - "Enables holdback for Task Management."; - inline constexpr char kTetheringExperimentalFunctionalityName[] = "Tethering Allow Experimental Functionality"; inline constexpr char kTetheringExperimentalFunctionalityDescription[] =
diff --git a/chrome/browser/glic/BUILD.gn b/chrome/browser/glic/BUILD.gn index fd207158..83719a3 100644 --- a/chrome/browser/glic/BUILD.gn +++ b/chrome/browser/glic/BUILD.gn
@@ -354,6 +354,7 @@ "//chrome/browser/contextual_cueing", "//chrome/browser/feedback", "//chrome/browser/glic/actor", + "//chrome/browser/glic/browser_ui", "//chrome/browser/glic/common", "//chrome/browser/glic/fre", "//chrome/browser/glic/media", @@ -414,7 +415,6 @@ # Many of these deps will be needed in Android, but are not yet supported. deps += [ "//chrome/browser/actor/ui", - "//chrome/browser/glic/browser_ui", "//chrome/browser/glic/selection", "//chrome/browser/lens/region_search", "//chrome/browser/themes",
diff --git a/chrome/browser/glic/browser_ui/BUILD.gn b/chrome/browser/glic/browser_ui/BUILD.gn index 9293ac15..8f8cf829 100644 --- a/chrome/browser/glic/browser_ui/BUILD.gn +++ b/chrome/browser/glic/browser_ui/BUILD.gn
@@ -4,54 +4,73 @@ import("//chrome/common/features.gni") -if (!is_android) { - source_set("browser_ui") { - sources = [ +# No absolute !is_android wrapper for the whole file. + +source_set("browser_ui") { + sources = [ + "glic_nudge_controller.h", + "glic_nudge_delegate.h", + ] + if (!is_android) { + sources += [ "glic_button_controller.h", "glic_iph_controller.h", - "glic_nudge_controller.h", - "glic_nudge_delegate.h", "glic_selection_widget.h", "glic_tab_indicator_helper.h", "glic_vector_icon_manager.h", "scoped_glic_button_indicator.h", ] - public_deps = [ - "//chrome/browser/glic", - "//chrome/browser/glic:mojo_bindings", - ] - deps = [ - "//base", - "//components/keyed_service/core", - ] } - source_set("impl") { - sources = [ + public_deps = [ + "//chrome/browser/glic", + "//chrome/browser/glic:mojo_bindings", + "//chrome/browser/tab_list", + ] + deps = [ + "//base", + "//components/keyed_service/core", + ] +} + +source_set("impl") { + sources = [ + "glic_nudge_controller.cc", + "glic_nudge_delegate.cc", + ] + if (!is_android) { + sources += [ "glic_button_controller.cc", "glic_iph_controller.cc", - "glic_nudge_controller.cc", - "glic_nudge_delegate.cc", "glic_selection_widget.cc", "glic_tab_indicator_helper.cc", "glic_vector_icon_manager.cc", "scoped_glic_button_indicator.cc", ] - deps = [ - ":browser_ui", + } + + deps = [ + ":browser_ui", + "//chrome/browser/tab_list", + "//chrome/browser/ui/call_to_action", + "//components/feature_engagement/public", + ] + + if (!is_android) { + deps += [ "//chrome/browser/actor/ui", "//chrome/browser/glic/fre", "//chrome/browser/themes", - "//chrome/browser/ui/call_to_action", "//chrome/browser/ui/tabs:tab_strip", "//chrome/browser/ui/user_education", "//chrome/browser/ui/views/tabs/glic", - "//components/feature_engagement/public", ] - - public_deps = [ "//chrome/browser/glic" ] } + public_deps = [ "//chrome/browser/glic" ] +} + +if (!is_android) { source_set("glow_controller") { sources = [ "context_sharing_border_view_controller_impl.h",
diff --git a/chrome/browser/glic/browser_ui/glic_nudge_controller.cc b/chrome/browser/glic/browser_ui/glic_nudge_controller.cc index eb660867..3fb24d9 100644 --- a/chrome/browser/glic/browser_ui/glic_nudge_controller.cc +++ b/chrome/browser/glic/browser_ui/glic_nudge_controller.cc
@@ -10,20 +10,23 @@ #include "chrome/browser/glic/public/glic_keyed_service.h" #include "chrome/browser/glic/public/glic_keyed_service_factory.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/browser_window/public/browser_window_interface.h" +#include "chrome/browser/tab_list/tab_list_interface.h" #include "chrome/browser/ui/call_to_action/call_to_action_lock.h" -#include "chrome/browser/ui/tabs/vertical_tab_strip_state_controller.h" #include "components/prefs/pref_service.h" #include "content/public/browser/web_contents.h" +#if !BUILDFLAG(IS_ANDROID) +#include "chrome/browser/ui/tabs/vertical_tab_strip_state_controller.h" +#endif + namespace glic { GlicNudgeController::GlicNudgeController( - BrowserWindowInterface* browser_window_interface) - : browser_window_interface_(browser_window_interface) { - browser_subscriptions_.push_back( - browser_window_interface->RegisterActiveTabDidChange(base::BindRepeating( - &GlicNudgeController::OnActiveTabChanged, base::Unretained(this)))); + BrowserWindowInterface* browser_window_interface, + TabListInterface* tab_list) + : browser_window_interface_(browser_window_interface), tab_list_(tab_list) { + CHECK(tab_list_); + tab_list_observation_.Observe(tab_list); } GlicNudgeController::~GlicNudgeController() = default; @@ -35,15 +38,16 @@ const std::string& anchored_message_text, std::optional<GlicNudgeActivity> activity, GlicNudgeActivityCallback callback) { - auto* const tab_interface = - browser_window_interface_->GetActiveTabInterface(); - if (tab_interface->GetContents() != web_contents) { - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, - base::BindOnce(std::move(callback), - GlicNudgeActivity::kNudgeNotShownWebContents)); - return; + if (auto* active_tab = tab_list_->GetActiveTab()) { + if (active_tab->GetContents() != web_contents) { + base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, + base::BindOnce(std::move(callback), + GlicNudgeActivity::kNudgeNotShownWebContents)); + return; + } } + // Empty nudge labels close the nudge, allow those to bypass the // CanAcquireLock check. if (!nudge_label.empty() && !scoped_call_to_action_lock_ && @@ -138,8 +142,8 @@ nudge_activity_callback_ = base::DoNothing(); } -void GlicNudgeController::OnActiveTabChanged( - BrowserWindowInterface* browser_interface) { +void GlicNudgeController::OnActiveTabChanged(TabListInterface& tab_list, + tabs::TabInterface* tab) { GlicNudgeDelegate* delegate = GetActiveDelegate(); if (delegate && delegate->GetIsShowingGlicNudge()) { delegate->OnHideGlicNudgeUI(); @@ -148,6 +152,7 @@ } GlicNudgeDelegate* GlicNudgeController::GetActiveDelegate() { +#if !BUILDFLAG(IS_ANDROID) auto* vertical_tab_strip_state_controller = tabs::VerticalTabStripStateController::From(browser_window_interface_); @@ -156,6 +161,9 @@ ->ShouldDisplayVerticalTabs() ? toolbar_delegate_ : tab_strip_delegate_; +#else + return tab_strip_delegate_; +#endif } } // namespace glic
diff --git a/chrome/browser/glic/browser_ui/glic_nudge_controller.h b/chrome/browser/glic/browser_ui/glic_nudge_controller.h index 31cb875..e18e558 100644 --- a/chrome/browser/glic/browser_ui/glic_nudge_controller.h +++ b/chrome/browser/glic/browser_ui/glic_nudge_controller.h
@@ -4,12 +4,14 @@ #ifndef CHROME_BROWSER_GLIC_BROWSER_UI_GLIC_NUDGE_CONTROLLER_H_ #define CHROME_BROWSER_GLIC_BROWSER_UI_GLIC_NUDGE_CONTROLLER_H_ -#include "base/callback_list.h" #include "base/memory/raw_ptr.h" -#include "base/types/pass_key.h" +#include "base/scoped_observation.h" #include "chrome/browser/glic/browser_ui/glic_nudge_delegate.h" +#include "chrome/browser/tab_list/tab_list_interface.h" +#include "chrome/browser/tab_list/tab_list_interface_observer.h" #include "components/keyed_service/core/keyed_service.h" +class TabListInterface; class BrowserWindowInterface; class ScopedCallToActionLock; @@ -34,16 +36,16 @@ // Controller that mediates Glic Nudges and ensures that only the active tab is // targeted. -class GlicNudgeController { +class GlicNudgeController : public TabListInterfaceObserver { public: using GlicNudgeActivityCallback = base::RepeatingCallback<void(GlicNudgeActivity)>; - explicit GlicNudgeController( - BrowserWindowInterface* browser_window_interface); + explicit GlicNudgeController(BrowserWindowInterface* browser_window_interface, + TabListInterface* tab_list); GlicNudgeController(const GlicNudgeController&) = delete; GlicNudgeController& operator=(const GlicNudgeController& other) = delete; - virtual ~GlicNudgeController(); + ~GlicNudgeController() override; void SetTabStripDelegate(GlicNudgeDelegate* delegate) { tab_strip_delegate_ = delegate; @@ -74,14 +76,14 @@ void ClearPromptSuggestion() { prompt_suggestion_.reset(); } private: - // Called when the active tab changes, to update the nudge UI appropriate for - // the tab. - void OnActiveTabChanged(BrowserWindowInterface* browser_interface); + // TabListInterfaceObserver: + void OnActiveTabChanged(TabListInterface& tab_list, + tabs::TabInterface* tab) override; GlicNudgeDelegate* GetActiveDelegate(); - // The BrowserWindowInterface that owns `this`. const raw_ptr<BrowserWindowInterface> browser_window_interface_; + const raw_ptr<TabListInterface> tab_list_; raw_ptr<GlicNudgeDelegate> tab_strip_delegate_ = nullptr; raw_ptr<GlicNudgeDelegate> toolbar_delegate_ = nullptr; @@ -92,7 +94,8 @@ // Callback to invoke for user actions on the nudge. GlicNudgeActivityCallback nudge_activity_callback_; - std::vector<base::CallbackListSubscription> browser_subscriptions_; + base::ScopedObservation<TabListInterface, TabListInterfaceObserver> + tab_list_observation_{this}; std::unique_ptr<ScopedCallToActionLock> scoped_call_to_action_lock_; };
diff --git a/chrome/browser/glic/host/OWNERS b/chrome/browser/glic/host/OWNERS index b3f0d06f..fd60d66 100644 --- a/chrome/browser/glic/host/OWNERS +++ b/chrome/browser/glic/host/OWNERS
@@ -10,6 +10,8 @@ per-file glic_annotation_manager*=adithyas@chromium.org +per-file glic_internals*=file://chrome/browser/glic/API_OWNERS + per-file *.mojom=set noparent per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chrome/browser/glic/host/glic.mojom b/chrome/browser/glic/host/glic.mojom index 1612d6a..74f2b44 100644 --- a/chrome/browser/glic/host/glic.mojom +++ b/chrome/browser/glic/host/glic.mojom
@@ -769,6 +769,8 @@ SkillSource source; // The description of the skill. string description; + // The image URL to use when rendering this skill. + url.mojom.Url? image_url; }; // A single skill. @@ -1328,6 +1330,10 @@ // Called when the user receives a response with closed captions showing. OnClosedCaptionsShown(); + // Called when the web client sends a browser actuation result over the + // network. + OnActionSubmitted(bool is_retry); + // Scrolls to and (optionally) highlights content specified by `params`. Only // one highlight is active at a time. Returns an error reason if the scroll // fails, or null otherwise.
diff --git a/chrome/browser/glic/host/glic_api_browsertest.cc b/chrome/browser/glic/host/glic_api_browsertest.cc index 7a188adb..9b1a811 100644 --- a/chrome/browser/glic/host/glic_api_browsertest.cc +++ b/chrome/browser/glic/host/glic_api_browsertest.cc
@@ -3977,17 +3977,20 @@ std::vector<mojom::SkillPreviewPtr> skills_batch_1; skills_batch_1.push_back(mojom::SkillPreview::New( "contextual_skill_id_1", "contextual_skill_1", "contextual_skill_icon_1", - mojom::SkillSource::kFirstParty, "contextual_skill_description_1")); + mojom::SkillSource::kFirstParty, "contextual_skill_description_1", + /*image_url=*/GURL("https://example.com"))); skills_batch_1.push_back(mojom::SkillPreview::New( "contextual_skill_id_2", "contextual_skill_2", "contextual_skill_icon_2", - mojom::SkillSource::kFirstParty, "contextual_skill_description_2")); + mojom::SkillSource::kFirstParty, "contextual_skill_description_2", + /*image_url=*/GURL("https://example.com"))); GetHost()->NotifyContextualSkillsChanged(std::move(skills_batch_1)); ContinueJsTest(); std::vector<mojom::SkillPreviewPtr> skills_batch_2; skills_batch_2.push_back(mojom::SkillPreview::New( "contextual_skill_id_3", "contextual_skill_3", "contextual_skill_icon_3", - mojom::SkillSource::kFirstParty, "contextual_skill_description_3")); + mojom::SkillSource::kFirstParty, "contextual_skill_description_3", + /*image_url=*/GURL("https://example.com"))); GetHost()->NotifyContextualSkillsChanged(std::move(skills_batch_2)); ContinueJsTest(); }
diff --git a/chrome/browser/glic/host/glic_page_handler.cc b/chrome/browser/glic/host/glic_page_handler.cc index 1a4c3ad..c7ac661 100644 --- a/chrome/browser/glic/host/glic_page_handler.cc +++ b/chrome/browser/glic/host/glic_page_handler.cc
@@ -222,9 +222,9 @@ } mojom::SkillPreviewPtr ToMojomSkillPreview(const skills::proto::Skill& skill) { - return mojom::SkillPreview::New(skill.id(), skill.name(), skill.icon(), - mojom::SkillSource::kFirstParty, - skill.description()); + return mojom::SkillPreview::New( + skill.id(), skill.name(), skill.icon(), mojom::SkillSource::kFirstParty, + skill.description(), /*image_url=*/std::nullopt); } // Monitors the panel state and the browser widget state. Emits an event any @@ -1316,6 +1316,7 @@ // directly in skills::Skill.. skills::Skill skill(request->id, request->name, request->icon, request->prompt, request->description, + /*image_url=*/GURL(), skills::GlicMojomToSyncPbSkillSource(request->source)); host().skills_manager().LaunchSkillsDialog( profile_, std::move(skill), skills::mojom::SkillsDialogType::kAdd, @@ -1730,6 +1731,10 @@ glic_service_->metrics()->LogClosedCaptionsShown(); } + void OnActionSubmitted(bool is_retry) override { + host().instance_metrics()->OnActionSubmitted(is_retry); + } + void ScrollTo(mojom::ScrollToParamsPtr params, ScrollToCallback callback) override { if (!base::FeatureList::IsEnabled(features::kGlicScrollTo)) {
diff --git a/chrome/browser/glic/media/BUILD.gn b/chrome/browser/glic/media/BUILD.gn index 8d37c55..d844009 100644 --- a/chrome/browser/glic/media/BUILD.gn +++ b/chrome/browser/glic/media/BUILD.gn
@@ -29,7 +29,6 @@ "media_transcript_provider_impl.h", ] deps += [ - "//chrome/browser:browser_process", "//chrome/browser/glic:mojo_bindings", "//chrome/browser/media/webrtc", "//chrome/browser/picture_in_picture",
diff --git a/chrome/browser/glic/media/glic_media_integration.cc b/chrome/browser/glic/media/glic_media_integration.cc index 31b4b719..c213a9d 100644 --- a/chrome/browser/glic/media/glic_media_integration.cc +++ b/chrome/browser/glic/media/glic_media_integration.cc
@@ -13,7 +13,6 @@ #include "chrome/browser/glic/public/glic_keyed_service.h" #include "chrome/browser/picture_in_picture/picture_in_picture_window_manager.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/browser_process.h" #include "components/live_caption/caption_controller_base.h" #include "components/live_caption/caption_util.h" #include "components/live_caption/live_caption_controller.h" @@ -136,7 +135,6 @@ protected: void Initialize(); void OnConsentChanged(); - void MaybeInstallSoda(); raw_ptr<Profile> profile_; // Don't let the transcript grow unbounded. @@ -216,8 +214,6 @@ // Live Caption controller, since it resets the pref to false. profile_->GetPrefs()->SetBoolean(prefs::kHeadlessCaptionEnabled, true); - MaybeInstallSoda(); - // Default to turning off for YT. std::vector<url::Origin> excluded_origins = { url::Origin::Create(GURL("https://www.youtube.com")), @@ -225,18 +221,6 @@ SetExcludedOrigins(std::move(excluded_origins)); } -void GlicMediaIntegrationImpl::MaybeInstallSoda() { - const auto language_code = - prefs::GetLiveCaptionLanguageCode(profile_->GetPrefs()); - auto* soda_installer = speech::SodaInstaller::GetInstance(); - // Only trigger an install when the language is not already installed. - if (!soda_installer->IsSodaInstalled( - speech::GetLanguageCode(language_code))) { - soda_installer->InstallLanguage(language_code, - g_browser_process->local_state()); - } -} - bool GlicMediaIntegrationImpl::IsExcludedByOrigin( content::WebContents* web_contents) { content::RenderFrameHost* rfh = web_contents->GetPrimaryMainFrame();
diff --git a/chrome/browser/glic/media/glic_media_integration_unittest.cc b/chrome/browser/glic/media/glic_media_integration_unittest.cc index af99e9f..d48af1e 100644 --- a/chrome/browser/glic/media/glic_media_integration_unittest.cc +++ b/chrome/browser/glic/media/glic_media_integration_unittest.cc
@@ -153,13 +153,11 @@ static_cast<int>(glic::prefs::FreStatus::kCompleted)); } - protected: - speech::MockSodaInstaller soda_installer_; - private: std::optional<base::test::ScopedFeatureList> scoped_feature_list_; raw_ptr<captions::LiveCaptionController> live_caption_controller_ = nullptr; raw_ptr<user_prefs::PrefRegistrySyncable> pref_registry_ = nullptr; + speech::MockSodaInstaller soda_installer_; }; TEST_F(GlicMediaIntegrationTest, GetWithNullReturnsNull) { @@ -475,22 +473,4 @@ EXPECT_FALSE(root_node.has_content_attributes()); } -TEST_F(GlicMediaIntegrationTest, InstallsSodaIfMissing) { - // SODA is not installed by default in this test setup. - EXPECT_CALL(soda_installer_, InstallLanguage(testing::_, testing::_)); - GetIntegration(); -} - -TEST_F(GlicMediaIntegrationTest, DoesNotInstallSodaIfPresent) { - // Mark SODA as installed. - const std::string language_code = - ::prefs::GetLiveCaptionLanguageCode(pref_service()); - soda_installer_.NotifySodaInstalledForTesting(speech::LanguageCode::kNone); - soda_installer_.NotifySodaInstalledForTesting( - speech::GetLanguageCode(language_code)); - - EXPECT_CALL(soda_installer_, InstallLanguage(testing::_, testing::_)).Times(0); - GetIntegration(); -} - } // namespace glic
diff --git a/chrome/browser/glic/public/glic_keyed_service.cc b/chrome/browser/glic/public/glic_keyed_service.cc index 704d851..abf1cd8 100644 --- a/chrome/browser/glic/public/glic_keyed_service.cc +++ b/chrome/browser/glic/public/glic_keyed_service.cc
@@ -275,6 +275,12 @@ // This is only used by automation for tests. glic_profile_manager->MaybeAutoOpenGlicPanel(); + base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, base::BindOnce(&GlicKeyedService::InitializeAfterConstruction, + GetWeakPtr())); +} + +void GlicKeyedService::InitializeAfterConstruction() { #if !BUILDFLAG(IS_ANDROID) if (base::FeatureList::IsEnabled(media::kHeadlessCaptionEarlyStart)) { GlicMediaIntegration::GetFor(profile_);
diff --git a/chrome/browser/glic/public/glic_keyed_service.h b/chrome/browser/glic/public/glic_keyed_service.h index 3489453..9d2ef38fb 100644 --- a/chrome/browser/glic/public/glic_keyed_service.h +++ b/chrome/browser/glic/public/glic_keyed_service.h
@@ -435,6 +435,8 @@ bool auto_send, std::optional<std::string> conversation_id); + void InitializeAfterConstruction(); + void FinishPreload(GlicPrewarmingChecksResult reason); // List of callbacks to be notified when the client requests a change to the
diff --git a/chrome/browser/glic/selection/selection_overlay_controller.cc b/chrome/browser/glic/selection/selection_overlay_controller.cc index c105d7f..6602eac 100644 --- a/chrome/browser/glic/selection/selection_overlay_controller.cc +++ b/chrome/browser/glic/selection/selection_overlay_controller.cc
@@ -13,15 +13,18 @@ #include "chrome/browser/ui/webui/webui_embedding_context.h" #include "chrome/common/webui_url_constants.h" #include "chrome/grit/generated_resources.h" +#include "components/input/native_web_keyboard_event.h" #include "components/viz/common/frame_sinks/copy_output_result.h" #include "content/public/browser/render_view_host.h" #include "third_party/blink/public/mojom/content_extraction/ai_page_content.mojom.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkPaint.h" #include "third_party/skia/include/effects/SkDashPathEffect.h" +#include "ui/events/keycodes/keyboard_codes.h" #include "ui/gfx/codec/jpeg_codec.h" #include "ui/gfx/geometry/rect_conversions.h" #include "ui/gfx/geometry/skia_conversions.h" +#include "ui/views/controls/webview/webview.h" // TODO(http://b/485358530): Consider `OverlayBaseController::State` to the // mojom file so the << operator is auto generated. @@ -62,6 +65,11 @@ region.width() * x_scale, region.height() * y_scale); } +bool IsEscapeEvent(const input::NativeWebKeyboardEvent& event) { + return event.GetType() == input::NativeWebKeyboardEvent::Type::kRawKeyDown && + event.windows_key_code == ui::VKEY_ESCAPE; +} + class SelectionOverlayFetchPageProgressListener : public page_content_annotations::FetchPageProgressListener { public: @@ -210,6 +218,24 @@ page_->ScreenshotReceived(initial_rgb_screenshot_); } +bool SelectionOverlayController::HandleKeyboardEvent( + content::WebContents* source, + const input::NativeWebKeyboardEvent& event) { + if (!overlay_web_view_ || state() != State::kOverlay) { + return false; + } + views::FocusManager* focus_manager = overlay_web_view_->GetFocusManager(); + if (!focus_manager) { + return false; + } + if (IsEscapeEvent(event)) { + CloseUI(); + return true; + } + return unhandled_keyboard_event_handler_.HandleKeyboardEvent(event, + focus_manager); +} + void SelectionOverlayController::StartScreenshotFlow() { auto options = mojom::GetTabContextOptions::New(); options->include_viewport_screenshot = true;
diff --git a/chrome/browser/glic/selection/selection_overlay_controller.h b/chrome/browser/glic/selection/selection_overlay_controller.h index df35cf8..8eae7a9 100644 --- a/chrome/browser/glic/selection/selection_overlay_controller.h +++ b/chrome/browser/glic/selection/selection_overlay_controller.h
@@ -20,6 +20,15 @@ #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" #include "ui/base/unowned_user_data/scoped_unowned_user_data.h" +#include "ui/views/controls/webview/unhandled_keyboard_event_handler.h" + +namespace content { +class WebContents; +} + +namespace input { +struct NativeWebKeyboardEvent; +} namespace glic { @@ -80,6 +89,10 @@ void InitializeOverlay(); + // `content::WebContentsDelegate`: + bool HandleKeyboardEvent(content::WebContents* source, + const input::NativeWebKeyboardEvent& event) override; + // OverlayBaseController overrides: void CloseUI() override; void RequestSyncClose(DismissalSource dismissal_source) override; @@ -149,6 +162,8 @@ // Holds subscriptions for TabInterface callbacks. std::vector<base::CallbackListSubscription> tab_subscriptions_; + views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_; + // Must be the last member. base::WeakPtrFactory<SelectionOverlayController> weak_factory_{this}; };
diff --git a/chrome/browser/glic/selection/selection_overlay_interactive_uitests.cc b/chrome/browser/glic/selection/selection_overlay_interactive_uitests.cc index 9313da1..f34455e7 100644 --- a/chrome/browser/glic/selection/selection_overlay_interactive_uitests.cc +++ b/chrome/browser/glic/selection/selection_overlay_interactive_uitests.cc
@@ -67,4 +67,23 @@ WaitForHide(OverlayBaseController::kOverlayId)); } +IN_PROC_BROWSER_TEST_F(SelectionOverlayInteractiveTest, OverlayDismissedOnEsc) { + DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kActiveTab); + DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kOverlayWebContentsId); + + RunTestSequence( + InstrumentTab(kActiveTab), OpenGlic(), + ClickMockGlicElement({"#captureRegionBtn"}), + WaitForShow(OverlayBaseController::kOverlayId), + InstrumentNonTabWebView(kOverlayWebContentsId, + OverlayBaseController::kOverlayId), + WaitForJsResultAt(kOverlayWebContentsId, {"selection-overlay-app"}, + "el => el.screenshot_ !== null"), + // glic-selection-overlay is expected to be displayed. + WaitForElementVisible(kOverlayWebContentsId, {"selection-overlay-app", + "glic-selection-overlay"}), + SendKeyPress(OverlayBaseController::kOverlayId, ui::VKEY_ESCAPE), + WaitForHide(OverlayBaseController::kOverlayId)); +} + } // namespace glic
diff --git a/chrome/browser/glic/service/metrics/glic_instance_metrics.cc b/chrome/browser/glic/service/metrics/glic_instance_metrics.cc index 618f867..fc0eb05 100644 --- a/chrome/browser/glic/service/metrics/glic_instance_metrics.cc +++ b/chrome/browser/glic/service/metrics/glic_instance_metrics.cc
@@ -65,6 +65,9 @@ } // namespace +GlicInstanceMetrics::TurnInfo::TurnInfo() = default; +GlicInstanceMetrics::TurnInfo::~TurnInfo() = default; + GlicInstanceMetrics::GlicInstanceMetrics() : session_manager_(this) { // Used in the unit tests. base::RecordAction(base::UserMetricsAction("Glic.Instance.Created")); @@ -790,8 +793,17 @@ base::RecordAction(base::UserMetricsAction("GlicResponseStart")); turn_.response_started_ = true; - // It doesn't make sense to record response start without input submission. - if (turn_.input_submitted_time_.is_null()) { + bool is_response_for_actuation = + !turn_.action_result_submitted_time_.is_null(); + if (is_response_for_actuation) { + base::UmaHistogramMediumTimes( + "Glic.Turn.Actuation.ResponseStartTime", + base::TimeTicks::Now() - turn_.action_result_submitted_time_); + } + + // It doesn't make sense to record response start without input submission, + // unless we just submitted an actuation result. + if (turn_.input_submitted_time_.is_null() && !is_response_for_actuation) { base::UmaHistogramEnumeration( "Glic.Instance.Metrics.Error", GlicInstanceMetricsError::kResponseStartWithoutInput); @@ -807,20 +819,22 @@ base::RecordAction(base::UserMetricsAction("GlicResponse")); - base::TimeDelta start_time = - base::TimeTicks::Now() - turn_.input_submitted_time_; - base::UmaHistogramMediumTimes("Glic.Turn.ResponseStartTime", start_time); - std::string_view mode_string = GetInputModeString(input_mode_); - base::UmaHistogramMediumTimes( - base::StrCat({"Glic.Turn.ResponseStartTime.InputMode.", mode_string}), - start_time); + if (!turn_.input_submitted_time_.is_null()) { + base::TimeDelta start_time = + base::TimeTicks::Now() - turn_.input_submitted_time_; + base::UmaHistogramMediumTimes("Glic.Turn.ResponseStartTime", start_time); + std::string_view mode_string = GetInputModeString(input_mode_); + base::UmaHistogramMediumTimes( + base::StrCat({"Glic.Turn.ResponseStartTime.InputMode.", mode_string}), + start_time); - if (turn_.did_request_context_) { - base::UmaHistogramMediumTimes("Glic.Turn.ResponseStartTime.WithContext", - start_time); - } else { - base::UmaHistogramMediumTimes("Glic.Turn.ResponseStartTime.WithoutContext", - start_time); + if (turn_.did_request_context_) { + base::UmaHistogramMediumTimes("Glic.Turn.ResponseStartTime.WithContext", + start_time); + } else { + base::UmaHistogramMediumTimes( + "Glic.Turn.ResponseStartTime.WithoutContext", start_time); + } } ukm::builders::Glic_Response(turn_.chosen_source_id_) @@ -832,9 +846,13 @@ void GlicInstanceMetrics::OnResponseStopped(mojom::ResponseStopCause cause) { LogEvent(GlicInstanceEvent::kResponseStopped); + + bool has_input = !turn_.input_submitted_time_.is_null(); + bool has_action_result = !turn_.action_result_submitted_time_.is_null(); + // The client may call "stopped" without "started" for very short responses. // We synthetically call it ourselves in this case. - if (!turn_.input_submitted_time_.is_null() && !turn_.response_started_) { + if ((has_input || has_action_result) && !turn_.response_started_) { OnResponseStarted(); } @@ -856,7 +874,7 @@ break; } - if (turn_.input_submitted_time_.is_null()) { + if (!has_input && !has_action_result) { base::UmaHistogramEnumeration( "Glic.Instance.Metrics.Error", GlicInstanceMetricsError::kResponseStopWithoutInput); @@ -865,9 +883,20 @@ GlicInstanceMetricsError::kResponseStopWithoutInput); } else { base::TimeTicks now = base::TimeTicks::Now(); - base::TimeDelta latency = now - turn_.input_submitted_time_; - base::UmaHistogramMediumTimes( - base::StrCat({"Glic.Turn.ResponseStopTime", cause_suffix}), latency); + base::TimeDelta latency; + if (has_input) { + latency = now - turn_.input_submitted_time_; + base::UmaHistogramMediumTimes("Glic.Turn.ResponseStopTime", latency); + base::UmaHistogramMediumTimes( + base::StrCat({"Glic.Turn.ResponseStopTime", cause_suffix}), latency); + } else if (has_action_result) { + latency = now - turn_.action_result_submitted_time_; + base::UmaHistogramMediumTimes("Glic.Turn.Actuation.ResponseStopTime", + latency); + base::UmaHistogramMediumTimes( + base::StrCat({"Glic.Turn.Actuation.ResponseStopTime", cause_suffix}), + latency); + } RecordResponseLatencyByAttachedTabCount(latency); } @@ -971,6 +1000,11 @@ } } +void GlicInstanceMetrics::OnActionSubmitted(bool is_retry) { + turn_.action_result_submitted_time_ = base::TimeTicks::Now(); + base::UmaHistogramBoolean("Glic.Turn.Actuation.IsRetry", is_retry); +} + void GlicInstanceMetrics::OnSessionStarted() { session_count_++;
diff --git a/chrome/browser/glic/service/metrics/glic_instance_metrics.h b/chrome/browser/glic/service/metrics/glic_instance_metrics.h index 2f8e6f3..51196a12 100644 --- a/chrome/browser/glic/service/metrics/glic_instance_metrics.h +++ b/chrome/browser/glic/service/metrics/glic_instance_metrics.h
@@ -277,6 +277,10 @@ // metrics funnels. void RecordSkillsWebClientEvent(mojom::SkillsWebClientEvent action); + // Called when the web client sends a browser actuation result over the + // network. + void OnActionSubmitted(bool is_retry); + int GetPinnedTabCount() const; bool is_active() const { @@ -296,7 +300,11 @@ // Stores info scoped to the current turn. These members are cleared in // OnResponseStopped. struct TurnInfo { + TurnInfo(); + ~TurnInfo(); + base::TimeTicks input_submitted_time_; + base::TimeTicks action_result_submitted_time_; // Set to true in OnResponseStarted() and set to false in // OnResponseStopped(). This is a workaround copied from GlicMetrics and // should be removed, see crbug.com/399151164.
diff --git a/chrome/browser/glic/service/metrics/glic_instance_metrics_unittest.cc b/chrome/browser/glic/service/metrics/glic_instance_metrics_unittest.cc index b49357e..1540581 100644 --- a/chrome/browser/glic/service/metrics/glic_instance_metrics_unittest.cc +++ b/chrome/browser/glic/service/metrics/glic_instance_metrics_unittest.cc
@@ -72,6 +72,15 @@ GlicInstanceMetricsError::kResponseStartWithoutInput, 1); } +TEST_F(GlicInstanceMetricsTest, + OnResponseStarted_WithActuation_DoesNotLogError) { + metrics_.OnActionSubmitted(/*is_retry=*/false); + metrics_.OnResponseStarted(); + histogram_tester_.ExpectBucketCount( + "Glic.Instance.Metrics.Error", + GlicInstanceMetricsError::kResponseStartWithoutInput, 0); +} + TEST_F(GlicInstanceMetricsTest, OnResponseStarted_WhileHidden_LogsError) { metrics_.OnVisibilityChanged(true); metrics_.OnUserInputSubmitted(mojom::WebClientMode::kText); @@ -114,6 +123,15 @@ GlicInstanceMetricsError::kResponseStopWithoutInput, 1); } +TEST_F(GlicInstanceMetricsTest, + OnResponseStopped_WithActuation_DoesNotLogError) { + metrics_.OnActionSubmitted(/*is_retry=*/false); + metrics_.OnResponseStopped(mojom::ResponseStopCause::kUser); + histogram_tester_.ExpectBucketCount( + "Glic.Instance.Metrics.Error", + GlicInstanceMetricsError::kResponseStopWithoutInput, 0); +} + TEST_F(GlicInstanceMetricsTest, OnFloatyClosed_WithoutOpening_LogsError) { metrics_.OnFloatyClosed(); histogram_tester_.ExpectUniqueSample( @@ -442,6 +460,34 @@ EXPECT_EQ(1, user_action_tester_.GetActionCount("GlicResponseStopByUser")); } +TEST_F(GlicInstanceMetricsTest, ActuationIsRetry) { + metrics_.OnActionSubmitted(true); + histogram_tester_.ExpectUniqueSample("Glic.Turn.Actuation.IsRetry", true, 1); + + metrics_.OnActionSubmitted(false); + histogram_tester_.ExpectBucketCount("Glic.Turn.Actuation.IsRetry", false, 1); + histogram_tester_.ExpectTotalCount("Glic.Turn.Actuation.IsRetry", 2); +} + +TEST_F(GlicInstanceMetricsTest, ActuationResponseStopTime) { + metrics_.OnVisibilityChanged(true); + + // Submit an action result which sets up the actuation timing. + metrics_.OnActionSubmitted(false); + + // Advance time so we have a non-zero measurable latency. + task_environment_.FastForwardBy(base::Milliseconds(123)); + + metrics_.OnResponseStarted(); + metrics_.OnResponseStopped(mojom::ResponseStopCause::kUser); + + histogram_tester_.ExpectTotalCount("Glic.Turn.Actuation.ResponseStartTime", + 1); + histogram_tester_.ExpectTotalCount("Glic.Turn.Actuation.ResponseStopTime", 1); + histogram_tester_.ExpectTotalCount( + "Glic.Turn.Actuation.ResponseStopTime.ByUser", 1); +} + TEST_F(GlicInstanceMetricsTest, InputModesUsed_IgnoresUnknown) { { GlicInstanceMetrics metrics;
diff --git a/chrome/browser/global_features.cc b/chrome/browser/global_features.cc index ef13b8f..92ef5a3 100644 --- a/chrome/browser/global_features.cc +++ b/chrome/browser/global_features.cc
@@ -191,7 +191,8 @@ std::make_unique<optimization_guide::OptimizationGuideGlobalFeature>(); if (media::IsAudioProcessMlModelUsageEnabled()) { - audio_process_ml_model_forwarder_ = AudioProcessMlModelForwarder::Create(); + audio_process_ml_model_forwarder_ = + AudioProcessMlModelForwarder::Create(g_browser_process->local_state()); } if (base::FeatureList::IsEnabled(
diff --git a/chrome/browser/guest_view/BUILD.gn b/chrome/browser/guest_view/BUILD.gn new file mode 100644 index 0000000..8a4c570 --- /dev/null +++ b/chrome/browser/guest_view/BUILD.gn
@@ -0,0 +1,96 @@ +# Copyright 2026 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/captive_portal/core/features.gni") +import("//components/guest_view/buildflags/buildflags.gni") +import("//extensions/buildflags/buildflags.gni") + +assert(enable_guest_view) + +source_set("guest_view") { + sources = [] + if (enable_extensions_core) { + sources += [ + "chrome_guest_view_manager_delegate.h", + "extension_options/chrome_extension_options_guest_delegate.h", + "web_view/chrome_web_view_guest_delegate.h", + "web_view/chrome_web_view_permission_helper_delegate.h", + "web_view/context_menu_content_type_web_view.h", + ] + } + + if (enable_extensions) { + sources += [ "mime_handler_view/chrome_mime_handler_view_guest_delegate.h" ] + if (!is_android) { + sources += [ "app_view/chrome_app_view_guest_delegate.h" ] + } + } + + public_deps = [ + "//chrome/common:buildflags", + "//chrome/common:mojo_bindings", + "//components/guest_view/browser", + "//components/renderer_context_menu", + "//content/public/browser", + "//extensions/browser", + ] +} + +source_set("impl") { + sources = [] + + if (enable_extensions_core) { + sources += [ + "chrome_guest_view_manager_delegate.cc", + "extension_options/chrome_extension_options_guest_delegate.cc", + "web_view/chrome_web_view_guest_delegate.cc", + "web_view/chrome_web_view_permission_helper_delegate.cc", + "web_view/context_menu_content_type_web_view.cc", + ] + } + + if (enable_extensions) { + sources += + [ "mime_handler_view/chrome_mime_handler_view_guest_delegate.cc" ] + if (!is_android) { + sources += [ "app_view/chrome_app_view_guest_delegate.cc" ] + } + } + + deps = [ + ":guest_view", + "//chrome/browser:browser_public_dependencies", + "//chrome/browser/accessibility:utils", + "//chrome/browser/content_settings:content_settings_factory", + "//chrome/browser/media/webrtc", + "//chrome/browser/ui/tab_contents", + "//components/captive_portal/core:buildflags", + "//components/guest_view/browser", + "//components/pdf/common:constants", + "//components/pdf/common:util", + ] + + if (enable_extensions) { + deps += [ "//chrome/browser/controlled_frame" ] + } + + if (enable_captive_portal_detection) { + deps += [ + "//chrome/browser/captive_portal", + "//components/captive_portal/content", + ] + } + + deps += [ + "//chrome/browser/glic", + "//chrome/browser/task_manager", + ] + if (!is_android) { + deps += [ "//chrome/browser/ui/apps" ] + } + + if (is_chromeos) { + deps += [ "//chrome/browser/ash/app_mode" ] + } +}
diff --git a/chrome/browser/guest_view/DEPS b/chrome/browser/guest_view/DEPS new file mode 100644 index 0000000..a762d0f --- /dev/null +++ b/chrome/browser/guest_view/DEPS
@@ -0,0 +1,41 @@ +# Copyright 2026 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +include_rules = [ + "-chrome/browser", + "+chrome/browser/accessibility/pdf_ocr_metrics.h", + "+chrome/browser/ash/app_mode/kiosk_chrome_app_manager.h", + "+chrome/browser/ash/app_mode/kiosk_controller.h", + "+chrome/browser/ash/app_mode/kiosk_system_session.h", + "+chrome/browser/captive_portal/captive_portal_service_factory.h", + "+chrome/browser/content_settings/host_content_settings_map_factory.h", + "+chrome/browser/controlled_frame/controlled_frame_user_agent_util.h", + "+chrome/browser/glic/host/guest_util.h", + "+chrome/browser/guest_view", + "+chrome/browser/media/webrtc/media_capture_devices_dispatcher.h", + "+chrome/browser/plugins/chrome_plugin_service_filter.h", + "+chrome/browser/profiles/profile.h", + "+chrome/browser/renderer_context_menu/render_view_context_menu.h", + "+chrome/browser/ssl/chrome_security_blocking_page_factory.h", + "+chrome/browser/task_manager/web_contents_tags.h", + "+chrome/browser/ui/apps/chrome_app_delegate.h", + "+chrome/browser/ui/tab_contents/chrome_web_contents_menu_helper.h", +] + +specific_include_rules = { + "chrome_mime_handler_view_browsertest.cc": [ + "+chrome/browser/extensions/extension_apitest.h", + "+chrome/browser/printing/test_print_preview_observer.h", + "+chrome/browser/profiles/profile.h", + "+chrome/browser/ui/browser.h", + "+chrome/browser/ui/tabs/tab_strip_model.h", + "+chrome/browser/ui/webui/print_preview/print_preview_ui.h", + ], + "chrome_mime_handler_view_interactive_uitest.cc": [ + "+chrome/browser/extensions/extension_apitest.h", + "+chrome/browser/profiles/profile.h", + "+chrome/browser/ui/browser.h", + "+chrome/browser/ui/exclusive_access/exclusive_access_test.h", + ], +}
diff --git a/chrome/browser/guest_view/chrome_guest_view_manager_delegate.cc b/chrome/browser/guest_view/chrome_guest_view_manager_delegate.cc index e731cb4..fceb1fd1 100644 --- a/chrome/browser/guest_view/chrome_guest_view_manager_delegate.cc +++ b/chrome/browser/guest_view/chrome_guest_view_manager_delegate.cc
@@ -5,10 +5,15 @@ #include "chrome/browser/guest_view/chrome_guest_view_manager_delegate.h" #include "build/build_config.h" -#include "chrome/browser/glic/host/guest_util.h" -#include "chrome/browser/task_manager/web_contents_tags.h" +#include "build/buildflag.h" #include "chrome/common/buildflags.h" #include "components/captive_portal/core/buildflags.h" +#include "extensions/buildflags/buildflags.h" + +#if !BUILDFLAG(IS_ANDROID) +#include "chrome/browser/glic/host/guest_util.h" +#include "chrome/browser/task_manager/web_contents_tags.h" +#endif #if BUILDFLAG(IS_CHROMEOS) #include "chrome/browser/ash/app_mode/kiosk_chrome_app_manager.h" @@ -33,18 +38,22 @@ content::WebContents* guest_web_contents) const { ExtensionsGuestViewManagerDelegate::OnGuestAdded(guest_web_contents); +#if !BUILDFLAG(IS_ANDROID) // Attaches the task-manager-specific tag for the GuestViews to its // `guest_web_contents` so that their corresponding tasks show up in the task // manager. task_manager::WebContentsTags::CreateForGuestContents(guest_web_contents); +#endif #if BUILDFLAG(IS_CHROMEOS) // Notifies Kiosk controller about the added guest. ash::KioskController::Get().OnGuestAdded(guest_web_contents); #endif +#if !BUILDFLAG(IS_ANDROID) // Check if guest belongs to glic and apply specific customizations if so. glic::OnGuestAdded(guest_web_contents); +#endif #if BUILDFLAG(ENABLE_CAPTIVE_PORTAL_DETECTION) // Attach Captive Portal helper to the WebView.
diff --git a/chrome/browser/guest_view/extension_options/chrome_extension_options_guest_delegate.cc b/chrome/browser/guest_view/extension_options/chrome_extension_options_guest_delegate.cc index 2bbe09c..aad51bc 100644 --- a/chrome/browser/guest_view/extension_options/chrome_extension_options_guest_delegate.cc +++ b/chrome/browser/guest_view/extension_options/chrome_extension_options_guest_delegate.cc
@@ -4,19 +4,15 @@ #include "chrome/browser/guest_view/extension_options/chrome_extension_options_guest_delegate.h" +#include <memory> #include <utility> -#include "base/notimplemented.h" -#include "build/build_config.h" -#include "chrome/browser/renderer_context_menu/render_view_context_menu.h" +#include "base/check_op.h" #include "components/renderer_context_menu/context_menu_delegate.h" +#include "components/renderer_context_menu/render_view_context_menu_base.h" +#include "content/public/browser/web_contents.h" #include "extensions/browser/guest_view/extension_options/extension_options_guest.h" -#if !BUILDFLAG(IS_ANDROID) -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/browser_finder.h" -#endif - namespace extensions { ChromeExtensionOptionsGuestDelegate::ChromeExtensionOptionsGuestDelegate( @@ -47,14 +43,8 @@ const content::OpenURLParams& params, base::OnceCallback<void(content::NavigationHandle&)> navigation_handle_callback) { -#if !BUILDFLAG(IS_ANDROID) - Browser* browser = chrome::FindBrowserWithTab( - extension_options_guest()->embedder_web_contents()); - return browser->OpenURL(params, std::move(navigation_handle_callback)); -#else // TODO(b/476468383): NEEDS_ANDROID_IMPL - NOTIMPLEMENTED(); - return nullptr; -#endif + return extension_options_guest()->embedder_web_contents()->OpenURL( + params, std::move(navigation_handle_callback)); } } // namespace extensions
diff --git a/chrome/browser/guest_view/mime_handler_view/chrome_mime_handler_view_guest_delegate.cc b/chrome/browser/guest_view/mime_handler_view/chrome_mime_handler_view_guest_delegate.cc index 6e298d4..261ade30 100644 --- a/chrome/browser/guest_view/mime_handler_view/chrome_mime_handler_view_guest_delegate.cc +++ b/chrome/browser/guest_view/mime_handler_view/chrome_mime_handler_view_guest_delegate.cc
@@ -4,14 +4,16 @@ #include "chrome/browser/guest_view/mime_handler_view/chrome_mime_handler_view_guest_delegate.h" +#include <memory> #include <utility> +#include "base/check_op.h" #include "chrome/browser/accessibility/pdf_ocr_metrics.h" -#include "chrome/browser/renderer_context_menu/render_view_context_menu.h" #include "chrome/browser/ui/tab_contents/chrome_web_contents_menu_helper.h" #include "components/pdf/common/constants.h" #include "components/pdf/common/pdf_util.h" #include "components/renderer_context_menu/context_menu_delegate.h" +#include "components/renderer_context_menu/render_view_context_menu_base.h" #include "content/public/browser/web_contents.h" namespace extensions {
diff --git a/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.cc b/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.cc index a11be762..db5442d 100644 --- a/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.cc +++ b/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.cc
@@ -9,12 +9,10 @@ #include <utility> #include "build/build_config.h" -#include "chrome/browser/extensions/chrome_extension_web_contents_observer.h" -#include "chrome/browser/favicon/favicon_utils.h" -#include "chrome/browser/renderer_context_menu/render_view_context_menu.h" #include "chrome/common/webui_url_constants.h" #include "components/guest_view/browser/guest_view_event.h" #include "components/renderer_context_menu/context_menu_delegate.h" +#include "components/renderer_context_menu/render_view_context_menu_base.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/render_widget_host_view.h" #include "content/public/common/url_constants.h"
diff --git a/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.h b/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.h index 5371ab4a..f21fb05 100644 --- a/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.h +++ b/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.h
@@ -10,7 +10,6 @@ #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" -#include "chrome/browser/extensions/api/web_view/chrome_web_view_internal_api.h" #include "extensions/browser/guest_view/web_view/web_view_guest.h" #include "extensions/browser/guest_view/web_view/web_view_guest_delegate.h"
diff --git a/chrome/browser/indigo/onboarding/BUILD.gn b/chrome/browser/indigo/onboarding/BUILD.gn index cf9e2d48..7c5ba58 100644 --- a/chrome/browser/indigo/onboarding/BUILD.gn +++ b/chrome/browser/indigo/onboarding/BUILD.gn
@@ -12,6 +12,7 @@ deps = [ "//base", "//chrome/browser/profiles:profile", + "//chrome/browser/ui", "//chrome/browser/ui/tabs:tabs_public", "//components/tabs:public", "//content/public/browser",
diff --git a/chrome/browser/indigo/onboarding/indigo_onboarding_dialog.cc b/chrome/browser/indigo/onboarding/indigo_onboarding_dialog.cc index a5aac93..75bd07b 100644 --- a/chrome/browser/indigo/onboarding/indigo_onboarding_dialog.cc +++ b/chrome/browser/indigo/onboarding/indigo_onboarding_dialog.cc
@@ -11,6 +11,8 @@ #include "base/memory/ptr_util.h" #include "chrome/browser/file_select_helper.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/browser_tabstrip.h" +#include "chrome/browser/ui/browser_window/public/browser_window_interface.h" #include "chrome/browser/ui/tabs/public/tab_dialog_manager.h" #include "chrome/browser/ui/tabs/public/tab_features.h" #include "components/tabs/public/tab_interface.h" @@ -37,8 +39,24 @@ public: using WebView::WebView; + void SetOnCloseCallback(base::OnceClosure close_callback) { + close_callback_ = std::move(close_callback); + } + + void SetBrowserWindowCallback( + base::RepeatingCallback<BrowserWindowInterface*()> + browser_window_callback) { + browser_window_callback_ = std::move(browser_window_callback); + } + // WebContentsDelegate: + void CloseContents(content::WebContents* web_contents) override { + if (close_callback_) { + std::move(close_callback_).Run(); + } + } + void RunFileChooser(content::RenderFrameHost* render_frame_host, scoped_refptr<content::FileSelectListener> listener, const blink::mojom::FileChooserParams& params) override { @@ -53,7 +71,39 @@ event, GetFocusManager()); } + content::WebContents* OpenURLFromTab( + content::WebContents* source, + const content::OpenURLParams& params, + base::OnceCallback<void(content::NavigationHandle&)> + navigation_handle_callback) override { + if (BrowserWindowInterface* browser = GetBrowserWindow()) { + return browser->OpenURL(params, std::move(navigation_handle_callback)); + } + return nullptr; + } + + content::WebContents* AddNewContents( + content::WebContents* source, + std::unique_ptr<content::WebContents> new_contents, + const GURL& target_url, + WindowOpenDisposition disposition, + const blink::mojom::WindowFeatures& window_features, + bool user_gesture, + bool* was_blocked) override { + if (BrowserWindowInterface* browser = GetBrowserWindow()) { + return chrome::AddWebContents(browser, source, std::move(new_contents), + target_url, disposition, window_features); + } + return nullptr; + } + private: + BrowserWindowInterface* GetBrowserWindow() { + return browser_window_callback_ ? browser_window_callback_.Run() : nullptr; + } + + base::RepeatingCallback<BrowserWindowInterface*()> browser_window_callback_; + base::OnceClosure close_callback_; views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_; }; @@ -80,6 +130,13 @@ Profile* profile = Profile::FromBrowserContext(tab.GetContents()->GetBrowserContext()); auto web_view = std::make_unique<OnboardingWebView>(profile); + web_view->SetOnCloseCallback( + base::BindOnce(&IndigoOnboardingDialog::Close, base::Unretained(this))); + web_view->SetBrowserWindowCallback(base::BindRepeating( + [](const base::WeakPtr<tabs::TabInterface>& tab) { + return tab ? tab->GetBrowserWindowInterface() : nullptr; + }, + tab.GetWeakPtr())); web_view->GetWebContents()->GetController().LoadURLWithParams( content::NavigationController::LoadURLParams(onboarding_url)); web_view->SetPreferredSize(kMinSize);
diff --git a/chrome/browser/indigo/onboarding/indigo_onboarding_dialog.h b/chrome/browser/indigo/onboarding/indigo_onboarding_dialog.h index acefa3f..03c3ce4 100644 --- a/chrome/browser/indigo/onboarding/indigo_onboarding_dialog.h +++ b/chrome/browser/indigo/onboarding/indigo_onboarding_dialog.h
@@ -67,13 +67,15 @@ base::OnceClosure close_callback_; - // `widget_` must be destroyed before `delegate_` because the widget holds a - // raw pointer to the delegate. std::unique_ptr<views::DialogDelegate> delegate_; - std::unique_ptr<views::Widget> widget_; - base::ScopedObservation<views::View, views::ViewObserver> view_observation_{ this}; + + // `widget_` must be destroyed early, and especially before `delegate_`, + // because the widget holds a raw pointer to the delegate. It should also + // be destroyed before `view_observation_`, since it is accessed (to reset) + // in `OnWidgetClosed`, which can happen during widget destruction. + std::unique_ptr<views::Widget> widget_; }; } // namespace indigo
diff --git a/chrome/browser/indigo/onboarding/indigo_onboarding_dialog_browsertest.cc b/chrome/browser/indigo/onboarding/indigo_onboarding_dialog_browsertest.cc index ad256c12..626fe5c3 100644 --- a/chrome/browser/indigo/onboarding/indigo_onboarding_dialog_browsertest.cc +++ b/chrome/browser/indigo/onboarding/indigo_onboarding_dialog_browsertest.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/indigo/onboarding/indigo_onboarding_dialog.h" #include "base/functional/callback_helpers.h" +#include "base/strings/escape.h" #include "base/test/bind.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/public/tab_dialog_manager.h" @@ -14,6 +15,8 @@ #include "content/public/test/browser_test.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/base/interaction/element_identifier.h" +#include "ui/base/test/ui_controls.h" #include "ui/views/controls/webview/webview.h" #include "ui/views/view_utils.h" #include "ui/views/widget/widget.h" @@ -22,11 +25,19 @@ namespace indigo { namespace { +DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kDialogWebContentsId); +DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kNewTabId); + MATCHER_P2(SizeIsInRange, min_size, max_size, "") { return arg.width() >= min_size.width() && arg.width() <= max_size.width() && arg.height() >= min_size.height() && arg.height() <= max_size.height(); } +GURL HTMLToDataView(std::string_view html) { + return GURL("data:text/html;charset=utf-8," + + base::EscapeAllExceptUnreserved(html)); +} + class IndigoOnboardingDialogBrowserTest : public InteractiveBrowserTest { protected: void OpenDialog(tabs::TabInterface& tab, const GURL& url) { @@ -60,5 +71,72 @@ Check([&]() { return WasDialogClosed(); })); } + +IN_PROC_BROWSER_TEST_F(IndigoOnboardingDialogBrowserTest, JSWindowClose) { + tabs::TabInterface* tab = browser()->GetActiveTabInterface(); + ASSERT_TRUE(tab); + + const GURL onboarding_url("about:blank"); + RunTestSequence(Do([&]() { OpenDialog(*tab, onboarding_url); }), + WaitForShow(IndigoOnboardingDialog::kWebViewId), + InstrumentNonTabWebView(kDialogWebContentsId, + IndigoOnboardingDialog::kWebViewId), + WaitForWebContentsReady(kDialogWebContentsId, onboarding_url), + ExecuteJs(kDialogWebContentsId, "() => window.close()", + ExecuteJsMode::kFireAndForget), + WaitForHide(IndigoOnboardingDialog::kWebViewId), + Check([&]() { return WasDialogClosed(); })); +} + +// Test clicking a link with target="_blank". This verifies the +// WebContentsDelegate::AddNewContents implementation. +IN_PROC_BROWSER_TEST_F(IndigoOnboardingDialogBrowserTest, + ClickTargetBlankLink) { + tabs::TabInterface* tab = browser()->GetActiveTabInterface(); + ASSERT_TRUE(tab); + + const GURL onboarding_url = HTMLToDataView(R"html( + <!DOCTYPE html> + <html><body> + <a id="link-blank" href="about:blank" target="_blank">Blank</a> + </body></html> + )html"); + + RunTestSequence(Do([&]() { OpenDialog(*tab, onboarding_url); }), + WaitForShow(IndigoOnboardingDialog::kWebViewId), + InstrumentNonTabWebView(kDialogWebContentsId, + IndigoOnboardingDialog::kWebViewId), + WaitForWebContentsReady(kDialogWebContentsId, onboarding_url), + InstrumentNextTab(kNewTabId), + ClickElement(kDialogWebContentsId, DeepQuery{"#link-blank"}) + .SetMustRemainVisible(false), + WaitForWebContentsReady(kNewTabId, GURL("about:blank"))); +} + +// Test middle-clicking a link. This verifies the +// WebContentsDelegate::OpenURLFromTab implementation. +IN_PROC_BROWSER_TEST_F(IndigoOnboardingDialogBrowserTest, MiddleClickLink) { + tabs::TabInterface* tab = browser()->GetActiveTabInterface(); + ASSERT_TRUE(tab); + + const GURL onboarding_url = HTMLToDataView(R"html( + <!DOCTYPE html> + <html><body> + <a id="link-normal" href="about:blank">Normal</a> + </body></html> + )html"); + + RunTestSequence(Do([&]() { OpenDialog(*tab, onboarding_url); }), + WaitForShow(IndigoOnboardingDialog::kWebViewId), + InstrumentNonTabWebView(kDialogWebContentsId, + IndigoOnboardingDialog::kWebViewId), + WaitForWebContentsReady(kDialogWebContentsId, onboarding_url), + InstrumentNextTab(kNewTabId), + ClickElement(kDialogWebContentsId, DeepQuery{"#link-normal"}, + ui_controls::MIDDLE) + .SetMustRemainVisible(false), + WaitForWebContentsReady(kNewTabId, GURL("about:blank"))); +} + } // namespace } // namespace indigo
diff --git a/chrome/browser/keyboard_accessory/android/internal/java/strings/translations/android_keyboard_accessory_strings_pt-PT.xtb b/chrome/browser/keyboard_accessory/android/internal/java/strings/translations/android_keyboard_accessory_strings_pt-PT.xtb index 092cf06..a97ca96 100644 --- a/chrome/browser/keyboard_accessory/android/internal/java/strings/translations/android_keyboard_accessory_strings_pt-PT.xtb +++ b/chrome/browser/keyboard_accessory/android/internal/java/strings/translations/android_keyboard_accessory_strings_pt-PT.xtb
@@ -11,6 +11,7 @@ <translation id="2903493209154104877">Moradas</translation> <translation id="3399357656427473483">Lista de credenciais a preencher com o toque.</translation> <translation id="3688051737190211318">Se confiar em <ph name="ORIGIN" />, pode usar uma palavra-passe guardada para iniciar sessão</translation> +<translation id="4110818514910776249">Agora, pode preencher automaticamente mais informações da Carteira do Google. Faça a gestão das suas informações ou desative estas sugestões nas Definições.</translation> <translation id="4553044860350038560">Mais chaves de acesso</translation> <translation id="457912817138344555">Agora, pode preencher automaticamente cartões de fidelidade. Pode desativar estas sugestões na Carteira do Google.</translation> <translation id="4631649115723685955">Reembolso associado</translation>
diff --git a/chrome/browser/local_network_access/local_network_access_browsertest.cc b/chrome/browser/local_network_access/local_network_access_browsertest.cc index fd593d80..c3d4229b 100644 --- a/chrome/browser/local_network_access/local_network_access_browsertest.cc +++ b/chrome/browser/local_network_access/local_network_access_browsertest.cc
@@ -88,11 +88,10 @@ permissions::PermissionRequestManager::AutoResponseType::DENY_ALL); // LNA fetch should fail. - EXPECT_THAT(content::EvalJs( - web_contents(), - content::JsReplace("fetch($1).then(response => response.ok)", - https_server().GetURL("b.com", kLnaPath))), - content::EvalJsResult::IsError()); + EXPECT_FALSE(content::ExecJs( + web_contents(), + content::JsReplace("fetch($1).then(response => response.ok)", + https_server().GetURL("b.com", kLnaPath)))); } IN_PROC_BROWSER_TEST_P(LocalNetworkAccessBrowserTest, FetchAcceptPermission) { @@ -177,12 +176,11 @@ // LNA fetch fails due to mismatched targetAddressSpace. Result doesn't matter // here though, as we're just checking a use counter that doesn't depend on // fetch success. - EXPECT_THAT(content::EvalJs(web_contents(), - content::JsReplace( - "fetch($1, {targetAddressSpace: " - "'private'}).then(response => response.ok)", - https_server().GetURL("b.com", kLnaPath))), - content::EvalJsResult::IsError()); + EXPECT_FALSE(content::ExecJs( + web_contents(), + content::JsReplace("fetch($1, {targetAddressSpace: " + "'private'}).then(response => response.ok)", + https_server().GetURL("b.com", kLnaPath)))); CheckCounter(WebFeature::kLocalNetworkAccessPrivateAliasUse, 1); } @@ -196,12 +194,11 @@ // LNA fetch fails due to mismatched targetAddressSpace. Result doesn't matter // here though, as we're just checking a use counter that doesn't depend on // fetch success. - EXPECT_THAT(content::EvalJs( - web_contents(), - content::JsReplace("fetch($1, {targetAddressSpace: " - "'local'}).then(response => response.ok)", - https_server().GetURL("b.com", kLnaPath))), - content::EvalJsResult::IsError()); + EXPECT_FALSE(content::ExecJs( + web_contents(), + content::JsReplace("fetch($1, {targetAddressSpace: " + "'local'}).then(response => response.ok)", + https_server().GetURL("b.com", kLnaPath)))); CheckCounter(WebFeature::kLocalNetworkAccessPrivateAliasUse, 0); }
diff --git a/chrome/browser/local_network_access/local_network_access_policies_browsertest.cc b/chrome/browser/local_network_access/local_network_access_policies_browsertest.cc index 74c562e..84f472b 100644 --- a/chrome/browser/local_network_access/local_network_access_policies_browsertest.cc +++ b/chrome/browser/local_network_access/local_network_access_policies_browsertest.cc
@@ -211,12 +211,10 @@ bubble_factory()->set_response_type( permissions::PermissionRequestManager::AutoResponseType::ACCEPT_ALL); - // LNA fetch should fail. - EXPECT_THAT(content::EvalJs( - web_contents(), - content::JsReplace("fetch($1).then(response => response.ok)", - https_server().GetURL("b.com", kLnaPath))), - content::EvalJsResult::IsError()); + EXPECT_FALSE(content::ExecJs( + web_contents(), + content::JsReplace("fetch($1).then(response => response.ok)", + https_server().GetURL("b.com", kLnaPath)))); } class LocalNetworkAccessPoliciesIPOverrideBrowserTest @@ -260,12 +258,10 @@ // LNA fetch should fail; https_local_server() doesn't get overridden to // public because a command-line override sets it to local first before the // policy override applies. - EXPECT_THAT( - content::EvalJs( - web_contents(), - content::JsReplace("fetch($1).then(response => response.ok)", - https_local_server().GetURL("b.com", kLnaPath))), - content::EvalJsResult::IsError()); + EXPECT_FALSE(content::ExecJs( + web_contents(), + content::JsReplace("fetch($1).then(response => response.ok)", + https_local_server().GetURL("b.com", kLnaPath)))); } class LocalNetworkAccessPoliciesPermissionsPolicyBrowserTest
diff --git a/chrome/browser/local_network_access/local_network_access_prompt_browsertest.cc b/chrome/browser/local_network_access/local_network_access_prompt_browsertest.cc index a1488c5..ebd3f133 100644 --- a/chrome/browser/local_network_access/local_network_access_prompt_browsertest.cc +++ b/chrome/browser/local_network_access/local_network_access_prompt_browsertest.cc
@@ -117,9 +117,8 @@ web_contents()); // LNA fetch should fail. - EXPECT_THAT(content::EvalJs(web_contents(), FetchUrlJs(https_server().GetURL( - kHostC, kLnaPath))), - content::EvalJsResult::IsError()); + EXPECT_FALSE(content::ExecJs( + web_contents(), FetchUrlJs(https_server().GetURL(kHostC, kLnaPath)))); // Permission prompt not shown, c.com doesn't resolve so no connection is // made, and c.com is not a host that is always local/loopback. @@ -134,9 +133,8 @@ web_contents()); // LNA fetch should fail. - EXPECT_THAT(content::EvalJs(web_contents(), FetchUrlJs(GetUnconnectedURL( - kHostLocal, kLnaPath))), - content::EvalJsResult::IsError()); + EXPECT_FALSE(content::ExecJs( + web_contents(), FetchUrlJs(GetUnconnectedURL(kHostLocal, kLnaPath)))); permission_request_observer.Wait(); EXPECT_TRUE(permission_request_observer.request_shown()); @@ -149,9 +147,8 @@ web_contents()); // LNA fetch should fail. - EXPECT_THAT(content::EvalJs(web_contents(), FetchUrlJs(GetUnconnectedURL( - "localhost", kLnaPath))), - content::EvalJsResult::IsError()); + EXPECT_FALSE(content::ExecJs( + web_contents(), FetchUrlJs(GetUnconnectedURL("localhost", kLnaPath)))); permission_request_observer.Wait(); EXPECT_TRUE(permission_request_observer.request_shown()); @@ -165,9 +162,8 @@ web_contents()); // LNA fetch should fail. - EXPECT_THAT(content::EvalJs(web_contents(), FetchUrlJs(GetUnconnectedURL( - "127.0.0.1", kLnaPath))), - content::EvalJsResult::IsError()); + EXPECT_FALSE(content::ExecJs( + web_contents(), FetchUrlJs(GetUnconnectedURL("127.0.0.1", kLnaPath)))); permission_request_observer.Wait(); EXPECT_TRUE(permission_request_observer.request_shown()); @@ -181,9 +177,8 @@ web_contents()); // LNA fetch should fail. - EXPECT_THAT(content::EvalJs(web_contents(), - FetchUrlJs(GetUnconnectedURL("[::1]", kLnaPath))), - content::EvalJsResult::IsError()); + EXPECT_FALSE(content::ExecJs( + web_contents(), FetchUrlJs(GetUnconnectedURL("[::1]", kLnaPath)))); permission_request_observer.Wait(); EXPECT_TRUE(permission_request_observer.request_shown());
diff --git a/chrome/browser/local_network_access/local_network_access_split_permission_browsertest.cc b/chrome/browser/local_network_access/local_network_access_split_permission_browsertest.cc index f426e72..8560c87d 100644 --- a/chrome/browser/local_network_access/local_network_access_split_permission_browsertest.cc +++ b/chrome/browser/local_network_access/local_network_access_split_permission_browsertest.cc
@@ -124,12 +124,10 @@ ASSERT_EQ("prompt", content::EvalJs(web_contents(), QueryPermissionScript("local-network-access"))); - EXPECT_THAT( - content::EvalJs(web_contents(), QueryPermissionScript("local-network")), - content::EvalJsResult::IsError()); - EXPECT_THAT(content::EvalJs(web_contents(), - QueryPermissionScript("loopback-network")), - content::EvalJsResult::IsError()); + EXPECT_FALSE( + content::ExecJs(web_contents(), QueryPermissionScript("local-network"))); + EXPECT_FALSE(content::ExecJs(web_contents(), + QueryPermissionScript("loopback-network"))); } IN_PROC_BROWSER_TEST_F(LocalNetworkAccessSplitPermissionOnBrowserTest, @@ -158,11 +156,10 @@ permissions::PermissionRequestManager::AutoResponseType::DENY_ALL); // LNA fetch should fail. - EXPECT_THAT(content::EvalJs( - web_contents(), - content::JsReplace("fetch($1).then(response => response.ok)", - https_server().GetURL("b.com", kLnaPath))), - content::EvalJsResult::IsError()); + EXPECT_FALSE(content::ExecJs( + web_contents(), + content::JsReplace("fetch($1).then(response => response.ok)", + https_server().GetURL("b.com", kLnaPath)))); // It should be the loopback-network permission that is denied ... ASSERT_EQ("denied", content::EvalJs(web_contents(), QueryPermissionScript( @@ -188,12 +185,10 @@ permissions::PermissionRequestManager::AutoResponseType::DENY_ALL); // LNA fetch should fail. - EXPECT_THAT( - content::EvalJs( - web_contents(), - content::JsReplace("fetch($1).then(response => response.ok)", - https_local_server().GetURL("b.com", kLnaPath))), - content::EvalJsResult::IsError()); + EXPECT_FALSE(content::ExecJs( + web_contents(), + content::JsReplace("fetch($1).then(response => response.ok)", + https_local_server().GetURL("b.com", kLnaPath)))); // It should not be the loopback-network permission that is denied ... ASSERT_EQ("prompt", content::EvalJs(web_contents(), QueryPermissionScript( @@ -291,11 +286,10 @@ permissions::PermissionRequestManager::AutoResponseType::DENY_ALL); // Loopback LNA fetch should fail. - EXPECT_THAT(content::EvalJs( - web_contents(), - content::JsReplace("fetch($1).then(response => response.ok)", - https_server().GetURL("b.com", kLnaPath))), - content::EvalJsResult::IsError()); + EXPECT_FALSE(content::ExecJs( + web_contents(), + content::JsReplace("fetch($1).then(response => response.ok)", + https_server().GetURL("b.com", kLnaPath)))); // local-network permission should be granted. ASSERT_EQ("granted", content::EvalJs(web_contents(), @@ -322,12 +316,10 @@ permissions::PermissionRequestManager::AutoResponseType::DENY_ALL); // Local LNA fetch should fail. - EXPECT_THAT( - content::EvalJs( - web_contents(), - content::JsReplace("fetch($1).then(response => response.ok)", - https_local_server().GetURL("b.com", kLnaPath))), - content::EvalJsResult::IsError()); + EXPECT_FALSE(content::ExecJs( + web_contents(), + content::JsReplace("fetch($1).then(response => response.ok)", + https_local_server().GetURL("b.com", kLnaPath)))); // Enable auto-accept of LNA permission request. bubble_factory()->set_response_type( @@ -504,19 +496,16 @@ permissions::PermissionRequestManager::AutoResponseType::ACCEPT_ALL); // LNA fetch should fail, both for loopback requests... - EXPECT_THAT(content::EvalJs( - web_contents(), - content::JsReplace("fetch($1).then(response => response.ok)", - https_server().GetURL("b.com", kLnaPath))), - content::EvalJsResult::IsError()); + EXPECT_FALSE(content::ExecJs( + web_contents(), + content::JsReplace("fetch($1).then(response => response.ok)", + https_server().GetURL("b.com", kLnaPath)))); // ... and for local requests. - EXPECT_THAT( - content::EvalJs( - web_contents(), - content::JsReplace("fetch($1).then(response => response.ok)", - https_local_server().GetURL("b.com", kLnaPath))), - content::EvalJsResult::IsError()); + EXPECT_FALSE(content::ExecJs( + web_contents(), + content::JsReplace("fetch($1).then(response => response.ok)", + https_local_server().GetURL("b.com", kLnaPath)))); } // Tests for forwards compatibility of the "local-network-access" permissions
diff --git a/chrome/browser/media/BUILD.gn b/chrome/browser/media/BUILD.gn index 63b6a665..1ce6e734 100644 --- a/chrome/browser/media/BUILD.gn +++ b/chrome/browser/media/BUILD.gn
@@ -34,7 +34,12 @@ "//mojo/public/cpp/bindings", "//services/audio/public/mojom", ] - deps = [ "//content/public/browser" ] + deps = [ + "//chrome/browser/media/webrtc", + "//chrome/common:constants", + "//components/prefs", + "//content/public/browser", + ] } source_set("unittests") { @@ -44,9 +49,12 @@ ":audio_process_ml_model_forwarder", "//base", "//base/test:test_support", + "//chrome/browser/media/webrtc", + "//chrome/common:constants", "//components/optimization_guide/core", "//components/optimization_guide/core:test_support", "//components/optimization_guide/proto:optimization_guide_proto", + "//components/prefs:test_support", "//content/public/browser", "//content/test:test_support", "//mojo/core/embedder", @@ -54,6 +62,7 @@ "//services/audio/public/mojom", "//testing/gmock", "//testing/gtest", + "//third_party/blink/public/mojom:mojom_platform", ] }
diff --git a/chrome/browser/media/audio_process_ml_model_forwarder.cc b/chrome/browser/media/audio_process_ml_model_forwarder.cc index c254ac18..bc55b74 100644 --- a/chrome/browser/media/audio_process_ml_model_forwarder.cc +++ b/chrome/browser/media/audio_process_ml_model_forwarder.cc
@@ -12,12 +12,18 @@ #include "base/functional/callback.h" #include "base/logging.h" #include "base/memory/ptr_util.h" +#include "base/memory/raw_ref.h" #include "base/memory/scoped_refptr.h" #include "base/task/sequenced_task_runner.h" #include "base/task/thread_pool.h" +#include "base/time/time.h" +#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" +#include "chrome/common/pref_names.h" #include "components/optimization_guide/core/delivery/optimization_guide_model_provider.h" #include "components/optimization_guide/core/delivery/optimization_target_model_observer.h" #include "components/optimization_guide/proto/models.pb.h" +#include "components/prefs/pref_registry.h" +#include "components/prefs/pref_service.h" #include "content/public/browser/audio_service.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/service_process_host.h" @@ -26,6 +32,20 @@ namespace { +// The maximum duration since audio input stream creation before we stop +// considering it a "recent" event. +// +// Used at initialization to check the last audio input stream creation time +// stored in `pref_service_`. If the time is recent, then we assume ML models +// for audio input stream processing are likely to be needed and +// AudioProcessMlModelForwarder proactively registers for model updates with +// the Optimization Guide. +// +// 30 days is chosen here to match: +// 1. the Optimization Guide model expiration time, and +// 2. similar retention heuristics in other features. +constexpr base::TimeDelta kRecentAudioCaptureThreshold = base::Days(30); + AudioProcessMlModelForwarder::WrappedFilePtr OpenFileAndReturn( base::FilePath path, scoped_refptr<base::SequencedTaskRunner> deletion_task_runner) { @@ -41,7 +61,8 @@ // Used to monitor audio process launches and bind to the audio service // MlModelManager interface. -class AudioProcessObserver : content::ServiceProcessHost::Observer { +class AudioProcessMlModelForwarder::AudioProcessObserver + : content::ServiceProcessHost::Observer { public: using ServiceLaunchCallback = base::RepeatingCallback<void(mojo::Remote<audio::mojom::MlModelManager>)>; @@ -85,25 +106,61 @@ ServiceLaunchCallback launch_callback_; }; +// Used to monitor audio capture requests and notify the forwarder when device +// audio capture streams are opened. +class AudioProcessMlModelForwarder::AudioCaptureRequestObserver + : public MediaCaptureDevicesDispatcher::Observer { + public: + explicit AudioCaptureRequestObserver(AudioProcessMlModelForwarder& forwarder) + : forwarder_(forwarder) { + MediaCaptureDevicesDispatcher::GetInstance()->AddObserver(this); + } + + ~AudioCaptureRequestObserver() override { + MediaCaptureDevicesDispatcher::GetInstance()->RemoveObserver(this); + } + + // MediaCaptureDevicesDispatcher::Observer: + void OnRequestUpdate(int render_process_id, + int render_frame_id, + blink::mojom::MediaStreamType stream_type, + const content::MediaRequestState state) override { + if (state != content::MEDIA_REQUEST_STATE_DONE) { + return; + } + // Only react to device audio capture, where echo cancellation may run in + // the audio process. + if (stream_type == blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE) { + forwarder_->OnAudioCaptureStarted(); + } + } + + private: + const base::raw_ref<AudioProcessMlModelForwarder> forwarder_; +}; + // static std::unique_ptr<AudioProcessMlModelForwarder> -AudioProcessMlModelForwarder::Create() { +AudioProcessMlModelForwarder::Create(PrefService* pref_service) { // Using `new` to access a non-public constructor. return base::WrapUnique(new AudioProcessMlModelForwarder( - std::make_unique<AudioProcessObserver>())); + std::make_unique<AudioProcessObserver>(), pref_service)); } // static std::unique_ptr<AudioProcessMlModelForwarder> -AudioProcessMlModelForwarder::CreateWithoutAudioProcessObserverForTesting() { +AudioProcessMlModelForwarder::CreateWithoutAudioProcessObserverForTesting( + PrefService* pref_service) { // Using `new` to access a non-public constructor. return base::WrapUnique(new AudioProcessMlModelForwarder( - /*audio_process_observer=*/nullptr)); + /*audio_process_observer=*/nullptr, pref_service)); } AudioProcessMlModelForwarder::AudioProcessMlModelForwarder( - std::unique_ptr<AudioProcessObserver> audio_process_observer) + std::unique_ptr<AudioProcessObserver> audio_process_observer, + PrefService* pref_service) : audio_process_observer_(std::move(audio_process_observer)), + pref_service_(pref_service), background_task_runner_(base::ThreadPool::CreateSequencedTaskRunner( {base::MayBlock(), base::TaskPriority::BEST_EFFORT})) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); @@ -125,6 +182,30 @@ CHECK(!model_observation_); model_observation_.emplace(&model_provider, background_task_runner_, /*observer=*/this); + + if (pref_service_) { + base::Time last_audio_input_stream_creation_time = + pref_service_->GetTime(prefs::kAudioInputStreamLastTimeCreated); + if (!last_audio_input_stream_creation_time.is_null() && + base::Time::Now() - last_audio_input_stream_creation_time <= + kRecentAudioCaptureThreshold) { + audio_input_stream_creation_observed_ = true; + } + } + audio_capture_request_observer_ = + std::make_unique<AudioCaptureRequestObserver>(*this); + + MaybeRegisterModelObserver(); +} + +void AudioProcessMlModelForwarder::OnAudioCaptureStarted() { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + audio_input_stream_creation_observed_ = true; + if (pref_service_) { + // Store the time of this event for checking at initialization. + pref_service_->SetTime(prefs::kAudioInputStreamLastTimeCreated, + base::Time::Now()); + } MaybeRegisterModelObserver(); } @@ -161,11 +242,9 @@ void AudioProcessMlModelForwarder::MaybeRegisterModelObserver() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - // TODO: crbug.com/442444736 - Audio process presence is a stand in for an - // actual signal that the model is useful on this device. To launch widely, - // this feature requires a more narrow trigger to reduce unnecessary - // downloads. - if (!audio_process_model_manager_) { + // Avoid registering the model observer until we have an indication that a + // model is likely to be used. This reduces unnecessary model downloads. + if (!audio_input_stream_creation_observed_) { return; } if (model_observation_ && !model_observation_->IsRegistered()) {
diff --git a/chrome/browser/media/audio_process_ml_model_forwarder.h b/chrome/browser/media/audio_process_ml_model_forwarder.h index 9661b9a..4c403eff 100644 --- a/chrome/browser/media/audio_process_ml_model_forwarder.h +++ b/chrome/browser/media/audio_process_ml_model_forwarder.h
@@ -10,6 +10,7 @@ #include "base/files/file.h" #include "base/files/file_path.h" +#include "base/memory/raw_ptr.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/task/sequenced_task_runner.h" @@ -24,15 +25,15 @@ class ModelInfo; } // namespace optimization_guide -class AudioProcessObserver; +class PrefService; // Propagates ML models from the Optimization Guide to the audio process. -// Currently only a single model, for residual echo estimatino, but may be +// Currently only a single model, for residual echo estimation, but may be // extended to other optimization targets in the future. // // Does nothing until both an Optimization Guide model provider has been set and -// the audio process is launched. Then, observes updates from the model provider -// and forwards them to the audio process. +// an audio input stream has been opened. Then, subscribes to models from the +// Optimization Guide and forwards them to the audio process. // // NOTE: This class only forwards models to the audio process, i.e., not when // the audio service is running as a part of the browser process. Models are @@ -45,13 +46,14 @@ using WrappedFilePtr = std::unique_ptr<base::File, base::OnTaskRunnerDeleter>; // Default factory function. Monitors audio service process launches via - // global APIs. - static std::unique_ptr<AudioProcessMlModelForwarder> Create(); + // global APIs. `pref_service` may be null. + static std::unique_ptr<AudioProcessMlModelForwarder> Create( + PrefService* pref_service); // Testing factory function. Expects audio service process launches to be // signaled by calls to OnAudioProcessLaunched(). static std::unique_ptr<AudioProcessMlModelForwarder> - CreateWithoutAudioProcessObserverForTesting(); + CreateWithoutAudioProcessObserverForTesting(PrefService* pref_service); ~AudioProcessMlModelForwarder() override; @@ -72,7 +74,14 @@ } bool HasModelForTesting() const { return !model_path_.empty(); } + // Signal that an audio capture stream has been opened. Media may not yet be + // flowing, but permission checks have concluded successfully. + void OnAudioCaptureStarted(); + private: + class AudioCaptureRequestObserver; + class AudioProcessObserver; + // optimization_guide::OptimizationTargetModelObserver: void OnModelUpdated( optimization_guide::proto::OptimizationTarget optimization_target, @@ -81,8 +90,9 @@ // If `audio_process_observer` is null, the forwarder does not handle audio // service process monitoring internally. See Create*() for details. - explicit AudioProcessMlModelForwarder( - std::unique_ptr<AudioProcessObserver> audio_process_observer); + AudioProcessMlModelForwarder( + std::unique_ptr<AudioProcessObserver> audio_process_observer, + PrefService* pref_service); // Stops any ongoing loading of models. void CancelModelLoadingTasks(); @@ -103,6 +113,10 @@ // Signals when the audio process is ready to start receiving model updates. const std::unique_ptr<AudioProcessObserver> audio_process_observer_; + // Used for checking and updating the last observed input stream creation + // time, in order to preload models where they are likely to be needed. + raw_ptr<PrefService> pref_service_; + // Task runner for loading model files. scoped_refptr<base::SequencedTaskRunner> background_task_runner_; @@ -113,10 +127,18 @@ // a nullopt model update has been received. base::FilePath model_path_; - // Handles registration / deregistration with the model delivery framework. + // Handles registration / deregistration with the Optimization Guide. std::optional<optimization_guide::OptimizationGuideModelProviderObservation> model_observation_; + // True if and only if an audio input stream was recently created. Used to + // gate registering `model_observation_` with the Optimization Guide. + bool audio_input_stream_creation_observed_ = false; + + // Observes creation of audio capture streams in order to detect when models + // are likely to be needed. + std::unique_ptr<AudioCaptureRequestObserver> audio_capture_request_observer_; + base::WeakPtrFactory<AudioProcessMlModelForwarder> weak_factory_{this}; };
diff --git a/chrome/browser/media/audio_process_ml_model_forwarder_browsertest.cc b/chrome/browser/media/audio_process_ml_model_forwarder_browsertest.cc index 7a25256..830c261 100644 --- a/chrome/browser/media/audio_process_ml_model_forwarder_browsertest.cc +++ b/chrome/browser/media/audio_process_ml_model_forwarder_browsertest.cc
@@ -41,6 +41,11 @@ content::GetAudioService(); } + // Trigger the observer state to be satisfied manually. + g_browser_process->GetFeatures() + ->audio_process_ml_model_forwarder() + ->OnAudioCaptureStarted(); + // Verify that the optimization guide receives a registration. optimization_guide::PredictionManager& prediction_manager = g_browser_process->GetFeatures()
diff --git a/chrome/browser/media/audio_process_ml_model_forwarder_unittest.cc b/chrome/browser/media/audio_process_ml_model_forwarder_unittest.cc index 27126253..88ef46417 100644 --- a/chrome/browser/media/audio_process_ml_model_forwarder_unittest.cc +++ b/chrome/browser/media/audio_process_ml_model_forwarder_unittest.cc
@@ -10,10 +10,15 @@ #include "base/files/scoped_temp_file.h" #include "base/test/run_until.h" +#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" +#include "chrome/common/pref_names.h" #include "components/optimization_guide/core/delivery/model_provider_registry.h" #include "components/optimization_guide/core/delivery/test_model_info_builder.h" #include "components/optimization_guide/core/optimization_guide_logger.h" #include "components/optimization_guide/proto/models.pb.h" +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/testing_pref_service.h" +#include "content/public/browser/media_stream_request.h" #include "content/public/test/browser_task_environment.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver.h" @@ -21,6 +26,7 @@ #include "services/audio/public/mojom/ml_model_manager.mojom.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/mojom/mediastream/media_stream.mojom.h" namespace { @@ -48,8 +54,10 @@ class AudioProcessMlModelForwarderTest : public testing::Test { protected: void SetUp() override { + local_state_.registry()->RegisterTimePref( + prefs::kAudioInputStreamLastTimeCreated, base::Time()); forwarder_ = AudioProcessMlModelForwarder:: - CreateWithoutAudioProcessObserverForTesting(); + CreateWithoutAudioProcessObserverForTesting(&local_state_); ml_model_manager_.BindReceiver( remote_ml_model_manager_.BindNewPipeAndPassReceiver()); } @@ -70,8 +78,10 @@ return new_remote; } - content::BrowserTaskEnvironment task_environment_; + content::BrowserTaskEnvironment task_environment_{ + base::test::TaskEnvironment::TimeSource::MOCK_TIME}; OptimizationGuideLogger logger_; + TestingPrefServiceSimple local_state_; optimization_guide::ModelProviderRegistry model_provider_{&logger_}; std::unique_ptr<AudioProcessMlModelForwarder> forwarder_; MockMlModelManager ml_model_manager_; @@ -104,6 +114,7 @@ RegisterForModelUpdatesAfterInitializationAndAudioProcessLaunch) { forwarder_->Initialize(model_provider_); forwarder_->OnAudioProcessLaunched(std::move(remote_ml_model_manager_)); + forwarder_->OnAudioCaptureStarted(); EXPECT_TRUE(model_provider_.IsRegistered( optimization_guide::proto:: @@ -111,9 +122,99 @@ } TEST_F(AudioProcessMlModelForwarderTest, + ObserverRegisteredImmediatelyIfTriggerEventWasRecentlyObserved) { + // Set the pref to a time within the last 30 days. + local_state_.SetTime(prefs::kAudioInputStreamLastTimeCreated, + base::Time::Now() - base::Days(15)); + + // The model observer should be registered immediately on initialization + // since the trigger event was already observed recently. + forwarder_->Initialize(model_provider_); + forwarder_->OnAudioProcessLaunched(std::move(remote_ml_model_manager_)); + + EXPECT_TRUE(model_provider_.IsRegistered( + optimization_guide::proto:: + OPTIMIZATION_TARGET_WEBRTC_NEURAL_RESIDUAL_ECHO_ESTIMATOR)); +} + +TEST_F(AudioProcessMlModelForwarderTest, + ObserverNotRegisteredImmediatelyIfTriggerEventIsTooOld) { + // Set the pref to a time larger than 30 days ago. + local_state_.SetTime(prefs::kAudioInputStreamLastTimeCreated, + base::Time::Now() - base::Days(35)); + + forwarder_->Initialize(model_provider_); + forwarder_->OnAudioProcessLaunched(std::move(remote_ml_model_manager_)); + + EXPECT_FALSE(model_provider_.IsRegistered( + optimization_guide::proto:: + OPTIMIZATION_TARGET_WEBRTC_NEURAL_RESIDUAL_ECHO_ESTIMATOR)); +} + +TEST_F(AudioProcessMlModelForwarderTest, OnAudioCaptureStartedSavesEventTime) { + forwarder_->Initialize(model_provider_); + forwarder_->OnAudioProcessLaunched(std::move(remote_ml_model_manager_)); + + // Advance time to have a known baseline. + task_environment_.AdvanceClock(base::Days(1)); + base::Time expected_time = base::Time::Now(); + + forwarder_->OnAudioCaptureStarted(); + + EXPECT_EQ(local_state_.GetTime(prefs::kAudioInputStreamLastTimeCreated), + expected_time); +} + +TEST_F(AudioProcessMlModelForwarderTest, + OnAudioCaptureStartedUpdatesSavesEventTimeAgain) { + forwarder_->Initialize(model_provider_); + forwarder_->OnAudioProcessLaunched(std::move(remote_ml_model_manager_)); + + // The model observer should NOT be registered yet. + EXPECT_FALSE(model_provider_.IsRegistered( + optimization_guide::proto:: + OPTIMIZATION_TARGET_WEBRTC_NEURAL_RESIDUAL_ECHO_ESTIMATOR)); + + // Advance time. + task_environment_.AdvanceClock(base::Days(1)); + base::Time first_capture_time = base::Time::Now(); + + // Trigger audio capture via the dispatcher, to verify that the internal + // observer is active. + MediaCaptureDevicesDispatcher::GetInstance()->OnMediaRequestStateChanged( + /*render_process_id=*/0, /*render_frame_id=*/0, /*page_request_id=*/0, + GURL(), blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE, + content::MEDIA_REQUEST_STATE_DONE); + EXPECT_TRUE(base::test::RunUntil([&]() { + return local_state_.GetTime(prefs::kAudioInputStreamLastTimeCreated) == + first_capture_time; + })); + + // The model observer should now be registered. + EXPECT_TRUE(model_provider_.IsRegistered( + optimization_guide::proto:: + OPTIMIZATION_TARGET_WEBRTC_NEURAL_RESIDUAL_ECHO_ESTIMATOR)); + + // Advance time again. + task_environment_.AdvanceClock(base::Days(1)); + base::Time second_capture_time = base::Time::Now(); + + // Trigger another audio capture. + MediaCaptureDevicesDispatcher::GetInstance()->OnMediaRequestStateChanged( + /*render_process_id=*/0, /*render_frame_id=*/0, /*page_request_id=*/0, + GURL(), blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE, + content::MEDIA_REQUEST_STATE_DONE); + EXPECT_TRUE(base::test::RunUntil([&]() { + return local_state_.GetTime(prefs::kAudioInputStreamLastTimeCreated) == + second_capture_time; + })); +} + +TEST_F(AudioProcessMlModelForwarderTest, DeregisterFromModelUpdatesOnDestruction) { forwarder_->Initialize(model_provider_); forwarder_->OnAudioProcessLaunched(std::move(remote_ml_model_manager_)); + forwarder_->OnAudioCaptureStarted(); forwarder_.reset(); EXPECT_FALSE(model_provider_.IsRegistered( @@ -124,6 +225,7 @@ TEST_F(AudioProcessMlModelForwarderTest, ForwardUpdates) { forwarder_->Initialize(model_provider_); forwarder_->OnAudioProcessLaunched(std::move(remote_ml_model_manager_)); + forwarder_->OnAudioCaptureStarted(); testing::InSequence s; @@ -163,6 +265,7 @@ ForwardModelFileOnAudioProcessRestart) { forwarder_->Initialize(model_provider_); forwarder_->OnAudioProcessLaunched(std::move(remote_ml_model_manager_)); + forwarder_->OnAudioCaptureStarted(); // Forward the model to the first audio process instance. EXPECT_CALL(ml_model_manager_, SetResidualEchoEstimationModel(testing::_)) @@ -193,6 +296,7 @@ HandleModelUpdateAfterAudioProcessCrash) { forwarder_->Initialize(model_provider_); forwarder_->OnAudioProcessLaunched(std::move(remote_ml_model_manager_)); + forwarder_->OnAudioCaptureStarted(); // Simulate a crash by invalidating the receiver. ml_model_manager_.ResetReceiver(); @@ -219,6 +323,7 @@ // Set up the forwarder with a model file. forwarder_->Initialize(model_provider_); forwarder_->OnAudioProcessLaunched(std::move(remote_ml_model_manager_)); + forwarder_->OnAudioCaptureStarted(); model_provider_.UpdateModelImmediatelyForTesting( optimization_guide::proto:: OPTIMIZATION_TARGET_WEBRTC_NEURAL_RESIDUAL_ECHO_ESTIMATOR,
diff --git a/chrome/browser/media/webrtc/webrtc_rtp_dump_writer.cc b/chrome/browser/media/webrtc/webrtc_rtp_dump_writer.cc index 197fedc..4a65655 100644 --- a/chrome/browser/media/webrtc/webrtc_rtp_dump_writer.cc +++ b/chrome/browser/media/webrtc/webrtc_rtp_dump_writer.cc
@@ -418,7 +418,8 @@ return; } + bool incoming_succeeded = context.incoming_succeeded; + bool outgoing_succeeded = context.outgoing_succeeded; // This object might be deleted after running the callback. - std::move(context).callback.Run(context.incoming_succeeded, - context.outgoing_succeeded); + std::move(context).callback.Run(incoming_succeeded, outgoing_succeeded); }
diff --git a/chrome/browser/metrics/chrome_metrics_service_client.cc b/chrome/browser/metrics/chrome_metrics_service_client.cc index 90517ef..80dc3cf 100644 --- a/chrome/browser/metrics/chrome_metrics_service_client.cc +++ b/chrome/browser/metrics/chrome_metrics_service_client.cc
@@ -840,8 +840,8 @@ metrics_state_manager_->IsMetricsReportingEnabled())); metrics_service_->RegisterMetricsProvider( - std::make_unique<metrics::DriveMetricsProvider>( - chrome::FILE_LOCAL_STATE)); + std::make_unique<metrics::DriveMetricsProvider>(chrome::FILE_LOCAL_STATE, + local_state)); metrics_service_->RegisterMetricsProvider( std::make_unique<metrics::CallStackProfileMetricsProvider>());
diff --git a/chrome/browser/metrics/critical_user_journeys/critical_user_journey_session.cc b/chrome/browser/metrics/critical_user_journeys/critical_user_journey_session.cc index 030d58f..bde7d5d 100644 --- a/chrome/browser/metrics/critical_user_journeys/critical_user_journey_session.cc +++ b/chrome/browser/metrics/critical_user_journeys/critical_user_journey_session.cc
@@ -96,11 +96,9 @@ void CriticalUserJourneySession::OnStepStarted(int metric_id) { last_reached_metric_id_ = metric_id; - // Use ExactLinear to treat this as an enumerated histogram in the dashboard. - // 100 is a reasonable maximum for the number of steps in a CUJ. base::UmaHistogramExactLinear( base::StrCat({"CriticalUserJourney.", journey_->name(), ".StepReached"}), - metric_id, MAX_JOURNEY_STEPS); + metric_id, MAX_JOURNEY_STEPS + 1); } void CriticalUserJourneySession::OnAborted(
diff --git a/chrome/browser/new_tab_page/modules/file_suggestion/drive_service_unittest.cc b/chrome/browser/new_tab_page/modules/file_suggestion/drive_service_unittest.cc index 26997f2..77249ae 100644 --- a/chrome/browser/new_tab_page/modules/file_suggestion/drive_service_unittest.cc +++ b/chrome/browser/new_tab_page/modules/file_suggestion/drive_service_unittest.cc
@@ -529,7 +529,7 @@ service_->GetDriveFiles(callback.Get()); identity_test_env.WaitForAccessTokenRequestIfNecessaryAndRespondWithError( - GoogleServiceAuthError(GoogleServiceAuthError::State::CONNECTION_FAILED)); + GoogleServiceAuthError::FromConnectionError(net::ERR_FAILED)); EXPECT_FALSE(token_is_valid); ASSERT_EQ(0, histogram_tester_.GetBucketCount(
diff --git a/chrome/browser/new_tab_page/new_tab_page_realbox_interactive_uitest.cc b/chrome/browser/new_tab_page/new_tab_page_realbox_interactive_uitest.cc index 58db701..1eb01d2 100644 --- a/chrome/browser/new_tab_page/new_tab_page_realbox_interactive_uitest.cc +++ b/chrome/browser/new_tab_page/new_tab_page_realbox_interactive_uitest.cc
@@ -262,8 +262,6 @@ switch (layout_mode.value()) { case RealboxLayoutMode::kTallBottomContext: return ntp_realbox::kRealboxLayoutModeTallBottomContext; - case RealboxLayoutMode::kTallTopContext: - return ntp_realbox::kRealboxLayoutModeTallTopContext; case RealboxLayoutMode::kCompact: return ntp_realbox::kRealboxLayoutModeCompact; } @@ -397,16 +395,6 @@ .color_scheme = ui::NativeTheme::PreferredColorScheme::kDark, .rtl = true, }, - // Tall top, compose enabled, light mode, LTR - { - .layout_mode = RealboxLayoutMode::kTallTopContext, - }, - // Tall top, compose enabled, dark mode, RTL - { - .layout_mode = RealboxLayoutMode::kTallTopContext, - .color_scheme = ui::NativeTheme::PreferredColorScheme::kDark, - .rtl = true, - }, }), [](const testing::TestParamInfo<NtpRealboxUiTestParams>& info) { return info.param.ToString();
diff --git a/chrome/browser/optimization_guide/android/optimization_guide_bridge.cc b/chrome/browser/optimization_guide/android/optimization_guide_bridge.cc index 41fc70e..39a507f 100644 --- a/chrome/browser/optimization_guide/android/optimization_guide_bridge.cc +++ b/chrome/browser/optimization_guide/android/optimization_guide_bridge.cc
@@ -206,8 +206,8 @@ OptimizationGuideBridge::GetJavaObject() { JNIEnv* env = AttachCurrentThread(); if (!java_ref_) { - java_ref_.Reset(JOptimizationGuideBridgeJni::New( - env, reinterpret_cast<intptr_t>(this))); + java_ref_.Reset( + OptimizationGuideBridgeJni::New(env, reinterpret_cast<intptr_t>(this))); } return ScopedJavaLocalRef<JOptimizationGuideBridge>(java_ref_); }
diff --git a/chrome/browser/optimization_guide/android/optimization_guide_bridge_unittest.cc b/chrome/browser/optimization_guide/android/optimization_guide_bridge_unittest.cc index d2dfef3..50e87cd 100644 --- a/chrome/browser/optimization_guide/android/optimization_guide_bridge_unittest.cc +++ b/chrome/browser/optimization_guide/android/optimization_guide_bridge_unittest.cc
@@ -64,7 +64,7 @@ -> std::unique_ptr<KeyedService> { return std::make_unique<MockOptimizationGuideKeyedService>(); }))); - j_test_ = JOptimizationGuideBridgeNativeUnitTestJni::New( + j_test_ = OptimizationGuideBridgeNativeUnitTestJni::New( env_, optimization_guide_keyed_service_->GetJavaObject()); }
diff --git a/chrome/browser/page_load_metrics/integration_tests/soft_navigation_metrics_browsertest.cc b/chrome/browser/page_load_metrics/integration_tests/soft_navigation_metrics_browsertest.cc index 1763fbc..1db8b1d 100644 --- a/chrome/browser/page_load_metrics/integration_tests/soft_navigation_metrics_browsertest.cc +++ b/chrome/browser/page_load_metrics/integration_tests/soft_navigation_metrics_browsertest.cc
@@ -35,10 +35,9 @@ #include "third_party/blink/public/mojom/navigation/navigation_type_for_navigation_api.mojom-shared.h" #include "ui/gfx/geometry/point_conversions.h" -using page_load_metrics::PageLoadMetricsTestWaiter; -using TimingField = page_load_metrics::PageLoadMetricsTestWaiter::TimingField; - +namespace page_load_metrics { namespace { + std::map<int64_t, double> GetSoftNavigationMetrics( const ukm::TestUkmRecorder& ukm_recorder, std::string_view metric_name) { @@ -77,16 +76,6 @@ feature_list_.InitWithFeatures(enabled_feature_list, {} /*disabled*/); } - std::unique_ptr<PageLoadMetricsTestWaiter> CreatePageLoadMetricsTestWaiter( - const char* observer_name, - content::WebContents* web_contents = nullptr) { - if (!web_contents) { - web_contents = browser()->tab_strip_model()->GetActiveWebContents(); - } - return std::make_unique<PageLoadMetricsTestWaiter>(web_contents, - observer_name); - } - void SimulateMouseDownElementWithId(const std::string& id) { gfx::Point point = gfx::ToFlooredPoint( GetCenterCoordinatesOfElementWithId(web_contents(), id)); @@ -119,9 +108,9 @@ frame_observer.Wait(); } - void SimulateUserInteraction( - page_load_metrics::PageLoadMetricsTestWaiter* waiter, - int expected_num_interactions) { + void SimulateUserInteractionAndWait(PageLoadMetricsTestWaiter* waiter, + int expected_num_interactions, + std::string_view element_id) { waiter->AddNumInteractionsExpectation(expected_num_interactions); EXPECT_TRUE(ExecJs(web_contents(), "registerEventListeners(); ")); @@ -129,21 +118,21 @@ WaitForFrameReady(); // Simulate a click on button which has default browser-driven presentation. - content::SimulateMouseClickOrTapElementWithId(web_contents(), "div"); + content::SimulateMouseClickOrTapElementWithId(web_contents(), element_id); EXPECT_TRUE(ExecJs(web_contents(), "waitForClick();")); waiter->Wait(); } - void TriggerSoftNavigation( - page_load_metrics::PageLoadMetricsTestWaiter* waiter, - int expected_soft_nav_count) { + void TriggerSoftNavigationAndWait(PageLoadMetricsTestWaiter* waiter, + int expected_soft_nav_count, + std::string_view element_id) { waiter->AddSoftNavigationCountExpectation(expected_soft_nav_count); waiter->AddSoftNavigationLargestContentfulPaintExpectation( expected_soft_nav_count); - - content::SimulateMouseClickOrTapElementWithId(web_contents(), "link"); + WaitForFrameReady(); + content::SimulateMouseClickOrTapElementWithId(web_contents(), element_id); waiter->Wait(); } @@ -280,29 +269,38 @@ return true; } - int ExtractMaxInteractionDurationFromTrace( + int64_t ExtractMaxInteractionDurationFromTrace( trace_analyzer::TraceEventVector events) { - int max_duration = 0; - int sizeOfEvents = (int)events.size(); - for (int i = 0; i < sizeOfEvents; i++) { - auto* traceEvent = events[i]; - + int64_t max_duration = 0; + for (const trace_analyzer::TraceEvent* traceEvent : events) { // If the traceEvent doesn't contain args data, it is not // one of pointerdown, pointerup and click. - if (traceEvent->HasDictArg("data")) { - base::DictValue data = traceEvent->GetKnownArgAsDict("data"); + if (!traceEvent->HasDictArg("data")) { + continue; + } + base::DictValue data = traceEvent->GetKnownArgAsDict("data"); - // INP only consider the events with interactionID greater than 0. - std::string* event_name = data.FindString("type"); - if ((*event_name == "pointerdown" || *event_name == "pointerup" || - *event_name == "click") && - data.FindInt("interactionId").value_or(-1) > 0) { - int duration = (int)*(data.FindDouble("duration")); - - // Ensure the max_duration carries the largest duration out of - // pointerdown, pointerup and click. - max_duration = fmax(max_duration, duration); - } + // INP only consider the events with interactionID greater than 0. + if (data.FindInt("interactionId").value_or(-1) <= 0) { + continue; + } + std::string* event_name = data.FindString("type"); + EXPECT_TRUE(event_name != nullptr); + if (event_name == nullptr) { + continue; + } + // Ensure the max_duration carries the largest duration out of + // pointerdown, pointerup and click. + if (*event_name != "pointerdown" && *event_name != "pointerup" && + *event_name != "click") { + continue; + } + std::optional<double> duration = data.FindDouble("duration"); + EXPECT_TRUE(duration.has_value()); + EXPECT_TRUE(std::isfinite(duration.value())); + int64_t duration_as_int = static_cast<int64_t>(duration.value()); + if (duration_as_int > max_duration) { + max_duration = duration_as_int; } } return max_duration; @@ -489,28 +487,22 @@ // Start the test, load soft_navigation_basics.html and wait for // load, fcp, and lcp to be observed. Start(); - auto waiter = CreatePageLoadMetricsTestWaiter("waiter"); - waiter->AddPageExpectation(TimingField::kLoadEvent); - waiter->AddPageExpectation(TimingField::kFirstContentfulPaint); - waiter->AddPageExpectation(TimingField::kLargestContentfulPaint); + PageLoadMetricsTestWaiter waiter(web_contents()); + waiter.AddPageExpectation(PageLoadMetricsTestWaiter::TimingField::kLoadEvent); + waiter.AddPageExpectation( + PageLoadMetricsTestWaiter::TimingField::kFirstContentfulPaint); + waiter.AddPageExpectation( + PageLoadMetricsTestWaiter::TimingField::kLargestContentfulPaint); Load("/soft_navigation_basics.html#image"); - waiter->Wait(); + waiter.Wait(); // 1st soft navigation: click on the next page button and wait for soft // navigation count and image lcp. - waiter->AddSoftNavigationCountExpectation(1); - waiter->AddSoftNavigationLargestContentfulPaintExpectation(1); - WaitForFrameReady(); - content::SimulateMouseClickOrTapElementWithId(web_contents(), "next-page"); - waiter->Wait(); + TriggerSoftNavigationAndWait(&waiter, 1, "next-page"); // 2nd soft navigation: click on the next page button and wait for soft // navigation count and image lcp. - waiter->AddSoftNavigationCountExpectation(2); - waiter->AddSoftNavigationLargestContentfulPaintExpectation(2); - WaitForFrameReady(); - content::SimulateMouseClickOrTapElementWithId(web_contents(), "next-page"); - waiter->Wait(); + TriggerSoftNavigationAndWait(&waiter, 2, "next-page"); base::ListValue soft_nav_lcp_list; if (GetParam()) { @@ -526,8 +518,8 @@ VerifySoftNavigationCount(/*expected_count=*/2); - VerifySoftNavIdsAndSoftLcpStartTimes( - soft_nav_lcp_list, /*expected_soft_nav_count=*/2); + VerifySoftNavIdsAndSoftLcpStartTimes(soft_nav_lcp_list, + /*expected_soft_nav_count=*/2); // Verify 2 LCP discovery time timings are reported. auto source_id_to_lcp_discovery_time = GetSoftNavigationMetrics( @@ -598,28 +590,22 @@ // Start the test, load soft_navigation_basics.html and wait for // load, fcp, and lcp to be observed. Start(); - auto waiter = CreatePageLoadMetricsTestWaiter("waiter"); - waiter->AddPageExpectation(TimingField::kLoadEvent); - waiter->AddPageExpectation(TimingField::kFirstContentfulPaint); - waiter->AddPageExpectation(TimingField::kLargestContentfulPaint); + PageLoadMetricsTestWaiter waiter(web_contents()); + waiter.AddPageExpectation(PageLoadMetricsTestWaiter::TimingField::kLoadEvent); + waiter.AddPageExpectation( + PageLoadMetricsTestWaiter::TimingField::kFirstContentfulPaint); + waiter.AddPageExpectation( + PageLoadMetricsTestWaiter::TimingField::kLargestContentfulPaint); Load("/soft_navigation_basics.html#text"); - waiter->Wait(); + waiter.Wait(); // 1st soft navigation: click on the next page button and wait for soft // navigation count and text lcp. - waiter->AddSoftNavigationCountExpectation(1); - waiter->AddSoftNavigationLargestContentfulPaintExpectation(1); - WaitForFrameReady(); - content::SimulateMouseClickOrTapElementWithId(web_contents(), "next-page"); - waiter->Wait(); + TriggerSoftNavigationAndWait(&waiter, 1, "next-page"); // 2nd soft navigation: click on the next page button and wait for soft // navigation count and text lcp. - waiter->AddSoftNavigationCountExpectation(2); - waiter->AddSoftNavigationLargestContentfulPaintExpectation(2); - WaitForFrameReady(); - content::SimulateMouseClickOrTapElementWithId(web_contents(), "next-page"); - waiter->Wait(); + TriggerSoftNavigationAndWait(&waiter, 2, "next-page"); base::ListValue soft_nav_lcp_list; if (GetParam()) { @@ -635,8 +621,8 @@ VerifySoftNavigationCount(/*expected_count=*/2); - VerifySoftNavIdsAndSoftLcpStartTimes( - soft_nav_lcp_list, /*expected_soft_nav_count=*/2); + VerifySoftNavIdsAndSoftLcpStartTimes(soft_nav_lcp_list, + /*expected_soft_nav_count=*/2); // Verify LCP types. auto source_id_to_lcp_type = GetSoftNavigationMetrics( @@ -664,24 +650,17 @@ IN_PROC_BROWSER_TEST_P(SoftNavigationTest, BackButton) { // Load soft_navigation_basics.html and wait for lcp. Start(); - auto waiter = CreatePageLoadMetricsTestWaiter("waiter"); - waiter->AddPageExpectation(TimingField::kLargestContentfulPaint); + PageLoadMetricsTestWaiter waiter(web_contents()); + waiter.AddPageExpectation( + PageLoadMetricsTestWaiter::TimingField::kLargestContentfulPaint); Load("/soft_navigation_basics.html#text"); - waiter->Wait(); + waiter.Wait(); // 1st soft navigation: click on the next page button. - waiter->AddSoftNavigationCountExpectation(1); - waiter->AddSoftNavigationLargestContentfulPaintExpectation(1); - WaitForFrameReady(); - content::SimulateMouseClickOrTapElementWithId(web_contents(), "next-page"); - waiter->Wait(); + TriggerSoftNavigationAndWait(&waiter, 1, "next-page"); // 2nd soft navigation: click on the next page button. - waiter->AddSoftNavigationCountExpectation(2); - waiter->AddSoftNavigationLargestContentfulPaintExpectation(2); - WaitForFrameReady(); - content::SimulateMouseClickOrTapElementWithId(web_contents(), "next-page"); - waiter->Wait(); + TriggerSoftNavigationAndWait(&waiter, 2, "next-page"); // Now we simulate the back button. However, a regular back-button click or // content::HistoryGoBack would trigger this intervention: @@ -691,18 +670,18 @@ // avoiding the intervention by adding a user activation to the page. // 3rd soft navigation: going backwards in history. - waiter->AddSoftNavigationCountExpectation(3); - waiter->AddSoftNavigationLargestContentfulPaintExpectation(3); + waiter.AddSoftNavigationCountExpectation(3); + waiter.AddSoftNavigationLargestContentfulPaintExpectation(3); WaitForFrameReady(); ASSERT_TRUE(content::HistoryGoToOffset(web_contents(), -1)); - waiter->Wait(); + waiter.Wait(); // 4th soft navigation: going backwards in history. - waiter->AddSoftNavigationCountExpectation(4); - waiter->AddSoftNavigationLargestContentfulPaintExpectation(4); + waiter.AddSoftNavigationCountExpectation(4); + waiter.AddSoftNavigationLargestContentfulPaintExpectation(4); WaitForFrameReady(); ASSERT_TRUE(content::HistoryGoToOffset(web_contents(), -1)); - waiter->Wait(); + waiter.Wait(); base::ListValue soft_nav_lcp_list; if (GetParam()) { @@ -760,15 +739,14 @@ } IN_PROC_BROWSER_TEST_P(SoftNavigationTest, NoSoftNavigation) { - auto waiter = std::make_unique<page_load_metrics::PageLoadMetricsTestWaiter>( - web_contents()); + PageLoadMetricsTestWaiter waiter(web_contents()); - waiter->AddMinimumLargestContentfulPaintImageExpectation(1); + waiter.AddMinimumLargestContentfulPaintImageExpectation(1); Start(); Load("/soft_navigation.html"); - waiter->Wait(); + waiter.Wait(); ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("about:blank"))); @@ -782,8 +760,7 @@ IN_PROC_BROWSER_TEST_P(SoftNavigationTest, INP_ClickWithPresentation) { // Add waiter to wait for the interaction is arrived in browser. - auto waiter = std::make_unique<page_load_metrics::PageLoadMetricsTestWaiter>( - web_contents()); + PageLoadMetricsTestWaiter waiter(web_contents()); // Start tracing to record tracing data. StartTracing({"devtools.timeline"}); @@ -799,19 +776,19 @@ WaitForFrameReady(); - SimulateUserInteraction(waiter.get(), 1); + SimulateUserInteractionAndWait(&waiter, 1, "div"); // Trigger 1st soft nav. - TriggerSoftNavigation(waiter.get(), 1); + TriggerSoftNavigationAndWait(&waiter, 1, "link"); // Trigger a user interaction. - SimulateUserInteraction(waiter.get(), 3); + SimulateUserInteractionAndWait(&waiter, 3, "div"); // Trigger 2nd soft nav. - TriggerSoftNavigation(waiter.get(), 2); + TriggerSoftNavigationAndWait(&waiter, 2, "link"); // Trigger a user interaction. - SimulateUserInteraction(waiter.get(), 5); + SimulateUserInteractionAndWait(&waiter, 5, "div"); // Navigate to blank page to ensure the data gets flushed from renderer to // browser. @@ -823,12 +800,10 @@ } IN_PROC_BROWSER_TEST_P(SoftNavigationTest, LayoutShift) { - auto waiter = std::make_unique<page_load_metrics::PageLoadMetricsTestWaiter>( - web_contents()); + PageLoadMetricsTestWaiter waiter(web_contents()); - waiter->AddPageLayoutShiftExpectation( - page_load_metrics::PageLoadMetricsTestWaiter::ShiftFrame:: - LayoutShiftOnlyInMainFrame, + waiter.AddPageLayoutShiftExpectation( + PageLoadMetricsTestWaiter::ShiftFrame::LayoutShiftOnlyInMainFrame, /*num_layout_shifts=*/1); Start(); @@ -847,25 +822,24 @@ double cls_before_soft_nav = GetCLSFromList(entry_records_list); - waiter->Wait(); + waiter.Wait(); // Set up for soft navigation. EXPECT_TRUE(EvalJs(web_contents()->GetPrimaryMainFrame(), "setEventAndWait()") .is_ok()); // Trigger 1st soft navigation. - TriggerSoftNavigation(waiter.get(), 1); + TriggerSoftNavigationAndWait(&waiter, 1, "link"); // Trigger a layout shift. - waiter->AddPageLayoutShiftExpectation( - page_load_metrics::PageLoadMetricsTestWaiter::ShiftFrame:: - LayoutShiftOnlyInMainFrame, + waiter.AddPageLayoutShiftExpectation( + PageLoadMetricsTestWaiter::ShiftFrame::LayoutShiftOnlyInMainFrame, /*num_layout_shifts=*/1); // TODO: handle return value. std::ignore = EvalJs(web_contents(), "triggerLayoutShift()"); - waiter->Wait(); + waiter.Wait(); // Retrieve web exposed layout shift entries if the runtime flag for soft nav // is on. @@ -883,19 +857,17 @@ } // Trigger 2nd soft navigation. - TriggerSoftNavigation(waiter.get(), 2); + TriggerSoftNavigationAndWait(&waiter, 2, "link"); // Trigger a layout shift. - waiter->AddPageLayoutShiftExpectation( - page_load_metrics::PageLoadMetricsTestWaiter::ShiftFrame:: - LayoutShiftOnlyInMainFrame, + waiter.AddPageLayoutShiftExpectation( + PageLoadMetricsTestWaiter::ShiftFrame::LayoutShiftOnlyInMainFrame, /*num_layout_shifts=*/1); // TODO: handle return value. - std::ignore = EvalJs(web_contents(), - "triggerLayoutShift(" + base::NumberToString(1.5) + ")"); + std::ignore = EvalJs(web_contents(), "triggerLayoutShift(1.5)"); - waiter->Wait(); + waiter.Wait(); // Retrieve web exposed layout shift entries if the runtime flag for soft nav // is on. @@ -920,7 +892,7 @@ ExpectUKMPageLoadMetricNear( ukm::builders::PageLoad:: kLayoutInstabilityBeforeSoftNavigation_MaxCumulativeShiftScore_MainFrame_SessionWindow_Gap1000ms_Max5000msName, - page_load_metrics::LayoutShiftUkmValue(cls_before_soft_nav), 1); + LayoutShiftUkmValue(cls_before_soft_nav), 1); // Verify soft nav CLS records exist. auto source_id_to_soft_nav_cls = GetSoftNavigationMetrics( @@ -933,10 +905,11 @@ // Verify soft navigation layout shift values against web-exposed values if (GetParam()) { EXPECT_NEAR(source_id_to_soft_nav_cls.begin()->second, - page_load_metrics::LayoutShiftUkmValue(soft_nav_1_cls), 1); + LayoutShiftUkmValue(soft_nav_1_cls), 1); EXPECT_NEAR(std::next(source_id_to_soft_nav_cls.begin())->second, - page_load_metrics::LayoutShiftUkmValue(soft_nav_2_cls), 1); + LayoutShiftUkmValue(soft_nav_2_cls), 1); } } } // namespace +} // namespace page_load_metrics
diff --git a/chrome/browser/password_manager/android/grouped_affiliations/acknowledge_grouped_credential_sheet_bridge.cc b/chrome/browser/password_manager/android/grouped_affiliations/acknowledge_grouped_credential_sheet_bridge.cc index 4f59646..a2943269d 100644 --- a/chrome/browser/password_manager/android/grouped_affiliations/acknowledge_grouped_credential_sheet_bridge.cc +++ b/chrome/browser/password_manager/android/grouped_affiliations/acknowledge_grouped_credential_sheet_bridge.cc
@@ -31,7 +31,7 @@ void Create(const gfx::NativeWindow window_android, AcknowledgeGroupedCredentialSheetBridge* bridge) override { - java_bridge_.Reset(JAcknowledgeGroupedCredentialSheetBridgeJni::New( + java_bridge_.Reset(AcknowledgeGroupedCredentialSheetBridgeJni::New( base::android::AttachCurrentThread(), reinterpret_cast<intptr_t>(bridge), window_android->GetJavaObject())); }
diff --git a/chrome/browser/password_manager/password_change/password_change_from_checkup_delegate.cc b/chrome/browser/password_manager/password_change/password_change_from_checkup_delegate.cc index 965fb7ef..11644ad2 100644 --- a/chrome/browser/password_manager/password_change/password_change_from_checkup_delegate.cc +++ b/chrome/browser/password_manager/password_change/password_change_from_checkup_delegate.cc
@@ -16,7 +16,6 @@ #include "base/values.h" #include "build/branding_buildflags.h" #include "chrome/browser/actor/actor_keyed_service.h" -#include "chrome/browser/actor/execution_engine.h" #include "chrome/browser/glic/public/glic_invoke_options.h" #include "chrome/browser/glic/public/glic_keyed_service.h" #include "chrome/browser/glic/public/glic_passkeys.h" @@ -25,7 +24,6 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser_window/public/browser_window_interface.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/common/actor_webui.mojom.h" #include "chrome/grit/browser_resources.h" #include "components/password_manager/core/browser/password_form_manager.h" #include "ui/base/resource/resource_bundle.h" @@ -44,22 +42,6 @@ namespace { -bool IsValidUrl(const GURL& url) { - return url.is_valid() && url.SchemeIsHTTPOrHTTPS(); -} - -bool IsSameOrigin(const std::u16string& credential_source_site_or_app, - const GURL& credential_target_url) { - GURL source_url(credential_source_site_or_app); - - if (!IsValidUrl(credential_target_url) || !IsValidUrl(source_url)) { - return false; - } - - return url::Origin::Create(source_url) - .IsSameOriginWith(url::Origin::Create(credential_target_url)); -} - std::string GetFallbackPromptToReachForm(std::string_view domain, std::string_view username) { return base::StrCat( @@ -176,8 +158,8 @@ originator_ = std::move(web_contents); // TODO(crbug.com/485620841): Handle non-web URLs for Android passwords. - credential_url_ = credential.GetURL(); - std::string site_domain(credential_url_.host()); + const GURL& credential_url = credential.GetURL(); + std::string site_domain(credential_url.host()); username_ = credential.username; current_password_ = credential.password; @@ -186,43 +168,13 @@ base::BindOnce(&GetReachChangeFormPrompt, std::move(site_domain), base::UTF16ToUTF8(username_)), base::BindOnce(&PasswordChangeFromCheckupDelegate::OnPromptReady, - weak_ptr_factory_.GetWeakPtr())); + weak_ptr_factory_.GetWeakPtr(), credential_url)); } -void PasswordChangeFromCheckupDelegate::AutoSelectCredential( - const std::vector<actor_login::Credential>& credentials, - actor::ToolDelegate::CredentialSelectedCallback callback) { - if (!actuation_web_contents_) { - std::move(callback).Run( - actor::webui::mojom::SelectCredentialDialogResponse::New()); - return; - } - - for (const auto& cred : credentials) { - // Discard credentials that are not passwords. - if (cred.type != actor_login::CredentialType::kPassword || - cred.username != username_) { - continue; - } - - if (IsSameOrigin(cred.source_site_or_app, credential_url_)) { - auto response = - actor::webui::mojom::SelectCredentialDialogResponse::New(); - response->selected_credential_id = cred.id.value(); - response->permission_duration = - actor::webui::mojom::UserGrantedPermissionDuration::kOneTime; - std::move(callback).Run(std::move(response)); - return; - } - } - - std::move(callback).Run( - actor::webui::mojom::SelectCredentialDialogResponse::New()); -} - -void PasswordChangeFromCheckupDelegate::OnPromptReady(std::string prompt) { +void PasswordChangeFromCheckupDelegate::OnPromptReady(GURL credential_url, + std::string prompt) { if (prompt.empty()) { - std::string site_domain(credential_url_.host()); + std::string site_domain(credential_url.host()); prompt = GetFallbackPromptToReachForm(site_domain, base::UTF16ToUTF8(username_)); } @@ -243,7 +195,7 @@ } content::OpenURLParams open_url_params( - credential_url_.GetWithEmptyPath(), content::Referrer(), + credential_url.GetWithEmptyPath(), content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_AUTO_TOPLEVEL, /*is_renderer_initiated=*/false); @@ -301,7 +253,7 @@ void PasswordChangeFromCheckupDelegate::OnFindFormTaskStateChanged( actor::TaskId task_id, actor::ActorTask::State new_state) { - if (!find_form_task_id_) { + if (!find_form_task_id_ && new_state == actor::ActorTask::State::kCreated) { actor::ActorKeyedService* actor_service = actor::ActorKeyedService::Get(Profile::FromBrowserContext( actuation_web_contents_->GetBrowserContext())); @@ -315,10 +267,7 @@ } find_form_task_id_ = actor_task_for_actuation->id(); - actor_task_for_actuation->GetExecutionEngine() - .PreHandleCredentialSelectionDialog(base::BindOnce( - &PasswordChangeFromCheckupDelegate::AutoSelectCredential, - weak_ptr_factory_.GetWeakPtr())); + return; } if (find_form_task_id_ && *find_form_task_id_ != task_id) {
diff --git a/chrome/browser/password_manager/password_change/password_change_from_checkup_delegate.h b/chrome/browser/password_manager/password_change/password_change_from_checkup_delegate.h index 2b6c2b84..c3ba4f7 100644 --- a/chrome/browser/password_manager/password_change/password_change_from_checkup_delegate.h +++ b/chrome/browser/password_manager/password_change/password_change_from_checkup_delegate.h
@@ -12,7 +12,6 @@ #include "base/memory/weak_ptr.h" #include "base/timer/timer.h" #include "chrome/browser/actor/actor_keyed_service.h" -#include "chrome/browser/actor/tools/tool_delegate.h" #include "chrome/browser/password_manager/password_change/change_password_form_filling_submission_helper.h" #include "url/gurl.h" @@ -55,11 +54,7 @@ #endif private: - void AutoSelectCredential( - const std::vector<actor_login::Credential>& credentials, - actor::ToolDelegate::CredentialSelectedCallback callback); - - void OnPromptReady(std::string prompt); + void OnPromptReady(GURL credential_url, std::string prompt); glic::GlicKeyedService* GetGlicService(); @@ -81,9 +76,6 @@ std::u16string username_; std::u16string current_password_; - GURL credential_url_; - - std::optional<actor::TaskId> actor_task_id_; base::CallbackListSubscription actor_task_state_subscription_;
diff --git a/chrome/browser/password_manager/password_change_from_checkup_browsertest.cc b/chrome/browser/password_manager/password_change_from_checkup_browsertest.cc index 91ea7c00..5a20a47b 100644 --- a/chrome/browser/password_manager/password_change_from_checkup_browsertest.cc +++ b/chrome/browser/password_manager/password_change_from_checkup_browsertest.cc
@@ -5,14 +5,10 @@ #include <memory> #include <string> -#include "base/strings/utf_string_conversions.h" -#include "base/test/bind.h" #include "base/test/run_until.h" -#include "base/test/test_future.h" #include "chrome/browser/actor/actor_features.h" #include "chrome/browser/actor/actor_keyed_service.h" #include "chrome/browser/actor/actor_keyed_service_factory.h" -#include "chrome/browser/actor/actor_task.h" #include "chrome/browser/actor/actor_test_util.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/glic/glic_profile_manager.h" @@ -29,12 +25,10 @@ #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/common/actor/action_result.h" #include "components/autofill/core/common/autofill_test_utils.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" #include "components/optimization_guide/core/optimization_guide_proto_util.h" #include "components/optimization_guide/proto/model_quality_service.pb.h" -#include "components/password_manager/core/browser/features/password_features.h" #include "components/password_manager/core/browser/password_form.h" #include "components/password_manager/core/browser/ui/credential_ui_entry.h" #include "components/tabs/public/tab_interface.h" @@ -67,11 +61,6 @@ class PasswordChangeFromCheckupDelegateBrowserTest : public PasswordManagerBrowserTestBase { public: - PasswordChangeFromCheckupDelegateBrowserTest() { - feature_list_.InitAndEnableFeature( - password_manager::features::kPasswordCheckupPrototype); - } - void SetUpBrowserContextKeyedServices( content::BrowserContext* context) override { OptimizationGuideKeyedServiceFactory::GetInstance()->SetTestingFactory( @@ -86,7 +75,6 @@ private: autofill::test::AutofillBrowserTestEnvironment autofill_environment_; glic::GlicTestEnvironment glic_test_env_; - base::test::ScopedFeatureList feature_list_; }; IN_PROC_BROWSER_TEST_F(PasswordChangeFromCheckupDelegateBrowserTest, @@ -100,39 +88,28 @@ ASSERT_TRUE(web_contents); auto delegate = std::make_unique<PasswordChangeFromCheckupDelegate>(); + EXPECT_FALSE(delegate->HasActorTaskSubscriptionForTesting()); GURL url = embedded_test_server()->GetURL("example.com", "/title1.html"); delegate->StartPasswordChangeFlow(CreateCredentialUIEntry(url), web_contents->GetWeakPtr()); - EXPECT_TRUE(base::test::RunUntil( [&]() { return delegate->HasActorTaskSubscriptionForTesting(); })); - auto* actuation_tab = browser()->tab_strip_model()->GetActiveTab(); - - // Create task and add the tab to the task. + EXPECT_TRUE(delegate->HasActorTaskSubscriptionForTesting()); + // Simulate the actor starting and then finishing a task. actor::TaskId task_id = actor_service->CreateTask( actor::TestTaskSourceInfo(), actor::NoEnterprisePolicyChecker()); - actor::ActorTask* task = actor_service->GetTask(task_id); - base::test::TestFuture<actor::mojom::ActionResultPtr> add_tab_future; - task->AddTab(actuation_tab->GetHandle(), add_tab_future.GetCallback()); - EXPECT_TRUE(add_tab_future.Wait()); - - actor_service->NotifyTaskStateChanged(task_id, - actor::ActorTask::State::kActing); - // Finish the task actor_service->StopTask(task_id, actor::ActorTask::StoppedReason::kTaskComplete); - // Wait for the actor task to finish. - EXPECT_TRUE(base::test::RunUntil([&]() { - return delegate->GetFindFormTaskState() == - actor::ActorTask::State::kFinished; - })); + // Waiting for the actor task to reach `kFinished` state and unsubscribe. + EXPECT_TRUE(base::test::RunUntil( + [&]() { return !delegate->HasActorTaskSubscriptionForTesting(); })); } // TODO(https://crbug.com/492810570): Fix the flakiness. -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) #define MAYBE_FormWaiterFindsFormAndSubmits \ DISABLED_FormWaiterFindsFormAndSubmits #else @@ -215,20 +192,15 @@ GURL url = embedded_test_server()->GetURL("example.com", "/title1.html"); delegate->StartPasswordChangeFlow(CreateCredentialUIEntry(url), originator_contents->GetWeakPtr()); - EXPECT_TRUE(base::test::RunUntil( [&]() { return delegate->HasActorTaskSubscriptionForTesting(); })); - // A new tab for the actuation is opened. - auto* actuation_tab = browser()->tab_strip_model()->GetActiveTab(); - // Create task and add the tab to it. + // A new tab for the actutation is opened. + content::WebContents* actuation_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + EXPECT_NE(originator_contents, actuation_contents); + actor::TaskId task_id = actor_service->CreateTask( actor::TestTaskSourceInfo(), actor::NoEnterprisePolicyChecker()); - - actor::ActorTask* task = actor_service->GetTask(task_id); - base::test::TestFuture<actor::mojom::ActionResultPtr> add_tab_future; - task->AddTab(actuation_tab->GetHandle(), add_tab_future.GetCallback()); - EXPECT_TRUE(add_tab_future.Wait()); - int originator_index = browser()->tab_strip_model()->GetIndexOfWebContents(originator_contents); browser()->tab_strip_model()->ActivateTabAt(originator_index); @@ -241,7 +213,8 @@ // The delegate should have caught the interruption and force the actuation // tab into focus. - EXPECT_EQ(browser()->tab_strip_model()->GetActiveTab(), actuation_tab); + EXPECT_EQ(browser()->tab_strip_model()->GetActiveWebContents(), + actuation_contents); EXPECT_EQ(delegate->GetFindFormTaskState(), actor::ActorTask::State::kPausedByActor); @@ -264,18 +237,10 @@ originator_contents->GetWeakPtr()); EXPECT_TRUE(base::test::RunUntil( [&]() { return delegate->HasActorTaskSubscriptionForTesting(); })); - - auto* actuation_tab = browser()->tab_strip_model()->GetActiveTab(); - - // Create task and add the tab to it. actor::TaskId task_id = actor_service->CreateTask( actor::TestTaskSourceInfo(), actor::NoEnterprisePolicyChecker()); - - actor::ActorTask* task = actor_service->GetTask(task_id); - base::test::TestFuture<actor::mojom::ActionResultPtr> add_tab_future; - task->AddTab(actuation_tab->GetHandle(), add_tab_future.GetCallback()); - EXPECT_TRUE(add_tab_future.Wait()); - + content::WebContents* actuation_contents = + browser()->tab_strip_model()->GetActiveWebContents(); int originator_index = browser()->tab_strip_model()->GetIndexOfWebContents(originator_contents); browser()->tab_strip_model()->ActivateTabAt(originator_index); @@ -283,7 +248,8 @@ actor_service->NotifyTaskStateChanged( task_id, actor::ActorTask::State::kPausedByActor); // Verify actuation tab is focused due to the interruption. - ASSERT_EQ(browser()->tab_strip_model()->GetActiveTab(), actuation_tab); + ASSERT_EQ(browser()->tab_strip_model()->GetActiveWebContents(), + actuation_contents); // Simulate the user resuming the task. actor_service->NotifyTaskStateChanged(task_id, @@ -299,67 +265,3 @@ actor_service->StopTask(task_id, actor::ActorTask::StoppedReason::kTaskComplete); } - -IN_PROC_BROWSER_TEST_F(PasswordChangeFromCheckupDelegateBrowserTest, - AutoSelectsCorrectCredential) { - Profile* profile = browser()->profile(); - auto* actor_service = - actor::ActorKeyedServiceFactory::GetActorKeyedService(profile); - - content::WebContents* originator_contents = - browser()->tab_strip_model()->GetActiveWebContents(); - - // Start the flow with a specific credential. - auto delegate = std::make_unique<PasswordChangeFromCheckupDelegate>(); - const std::string username = "testuser"; - const GURL origin_url = embedded_test_server()->GetURL("example.com", "/"); - - delegate->StartPasswordChangeFlow(CreateCredentialUIEntry(origin_url), - originator_contents->GetWeakPtr()); - - EXPECT_TRUE(base::test::RunUntil( - [&]() { return delegate->HasActorTaskSubscriptionForTesting(); })); - - auto* actuation_tab = browser()->tab_strip_model()->GetActiveTab(); - - // Setup the `ActorTask` and associate the tab. - actor::TaskId task_id = actor_service->CreateTask( - actor::TestTaskSourceInfo(), actor::NoEnterprisePolicyChecker()); - actor::ActorTask* task = actor_service->GetTask(task_id); - base::test::TestFuture<actor::mojom::ActionResultPtr> add_tab_future; - task->AddTab(actuation_tab->GetHandle(), add_tab_future.GetCallback()); - ASSERT_TRUE(add_tab_future.Wait()); - - actor_service->NotifyTaskStateChanged(task_id, - actor::ActorTask::State::kActing); - - // Simulate the `ExecutionEngine` needing a credential. - std::vector<actor_login::Credential> credentials; - - // Wrong credential - actor_login::Credential wrong_user; - wrong_user.username = u"wrong_user"; - wrong_user.source_site_or_app = base::UTF8ToUTF16(origin_url.spec()); - credentials.push_back(wrong_user); - - // Correct credential - actor_login::Credential correct_user; - correct_user.username = base::UTF8ToUTF16(username); - correct_user.source_site_or_app = base::UTF8ToUTF16(origin_url.spec()); - credentials.push_back(correct_user); - - base::test::TestFuture<actor::webui::mojom::SelectCredentialDialogResponsePtr> - selection_future; - - task->GetExecutionEngine().PromptToSelectCredential( - credentials, /*icons=*/{}, selection_future.GetCallback()); - - auto response = selection_future.Take(); - ASSERT_TRUE(response->selected_credential_id.has_value()); - EXPECT_EQ(response->selected_credential_id.value(), correct_user.id.value()); - EXPECT_EQ(response->permission_duration, - actor::webui::mojom::UserGrantedPermissionDuration::kOneTime); - - actor_service->StopTask(task_id, - actor::ActorTask::StoppedReason::kTaskComplete); -}
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc index 63d4ac3..fe23d8b 100644 --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -2350,9 +2350,6 @@ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) #endif // BUILDFLAG(ENABLE_EXTENSIONS) #if !BUILDFLAG(IS_ANDROID) - { key::kAutofillPredictionSettings, - optimization_guide::prefs::kAutofillPredictionImprovementsEnterprisePolicyAllowed, - base::Value::Type::INTEGER}, { key::kHelpMeWriteSettings, optimization_guide::prefs::kComposeEnterprisePolicyAllowed, base::Value::Type::INTEGER}, @@ -2362,10 +2359,13 @@ { key::kHistorySearchSettings, optimization_guide::prefs::kHistorySearchEnterprisePolicyAllowed, base::Value::Type::INTEGER}, -#endif +#endif // !BUILDFLAG(IS_ANDROID) { key::kTabCompareSettings, optimization_guide::prefs::kProductSpecificationsEnterprisePolicyAllowed, base::Value::Type::INTEGER}, + { key::kAutofillPredictionSettings, + optimization_guide::prefs::kAutofillPredictionImprovementsEnterprisePolicyAllowed, + base::Value::Type::INTEGER}, #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID) { key::kChromeForTestingAllowed, prefs::kChromeForTestingAllowed, @@ -3456,10 +3456,6 @@ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ BUILDFLAG(IS_CHROMEOS) gen_ai_default_policies.emplace_back( - key::kAutofillPredictionSettings, - optimization_guide::prefs:: - kAutofillPredictionImprovementsEnterprisePolicyAllowed); - gen_ai_default_policies.emplace_back( key::kHelpMeWriteSettings, optimization_guide::prefs::kComposeEnterprisePolicyAllowed); gen_ai_default_policies.emplace_back( @@ -3483,6 +3479,10 @@ kAutomatedPasswordChangeEnterprisePolicyAllowed); #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || // BUILDFLAG(IS_CHROMEOS) + gen_ai_default_policies.emplace_back( + key::kAutofillPredictionSettings, + optimization_guide::prefs:: + kAutofillPredictionImprovementsEnterprisePolicyAllowed); #if BUILDFLAG(IS_CHROMEOS) gen_ai_default_policies.emplace_back(key::kGenAIWallpaperSettings, ash::prefs::kGenAIWallpaperSettings);
diff --git a/chrome/browser/policy/test/automatic_fullscreen_policy_browsertest.cc b/chrome/browser/policy/test/automatic_fullscreen_policy_browsertest.cc index 53f7f1b..cc3c6a7 100644 --- a/chrome/browser/policy/test/automatic_fullscreen_policy_browsertest.cc +++ b/chrome/browser/policy/test/automatic_fullscreen_policy_browsertest.cc
@@ -21,7 +21,7 @@ class PolicyTestAutomaticFullscreen : public PolicyTest { public: - content::EvalJsResult FullscreenWithoutGesture() { + ::testing::AssertionResult FullscreenWithoutGesture() { constexpr char kScript[] = R"( (async () => { if (navigator.userActivation.isActive) @@ -30,7 +30,8 @@ })(); )"; auto* tab = chrome_test_utils::GetActiveWebContents(this); - return EvalJs(tab, kScript, content::EXECUTE_SCRIPT_NO_USER_GESTURE); + return content::ExecJs(tab, kScript, + content::EXECUTE_SCRIPT_NO_USER_GESTURE); } ContentSetting GetDefaultContentSetting() { @@ -57,7 +58,7 @@ // Fullscreen transient activation requirements are enforced by default. EXPECT_EQ(CONTENT_SETTING_BLOCK, GetDefaultContentSetting()); EXPECT_EQ(CONTENT_SETTING_BLOCK, GetContentSetting(url)); - EXPECT_THAT(FullscreenWithoutGesture(), content::EvalJsResult::IsError()); + EXPECT_FALSE(FullscreenWithoutGesture()); } IN_PROC_BROWSER_TEST_F(PolicyTestAutomaticFullscreen, AllowedForUrls) { @@ -75,7 +76,7 @@ // Fullscreen transient activation requirements are waived for this origin. EXPECT_EQ(CONTENT_SETTING_BLOCK, GetDefaultContentSetting()); EXPECT_EQ(CONTENT_SETTING_ALLOW, GetContentSetting(url)); - EXPECT_THAT(FullscreenWithoutGesture(), content::EvalJsResult::IsOk()); + EXPECT_TRUE(FullscreenWithoutGesture()); } IN_PROC_BROWSER_TEST_F(PolicyTestAutomaticFullscreen, BlockedForUrls) { @@ -91,7 +92,7 @@ ASSERT_TRUE(NavigateToUrl(url, this)); // Fullscreen transient activation requirements are enforced for this origin. - EXPECT_THAT(FullscreenWithoutGesture(), content::EvalJsResult::IsError()); + EXPECT_FALSE(FullscreenWithoutGesture()); EXPECT_EQ(CONTENT_SETTING_BLOCK, GetDefaultContentSetting()); EXPECT_EQ(CONTENT_SETTING_BLOCK, GetContentSetting(url)); }
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index c0307c3..461ee61 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -575,10 +575,6 @@ #endif // BUILDFLAG(IS_CHROMEOS) // Deprecated 02/2025. -inline constexpr char kUserAgentClientHintsGREASEUpdateEnabled[] = - "policy.user_agent_client_hints_grease_update_enabled"; - -// Deprecated 02/2025. inline constexpr char kDefaultSearchProviderKeywordsUseExtendedList[] = "default_search_provider.keywords_use_extended_list"; @@ -609,24 +605,8 @@ constexpr char kSharedStorage[] = "shared_storage"; #endif // BUILDFLAG(IS_CHROMEOS) -#if BUILDFLAG(IS_ANDROID) -// Deprecated 02/2025. -inline constexpr char kRootSecretPrefName[] = - "webauthn.authenticator_root_secret"; -#endif // BUILDFLAG(IS_ANDROID) - #if BUILDFLAG(IS_CHROMEOS) // Deprecated 03/2025. -inline constexpr char kShouldAutoEnroll[] = "ShouldAutoEnroll"; -inline constexpr char kShouldRetrieveDeviceState[] = - "ShouldRetrieveDeviceState"; -inline constexpr char kAutoEnrollmentPowerLimit[] = "AutoEnrollmentPowerLimit"; -#endif // BUILDFLAG(IS_CHROMEOS) - -#if BUILDFLAG(IS_CHROMEOS) -// Deprecated 03/2025. -inline constexpr char kDeviceRestrictionScheduleHighestSeenTime[] = - "device_restriction_schedule_highest_seen_time"; constexpr char kSunfishEnabled[] = "ash.capture_mode.sunfish_enabled"; #endif // BUILDFLAG(IS_CHROMEOS) @@ -1035,27 +1015,6 @@ // Register local state used only for migration (clearing or moving to a new // key). void RegisterLocalStatePrefsForMigration(PrefRegistrySimple* registry) { - // Deprecated 02/2025. - registry->RegisterBooleanPref(kUserAgentClientHintsGREASEUpdateEnabled, true); - -#if BUILDFLAG(IS_ANDROID) - // Deprecated 02/2025. - registry->RegisterStringPref(kRootSecretPrefName, std::string()); -#endif // BUILDFLAG(IS_ANDROID) - -#if BUILDFLAG(IS_CHROMEOS) - // Deprecated 03/2025. - registry->RegisterBooleanPref(kShouldRetrieveDeviceState, false); - registry->RegisterBooleanPref(kShouldAutoEnroll, false); - registry->RegisterIntegerPref(kAutoEnrollmentPowerLimit, -1); -#endif - -#if BUILDFLAG(IS_CHROMEOS) - // Deprecated 03/2025. - registry->RegisterTimePref(kDeviceRestrictionScheduleHighestSeenTime, - base::Time()); -#endif - #if !BUILDFLAG(IS_ANDROID) // Deprecated 04/2025. registry->RegisterListPref( @@ -1543,6 +1502,9 @@ // Individual preferences. If you have multiple preferences that should // clearly be grouped together, please group them together into a helper // function called above. Please keep this list alphabetized. + + registry->RegisterTimePref(prefs::kAudioInputStreamLastTimeCreated, + base::Time(), PrefRegistry::LOSSY_PREF); registry->RegisterBooleanPref( policy::policy_prefs::kIntensiveWakeUpThrottlingEnabled, false); #if BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING) @@ -2327,31 +2289,11 @@ // BEGIN_MIGRATE_OBSOLETE_LOCAL_STATE_PREFS // Please don't delete the preceding line. It is used by PRESUBMIT.py. - // Added 02/2025. - local_state->ClearPref(kUserAgentClientHintsGREASEUpdateEnabled); - // Added 02/2025 #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS) local_state->ClearPref(prefs::kDefaultBrowserPromptRefreshStudyGroup); #endif - // Added 02/2025 -#if BUILDFLAG(IS_ANDROID) - local_state->ClearPref(kRootSecretPrefName); -#endif // BUILDFLAG(IS_ANDROID) - - // Added 03/2025. -#if BUILDFLAG(IS_CHROMEOS) - local_state->ClearPref(kShouldRetrieveDeviceState); - local_state->ClearPref(kShouldAutoEnroll); - local_state->ClearPref(kAutoEnrollmentPowerLimit); -#endif - - // Added 03/2025. -#if BUILDFLAG(IS_CHROMEOS) - local_state->ClearPref(kDeviceRestrictionScheduleHighestSeenTime); -#endif - #if !BUILDFLAG(IS_ANDROID) local_state->ClearPref( kPerformanceInterventionNotificationAcceptHistoryDeprecated);
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc index fe96c96..e96cde0c 100644 --- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc +++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -32,7 +32,6 @@ #include "chrome/browser/autofill/autofill_image_fetcher_factory.h" #include "chrome/browser/autofill/autofill_offer_manager_factory.h" #include "chrome/browser/autofill/autofill_optimization_guide_decider_factory.h" -#include "chrome/browser/autofill/iban_manager_factory.h" #include "chrome/browser/autofill/merchant_promo_code_manager_factory.h" #include "chrome/browser/autofill/ml_log_router_factory.h" #include "chrome/browser/autofill/personal_data_manager_factory.h" @@ -744,7 +743,6 @@ #endif autofill::AutofillOfferManagerFactory::GetInstance(); autofill::AutofillOptimizationGuideDeciderFactory::GetInstance(); - autofill::IbanManagerFactory::GetInstance(); autofill::MerchantPromoCodeManagerFactory::GetInstance(); #if BUILDFLAG(BUILD_WITH_TFLITE_LIB) autofill::MlLogRouterFactory::GetInstance();
diff --git a/chrome/browser/profiles/profile_keyed_service_browsertest.cc b/chrome/browser/profiles/profile_keyed_service_browsertest.cc index 4034fa47..911c96f 100644 --- a/chrome/browser/profiles/profile_keyed_service_browsertest.cc +++ b/chrome/browser/profiles/profile_keyed_service_browsertest.cc
@@ -517,7 +517,6 @@ "EnterpriseManagementService", "FindBarState", "HistoryClustersService", - "IbanManager", "InstantService", "LanguageDetectionModelService", "MediaEngagementServiceFactory",
diff --git a/chrome/browser/resources/ai_overlay_dialog/BUILD.gn b/chrome/browser/resources/ai_overlay_dialog/BUILD.gn index 751177c9..d158120e 100644 --- a/chrome/browser/resources/ai_overlay_dialog/BUILD.gn +++ b/chrome/browser/resources/ai_overlay_dialog/BUILD.gn
@@ -25,6 +25,7 @@ "audio_processor.ts", "audio_utils.ts", "conversation.ts", + "page_context_manager.ts", "persona.ts", ]
diff --git a/chrome/browser/resources/ai_overlay_dialog/app.ts b/chrome/browser/resources/ai_overlay_dialog/app.ts index 741b449..69be8ce 100644 --- a/chrome/browser/resources/ai_overlay_dialog/app.ts +++ b/chrome/browser/resources/ai_overlay_dialog/app.ts
@@ -4,7 +4,7 @@ import {CrLitElement} from '//resources/lit/v3_0/lit.rollup.js'; -import {PageHandlerFactory, PageHandlerRemote} from './ai_overlay_dialog.mojom-webui.js'; +import {PageCallbackRouter, PageHandlerFactory, PageHandlerRemote} from './ai_overlay_dialog.mojom-webui.js'; import {SessionState} from './api_session.js'; import {getCss} from './app.css.js'; import {getHtml} from './app.html.js'; @@ -40,6 +40,7 @@ private accessor onInjectPrecannedAudio_: (() => void)|undefined; private pageHandler: PageHandlerRemote; + private pageCallbackRouter: PageCallbackRouter; // If onStateClick_ happens before the API key mojo returns, this will turn // to true and invoke the state change after the key becomes available. private queueStateChange: boolean = false; @@ -50,9 +51,12 @@ super(); // Setup Mojo connection + this.pageCallbackRouter = new PageCallbackRouter(); this.pageHandler = new PageHandlerRemote(); const factory = PageHandlerFactory.getRemote(); - factory.createPageHandler(this.pageHandler.$.bindNewPipeAndPassReceiver()); + factory.createPageHandler( + this.pageHandler.$.bindNewPipeAndPassReceiver(), + this.pageCallbackRouter.$.bindNewPipeAndPassRemote()); this.pageHandler.getApiKey().then(({apiKey}) => { this.conversation = new Conversation(apiKey, { @@ -61,6 +65,7 @@ createAudioCapturer: () => this.createAudioCapturer(), createAudioPlayer: () => this.createAudioPlayer(), }); + this.conversation.bindMojoHandlers(this.pageCallbackRouter); if (this.queueStateChange) { this.onStateClick_();
diff --git a/chrome/browser/resources/ai_overlay_dialog/conversation.ts b/chrome/browser/resources/ai_overlay_dialog/conversation.ts index 5e6ecb9..1c0b3f4 100644 --- a/chrome/browser/resources/ai_overlay_dialog/conversation.ts +++ b/chrome/browser/resources/ai_overlay_dialog/conversation.ts
@@ -2,10 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import type {PageCallbackRouter} from './ai_overlay_dialog.mojom-webui.js'; import {ApiSession} from './api_session.js'; import type {SessionState} from './api_session.js'; import type {AudioCapturer} from './audio_capturer.js'; import type {AudioPlayer} from './audio_player.js'; +import {PageContextManager} from './page_context_manager.js'; import {buildSystemInstruction} from './persona.js'; interface UiDelegate { @@ -25,12 +27,22 @@ private uiDelegate: UiDelegate; private capturer: AudioCapturer|null = null; private player: AudioPlayer|null = null; + private pageContextManager: PageContextManager = new PageContextManager(); constructor(apiKey: string, uiDelegate: UiDelegate) { this.apiKey = apiKey; this.uiDelegate = uiDelegate; } + bindMojoHandlers(router: PageCallbackRouter) { + router.invalidatePageContext.addListener( + () => this.pageContextManager.invalidatePageContext()); + router.updateCurrentPageContext.addListener( + (url, title, content) => + this.pageContextManager.updateCurrentPageContext( + url, title, content)); + } + async start() { this.capturer = await this.uiDelegate.createAudioCapturer(); if (!this.capturer) { @@ -45,9 +57,14 @@ return; } - // TODO(bokan): track current page context. + // TODO(bokan): Rebuild the session with a new system instruction each time + // the context changes. + // TODO(bokan): We should aim to always have an up-to-date URL and title + // if content is stale. + const context = this.pageContextManager.pageContext; const systemInstruction = buildSystemInstruction( - 'You are a helpful assistant.', /*title=*/ '', /*url=*/ ''); + 'You are a helpful assistant.', context?.title || '', + context?.url || '', context?.content); this.session = new ApiSession( this.apiKey, systemInstruction, this.capturer, this.player,
diff --git a/chrome/browser/resources/ai_overlay_dialog/page_context_manager.ts b/chrome/browser/resources/ai_overlay_dialog/page_context_manager.ts new file mode 100644 index 0000000..71cbd8a4 --- /dev/null +++ b/chrome/browser/resources/ai_overlay_dialog/page_context_manager.ts
@@ -0,0 +1,35 @@ +// Copyright 2026 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +export interface PageContext { + url: string; + title: string; + content: string; +} + +/** + * PageContextManager maintains state about the current page context as + * provided by the browser. + */ +export class PageContextManager { + private context: PageContext|null = null; + private isStale: boolean = true; + + get pageContext(): PageContext|null { + return this.context; + } + + get stale(): boolean { + return this.isStale; + } + + updateCurrentPageContext(url: string, title: string, content: string) { + this.context = {url, title, content}; + this.isStale = false; + } + + invalidatePageContext() { + this.isStale = true; + } +}
diff --git a/chrome/browser/resources/ai_overlay_dialog/persona.ts b/chrome/browser/resources/ai_overlay_dialog/persona.ts index 53071989..59b21650 100644 --- a/chrome/browser/resources/ai_overlay_dialog/persona.ts +++ b/chrome/browser/resources/ai_overlay_dialog/persona.ts
@@ -3,12 +3,22 @@ // found in the LICENSE file. export function buildSystemInstruction( - persona: string, title: string, url: string): string { - return `${persona} + persona: string, title: string, url: string, pageContent?: string): string { + let instruction = `${persona} ## Current Page [${title}](${url}) You are a helpful assistant in a Chrome overlay. Keep responses brief and conversational.`; + + if (pageContent) { + instruction += ` + +## Current Page Content + +${pageContent}`; + } + + return instruction; }
diff --git a/chrome/browser/resources/ash/settings/os_search_page/search_engines_browser_proxy.ts b/chrome/browser/resources/ash/settings/os_search_page/search_engines_browser_proxy.ts index 630d1386..c51747b 100644 --- a/chrome/browser/resources/ash/settings/os_search_page/search_engines_browser_proxy.ts +++ b/chrome/browser/resources/ash/settings/os_search_page/search_engines_browser_proxy.ts
@@ -10,7 +10,7 @@ import {sendWithPromise} from 'chrome://resources/js/cr.js'; /** - * @see chrome/browser/ui/webui/settings/search_engine_manager_handler.cc + * @see chrome/browser/ui/webui/settings/search_engines_handler.cc */ export interface SearchEngine { canBeDefault: boolean; @@ -28,7 +28,6 @@ id: number; isOmniboxExtension: boolean; keyword: string; - modelIndex: number; name: string; url: string; urlLocked: boolean; @@ -41,7 +40,16 @@ extensions: SearchEngine[]; } +export interface CategorizedTemplateUrls { + activeSiteShortcuts: SearchEngine[]; + inactiveSiteShortcuts: SearchEngine[]; + activeFeatureShortcuts: SearchEngine[]; + inactiveFeatureShortcuts: SearchEngine[]; + [key: string]: SearchEngine[]; +} + export interface SearchEnginesBrowserProxy { + getCategorizedTemplateUrls(): Promise<CategorizedTemplateUrls>; getSearchEnginesList(): Promise<SearchEnginesInfo>; openBrowserSearchSettings(): void; } @@ -58,6 +66,10 @@ instance = obj; } + getCategorizedTemplateUrls(): Promise<CategorizedTemplateUrls> { + return sendWithPromise('getCategorizedTemplateUrls'); + } + getSearchEnginesList(): Promise<SearchEnginesInfo> { return sendWithPromise('getSearchEnginesList'); }
diff --git a/chrome/browser/resources/ash/settings/os_settings.ts b/chrome/browser/resources/ash/settings/os_settings.ts index d5981ce..700e26dc 100644 --- a/chrome/browser/resources/ash/settings/os_settings.ts +++ b/chrome/browser/resources/ash/settings/os_settings.ts
@@ -213,7 +213,7 @@ export {OsResetBrowserProxyImpl} from './os_reset_page/os_reset_browser_proxy.js'; export {SearchAndAssistantSettingsCardElement} from './os_search_page/search_and_assistant_settings_card.js'; export {SettingsSearchEngineElement} from './os_search_page/search_engine.js'; -export type {SearchEngine, SearchEnginesBrowserProxy, SearchEnginesInfo} from './os_search_page/search_engines_browser_proxy.js'; +export type {CategorizedTemplateUrls, SearchEngine, SearchEnginesBrowserProxy, SearchEnginesInfo} from './os_search_page/search_engines_browser_proxy.js'; export {SearchEnginesBrowserProxyImpl} from './os_search_page/search_engines_browser_proxy.js'; export {ManagedFootnoteElement} from './os_settings_main/managed_footnote.js'; export {OsSettingsMainElement} from './os_settings_main/os_settings_main.js';
diff --git a/chrome/browser/resources/chromeos/login/BUILD.gn b/chrome/browser/resources/chromeos/login/BUILD.gn index 0bd3368..28e696a 100644 --- a/chrome/browser/resources/chromeos/login/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/BUILD.gn
@@ -157,7 +157,6 @@ "screens/osauth/osauth_error.ts", "screens/osauth/password_selection.ts", "screens/osauth/pin_setup.ts", - "screens/osauth/remove_local_auth_factors.ts", # Components "components/api_keys_notice.ts",
diff --git a/chrome/browser/resources/chromeos/login/debug/debug.ts b/chrome/browser/resources/chromeos/login/debug/debug.ts index fe46338..bcf6d275 100644 --- a/chrome/browser/resources/chromeos/login/debug/debug.ts +++ b/chrome/browser/resources/chromeos/login/debug/debug.ts
@@ -966,10 +966,6 @@ kind: ScreenKind.NORMAL, }, { - id: 'remove-local-auth-factors', - kind: ScreenKind.NORMAL, - }, - { id: 'local-data-loss-warning', kind: ScreenKind.NORMAL, states: [
diff --git a/chrome/browser/resources/chromeos/login/screens.ts b/chrome/browser/resources/chromeos/login/screens.ts index f910c22..9869c79 100644 --- a/chrome/browser/resources/chromeos/login/screens.ts +++ b/chrome/browser/resources/chromeos/login/screens.ts
@@ -61,7 +61,6 @@ import './screens/osauth/osauth_error.js'; import './screens/osauth/password_selection.js'; import './screens/osauth/pin_setup.js'; -import './screens/osauth/remove_local_auth_factors.js'; // AUTHENTICATION SCREENS USED DURING THE LOGIN FLOW import './screens/osauth/cryptohome_recovery.js'; // SCREENS USED DURING THE LOGIN FLOW @@ -216,7 +215,6 @@ id: 'user-allowlist-check-screen', }, {tag: 'wrong-hwid-element', id: 'wrong-hwid'}, - {tag: 'remove-local-auth-factors-element', id: 'remove-local-auth-factors'} ]; /**
diff --git a/chrome/browser/resources/chromeos/login/screens/osauth/remove_local_auth_factors.html b/chrome/browser/resources/chromeos/login/screens/osauth/remove_local_auth_factors.html deleted file mode 100644 index 4bea794..0000000 --- a/chrome/browser/resources/chromeos/login/screens/osauth/remove_local_auth_factors.html +++ /dev/null
@@ -1,31 +0,0 @@ -<!-- -Copyright 2026 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 cros-color-overrides"> - -</style> -<oobe-adaptive-dialog role="dialog" for-step="success"> - <!-- TODO: b/445628245 - Update translatable text and replace next button with - text button done --> - <iron-icon slot="icon" icon="oobe-32:lock"></iron-icon> - <h1 slot="title"> - Sign-in method updated - </h1> - <div slot="subtitle"> - For security reasons, your administrator disabled your device PIN or - password. From now on, use your [work or school account] password. - </div> - <div slot="bottom-buttons"> - <oobe-next-button id="doneButton" inverse on-click="onDoneClicked" - class="focus-on-show" > - </oobe-next-button> - </div> - -</oobe-adaptive-dialog> - -<oobe-loading-dialog id="progress" role="dialog" for-step="progress" - title-key="gaiaLoading"> -<iron-icon slot="icon" icon="oobe-32:googleg"></iron-icon> -</oobe-loading-dialog> \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/login/screens/osauth/remove_local_auth_factors.ts b/chrome/browser/resources/chromeos/login/screens/osauth/remove_local_auth_factors.ts deleted file mode 100644 index 7bc5c0a5..0000000 --- a/chrome/browser/resources/chromeos/login/screens/osauth/remove_local_auth_factors.ts +++ /dev/null
@@ -1,85 +0,0 @@ -// Copyright 2026 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import '//resources/ash/common/cr_elements/cros_color_overrides.css.js'; -import '../../components/buttons/oobe_back_button.js'; -import '../../components/buttons/oobe_next_button.js'; -import '../../components/common_styles/oobe_common_styles.css.js'; -import '../../components/common_styles/oobe_dialog_host_styles.css.js'; -import '../../components/dialogs/oobe_adaptive_dialog.js'; - -import type {PolymerElementProperties} from '//resources/polymer/v3_0/polymer/interfaces.js'; -import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import {LoginScreenMixin} from '../../components/mixins/login_screen_mixin.js'; -import {MultiStepMixin} from '../../components/mixins/multi_step_mixin.js'; -import {OobeDialogHostMixin} from '../../components/mixins/oobe_dialog_host_mixin.js'; -import {OobeI18nMixin} from '../../components/mixins/oobe_i18n_mixin.js'; - -import {getTemplate} from './remove_local_auth_factors.html.js'; - -const RemoveLocalAuthFactorsScreenElementBase = - LoginScreenMixin(MultiStepMixin(OobeI18nMixin(PolymerElement))); - -enum UserAction { - DONE = 'done', -} - -enum RemoveLocalAuthFactorsScreenState { - SUCCESS = 'success', - PROGRESS = 'progress', -} - -class RemoveLocalAuthFactorsScreen extends - RemoveLocalAuthFactorsScreenElementBase { - static get is() { - return 'remove-local-auth-factors-element' as const; - } - - static get template(): HTMLTemplateElement { - return getTemplate(); - } - - static get properties(): PolymerElementProperties { - return {}; - } - - - override get EXTERNAL_API(): string[] { - return ['showRemoveLocalAuthFactorsSuccessStep']; - } - - override defaultUIStep(): string { - return RemoveLocalAuthFactorsScreenState.PROGRESS; - } - - override get UI_STEPS() { - return RemoveLocalAuthFactorsScreenState; - } - - override ready(): void { - super.ready(); - this.initializeLoginScreen('RemoveLocalAuthFactorsScreen'); - } - - /** - * Next button click handler. - */ - private onDoneClicked(): void { - this.userActed(UserAction.DONE); - } - - private showRemoveLocalAuthFactorsSuccessStep(): void { - this.setUIStep(RemoveLocalAuthFactorsScreenState.SUCCESS); - } -} - -declare global { - interface HTMLElementTagNameMap { - [RemoveLocalAuthFactorsScreen.is]: RemoveLocalAuthFactorsScreen; - } -} - -customElements.define( - RemoveLocalAuthFactorsScreen.is, RemoveLocalAuthFactorsScreen);
diff --git a/chrome/browser/resources/glic/glic_api/glic_api.ts b/chrome/browser/resources/glic/glic_api/glic_api.ts index 22908c8..3d4350f 100644 --- a/chrome/browser/resources/glic/glic_api/glic_api.ts +++ b/chrome/browser/resources/glic/glic_api/glic_api.ts
@@ -2160,6 +2160,8 @@ source: SkillSource; /** The description of the skill. */ description?: string; + /** The image URL to show when rendering this skill. */ + image_url?: string; /** Whether the skill is contextually relevant to the current tab. */ isContextual?: boolean; }
diff --git a/chrome/browser/resources/glic/glic_api_impl/client/glic_api_client.ts b/chrome/browser/resources/glic/glic_api_impl/client/glic_api_client.ts index 91bcd68..8717a1569 100644 --- a/chrome/browser/resources/glic/glic_api_impl/client/glic_api_client.ts +++ b/chrome/browser/resources/glic/glic_api_impl/client/glic_api_client.ts
@@ -1541,6 +1541,10 @@ this.sender.requestNoResponse('glicBrowserOnReaction', {reactionType}); } + onPerformActionResultSubmitted(isRetry?: boolean): void { + this.sender.requestNoResponse('glicBrowserOnActionSubmitted', {isRetry}); + } + onContextUploadStarted(): void { this.sender.requestNoResponse( 'glicBrowserOnContextUploadStarted', undefined);
diff --git a/chrome/browser/resources/glic/glic_api_impl/host/host_from_client.ts b/chrome/browser/resources/glic/glic_api_impl/host/host_from_client.ts index 0c4007a..bfa55b8 100644 --- a/chrome/browser/resources/glic/glic_api_impl/host/host_from_client.ts +++ b/chrome/browser/resources/glic/glic_api_impl/host/host_from_client.ts
@@ -606,6 +606,10 @@ this.handler.onReaction(request.reactionType); } + glicBrowserOnActionSubmitted(request: {isRetry?: boolean}): void { + this.handler.onActionSubmitted(request.isRetry ?? false); + } + glicBrowserOnResponseStarted(): void { this.handler.onResponseStarted(); }
diff --git a/chrome/browser/resources/glic/glic_api_impl/request_types.ts b/chrome/browser/resources/glic/glic_api_impl/request_types.ts index 453d75cb2..0d2194f4 100644 --- a/chrome/browser/resources/glic/glic_api_impl/request_types.ts +++ b/chrome/browser/resources/glic/glic_api_impl/request_types.ts
@@ -433,6 +433,12 @@ glicBrowserOnClosedCaptionsShown: { backgroundAllowed: true, }, + glicBrowserOnActionSubmitted: { + request: { + isRetry?: boolean, + }, + backgroundAllowed: true, + }, glicBrowserScrollTo: { request: { params: ScrollToParams, @@ -995,6 +1001,7 @@ OnMicrophoneStatusChange: 90, RecordSkillsWebClientEvent: 91, DeleteCapturedRegion: 92, + OnActionSubmitted: 93, }; return {...result, MAX_VALUE: Math.max(...Object.values(result))}; })();
diff --git a/chrome/browser/resources/glic/internals/OWNERS b/chrome/browser/resources/glic/internals/OWNERS new file mode 100644 index 0000000..b2a2a22 --- /dev/null +++ b/chrome/browser/resources/glic/internals/OWNERS
@@ -0,0 +1 @@ +file://chrome/browser/glic/API_OWNERS
diff --git a/chrome/browser/resources/new_tab_page/action_chips/action_chips.css b/chrome/browser/resources/new_tab_page/action_chips/action_chips.css index ebfcace..f6e1894d 100644 --- a/chrome/browser/resources/new_tab_page/action_chips/action_chips.css +++ b/chrome/browser/resources/new_tab_page/action_chips/action_chips.css
@@ -97,6 +97,10 @@ background-image: url(chrome://new-tab-page/icons/banana.svg); } +.icon-type-search-spark { + -webkit-mask-image: url(chrome://new-tab-page/icons/search_spark.svg); +} + .action-chip { align-items: center; background-color: var(--chip-background-color);
diff --git a/chrome/browser/resources/new_tab_page/action_chips/action_chips.ts b/chrome/browser/resources/new_tab_page/action_chips/action_chips.ts index fe4d07b..084e0e61 100644 --- a/chrome/browser/resources/new_tab_page/action_chips/action_chips.ts +++ b/chrome/browser/resources/new_tab_page/action_chips/action_chips.ts
@@ -120,6 +120,8 @@ return 'icon-type-draft-spark'; case IconType.kFavicon: return 'icon-type-favicon'; + case IconType.kSearchLoopWithSparkle: + return 'icon-type-search-spark'; default: return ''; } @@ -185,6 +187,10 @@ } else if ( chip.suggestTemplateInfo.typeIcon === IconType.kSubArrowRight) { this.handler.activateMetricsFunnel('DeepDiveChip'); + } else if ( + chip.suggestTemplateInfo.typeIcon === + IconType.kSearchLoopWithSparkle) { + this.handler.activateMetricsFunnel('PromptSuggestionChip'); } break; default:
diff --git a/chrome/browser/resources/new_tab_page/icons/BUILD.gn b/chrome/browser/resources/new_tab_page/icons/BUILD.gn index fc548c6..95dc6c4 100644 --- a/chrome/browser/resources/new_tab_page/icons/BUILD.gn +++ b/chrome/browser/resources/new_tab_page/icons/BUILD.gn
@@ -28,6 +28,7 @@ "deep_search.svg", "suggestion.svg", "canvas.svg", + "search_spark.svg", ] input_files_base_dir = rebase_path(".", "//") resource_path_prefix = "icons"
diff --git a/chrome/browser/resources/new_tab_page/icons/search_spark.svg b/chrome/browser/resources/new_tab_page/icons/search_spark.svg new file mode 100644 index 0000000..d1f2825d --- /dev/null +++ b/chrome/browser/resources/new_tab_page/icons/search_spark.svg
@@ -0,0 +1,10 @@ +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_140_36353)"> +<path d="M18.5 10C18.4 10 18.3333 9.95 18.3 9.85C18.0333 8.83333 17.525 7.95833 16.775 7.225C16.0417 6.475 15.1667 5.96667 14.15 5.7C14.05 5.66667 14 5.6 14 5.5C14 5.38333 14.05 5.31667 14.15 5.3C15.1667 5.03333 16.0417 4.53333 16.775 3.8C17.525 3.05 18.0333 2.16667 18.3 1.15C18.3333 1.05 18.4 1 18.5 1C18.6167 1 18.6833 1.05 18.7 1.15C18.9833 2.16667 19.4917 3.05 20.225 3.8C20.9583 4.53333 21.8333 5.03333 22.85 5.3C22.95 5.31667 23 5.38333 23 5.5C23 5.6 22.95 5.66667 22.85 5.7C21.8333 5.96667 20.95 6.475 20.2 7.225C19.4667 7.95833 18.9667 8.83333 18.7 9.85C18.6833 9.95 18.6167 10 18.5 10ZM19.6 21L13.35 14.75C12.7833 15.1667 12.175 15.4833 11.525 15.7C10.875 15.9 10.2 16 9.5 16C7.68333 16 6.14167 15.375 4.875 14.125C3.625 12.8583 3 11.3167 3 9.5C3 7.68333 3.625 6.15 4.875 4.9C6.14167 3.63333 7.68333 3 9.5 3C9.98333 3 10.4583 3.05833 10.925 3.175C11.3917 3.275 11.8417 3.425 12.275 3.625L11.275 5.375C10.9917 5.24167 10.7 5.15 10.4 5.1C10.1 5.03333 9.8 5 9.5 5C8.25 5 7.18333 5.44167 6.3 6.325C5.43333 7.19167 5 8.25 5 9.5C5 10.75 5.43333 11.8167 6.3 12.7C7.18333 13.5667 8.25 14 9.5 14C10.65 14 11.65 13.625 12.5 12.875C13.35 12.1083 13.8417 11.15 13.975 10H15.975C15.925 10.6 15.8 11.1917 15.6 11.775C15.4 12.3417 15.1167 12.8667 14.75 13.35L21 19.6L19.6 21Z" fill="#474747"/> +</g> +<defs> +<clipPath id="clip0_140_36353"> +<rect width="24" height="24" fill="white"/> +</clipPath> +</defs> +</svg>
diff --git a/chrome/browser/resources/omnibox_popup/aim_app.css b/chrome/browser/resources/omnibox_popup/aim_app.css index 6fd6fbf6..73cf10f 100644 --- a/chrome/browser/resources/omnibox_popup/aim_app.css +++ b/chrome/browser/resources/omnibox_popup/aim_app.css
@@ -118,19 +118,11 @@ bottom: 6px; } -cr-composebox[searchbox-layout-mode='TallTopContext'] { - --cr-composebox-submit-button-margin-inline-start: 0; -} - cr-composebox[show-submit_][submit-enabled_][searchbox-layout-mode='TallBottomContext']::part(voice-icon) { inset-inline-end: calc(var(--cr-composebox-submit-container-size) + 6px); margin-inline-end: 6px; } -cr-composebox[show-submit_][submit-enabled_][searchbox-layout-mode='TallTopContext']::part(voice-icon) { - margin-inline-end: -2px; -} - :host-context([dir='rtl']) cr-composebox[searchbox-layout-mode='Compact']::part(context-menu-entrypoint-icon) { left: unset; right: 12px;
diff --git a/chrome/browser/resources/omnibox_popup/app.css b/chrome/browser/resources/omnibox_popup/app.css index 1636f9af..d458a3ed 100644 --- a/chrome/browser/resources/omnibox_popup/app.css +++ b/chrome/browser/resources/omnibox_popup/app.css
@@ -77,15 +77,6 @@ height: 40px; } -:host([searchbox-layout-mode_='TallTopContext']) { - --contextual-entrypoint-and-carousel-contextual-chip-padding-bottom: 10px; - - &:not([has-visible-matches_]) { - --contextual-entrypoint-and-carousel-contextual-chip-padding-bottom: 0px; - --contextual-entrypoint-and-carousel-context-menu-container-margin-bottom: 9px; - } -} - :host([searchbox-layout-mode_='Compact']), :host([searchbox-layout-mode_^='Tall']) .context-menu-container:not(:has(#context)) { --contextual-entrypoint-and-carousel-context-menu-container-padding-inline-start: 12px;
diff --git a/chrome/browser/resources/omnibox_popup/app.html.ts b/chrome/browser/resources/omnibox_popup/app.html.ts index 435d4b9..b38ecd9 100644 --- a/chrome/browser/resources/omnibox_popup/app.html.ts +++ b/chrome/browser/resources/omnibox_popup/app.html.ts
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {html, nothing} from '//resources/lit/v3_0/lit.rollup.js'; +import {html} from '//resources/lit/v3_0/lit.rollup.js'; import type {OmniboxPopupAppElement} from './app.js'; import {getHtml as getContextualEntrypointHtml} from './app_contextual_entrypoint.html.js'; @@ -13,11 +13,6 @@ ${this.showContextEntrypoint_ ? html` <!-- WebUI Omnibox popup w/ "Add Context" button --> <div class="dropdownContainer"> - ${this.searchboxLayoutMode_ === 'TallTopContext' ? html` - ${getContextualEntrypointHtml.call(this)} - ${this.hasVisibleMatches_ ? - html`<div class="carousel-divider"></div>` : nothing} - ` : nothing} <cr-searchbox-dropdown part="searchbox-dropdown" exportparts="dropdown-content" role="listbox" .result="${this.result_}" @@ -27,8 +22,7 @@ @dom-change="${this.onDropdownDomChange_}" ?hidden="${!this.hasVisibleMatches_}"> </cr-searchbox-dropdown> - ${this.searchboxLayoutMode_ !== 'TallTopContext' ? - getContextualEntrypointHtml.call(this) : nothing} + ${getContextualEntrypointHtml.call(this)} </div>` : html` <!-- WebUI Omnibox popup w/o "Add Context" button --> <div class="dropdownContainer">
diff --git a/chrome/browser/resources/profile_internals/profile_internals_app.html b/chrome/browser/resources/profile_internals/profile_internals_app.html index 5abb3a6..ce2e554 100644 --- a/chrome/browser/resources/profile_internals/profile_internals_app.html +++ b/chrome/browser/resources/profile_internals/profile_internals_app.html
@@ -73,16 +73,6 @@ </td> </tr> <tr> - <td>Signed Accounts</td> - <td> - <ul> - ${item.profileState.signedAccounts.map(item => html` - <li>${item}</li> - `)} - </ul> - </td> - </tr> - <tr> <td>Loaded in Memory</td> <td>${item.profileState.isLoaded}</td> </tr>
diff --git a/chrome/browser/resources/profile_internals/profile_internals_browser_proxy.ts b/chrome/browser/resources/profile_internals/profile_internals_browser_proxy.ts index 92275a67c..30a14ee 100644 --- a/chrome/browser/resources/profile_internals/profile_internals_browser_proxy.ts +++ b/chrome/browser/resources/profile_internals/profile_internals_browser_proxy.ts
@@ -23,7 +23,6 @@ isEphemeral: boolean; userAcceptedAccountManagement: boolean; keepAlives: KeepAlive[]; - signedAccounts: string[]; isLoaded: boolean; hasOffTheRecord: boolean; profileCountry: string;
diff --git a/chrome/browser/resources/settings/lazy_load.ts b/chrome/browser/resources/settings/lazy_load.ts index ae4a1e8..9bc09fb 100644 --- a/chrome/browser/resources/settings/lazy_load.ts +++ b/chrome/browser/resources/settings/lazy_load.ts
@@ -320,7 +320,7 @@ export {SiteListElement} from './site_settings/site_list.js'; export {SiteListEntryElement} from './site_settings/site_list_entry.js'; export {DefaultSettingSource, SiteSettingsBrowserProxyImpl, ThirdPartyCookieBlockingSetting} from './site_settings/site_settings_browser_proxy.js'; -export type {ChooserException, DefaultContentSetting, FileSystemGrant, OriginFileSystemGrants, OriginInfo, RawChooserException, RawSiteException, RecentSitePermissions, SiteException, SiteGroup, SiteSettingsBrowserProxy, StorageAccessEmbeddingException, StorageAccessSiteException, ZoomLevelEntry} from './site_settings/site_settings_browser_proxy.js'; +export type {ChooserException, DefaultContentSetting, FileSystemGrant, OriginFileSystemGrants, OriginInfo, RawChooserException, RawSiteException, RecentSitePermissions, SiteException, SiteGroup, SiteSettingsBrowserProxy, StorageAccessEmbeddingException, StorageAccessSiteException, SubAppsPermissionExplanationInfo, ZoomLevelEntry} from './site_settings/site_settings_browser_proxy.js'; export {defaultSettingLabel} from './site_settings/site_settings_list.js'; export {SettingsSiteSettingsPageElement} from './site_settings/site_settings_page.js'; // <if expr="is_chromeos">
diff --git a/chrome/browser/resources/settings/search_page/search_engine_edit_dialog.ts b/chrome/browser/resources/settings/search_page/search_engine_edit_dialog.ts index 56e03c7..bff5421 100644 --- a/chrome/browser/resources/settings/search_page/search_engine_edit_dialog.ts +++ b/chrome/browser/resources/settings/search_page/search_engine_edit_dialog.ts
@@ -23,12 +23,9 @@ import type {SearchEngine, SearchEnginesBrowserProxy, SearchEnginesInfo} from './search_engines_browser_proxy.js'; import {SearchEnginesBrowserProxyImpl} from './search_engines_browser_proxy.js'; -/** - * The |modelIndex| to use when a new search engine is added. Must match - * with kNewSearchEngineIndex constant specified at - * chrome/browser/ui/webui/settings/search_engines_handler.cc - */ -const DEFAULT_MODEL_INDEX: number = -1; +// The `id` to use when a new search engine is added. See +// `kInvalidTemplateURLID`. +const DEFAULT_MODEL_ID: number = 0; export interface SettingsSearchEngineEditDialogElement { $: { @@ -131,7 +128,7 @@ microTask.run(() => this.updateActionButtonState_()); this.browserProxy_.searchEngineEditStarted( - this.model ? this.model.modelIndex : DEFAULT_MODEL_INDEX); + this.model ? this.model.id : DEFAULT_MODEL_ID); this.$.dialog.showModal(); }
diff --git a/chrome/browser/resources/settings/search_page/search_engine_entry.ts b/chrome/browser/resources/settings/search_page/search_engine_entry.ts index 4871d9ae..4822dd5 100644 --- a/chrome/browser/resources/settings/search_page/search_engine_entry.ts +++ b/chrome/browser/resources/settings/search_page/search_engine_entry.ts
@@ -147,7 +147,7 @@ this.closePopupMenu_(); if (!this.engine.shouldConfirmRemoval) { - this.browserProxy_.removeSearchEngine(this.engine.modelIndex); + this.browserProxy_.removeSearchEngine(this.engine.id); return; } @@ -192,20 +192,20 @@ private onMakeDefaultClick_() { this.closePopupMenu_(); this.browserProxy_.setDefaultSearchEngine( - this.engine.modelIndex, ChoiceMadeLocation.SEARCH_ENGINE_SETTINGS, + this.engine.id, ChoiceMadeLocation.SEARCH_ENGINE_SETTINGS, /*saveGuestChoice=*/ null); } private onActivateClick_() { this.closePopupMenu_(); this.browserProxy_.setIsActiveSearchEngine( - this.engine.modelIndex, /*is_active=*/ true); + this.engine.id, /*is_active=*/ true); } private onDeactivateClick_() { this.closePopupMenu_(); this.browserProxy_.setIsActiveSearchEngine( - this.engine.modelIndex, /*is_active=*/ false); + this.engine.id, /*is_active=*/ false); } private onDownloadedIconLoadError_() {
diff --git a/chrome/browser/resources/settings/search_page/search_engine_list_dialog.ts b/chrome/browser/resources/settings/search_page/search_engine_list_dialog.ts index 8e244cb3..0d34f12 100644 --- a/chrome/browser/resources/settings/search_page/search_engine_list_dialog.ts +++ b/chrome/browser/resources/settings/search_page/search_engine_list_dialog.ts
@@ -109,7 +109,7 @@ assert(searchEngine); this.browserProxy_.setDefaultSearchEngine( - searchEngine.modelIndex, ChoiceMadeLocation.SEARCH_SETTINGS, + searchEngine.id, ChoiceMadeLocation.SEARCH_SETTINGS, this.saveGuestChoice_); this.dispatchEvent(new CustomEvent('search-engine-changed', {
diff --git a/chrome/browser/resources/settings/search_page/search_engines_browser_proxy.ts b/chrome/browser/resources/settings/search_page/search_engines_browser_proxy.ts index 4a63861..caf95a6 100644 --- a/chrome/browser/resources/settings/search_page/search_engines_browser_proxy.ts +++ b/chrome/browser/resources/settings/search_page/search_engines_browser_proxy.ts
@@ -31,7 +31,6 @@ isPrepopulated: boolean; isStarterPack: boolean; keyword: string; - modelIndex: number; name: string; shouldConfirmRemoval: boolean; url: string; @@ -46,6 +45,14 @@ [key: string]: SearchEngine[]; } +export interface CategorizedTemplateUrls { + activeSiteShortcuts: SearchEngine[]; + inactiveSiteShortcuts: SearchEngine[]; + activeFeatureShortcuts: SearchEngine[]; + inactiveFeatureShortcuts: SearchEngine[]; + [key: string]: SearchEngine[]; +} + /** * Contains all recorded interactions on the search engines settings page. * @@ -88,20 +95,22 @@ export interface SearchEnginesBrowserProxy { setDefaultSearchEngine( - modelIndex: number, choiceMadeLocation: ChoiceMadeLocation, + id: number, choiceMadeLocation: ChoiceMadeLocation, saveGuestChoice: boolean|null): void; - setIsActiveSearchEngine(modelIndex: number, isActive: boolean): void; + setIsActiveSearchEngine(id: number, isActive: boolean): void; - removeSearchEngine(modelIndex: number): void; + removeSearchEngine(id: number): void; - searchEngineEditStarted(modelIndex: number): void; + searchEngineEditStarted(id: number): void; searchEngineEditCancelled(): void; searchEngineEditCompleted( searchEngine: string, keyword: string, queryUrl: string): void; + getCategorizedTemplateUrls(): Promise<CategorizedTemplateUrls>; + getSearchEnginesList(): Promise<SearchEnginesInfo>; getSaveGuestChoice(): Promise<boolean|null>; @@ -120,26 +129,25 @@ export class SearchEnginesBrowserProxyImpl implements SearchEnginesBrowserProxy { setDefaultSearchEngine( - modelIndex: number, choiceMadeLocation: ChoiceMadeLocation, + id: number, choiceMadeLocation: ChoiceMadeLocation, saveGuestChoice?: boolean|null) { chrome.send( - 'setDefaultSearchEngine', - [modelIndex, choiceMadeLocation, saveGuestChoice]); + 'setDefaultSearchEngine', [id, choiceMadeLocation, saveGuestChoice]); } - setIsActiveSearchEngine(modelIndex: number, isActive: boolean) { - chrome.send('setIsActiveSearchEngine', [modelIndex, isActive]); + setIsActiveSearchEngine(id: number, isActive: boolean) { + chrome.send('setIsActiveSearchEngine', [id, isActive]); this.recordSearchEnginesPageHistogram( isActive ? SearchEnginesInteractions.ACTIVATE : SearchEnginesInteractions.DEACTIVATE); } - removeSearchEngine(modelIndex: number) { - chrome.send('removeSearchEngine', [modelIndex]); + removeSearchEngine(id: number) { + chrome.send('removeSearchEngine', [id]); } - searchEngineEditStarted(modelIndex: number) { - chrome.send('searchEngineEditStarted', [modelIndex]); + searchEngineEditStarted(id: number) { + chrome.send('searchEngineEditStarted', [id]); } searchEngineEditCancelled() { @@ -155,6 +163,10 @@ ]); } + getCategorizedTemplateUrls() { + return sendWithPromise('getCategorizedTemplateUrls'); + } + getSearchEnginesList() { return sendWithPromise('getSearchEnginesList'); }
diff --git a/chrome/browser/resources/settings/search_page/search_engines_page.ts b/chrome/browser/resources/settings/search_page/search_engines_page.ts index 342e5b0..d9a410f 100644 --- a/chrome/browser/resources/settings/search_page/search_engines_page.ts +++ b/chrome/browser/resources/settings/search_page/search_engines_page.ts
@@ -228,7 +228,7 @@ if (confirmed) { assert(this.dialogModel_); - this.browserProxy_.removeSearchEngine(this.dialogModel_.modelIndex); + this.browserProxy_.removeSearchEngine(this.dialogModel_.id); this.dialogAnchorElement_ = null; }
diff --git a/chrome/browser/resources/settings/settings.ts b/chrome/browser/resources/settings/settings.ts index f2eb8ad..fe3cb803 100644 --- a/chrome/browser/resources/settings/settings.ts +++ b/chrome/browser/resources/settings/settings.ts
@@ -136,7 +136,7 @@ export {ScrollableMixin} from './scrollable_mixin.js'; export {SettingsSearchEngineListDialogElement} from './search_page/search_engine_list_dialog.js'; export {ChoiceMadeLocation, SearchEnginesBrowserProxyImpl, SearchEnginesInteractions} from './search_page/search_engines_browser_proxy.js'; -export type {SearchEngine, SearchEnginesBrowserProxy, SearchEnginesInfo} from './search_page/search_engines_browser_proxy.js'; +export type {CategorizedTemplateUrls, SearchEngine, SearchEnginesBrowserProxy, SearchEnginesInfo} from './search_page/search_engines_browser_proxy.js'; export {SettingsSearchPageElement} from './search_page/search_page.js'; export {SettingsSearchPageIndexElement} from './search_page/search_page_index.js'; export {getSearchManager, SearchRequest, setSearchManagerForTesting, showBubble} from './search_settings.js';
diff --git a/chrome/browser/resources/settings/site_settings/site_details.html b/chrome/browser/resources/settings/site_settings/site_details.html index c65bcf5..64043e68 100644 --- a/chrome/browser/resources/settings/site_settings/site_details.html +++ b/chrome/browser/resources/settings/site_settings/site_details.html
@@ -145,6 +145,13 @@ </cr-button> </div> + <div id="subAppsPermissionExplanation" class="cr-row continuation secondary" + hidden$="[[!subAppsPermissionExplanation_]]"> + <localized-link localized-string="[[subAppsPermissionExplanation_]]" + on-link-clicked="onSubAppPermissionExplanationLinkClicked_"> + </localized-link> + </div> + <div class="list-frame"> <site-details-permission category="[[contentSettingsTypesEnum_.GEOLOCATION]]" icon="settings:location-on" label="$i18n{siteSettingsLocation}">
diff --git a/chrome/browser/resources/settings/site_settings/site_details.ts b/chrome/browser/resources/settings/site_settings/site_details.ts index 0286308..87520dc 100644 --- a/chrome/browser/resources/settings/site_settings/site_details.ts +++ b/chrome/browser/resources/settings/site_settings/site_details.ts
@@ -7,6 +7,7 @@ * 'site-details' show the details (permissions and usage) for a given origin * under Site Settings. */ +import 'chrome://resources/cr_components/localized_link/localized_link.js'; import 'chrome://resources/cr_elements/action_link.css.js'; import 'chrome://resources/js/action_link.js'; import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; @@ -212,6 +213,16 @@ 'computeShouldUseBlockIfUnfamiliarLabelForV8OptimizerDefault_(' + 'prefs.generated.javascript_optimizer.value)', }, + + /** + * When the app at url is an isolated web app or an isolated sub app, + * this returns a string explaining that sub apps share permissions + * with the parent app that installed them. + */ + subAppsPermissionExplanation_: { + type: String, + value: '', + }, }; } @@ -237,6 +248,8 @@ declare private enableLocalNetworkAccessSetting_: boolean; declare private enableLocalNetworkAccessSplitPermissions_: boolean; declare private useBlockIfUnfamiliarLabelForV8OptimizerDefault_: boolean; + declare private subAppsPermissionExplanation_: string; + private parentAppOrigin_: string|null = null; override connectedCallback() { super.connectedCallback(); @@ -283,6 +296,24 @@ this.browserProxy.getCategoryList(this.origin_).then((categoryList) => { this.updatePermissions_(categoryList, /*hideOthers=*/ true); }); + + this.browserProxy.getSubAppsPermissionExplanation(this.origin_) + .then((info) => { + if (info.isSubApp && info.appName && info.parentAppName && + info.parentAppOrigin) { + this.parentAppOrigin_ = info.parentAppOrigin; + this.subAppsPermissionExplanation_ = this.i18n( + 'siteSettingsSubAppPermissionExplanation', info.appName, + info.parentAppName); + } else if (info.hasSubApps && info.appName) { + this.parentAppOrigin_ = null; + this.subAppsPermissionExplanation_ = this.i18n( + 'siteSettingsParentAppPermissionExplanation', info.appName); + } else { + this.parentAppOrigin_ = null; + this.subAppsPermissionExplanation_ = ''; + } + }); } }); } @@ -470,6 +501,14 @@ override focusBackButton() { this.shadowRoot!.querySelector('settings-subpage')!.focusBackButton(); } + + private onSubAppPermissionExplanationLinkClicked_() { + if (this.parentAppOrigin_) { + Router.getInstance().navigateTo( + routes.SITE_SETTINGS_SITE_DETAILS, + new URLSearchParams('site=' + this.parentAppOrigin_)); + } + } } declare global {
diff --git a/chrome/browser/resources/settings/site_settings/site_settings_browser_proxy.ts b/chrome/browser/resources/settings/site_settings/site_settings_browser_proxy.ts index 8756d61..2ce1ade 100644 --- a/chrome/browser/resources/settings/site_settings/site_settings_browser_proxy.ts +++ b/chrome/browser/resources/settings/site_settings/site_settings_browser_proxy.ts
@@ -196,6 +196,14 @@ editGrants: FileSystemGrant[]; } +export interface SubAppsPermissionExplanationInfo { + isSubApp: boolean; + hasSubApps: boolean; + appName?: string; + parentAppName?: string; + parentAppOrigin?: string; +} + /** * Must be kept in sync with the C++ enum of the same name in * chrome/browser/content_settings/generated_cookie_prefs.h @@ -518,6 +526,15 @@ * @param contentType The permission type. */ openSystemPermissionSettings(contentType: string): void; + + /** + * Returns info about whether the url points to an isolated web app that has + * sub apps or is a sub app so that we can later on explain clearly that + * an isolated web app shares permissions with its installed sub apps + * and vice versa. + */ + getSubAppsPermissionExplanation(url: string): + Promise<SubAppsPermissionExplanationInfo>; } export class SiteSettingsBrowserProxyImpl implements SiteSettingsBrowserProxy { @@ -701,6 +718,10 @@ chrome.send('openSystemPermissionSettings', [contentType]); } + getSubAppsPermissionExplanation(url: string) { + return sendWithPromise('getSubAppsPermissionExplanation', url); + } + static getInstance(): SiteSettingsBrowserProxy { return instance || (instance = new SiteSettingsBrowserProxyImpl()); }
diff --git a/chrome/browser/resources/skills/card.ts b/chrome/browser/resources/skills/card.ts index 91740b8..a416149 100644 --- a/chrome/browser/resources/skills/card.ts +++ b/chrome/browser/resources/skills/card.ts
@@ -70,6 +70,7 @@ // Default to user created since these are added by the user via the UI. source: SkillSource.kUserCreated, description: '', + imageUrl: '', creationTime: {internalValue: 0n}, lastUpdateTime: {internalValue: 0n}, };
diff --git a/chrome/browser/resources/skills/skills_dialog_app.ts b/chrome/browser/resources/skills/skills_dialog_app.ts index 453cfa3..9397731 100644 --- a/chrome/browser/resources/skills/skills_dialog_app.ts +++ b/chrome/browser/resources/skills/skills_dialog_app.ts
@@ -38,6 +38,11 @@ loadTimeData.getInteger('MAX_NAME_CHAR_COUNT'); export const MAX_PROMPT_CHAR_COUNT = loadTimeData.getInteger('MAX_PROMPT_CHAR_COUNT'); + +// The amount of pixels the user can be from the very bottom of the skills +// dialog before the gradient is removed. +export const BOTTOM_SCROLL_OFFSET_PX = 5; + const REFINE_SKILL_TIMEOUT_MS = 5000; let windowProxyInstance: WindowProxy|null = null; @@ -130,6 +135,7 @@ // Default to user created since these are added by the user via the UI. source: SkillSource.kUserCreated, description: '', + imageUrl: '', creationTime: {internalValue: 0n}, lastUpdateTime: {internalValue: 0n}, }; @@ -225,6 +231,10 @@ } } + override firstUpdated() { + this.attachTextareaResizeObserver_(); + } + override updated(changedProperties: PropertyValues) { super.updated(changedProperties as PropertyValues<this>); @@ -267,10 +277,17 @@ } private checkTextareaOverflow_() { + // During a loading state, the textarea is removed from the DOM. + if (this.isRefineLoading_) { + return; + } const textarea = this.instructionsTextarea_; const hasScrollbar = textarea.scrollHeight > textarea.clientHeight; + // Add a small offset so the user doesn't have to scroll to the absolute + // bottom const isScrolledToBottom = - textarea.scrollTop + textarea.clientHeight >= textarea.scrollHeight; + textarea.scrollTop + textarea.clientHeight + BOTTOM_SCROLL_OFFSET_PX >= + textarea.scrollHeight; textarea.classList.toggle( 'has-overflow', hasScrollbar && !isScrolledToBottom); }
diff --git a/chrome/browser/resources/updater/app.ts b/chrome/browser/resources/updater/app.ts index dd52e766..c5ccb61 100644 --- a/chrome/browser/resources/updater/app.ts +++ b/chrome/browser/resources/updater/app.ts
@@ -107,6 +107,7 @@ this.computeStateFromHistory(events); this.pageDataSource = PageDataSource.FILE; } catch (err) { + console.error('Failed to load history file(s)', err); this.historyLoadError = true; } finally { fileInput.value = ''; @@ -158,19 +159,22 @@ this.userUpdaterState = response.user; this.systemUpdaterState = response.system; }) - .catch(() => { + .catch(err => { this.updaterStateError = true; + console.error('Failed to retrieve updater states', err); }); this.getEnterpriseCompanionState() .then(response => { this.enterpriseCompanionState = response.state; }) - .catch(() => { + .catch((err) => { this.updaterStateError = true; + console.error('Failed to retrieve enterprise companion state', err); }); - this.getAppStates() - .then(apps => this.apps = apps) - .catch(() => this.appStateError = true); + this.getAppStates().then(apps => this.apps = apps).catch((err) => { + this.appStateError = true; + console.error('Failed to retrieve application states', err); + }); } private computeStateFromHistory(rawMessages: Array<Record<string, unknown>>) {
diff --git a/chrome/browser/safe_browsing/download_protection/deep_scanning_browsertest.cc b/chrome/browser/safe_browsing/download_protection/deep_scanning_browsertest.cc index 2936626e..3b83f9e 100644 --- a/chrome/browser/safe_browsing/download_protection/deep_scanning_browsertest.cc +++ b/chrome/browser/safe_browsing/download_protection/deep_scanning_browsertest.cc
@@ -2026,11 +2026,11 @@ content::EvalJsResult result = content::EvalJs(web_contents, "window.fsaPromise"); - ASSERT_THAT(result, content::EvalJsResult::IsError()); - // TODO(crbug.com/407065784): Improve error message for SB checks. - EXPECT_EQ(result.ExtractError(), - "a JavaScript error: \"AbortError: Blocked by Safe Browsing.\"\n"); + ASSERT_THAT( + result, + content::EvalJsResult::ErrorIs( + "a JavaScript error: \"AbortError: Blocked by Safe Browsing.\"\n")); // File is created but remains empty due to block. base::ScopedAllowBlockingForTesting allow_blocking;
diff --git a/chrome/browser/search_engines/android/java/res/layout/preference_list_recycler_view.xml b/chrome/browser/search_engines/android/java/res/layout/preference_list_recycler_view.xml index c91a44c..195d8115 100644 --- a/chrome/browser/search_engines/android/java/res/layout/preference_list_recycler_view.xml +++ b/chrome/browser/search_engines/android/java/res/layout/preference_list_recycler_view.xml
@@ -7,12 +7,6 @@ <org.chromium.chrome.browser.search_engines.settings.common.PreferenceListRecyclerView xmlns:android="http://schemas.android.com/apk/res/android" - style="@style/PreferenceLayout" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingStart="0dp" - android:paddingEnd="0dp" - android:padding="0dp" - android:orientation="vertical" - android:divider="?android:attr/listDivider" - android:showDividers="middle"/> \ No newline at end of file + android:orientation="vertical"/> \ No newline at end of file
diff --git a/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/common/PreferenceListRecyclerView.java b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/common/PreferenceListRecyclerView.java index c627d61..d40cda76 100644 --- a/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/common/PreferenceListRecyclerView.java +++ b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/common/PreferenceListRecyclerView.java
@@ -4,23 +4,72 @@ package org.chromium.chrome.browser.search_engines.settings.common; -import android.content.Context; -import android.util.AttributeSet; +import static org.chromium.build.NullUtil.assertNonNull; -import androidx.recyclerview.widget.DividerItemDecoration; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.View; + import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import org.chromium.build.annotations.NullMarked; +/** Custom RecyclerView that displays a list of items with dividers. */ @NullMarked public class PreferenceListRecyclerView extends RecyclerView { public PreferenceListRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); LinearLayoutManager layoutManager = new LinearLayoutManager(context); setLayoutManager(layoutManager); - DividerItemDecoration divider = - new DividerItemDecoration(context, layoutManager.getOrientation()); - addItemDecoration(divider); + addItemDecoration(new PreferenceListDividerItemDecoration(context)); + } + + private static class PreferenceListDividerItemDecoration extends ItemDecoration { + private static final int[] ATTRS = new int[] {android.R.attr.listDivider}; + private final Drawable mDivider; + private final int mDividerHeight; + + PreferenceListDividerItemDecoration(Context context) { + final TypedArray a = context.obtainStyledAttributes(ATTRS); + mDivider = assertNonNull(a.getDrawable(0)); + mDividerHeight = mDivider.getIntrinsicHeight(); + a.recycle(); + } + + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state) { + int position = parent.getChildAdapterPosition(view); + if (position == state.getItemCount() - 1) { + outRect.bottom = 0; + } else { + outRect.bottom = mDividerHeight; + } + } + + @Override + public void onDraw(Canvas c, RecyclerView parent, State state) { + int left = parent.getPaddingLeft(); + int right = parent.getWidth() - parent.getPaddingRight(); + + for (int i = 0; i < parent.getChildCount(); i++) { + View child = parent.getChildAt(i); + int position = parent.getChildAdapterPosition(child); + + if (position == state.getItemCount() - 1) { + continue; + } + + LayoutParams params = (LayoutParams) child.getLayoutParams(); + int top = child.getBottom() + params.bottomMargin; + int bottom = top + mDividerHeight; + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + } } }
diff --git a/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/extensions/ExtensionSearchEngineMediator.java b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/extensions/ExtensionSearchEngineMediator.java index 54d2c665..94c6aaa 100644 --- a/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/extensions/ExtensionSearchEngineMediator.java +++ b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/extensions/ExtensionSearchEngineMediator.java
@@ -9,7 +9,10 @@ import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.search_engines.R; import org.chromium.chrome.browser.search_engines.settings.common.BaseSiteSearchMediator; +import org.chromium.components.browser_ui.widget.BrowserUiListMenuUtils; +import org.chromium.components.browser_ui.widget.ListItemBuilder; import org.chromium.components.search_engines.TemplateUrl; import org.chromium.components.search_engines.TemplateUrlCategory; import org.chromium.ui.listmenu.ListMenuDelegate; @@ -17,6 +20,7 @@ import java.util.List; +/** Mediator for the search engines settings extensions section. */ @NullMarked public class ExtensionSearchEngineMediator extends BaseSiteSearchMediator { @@ -40,7 +44,18 @@ @Override protected @Nullable ListMenuDelegate createMenuDelegate(TemplateUrl url) { - // TODO: Add menu delegate - return null; + return () -> { + ModelList menuItems = new ModelList(); + menuItems.add( + new ListItemBuilder() + .withTitleRes(R.string.site_search_extensions_menu_manage) + .build()); + menuItems.add( + new ListItemBuilder() + .withTitleRes(R.string.site_search_extensions_menu_disable) + .build()); + + return BrowserUiListMenuUtils.getBasicListMenu(mContext, menuItems, null); + }; } }
diff --git a/chrome/browser/search_engines/android/junit/src/org/chromium/chrome/browser/search_engines/settings/extensions/ExtensionSearchEngineMediatorUnitTest.java b/chrome/browser/search_engines/android/junit/src/org/chromium/chrome/browser/search_engines/settings/extensions/ExtensionSearchEngineMediatorUnitTest.java index 45e9016..93063600 100644 --- a/chrome/browser/search_engines/android/junit/src/org/chromium/chrome/browser/search_engines/settings/extensions/ExtensionSearchEngineMediatorUnitTest.java +++ b/chrome/browser/search_engines/android/junit/src/org/chromium/chrome/browser/search_engines/settings/extensions/ExtensionSearchEngineMediatorUnitTest.java
@@ -27,14 +27,20 @@ import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.search_engines.R; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.browser.search_engines.settings.common.SiteSearchProperties; import org.chromium.components.favicon.LargeIconBridgeJni; import org.chromium.components.search_engines.TemplateUrl; import org.chromium.components.search_engines.TemplateUrlCategory; import org.chromium.components.search_engines.TemplateUrlService; +import org.chromium.ui.listmenu.BasicListMenu; +import org.chromium.ui.listmenu.ListMenuDelegate; +import org.chromium.ui.listmenu.ListMenuItemProperties; import org.chromium.ui.modelutil.MVCListAdapter.ListItem; import org.chromium.ui.modelutil.MVCListAdapter.ModelList; +import org.chromium.ui.modelutil.ModelListAdapter; +import org.chromium.ui.modelutil.PropertyModel; import org.chromium.url.GURL; import java.util.Arrays; @@ -110,6 +116,34 @@ } @Test + public void testMenuDelegate() { + // Trigger the refreshList() to call mModelList.add(). + mMediator.onTemplateURLServiceChanged(); + + ArgumentCaptor<ListItem> itemCaptor = ArgumentCaptor.forClass(ListItem.class); + verify(mModelList).add(itemCaptor.capture()); + + PropertyModel model = itemCaptor.getValue().model; + ListMenuDelegate delegate = model.get(SiteSearchProperties.MENU_DELEGATE); + + assertNotNull(delegate); + + BasicListMenu listMenu = (BasicListMenu) delegate.getListMenu(); + ModelListAdapter adapter = listMenu.getContentAdapter(); + assertEquals(2, adapter.getCount()); + + ListItem activateItem = (ListItem) adapter.getItem(0); + assertEquals( + R.string.site_search_extensions_menu_manage, + activateItem.model.get(ListMenuItemProperties.TITLE_ID)); + + ListItem makeDefaultItem = (ListItem) adapter.getItem(1); + assertEquals( + R.string.site_search_extensions_menu_disable, + makeDefaultItem.model.get(ListMenuItemProperties.TITLE_ID)); + } + + @Test public void testDestroy() { mMediator.destroy(); verify(mTemplateUrlService).removeObserver(mMediator);
diff --git a/chrome/browser/skills/skills_glic_mojom_util.cc b/chrome/browser/skills/skills_glic_mojom_util.cc index ab28e331..2dae367 100644 --- a/chrome/browser/skills/skills_glic_mojom_util.cc +++ b/chrome/browser/skills/skills_glic_mojom_util.cc
@@ -4,9 +4,12 @@ #include "chrome/browser/skills/skills_glic_mojom_util.h" +#include <optional> + #include "base/check.h" #include "base/notreached.h" #include "components/skills/public/skill.h" +#include "url/gurl.h" namespace skills { @@ -43,9 +46,14 @@ glic::mojom::SkillPreviewPtr SkillToGlicMojomSkillPreview( const skills::Skill* skill) { CHECK(skill); + std::optional<GURL> image_url; + if (!skill->image_url.is_empty()) { + image_url = skill->image_url; + } return glic::mojom::SkillPreview::New( skill->id, skill->name, skill->icon, - SyncPbToGlicMojomSkillSource(skill->source), skill->description); + SyncPbToGlicMojomSkillSource(skill->source), skill->description, + image_url); } } // namespace skills
diff --git a/chrome/browser/skills/skills_update_observer.cc b/chrome/browser/skills/skills_update_observer.cc index 664da1e..2928f87 100644 --- a/chrome/browser/skills/skills_update_observer.cc +++ b/chrome/browser/skills/skills_update_observer.cc
@@ -74,8 +74,7 @@ } if (!navigation_handle->HasCommitted() || - !navigation_handle->IsInPrimaryMainFrame() || - navigation_handle->IsSameDocument()) { + !navigation_handle->IsInPrimaryMainFrame()) { return; }
diff --git a/chrome/browser/skills/skills_update_observer_unittest.cc b/chrome/browser/skills/skills_update_observer_unittest.cc index 46a3fde..cce919a 100644 --- a/chrome/browser/skills/skills_update_observer_unittest.cc +++ b/chrome/browser/skills/skills_update_observer_unittest.cc
@@ -85,6 +85,13 @@ url); } + void SimulateSameDocumentNavigation(const GURL& url) { + std::unique_ptr<content::NavigationSimulator> simulator = + content::NavigationSimulator::CreateRendererInitiated( + url, web_contents()->GetPrimaryMainFrame()); + simulator->CommitSameDocument(); + } + // Sets up an expectation for the mock Optimization Guide service. void ExpectOptimizationGuideDecision( const GURL& url, @@ -256,3 +263,29 @@ EXPECT_EQ(previews[0]->name, "Test Skill"); EXPECT_EQ(previews[0]->icon, "test_icon"); } + +// Test that the contextual skills are updated on same document navigations. +TEST_F(SkillsUpdateObserverTest, SameDocumentNavigationUpdatesSkills) { + GURL url1("https://www.example1.com"); + GURL url2("https://www.example1.com/watch"); + + skills::proto::SkillsList skills1; + skills1.add_skills()->set_name("Skill 1"); + ExpectOptimizationGuideDecision( + url1, optimization_guide::OptimizationGuideDecision::kTrue, skills1); + + SimulateNavigation(url1); + const skills::proto::SkillsList* result1 = observer_->contextual_skills(); + EXPECT_EQ(result1->skills_size(), 1); + EXPECT_EQ(result1->skills(0).name(), "Skill 1"); + + skills::proto::SkillsList skills2; + skills2.add_skills()->set_name("Skill 2"); + ExpectOptimizationGuideDecision( + url2, optimization_guide::OptimizationGuideDecision::kTrue, skills2); + + SimulateSameDocumentNavigation(url2); + const skills::proto::SkillsList* result2 = observer_->contextual_skills(); + EXPECT_EQ(result2->skills_size(), 1); + EXPECT_EQ(result2->skills(0).name(), "Skill 2"); +}
diff --git a/chrome/browser/sync/test/integration/BUILD.gn b/chrome/browser/sync/test/integration/BUILD.gn index 1d52797..0d445fcf 100644 --- a/chrome/browser/sync/test/integration/BUILD.gn +++ b/chrome/browser/sync/test/integration/BUILD.gn
@@ -150,7 +150,6 @@ "single_client_polling_sync_test.cc", "single_client_saved_tab_groups_sync_test.cc", "single_client_search_engines_sync_test.cc", - "single_client_secondary_account_sync_test.cc", "single_client_send_tab_to_self_sync_test.cc", "single_client_sessions_sync_test.cc", "single_client_sharing_message_sync_test.cc",
diff --git a/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc b/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc deleted file mode 100644 index 2621c1e6..0000000 --- a/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc +++ /dev/null
@@ -1,90 +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 "base/callback_list.h" -#include "base/files/file_util.h" -#include "base/threading/thread_restrictions.h" -#include "build/build_config.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/sync/test/integration/secondary_account_helper.h" -#include "chrome/browser/sync/test/integration/sync_service_impl_harness.h" -#include "chrome/browser/sync/test/integration/sync_test.h" -#include "components/sync/base/data_type.h" -#include "components/sync/service/glue/sync_transport_data_prefs.h" -#include "components/sync/service/sync_service_impl.h" -#include "content/public/test/browser_test.h" - -namespace { - -class SingleClientSecondaryAccountSyncTest : public SyncTest { - public: - SingleClientSecondaryAccountSyncTest() : SyncTest(SINGLE_CLIENT) {} - - SingleClientSecondaryAccountSyncTest( - const SingleClientSecondaryAccountSyncTest&) = delete; - SingleClientSecondaryAccountSyncTest& operator=( - const SingleClientSecondaryAccountSyncTest&) = delete; - - ~SingleClientSecondaryAccountSyncTest() override = default; - - SyncTest::SetupSyncMode GetSetupSyncMode() const override { - // The value doesn't matter, since the tests use SetupSyncWithMode(..) to - // explicitly pick Sync-the-feature or Sync-the-transport. - return SyncTest::SetupSyncMode::kSyncTransportOnly; - } - - Profile* profile() { return GetProfile(0); } -}; - -#if BUILDFLAG(IS_CHROMEOS) -IN_PROC_BROWSER_TEST_F(SingleClientSecondaryAccountSyncTest, - DoesNotStartSyncTransportOnSignin) { - ASSERT_TRUE(SetupClients()); - - // Signing in (without explicitly setting up Sync) should do nothing here, - // since we're on a platform where the unconsented primary account is not - // supported. - secondary_account_helper::SignInUnconsentedAccount( - profile(), &test_url_loader_factory_, "user@email.com"); - EXPECT_EQ(syncer::SyncService::TransportState::DISABLED, - GetSyncService(0)->GetTransportState()); -} -#endif // BUILDFLAG(IS_CHROMEOS) - -// ChromeOS doesn't support changes to the primary account after startup, so -// this test doesn't apply. -#if !BUILDFLAG(IS_CHROMEOS) -IN_PROC_BROWSER_TEST_F(SingleClientSecondaryAccountSyncTest, - SwitchesFromTransportToFeature) { - ASSERT_TRUE(SetupClients()); - - // Set up Sync in transport mode. - ASSERT_TRUE(SetupSyncWithMode(SetupSyncMode::kSyncTransportOnly)); - ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE, - GetSyncService(0)->GetTransportState()); - - // Simulate the user opting in to full Sync, and set first-time setup to - // complete. - secondary_account_helper::GrantSyncConsent( - profile(), - GetClient(0)->GetEmailForAccount(SyncTestAccount::kDefaultAccount)); - GetSyncService(0)->GetUserSettings()->SetInitialSyncFeatureSetupComplete( - syncer::SyncFirstSetupCompleteSource::BASIC_FLOW); - - EXPECT_TRUE(GetClient(0)->AwaitSyncTransportActive()); - EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE, - GetSyncService(0)->GetTransportState()); - EXPECT_TRUE(GetSyncService(0)->IsSyncFeatureEnabled()); - EXPECT_TRUE(GetSyncService(0)->IsSyncFeatureActive()); - - // Make sure that some data type which is not allowed in transport-only mode - // got activated. - ASSERT_FALSE(AllowedTypesInStandaloneTransportMode().Has(syncer::AUTOFILL)); - ASSERT_TRUE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has( - syncer::UserSelectableType::kAutofill)); - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::AUTOFILL)); -} -#endif // !BUILDFLAG(IS_CHROMEOS) - -} // namespace
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabStateStorageService.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabStateStorageService.java index 2c8f8a0..1a39a7c 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabStateStorageService.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabStateStorageService.java
@@ -14,6 +14,8 @@ import org.chromium.build.annotations.Nullable; import org.chromium.components.tabs.TabStripCollection; +import java.util.List; + /** Java counterpart to keyed service in native that writes tab data to disk. */ @JNINamespace("tabs") @NullMarked @@ -108,6 +110,16 @@ } /** + * Clears all windows except for those with the provided tags. + * + * @param windowTags The window tags to keep. + */ + public void clearAllWindowsExcept(List<String> windowTags) { + TabStateStorageServiceJni.get() + .clearAllWindowsExcept(mNativeTabStateStorageService, windowTags); + } + + /** * Clears all unused nodes for a given window from persistent storage. Any node that is not a * child of the given collection will be deleted. * @@ -197,6 +209,10 @@ void clearWindow( long nativeTabStateStorageServiceAndroid, @JniType("std::string") String windowTag); + void clearAllWindowsExcept( + long nativeTabStateStorageServiceAndroid, + @JniType("std::vector<std::string>") List<String> windowTags); + long createBatch(long nativeTabStateStorageServiceAndroid); void clearWindowWithOtrStatus(
diff --git a/chrome/browser/tab/tab_state_storage_backend.cc b/chrome/browser/tab/tab_state_storage_backend.cc index dd403c0..1904fd0 100644 --- a/chrome/browser/tab/tab_state_storage_backend.cc +++ b/chrome/browser/tab/tab_state_storage_backend.cc
@@ -154,6 +154,15 @@ std::string(window_tag))); } +void TabStateStorageBackend::ClearAllWindowsExcept( + std::vector<std::string> window_tags) { + db_task_runner_->PostTask( + FROM_HERE, + base::BindOnce( + base::IgnoreResult(&TabStateStorageDatabase::ClearAllWindowsExcept), + base::Unretained(database_.get()), std::move(window_tags))); +} + void TabStateStorageBackend::ClearNodesForWindowExcept( std::string_view window_tag, bool is_off_the_record,
diff --git a/chrome/browser/tab/tab_state_storage_backend.h b/chrome/browser/tab/tab_state_storage_backend.h index 940f519c..ffe3dd9 100644 --- a/chrome/browser/tab/tab_state_storage_backend.h +++ b/chrome/browser/tab/tab_state_storage_backend.h
@@ -64,6 +64,8 @@ void ClearDivergenceWindow(std::string_view window_tag); + void ClearAllWindowsExcept(std::vector<std::string> window_tags); + void ClearNodesForWindowExcept(std::string_view window_tag, bool is_off_the_record, std::vector<StorageId> ids);
diff --git a/chrome/browser/tab/tab_state_storage_database.cc b/chrome/browser/tab/tab_state_storage_database.cc index 4f2e818e..84e1486 100644 --- a/chrome/browser/tab/tab_state_storage_database.cc +++ b/chrome/browser/tab/tab_state_storage_database.cc
@@ -540,6 +540,33 @@ delete_statement.Run(); } +bool TabStateStorageDatabase::ClearAllWindowsExcept( + const std::vector<std::string>& window_tags) { + DCHECK(!window_tags.empty()); + OpenTransaction* transaction = CreateTransaction(); + const std::string tag_placeholders = base::JoinString( + std::vector<std::string_view>(window_tags.size(), "?"), ","); + const std::string kDeleteSql = base::StrCat( + {"DELETE FROM nodes WHERE window_tag NOT IN (", tag_placeholders, ")"}); + sql::Statement delete_statement(db_.GetUniqueStatement(kDeleteSql)); + for (size_t i = 0; i < window_tags.size(); i++) { + delete_statement.BindString(i, window_tags[i]); + } + bool result1 = delete_statement.Run(); + + const std::string kDeleteDivergentSql = + base::StrCat({"DELETE FROM divergent_nodes WHERE window_tag NOT IN (", + tag_placeholders, ")"}); + sql::Statement delete_divergent_statement( + db_.GetUniqueStatement(kDeleteDivergentSql)); + for (size_t i = 0; i < window_tags.size(); i++) { + delete_divergent_statement.BindString(i, window_tags[i]); + } + bool result2 = delete_divergent_statement.Run(); + CloseTransaction(transaction); + return result1 && result2; +} + bool TabStateStorageDatabase::ClearNodesForWindowExcept( std::string_view window_tag, bool is_off_the_record,
diff --git a/chrome/browser/tab/tab_state_storage_database.h b/chrome/browser/tab/tab_state_storage_database.h index 3401662..d8bb63e 100644 --- a/chrome/browser/tab/tab_state_storage_database.h +++ b/chrome/browser/tab/tab_state_storage_database.h
@@ -127,6 +127,9 @@ // Clears a divergence window from the database. void ClearDivergenceWindow(std::string_view window_tag); + // Clears all windows except for those with the provided tags. + bool ClearAllWindowsExcept(const std::vector<std::string>& window_tags); + // Clears all nodes for a given window from the database except for the // provided storage IDs. bool ClearNodesForWindowExcept(std::string_view window_tag,
diff --git a/chrome/browser/tab/tab_state_storage_service.cc b/chrome/browser/tab/tab_state_storage_service.cc index a48b80a..43056b75 100644 --- a/chrome/browser/tab/tab_state_storage_service.cc +++ b/chrome/browser/tab/tab_state_storage_service.cc
@@ -260,6 +260,11 @@ tab_backend_.ClearDivergenceWindow(window_tag); } +void TabStateStorageService::ClearAllWindowsExcept( + std::vector<std::string> window_tags) { + tab_backend_.ClearAllWindowsExcept(std::move(window_tags)); +} + void TabStateStorageService::ClearDivergentNodesForWindow( std::string_view window_tag, bool is_off_the_record) {
diff --git a/chrome/browser/tab/tab_state_storage_service.h b/chrome/browser/tab/tab_state_storage_service.h index 14f2bd5..82142308 100644 --- a/chrome/browser/tab/tab_state_storage_service.h +++ b/chrome/browser/tab/tab_state_storage_service.h
@@ -120,6 +120,8 @@ void ClearDivergenceWindow(std::string_view window_tag); + void ClearAllWindowsExcept(std::vector<std::string> window_tags); + void ClearNodesForWindowExcept(std::string_view window_tag, bool is_off_the_record, std::vector<StorageId> ids);
diff --git a/chrome/browser/tracing/chrome_background_tracing_metrics_provider.cc b/chrome/browser/tracing/chrome_background_tracing_metrics_provider.cc index debf2e0b..ddcf98f5 100644 --- a/chrome/browser/tracing/chrome_background_tracing_metrics_provider.cc +++ b/chrome/browser/tracing/chrome_background_tracing_metrics_provider.cc
@@ -64,7 +64,7 @@ std::make_unique<AccessibilityStateProvider>()); system_profile_providers_.emplace_back( std::make_unique<metrics::DriveMetricsProvider>( - chrome::FILE_LOCAL_STATE)); + chrome::FILE_LOCAL_STATE, g_browser_process->local_state())); system_profile_providers_.emplace_back( std::make_unique<metrics::NetworkMetricsProvider>( content::CreateNetworkConnectionTrackerAsyncGetter(),
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 35dbf883..1c6d029 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -3595,9 +3595,6 @@ "views/apps/chrome_native_app_window_views.cc", "views/apps/chrome_native_app_window_views.h", "views/autofill/address_bubble_base_view.cc", - "views/autofill/address_bubble_base_view.h", - "views/autofill/address_bubbles_icon_view.cc", - "views/autofill/address_bubbles_icon_view.h", "views/autofill/address_editor_view.cc", "views/autofill/address_editor_view.h", "views/autofill/autofill_ai/autofill_ai_bubble_utils.cc",
diff --git a/chrome/browser/ui/android/autofill/dialog/autofill_dialog_view_android.cc b/chrome/browser/ui/android/autofill/dialog/autofill_dialog_view_android.cc index 6566090..06d0a76 100644 --- a/chrome/browser/ui/android/autofill/dialog/autofill_dialog_view_android.cc +++ b/chrome/browser/ui/android/autofill/dialog/autofill_dialog_view_android.cc
@@ -9,6 +9,7 @@ #include "base/android/jni_android.h" #include "base/android/jni_string.h" #include "base/check_deref.h" +#include "chrome/android/chrome_jni_headers/AutofillDialogController_jni.h" #include "chrome/browser/ui/autofill/autofill_dialog_view.h" #include "ui/android/view_android.h" #include "ui/android/window_android.h" @@ -28,11 +29,32 @@ } void AutofillDialogViewAndroid::Show() { - // TODO: crbug.com/476753598 - Implement. + JNIEnv* env = base::android::AttachCurrentThread(); + ui::ViewAndroid* view_android = controller_->GetWebContents().GetNativeView(); + if (!view_android) { + return; + } + ui::WindowAndroid* window_android = view_android->GetWindowAndroid(); + if (!window_android) { + return; + } + + java_object_.Reset(Java_AutofillDialogController_create( + env, reinterpret_cast<intptr_t>(this), window_android->GetJavaObject())); + // Java object might be null if the context associated with the android + // window doesn't exist. + if (!java_object_.is_null()) { + Java_AutofillDialogController_show( + env, java_object_, controller_->GetTitleText(), + controller_->GetDescriptionText(), controller_->GetButtonText()); + } } void AutofillDialogViewAndroid::Dismiss() { - // TODO: crbug.com/476753598 - Implement. + JNIEnv* env = base::android::AttachCurrentThread(); + if (!java_object_.is_null()) { + Java_AutofillDialogController_dismiss(env, java_object_); + } } void AutofillDialogViewAndroid::OnPositiveButtonClicked(JNIEnv* env) { @@ -46,3 +68,5 @@ AutofillDialogViewAndroid::~AutofillDialogViewAndroid() = default; } // namespace autofill + +DEFINE_JNI(AutofillDialogController)
diff --git a/chrome/browser/ui/android/extensions/extensions_menu_delegate_android.cc b/chrome/browser/ui/android/extensions/extensions_menu_delegate_android.cc index 4db3eeb..a892968 100644 --- a/chrome/browser/ui/android/extensions/extensions_menu_delegate_android.cc +++ b/chrome/browser/ui/android/extensions/extensions_menu_delegate_android.cc
@@ -99,7 +99,8 @@ return Java_MenuEntryState_Constructor( env, id, CreateJavaControlState(env, state.action_button), CreateJavaControlState(env, state.context_menu_button), - CreateJavaControlState(env, state.site_access_toggle)); + CreateJavaControlState(env, state.site_access_toggle), + CreateJavaControlState(env, state.site_permissions_button)); } int ExtensionsMenuDelegateAndroid::GetOptionalSection(JNIEnv* env) {
diff --git a/chrome/browser/ui/android/extensions/java/res/layout/extensions_menu_item.xml b/chrome/browser/ui/android/extensions/java/res/layout/extensions_menu_item.xml index 765321d..5ae1fb4f 100644 --- a/chrome/browser/ui/android/extensions/java/res/layout/extensions_menu_item.xml +++ b/chrome/browser/ui/android/extensions/java/res/layout/extensions_menu_item.xml
@@ -5,62 +5,80 @@ found in the LICENSE file. --> -<androidx.constraintlayout.widget.ConstraintLayout +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="48dp" + android:layout_height="wrap_content" + android:orientation="vertical" android:background="?android:attr/selectableItemBackground" - android:gravity="center_vertical" android:paddingStart="24dp" android:paddingEnd="24dp" android:clickable="true" android:focusable="true" tools:ignore="UnusedResources" > - <ImageView - android:id="@+id/extensions_menu_item_icon" - style="@style/ListMenuItemIconStyle.Start" - android:layout_width="34dp" - android:layout_height="34dp" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toBottomOf="parent" - android:importantForAccessibility="no" /> + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="48dp" > + + <ImageView + android:id="@+id/extensions_menu_item_icon" + style="@style/ListMenuItemIconStyle.Start" + android:layout_width="34dp" + android:layout_height="34dp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + android:importantForAccessibility="no" /> + + <TextView + android:id="@+id/extensions_menu_item_title" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:layout_marginEnd="8dp" + app:layout_constraintEnd_toStartOf="@id/extensions_menu_item_toggle" + app:layout_constraintStart_toEndOf="@id/extensions_menu_item_icon" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintHorizontal_bias="0.0" /> + + <org.chromium.components.browser_ui.widget.MaterialSwitchWithText + android:id="@+id/extensions_menu_item_toggle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="8dp" + app:layout_constraintEnd_toStartOf="@id/extensions_menu_item_context_menu" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" /> + + <org.chromium.ui.listmenu.ListMenuButton + android:id="@+id/extensions_menu_item_context_menu" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/ic_more_vert" + android:background="?attr/selectableItemBackgroundBorderless" + android:contentDescription="@string/extensions_menu_context_menu_tooltip" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + app:menuVerticalOverlapAnchor="false" + app:menuMaxWidth="@dimen/extension_action_button_list_menu_width" /> + + </androidx.constraintlayout.widget.ConstraintLayout> <TextView - android:id="@+id/extensions_menu_item_title" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="16dp" - android:layout_marginEnd="8dp" - app:layout_constraintEnd_toStartOf="@id/extensions_menu_item_toggle" - app:layout_constraintStart_toEndOf="@id/extensions_menu_item_icon" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintHorizontal_bias="0.0" /> - - <org.chromium.components.browser_ui.widget.MaterialSwitchWithText - android:id="@+id/extensions_menu_item_toggle" + android:id="@+id/extensions_menu_item_site_permissions_button" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginEnd="8dp" - app:layout_constraintEnd_toStartOf="@id/extensions_menu_item_context_menu" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toBottomOf="parent" /> + android:layout_marginStart="50dp" + android:paddingTop="4dp" + android:paddingBottom="4dp" + android:background="?android:attr/selectableItemBackground" + android:clickable="true" + android:focusable="true" + android:textAppearance="@style/TextAppearance.TextSmall.Secondary" /> - <org.chromium.ui.listmenu.ListMenuButton - android:id="@+id/extensions_menu_item_context_menu" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:src="@drawable/ic_more_vert" - android:background="?attr/selectableItemBackgroundBorderless" - android:contentDescription="@string/extensions_menu_context_menu_tooltip" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toBottomOf="parent" - app:menuVerticalOverlapAnchor="false" - app:menuMaxWidth="@dimen/extension_action_button_list_menu_width" /> - -</androidx.constraintlayout.widget.ConstraintLayout> +</LinearLayout>
diff --git a/chrome/browser/ui/android/extensions/java/src/org/chromium/chrome/browser/ui/extensions/ExtensionsMenuTypes.java b/chrome/browser/ui/android/extensions/java/src/org/chromium/chrome/browser/ui/extensions/ExtensionsMenuTypes.java index f3c34ab..19b5effd 100644 --- a/chrome/browser/ui/android/extensions/java/src/org/chromium/chrome/browser/ui/extensions/ExtensionsMenuTypes.java +++ b/chrome/browser/ui/android/extensions/java/src/org/chromium/chrome/browser/ui/extensions/ExtensionsMenuTypes.java
@@ -65,8 +65,8 @@ public final ControlState actionButton; public final ControlState contextMenuButton; public final ControlState siteAccessToggle; + public final ControlState sitePermissionsButton; - // TODO(crbug.com/471016915): add site permissions button. // TODO(crbug.com/471016915): add is enterprise boolean. @CalledByNative("MenuEntryState") @@ -74,11 +74,13 @@ @JniType("std::string") String id, ControlState actionButton, ControlState contextMenuButton, - ControlState siteAccessToggle) { + ControlState siteAccessToggle, + ControlState sitePermissionsButton) { this.id = id; this.actionButton = actionButton; this.contextMenuButton = contextMenuButton; this.siteAccessToggle = siteAccessToggle; + this.sitePermissionsButton = sitePermissionsButton; } }
diff --git a/chrome/browser/ui/android/extensions/javatests/src/org/chromium/chrome/browser/ui/extensions/ExtensionTestUtils.java b/chrome/browser/ui/android/extensions/javatests/src/org/chromium/chrome/browser/ui/extensions/ExtensionTestUtils.java index bcd348c..4e120e4 100644 --- a/chrome/browser/ui/android/extensions/javatests/src/org/chromium/chrome/browser/ui/extensions/ExtensionTestUtils.java +++ b/chrome/browser/ui/android/extensions/javatests/src/org/chromium/chrome/browser/ui/extensions/ExtensionTestUtils.java
@@ -117,8 +117,8 @@ /** * Helper to create a {@link ExtensionsMenuTypes.MenuEntryState} for a simple extension without - * host permissions. The entry will only have a disabled action button and a hidden site access - * toggle. + * host permissions. The entry will have a disabled action button, and hidden site access toggle + * and site permissions button. */ public static ExtensionsMenuTypes.MenuEntryState createSimpleMenuEntry( String extensionId, @@ -133,8 +133,21 @@ /* tooltipText= */ "", /* isOn= */ false, /* icon= */ null); + ExtensionsMenuTypes.ControlState sitePermissionsButton = + new ExtensionsMenuTypes.ControlState( + ExtensionsMenuTypes.ControlState.Status.HIDDEN, + /* text= */ "", + /* accessibleName= */ "", + /* tooltipText= */ "", + /* isOn= */ false, + /* icon= */ null); return createMenuEntry( - extensionId, extensionName, extensionIcon, isPinned, siteAccessToggle); + extensionId, + extensionName, + extensionIcon, + isPinned, + siteAccessToggle, + sitePermissionsButton); } /** Helper to create a {@link ExtensionsMenuTypes.MenuEntryState}. */ @@ -143,7 +156,8 @@ String extensionName, @Nullable Bitmap extensionIcon, boolean isPinned, - ExtensionsMenuTypes.ControlState siteAccessToggle) { + ExtensionsMenuTypes.ControlState siteAccessToggle, + ExtensionsMenuTypes.ControlState sitePermissionsButton) { ExtensionsMenuTypes.ControlState actionButton = new ExtensionsMenuTypes.ControlState( ExtensionsMenuTypes.ControlState.Status.DISABLED, @@ -161,7 +175,11 @@ /* isOn= */ isPinned, /* icon= */ null); return new ExtensionsMenuTypes.MenuEntryState( - extensionId, actionButton, contextMenuButton, siteAccessToggle); + extensionId, + actionButton, + contextMenuButton, + siteAccessToggle, + sitePermissionsButton); } /** Helper to create a simple icon with the given color. */
diff --git a/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/DoodleCache.java b/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/DoodleCache.java index 1337868..7c723e8 100644 --- a/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/DoodleCache.java +++ b/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/DoodleCache.java
@@ -23,7 +23,7 @@ private @Nullable Logo mCachedDoodle; private long mCachedDoodleTimeMillis; private @Nullable String mCachedDoodleKeyword; - // 12 hours cache validity. + // 1 hour cache validity. private static final long CACHE_TTL_MS = 60 * 60 * 1000; /** Static class that implements the initialization-on-demand holder idiom. */
diff --git a/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/DoodleCacheUnitTest.java b/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/DoodleCacheUnitTest.java index f3fc3e5..982eabf 100644 --- a/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/DoodleCacheUnitTest.java +++ b/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/DoodleCacheUnitTest.java
@@ -73,8 +73,8 @@ String keyword = "keyword"; mDoodleCache.updateCachedDoodle(mLogo, keyword); - // Advance time by 12 hours + 1 ms. - mFakeTimeTestRule.advanceMillis(12 * 60 * 60 * 1000 + 1); + // Advance time by 1 hour + 1 ms. + mFakeTimeTestRule.advanceMillis(60 * 60 * 1000 + 1); assertNull(mDoodleCache.getCachedDoodle(keyword)); }
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 27950ae3..4c5a0345 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
@@ -251,6 +251,13 @@ // record, don't bother loading the logo image. if (mHasLogoLoadedForCurrentSearchEngine || mProfile == null || !mShouldShowLogo) return; + if (mLogoBridge == null) { + mLogoBridge = new LogoBridge(mProfile); + mImageFetcher = + ImageFetcherFactory.createImageFetcher( + ImageFetcherConfig.DISK_CACHE_ONLY, mProfile.getProfileKey()); + } + @Nullable Logo cachedDoodle = DoodleCache.getInstance().getCachedDoodle(mSearchEngineKeyword); boolean isCacheHit = cachedDoodle != null; @@ -260,6 +267,8 @@ mLogoModel.set(LogoProperties.ANIMATION_ENABLED, animationEnabled && !isCacheHit); if (isCacheHit) { + mOnLogoClickUrl = assumeNonNull(cachedDoodle).onClickUrl; + mAnimatedLogoUrl = assumeNonNull(cachedDoodle).animatedLogoUrl; updateModelWithLogo(cachedDoodle); RecordHistogram.recordEnumeratedHistogram( LOGO_SHOWN_FROM_CACHE_UMA_NAME, @@ -272,13 +281,6 @@ showSearchProviderInitialView(); - if (mLogoBridge == null) { - mLogoBridge = new LogoBridge(mProfile); - mImageFetcher = - ImageFetcherFactory.createImageFetcher( - ImageFetcherConfig.DISK_CACHE_ONLY, mProfile.getProfileKey()); - } - getSearchProviderLogo( new LogoBridge.LogoObserver() { @Override
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java index e318cfa..b860edf 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java
@@ -736,6 +736,15 @@ } /** + * Returns whether the url bar is in the special "focused without animation" state, a special + * case where we show a blinking cursor in the UrlBar on the NTP in order to accept keyboard + * input from an attached keyboard, but otherwise do not treat the UrlBar as focused. + */ + public boolean isUrlBarFocusedWithoutAnimation() { + return mLocationBarMediator.isUrlBarFocusedWithoutAnimation(); + } + + /** * @see UrlBarCoordinator#getVisibleTextPrefixHint() */ public @Nullable CharSequence getOmniboxVisibleTextPrefixHint() {
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java index cf254fa..2330de6 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java
@@ -2017,6 +2017,10 @@ updateButtonVisibility(); } + boolean isUrlBarFocusedWithoutAnimation() { + return mUrlFocusedWithoutAnimations; + } + /** Getter for LocationBarDataProvider. */ public LocationBarDataProvider getLocationBarDataProvider() { return mLocationBarDataProvider;
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd index 8d6cbb4..5e017c2 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -546,6 +546,12 @@ <message name="IDS_SITE_SEARCH_EXTENSIONS_DESCRIPTION" desc="Explanation for 'Extensions' section"> Some extensions can add search engines to Chrome </message> + <message name="IDS_SITE_SEARCH_EXTENSIONS_MENU_MANAGE" desc="Menu item to manage extensions"> + Manage + </message> + <message name="IDS_SITE_SEARCH_EXTENSIONS_MENU_DISABLE" desc="Menu item to disable the extension"> + Disable + </message> <message name="IDS_SITE_SEARCH_DIALOG_TITLE_ADD" desc="Title for the Add Site Search dialog."> Add site search </message>
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SITE_SEARCH_EXTENSIONS_MENU_DISABLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SITE_SEARCH_EXTENSIONS_MENU_DISABLE.png.sha1 new file mode 100644 index 0000000..3c6cca0 --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SITE_SEARCH_EXTENSIONS_MENU_DISABLE.png.sha1
@@ -0,0 +1 @@ +a08bec813c90aee90863cb74fdc392bb6345e076 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SITE_SEARCH_EXTENSIONS_MENU_MANAGE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SITE_SEARCH_EXTENSIONS_MENU_MANAGE.png.sha1 new file mode 100644 index 0000000..9678e349 --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SITE_SEARCH_EXTENSIONS_MENU_MANAGE.png.sha1
@@ -0,0 +1 @@ +d620f7e5c80205818c3b4d20338b2c7b464cb4ec \ No newline at end of file
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 4294076..ed521875 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
@@ -25,7 +25,7 @@ <translation id="1094555143448724771">Teiste seadmete vahelehtede nägemiseks sünkroonige oma vahelehed ja ajalugu</translation> <translation id="1095761715416917775">Veenduge, et pääseksite alati oma sünkroonitud andmetele juurde</translation> <translation id="1096091316906284742">Chrome Findsi lubamise alumine leht</translation> -<translation id="1100066534610197918">Ava rühmas uuel vahelehel</translation> +<translation id="1100066534610197918">Ava grupis uuel vahelehel</translation> <translation id="1103142993930332957">Kas soovite aidata Chrome'i täiustada?</translation> <translation id="1105960400813249514">Kuva jäädvustamine</translation> <translation id="1108214977745280468">Kuva lehe statistika</translation> @@ -81,7 +81,7 @@ <translation id="129553762522093515">Viimati suletud</translation> <translation id="1298077576058087471">Säästke kuni 60% andmemahtu, lugege tänaseid uudiseid</translation> <translation id="1303507811548703290"><ph name="DOMAIN" /> – saadetud seadmest <ph name="DEVICE_NAME" /></translation> -<translation id="1310482092992808703">Vahelehtede grupeerimine</translation> +<translation id="1310482092992808703">Grupeeri vahelehed</translation> <translation id="1318262688555255786">Jagage veebilehe <ph name="PAGE_TITLE" /> linki. Allikas: <ph name="PAGE_URL" /></translation> <translation id="1320912611264252795">Järjehoidja salvestamise voo kaustad on avatud täiskõrgusel</translation> <translation id="1327257854815634930">Navigeerimisajalugu on avatud</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 944fe0e..a67a4e4 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
@@ -91,7 +91,7 @@ <translation id="1336996151357442890">اشتراک «<ph name="SITE_NAME" />» لغو شد. در بازدید بعدی دوباره از شما سؤال خواهد شد.</translation> <translation id="1340839264183302272">ترک گروه</translation> <translation id="1342886103232377846">برای بررسی گذرواژههای لورفته، به «مدیر گذرواژه Google» بروید</translation> -<translation id="1343830902827845050">ورود به سیستم Chrome</translation> +<translation id="1343830902827845050">وارد سیستم Chrome شوید</translation> <translation id="1344653310988386453">اضافه کردن پیوند به مورد برجستهشده</translation> <translation id="1355088659320425659">سابقه و زبانهها</translation> <translation id="1360432990279830238">از سیستم خارج و همگامسازی خاموش شود؟</translation> @@ -838,7 +838,7 @@ <translation id="4543131175509360848">برگ گذرکلیدی وجود ندارد</translation> <translation id="4547551584605870320">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> زبانه}one{<ph name="TAB_COUNT_MANY" /> زبانه، <ph name="TAB_COUNT_INCOGNITO" /> زبانه ناشناس}other{<ph name="TAB_COUNT_MANY" /> زبانه، <ph name="TAB_COUNT_INCOGNITO" /> زبانه ناشناس}}</translation> <translation id="4558311620361989323">میانبرهای صفحه وب</translation> -<translation id="4572422548854449519">به حساب مدیریتشده وارد شوید</translation> +<translation id="4572422548854449519">وارد سیستم حساب مدیریتشده شوید</translation> <translation id="4577115723294378384">ترتیب براساس الف تا ی</translation> <translation id="4578289292431526768">بیایید شروع کنیم</translation> <translation id="4583164079174244168">{MINUTES,plural, =1{# دقیقه قبل}one{# دقیقه قبل}other{# دقیقه قبل}}</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 2d2e55c..ed06f179 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
@@ -405,7 +405,7 @@ <translation id="2723001399770238859">audio</translation> <translation id="2739887572830526131">Conservez ce groupe pour y ajouter des onglets plus tard, ou supprimez-le si vous n'en avez plus besoin.</translation> <translation id="2742373789128106053"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> n'est pas disponible pour le moment.</translation> -<translation id="2751271371269891762">Pour accéder à vos favoris et plus sur tous vos appareils, connectez-vous en tant que <ph name="EMAIL" /></translation> +<translation id="2751271371269891762">Pour accéder à vos favoris et plus encore sur tous vos appareils, connectez-vous en tant que <ph name="EMAIL" /></translation> <translation id="2760805590727089264">MM/AA</translation> <translation id="2762000892062317888">à l'instant</translation> <translation id="276969039800130567">Connecté en tant que <ph name="USER_EMAIL_ADDRESS" />.</translation> @@ -838,7 +838,7 @@ <translation id="4543131175509360848">Aucune feuille de clés d'accès</translation> <translation id="4547551584605870320">{TAB_COUNT,plural, =1{<ph name="TAB_COUNT_ONE" /> onglet}one{<ph name="TAB_COUNT_MANY" /> onglet, <ph name="TAB_COUNT_INCOGNITO" /> en navigation privée}other{<ph name="TAB_COUNT_MANY" /> onglets, <ph name="TAB_COUNT_INCOGNITO" /> en navigation privée}}</translation> <translation id="4558311620361989323">Raccourcis de pages Web</translation> -<translation id="4572422548854449519">Se connecter à un compte géré</translation> +<translation id="4572422548854449519">Connexion à un compte géré</translation> <translation id="4577115723294378384">Trier de A à Z</translation> <translation id="4578289292431526768">C'est parti</translation> <translation id="4583164079174244168">{MINUTES,plural, =1{Il y a # minute}one{Il y a # minute}other{Il y a # minutes}}</translation> @@ -1088,9 +1088,9 @@ <translation id="5596627076506792578">Plus d'options</translation> <translation id="5599455543593328020">Mode Navigation privée</translation> <translation id="5601180634394228718">Pour voir d'autres paramètres qui utilisent les données pour améliorer votre expérience Chrome, accédez aux <ph name="BEGIN_LINK" />services Google<ph name="END_LINK" />.</translation> -<translation id="5601924940067278327">Accédez à vos onglets et plus sur tous vos appareils</translation> +<translation id="5601924940067278327">Accédez à vos onglets et plus encore sur tous vos appareils</translation> <translation id="5611398002774823980">Enregistrer dans le compte</translation> -<translation id="5613381935190035031">Pour accéder à vos onglets et plus sur tous vos appareils, connectez-vous à Chrome en tant que <ph name="EMAIL" /></translation> +<translation id="5613381935190035031">Pour accéder à vos onglets et bien plus sur tous vos appareils, connectez-vous à Chrome en tant que <ph name="EMAIL" /></translation> <translation id="5614625640221885312">Connectez-vous pour accéder à vos favoris, mots de passe et bien plus sur tous vos appareils</translation> <translation id="5619633276517849615">Votre organisation a activé la navigation sécurisée</translation> <translation id="5620163320393916465">Aucun mot de passe enregistré</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 d85a9f2..f63e6b6 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
@@ -1392,7 +1392,7 @@ <translation id="6738867403308150051">ダウンロードしています…</translation> <translation id="6745063744988317486">Mono</translation> <translation id="6746338529702829275">アカウントのデータを確認します</translation> -<translation id="6746834324024491643">すべてのデバイスで同じパスワードやその他の設定を利用するには、<ph name="EMAIL" /> としてログインしてください</translation> +<translation id="6746834324024491643">すべてのデバイスでパスワードやその他の設定を使用するには、<ph name="EMAIL" /> としてログインしてください</translation> <translation id="6751521182688001123">新しいタブをすばやく開きます。このショートカットを編集するには、長押ししてください。</translation> <translation id="6752130751133944215">新しいウィンドウを復元するには、アクティブなウィンドウとアクティブでないウィンドウの合計数を <ph name="MAX_WINDOW_COUNT_MINUS_ONE" /> 個以下に減らしてください。アクティブでないウィンドウは 6 か月後に削除されます。</translation> <translation id="6754359471209693699">新しい検索を開始</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 4745372e..f7e2312 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
@@ -560,7 +560,7 @@ <translation id="3384347053049321195">Afbeelding delen</translation> <translation id="3387650086002190359">Downloaden van <ph name="FILE_NAME" /> is mislukt door fouten in het bestandssysteem.</translation> <translation id="3414952576877147120">Grootte:</translation> -<translation id="3417835166382867856">Tabbladen doorzoeken</translation> +<translation id="3417835166382867856">Tabbladen zoeken</translation> <translation id="3430670036890315772">Als je de profielvergrendeling uitzet, worden je opgeslagen gegevens verwijderd</translation> <translation id="3435465986463792564">Heb je veel vensters open? Beheer ze hier.</translation> <translation id="3435575784518354875">Als je toegang wilt houden tot je wachtwoorden, exporteer je ze nu, update je Google Play-services en importeer je ze terug naar Google Wachtwoordmanager. <ph name="BEGIN_LINK" />Bekijk de volledige instructies<ph name="END_LINK" />.</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 661ecd4..da8db5a 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
@@ -1392,7 +1392,7 @@ <translation id="6738867403308150051">Скачивание…</translation> <translation id="6745063744988317486">Mono</translation> <translation id="6746338529702829275">Проверьте данные аккаунта</translation> -<translation id="6746834324024491643">Чтобы синхронизировать пароли и другие данные на всех устройствах, войдите в аккаунт <ph name="EMAIL" /></translation> +<translation id="6746834324024491643">Чтобы синхронизировать пароли и другие данные на всех устройствах, войдите в аккаунт <ph name="EMAIL" />.</translation> <translation id="6751521182688001123">Открыть новую вкладку. Чтобы изменить функцию кнопки, нажмите и удерживайте ее.</translation> <translation id="6752130751133944215">Чтобы восстановить новое окно, убедитесь, что число активных и неактивных не превышает <ph name="MAX_WINDOW_COUNT_MINUS_ONE" />. Неактивные окна удаляются через шесть месяцев.</translation> <translation id="6754359471209693699">Начать новый поиск</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 3fe3329..c73ae88 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
@@ -273,7 +273,7 @@ <translation id="2172905120685242547">Pencere kapatılsın mı?</translation> <translation id="2173302385160625112">İnternet bağlantınızı kontrol edin</translation> <translation id="2175927920773552910">QR Kodu</translation> -<translation id="2184272387334793084">Yer işaretlerinize, şifrelerinize ve daha fazlasına tüm cihazlarınızdan ulaşmak için oturum açın.</translation> +<translation id="2184272387334793084">Yer işaretlerinize, şifrelerinize ve daha fazlasına tüm cihazlarınızdan ulaşmak için oturum açın</translation> <translation id="218608176142494674">Paylaşım</translation> <translation id="2186779861549045980">Google Hesabınıza kaydedilecek verileri seçebilirsiniz.\nAyrıca, bu öğeleri yer işaretleriniz, Okuma Listeniz veya şifre yöneticinizde görüntüleyip yönetebilirsiniz.</translation> <translation id="219283042927675668">Gruptaki sekmeler</translation> @@ -2042,7 +2042,7 @@ <translation id="9212845824145208577">Daha aşağı inilemiyor. Sayfanın daha aşağısından başlamayı deneyin.</translation> <translation id="9218430445555521422">Varsayılan olarak ayarla</translation> <translation id="9219103736887031265">Resimler</translation> -<translation id="9222198206152536936">Yer işaretlerinizi ve diğer öğelerinizi tüm cihazlarınızda kullanmak için <ph name="EMAIL" /> olarak oturum açın.</translation> +<translation id="9222198206152536936">Yer işaretlerinizi ve diğer öğelerinizi tüm cihazlarınızda kullanmak için <ph name="EMAIL" /> olarak oturum açın</translation> <translation id="924447568950697217">Chrome'u varsayılan tarayıcınız yapma</translation> <translation id="926205370408745186">Chrome etkinliğinizi Dijital Denge'den kaldırma</translation> <translation id="927968626442779827">Google Chrome'da Basit modu kullanın</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb index d717a11..0dc5e14a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -25,7 +25,7 @@ <translation id="1094555143448724771">如需查看您在其他设备中打开的标签页,请同步您的标签页和历史记录</translation> <translation id="1095761715416917775">确保您可以随时访问自己的同步数据</translation> <translation id="1096091316906284742">Chrome 查找功能选择启用底部动作条</translation> -<translation id="1100066534610197918">在群组内的新标签页中打开</translation> +<translation id="1100066534610197918">在分组内的新标签页中打开</translation> <translation id="1103142993930332957">帮助改进 Chrome?</translation> <translation id="1105960400813249514">屏幕截图</translation> <translation id="1108214977745280468">查看网页数据洞见</translation> @@ -81,7 +81,7 @@ <translation id="129553762522093515">最近关闭的标签页</translation> <translation id="1298077576058087471">节省高达 60% 的数据流量,阅读今日新闻</translation> <translation id="1303507811548703290"><ph name="DOMAIN" /> - 发送者:<ph name="DEVICE_NAME" /></translation> -<translation id="1310482092992808703">组合标签页</translation> +<translation id="1310482092992808703">将标签页分组</translation> <translation id="1318262688555255786">分享指向“<ph name="PAGE_TITLE" />”网页的链接。来源:<ph name="PAGE_URL" /></translation> <translation id="1320912611264252795">书签保存流程文件夹已全屏打开</translation> <translation id="1327257854815634930">导航历史记录已打开</translation>
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuItemProperties.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuItemProperties.java index a083b5b2..763fa77 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuItemProperties.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuItemProperties.java
@@ -44,6 +44,15 @@ public static final WritableObjectPropertyKey<String> SITE_ACCESS_TOGGLE_TOOLTIP = new WritableObjectPropertyKey<>(); + public static final WritableIntPropertyKey SITE_PERMISSIONS_BUTTON_STATUS = + new WritableIntPropertyKey(); + + public static final WritableObjectPropertyKey<String> SITE_PERMISSIONS_BUTTON_TEXT = + new WritableObjectPropertyKey<>(); + + public static final WritableObjectPropertyKey<String> SITE_PERMISSIONS_BUTTON_ACCESSIBLE_NAME = + new WritableObjectPropertyKey<>(); + public static final PropertyKey[] ALL_KEYS = new PropertyKey[] { EXTENSION_ID, @@ -54,6 +63,9 @@ SITE_ACCESS_TOGGLE_CHECKED, SITE_ACCESS_TOGGLE_ON_CLICK, SITE_ACCESS_TOGGLE_STATUS, - SITE_ACCESS_TOGGLE_TOOLTIP + SITE_ACCESS_TOGGLE_TOOLTIP, + SITE_PERMISSIONS_BUTTON_ACCESSIBLE_NAME, + SITE_PERMISSIONS_BUTTON_STATUS, + SITE_PERMISSIONS_BUTTON_TEXT }; }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuItemViewBinder.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuItemViewBinder.java index d2ef78d..63ad4fcc 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuItemViewBinder.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuItemViewBinder.java
@@ -65,9 +65,28 @@ getMenuItemToggle(view) .setTooltipText( model.get(ExtensionsMenuItemProperties.SITE_ACCESS_TOGGLE_TOOLTIP)); + } else if (key == ExtensionsMenuItemProperties.SITE_PERMISSIONS_BUTTON_ACCESSIBLE_NAME) { + getMenuItemSitePermissionsButton(view) + .setContentDescription( + model.get( + ExtensionsMenuItemProperties + .SITE_PERMISSIONS_BUTTON_ACCESSIBLE_NAME)); + } else if (key == ExtensionsMenuItemProperties.SITE_PERMISSIONS_BUTTON_STATUS) { + @Status + int status = model.get(ExtensionsMenuItemProperties.SITE_PERMISSIONS_BUTTON_STATUS); + TextView button = getMenuItemSitePermissionsButton(view); + button.setVisibility(status == Status.HIDDEN ? View.GONE : View.VISIBLE); + button.setEnabled(status == Status.ENABLED); + } else if (key == ExtensionsMenuItemProperties.SITE_PERMISSIONS_BUTTON_TEXT) { + getMenuItemSitePermissionsButton(view) + .setText(model.get(ExtensionsMenuItemProperties.SITE_PERMISSIONS_BUTTON_TEXT)); } } + private static TextView getMenuItemSitePermissionsButton(View view) { + return view.findViewById(R.id.extensions_menu_item_site_permissions_button); + } + private static MaterialSwitchWithText getMenuItemToggle(View view) { return view.findViewById(R.id.extensions_menu_item_toggle); }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuMediator.java index d45dede7..cc67d53 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuMediator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuMediator.java
@@ -267,6 +267,15 @@ itemModel.set( ExtensionsMenuItemProperties.SITE_ACCESS_TOGGLE_TOOLTIP, itemState.siteAccessToggle.tooltipText); + itemModel.set( + ExtensionsMenuItemProperties.SITE_PERMISSIONS_BUTTON_ACCESSIBLE_NAME, + itemState.sitePermissionsButton.accessibleName); + itemModel.set( + ExtensionsMenuItemProperties.SITE_PERMISSIONS_BUTTON_STATUS, + itemState.sitePermissionsButton.status); + itemModel.set( + ExtensionsMenuItemProperties.SITE_PERMISSIONS_BUTTON_TEXT, + itemState.sitePermissionsButton.text); } /**
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuMediatorTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuMediatorTest.java index e55c523..af189583 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuMediatorTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuMediatorTest.java
@@ -632,9 +632,25 @@ /* tooltipText= */ "", /* isOn= */ true, /* icon= */ null); + // Initialize the site permissions button with a random state. We won't update this state, + // even though it should also be affected when site access toggle changes, as + // this test focuses on the site access toggle. + ExtensionsMenuTypes.ControlState sitePermissionsButtonState = + new ExtensionsMenuTypes.ControlState( + ExtensionsMenuTypes.ControlState.Status.HIDDEN, + /* text= */ "", + /* accessibleName= */ "", + /* tooltipText= */ "", + /* isOn= */ false, + /* icon= */ null); entries.add( ExtensionTestUtils.createMenuEntry( - "id_a", "Extension A", ICON_RED, /* isPinned= */ false, toggleState)); + "id_a", + "Extension A", + ICON_RED, + /* isPinned= */ false, + toggleState, + sitePermissionsButtonState)); when(mExtensionsMenuBridgeJniMock.getMenuEntries(anyLong())).thenReturn(entries); // Open extensions menu by simulating the native callback triggering onReady. @@ -659,7 +675,12 @@ /* icon= */ null); ExtensionsMenuTypes.MenuEntryState updatedEntry = ExtensionTestUtils.createMenuEntry( - "id_a", "Extension A", ICON_RED, /* isPinned= */ false, toggleState); + "id_a", + "Extension A", + ICON_RED, + /* isPinned= */ false, + toggleState, + sitePermissionsButtonState); when(mExtensionsMenuBridgeJniMock.getMenuEntry(anyLong(), eq(0))).thenReturn(updatedEntry); mBridgeCaptor.getValue().onActionUpdated(0); @@ -683,7 +704,12 @@ /* icon= */ null); updatedEntry = ExtensionTestUtils.createMenuEntry( - "id_a", "Extension A", ICON_RED, /* isPinned= */ false, toggleState); + "id_a", + "Extension A", + ICON_RED, + /* isPinned= */ false, + toggleState, + sitePermissionsButtonState); when(mExtensionsMenuBridgeJniMock.getMenuEntry(anyLong(), eq(0))).thenReturn(updatedEntry); mBridgeCaptor.getValue().onActionUpdated(0); @@ -710,9 +736,22 @@ /* tooltipText= */ "", /* isOn= */ false, /* icon= */ null); + ExtensionsMenuTypes.ControlState sitePermissionsButtonState = + new ExtensionsMenuTypes.ControlState( + ExtensionsMenuTypes.ControlState.Status.HIDDEN, + /* text= */ "", + /* accessibleName= */ "", + /* tooltipText= */ "", + /* isOn= */ false, + /* icon= */ null); entries.add( ExtensionTestUtils.createMenuEntry( - "id_a", "Extension A", ICON_RED, /* isPinned= */ false, toggleState)); + "id_a", + "Extension A", + ICON_RED, + /* isPinned= */ false, + toggleState, + sitePermissionsButtonState)); when(mExtensionsMenuBridgeJniMock.getMenuEntries(anyLong())).thenReturn(entries); // Open extensions menu by simulating the native callback triggering onReady. @@ -732,6 +771,114 @@ .onExtensionToggleSelected(EXTENSIONS_MENU_BRIDGE_POINTER, "id_a", true); } + /** Tests that the menu item's site permission button properties are correctly updated. */ + @Test + public void testMenuItemSitePermissionsButton() { + // Initialize an action with hidden site permissions button. + List<ExtensionsMenuTypes.MenuEntryState> entries = new ArrayList<>(); + ExtensionsMenuTypes.ControlState sitePermissionsButtonState = + new ExtensionsMenuTypes.ControlState( + ExtensionsMenuTypes.ControlState.Status.HIDDEN, + /* text= */ "No access needed", + /* accessibleName= */ "No access needed", + /* tooltipText= */ "", + /* isOn= */ false, + /* icon= */ null); + // Initialize the site access toggle with a random state. We won't update this state, + // even though it should also be affected when site permission button changes, as + // this test focuses on the site permissions button.. + ExtensionsMenuTypes.ControlState toggleState = + new ExtensionsMenuTypes.ControlState( + ExtensionsMenuTypes.ControlState.Status.HIDDEN, + /* text= */ "", + /* accessibleName= */ "", + /* tooltipText= */ "", + /* isOn= */ true, + /* icon= */ null); + entries.add( + ExtensionTestUtils.createMenuEntry( + "id_a", + "Extension A", + ICON_RED, + /* isPinned= */ false, + toggleState, + sitePermissionsButtonState)); + when(mExtensionsMenuBridgeJniMock.getMenuEntries(anyLong())).thenReturn(entries); + + // Open extensions menu. + mBridgeCaptor.getValue().onReady(); + + // Verify site permissions button is hidden for the menu item. + PropertyModel model = mActionModels.get(0).model; + assertEquals( + ExtensionsMenuTypes.ControlState.Status.HIDDEN, + model.get(ExtensionsMenuItemProperties.SITE_PERMISSIONS_BUTTON_STATUS)); + + // Update the menu item to have a visible site permissions button, with disabled state. + sitePermissionsButtonState = + new ExtensionsMenuTypes.ControlState( + ExtensionsMenuTypes.ControlState.Status.DISABLED, + /* text= */ "Always on all sites", + /* accessibleName= */ "Always on all sites. Select to change site" + + " permissions", + /* tooltipText= */ "Change site permissions", + /* isOn= */ false, + /* icon= */ null); + ExtensionsMenuTypes.MenuEntryState updatedEntry = + ExtensionTestUtils.createMenuEntry( + "id_a", + "Extension A", + ICON_RED, + /* isPinned= */ false, + toggleState, + sitePermissionsButtonState); + when(mExtensionsMenuBridgeJniMock.getMenuEntry(anyLong(), eq(0))).thenReturn(updatedEntry); + mBridgeCaptor.getValue().onActionUpdated(0); + + // Verify button is disabled and has correct text and accessible name. + assertEquals( + ExtensionsMenuTypes.ControlState.Status.DISABLED, + model.get(ExtensionsMenuItemProperties.SITE_PERMISSIONS_BUTTON_STATUS)); + assertEquals( + "Always on all sites", + model.get(ExtensionsMenuItemProperties.SITE_PERMISSIONS_BUTTON_TEXT)); + assertEquals( + "Always on all sites. Select to change site permissions", + model.get(ExtensionsMenuItemProperties.SITE_PERMISSIONS_BUTTON_ACCESSIBLE_NAME)); + + // Update the item to have an enabled site permissions button. + sitePermissionsButtonState = + new ExtensionsMenuTypes.ControlState( + ExtensionsMenuTypes.ControlState.Status.ENABLED, + /* text= */ "Ask on every visit", + /* accessibleName= */ "Ask on every visit. Select to change site" + + " permissions", + /* tooltipText= */ "Change site permissions", + /* isOn= */ false, + /* icon= */ null); + updatedEntry = + ExtensionTestUtils.createMenuEntry( + "id_a", + "Extension A", + ICON_RED, + /* isPinned= */ false, + toggleState, + sitePermissionsButtonState); + when(mExtensionsMenuBridgeJniMock.getMenuEntry(anyLong(), eq(0))).thenReturn(updatedEntry); + mBridgeCaptor.getValue().onActionUpdated(0); + + // Verify button is enabled and has updated text and accessible name. + assertEquals( + ExtensionsMenuTypes.ControlState.Status.ENABLED, + model.get(ExtensionsMenuItemProperties.SITE_PERMISSIONS_BUTTON_STATUS)); + assertEquals( + "Ask on every visit", + model.get(ExtensionsMenuItemProperties.SITE_PERMISSIONS_BUTTON_TEXT)); + assertEquals( + "Ask on every visit. Select to change site permissions", + model.get(ExtensionsMenuItemProperties.SITE_PERMISSIONS_BUTTON_ACCESSIBLE_NAME)); + } + /** Helper to assert that the item at the given index has the correct information. */ private void assertItemAt(int index, String title, @Nullable Bitmap icon, int contextMenuIcon) { ListItem item = mActionModels.get(index);
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java index bfb01cad..313c2ce 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java
@@ -197,7 +197,7 @@ @Override public CaptureReadinessResult isReadyForTextureCapture() { - if (urlHasFocus()) { + if (urlHasFocus() || mLocationBar.isUrlBarFocusedWithoutAnimation()) { return CaptureReadinessResult.notReady(TopToolbarBlockCaptureReason.URL_BAR_HAS_FOCUS); } else if (mIsInTabSwitcherMode) { return CaptureReadinessResult.notReady(TopToolbarBlockCaptureReason.TAB_SWITCHER_MODE);
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTabletUnitTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTabletUnitTest.java index 3a04013..5d48768 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTabletUnitTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTabletUnitTest.java
@@ -612,6 +612,12 @@ CaptureReadinessResult result = mToolbarTablet.isReadyForTextureCapture(); Assert.assertFalse(result.isReady); Assert.assertEquals(TopToolbarBlockCaptureReason.URL_BAR_HAS_FOCUS, result.blockReason); + mToolbarTablet.onUrlFocusChange(/* hasFocus= */ false); + + doReturn(true).when(mLocationBar).isUrlBarFocusedWithoutAnimation(); + result = mToolbarTablet.isReadyForTextureCapture(); + Assert.assertFalse(result.isReady); + Assert.assertEquals(TopToolbarBlockCaptureReason.URL_BAR_HAS_FOCUS, result.blockReason); } @Test
diff --git a/chrome/browser/ui/ash/birch/birch_keyed_service_unittest.cc b/chrome/browser/ui/ash/birch/birch_keyed_service_unittest.cc index 7115e282..274e3b1 100644 --- a/chrome/browser/ui/ash/birch/birch_keyed_service_unittest.cc +++ b/chrome/browser/ui/ash/birch/birch_keyed_service_unittest.cc
@@ -58,6 +58,7 @@ #include "components/sync/test/test_sync_service.h" #include "components/sync_device_info/device_info_util.h" #include "components/sync_preferences/testing_pref_service_syncable.h" +#include "components/sync_sessions/mock_open_tabs_ui_delegate.h" #include "components/sync_sessions/mock_session_sync_service.h" #include "components/sync_sessions/open_tabs_ui_delegate.h" #include "components/sync_sessions/session_sync_service.h" @@ -135,7 +136,7 @@ base::RepeatingClosureList subscriber_list_; }; -class MockOpenTabsUIDelegate : public sync_sessions::OpenTabsUIDelegate { +class MockOpenTabsUIDelegate : public sync_sessions::MockOpenTabsUIDelegate { public: MockOpenTabsUIDelegate() { foreign_sessions_owned_.push_back(CreateNewSession( @@ -192,20 +193,6 @@ return base::flat_map<std::string, base::Time>(std::move(timestamps)); } - MOCK_METHOD1(GetLocalSession, - bool(const sync_sessions::SyncedSession** local_session)); - - MOCK_METHOD3(GetForeignTab, - bool(const std::string& tag, - const SessionID tab_id, - const sessions::SessionTab** tab)); - - MOCK_METHOD1(DeleteForeignSession, void(const std::string& tag)); - - MOCK_METHOD1( - GetForeignSession, - std::vector<const sessions::SessionWindow*>(const std::string& tag)); - bool GetForeignSessionTabs( const std::string& tag, std::vector<const sessions::SessionTab*>* tabs) override {
diff --git a/chrome/browser/ui/autofill/BUILD.gn b/chrome/browser/ui/autofill/BUILD.gn index 219bbdb..57f921935 100644 --- a/chrome/browser/ui/autofill/BUILD.gn +++ b/chrome/browser/ui/autofill/BUILD.gn
@@ -499,6 +499,8 @@ sources = [ "autofill_suggestion_controller_test_base.cc", "autofill_suggestion_controller_test_base.h", + "mock_accessibility_query_service.cc", + "mock_accessibility_query_service.h", "mock_autofill_popup_view.cc", "mock_autofill_popup_view.h", ]
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc index 465831b..d21affe 100644 --- a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc +++ b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc
@@ -14,6 +14,7 @@ #include "base/check_deref.h" #include "base/check_op.h" #include "base/command_line.h" +#include "base/containers/to_vector.h" #include "base/feature_list.h" #include "base/functional/bind.h" #include "base/i18n/case_conversion.h" @@ -913,28 +914,51 @@ void AutofillPopupControllerImpl::SetFilter( std::optional<SuggestionFilter> filter) { - if (suggestions_filling_product_ == FillingProduct::kAtMemory && filter && - std::holds_alternative<AutofillPopupController::StringFilter>(*filter)) { - if (ContentAutofillClient* client = - ContentAutofillClient::FromWebContents(web_contents_.get())) { - if (accessibility_annotator::AccessibilityQueryService* query_service = - client->GetAccessibilityQueryService()) { - std::vector<Suggestion> suggestions; - for (const accessibility_annotator::MemorySearchResult& result : - query_service->Query( - *std::get<AutofillPopupController::StringFilter>(*filter))) { - Suggestion& s = suggestions.emplace_back( - result.value, SuggestionType::kAtMemorySearchResult); - s.labels = {{Suggestion::Text(result.description)}}; - s.payload = Suggestion::AtMemoryPayload(result.value); - s.filtration_policy = Suggestion::FiltrationPolicy::kStatic; + filter_ = std::move(filter); + + if (suggestions_filling_product_ == FillingProduct::kAtMemory) { + if (!filter_) { + SetSuggestions({}); + OnSuggestionsChanged(/*prefer_prev_arrow_side=*/true); + return; + } + + if (const auto* string_filter = + std::get_if<AutofillPopupController::StringFilter>(&*filter_)) { + if (ContentAutofillClient* client = + ContentAutofillClient::FromWebContents(GetWebContents())) { + if (auto* query_service = client->GetAccessibilityQueryService()) { + query_service->Query( + **string_filter, + base::BindRepeating( + [](base::WeakPtr<AutofillPopupControllerImpl> self, + std::vector<accessibility_annotator::MemorySearchResult> + results) { + if (!self) { + return; + } + self->SetSuggestions(base::ToVector( + results, + [](const accessibility_annotator::MemorySearchResult& + result) { + Suggestion s(result.value, + SuggestionType::kAtMemorySearchResult); + s.labels = {{Suggestion::Text(result.description)}}; + s.payload = Suggestion::AtMemoryPayload(result.value); + s.filtration_policy = + Suggestion::FiltrationPolicy::kStatic; + return s; + })); + self->OnSuggestionsChanged( + /*prefer_prev_arrow_side=*/true); + }, + weak_ptr_factory_.GetWeakPtr())); } - SetSuggestions(std::move(suggestions)); } } + return; } - filter_ = std::move(filter); UpdateFilteredSuggestions(); OnSuggestionsChanged(/*prefer_prev_arrow_side=*/true); }
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller_impl_unittest.cc b/chrome/browser/ui/autofill/autofill_popup_controller_impl_unittest.cc index 916cee3..188fc7c 100644 --- a/chrome/browser/ui/autofill/autofill_popup_controller_impl_unittest.cc +++ b/chrome/browser/ui/autofill/autofill_popup_controller_impl_unittest.cc
@@ -6,6 +6,7 @@ #include <optional> +#include "base/test/gmock_callback_support.h" #include "base/test/metrics/user_action_tester.h" #include "build/build_config.h" #include "chrome/browser/ui/autofill/autofill_popup_controller.h" @@ -563,6 +564,9 @@ EXPECT_EQ(controller.GetMainFillingProduct(), FillingProduct::kAtMemory); + EXPECT_CALL(*client().accessibility_query_service(), Query) + .WillOnce(base::test::RunOnceCallback<1>( + std::vector<accessibility_annotator::MemorySearchResult>{})); controller.SetFilter(AutofillPopupController::StringFilter(u"nono")); EXPECT_EQ(controller.GetSuggestions().size(), 0u); } @@ -758,6 +762,16 @@ suggestion.filtration_policy = Suggestion::FiltrationPolicy::kStatic; ShowSuggestions(manager(), {suggestion}, AutofillSuggestionTriggerSource::kAtMemory); + + accessibility_annotator::MemorySearchResult result; + result.value = u"result"; + result.title = u"result"; + result.description = u"description"; + + EXPECT_CALL(*client().accessibility_query_service(), Query) + .WillOnce(base::test::RunOnceCallback<1>( + std::vector<accessibility_annotator::MemorySearchResult>{result})); + client().suggestion_controller(manager()).SetFilter( AutofillPopupController::StringFilter(u"res")); EXPECT_FALSE(client().suggestion_controller(manager()) @@ -767,6 +781,11 @@ TEST_F(AutofillPopupControllerImplTest, AtMemory_FilterWithNoResults_ShowMessage) { ShowSuggestions(manager(), std::vector<SuggestionType>{}, AutofillSuggestionTriggerSource::kAtMemory); + + EXPECT_CALL(*client().accessibility_query_service(), Query) + .WillOnce(base::test::RunOnceCallback<1>( + std::vector<accessibility_annotator::MemorySearchResult>{})); + client().suggestion_controller(manager()).SetFilter( AutofillPopupController::StringFilter(u"abc")); // In the mock/test environment, we ensure GetSuggestions() is empty.
diff --git a/chrome/browser/ui/autofill/mock_accessibility_query_service.cc b/chrome/browser/ui/autofill/mock_accessibility_query_service.cc new file mode 100644 index 0000000..5db1baf --- /dev/null +++ b/chrome/browser/ui/autofill/mock_accessibility_query_service.cc
@@ -0,0 +1,17 @@ +// Copyright 2026 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/autofill/mock_accessibility_query_service.h" + +#include "components/accessibility_annotator/core/annotation_reducer/autofill_data_provider.h" + +namespace autofill { + +MockAccessibilityQueryService::MockAccessibilityQueryService() + : accessibility_annotator::AccessibilityQueryService( + /*data_provider=*/nullptr) {} + +MockAccessibilityQueryService::~MockAccessibilityQueryService() = default; + +} // namespace autofill
diff --git a/chrome/browser/ui/autofill/mock_accessibility_query_service.h b/chrome/browser/ui/autofill/mock_accessibility_query_service.h new file mode 100644 index 0000000..9152b42 --- /dev/null +++ b/chrome/browser/ui/autofill/mock_accessibility_query_service.h
@@ -0,0 +1,33 @@ +// Copyright 2026 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_AUTOFILL_MOCK_ACCESSIBILITY_QUERY_SERVICE_H_ +#define CHROME_BROWSER_UI_AUTOFILL_MOCK_ACCESSIBILITY_QUERY_SERVICE_H_ + +#include <vector> + +#include "components/accessibility_annotator/core/accessibility_query_service.h" +#include "components/accessibility_annotator/core/annotation_reducer/memory_search_result.h" +#include "testing/gmock/include/gmock/gmock.h" + +namespace autofill { + +class MockAccessibilityQueryService + : public accessibility_annotator::AccessibilityQueryService { + public: + MockAccessibilityQueryService(); + ~MockAccessibilityQueryService() override; + + MOCK_METHOD(void, + Query, + (std::u16string_view query, + base::RepeatingCallback<void( + std::vector<accessibility_annotator::MemorySearchResult>)> + update_callback), + (override)); +}; + +} // namespace autofill + +#endif // CHROME_BROWSER_UI_AUTOFILL_MOCK_ACCESSIBILITY_QUERY_SERVICE_H_
diff --git a/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.cc b/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.cc index 52fa6e8..e0f64532 100644 --- a/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.cc +++ b/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.cc
@@ -14,7 +14,6 @@ #include "base/notimplemented.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/autofill/autofill_offer_manager_factory.h" -#include "chrome/browser/autofill/iban_manager_factory.h" #include "chrome/browser/autofill/merchant_promo_code_manager_factory.h" #include "chrome/browser/feature_engagement/tracker_factory.h" #include "chrome/browser/profiles/profile.h" @@ -852,9 +851,11 @@ } IbanManager* ChromePaymentsAutofillClient::GetIbanManager() { - Profile* profile = - Profile::FromBrowserContext(web_contents()->GetBrowserContext()); - return IbanManagerFactory::GetForProfile(profile); + if (!iban_manager_) { + iban_manager_ = std::make_unique<IbanManager>( + &client_->GetPersonalDataManager().payments_data_manager()); + } + return iban_manager_.get(); } IbanAccessManager* ChromePaymentsAutofillClient::GetIbanAccessManager() {
diff --git a/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.h b/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.h index 3c3493e8..db25272 100644 --- a/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.h +++ b/chrome/browser/ui/autofill/payments/chrome_payments_autofill_client.h
@@ -14,6 +14,7 @@ #include "base/memory/raw_ref.h" #include "components/autofill/core/browser/data_model/payments/credit_card.h" #include "components/autofill/core/browser/payments/autofill_error_dialog_context.h" +#include "components/autofill/core/browser/payments/iban_manager.h" #include "components/autofill/core/browser/payments/payments_autofill_client.h" #include "components/autofill/core/browser/suggestions/suggestion.h" #include "components/autofill/core/browser/ui/payments/autofill_error_dialog_controller_impl.h" @@ -59,7 +60,6 @@ class CreditCardRiskBasedAuthenticator; struct FilledCardInformationBubbleOptions; class IbanAccessManager; -class IbanManager; class MerchantPromoCodeManager; struct OfferNotificationOptions; class OtpUnmaskDelegate; @@ -364,6 +364,7 @@ std::unique_ptr<CardUnmaskAuthenticationSelectionDialogControllerImpl> card_unmask_authentication_selection_controller_; + std::unique_ptr<IbanManager> iban_manager_; std::unique_ptr<IbanAccessManager> iban_access_manager_; std::unique_ptr<payments::MandatoryReauthManager>
diff --git a/chrome/browser/ui/autofill/test_autofill_popup_controller_autofill_client.h b/chrome/browser/ui/autofill/test_autofill_popup_controller_autofill_client.h index 92d14a9..4d24d90 100644 --- a/chrome/browser/ui/autofill/test_autofill_popup_controller_autofill_client.h +++ b/chrome/browser/ui/autofill/test_autofill_popup_controller_autofill_client.h
@@ -12,7 +12,9 @@ #include "chrome/browser/ui/autofill/autofill_popup_controller_impl_test_api.h" #include "chrome/browser/ui/autofill/autofill_suggestion_controller.h" #include "chrome/browser/ui/autofill/autofill_suggestion_controller_test_base.h" +#include "chrome/browser/ui/autofill/mock_accessibility_query_service.h" #include "chrome/browser/ui/autofill/mock_autofill_popup_view.h" +#include "components/accessibility_annotator/core/accessibility_query_service.h" #include "components/autofill/content/browser/test_content_autofill_client.h" #include "components/autofill/core/browser/foundations/autofill_manager.h" #include "testing/gmock/include/gmock/gmock.h" @@ -29,8 +31,13 @@ explicit TestAutofillPopupControllerAutofillClient( content::WebContents* web_contents) : TestContentAutofillClient(web_contents) { - ON_CALL(*popup_view(), CreateSubPopupView) - .WillByDefault(::testing::Return(sub_popup_view()->GetWeakPtr())); + ON_CALL(popup_view_, CreateSubPopupView) + .WillByDefault(::testing::Return(sub_popup_view_.GetWeakPtr())); + + auto mock_service = + std::make_unique<::testing::NiceMock<MockAccessibilityQueryService>>(); + mock_accessibility_query_service_ = mock_service.get(); + set_accessibility_query_service(std::move(mock_service)); } ~TestAutofillPopupControllerAutofillClient() override { DoHide(); } @@ -50,7 +57,7 @@ (new Controller(manager.external_delegate().GetWeakPtrForTest(), &GetWebContents(), gfx::RectF())) ->GetWeakPtr(); - test_api(cast_suggestion_controller()).SetView(popup_view_->GetWeakPtr()); + test_api(cast_suggestion_controller()).SetView(popup_view_.GetWeakPtr()); manager_of_last_controller_ = manager.GetWeakPtr(); ON_CALL(cast_suggestion_controller(), Hide) .WillByDefault( @@ -59,9 +66,13 @@ return cast_suggestion_controller(); } - MockAutofillPopupView* popup_view() { return popup_view_.get(); } + MockAutofillPopupView* popup_view() { return &popup_view_; } - MockAutofillPopupView* sub_popup_view() { return sub_popup_view_.get(); } + MockAutofillPopupView* sub_popup_view() { return &sub_popup_view_; } + + MockAccessibilityQueryService* accessibility_query_service() { + return mock_accessibility_query_service_; + } private: void DoHide(SuggestionHidingReason reason) { @@ -83,10 +94,10 @@ base::WeakPtr<AutofillSuggestionController> suggestion_controller_; base::WeakPtr<AutofillManager> manager_of_last_controller_; - std::unique_ptr<MockAutofillPopupView> popup_view_ = - std::make_unique<::testing::NiceMock<MockAutofillPopupView>>(); - std::unique_ptr<MockAutofillPopupView> sub_popup_view_ = - std::make_unique<::testing::NiceMock<MockAutofillPopupView>>(); + ::testing::NiceMock<MockAutofillPopupView> popup_view_; + ::testing::NiceMock<MockAutofillPopupView> sub_popup_view_; + raw_ptr<MockAccessibilityQueryService> mock_accessibility_query_service_ = + nullptr; }; } // namespace autofill
diff --git a/chrome/browser/ui/bookmarks/bookmark_editor.cc b/chrome/browser/ui/bookmarks/bookmark_editor.cc index 17ff1573..bb0cb1d 100644 --- a/chrome/browser/ui/bookmarks/bookmark_editor.cc +++ b/chrome/browser/ui/bookmarks/bookmark_editor.cc
@@ -202,7 +202,7 @@ raw_ptr<const bookmarks::BookmarkNode, VectorExperimental>>& nodes) { EditDetails details(MOVE); - details.existing_nodes_to_move = base::MakeFlatSet< + details.existing_nodes_to_move = base::flat_set< raw_ptr<const bookmarks::BookmarkNode, VectorExperimental>>(nodes); details.parent_node = GetParentNodeForMove(model, nodes);
diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/AndroidBrowserWindow.java b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/AndroidBrowserWindow.java index 0427d51f..b3ba26f 100644 --- a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/AndroidBrowserWindow.java +++ b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/AndroidBrowserWindow.java
@@ -23,6 +23,7 @@ private final ChromeAndroidTask mChromeAndroidTask; private final Profile mProfile; + private final @BrowserWindowType int mBrowserWindowType; private final AndroidBaseWindow mAndroidBaseWindow; private @Nullable ActivityWindowAndroid mActivityWindowAndroid; @@ -38,9 +39,11 @@ AndroidBrowserWindow( ChromeAndroidTask chromeAndroidTask, Profile profile, + @BrowserWindowType int browserWindowType, @Nullable ActivityWindowAndroid activityWindowAndroid) { mChromeAndroidTask = chromeAndroidTask; mProfile = profile; + mBrowserWindowType = browserWindowType; mAndroidBaseWindow = new AndroidBaseWindow(this); mActivityWindowAndroid = activityWindowAndroid; } @@ -59,8 +62,7 @@ long getOrCreateNativePtr() { if (mNativeAndroidBrowserWindow == 0) { mNativeAndroidBrowserWindow = - AndroidBrowserWindowJni.get() - .create(this, mChromeAndroidTask.getBrowserWindowType(), mProfile); + AndroidBrowserWindowJni.get().create(this, mBrowserWindowType, mProfile); } return mNativeAndroidBrowserWindow; }
diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImpl.java b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImpl.java index 29f71ac5..522c03d 100644 --- a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImpl.java +++ b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImpl.java
@@ -279,8 +279,6 @@ private final PendingActionManager mPendingActionManager = new PendingActionManager(); - private final @BrowserWindowType int mBrowserWindowType; - // TODO(crbug.com/491791515): Consider removing this field and just relying on the // TabModelSelector to determine the profile. private final Profile mInitialProfile; @@ -395,6 +393,9 @@ incognitoProfile, mInternalActivityScopedObjects .mActivityScopedObjects + .mBrowserWindowType, + mInternalActivityScopedObjects + .mActivityScopedObjects .mActivityWindowAndroid); mInternalActivityScopedObjects.addBrowserWindow(browserWindow); long ptr = browserWindow.getOrCreateNativePtr(); @@ -556,9 +557,7 @@ return WindowResizePrecheckResult.OK; } - ChromeAndroidTaskImpl( - @BrowserWindowType int browserWindowType, ActivityScopedObjects activityScopedObjects) { - mBrowserWindowType = browserWindowType; + ChromeAndroidTaskImpl(ActivityScopedObjects activityScopedObjects) { mId = getActivity(activityScopedObjects.mActivityWindowAndroid).getTaskId(); Profile initialProfile = @@ -576,7 +575,6 @@ ChromeAndroidTaskImpl(PendingTaskInfo pendingTaskInfo) { mPendingTaskInfo = pendingTaskInfo; - mBrowserWindowType = pendingTaskInfo.mCreateParams.getWindowType(); mInitialProfile = pendingTaskInfo.mCreateParams.getProfile(); assert mInitialProfile != null : "PendingTaskInfo must be initialized with a non-null profile"; @@ -587,6 +585,7 @@ new AndroidBrowserWindow( /* chromeAndroidTask= */ this, mInitialProfile, + pendingTaskInfo.mCreateParams.getWindowType(), /* activityWindowAndroid= */ null); ProfileManager.addObserver(mProfileObserver); @@ -608,12 +607,6 @@ } @Override - public @BrowserWindowType int getBrowserWindowType() { - ThreadUtils.assertOnUiThread(); - return mBrowserWindowType; - } - - @Override public void addActivityScopedObjects(ActivityScopedObjects activityScopedObjects) { ThreadUtils.assertOnUiThread(); addActivityScopedObjectsInternal(activityScopedObjects); @@ -1388,7 +1381,10 @@ } else { newBrowserWindow = new AndroidBrowserWindow( - /* chromeAndroidTask= */ this, profile, activityWindowAndroid); + /* chromeAndroidTask= */ this, + profile, + activityScopedObjects.mBrowserWindowType, + activityWindowAndroid); } // Associate the new AndroidBrowserWindow with TabModel.
diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImplUnitTest.java b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImplUnitTest.java index 1c4ec2c..6b62347 100644 --- a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImplUnitTest.java +++ b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImplUnitTest.java
@@ -284,7 +284,9 @@ var actualPendingTaskInfo = task.getPendingTaskInfo(); assertNotNull(actualPendingTaskInfo); assertEquals(pendingTaskInfo.mPendingTaskId, actualPendingTaskInfo.mPendingTaskId); - assertEquals(pendingTaskInfo.mCreateParams.getWindowType(), task.getBrowserWindowType()); + assertEquals( + pendingTaskInfo.mCreateParams.getWindowType(), + task.getPendingTaskInfo().mCreateParams.getWindowType()); assertEquals(State.PENDING_CREATE, task.getState()); assertNull(task.getId()); assertTrue(task.getActivityScopedObjectsListForTesting().isEmpty());
diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerImpl.java b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerImpl.java index 9c1c15e..bea79f6ff 100644 --- a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerImpl.java +++ b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerImpl.java
@@ -87,8 +87,6 @@ var existingTask = mTasks.get(taskId); if (existingTask != null) { - assert existingTask.getBrowserWindowType() == browserWindowType - : "The browser window type of an existing task can't be changed."; existingTask.addActivityScopedObjects(activityScopedObjects); return existingTask; } @@ -104,7 +102,7 @@ return pendingTask; } - var newTask = new ChromeAndroidTaskImpl(browserWindowType, activityScopedObjects); + var newTask = new ChromeAndroidTaskImpl(activityScopedObjects); mTasks.put(taskId, newTask); for (var observer : mObservers) { observer.onTaskAdded(newTask);
diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerImplUnitTest.java b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerImplUnitTest.java index fdc0737e..346375c6 100644 --- a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerImplUnitTest.java +++ b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerImplUnitTest.java
@@ -51,6 +51,7 @@ import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; import org.chromium.chrome.browser.lifecycle.TopResumedActivityChangedWithNativeObserver; +import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.ui.browser_window.PendingActionManager.PendingAction; import org.chromium.ui.display.DisplayAndroid; import org.chromium.ui.mojom.WindowShowState; @@ -113,17 +114,17 @@ // Assert. assertNotNull(task); - assertNotNull(task.getPendingTaskInfo()); + var pendingTaskInfo = task.getPendingTaskInfo(); + assertNotNull(pendingTaskInfo); assertNotNull( - mChromeAndroidTaskTracker.getPendingTaskForTesting( - task.getPendingTaskInfo().mPendingTaskId)); + mChromeAndroidTaskTracker.getPendingTaskForTesting(pendingTaskInfo.mPendingTaskId)); assertEquals( // Creating a pending Task of "NORMAL" type requires an existing ChromeAndroidTask. // Therefore, getAllNativeBrowserWindowPtrs().length should be 2: // one pointer is the existing Task and the other is the pending Task. 2, mChromeAndroidTaskTracker.getAllNativeBrowserWindowPtrs().length); assertNull(task.getId()); - assertEquals(mockParams.getWindowType(), task.getBrowserWindowType()); + assertEquals(mockParams.getWindowType(), pendingTaskInfo.mCreateParams.getWindowType()); } @Test @@ -136,17 +137,17 @@ // Assert. assertNotNull(task); - assertNotNull(task.getPendingTaskInfo()); + var pendingTaskInfo = task.getPendingTaskInfo(); + assertNotNull(pendingTaskInfo); assertNotNull( - mChromeAndroidTaskTracker.getPendingTaskForTesting( - task.getPendingTaskInfo().mPendingTaskId)); + mChromeAndroidTaskTracker.getPendingTaskForTesting(pendingTaskInfo.mPendingTaskId)); assertEquals( // Creating a pending Task of "POPUP" type requires an existing ChromeAndroidTask. // Therefore, getAllNativeBrowserWindowPtrs().length should be 2: // one pointer is the existing Task and the other is the pending Task. 2, mChromeAndroidTaskTracker.getAllNativeBrowserWindowPtrs().length); assertNull(task.getId()); - assertEquals(mockParams.getWindowType(), task.getBrowserWindowType()); + assertEquals(mockParams.getWindowType(), pendingTaskInfo.mCreateParams.getWindowType()); var intentCaptor = ArgumentCaptor.forClass(Intent.class); verify(mContext).startActivity(intentCaptor.capture()); @@ -425,28 +426,39 @@ @Test public void - obtainTask_activityScopedObjectsBelongToExistingTask_differentBrowserWindowType_throwsException() { + obtainTask_activityScopedObjectsBelongToExistingTask_differentBrowserWindowType_succeeds() { // Arrange. // (1) Create a new task. int taskId = 1; var activityScopedObjects1 = - ChromeAndroidTaskUnitTestSupport.createMockActivityScopedObjects(taskId); - mChromeAndroidTaskTracker.obtainTask( - BrowserWindowType.NORMAL, activityScopedObjects1, /* pendingId= */ null); + ChromeAndroidTaskUnitTestSupport.createMockActivityScopedObjects( + taskId, mock(Profile.class), BrowserWindowType.NORMAL); + var task = + (ChromeAndroidTaskImpl) + mChromeAndroidTaskTracker.obtainTask( + BrowserWindowType.NORMAL, + activityScopedObjects1, + /* pendingId= */ null); + assertEquals( + BrowserWindowType.NORMAL, + task.getActivityScopedObjectsListForTesting().get(0).mBrowserWindowType); // (2) Create another ActivityScopedObjects that belongs to the same Task. var activityScopedObjects2 = - ChromeAndroidTaskUnitTestSupport.createMockActivityScopedObjects(taskId); + ChromeAndroidTaskUnitTestSupport.createMockActivityScopedObjects( + taskId, mock(Profile.class), BrowserWindowType.POPUP); - // Act & Assert. + // Act. + var task2 = + mChromeAndroidTaskTracker.obtainTask( + BrowserWindowType.POPUP, activityScopedObjects2, /* pendingId= */ null); + + // Assert. // Note that we use a different browser window type here. - assertThrows( - AssertionError.class, - () -> - mChromeAndroidTaskTracker.obtainTask( - BrowserWindowType.POPUP, - activityScopedObjects2, - /* pendingId= */ null)); + assertEquals(task, task2); + assertEquals( + BrowserWindowType.POPUP, + task.getActivityScopedObjectsListForTesting().get(0).mBrowserWindowType); } @Test
diff --git a/chrome/browser/ui/browser_window/internal/browser_window_features.cc b/chrome/browser/ui/browser_window/internal/browser_window_features.cc index fd7522b..668e4c66 100644 --- a/chrome/browser/ui/browser_window/internal/browser_window_features.cc +++ b/chrome/browser/ui/browser_window/internal/browser_window_features.cc
@@ -144,6 +144,7 @@ #include "chrome/browser/ui/webui_browser/webui_browser_side_panel_ui.h" #include "chrome/browser/ui/webui_browser/webui_browser_window.h" #include "chrome/common/chrome_features.h" +#include "chrome/common/pref_names.h" #include "components/breadcrumbs/core/breadcrumbs_status.h" #include "components/collaboration/public/collaboration_service.h" #include "components/commerce/core/commerce_feature_list.h" @@ -307,17 +308,27 @@ if (glic::GlicEnabling::IsProfileEligible(profile)) { glic_iph_controller_ = std::make_unique<glic::GlicIphController>( browser, *glic::GlicKeyedService::Get(profile)); - glic_nudge_controller_ = - std::make_unique<glic::GlicNudgeController>(browser); + glic_nudge_controller_ = std::make_unique<glic::GlicNudgeController>( + browser, tab_list_bridge_.get()); } if (tabs::IsVerticalTabsFeatureEnabled()) { - const std::optional<bool>& restored_state_collapsed = - browser->GetBrowserForMigrationOnly() - ->is_vertical_tabs_initially_collapsed(); - const std::optional<int>& restored_state_uncollapsed_width = - browser->GetBrowserForMigrationOnly() - ->get_vertical_tabs_initial_uncollapsed_width(); + Browser* raw_browser = browser->GetBrowserForMigrationOnly(); + + std::optional<bool> restored_state_collapsed = + raw_browser->is_vertical_tabs_initially_collapsed(); + std::optional<int> restored_state_uncollapsed_width = + raw_browser->get_vertical_tabs_initial_uncollapsed_width(); + + if (!restored_state_collapsed.has_value() && + !restored_state_uncollapsed_width.has_value() && + raw_browser->creation_source() != + Browser::CreationSource::kSessionRestore) { + restored_state_collapsed = + profile->GetPrefs()->GetBoolean(prefs::kVerticalTabsCollapsedState); + restored_state_uncollapsed_width = profile->GetPrefs()->GetInteger( + prefs::kVerticalTabsUncollapsedWidth); + } vertical_tab_strip_state_controller_ = GetUserDataFactory()
diff --git a/chrome/browser/ui/browser_window/public/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTask.java b/chrome/browser/ui/browser_window/public/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTask.java index cf525b7..2c31789 100644 --- a/chrome/browser/ui/browser_window/public/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTask.java +++ b/chrome/browser/ui/browser_window/public/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTask.java
@@ -59,6 +59,7 @@ final class ActivityScopedObjects { final ActivityWindowAndroid mActivityWindowAndroid; final TabModelSelector mTabModelSelector; + final @BrowserWindowType int mBrowserWindowType; final @SupportedProfileType int mSupportedProfileType; final @Nullable DesktopWindowStateManager mDesktopWindowStateManager; final @Nullable MultiInstanceManager mMultiInstanceManager; @@ -66,11 +67,13 @@ public ActivityScopedObjects( ActivityWindowAndroid activityWindowAndroid, TabModelSelector tabModelSelector, + @BrowserWindowType int browserWindowType, @SupportedProfileType int supportedProfileType, @Nullable DesktopWindowStateManager desktopWindowStateManager, @Nullable MultiInstanceManager multiInstanceManager) { mActivityWindowAndroid = activityWindowAndroid; mTabModelSelector = tabModelSelector; + mBrowserWindowType = browserWindowType; assert supportedProfileType != SupportedProfileType.UNSET; mSupportedProfileType = supportedProfileType; mDesktopWindowStateManager = desktopWindowStateManager; @@ -148,14 +151,6 @@ @Nullable PendingTaskInfo getPendingTaskInfo(); /** - * Returns the browser window type of this {@link ChromeAndroidTask}. - * - * <p>The types are defined in the native {@code BrowserWindowInterface::Type} enum. - */ - @BrowserWindowType - int getBrowserWindowType(); - - /** * Adds an instance of {@link ActivityScopedObjects}. * * <p>As a {@link ChromeAndroidTask} is meant to track an Android Task, but {@link
diff --git a/chrome/browser/ui/browser_window/public/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTracker.java b/chrome/browser/ui/browser_window/public/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTracker.java index cf3c5dac..ba36785 100644 --- a/chrome/browser/ui/browser_window/public/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTracker.java +++ b/chrome/browser/ui/browser_window/public/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTracker.java
@@ -35,15 +35,14 @@ * * <p>As a {@link ChromeAndroidTask} is meant to track an Android Task, but {@link * ActivityScopedObjects} is associated with a {@code ChromeActivity}, it's possible that when - * this method is called, a {@link ChromeAndroidTask} already exists, in which case the {@code - * browserWindowType} must be the same as that of the existing {@link ChromeAndroidTask}, and - * the existing {@link ChromeAndroidTask} will be returned. + * this method is called, a {@link ChromeAndroidTask} already exists, in which case the existing + * {@link ChromeAndroidTask} will be returned. * * <p>Otherwise, this method will create a new {@link ChromeAndroidTask}, add it to the internal * collection, and return it. * - * @param browserWindowType The browser window type of the returned {@link ChromeAndroidTask}. - * The types are defined in the native {@code BrowserWindowInterface::Type} enum. + * @param browserWindowType The browser window type of the activity. The types are defined in + * the native {@code BrowserWindowInterface::Type} enum. * @param activityScopedObjects The {@link ActivityScopedObjects} to be associated with the * returned {@link ChromeAndroidTask}. * @param pendingId The unique ID of a pending {@link ChromeAndroidTask} that was created before
diff --git a/chrome/browser/ui/browser_window/test/android/java/src/org/chromium/chrome/browser/ui/browser_window/AndroidBaseWindowNativeUnitTestSupport.java b/chrome/browser/ui/browser_window/test/android/java/src/org/chromium/chrome/browser/ui/browser_window/AndroidBaseWindowNativeUnitTestSupport.java index 044eb4e..8da66eb 100644 --- a/chrome/browser/ui/browser_window/test/android/java/src/org/chromium/chrome/browser/ui/browser_window/AndroidBaseWindowNativeUnitTestSupport.java +++ b/chrome/browser/ui/browser_window/test/android/java/src/org/chromium/chrome/browser/ui/browser_window/AndroidBaseWindowNativeUnitTestSupport.java
@@ -38,7 +38,10 @@ mChromeAndroidTask = mock(ChromeAndroidTask.class); mAndroidBrowserWindow = new AndroidBrowserWindow( - mChromeAndroidTask, mock(Profile.class), mock(ActivityWindowAndroid.class)); + mChromeAndroidTask, + mock(Profile.class), + BrowserWindowType.NORMAL, + mock(ActivityWindowAndroid.class)); mAndroidBaseWindow = new AndroidBaseWindow(mAndroidBrowserWindow); }
diff --git a/chrome/browser/ui/browser_window/test/android/java/src/org/chromium/chrome/browser/ui/browser_window/AndroidBrowserWindowNativeUnitTestSupport.java b/chrome/browser/ui/browser_window/test/android/java/src/org/chromium/chrome/browser/ui/browser_window/AndroidBrowserWindowNativeUnitTestSupport.java index 45215ec..c7bb9ec 100644 --- a/chrome/browser/ui/browser_window/test/android/java/src/org/chromium/chrome/browser/ui/browser_window/AndroidBrowserWindowNativeUnitTestSupport.java +++ b/chrome/browser/ui/browser_window/test/android/java/src/org/chromium/chrome/browser/ui/browser_window/AndroidBrowserWindowNativeUnitTestSupport.java
@@ -5,7 +5,6 @@ package org.chromium.chrome.browser.ui.browser_window; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; import org.jni_zero.CalledByNative; @@ -38,10 +37,12 @@ private AndroidBrowserWindowNativeUnitTestSupport( @BrowserWindowType int browserWindowType, Profile profile) { mMockChromeAndroidTask = mock(ChromeAndroidTask.class); - when(mMockChromeAndroidTask.getBrowserWindowType()).thenReturn(browserWindowType); mAndroidBrowserWindow = new AndroidBrowserWindow( - mMockChromeAndroidTask, profile, mock(ActivityWindowAndroid.class)); + mMockChromeAndroidTask, + profile, + browserWindowType, + mock(ActivityWindowAndroid.class)); ProfileManager.setLastUsedProfileForTesting(profile); }
diff --git a/chrome/browser/ui/browser_window/test/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskUnitTestSupport.java b/chrome/browser/ui/browser_window/test/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskUnitTestSupport.java index 8cdba95..298234b1 100644 --- a/chrome/browser/ui/browser_window/test/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskUnitTestSupport.java +++ b/chrome/browser/ui/browser_window/test/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskUnitTestSupport.java
@@ -254,6 +254,7 @@ createMockActivityScopedObjects( activityWindowAndroidMocks.mMockActivityWindowAndroid, profile, + BrowserWindowType.NORMAL, profileType); var mockAndroidBrowserWindowNatives = mockNatives ? createMockAndroidBrowserWindowNatives() : null; @@ -309,13 +310,27 @@ */ static ChromeAndroidTask.ActivityScopedObjects createMockActivityScopedObjects( int taskId, Profile profile) { + return createMockActivityScopedObjects(taskId, profile, BrowserWindowType.NORMAL); + } + + /** + * Creates a {@link ChromeAndroidTask.ActivityScopedObjects} instance containing mock objects. + * + * @param taskId The Task ID of the {@code Activity} the mock objects are associated with. + * @param profile The {@link Profile} the mock objects are associated with. + * @param windowType The mock {@link BrowserWindowType} for this window. + * @return The new {@link ChromeAndroidTask.ActivityScopedObjects} instance. + */ + static ChromeAndroidTask.ActivityScopedObjects createMockActivityScopedObjects( + int taskId, Profile profile, @BrowserWindowType int windowType) { var activityWindowAndroidMocks = createActivityWindowAndroidMocks(taskId); if (VERSION.SDK_INT >= VERSION_CODES.R) { mockDesktopWindowingMode(activityWindowAndroidMocks); } var activityWindowAndroid = activityWindowAndroidMocks.mMockActivityWindowAndroid; - return createMockActivityScopedObjects(activityWindowAndroid, profile); + return createMockActivityScopedObjects( + activityWindowAndroid, profile, windowType, SupportedProfileType.REGULAR); } /** @@ -329,7 +344,10 @@ static ChromeAndroidTask.ActivityScopedObjects createMockActivityScopedObjects( ActivityWindowAndroid activityWindowAndroid, Profile profile) { return createMockActivityScopedObjects( - activityWindowAndroid, profile, SupportedProfileType.REGULAR); + activityWindowAndroid, + profile, + BrowserWindowType.NORMAL, + SupportedProfileType.REGULAR); } /** @@ -338,12 +356,14 @@ * @param activityWindowAndroid The {@link ActivityWindowAndroid} for the {@code Activity} the * mock objects are associated with. * @param profile The {@link Profile} the mock objects are associated with. + * @param windowType The mock {@link BrowserWindowType} for this window. * @param profileType The {@link SupportedProfileType} for this window. * @return The new {@link ChromeAndroidTask.ActivityScopedObjects} instance. */ static ChromeAndroidTask.ActivityScopedObjects createMockActivityScopedObjects( ActivityWindowAndroid activityWindowAndroid, Profile profile, + @BrowserWindowType int windowType, @SupportedProfileType int profileType) { assert mockingDetails(activityWindowAndroid).isMock(); @@ -376,6 +396,7 @@ return new ChromeAndroidTask.ActivityScopedObjects( activityWindowAndroid, mockTabModelSelector, + windowType, profileType, mockDesktopWindowStateManager, mockMultiInstanceManager);
diff --git a/chrome/browser/ui/call_to_action/BUILD.gn b/chrome/browser/ui/call_to_action/BUILD.gn index 858142a..5b63450 100644 --- a/chrome/browser/ui/call_to_action/BUILD.gn +++ b/chrome/browser/ui/call_to_action/BUILD.gn
@@ -15,16 +15,18 @@ ] } -source_set("browser_tests") { - testonly = true - defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] - sources = [ "call_to_action_lock_browsertest.cc" ] - deps = [ - ":call_to_action", - "//chrome/browser", - "//chrome/browser/ui", - "//chrome/test:test_support", - "//content/test:test_support", - "//testing/gtest", - ] +if (!is_android) { + source_set("browser_tests") { + testonly = true + defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] + sources = [ "call_to_action_lock_browsertest.cc" ] + deps = [ + ":call_to_action", + "//chrome/browser", + "//chrome/browser/ui", + "//chrome/test:test_support", + "//content/test:test_support", + "//testing/gtest", + ] + } }
diff --git a/chrome/browser/ui/chrome_pages.cc b/chrome/browser/ui/chrome_pages.cc index 82df6de3..3191df8 100644 --- a/chrome/browser/ui/chrome_pages.cc +++ b/chrome/browser/ui/chrome_pages.cc
@@ -264,10 +264,11 @@ constexpr char kParamRequest[] = "site"; GURL link_destination = GetSettingsUrl(chrome::kContentSettingsSubPage); if (SiteGURLIsValid(url)) { - std::string origin_string = url::Origin::Create(url).Serialize(); - link_destination = - net::AppendQueryParameter(GetSettingsUrl(chrome::kSiteDetailsSubpage), - kParamRequest, origin_string); + std::string url_string = url.SchemeIs(webapps::kIsolatedAppScheme) + ? url.spec() + : url::Origin::Create(url).Serialize(); + link_destination = net::AppendQueryParameter( + GetSettingsUrl(chrome::kSiteDetailsSubpage), kParamRequest, url_string); } NavigateParams params(profile, link_destination, ui::PAGE_TRANSITION_TYPED); params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
diff --git a/chrome/browser/ui/contextual_search/BUILD.gn b/chrome/browser/ui/contextual_search/BUILD.gn index dc679ea..e4a31afd 100644 --- a/chrome/browser/ui/contextual_search/BUILD.gn +++ b/chrome/browser/ui/contextual_search/BUILD.gn
@@ -56,6 +56,7 @@ "//base/test:test_support", "//components/omnibox/browser:mojo_bindings", "//testing/gtest", + "//third_party/omnibox_proto", "//url", ] }
diff --git a/chrome/browser/ui/contextual_search/searchbox_context_data.h b/chrome/browser/ui/contextual_search/searchbox_context_data.h index fc16f63f..47678556 100644 --- a/chrome/browser/ui/contextual_search/searchbox_context_data.h +++ b/chrome/browser/ui/contextual_search/searchbox_context_data.h
@@ -11,6 +11,7 @@ #include "base/sequence_checker.h" #include "components/omnibox/browser/searchbox.mojom.h" +#include "third_party/omnibox_proto/tool_mode.pb.h" // Temporarily stores search context (files, mode, query, etc.) while moving // from one piece of UI to another (e.g. context menu to composebox dialog). @@ -24,7 +25,7 @@ std::string text; std::vector<searchbox::mojom::SearchContextAttachmentPtr> file_infos; - searchbox::mojom::ToolMode mode = searchbox::mojom::ToolMode::kDefault; + omnibox::ToolMode mode = omnibox::TOOL_MODE_UNSPECIFIED; }; SearchboxContextData();
diff --git a/chrome/browser/ui/contextual_search/searchbox_context_data_unittest.cc b/chrome/browser/ui/contextual_search/searchbox_context_data_unittest.cc index df3f58c..e77b6ca 100644 --- a/chrome/browser/ui/contextual_search/searchbox_context_data_unittest.cc +++ b/chrome/browser/ui/contextual_search/searchbox_context_data_unittest.cc
@@ -7,6 +7,7 @@ #include "base/unguessable_token.h" #include "components/omnibox/browser/searchbox.mojom.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/omnibox_proto/tool_mode.pb.h" #include "url/gurl.h" namespace { @@ -45,13 +46,13 @@ TEST_F(SearchboxContextDataTest, SetAndTakePendingContextWithToolMode) { SearchboxContextData data; auto context = std::make_unique<SearchboxContextData::Context>(); - context->mode = searchbox::mojom::ToolMode::kCreateImage; + context->mode = omnibox::TOOL_MODE_IMAGE_GEN; data.SetPendingContext(std::move(context)); std::unique_ptr<SearchboxContextData::Context> taken_context = data.TakePendingContext(); EXPECT_NE(nullptr, taken_context); - EXPECT_EQ(searchbox::mojom::ToolMode::kCreateImage, taken_context->mode); + EXPECT_EQ(omnibox::TOOL_MODE_IMAGE_GEN, taken_context->mode); EXPECT_EQ(nullptr, data.TakePendingContext()); }
diff --git a/chrome/browser/ui/digital_credentials/digital_identity_safety_interstitial_bridge_android.cc b/chrome/browser/ui/digital_credentials/digital_identity_safety_interstitial_bridge_android.cc index e42fdead3..5f81d8a 100644 --- a/chrome/browser/ui/digital_credentials/digital_identity_safety_interstitial_bridge_android.cc +++ b/chrome/browser/ui/digital_credentials/digital_identity_safety_interstitial_bridge_android.cc
@@ -20,7 +20,7 @@ DigitalIdentitySafetyInterstitialBridgeAndroid() : weak_ptr_factory_(this) { JNIEnv* env = AttachCurrentThread(); - j_bridge_ = JDigitalIdentitySafetyInterstitialBridgeJni::create( + j_bridge_ = DigitalIdentitySafetyInterstitialBridgeJni::create( env, reinterpret_cast<intptr_t>(this)); }
diff --git a/chrome/browser/ui/exclusive_access/fullscreen_controller_interactive_browsertest.cc b/chrome/browser/ui/exclusive_access/fullscreen_controller_interactive_browsertest.cc index b22c496f..5e44b129 100644 --- a/chrome/browser/ui/exclusive_access/fullscreen_controller_interactive_browsertest.cc +++ b/chrome/browser/ui/exclusive_access/fullscreen_controller_interactive_browsertest.cc
@@ -792,9 +792,8 @@ ASSERT_FALSE(fullscreen_controller->IsTabFullscreen()); // While bubble is showing, tab fullscreen cannot be entered. - EXPECT_THAT(content::EvalJs(web_contents, - "document.documentElement.requestFullscreen()"), - content::EvalJsResult::IsError()); + EXPECT_FALSE(content::ExecJs(web_contents, + "document.documentElement.requestFullscreen()")); ASSERT_FALSE(fullscreen_controller->IsTabFullscreen()); // Accept the permission request to close the bubble. @@ -833,9 +832,8 @@ EXPECT_FALSE(fullscreen_controller->IsTabFullscreen()); // While bubble is showing, tab fullscreen cannot be entered. - EXPECT_THAT(content::EvalJs(web_contents, - "document.documentElement.requestFullscreen()"), - content::EvalJsResult::IsError()); + EXPECT_FALSE(content::ExecJs(web_contents, + "document.documentElement.requestFullscreen()")); EXPECT_FALSE(fullscreen_controller->IsTabFullscreen()); // Close the chooser bubble.
diff --git a/chrome/browser/ui/omnibox/omnibox_context_menu_controller.cc b/chrome/browser/ui/omnibox/omnibox_context_menu_controller.cc index e178d90..c3e1ce31 100644 --- a/chrome/browser/ui/omnibox/omnibox_context_menu_controller.cc +++ b/chrome/browser/ui/omnibox/omnibox_context_menu_controller.cc
@@ -98,18 +98,6 @@ model == omnibox::ModelMode::MODEL_MODE_GEMINI_PRO_NO_GEN_UI; } -searchbox::mojom::ToolMode GetSearchboxToolMode(omnibox::ToolMode tool) { - switch (tool) { - case omnibox::ToolMode::TOOL_MODE_IMAGE_GEN: - return searchbox::mojom::ToolMode::kCreateImage; - case omnibox::ToolMode::TOOL_MODE_DEEP_SEARCH: - return searchbox::mojom::ToolMode::kDeepSearch; - case omnibox::ToolMode::TOOL_MODE_CANVAS: - return searchbox::mojom::ToolMode::kCanvas; - default: - return searchbox::mojom::ToolMode::kDefault; - } -} } // namespace OmniboxContextMenuController::OmniboxContextMenuController( @@ -478,7 +466,7 @@ void OmniboxContextMenuController::UpdateSearchboxContext( std::optional<TabInfo> tab_info, - std::optional<searchbox::mojom::ToolMode> tool_mode) { + std::optional<omnibox::ToolMode> tool_mode) { auto* browser_window_interface = webui::GetBrowserWindowInterface(web_contents_.get()); if (!browser_window_interface) { @@ -870,7 +858,7 @@ it != tool_for_command_id_.end()) { UpdateSearchboxContext( /*tab_info=*/std::nullopt, - /*tool_mode=*/GetSearchboxToolMode(it->second)); + /*tool_mode=*/it->second); base::UmaHistogramEnumeration(sliced_prefix, CommandIdToEnum(it->first)); GetEditModel()->OpenAiMode(/*via_keyboard=*/false, @@ -914,7 +902,7 @@ case IDC_OMNIBOX_CONTEXT_CREATE_IMAGES: UpdateSearchboxContext( /*tab_info=*/std::nullopt, - /*tool_mode=*/searchbox::mojom::ToolMode::kCreateImage); + /*tool_mode=*/omnibox::TOOL_MODE_IMAGE_GEN); base::UmaHistogramEnumeration(sliced_prefix, CommandIdToEnum(id)); GetEditModel()->OpenAiMode(/*via_keyboard=*/false, /*via_context_menu=*/true); @@ -922,7 +910,7 @@ case IDC_OMNIBOX_CONTEXT_DEEP_RESEARCH: UpdateSearchboxContext( /*tab_info=*/std::nullopt, - /*tool_mode=*/searchbox::mojom::ToolMode::kDeepSearch); + /*tool_mode=*/omnibox::TOOL_MODE_DEEP_SEARCH); base::UmaHistogramEnumeration(sliced_prefix, CommandIdToEnum(id)); GetEditModel()->OpenAiMode(/*via_keyboard=*/false, /*via_context_menu=*/true); @@ -930,7 +918,7 @@ case IDC_OMNIBOX_CONTEXT_CANVAS: UpdateSearchboxContext( /*tab_info=*/std::nullopt, - /*tool_mode=*/searchbox::mojom::ToolMode::kCanvas); + /*tool_mode=*/omnibox::TOOL_MODE_CANVAS); base::UmaHistogramEnumeration(sliced_prefix, CommandIdToEnum(id)); GetEditModel()->OpenAiMode(/*via_keyboard=*/false, /*via_context_menu=*/true);
diff --git a/chrome/browser/ui/omnibox/omnibox_context_menu_controller.h b/chrome/browser/ui/omnibox/omnibox_context_menu_controller.h index 646672b6..243756d3 100644 --- a/chrome/browser/ui/omnibox/omnibox_context_menu_controller.h +++ b/chrome/browser/ui/omnibox/omnibox_context_menu_controller.h
@@ -87,9 +87,8 @@ OmniboxPopupState page_type) const; bool IsCommandIdVisible(int command_id) const override; void AddTabContext(const TabInfo& tab_info); - void UpdateSearchboxContext( - std::optional<TabInfo> tab_info, - std::optional<searchbox::mojom::ToolMode> tool_mode); + void UpdateSearchboxContext(std::optional<TabInfo> tab_info, + std::optional<omnibox::ToolMode> tool_mode); // Tracks the context type. // These values are persisted to logs. Entries should not be renumbered and @@ -171,7 +170,7 @@ const favicon_base::FaviconImageResult& image_result); void OnGetInputState(const std::optional<omnibox::InputState>& input_state); - void UpdateSearchboxContextToolMode(searchbox::mojom::ToolMode tool_mode); + void UpdateSearchboxContextToolMode(omnibox::ToolMode tool_mode); bool IsContentSharingEnabled() const;
diff --git a/chrome/browser/ui/omnibox/omnibox_context_menu_controller_browsertest.cc b/chrome/browser/ui/omnibox/omnibox_context_menu_controller_browsertest.cc index 56e8d04..78a39b3 100644 --- a/chrome/browser/ui/omnibox/omnibox_context_menu_controller_browsertest.cc +++ b/chrome/browser/ui/omnibox/omnibox_context_menu_controller_browsertest.cc
@@ -31,6 +31,7 @@ #include "content/public/test/browser_test.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" +#include "third_party/omnibox_proto/tool_mode.pb.h" #include "ui/gfx/native_ui_types.h" #include "ui/menus/simple_menu_model.h" @@ -170,7 +171,7 @@ omnibox_controller->popup_state_manager()->popup_state()); auto context = searchbox_context_data->TakePendingContext(); ASSERT_TRUE(context); - EXPECT_EQ(context->mode, searchbox::mojom::ToolMode::kDeepSearch); + EXPECT_EQ(context->mode, omnibox::TOOL_MODE_DEEP_SEARCH); searchbox_context_data->SetPendingContext(std::move(context)); omnibox_controller->popup_state_manager()->SetPopupState( @@ -182,7 +183,7 @@ omnibox_controller->popup_state_manager()->popup_state()); context = searchbox_context_data->TakePendingContext(); ASSERT_TRUE(context); - EXPECT_EQ(context->mode, searchbox::mojom::ToolMode::kCreateImage); + EXPECT_EQ(context->mode, omnibox::TOOL_MODE_IMAGE_GEN); } IN_PROC_BROWSER_TEST_F(OmniboxContextMenuControllerBrowserTest,
diff --git a/chrome/browser/ui/omnibox/omnibox_next_features.cc b/chrome/browser/ui/omnibox/omnibox_next_features.cc index 232a060..6d0a8aa 100644 --- a/chrome/browser/ui/omnibox/omnibox_next_features.cc +++ b/chrome/browser/ui/omnibox/omnibox_next_features.cc
@@ -38,7 +38,6 @@ constexpr base::FeatureParam<AddContextButtonVariant>::Option kAddContextButtonVariantOptions[] = { {AddContextButtonVariant::kBelowResults, "below_results"}, - {AddContextButtonVariant::kAboveResults, "above_results"}, {AddContextButtonVariant::kInline, "inline"}}; // Configures the placement of the "Add Context" button in the Omnibox popup.
diff --git a/chrome/browser/ui/omnibox/omnibox_next_features.h b/chrome/browser/ui/omnibox/omnibox_next_features.h index f3e1300..9180019 100644 --- a/chrome/browser/ui/omnibox/omnibox_next_features.h +++ b/chrome/browser/ui/omnibox/omnibox_next_features.h
@@ -32,9 +32,7 @@ // Variant 1. kBelowResults = 1, // Variant 2. - kAboveResults = 2, - // Variant 3. - kInline = 3, + kInline = 2, }; extern const base::FeatureParam<AddContextButtonVariant>
diff --git a/chrome/browser/ui/page_action/page_action_icon_type.cc b/chrome/browser/ui/page_action/page_action_icon_type.cc index 0d3b242..7546c000 100644 --- a/chrome/browser/ui/page_action/page_action_icon_type.cc +++ b/chrome/browser/ui/page_action/page_action_icon_type.cc
@@ -22,8 +22,6 @@ return &features::kPageActionsMigrationManagePasswords; case PageActionIconType::kCookieControls: return &features::kPageActionsMigrationCookieControls; - case PageActionIconType::kAutofillAddress: - return &features::kPageActionsMigrationAutofillAddress; case PageActionIconType::kCollaborationMessaging: return &features::kPageActionsMigrationCollaborationMessaging; case PageActionIconType::kMandatoryReauth: @@ -66,6 +64,7 @@ case PageActionIconType::kTranslate: case PageActionIconType::kFind: case PageActionIconType::kPwaInstall: + case PageActionIconType::kAutofillAddress: case PageActionIconType::kPaymentsOfferNotification: case PageActionIconType::kContextualSidePanel: case PageActionIconType::kJsOptimizations:
diff --git a/chrome/browser/ui/read_anything/read_anything_controller_browsertest.cc b/chrome/browser/ui/read_anything/read_anything_controller_browsertest.cc index d336f93..c5a6923 100644 --- a/chrome/browser/ui/read_anything/read_anything_controller_browsertest.cc +++ b/chrome/browser/ui/read_anything/read_anything_controller_browsertest.cc
@@ -153,13 +153,24 @@ web_view->ShowUI(); } - void WaitForOverlayVisibility(bool visible) { - views::View* overlay_view = GetImmersiveOverlay(); + void AwaitAndAssertOverlayVisibility(bool visible, + Browser* browser_ptr = nullptr) { + if (!browser_ptr) { + browser_ptr = browser(); + } + views::View* overlay_view = GetImmersiveOverlay(browser_ptr); ASSERT_TRUE(overlay_view); EXPECT_TRUE(base::test::RunUntil( [&]() { return visible == overlay_view->GetVisible(); })); } + void AwaitAndAssertOverlayVisibilityForTab(int tab_index, bool visible) { + EXPECT_TRUE(base::test::RunUntil([&]() { + views::View* overlay_view = GetImmersiveOverlayForTab(tab_index); + return overlay_view && visible == overlay_view->GetVisible(); + })); + } + void AssertOverlayVisibility(bool visible) { views::View* overlay_view = GetImmersiveOverlay(); ASSERT_TRUE(overlay_view); @@ -841,7 +852,7 @@ tab_strip_model->ActivateTabAt(0); // Confirm that IRM is shown again automatically. - ASSERT_TRUE(overlay_view->GetVisible()); + AwaitAndAssertOverlayVisibilityForTab(/*tab_index=*/0, /*visible=*/true); ASSERT_FALSE(overlay_view->children().empty()); } @@ -885,20 +896,20 @@ ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); // Verify Immersive UI is closed - AssertOverlayVisibility(/*visible=*/false); + AwaitAndAssertOverlayVisibility(/*visible=*/false); EXPECT_EQ(controller->GetPresentationState(), ReadAnythingController::PresentationState::kInactive); // Show Immersive UI again controller->ShowImmersiveUI(ReadAnythingOpenTrigger::kOmniboxChip); - AssertOverlayVisibility(/*visible=*/true); + AwaitAndAssertOverlayVisibility(/*visible=*/true); // Navigate to another page GURL url2("https://www.example.com"); ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url2)); // Verify Immersive UI is closed again - AssertOverlayVisibility(/*visible=*/false); + AwaitAndAssertOverlayVisibility(/*visible=*/false); EXPECT_EQ(controller->GetPresentationState(), ReadAnythingController::PresentationState::kInactive); } @@ -925,7 +936,7 @@ ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), same_doc_url)); // Verify Immersive UI is still open (PrimaryPageChanged is not called) - AssertOverlayVisibility(/*visible=*/true); + AwaitAndAssertOverlayVisibility(/*visible=*/true); EXPECT_EQ(controller->GetPresentationState(), ReadAnythingController::PresentationState::kInImmersiveOverlay); } @@ -958,16 +969,14 @@ auto* controller = ReadAnythingController::From(tab); ASSERT_TRUE(controller); controller->ShowImmersiveUI(ReadAnythingOpenTrigger::kOmniboxChip); - WaitForOverlayVisibility(true); - AssertOverlayVisibility(true); + AwaitAndAssertOverlayVisibility(/*visible=*/true); content::WaitForLoadStop(GetImmersiveWebContents()); content::SimulateUnresponsiveRenderer( GetImmersiveWebContents(), GetImmersiveWebContents()->GetPrimaryMainFrame()->GetRenderWidgetHost()); - WaitForOverlayVisibility(false); - AssertOverlayVisibility(false); + AwaitAndAssertOverlayVisibility(/*visible=*/false); } IN_PROC_BROWSER_TEST_F(ReadAnythingControllerBrowserTest, @@ -977,19 +986,17 @@ auto* controller = ReadAnythingController::From(tab); ASSERT_TRUE(controller); controller->ShowImmersiveUI(ReadAnythingOpenTrigger::kOmniboxChip); - WaitForOverlayVisibility(true); - AssertOverlayVisibility(true); + AwaitAndAssertOverlayVisibility(/*visible=*/true); content::WebContents* starting_contents = GetImmersiveWebContents(); content::WaitForLoadStop(starting_contents); content::SimulateUnresponsiveRenderer( starting_contents, starting_contents->GetPrimaryMainFrame()->GetRenderWidgetHost()); - WaitForOverlayVisibility(false); + AwaitAndAssertOverlayVisibility(/*visible=*/false); controller->ShowImmersiveUI(ReadAnythingOpenTrigger::kOmniboxChip); - WaitForOverlayVisibility(true); - AssertOverlayVisibility(true); + AwaitAndAssertOverlayVisibility(/*visible=*/true); // The web contents would be the same if it was not recreated. EXPECT_NE(GetImmersiveWebContents(), starting_contents); } @@ -1173,6 +1180,7 @@ // 4. Open IRM in new window controller->ShowImmersiveUI(ReadAnythingOpenTrigger::kOmniboxChip); + AwaitAndAssertOverlayVisibility(/*visible=*/true, new_browser); // 5. Verify same WebContents content::WebContents* new_web_contents = GetImmersiveWebContents(new_browser); @@ -1181,6 +1189,7 @@ // 6. Open new tab in new window and verify IRM closes, confirming that we're // still tracking tab switches in the new window. chrome::AddTabAt(new_browser, GURL("about:blank"), -1, true); + AwaitAndAssertOverlayVisibility(/*visible=*/false, new_browser); EXPECT_EQ(controller->GetPresentationState(), ReadAnythingController::PresentationState::kInactive); EXPECT_FALSE(GetImmersiveWebContents(new_browser)); @@ -1731,7 +1740,7 @@ TabStripModel::CommandAddToSplit); // Verify IRM is still shown on Tab B. - ASSERT_TRUE(GetImmersiveOverlayForTab(1)->GetVisible()); + AwaitAndAssertOverlayVisibilityForTab(/*tab_index=*/1, /*visible=*/true); // Verify IRM is not shown on Tab A. ASSERT_FALSE(GetImmersiveOverlayForTab(0)->GetVisible()); @@ -1793,13 +1802,14 @@ EXPECT_EQ(split_id, tab_strip_model->GetSplitForTab(0)); // Verify IRM is visible on both tabs + AwaitAndAssertOverlayVisibilityForTab(/*tab_index=*/0, /*visible=*/true); + views::View* overlay_view0 = GetImmersiveOverlayForTab(0); ASSERT_TRUE(overlay_view0); - ASSERT_TRUE(overlay_view0->GetVisible()); + AwaitAndAssertOverlayVisibilityForTab(/*tab_index=*/1, /*visible=*/true); views::View* overlay_view1 = GetImmersiveOverlayForTab(1); ASSERT_TRUE(overlay_view1); - ASSERT_TRUE(overlay_view1->GetVisible()); } IN_PROC_BROWSER_TEST_F(ReadAnythingControllerBrowserTest, @@ -1883,15 +1893,15 @@ TabStripModel::CommandAddToSplit); // Both should be visible - ASSERT_TRUE(GetImmersiveOverlayForTab(0)->GetVisible()); - ASSERT_TRUE(GetImmersiveOverlayForTab(1)->GetVisible()); + AwaitAndAssertOverlayVisibilityForTab(/*tab_index=*/0, /*visible=*/true); + AwaitAndAssertOverlayVisibilityForTab(/*tab_index=*/1, /*visible=*/true); // Close IRM on active tab (Tab B) ReadAnythingController::From(tab_strip_model->GetActiveTab()) ->CloseImmersiveUI(ReadAnythingCloseReason::kClosedByUser); // Verify Tab B IRM closed - ASSERT_FALSE(GetImmersiveOverlayForTab(1)->GetVisible()); + AwaitAndAssertOverlayVisibilityForTab(/*tab_index=*/1, /*visible=*/false); // Verify Tab A IRM still open ASSERT_TRUE(GetImmersiveOverlayForTab(0)->GetVisible()); @@ -1975,11 +1985,11 @@ ASSERT_NE(0, tab_strip_model->active_index()); // Verify IRM on Tab A is visible (even though it's inactive) - views::View* overlay_view_a = GetImmersiveOverlayForTab(0); - ASSERT_TRUE(overlay_view_a); - ASSERT_TRUE(overlay_view_a->GetVisible()); + AwaitAndAssertOverlayVisibilityForTab(/*tab_index=*/0, /*visible=*/true); // Simulate focus on the IRM WebView of Tab A. + views::View* overlay_view_a = GetImmersiveOverlayForTab(0); + ASSERT_TRUE(overlay_view_a); auto* web_view = static_cast<views::WebView*>(overlay_view_a->children()[0]); // Trigger the focus callback via RequestFocus. web_view->RequestFocus(); @@ -1990,6 +2000,50 @@ } IN_PROC_BROWSER_TEST_F(ReadAnythingControllerBrowserTest, + FirstTimeOpen_HasFocus) { + tabs::TabInterface* tab = browser()->tab_strip_model()->GetActiveTab(); + ASSERT_TRUE(tab); + auto* controller = ReadAnythingController::From(tab); + ASSERT_TRUE(controller); + + // Show immersive mode + controller->ShowImmersiveUI(ReadAnythingOpenTrigger::kOmniboxChip); + views::View* overlay_view = GetImmersiveOverlay(); + ASSERT_TRUE(overlay_view); + EmitWebUIShowEvent(overlay_view); + + ASSERT_TRUE(overlay_view->GetVisible()); + auto* web_view = static_cast<views::WebView*>(overlay_view->children()[0]); + + // It should be focused + EXPECT_TRUE(base::test::RunUntil([&]() { return web_view->HasFocus(); })); +} + +IN_PROC_BROWSER_TEST_F(ReadAnythingControllerBrowserTest, Reopen_HasFocus) { + tabs::TabInterface* tab = browser()->tab_strip_model()->GetActiveTab(); + ASSERT_TRUE(tab); + auto* controller = ReadAnythingController::From(tab); + ASSERT_TRUE(controller); + + // Show, emit, close + controller->ShowImmersiveUI(ReadAnythingOpenTrigger::kOmniboxChip); + views::View* overlay_view = GetImmersiveOverlay(); + ASSERT_TRUE(overlay_view); + EmitWebUIShowEvent(overlay_view); + controller->CloseImmersiveUI(ReadAnythingCloseReason::kClosedByUser); + ASSERT_FALSE(overlay_view->GetVisible()); + + // Reopen + controller->ShowImmersiveUI(ReadAnythingOpenTrigger::kOmniboxChip); + AwaitAndAssertOverlayVisibility(/*visible=*/true); + + auto* web_view = static_cast<views::WebView*>(overlay_view->children()[0]); + + // It should be focused + EXPECT_TRUE(base::test::RunUntil([&]() { return web_view->HasFocus(); })); +} + +IN_PROC_BROWSER_TEST_F(ReadAnythingControllerBrowserTest, GlueAttachedAndDetachedCorrectly) { tabs::TabInterface* tab = browser()->tab_strip_model()->GetActiveTab(); ASSERT_TRUE(tab); @@ -2155,7 +2209,7 @@ controller->OnSoftNavigation(); // Verify Immersive UI is closed - AssertOverlayVisibility(/*visible=*/false); + AwaitAndAssertOverlayVisibility(/*visible=*/false); EXPECT_EQ(controller->GetPresentationState(), ReadAnythingController::PresentationState::kInactive); } @@ -2194,7 +2248,7 @@ waiter->Wait(); // Verify Immersive is closed - AssertOverlayVisibility(/*visible=*/false); + AwaitAndAssertOverlayVisibility(/*visible=*/false); EXPECT_EQ(controller->GetPresentationState(), ReadAnythingController::PresentationState::kInactive); }
diff --git a/chrome/browser/ui/read_anything/read_anything_entry_point_controller.cc b/chrome/browser/ui/read_anything/read_anything_entry_point_controller.cc index 3561efe..4d60c57a 100644 --- a/chrome/browser/ui/read_anything/read_anything_entry_point_controller.cc +++ b/chrome/browser/ui/read_anything/read_anything_entry_point_controller.cc
@@ -4,10 +4,13 @@ #include "chrome/browser/ui/read_anything/read_anything_entry_point_controller.h" +#include <string_view> #include <type_traits> #include <utility> #include "base/command_line.h" +#include "base/functional/bind.h" +#include "base/metrics/histogram_base.h" #include "base/metrics/histogram_functions.h" #include "chrome/browser/dom_distiller/tab_utils.h" #include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h" @@ -62,6 +65,8 @@ "youtube.com", "photos.google.com", }; +constexpr std::string_view kOmniboxDecisionHistogram = + "Accessibility.ReadAnything.OmniboxChipDecision"; int GetOmniboxChipIgnoredCount(PrefService* prefs) { return prefs->GetInteger( @@ -81,6 +86,10 @@ base::FeatureList::IsEnabled(features::kPageActionsMigration); } +void LogDecision(ReadAnythingOmniboxChipDecision decision) { + base::UmaHistogramEnumeration(kOmniboxDecisionHistogram, decision); +} + #if BUILDFLAG(ENABLE_PDF) size_t g_min_pdf_text_length_for_omnibox = 1100; constexpr float kMaxNonAlphaFraction = 0.33; @@ -104,9 +113,19 @@ // Show the omnibox on PDFs above a certain length, with a high percentage of // alphabetic characters. In this case, it is likely going to distill well in // Reading mode. - std::move(result_callback) - .Run((text.size() > g_min_pdf_text_length_for_omnibox) && - IsMostlyAlphaChars(text)); + bool long_enough = text.size() > g_min_pdf_text_length_for_omnibox; + bool should_show = long_enough && IsMostlyAlphaChars(text); + std::move(result_callback).Run(should_show); + + ReadAnythingOmniboxChipDecision decision; + if (should_show) { + decision = ReadAnythingOmniboxChipDecision::kShowPdf; + } else if (!long_enough) { + decision = ReadAnythingOmniboxChipDecision::kHideShortPdf; + } else { + decision = ReadAnythingOmniboxChipDecision::kHideLowAlphabeticPdf; + } + LogDecision(decision); } void RunPdfDistillableHeuristic( @@ -130,10 +149,21 @@ #endif } +void OnReadabilityDecision(base::OnceCallback<void(bool)> result_callback, + bool should_show) { + std::move(result_callback).Run(should_show); + ReadAnythingOmniboxChipDecision decision = + should_show ? ReadAnythingOmniboxChipDecision::kShowArticle + : ReadAnythingOmniboxChipDecision::kHideReadability; + LogDecision(decision); +} + void RunReadabilityHeuristic(content::WebContents* contents, base::OnceCallback<void(bool)> result_callback) { CHECK(contents); - RunReadabilityHeuristicsOnWebContents(contents, std::move(result_callback)); + RunReadabilityHeuristicsOnWebContents( + contents, + base::BindOnce(&OnReadabilityDecision, std::move(result_callback))); } void OnOptimizationGuideDecision( @@ -153,6 +183,7 @@ // Optimization guide decided no, so immediately callback with a negative // result, bypassing the Readability check. std::move(result_callback).Run(false); + LogDecision(ReadAnythingOmniboxChipDecision::kHideOptimizationGuide); break; case optimization_guide::OptimizationGuideDecision::kTrue: case optimization_guide::OptimizationGuideDecision::kUnknown: @@ -346,6 +377,7 @@ // omnibox support. Browser* browser = bwi->GetBrowserForMigrationOnly(); if (browser && (browser->is_type_app() || browser->is_type_app_popup())) { + LogDecision(ReadAnythingOmniboxChipDecision::kHideAppWindow); return false; } @@ -355,12 +387,14 @@ content::WebContents* contents = bwi->GetActiveTabInterface()->GetContents(); const GURL& url = contents->GetLastCommittedURL(); if (!url.SchemeIsHTTPOrHTTPS()) { + LogDecision(ReadAnythingOmniboxChipDecision::kHideNonHttp); return false; } // Don't show the omnibox entrypoint for sites we know don't distill well. for (const char* domain : kDenyList) { if (url.DomainIs(domain)) { + LogDecision(ReadAnythingOmniboxChipDecision::kHideDenyList); return false; } }
diff --git a/chrome/browser/ui/read_anything/read_anything_entry_point_controller_browsertest.cc b/chrome/browser/ui/read_anything/read_anything_entry_point_controller_browsertest.cc index 1cf31bd..416e41f 100644 --- a/chrome/browser/ui/read_anything/read_anything_entry_point_controller_browsertest.cc +++ b/chrome/browser/ui/read_anything/read_anything_entry_point_controller_browsertest.cc
@@ -20,6 +20,7 @@ #include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/browser_window/public/browser_window_features.h" #include "chrome/browser/ui/read_anything/read_anything_controller.h" +#include "chrome/browser/ui/read_anything/read_anything_enums.h" #include "chrome/browser/ui/read_anything/read_anything_prefs.h" #include "chrome/browser/ui/side_panel/side_panel_action_callback.h" #include "chrome/browser/ui/side_panel/side_panel_entry_id.h" @@ -468,11 +469,15 @@ std::optional<optimization_guide::OptimizationMetadata>()); base::test::TestFuture<bool> future; + base::HistogramTester histogram_tester; ReadAnythingEntryPointController::CheckIfShouldSuggestReadingMode( browser(), future.GetCallback()); EXPECT_TRUE(future.Wait()); EXPECT_TRUE(future.Get()); + histogram_tester.ExpectUniqueSample( + "Accessibility.ReadAnything.OmniboxChipDecision", + ReadAnythingOmniboxChipDecision::kShowArticle, 1); } IN_PROC_BROWSER_TEST_P( @@ -483,11 +488,15 @@ ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); base::test::TestFuture<bool> future; + base::HistogramTester histogram_tester; ReadAnythingEntryPointController::CheckIfShouldSuggestReadingMode( browser(), future.GetCallback()); EXPECT_TRUE(future.Wait()); EXPECT_FALSE(future.Get()); + histogram_tester.ExpectUniqueSample( + "Accessibility.ReadAnything.OmniboxChipDecision", + ReadAnythingOmniboxChipDecision::kHideOptimizationGuide, 1); } IN_PROC_BROWSER_TEST_P( @@ -502,11 +511,15 @@ std::optional<optimization_guide::OptimizationMetadata>()); base::test::TestFuture<bool> future; + base::HistogramTester histogram_tester; ReadAnythingEntryPointController::CheckIfShouldSuggestReadingMode( browser(), future.GetCallback()); EXPECT_TRUE(future.Wait()); EXPECT_FALSE(future.Get()); + histogram_tester.ExpectUniqueSample( + "Accessibility.ReadAnything.OmniboxChipDecision", + ReadAnythingOmniboxChipDecision::kHideReadability, 1); } IN_PROC_BROWSER_TEST_P( @@ -517,11 +530,15 @@ ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); base::test::TestFuture<bool> future; + base::HistogramTester histogram_tester; ReadAnythingEntryPointController::CheckIfShouldSuggestReadingMode( browser(), future.GetCallback()); EXPECT_TRUE(future.Wait()); EXPECT_FALSE(future.Get()); + histogram_tester.ExpectUniqueSample( + "Accessibility.ReadAnything.OmniboxChipDecision", + ReadAnythingOmniboxChipDecision::kHideOptimizationGuide, 1); } IN_PROC_BROWSER_TEST_P(ReadAnythingEntryPointControllerOmniboxBrowserTest, @@ -536,11 +553,15 @@ ASSERT_TRUE(pdf_extension_test_util::EnsurePDFHasLoaded(web_contents)); base::test::TestFuture<bool> future; + base::HistogramTester histogram_tester; ReadAnythingEntryPointController::CheckIfShouldSuggestReadingMode( browser(), future.GetCallback()); EXPECT_TRUE(future.Wait()); EXPECT_TRUE(future.Get()); + histogram_tester.ExpectUniqueSample( + "Accessibility.ReadAnything.OmniboxChipDecision", + ReadAnythingOmniboxChipDecision::kShowPdf, 1); } IN_PROC_BROWSER_TEST_P( @@ -554,11 +575,15 @@ ASSERT_TRUE(pdf_extension_test_util::EnsurePDFHasLoaded(web_contents)); base::test::TestFuture<bool> future; + base::HistogramTester histogram_tester; ReadAnythingEntryPointController::CheckIfShouldSuggestReadingMode( browser(), future.GetCallback()); EXPECT_TRUE(future.Wait()); EXPECT_FALSE(future.Get()); + histogram_tester.ExpectUniqueSample( + "Accessibility.ReadAnything.OmniboxChipDecision", + ReadAnythingOmniboxChipDecision::kHideShortPdf, 1); } IN_PROC_BROWSER_TEST_P( @@ -574,11 +599,15 @@ ASSERT_TRUE(pdf_extension_test_util::EnsurePDFHasLoaded(web_contents)); base::test::TestFuture<bool> future; + base::HistogramTester histogram_tester; ReadAnythingEntryPointController::CheckIfShouldSuggestReadingMode( browser(), future.GetCallback()); EXPECT_TRUE(future.Wait()); EXPECT_FALSE(future.Get()); + histogram_tester.ExpectUniqueSample( + "Accessibility.ReadAnything.OmniboxChipDecision", + ReadAnythingOmniboxChipDecision::kHideLowAlphabeticPdf, 1); } IN_PROC_BROWSER_TEST_P(ReadAnythingEntryPointControllerOmniboxBrowserTest, @@ -587,11 +616,15 @@ ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL))); base::test::TestFuture<bool> future; + base::HistogramTester histogram_tester; ReadAnythingEntryPointController::CheckIfShouldSuggestReadingMode( browser(), future.GetCallback()); EXPECT_TRUE(future.Wait()); EXPECT_FALSE(future.Get()); + histogram_tester.ExpectUniqueSample( + "Accessibility.ReadAnything.OmniboxChipDecision", + ReadAnythingOmniboxChipDecision::kHideNonHttp, 1); } IN_PROC_BROWSER_TEST_P( @@ -601,11 +634,15 @@ browser(), GURL("https://www.docs.google.com"))); base::test::TestFuture<bool> future; + base::HistogramTester histogram_tester; ReadAnythingEntryPointController::CheckIfShouldSuggestReadingMode( browser(), future.GetCallback()); EXPECT_TRUE(future.Wait()); EXPECT_FALSE(future.Get()); + histogram_tester.ExpectUniqueSample( + "Accessibility.ReadAnything.OmniboxChipDecision", + ReadAnythingOmniboxChipDecision::kHideDenyList, 1); } IN_PROC_BROWSER_TEST_P(ReadAnythingEntryPointControllerOmniboxBrowserTest,
diff --git a/chrome/browser/ui/read_anything/read_anything_enums.h b/chrome/browser/ui/read_anything/read_anything_enums.h index 67be44ae..2a2b4353 100644 --- a/chrome/browser/ui/read_anything/read_anything_enums.h +++ b/chrome/browser/ui/read_anything/read_anything_enums.h
@@ -37,6 +37,23 @@ kMaxValue = kPageChangedSoftNavigation, }; +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +// LINT.IfChange(ReadAnythingOmniboxChipDecision) +enum class ReadAnythingOmniboxChipDecision { + kShowArticle = 0, + kShowPdf = 1, + kHideAppWindow = 2, + kHideNonHttp = 3, + kHideDenyList = 4, + kHideOptimizationGuide = 5, + kHideReadability = 6, + kHideShortPdf = 7, + kHideLowAlphabeticPdf = 8, + kMaxValue = kHideLowAlphabeticPdf, +}; +// LINT.ThenChange(//tools/metrics/histograms/enums.xml:ReadAnythingOmniboxChipDecision) + namespace read_anything { inline SidePanelOpenTrigger ReadAnythingToSidePanelOpenTrigger(
diff --git a/chrome/browser/ui/read_anything/read_anything_immersive_overlay_view.cc b/chrome/browser/ui/read_anything/read_anything_immersive_overlay_view.cc index 16b914a..c486231 100644 --- a/chrome/browser/ui/read_anything/read_anything_immersive_overlay_view.cc +++ b/chrome/browser/ui/read_anything/read_anything_immersive_overlay_view.cc
@@ -133,6 +133,11 @@ contents_web_view_->GetViewAccessibility().SetIsIgnored(true); contents_web_view_->GetViewAccessibility().SetIsLeaf(true); contents_web_view_->SetFocusBehavior(views::View::FocusBehavior::NEVER); + + DUMP_WILL_BE_CHECK(immersive_web_view_); + if (immersive_web_view_) { + immersive_web_view_->RequestFocus(); + } } std::unique_ptr<WebUIContentsWrapperT<ReadAnythingUntrustedUI>>
diff --git a/chrome/browser/ui/read_anything/read_anything_immersive_web_view.cc b/chrome/browser/ui/read_anything/read_anything_immersive_web_view.cc index 3ac33af..ab438fc 100644 --- a/chrome/browser/ui/read_anything/read_anything_immersive_web_view.cc +++ b/chrome/browser/ui/read_anything/read_anything_immersive_web_view.cc
@@ -7,6 +7,7 @@ #include <utility> #include "base/check.h" +#include "base/task/single_thread_task_runner.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser_window/public/browser_window_interface.h" #include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h" @@ -37,7 +38,9 @@ auto* controller = ReadAnythingControllerGlue::FromWebContents(web_contents())->controller(); if (controller && controller->has_shown_ui()) { - ShowUI(); + base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, base::BindOnce(&ReadAnythingImmersiveWebView::ShowUI, + weak_factory_.GetWeakPtr())); } } @@ -95,10 +98,12 @@ // Called by the WebUI on its embedder (this class) when the WebUI is ready to // be shown. void ReadAnythingImmersiveWebView::ShowUI() { + // Call SetVisible before running on_show_ui_callback_, in case the callback + // relies on the visibility of the view. + SetVisible(true); if (on_show_ui_callback_) { std::move(on_show_ui_callback_).Run(); } - SetVisible(true); auto* read_anything_controller = ReadAnythingControllerGlue::FromWebContents( contents_wrapper_->web_contents()) ->controller();
diff --git a/chrome/browser/ui/search_engines/keyword_editor_controller.cc b/chrome/browser/ui/search_engines/keyword_editor_controller.cc index e869fd8..7794824 100644 --- a/chrome/browser/ui/search_engines/keyword_editor_controller.cc +++ b/chrome/browser/ui/search_engines/keyword_editor_controller.cc
@@ -24,31 +24,36 @@ AimEligibilityServiceFactory::GetForProfile(profile)); table_model_ = std::make_unique<TemplateURLTableModel>( url_model_, internal::GetDisabledStarterPackIds(ai_mode_enabled)); + scoped_url_service_observation_.Observe(url_model_.get()); + OnTemplateURLServiceChanged(); } KeywordEditorController::~KeywordEditorController() = default; -int KeywordEditorController::AddTemplateURL(const std::u16string& title, - const std::u16string& keyword, - const std::string& url) { - DCHECK(!url.empty()); +TemplateURLID KeywordEditorController::AddTemplateURL( + const std::u16string& title, + const std::u16string& keyword, + const std::string& url) { + CHECK(!url.empty()); base::RecordAction(UserMetricsAction("KeywordEditor_AddKeyword")); - const int new_index = table_model_->last_other_engine_index(); - table_model_->Add(new_index, title, keyword, url); - - return new_index; + TemplateURLData data; + data.SetShortName(title); + data.SetKeyword(keyword); + data.SetURL(url); + data.is_active = TemplateURLData::ActiveStatus::kTrue; + TemplateURL* template_url = + url_model_->Add(std::make_unique<TemplateURL>(data)); + return template_url->id(); } void KeywordEditorController::ModifyTemplateURL(TemplateURL* template_url, const std::u16string& title, const std::u16string& keyword, const std::string& url) { - DCHECK(!url.empty()); - const std::optional<size_t> index = - table_model_->IndexOfTemplateURL(template_url); - if (!index.has_value()) { + CHECK(!url.empty()); + if (!template_url) { // Will happen if url was deleted out from under us while the user was // editing it. return; @@ -60,7 +65,10 @@ return; } - table_model_->ModifyTemplateURL(index.value(), title, keyword, url); + // The default search provider should support replacement. + CHECK(url_model_->GetDefaultSearchProvider() != template_url || + template_url->SupportsReplacement(url_model_->search_terms_data())); + url_model_->ResetTemplateURL(template_url, title, keyword, url); base::RecordAction(UserMetricsAction("KeywordEditor_ModifiedKeyword")); } @@ -110,8 +118,13 @@ url->CreatedByNonDefaultSearchProviderPolicy(); } -void KeywordEditorController::RemoveTemplateURL(int index) { - table_model_->Remove(index); +void KeywordEditorController::RemoveTemplateURL(TemplateURLID id) { + TemplateURL* template_url = GetTemplateURL(id); + if (!template_url) { + return; + } + + url_model_->Remove(template_url); base::RecordAction(UserMetricsAction("KeywordEditor_RemoveKeyword")); } @@ -120,20 +133,46 @@ } void KeywordEditorController::MakeDefaultTemplateURL( - int index, + TemplateURLID id, search_engines::ChoiceMadeLocation choice_location) { - table_model_->MakeDefaultTemplateURL(index, choice_location); + TemplateURL* template_url = GetTemplateURL(id); + if (!template_url || template_url == url_model_->GetDefaultSearchProvider()) { + return; + } + + url_model_->SetUserSelectedDefaultSearchProvider(template_url, + choice_location); } -void KeywordEditorController::SetIsActiveTemplateURL(int index, +void KeywordEditorController::SetIsActiveTemplateURL(TemplateURLID id, bool is_active) { - table_model_->SetIsActiveTemplateURL(index, is_active); + TemplateURL* template_url = GetTemplateURL(id); + if (!template_url) { + return; + } + + url_model_->SetIsActiveTemplateURL(template_url, is_active); } bool KeywordEditorController::loaded() const { return url_model_->loaded(); } -TemplateURL* KeywordEditorController::GetTemplateURL(int index) { +TemplateURL* KeywordEditorController::GetTemplateURL(TemplateURLID id) { + auto it = id_to_turl_.find(id); + return it == id_to_turl_.end() ? nullptr : it->second; +} + +TemplateURL* KeywordEditorController::GetTemplateURLForIndex(int index) { return table_model_->GetTemplateURL(index); } + +void KeywordEditorController::OnTemplateURLServiceChanged() { + TemplateURLService::TemplateURLVector urls = url_model_->GetTemplateURLs(); + id_to_turl_.clear(); + id_to_turl_.reserve(urls.size()); + + for (const auto& url : url_model_->GetTemplateURLs()) { + id_to_turl_[url->id()] = url; + } +}
diff --git a/chrome/browser/ui/search_engines/keyword_editor_controller.h b/chrome/browser/ui/search_engines/keyword_editor_controller.h index 755538b..fd0c3a2 100644 --- a/chrome/browser/ui/search_engines/keyword_editor_controller.h +++ b/chrome/browser/ui/search_engines/keyword_editor_controller.h
@@ -9,6 +9,10 @@ #include <string> #include "base/memory/raw_ptr.h" +#include "base/scoped_observation.h" +#include "components/search_engines/template_url_id.h" +#include "components/search_engines/template_url_service_observer.h" +#include "third_party/abseil-cpp/absl/container/flat_hash_map.h" class Profile; class TemplateURL; @@ -19,21 +23,21 @@ enum class ChoiceMadeLocation; } -class KeywordEditorController { +class KeywordEditorController : public TemplateURLServiceObserver { public: explicit KeywordEditorController(Profile* profile); KeywordEditorController(const KeywordEditorController&) = delete; KeywordEditorController& operator=(const KeywordEditorController&) = delete; - ~KeywordEditorController(); + ~KeywordEditorController() override; - // Invoked when the user succesfully fills out the add keyword dialog. + // Invoked when the user successfully fills out the add keyword dialog. // Propagates the change to the TemplateURLService and updates the table - // model. Returns the index of the added URL. - int AddTemplateURL(const std::u16string& title, - const std::u16string& keyword, - const std::string& url); + // model. Returns the id of the added URL. + TemplateURLID AddTemplateURL(const std::u16string& title, + const std::u16string& keyword, + const std::string& url); // Invoked when the user modifies a TemplateURL. Updates the // TemplateURLService and table model appropriately. @@ -69,35 +73,47 @@ // Return true if a search engine is managed by policy. bool IsManaged(const TemplateURL* url) const; - // Remove the TemplateURL at the specified index in the TableModel. - void RemoveTemplateURL(int index); + // Remove the TemplateURL with the specified id. + void RemoveTemplateURL(TemplateURLID id); // Returns the default search provider. const TemplateURL* GetDefaultSearchProvider(); - // Make the TemplateURL at the specified index (into the TableModel) the - // default search provider. + // Make the TemplateURL with the specified id the default search provider. void MakeDefaultTemplateURL( - int index, + TemplateURLID id, search_engines::ChoiceMadeLocation choice_location); - // Activates the TemplateURL at the specified index in the TableModel if - // `is_active` is true or deactivates it if false. - void SetIsActiveTemplateURL(int index, bool is_active); + // Activates the TemplateURL with the specified id if `is_active` is true or + // deactivates it if false. + void SetIsActiveTemplateURL(TemplateURLID id, bool is_active); // Return true if the |url_model_| data is loaded. bool loaded() const; - // Return the TemplateURL corresponding to the |index| in the model. - TemplateURL* GetTemplateURL(int index); + // Return the TemplateURL corresponding to the `id`. Returns + // `nullptr` if the id was not found. + TemplateURL* GetTemplateURL(TemplateURLID id); + + // Return the TemplateURL corresponding to the `index` in the table model. + TemplateURL* GetTemplateURLForIndex(int index); TemplateURLTableModel* table_model() { return table_model_.get(); } + // TemplateURLServiceObserver notification. + void OnTemplateURLServiceChanged() override; + private: raw_ptr<TemplateURLService> url_model_; + // Mapping from IDs to the TemplateURL. + absl::flat_hash_map<TemplateURLID, TemplateURL*> id_to_turl_; + // Model for the TableView. std::unique_ptr<TemplateURLTableModel> table_model_; + + base::ScopedObservation<TemplateURLService, TemplateURLServiceObserver> + scoped_url_service_observation_{this}; }; #endif // CHROME_BROWSER_UI_SEARCH_ENGINES_KEYWORD_EDITOR_CONTROLLER_H_
diff --git a/chrome/browser/ui/search_engines/keyword_editor_controller_unittest.cc b/chrome/browser/ui/search_engines/keyword_editor_controller_unittest.cc index 0e17d8d..f2c2504 100644 --- a/chrome/browser/ui/search_engines/keyword_editor_controller_unittest.cc +++ b/chrome/browser/ui/search_engines/keyword_editor_controller_unittest.cc
@@ -9,6 +9,7 @@ #include <string> #include "base/compiler_specific.h" +#include "base/i18n/rtl.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/search_engines/template_url_service_factory_test_util.h" @@ -199,12 +200,12 @@ // Tests removing a TemplateURL. TEST_F(KeywordEditorControllerTest, Remove) { - int index = controller()->AddTemplateURL(kA, kB, "http://c"); + TemplateURLID id = controller()->AddTemplateURL(kA, kB, "http://c"); auto original_size = util()->model()->GetTemplateURLs().size(); ClearChangeCount(); // Remove the entry. - controller()->RemoveTemplateURL(index); + controller()->RemoveTemplateURL(id); // Make sure it was deleted appropriately. VerifyChanged(); @@ -230,8 +231,7 @@ ClearChangeCount(); // Remove the entry. - int index = table_model()->IndexOfTemplateURL(turl).value(); - controller()->RemoveTemplateURL(index); + controller()->RemoveTemplateURL(turl->id()); // Make sure it was deleted appropriately. VerifyChanged(); @@ -252,12 +252,13 @@ // Tests making a TemplateURL the default search provider. TEST_F(KeywordEditorControllerTest, MakeDefault) { - int index = controller()->AddTemplateURL(kA, kB, "http://c{searchTerms}"); + TemplateURLID id = + controller()->AddTemplateURL(kA, kB, "http://c{searchTerms}"); ClearChangeCount(); const TemplateURL* turl = util()->model()->GetTemplateURLForKeyword(kB); controller()->MakeDefaultTemplateURL( - index, search_engines::ChoiceMadeLocation::kOther); + id, search_engines::ChoiceMadeLocation::kOther); // Making an item the default sends a handful of changes. Which are sent isn't // important, what is important is 'something' is sent. VerifyChanged(); @@ -265,7 +266,7 @@ // Making it default a second time should fail. controller()->MakeDefaultTemplateURL( - index, search_engines::ChoiceMadeLocation::kOther); + id, search_engines::ChoiceMadeLocation::kOther); EXPECT_EQ(turl, util()->model()->GetDefaultSearchProvider()); } @@ -315,7 +316,8 @@ EXPECT_FALSE( controller()->IsManaged(util()->model()->GetDefaultSearchProvider())); - int index = controller()->AddTemplateURL(kA1, kB1, "http://d{searchTerms}"); + TemplateURLID id = + controller()->AddTemplateURL(kA1, kB1, "http://d{searchTerms}"); ClearChangeCount(); const TemplateURL* turl2 = util()->model()->GetTemplateURLForKeyword(kB1); ASSERT_NE(turl2, nullptr); @@ -324,7 +326,7 @@ // Update the default search provider. EXPECT_NE(turl2, util()->model()->GetDefaultSearchProvider()); controller()->MakeDefaultTemplateURL( - index, search_engines::ChoiceMadeLocation::kOther); + id, search_engines::ChoiceMadeLocation::kOther); VerifyChanged(); EXPECT_EQ(turl2, util()->model()->GetDefaultSearchProvider()); @@ -437,12 +439,13 @@ } TEST_F(KeywordEditorControllerNoWebDataTest, MakeDefaultNoWebData) { - int index = controller()->AddTemplateURL(kA, kB, "http://c{searchTerms}"); + TemplateURLID id = + controller()->AddTemplateURL(kA, kB, "http://c{searchTerms}"); ClearChangeCount(); // This should not result in a crash. controller()->MakeDefaultTemplateURL( - index, search_engines::ChoiceMadeLocation::kOther); + id, search_engines::ChoiceMadeLocation::kOther); const TemplateURL* turl = util()->model()->GetTemplateURLForKeyword(kB); EXPECT_EQ(turl, util()->model()->GetDefaultSearchProvider()); } @@ -616,7 +619,8 @@ const std::vector<std::u16string>& kExpectedShortNamesOrder, const std::vector<std::u16string>& kExpectedKeywordsToDisplay, size_t numExpectedKeywords, - TemplateURLTableModel* table_model) { + TemplateURLTableModel* table_model, + KeywordEditorController* controller) { ASSERT_TRUE(table_model); ASSERT_EQ(table_model->last_active_engine_index(), table_model->last_search_engine_index() + numExpectedKeywords); @@ -628,9 +632,9 @@ const TemplateURL* template_url = table_model->GetTemplateURL(row); ASSERT_TRUE(template_url); EXPECT_EQ(template_url->short_name(), kExpectedShortNamesOrder[i]); - EXPECT_EQ( - table_model->GetText(row, IDS_SEARCH_ENGINES_EDITOR_KEYWORD_COLUMN), - kExpectedKeywordsToDisplay[i]); + EXPECT_EQ(base::i18n::GetDisplayStringInLTRDirectionality( + template_url->keyword()), + kExpectedKeywordsToDisplay[i]); } } @@ -697,7 +701,7 @@ size_t numExpectedKeywords = kExpectedShortNamesOrder.size(); CheckKeywordsToDisplay(kExpectedShortNamesOrder, kExpectedKeywordsToDisplay, - numExpectedKeywords, table_model()); + numExpectedKeywords, table_model(), controller()); } TEST_F(KeywordEditorControllerTest, @@ -786,7 +790,7 @@ size_t numExpectedKeywords = std::size(kExpectedShortNamesOrder); CheckKeywordsToDisplay(kExpectedShortNamesOrder, kExpectedKeywordsToDisplay, - numExpectedKeywords, table_model()); + numExpectedKeywords, table_model(), controller()); } TEST_F(KeywordEditorControllerTest, EnterpriseSearchAggregator) { @@ -829,7 +833,7 @@ size_t numExpectedKeywords = kExpectedShortNamesOrder.size(); CheckKeywordsToDisplay(kExpectedShortNamesOrder, kExpectedKeywordsToDisplay, - numExpectedKeywords, table_model()); + numExpectedKeywords, table_model(), controller()); } TEST_F(KeywordEditorControllerTest, @@ -897,7 +901,7 @@ size_t numExpectedKeywords = kExpectedShortNamesOrder.size(); CheckKeywordsToDisplay(kExpectedShortNamesOrder, kExpectedKeywordsToDisplay, - numExpectedKeywords, table_model()); + numExpectedKeywords, table_model(), controller()); } TEST_F(KeywordEditorControllerTest, EnterpriseSiteSearchAndSearchAggregator) { @@ -955,5 +959,5 @@ size_t numExpectedKeywords = kExpectedShortNamesOrder.size(); CheckKeywordsToDisplay(kExpectedShortNamesOrder, kExpectedKeywordsToDisplay, - numExpectedKeywords, table_model()); + numExpectedKeywords, table_model(), controller()); }
diff --git a/chrome/browser/ui/search_engines/template_url_table_model.cc b/chrome/browser/ui/search_engines/template_url_table_model.cc index 5ad2adf..e977dd8c 100644 --- a/chrome/browser/ui/search_engines/template_url_table_model.cc +++ b/chrome/browser/ui/search_engines/template_url_table_model.cc
@@ -90,23 +90,7 @@ } std::u16string TemplateURLTableModel::GetText(size_t row, int col_id) { - DCHECK(row < RowCount()); - const TemplateURL* url = entries_[row]; - if (col_id == IDS_SEARCH_ENGINES_EDITOR_DESCRIPTION_COLUMN) { - std::u16string url_short_name = url->short_name(); - // TODO(xji): Consider adding a special case if the short name is a URL, - // since those should always be displayed LTR. Please refer to - // http://crbug.com/6726 for more information. - base::i18n::AdjustStringForLocaleDirection(&url_short_name); - return (template_url_service_->GetDefaultSearchProvider() == url) - ? l10n_util::GetStringFUTF16( - IDS_SEARCH_ENGINES_EDITOR_DEFAULT_ENGINE, url_short_name) - : url_short_name; - } - - DCHECK_EQ(IDS_SEARCH_ENGINES_EDITOR_KEYWORD_COLUMN, col_id); - // Keyword should be domain name. Force it to have LTR directionality. - return base::i18n::GetDisplayStringInLTRDirectionality(url->keyword()); + NOTREACHED(); } void TemplateURLTableModel::SetObserver(ui::TableModelObserver* observer) {
diff --git a/chrome/browser/ui/startup/BUILD.gn b/chrome/browser/ui/startup/BUILD.gn index 66847f85..db85b22 100644 --- a/chrome/browser/ui/startup/BUILD.gn +++ b/chrome/browser/ui/startup/BUILD.gn
@@ -49,6 +49,7 @@ "profile_launch_observer.h", "startup_browser_creator.h", "startup_browser_creator_impl.h", + "startup_infobar_observer.h", "startup_tab_provider.h", "startup_types.h", ] @@ -60,6 +61,7 @@ "//chrome/browser/search_integrity", "//chrome/browser/sessions", "//chrome/browser/ui/browser_window", + "//chrome/browser/ui/tabs:tab_strip_model_observer", "//components/infobars/content", "//components/signin/public/base:signin_buildflags", ] @@ -185,6 +187,7 @@ "profile_launch_observer.cc", "startup_browser_creator.cc", "startup_browser_creator_impl.cc", + "startup_infobar_observer.cc", "startup_tab_provider.cc", ] deps += [ @@ -386,6 +389,7 @@ "launch_mode_recorder_unittest.cc", "startup_browser_creator_impl_unittest.cc", "startup_browser_creator_unittest.cc", + "startup_infobar_observer_unittest.cc", "startup_tab_provider_unittest.cc", ] deps += [ @@ -396,6 +400,7 @@ "//chrome/browser/prefs:util", "//chrome/browser/search_engines", "//chrome/browser/ui/startup/focus:unit_tests", + "//chrome/browser/ui/tabs:test_support", "//chrome/common", "//chrome/common:non_code_constants", "//chrome/common:version_header",
diff --git a/chrome/browser/ui/startup/infobar_utils.cc b/chrome/browser/ui/startup/infobar_utils.cc index 57d7394..505e8669 100644 --- a/chrome/browser/ui/startup/infobar_utils.cc +++ b/chrome/browser/ui/startup/infobar_utils.cc
@@ -13,7 +13,6 @@ #include "chrome/browser/obsolete_system/obsolete_system.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/browser_window/public/browser_window_features.h" #include "chrome/browser/ui/browser_window/public/browser_window_interface.h" #include "chrome/browser/ui/session_crashed_bubble.h" #include "chrome/browser/ui/startup/automation_infobar_delegate.h" @@ -111,8 +110,7 @@ bool is_web_app, bool is_post_crash_launch, bool was_restarted) { - if (!browser || !profile || - browser->GetFeatures().tab_strip_model()->count() == 0) { + if (!browser || !profile || browser->GetTabStripModel()->empty()) { return; } @@ -120,7 +118,7 @@ bool show_bad_flags_security_warnings = ShouldShowBadFlagsSecurityWarnings(); content::WebContents* web_contents = - browser->GetFeatures().tab_strip_model()->GetActiveWebContents(); + browser->GetTabStripModel()->GetActiveWebContents(); DCHECK(web_contents); if (show_bad_flags_security_warnings) {
diff --git a/chrome/browser/ui/startup/startup_browser_creator_impl.cc b/chrome/browser/ui/startup/startup_browser_creator_impl.cc index d17f433c..2a518de 100644 --- a/chrome/browser/ui/startup/startup_browser_creator_impl.cc +++ b/chrome/browser/ui/startup/startup_browser_creator_impl.cc
@@ -16,6 +16,7 @@ #include "base/debug/dump_without_crashing.h" #include "base/functional/bind.h" #include "base/notreached.h" +#include "base/supports_user_data.h" #include "base/version.h" #include "build/build_config.h" #include "chrome/browser/apps/platform_apps/install_chrome_app.h" @@ -46,6 +47,7 @@ #include "chrome/browser/ui/browser_window/public/global_browser_collection.h" #include "chrome/browser/ui/startup/infobar_utils.h" #include "chrome/browser/ui/startup/startup_browser_creator.h" +#include "chrome/browser/ui/startup/startup_infobar_observer.h" #include "chrome/browser/ui/startup/startup_tab.h" #include "chrome/browser/ui/startup/startup_tab_provider.h" #include "chrome/browser/ui/startup/startup_types.h" @@ -418,6 +420,26 @@ const bool is_incognito_or_guest = profile_->IsOffTheRecord(); bool is_post_crash_launch = HasPendingUncleanExit(profile_); + // Defer adding info bars until the browser window is ready. The observer + // will delete itself once the infobars are added. + // It is safe to store Profile* in the callback as callback will be destroyed + // upon Profile teardown. + StartupInfoBarObserver::AddInfoBarsCallback add_infobars_callback = + base::BindOnce( + [](const base::CommandLine& startup_command_line, + chrome::startup::IsFirstRun is_first_run, + bool is_post_crash_launch, bool was_restarted, Profile* profile, + BrowserWindowInterface* browser) { + AddInfoBarsIfNecessary(browser, profile, startup_command_line, + is_first_run, /*is_web_app=*/false, + is_post_crash_launch, was_restarted); + }, + *command_line_, is_first_run_, is_post_crash_launch, + StartupBrowserCreator::WasRestarted(), base::Unretained(profile_)); + + StartupInfoBarObserver::ObserveProfile(*profile_, + std::move(add_infobars_callback)); + // Presentation of promotional and/or educational tabs may be controlled via // administrative policy. bool promotions_enabled = true; @@ -490,11 +512,6 @@ Browser* browser = RestoreOrCreateBrowser( tabs, behavior, restore_options, process_startup, is_post_crash_launch); - // Finally, add info bars. - AddInfoBarsIfNecessary(browser, profile_, *command_line_, is_first_run_, - /*is_web_app=*/false, is_post_crash_launch, - StartupBrowserCreator::WasRestarted()); - tab_groups::MaybeShowSharedTabGroupVersionOutOfDateModal(browser); tab_groups::MaybeShowSharedTabGroupVersionUpToDateToast(browser);
diff --git a/chrome/browser/ui/startup/startup_infobar_observer.cc b/chrome/browser/ui/startup/startup_infobar_observer.cc new file mode 100644 index 0000000..5e953b0 --- /dev/null +++ b/chrome/browser/ui/startup/startup_infobar_observer.cc
@@ -0,0 +1,83 @@ +// Copyright 2026 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/startup/startup_infobar_observer.h" + +#include <utility> + +#include "base/memory/ptr_util.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/browser_window/public/browser_window_interface.h" +#include "chrome/browser/ui/tabs/tab_strip_model.h" + +StartupInfoBarObserver::StartupInfoBarObserver( + Profile& profile, + ProfileBrowserCollection& profile_browser_collection, + AddInfoBarsCallback callback) + : profile_(profile), add_infobars_callback_(std::move(callback)) { + profile_observation_.Observe(&profile); + browser_collection_observation_.Observe(&profile_browser_collection); +} + +StartupInfoBarObserver::~StartupInfoBarObserver() = default; + +// static +void StartupInfoBarObserver::ObserveProfile(Profile& profile, + AddInfoBarsCallback callback) { + auto* collection = ProfileBrowserCollection::GetForProfile(&profile); + if (!profile.AllowsBrowserWindows() || !collection) { + return; + } + profile.SetUserData(&kStartupInfoBarObserverKey, + base::WrapUnique(new StartupInfoBarObserver( + profile, *collection, std::move(callback)))); +} + +void StartupInfoBarObserver::OnBrowserCreated(BrowserWindowInterface* browser) { + browser_ = browser; + browser_collection_observation_.Reset(); + + if (browser->GetTabStripModel()->empty()) { + // The browser doesn't contain any tabs yet, wait for the first tab to be + // inserted. + browser_->GetTabStripModel()->AddObserver(this); + return; + } + AddInfoBarsAndReset(); +} + +void StartupInfoBarObserver::OnTabStripModelChanged( + TabStripModel* tab_strip_model, + const TabStripModelChange& change, + const TabStripSelectionChange& selection) { + if (change.type() != TabStripModelChange::kInserted) { + return; + } + + AddInfoBarsAndReset(); +} + +void StartupInfoBarObserver::OnTabStripModelDestroyed( + TabStripModel* tab_strip_model) { + // If TabStripModel is being destroyed before we can add infobars, reset + // observations and delete this object. + Reset(); +} + +void StartupInfoBarObserver::OnProfileWillBeDestroyed(Profile* profile) { + // Corresponding observation lists get destroyed before UserData, so we need + // to remove ourselves as observers here. + browser_collection_observation_.Reset(); + profile_observation_.Reset(); +} + +void StartupInfoBarObserver::Reset() { + // This will securely destroy `this` and invoke the destructor. + profile_->RemoveUserData(&kStartupInfoBarObserverKey); +} + +void StartupInfoBarObserver::AddInfoBarsAndReset() { + std::move(add_infobars_callback_).Run(browser_); + Reset(); +}
diff --git a/chrome/browser/ui/startup/startup_infobar_observer.h b/chrome/browser/ui/startup/startup_infobar_observer.h new file mode 100644 index 0000000..ce051ad6 --- /dev/null +++ b/chrome/browser/ui/startup/startup_infobar_observer.h
@@ -0,0 +1,75 @@ +// Copyright 2026 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_STARTUP_STARTUP_INFOBAR_OBSERVER_H_ +#define CHROME_BROWSER_UI_STARTUP_STARTUP_INFOBAR_OBSERVER_H_ + +#include "base/functional/callback_forward.h" +#include "base/memory/raw_ptr.h" +#include "base/memory/raw_ref.h" +#include "base/scoped_observation.h" +#include "base/supports_user_data.h" +#include "chrome/browser/profiles/profile_observer.h" +#include "chrome/browser/ui/browser_window/public/browser_collection_observer.h" +#include "chrome/browser/ui/browser_window/public/profile_browser_collection.h" +#include "chrome/browser/ui/tabs/tab_strip_model_observer.h" + +class BrowserWindowInterface; +class Profile; +class TabStripModel; + +// This class is responsible for running a callback that adds infobar on the +// the next browser created with the provided Profile. +class StartupInfoBarObserver : public BrowserCollectionObserver, + public TabStripModelObserver, + public ProfileObserver, + public base::SupportsUserData::Data { + public: + static constexpr char kStartupInfoBarObserverKey[] = + "startup-infobar-observer"; + + using AddInfoBarsCallback = base::OnceCallback<void(BrowserWindowInterface*)>; + + ~StartupInfoBarObserver() override; + + StartupInfoBarObserver(const StartupInfoBarObserver&) = delete; + StartupInfoBarObserver& operator=(const StartupInfoBarObserver&) = delete; + + // Factory method for checking if the profile if eligible, creating the + // observer and adding to Profile UserData. + static void ObserveProfile(Profile& profile, AddInfoBarsCallback callback); + + // BrowserCollectionObserver: + void OnBrowserCreated(BrowserWindowInterface* browser) override; + + // TabStripModelObserver: + void OnTabStripModelChanged( + TabStripModel* tab_strip_model, + const TabStripModelChange& change, + const TabStripSelectionChange& selection) override; + void OnTabStripModelDestroyed(TabStripModel* tab_strip_model) override; + + // ProfileObserver: + void OnProfileWillBeDestroyed(Profile* profile) override; + + private: + StartupInfoBarObserver(Profile& profile, + ProfileBrowserCollection& profile_browser_collection, + AddInfoBarsCallback callback); + + void AddInfoBarsAndReset(); + void Reset(); + + const raw_ref<Profile> profile_; + raw_ptr<BrowserWindowInterface> browser_ = nullptr; + + AddInfoBarsCallback add_infobars_callback_; + + base::ScopedObservation<ProfileBrowserCollection, BrowserCollectionObserver> + browser_collection_observation_{this}; + + base::ScopedObservation<Profile, ProfileObserver> profile_observation_{this}; +}; + +#endif // CHROME_BROWSER_UI_STARTUP_STARTUP_INFOBAR_OBSERVER_H_
diff --git a/chrome/browser/ui/startup/startup_infobar_observer_unittest.cc b/chrome/browser/ui/startup/startup_infobar_observer_unittest.cc new file mode 100644 index 0000000..e1a6e4c4 --- /dev/null +++ b/chrome/browser/ui/startup/startup_infobar_observer_unittest.cc
@@ -0,0 +1,132 @@ +// Copyright 2026 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/startup/startup_infobar_observer.h" + +#include <memory> +#include <utility> + +#include "base/test/test_future.h" +#include "chrome/browser/ui/browser_window/public/browser_window_features.h" +#include "chrome/browser/ui/browser_window/test/mock_browser_window_interface.h" +#include "chrome/browser/ui/tabs/tab_model.h" +#include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/browser/ui/tabs/test_tab_strip_model_delegate.h" +#include "chrome/test/base/testing_profile.h" +#include "content/public/test/browser_task_environment.h" +#include "content/public/test/test_renderer_host.h" +#include "content/public/test/web_contents_tester.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/base/unowned_user_data/unowned_user_data_host.h" + +using testing::Return; +using testing::ReturnRef; + +class StartupInfoBarObserverTest : public testing::Test { + protected: + StartupInfoBarObserverTest() = default; + ~StartupInfoBarObserverTest() override = default; + + void SetUp() override { + profile_ = TestingProfile::Builder().Build(); + tab_strip_model_ = std::make_unique<TabStripModel>( + &tab_strip_model_delegate_, profile_.get()); + browser_interface_ = + std::make_unique<testing::NiceMock<MockBrowserWindowInterface>>(); + tab_strip_model_delegate_.SetBrowserWindowInterface( + browser_interface_.get()); + + ON_CALL(*browser_interface_, GetTabStripModel()) + .WillByDefault(Return(tab_strip_model_.get())); + ON_CALL(static_cast<const MockBrowserWindowInterface&>(*browser_interface_), + GetUnownedUserDataHost()) + .WillByDefault(ReturnRef(user_data_host_)); + ON_CALL(*browser_interface_, GetProfile()) + .WillByDefault(Return(profile_.get())); + } + + StartupInfoBarObserver* CreateObserver( + StartupInfoBarObserver::AddInfoBarsCallback callback) { + StartupInfoBarObserver::ObserveProfile(*profile(), std::move(callback)); + + return static_cast<StartupInfoBarObserver*>(profile()->GetUserData( + &StartupInfoBarObserver::kStartupInfoBarObserverKey)); + } + + TestingProfile* profile() { return profile_.get(); } + MockBrowserWindowInterface* browser() { return browser_interface_.get(); } + TabStripModel* tab_strip_model() { return tab_strip_model_.get(); } + + private: + content::BrowserTaskEnvironment task_environment_; + content::RenderViewHostTestEnabler rvh_test_enabler_; + tabs::TabModel::PreventFeatureInitializationForTesting prevent_; + std::unique_ptr<TestingProfile> profile_; + ui::UnownedUserDataHost user_data_host_; + std::unique_ptr<MockBrowserWindowInterface> browser_interface_; + TestTabStripModelDelegate tab_strip_model_delegate_; + std::unique_ptr<TabStripModel> tab_strip_model_; +}; + +TEST_F(StartupInfoBarObserverTest, DoesNotRunOnBrowserCreated) { + base::test::TestFuture<BrowserWindowInterface*> future; + StartupInfoBarObserver* observer = CreateObserver(future.GetCallback()); + + // Browser created but empty. + observer->OnBrowserCreated(browser()); + EXPECT_FALSE(future.IsReady()); + ASSERT_NE(nullptr, profile()->GetUserData( + &StartupInfoBarObserver::kStartupInfoBarObserverKey)); +} + +TEST_F(StartupInfoBarObserverTest, RunsCallbackOnTabInserted) { + base::test::TestFuture<BrowserWindowInterface*> future; + StartupInfoBarObserver* observer = CreateObserver(future.GetCallback()); + + observer->OnBrowserCreated(browser()); + + // Adding a tab should trigger the infobar creation and delete the observer. + std::unique_ptr<content::WebContents> contents = + content::WebContentsTester::CreateTestWebContents(profile(), nullptr); + tab_strip_model()->AppendWebContents(std::move(contents), true); + + EXPECT_TRUE(future.IsReady()); + EXPECT_EQ(nullptr, profile()->GetUserData( + &StartupInfoBarObserver::kStartupInfoBarObserverKey)); +} + +TEST_F(StartupInfoBarObserverTest, HandlesTabStripModelDestruction) { + base::test::TestFuture<BrowserWindowInterface*> future; + StartupInfoBarObserver* observer = CreateObserver(future.GetCallback()); + + observer->OnBrowserCreated(browser()); + + // Destroying the tab strip model before inserting a tab should delete the + // observer. + observer->OnTabStripModelDestroyed(tab_strip_model()); + + EXPECT_FALSE(future.IsReady()); + EXPECT_EQ(nullptr, profile()->GetUserData( + &StartupInfoBarObserver::kStartupInfoBarObserverKey)); +} + +TEST_F(StartupInfoBarObserverTest, IgnoresNonInsertionTabStripChanges) { + base::test::TestFuture<BrowserWindowInterface*> future; + StartupInfoBarObserver* observer = CreateObserver(future.GetCallback()); + + observer->OnBrowserCreated(browser()); + + // Simulate a change other than kInserted. + TabStripSelectionChange selection; + TabStripModelChange change; + + observer->OnTabStripModelChanged(tab_strip_model(), change, selection); + + // Callback shouldn't trigger and observer should still be alive since the + // change wasn't kInserted. + EXPECT_FALSE(future.IsReady()); + EXPECT_NE(nullptr, profile()->GetUserData( + &StartupInfoBarObserver::kStartupInfoBarObserverKey)); +}
diff --git a/chrome/browser/ui/tabs/tab_strip_api/tab_strip_model_impl/converters/tab_converters.cc b/chrome/browser/ui/tabs/tab_strip_api/tab_strip_model_impl/converters/tab_converters.cc index af21843..4e35966 100644 --- a/chrome/browser/ui/tabs/tab_strip_api/tab_strip_model_impl/converters/tab_converters.cc +++ b/chrome/browser/ui/tabs/tab_strip_api/tab_strip_model_impl/converters/tab_converters.cc
@@ -153,11 +153,6 @@ result->last_active_elapsed_text = base::UTF16ToUTF8(ui::TimeFormat::Simple( ui::TimeFormat::FORMAT_ELAPSED, ui::TimeFormat::LENGTH_SHORT, base::TimeTicks::Now() - result->last_active_time_ticks)); - - result->last_active_time_ticks = - std::max(contents->GetLastInteractionTimeTicks(), - contents->GetLastActiveTimeTicks()); - return result; }
diff --git a/chrome/browser/ui/tabs/tab_strip_api/tab_strip_model_impl/tab_strip_model_adapter_impl.cc b/chrome/browser/ui/tabs/tab_strip_api/tab_strip_model_impl/tab_strip_model_adapter_impl.cc index 0920f62..c898914 100644 --- a/chrome/browser/ui/tabs/tab_strip_api/tab_strip_model_impl/tab_strip_model_adapter_impl.cc +++ b/chrome/browser/ui/tabs/tab_strip_api/tab_strip_model_impl/tab_strip_model_adapter_impl.cc
@@ -72,7 +72,9 @@ } void TabStripModelAdapterImpl::CloseTab(size_t tab_index) { - tab_strip_model_->CloseWebContentsAt(tab_index, TabCloseTypes::CLOSE_NONE); + tab_strip_model_->CloseWebContentsAt( + tab_index, TabCloseTypes::CLOSE_CREATE_HISTORICAL_TAB | + TabCloseTypes::CLOSE_USER_GESTURE); } std::optional<int> TabStripModelAdapterImpl::GetIndexForHandle(
diff --git a/chrome/browser/ui/tabs/tab_strip_prefs.cc b/chrome/browser/ui/tabs/tab_strip_prefs.cc index a82eac2e..bf91f63f 100644 --- a/chrome/browser/ui/tabs/tab_strip_prefs.cc +++ b/chrome/browser/ui/tabs/tab_strip_prefs.cc
@@ -9,6 +9,7 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tab_search_feature.h" #include "chrome/browser/ui/tabs/features.h" +#include "chrome/browser/ui/tabs/vertical_tab_strip_state.h" #include "chrome/browser/ui/tabs/vertical_tab_strip_state_controller.h" #include "chrome/browser/ui/toolbar/toolbar_pref_names.h" #include "chrome/browser/ui/views/frame/browser_view.h" @@ -44,6 +45,9 @@ registry->RegisterBooleanPref(prefs::kEverythingMenuPinnedToTabstrip, true); registry->RegisterBooleanPref(prefs::kVerticalTabsEnabled, false); registry->RegisterBooleanPref(prefs::kVerticalTabsEnabledFirstTime, false); + registry->RegisterBooleanPref(prefs::kVerticalTabsCollapsedState, false); + registry->RegisterIntegerPref(prefs::kVerticalTabsUncollapsedWidth, + kVerticalTabStripDefaultUncollapsedWidth); } void MigrateTabSearchPref(PrefService* profile_prefs) {
diff --git a/chrome/browser/ui/tabs/vertical_tab_strip_state_controller.cc b/chrome/browser/ui/tabs/vertical_tab_strip_state_controller.cc index 4efd143..ee0b132a 100644 --- a/chrome/browser/ui/tabs/vertical_tab_strip_state_controller.cc +++ b/chrome/browser/ui/tabs/vertical_tab_strip_state_controller.cc
@@ -196,6 +196,7 @@ void VerticalTabStripStateController::NotifyCollapseChanged() { UpdateSessionService(); + UpdatePrefService(); UpdateCollapseActionItem(); on_collapse_changed_callback_list_.Notify(this); } @@ -253,6 +254,15 @@ } } +void VerticalTabStripStateController::UpdatePrefService() { + if (pref_service_) { + pref_service_->SetBoolean(prefs::kVerticalTabsCollapsedState, + state_.collapsed); + pref_service_->SetInteger(prefs::kVerticalTabsUncollapsedWidth, + state_.uncollapsed_width); + } +} + void VerticalTabStripStateController::UpdateCollapseActionItem() { const gfx::VectorIcon& icon = (IsCollapsed() == base::i18n::IsRTL()) ? views::kMenuOpenIcon @@ -287,6 +297,7 @@ if (browser == browser_window_) { browser_collection_observation_.Reset(); UpdateSessionService(); + UpdatePrefService(); } }
diff --git a/chrome/browser/ui/tabs/vertical_tab_strip_state_controller.h b/chrome/browser/ui/tabs/vertical_tab_strip_state_controller.h index 0fbb7a9..b6540475 100644 --- a/chrome/browser/ui/tabs/vertical_tab_strip_state_controller.h +++ b/chrome/browser/ui/tabs/vertical_tab_strip_state_controller.h
@@ -101,6 +101,10 @@ // uncollapsed width) for the associated session ID. void UpdateSessionService(); + // Updates the PrefService with the current state (collapsed status and + // uncollapsed width) for startup when session restore is not available. + void UpdatePrefService(); + // Update the Collapse Button's Action Item (kActionToggleCollapseVertical) // based on the Vertical Tab Strip's Collapse State. void UpdateCollapseActionItem();
diff --git a/chrome/browser/ui/tabs/vertical_tab_strip_state_controller_unittest.cc b/chrome/browser/ui/tabs/vertical_tab_strip_state_controller_unittest.cc index 5e2f56d..a7ded95d 100644 --- a/chrome/browser/ui/tabs/vertical_tab_strip_state_controller_unittest.cc +++ b/chrome/browser/ui/tabs/vertical_tab_strip_state_controller_unittest.cc
@@ -247,4 +247,20 @@ EXPECT_EQ(2, call_count); } +TEST_F(VerticalTabStripStateControllerTest, VerifyRecentlyUsedPrefs) { + // Initially, recently used prefs should be default. + EXPECT_FALSE(pref_service()->GetBoolean(prefs::kVerticalTabsCollapsedState)); + EXPECT_EQ(kVerticalTabStripDefaultUncollapsedWidth, + pref_service()->GetInteger(prefs::kVerticalTabsUncollapsedWidth)); + + // Change state. + controller()->SetCollapsed(true); + controller()->SetUncollapsedWidth(kUncollapsedWidth1); + + // Verify recently used prefs are updated. + EXPECT_TRUE(pref_service()->GetBoolean(prefs::kVerticalTabsCollapsedState)); + EXPECT_EQ(kUncollapsedWidth1, + pref_service()->GetInteger(prefs::kVerticalTabsUncollapsedWidth)); +} + } // namespace tabs
diff --git a/chrome/browser/ui/ui_features.cc b/chrome/browser/ui/ui_features.cc index 9715e8d..5ef2f47c 100644 --- a/chrome/browser/ui/ui_features.cc +++ b/chrome/browser/ui/ui_features.cc
@@ -148,12 +148,12 @@ kSplitViewDragAndDropMinDistanceThreshold, &kSplitViewDragAndDropVelocity, "min_distance_threshold", - 15); + 20); BASE_FEATURE_PARAM(int, kSplitViewDragAndDropMaxDistanceThreshold, &kSplitViewDragAndDropVelocity, "max_distance_threshold", - 15); + 20); BASE_FEATURE(kTabDuplicateMetrics, base::FEATURE_ENABLED_BY_DEFAULT); @@ -325,12 +325,6 @@ false); BASE_FEATURE_PARAM(bool, - kPageActionsMigrationAutofillAddress, - &kPageActionsMigration, - "autofill_address", - true); - -BASE_FEATURE_PARAM(bool, kPageActionsMigrationCollaborationMessaging, &kPageActionsMigration, "collaboration_messaging",
diff --git a/chrome/browser/ui/ui_features.h b/chrome/browser/ui/ui_features.h index 31abaad..1fb71571 100644 --- a/chrome/browser/ui/ui_features.h +++ b/chrome/browser/ui/ui_features.h
@@ -295,7 +295,6 @@ BASE_DECLARE_FEATURE_PARAM(bool, kPageActionsMigrationFileSystemAccess); BASE_DECLARE_FEATURE_PARAM(bool, kPageActionsMigrationManagePasswords); BASE_DECLARE_FEATURE_PARAM(bool, kPageActionsMigrationCookieControls); -BASE_DECLARE_FEATURE_PARAM(bool, kPageActionsMigrationAutofillAddress); BASE_DECLARE_FEATURE_PARAM(bool, kPageActionsMigrationCollaborationMessaging); BASE_DECLARE_FEATURE_PARAM(bool, kPageActionsMigrationAutofillMandatoryReauth); BASE_DECLARE_FEATURE_PARAM(bool, kPageActionsMigrationSharingHub);
diff --git a/chrome/browser/ui/views/autofill/address_bubbles_icon_view.cc b/chrome/browser/ui/views/autofill/address_bubbles_icon_view.cc deleted file mode 100644 index 170c4f09..0000000 --- a/chrome/browser/ui/views/autofill/address_bubbles_icon_view.cc +++ /dev/null
@@ -1,96 +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. - -#include "chrome/browser/ui/views/autofill/address_bubbles_icon_view.h" - -#include "chrome/app/chrome_command_ids.h" -#include "chrome/browser/ui/actions/chrome_action_id.h" -#include "chrome/browser/ui/autofill/address_bubbles_icon_controller.h" -#include "chrome/browser/ui/browser_element_identifiers.h" -#include "chrome/browser/ui/view_ids.h" -#include "chrome/browser/ui/views/autofill/address_bubble_base_view.h" -#include "chrome/browser/ui/views/promos/ios_promo_bubble.h" -#include "components/desktop_to_mobile_promos/promos_types.h" -#include "components/strings/grit/components_strings.h" -#include "components/vector_icons/vector_icons.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/base/metadata/metadata_impl_macros.h" -#include "ui/views/accessibility/view_accessibility.h" -#include "ui/views/view_class_properties.h" - -namespace autofill { - -AddressBubblesIconView::AddressBubblesIconView( - CommandUpdater* command_updater, - IconLabelBubbleView::Delegate* icon_label_bubble_delegate, - PageActionIconView::Delegate* page_action_icon_delegate) - : PageActionIconView(command_updater, - IDC_SAVE_AUTOFILL_ADDRESS, - icon_label_bubble_delegate, - page_action_icon_delegate, - "SaveAutofillAddress", - kActionShowAddressesBubbleOrPage) { - GetViewAccessibility().SetName(GetTextForTooltipAndAccessibleName()); - UpdateTooltipText(); - SetProperty(views::kElementIdentifierKey, - kAutofillAddressPageActionElementId); -} - -AddressBubblesIconView::~AddressBubblesIconView() = default; - -views::BubbleDialogDelegate* AddressBubblesIconView::GetBubble() const { - AddressBubblesIconController* controller = GetController(); - if (!controller) { - return nullptr; - } - - return static_cast<autofill::AddressBubbleBaseView*>( - controller->GetBubbleView()); -} - -void AddressBubblesIconView::UpdateImpl() { - AddressBubblesIconController* controller = GetController(); - const bool command_enabled = - SetCommandEnabled(controller && controller->IsBubbleActive()); - bool should_show = - command_enabled && !delegate()->ShouldHidePageActionIcon(this); - - // Show the icon if the Desktop to iOS address promo is currently being shown. - should_show = - should_show || IOSPromoBubble::IsPromoTypeVisible( - desktop_to_mobile_promos::PromoType::kAddress); - - SetVisible(should_show); - GetViewAccessibility().SetName(GetTextForTooltipAndAccessibleName()); - UpdateTooltipText(); -} - -std::u16string AddressBubblesIconView::GetTextForTooltipAndAccessibleName() - const { - AddressBubblesIconController* controller = GetController(); - if (!controller) { - // If the controller is nullptr, the tab has been closed already, and the - // icon will disappear soon. Return a save address prompt title to make - // sure the accessible name isn't empty to avoid test flakiness. - return l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_ADDRESS_PROMPT_TITLE); - } - return controller->GetPageActionIconTooltip(); -} - -void AddressBubblesIconView::OnExecuting( - PageActionIconView::ExecuteSource execute_source) {} - -const gfx::VectorIcon& AddressBubblesIconView::GetVectorIcon() const { - // TODO(crbug.com/40164487): Update the icon upon having final mocks. - return vector_icons::kLocationOnChromeRefreshIcon; -} - -AddressBubblesIconController* AddressBubblesIconView::GetController() const { - return AddressBubblesIconController::Get(GetWebContents()); -} - -BEGIN_METADATA(AddressBubblesIconView) -END_METADATA - -} // namespace autofill
diff --git a/chrome/browser/ui/views/autofill/address_bubbles_icon_view.h b/chrome/browser/ui/views/autofill/address_bubbles_icon_view.h deleted file mode 100644 index c2418e3..0000000 --- a/chrome/browser/ui/views/autofill/address_bubbles_icon_view.h +++ /dev/null
@@ -1,46 +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 CHROME_BROWSER_UI_VIEWS_AUTOFILL_ADDRESS_BUBBLES_ICON_VIEW_H_ -#define CHROME_BROWSER_UI_VIEWS_AUTOFILL_ADDRESS_BUBBLES_ICON_VIEW_H_ - -#include "chrome/browser/ui/views/page_action/page_action_icon_view.h" -#include "ui/base/metadata/metadata_header_macros.h" - -class CommandUpdater; - -namespace autofill { - -class AddressBubblesIconController; - -// The location bar icon to show the Save Address Profile bubble. -class AddressBubblesIconView : public PageActionIconView { - METADATA_HEADER(AddressBubblesIconView, PageActionIconView) - - public: - AddressBubblesIconView( - CommandUpdater* command_updater, - IconLabelBubbleView::Delegate* icon_label_bubble_delegate, - PageActionIconView::Delegate* page_action_icon_delegate); - AddressBubblesIconView(const AddressBubblesIconView&) = delete; - AddressBubblesIconView& operator=(const AddressBubblesIconView&) = delete; - ~AddressBubblesIconView() override; - - // PageActionIconView: - views::BubbleDialogDelegate* GetBubble() const override; - void UpdateImpl() override; - std::u16string GetTextForTooltipAndAccessibleName() const override; - - protected: - // PageActionIconView: - void OnExecuting(PageActionIconView::ExecuteSource execute_source) override; - const gfx::VectorIcon& GetVectorIcon() const override; - - private: - AddressBubblesIconController* GetController() const; -}; - -} // namespace autofill - -#endif // CHROME_BROWSER_UI_VIEWS_AUTOFILL_ADDRESS_BUBBLES_ICON_VIEW_H_
diff --git a/chrome/browser/ui/views/frame/contents_container_view.cc b/chrome/browser/ui/views/frame/contents_container_view.cc index 732c0c0..7062ffd3 100644 --- a/chrome/browser/ui/views/frame/contents_container_view.cc +++ b/chrome/browser/ui/views/frame/contents_container_view.cc
@@ -639,10 +639,16 @@ } if (ai_overlay_dialog_view_) { - layouts.child_layouts.emplace_back( - ai_overlay_dialog_view_.get(), ai_overlay_dialog_view_->GetVisible(), - non_devtools_contents_bounds, - views::SizeBounds(non_devtools_contents_bounds.size())); + // TODO(b/490458384): Look into whether the view can be transparent to hit + // testing (in transparent parts) - otherwise autosize it to the inner web + // content. + gfx::Size size(200, 200); + gfx::Point top_left = non_devtools_contents_bounds.bottom_right() - + gfx::Vector2d(size.width(), size.height()); + gfx::Rect rect(top_left, size); + layouts.child_layouts.emplace_back(ai_overlay_dialog_view_.get(), + ai_overlay_dialog_view_->GetVisible(), + rect, views::SizeBounds(rect.size())); } if (glic_selection_overlay_view_) {
diff --git a/chrome/browser/ui/views/frame/multi_contents_drop_target_view.h b/chrome/browser/ui/views/frame/multi_contents_drop_target_view.h index 53dfec6..e09ffde 100644 --- a/chrome/browser/ui/views/frame/multi_contents_drop_target_view.h +++ b/chrome/browser/ui/views/frame/multi_contents_drop_target_view.h
@@ -30,14 +30,14 @@ static constexpr int kDropTargetMinWidth = 120; static constexpr int kDropTargetMaxWidth = 360; - static constexpr int kDropTargetTargetWidthPercentage = 25; - static constexpr int kDropTargetForLinkTargetWidthPercentage = 15; + static constexpr int kDropTargetTargetWidthPercentage = 20; + static constexpr int kDropTargetForLinkTargetWidthPercentage = 20; static constexpr int kNudgeMinWidth = 80; static constexpr int kNudgeMaxWidth = 200; static constexpr int kNudgeTargetWidthPercentage = 5; static constexpr int kNudgeToFullMinWidth = 120; static constexpr int kNudgeToFullMaxWidth = 360; - static constexpr int kNudgeToFullTargetWidthPercentage = 15; + static constexpr int kNudgeToFullTargetWidthPercentage = 20; // Represents which edge of the contents area the drop target is on. enum class DropSide {
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 570a7f85..77d6085 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_view.cc +++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -508,7 +508,6 @@ if (optimization_guide::features::ShouldEnableOptimizationGuideIconView()) { params.types_enabled.push_back(PageActionIconType::kOptimizationGuide); } - params.types_enabled.push_back(PageActionIconType::kAutofillAddress); params.types_enabled.push_back(PageActionIconType::kManagePasswords); if (!apps::features::ShouldShowLinkCapturingUX()) { params.types_enabled.push_back(PageActionIconType::kIntentPicker);
diff --git a/chrome/browser/ui/views/page_action/page_action_icon_controller.cc b/chrome/browser/ui/views/page_action/page_action_icon_controller.cc index 081785c3..b76c7da 100644 --- a/chrome/browser/ui/views/page_action/page_action_icon_controller.cc +++ b/chrome/browser/ui/views/page_action/page_action_icon_controller.cc
@@ -17,7 +17,6 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/page_action/page_action_icon_type.h" #include "chrome/browser/ui/ui_features.h" -#include "chrome/browser/ui/views/autofill/address_bubbles_icon_view.h" #include "chrome/browser/ui/views/autofill/payments/filled_card_information_icon_view.h" #include "chrome/browser/ui/views/autofill/payments/mandatory_reauth_icon_view.h" #include "chrome/browser/ui/views/autofill/payments/save_payment_icon_view.h" @@ -135,12 +134,6 @@ params.icon_label_bubble_delegate, params.page_action_icon_delegate)); break; - case PageActionIconType::kAutofillAddress: - add_page_action_icon( - type, std::make_unique<autofill::AddressBubblesIconView>( - params.command_updater, params.icon_label_bubble_delegate, - params.page_action_icon_delegate)); - break; case PageActionIconType::kSaveCard: add_page_action_icon( type, std::make_unique<autofill::SavePaymentIconView>(
diff --git a/chrome/browser/ui/views/profiles/first_run_interactive_uitest.cc b/chrome/browser/ui/views/profiles/first_run_interactive_uitest.cc index a428857..53788242 100644 --- a/chrome/browser/ui/views/profiles/first_run_interactive_uitest.cc +++ b/chrome/browser/ui/views/profiles/first_run_interactive_uitest.cc
@@ -83,6 +83,9 @@ using ::testing::_; using ::testing::Eq; using ::testing::Not; +using ::testing::TestParamInfo; +using ::testing::Values; +using ::testing::ValuesIn; using Step = ::ProfileManagementFlowController::Step; using DeepQuery = ::WebContentsInteractionTestUtil::DeepQuery; @@ -104,42 +107,6 @@ kButtonsStillLoading = 4, }; -const DeepQuery& GetSignInButtonQuery(bool use_refreshed_view = false) { - if (use_refreshed_view) { - static const base::NoDestructor<DeepQuery> kSignInButtonRefreshed( - {"sign-in-promo-refresh", "#acceptSignInButton"}); - return *kSignInButtonRefreshed; - } else { - static const base::NoDestructor<DeepQuery> kSignInButton( - {"intro-app", "sign-in-promo", "#acceptSignInButton"}); - return *kSignInButton; - } -} - -const DeepQuery& GetDontSignInButtonQuery(bool use_refreshed_view = false) { - if (use_refreshed_view) { - static const base::NoDestructor<DeepQuery> kDontSignInButtonRefreshed( - {"sign-in-promo-refresh", "#declineSignInButton"}); - return *kDontSignInButtonRefreshed; - } else { - static const base::NoDestructor<DeepQuery> kDontSignInButton( - {"intro-app", "sign-in-promo", "#declineSignInButton"}); - return *kDontSignInButton; - } -} - -const DeepQuery& GetAcceptManagementButtonQuery() { - static const base::NoDestructor<DeepQuery> kDeclineManagementButton( - {"managed-user-profile-notice-app", "#proceed-button"}); - return *kDeclineManagementButton; -} - -const DeepQuery& GetDeclineManagementButtonQuery() { - static const base::NoDestructor<DeepQuery> kDeclineManagementButton( - {"managed-user-profile-notice-app", "#cancel-button"}); - return *kDeclineManagementButton; -} - const DeepQuery& GetOptInSyncButtonQuery() { static const base::NoDestructor<DeepQuery> kOptInSyncButton( {"sync-confirmation-app", "#confirmButton"}); @@ -158,28 +125,14 @@ return *kSettingsButton; } -const DeepQuery& GetConfirmDefaultBrowserButtonQuery() { - static const base::NoDestructor<DeepQuery> kConfirmDefaultBrowserButton( - {"default-browser-app", "#confirmButton"}); - return *kConfirmDefaultBrowserButton; -} - const DeepQuery& GetSearchEngineChoiceActionButtonQuery() { static const base::NoDestructor<DeepQuery> kSearchEngineChoiceActionButton( {"search-engine-choice-app", "#actionButton"}); return *kSearchEngineChoiceActionButton; } -const DeepQuery& GetOptInSyncHistoryButtonQuery() { - static const base::NoDestructor<DeepQuery> kOptInSyncHistoryButton( - {"history-sync-optin-app", "#acceptButton"}); - return *kOptInSyncHistoryButton; -} - -const DeepQuery& GetDontSyncHistoryButtonQuery() { - static const base::NoDestructor<DeepQuery> kDontSyncHistoryButton( - {"history-sync-optin-app", "#rejectButton"}); - return *kDontSyncHistoryButton; +GURL GetHistorySyncOptinURL() { + return GURL("chrome://history-sync-optin?launch_context=0"); } std::unique_ptr<KeyedService> CreateTestSyncService( @@ -193,10 +146,13 @@ SyncButtonsFeatureConfig::kAsyncNotEqualButtons; std::optional<bool> with_supervision = std::nullopt; bool with_sync_engine_ready = true; + // The variant of the refreshed view to use for the test, `std::nullopt` means + // that the refresh is disabled. + std::optional<switches::FirstRunDesktopSignInPromoVariation> + refreshed_view_variant = std::nullopt; }; -std::string SupervisionToString( - const ::testing::TestParamInfo<TestParam>& info) { +std::string SupervisionToString(const TestParamInfo<TestParam>& info) { if (!info.param.with_supervision.has_value()) { return ""; } @@ -232,43 +188,101 @@ test_sync_service->FireStateChanged(); } -std::string ParamToTestSuffix(const ::testing::TestParamInfo<TestParam>& info) { - return info.param.test_suffix + SupervisionToString(info); +std::string RefreshedViewSuffix( + std::optional<switches::FirstRunDesktopSignInPromoVariation> + refreshed_view_variant) { + if (refreshed_view_variant.has_value()) { + switch (*refreshed_view_variant) { + case switches::FirstRunDesktopSignInPromoVariation::kDefault: + return "RefreshedViewDefault"; + case switches::FirstRunDesktopSignInPromoVariation:: + kDontSignInInTheTopCorner: + return "RefreshedViewDontSignInTopCorner"; + case switches::FirstRunDesktopSignInPromoVariation::kDontSignInOnGaiaPage: + return "RefreshedViewDontSignInGaiaPage"; + } + } + return "NonRefreshedView"; } -// Permutations of supported parameters. -const TestParam kTestParams[] = { - {.test_suffix = "Default"}, - {.test_suffix = "Default", .with_supervision = true}, - {.test_suffix = "AsyncCapabilitiesToNotEqualButtons", - .sync_buttons_feature_config = - SyncButtonsFeatureConfig::kAsyncEqualButtons}, - {.test_suffix = "AsyncCapabilitiesToEqualButtons", - .sync_buttons_feature_config = - SyncButtonsFeatureConfig::kAsyncNotEqualButtons}, - {.test_suffix = "AsyncCapabilitiesDeadlined", - .sync_buttons_feature_config = SyncButtonsFeatureConfig::kDeadlined}, - {.test_suffix = "AsyncCapabilitiesPending", - .sync_buttons_feature_config = - SyncButtonsFeatureConfig::kButtonsStillLoading}, - {.test_suffix = "DefaultWithSyncEngineAwaiting", - .with_sync_engine_ready = false}, -}; +std::string ParamToTestSuffix(const TestParamInfo<TestParam>& info) { + return info.param.test_suffix + SupervisionToString(info) + + RefreshedViewSuffix(info.param.refreshed_view_variant); +} + +// Gets permutations of supported parameters. +const std::vector<TestParam>& GetTestParams() { + static const base::NoDestructor<std::vector<TestParam>> kTestParams([]() { + const TestParam base_test_params[] = { + {.test_suffix = "Default"}, + {.test_suffix = "Default", .with_supervision = true}, + {.test_suffix = "AsyncCapabilitiesToNotEqualButtons", + .sync_buttons_feature_config = + SyncButtonsFeatureConfig::kAsyncEqualButtons}, + {.test_suffix = "AsyncCapabilitiesToEqualButtons", + .sync_buttons_feature_config = + SyncButtonsFeatureConfig::kAsyncNotEqualButtons}, + {.test_suffix = "AsyncCapabilitiesDeadlined", + .sync_buttons_feature_config = SyncButtonsFeatureConfig::kDeadlined}, + {.test_suffix = "AsyncCapabilitiesPending", + .sync_buttons_feature_config = + SyncButtonsFeatureConfig::kButtonsStillLoading}, + {.test_suffix = "DefaultWithSyncEngineAwaiting", + .with_sync_engine_ready = false}, + }; + + // Duplicate each test param to cover both the refreshed and unrefreshed + // views. + std::vector<TestParam> test_params; + test_params.reserve(std::size(base_test_params) * 2); + for (const auto& test_param : base_test_params) { + test_params.push_back(test_param); + + TestParam test_param_refreshed = test_param; + test_param_refreshed.refreshed_view_variant = + switches::FirstRunDesktopSignInPromoVariation::kDefault; + test_params.push_back(std::move(test_param_refreshed)); + } + return test_params; + }()); + return *kTestParams; +} } // namespace // Test suite with default params, and with Search Engine Choice and Default // Browser screens disabled. -class FirstRunInteractiveUiTest +class FirstRunInteractiveUiBaseTest : public InteractiveFeaturePromoTestMixin<FirstRunServiceBrowserTestBase>, public WithProfilePickerInteractiveUiTestHelpers { public: - explicit FirstRunInteractiveUiTest(const TestParam& params = TestParam()) + explicit FirstRunInteractiveUiBaseTest( + const TestParam& params = TestParam(), + const std::vector<base::test::FeatureRefAndParams>& + fixture_enabled_features = {}) : InteractiveFeaturePromoTestMixin<FirstRunServiceBrowserTestBase>( UseDefaultTrackerAllowingPromos( {feature_engagement::kIPHSupervisedUserProfileSigninFeature})), - params_(params) {} - ~FirstRunInteractiveUiTest() override = default; + params_(params) { + std::vector<base::test::FeatureRefAndParams> enabled_features = + fixture_enabled_features; + std::vector<base::test::FeatureRef> disabled_features; + if (params_.refreshed_view_variant.has_value()) { + enabled_features.push_back( + {switches::kFirstRunDesktopRefresh, + {{switches::kFirstRunDesktopSignInPromoVariation.name, + switches::kFirstRunDesktopSignInPromoVariation.GetName( + *params_.refreshed_view_variant)}}}); + enabled_features.push_back( + {switches::kFirstRunDesktopChoiceScreenRefresh, {}}); + } else { + disabled_features.push_back(switches::kFirstRunDesktopRefresh); + } + scoped_feature_list_.InitWithFeaturesAndParameters(enabled_features, + disabled_features); + } + + ~FirstRunInteractiveUiBaseTest() override = default; protected: const std::string kTestGivenName = "Joe"; @@ -279,6 +293,90 @@ return histogram_tester_; } + const DeepQuery& GetSignInButtonQuery() const { + if (UseRefreshedView()) { + static const base::NoDestructor<DeepQuery> kSignInButtonRefreshed( + {"sign-in-promo-refresh", "#acceptSignInButton"}); + return *kSignInButtonRefreshed; + } else { + static const base::NoDestructor<DeepQuery> kSignInButton( + {"intro-app", "sign-in-promo", "#acceptSignInButton"}); + return *kSignInButton; + } + } + + const DeepQuery& GetDontSignInButtonQuery() const { + if (UseRefreshedView()) { + static const base::NoDestructor<DeepQuery> kDontSignInButtonRefreshed( + {"sign-in-promo-refresh", "#declineSignInButton"}); + return *kDontSignInButtonRefreshed; + } else { + static const base::NoDestructor<DeepQuery> kDontSignInButton( + {"intro-app", "sign-in-promo", "#declineSignInButton"}); + return *kDontSignInButton; + } + } + + const DeepQuery& GetAcceptManagementButtonQuery() const { + if (UseRefreshedView()) { + static const base::NoDestructor<DeepQuery> kQuery( + {"managed-user-profile-notice-app-refresh", "#proceedButton"}); + return *kQuery; + } else { + static const base::NoDestructor<DeepQuery> kQuery( + {"managed-user-profile-notice-app", "#proceed-button"}); + return *kQuery; + } + } + + const DeepQuery& GetDeclineManagementButtonQuery() const { + if (UseRefreshedView()) { + static const base::NoDestructor<DeepQuery> kQuery( + {"managed-user-profile-notice-app-refresh", "#cancelButton"}); + return *kQuery; + } else { + static const base::NoDestructor<DeepQuery> kQuery( + {"managed-user-profile-notice-app", "#cancel-button"}); + return *kQuery; + } + } + + const DeepQuery& GetConfirmDefaultBrowserButtonQuery() const { + if (UseRefreshedView()) { + static const base::NoDestructor<DeepQuery> kQuery( + {"default-browser-app-refresh", "#confirm-button"}); + return *kQuery; + } else { + static const base::NoDestructor<DeepQuery> kQuery( + {"default-browser-app", "#confirmButton"}); + return *kQuery; + } + } + + const DeepQuery& GetOptInSyncHistoryButtonQuery() const { + if (UseRefreshedView()) { + static const base::NoDestructor<DeepQuery> kQuery( + {"history-sync-optin-app-refresh", "#acceptButton"}); + return *kQuery; + } else { + static const base::NoDestructor<DeepQuery> kQuery( + {"history-sync-optin-app", "#acceptButton"}); + return *kQuery; + } + } + + const DeepQuery& GetDontSyncHistoryButtonQuery() const { + if (UseRefreshedView()) { + static const base::NoDestructor<DeepQuery> kQuery( + {"history-sync-optin-app-refresh", "#rejectButton"}); + return *kQuery; + } else { + static const base::NoDestructor<DeepQuery> kQuery( + {"history-sync-optin-app", "#rejectButton"}); + return *kQuery; + } + } + // FirstRunServiceBrowserTestBase: void SetUpInProcessBrowserTestFixture() override { FirstRunServiceBrowserTestBase::SetUpInProcessBrowserTestFixture(); @@ -365,10 +463,9 @@ // Waits for the intro buttons to be shown and presses to proceed according // to the value of `sign_in`. - auto CompleteIntroStep(bool sign_in, bool use_refreshed_view = false) { + auto CompleteIntroStep(bool sign_in) { const DeepQuery& button = - sign_in ? GetSignInButtonQuery(use_refreshed_view) - : GetDontSignInButtonQuery(use_refreshed_view); + sign_in ? GetSignInButtonQuery() : GetDontSignInButtonQuery(); return Steps( WaitForWebContentsReady(kWebContentsId, GURL(chrome::kChromeUIIntroURL)), @@ -499,8 +596,8 @@ } } - static GURL GetHistorySyncOptinURL() { - return GURL("chrome://history-sync-optin?launch_context=0"); + bool UseRefreshedView() const { + return params_.refreshed_view_variant.has_value(); } private: @@ -508,9 +605,103 @@ ChromeSigninClientWithURLLoaderHelper url_loader_factory_helper_; base::HistogramTester histogram_tester_; - base::ScopedClosureRunner enable_disclaimer_on_primary_account_change_resetter_; + base::ScopedClosureRunner + enable_disclaimer_on_primary_account_change_resetter_; + + base::test::ScopedFeatureList scoped_feature_list_; }; +class FirstRunInteractiveUiTest + : public testing::WithParamInterface< + std::optional<switches::FirstRunDesktopSignInPromoVariation>>, + public FirstRunInteractiveUiBaseTest { + public: + explicit FirstRunInteractiveUiTest( + const std::vector<base::test::FeatureRefAndParams>& + fixture_enabled_features = {}) + : FirstRunInteractiveUiBaseTest( + TestParam{.refreshed_view_variant = GetParam()}, + fixture_enabled_features) {} +}; + +IN_PROC_BROWSER_TEST_P(FirstRunInteractiveUiTest, SignInError) { + g_browser_process->local_state()->SetString( + prefs::kGoogleServicesUsernamePattern, "*@other.org"); + + base::test::TestFuture<bool> proceed_future; + OpenFirstRun(proceed_future.GetCallback()); + RunTestSequenceInContext( + views::ElementTrackerViews::GetContextForView(view()), + // Wait for the profile picker to show the intro. + WaitForShow(kProfilePickerViewId), + InstrumentNonTabWebView(kWebContentsId, web_view()), + CompleteIntroStep(/*sign_in=*/true), + // Wait for switch to the Gaia sign-in page to complete. + WaitForWebContentsNavigation(kWebContentsId, + GetSigninChromeSyncDiceUrl())); + + // Pulled out of the test sequence because it waits using `RunLoop`s. + SimulateSignIn(kTestEnterpriseEmail, kTestGivenName); + + // Wait for the picker to be closed and deleted. + WaitForPickerClosed(); + EXPECT_TRUE(proceed_future.Get()); + // The error dialog is shown to the user. + RunTestSequence( + InAnyContext(WaitForShow(SigninViewController::kSigninErrorViewId))); + if (base::FeatureList::IsEnabled( + syncer::kReplaceSyncPromosWithSignInPromos)) { + histogram_tester().ExpectUniqueSample( + "ProfilePicker.FREFlow.SignInError", + SigninUIError::Type::kUsernameNotAllowedByPatternFromPrefs, 1); + } +} + +IN_PROC_BROWSER_TEST_P(FirstRunInteractiveUiTest, ExitAtSignIn) { + ASSERT_TRUE(IsProfileNameDefault()); + + base::test::TestFuture<bool> proceed_future; + OpenFirstRun(proceed_future.GetCallback()); + + RunTestSequenceInContext( + views::ElementTrackerViews::GetContextForView(view()), + + // Wait for the profile picker to show the intro. + WaitForShow(kProfilePickerViewId), + InstrumentNonTabWebView(kWebContentsId, web_view()), + CompleteIntroStep(/*sign_in=*/true), + // Wait for switch to the Gaia sign-in page to complete. + // Note: kPickerWebContentsId now points to the new profile's WebContents. + WaitForWebContentsNavigation(kWebContentsId, + GetSigninChromeSyncDiceUrl()), + + // Send "Close window" keyboard shortcut and wait for view to close. + SendAccelerator(kProfilePickerViewId, GetAccelerator(IDC_CLOSE_WINDOW)) + .SetMustRemainVisible(false)); + + WaitForPickerClosed(); + + EXPECT_TRUE(proceed_future.Get()); + + histogram_tester().ExpectUniqueSample( + "ProfilePicker.FirstRun.ExitStatus", + ProfilePicker::FirstRunExitStatus::kQuitAtEnd, 1); + + ExpectStepHistograms(Step::kIntro, /*shown=*/true); + ExpectStepHistograms(Step::kAccountSelection, /*shown=*/true, + /*with_exit=*/true); +} + +INSTANTIATE_TEST_SUITE_P( + , + FirstRunInteractiveUiTest, + Values(std::nullopt, + switches::FirstRunDesktopSignInPromoVariation::kDefault), + [](const TestParamInfo< + std::optional<switches::FirstRunDesktopSignInPromoVariation>>& info) { + return RefreshedViewSuffix(info.param); + }); + class FirstRunInteractiveUiTestWithSyncService : public FirstRunInteractiveUiTest { protected: @@ -531,7 +722,7 @@ // Simplified version of the Signin flow in the FRE, without the Search Engine // Choice and Default Browser screen showing. For the full flow, check // `FirstRunParameterizedInteractiveUiTest_SignInAndSync` test below. -IN_PROC_BROWSER_TEST_F(FirstRunInteractiveUiTestWithSyncService, MAYBE_SignIn) { +IN_PROC_BROWSER_TEST_P(FirstRunInteractiveUiTestWithSyncService, MAYBE_SignIn) { ASSERT_TRUE(IsProfileNameDefault()); base::test::TestFuture<bool> proceed_future; @@ -613,99 +804,35 @@ 6); } -IN_PROC_BROWSER_TEST_F(FirstRunInteractiveUiTest, SignInError) { - g_browser_process->local_state()->SetString( - prefs::kGoogleServicesUsernamePattern, "*@other.org"); - - base::test::TestFuture<bool> proceed_future; - OpenFirstRun(proceed_future.GetCallback()); - RunTestSequenceInContext( - views::ElementTrackerViews::GetContextForView(view()), - // Wait for the profile picker to show the intro. - WaitForShow(kProfilePickerViewId), - InstrumentNonTabWebView(kWebContentsId, web_view()), - CompleteIntroStep(/*sign_in=*/true), - // Wait for switch to the Gaia sign-in page to complete. - WaitForWebContentsNavigation(kWebContentsId, - GetSigninChromeSyncDiceUrl())); - - // Pulled out of the test sequence because it waits using `RunLoop`s. - SimulateSignIn(kTestEnterpriseEmail, kTestGivenName); - - // Wait for the picker to be closed and deleted. - WaitForPickerClosed(); - EXPECT_TRUE(proceed_future.Get()); - // The error dialog is shown to the user. - RunTestSequence( - InAnyContext(WaitForShow(SigninViewController::kSigninErrorViewId))); - if (base::FeatureList::IsEnabled( - syncer::kReplaceSyncPromosWithSignInPromos)) { - histogram_tester().ExpectUniqueSample( - "ProfilePicker.FREFlow.SignInError", - SigninUIError::Type::kUsernameNotAllowedByPatternFromPrefs, - 1); - } -} - -IN_PROC_BROWSER_TEST_F(FirstRunInteractiveUiTest, ExitAtSignIn) { - ASSERT_TRUE(IsProfileNameDefault()); - - base::test::TestFuture<bool> proceed_future; - OpenFirstRun(proceed_future.GetCallback()); - - RunTestSequenceInContext( - views::ElementTrackerViews::GetContextForView(view()), - - // Wait for the profile picker to show the intro. - WaitForShow(kProfilePickerViewId), - InstrumentNonTabWebView(kWebContentsId, web_view()), - CompleteIntroStep(/*sign_in=*/true), - // Wait for switch to the Gaia sign-in page to complete. - // Note: kPickerWebContentsId now points to the new profile's WebContents. - WaitForWebContentsNavigation(kWebContentsId, - GetSigninChromeSyncDiceUrl()), - - // Send "Close window" keyboard shortcut and wait for view to close. - SendAccelerator(kProfilePickerViewId, GetAccelerator(IDC_CLOSE_WINDOW)) - .SetMustRemainVisible(false)); - - WaitForPickerClosed(); - - EXPECT_TRUE(proceed_future.Get()); - - histogram_tester().ExpectUniqueSample( - "ProfilePicker.FirstRun.ExitStatus", - ProfilePicker::FirstRunExitStatus::kQuitAtEnd, 1); - - ExpectStepHistograms(Step::kIntro, /*shown=*/true); - ExpectStepHistograms(Step::kAccountSelection, /*shown=*/true, - /*with_exit=*/true); -} +INSTANTIATE_TEST_SUITE_P( + , + FirstRunInteractiveUiTestWithSyncService, + Values(std::nullopt, + switches::FirstRunDesktopSignInPromoVariation::kDefault), + [](const TestParamInfo< + std::optional<switches::FirstRunDesktopSignInPromoVariation>>& info) { + return RefreshedViewSuffix(info.param); + }); class FirstRunParameterizedInteractiveUiTest - : public FirstRunInteractiveUiTest, + : public FirstRunInteractiveUiBaseTest, public testing::WithParamInterface<TestParam> { public: FirstRunParameterizedInteractiveUiTest() - : FirstRunInteractiveUiTest(GetParam()) { - std::vector<base::test::FeatureRefAndParams> enabled_features_and_params; - std::vector<base::test::FeatureRef> disabled_features; + : FirstRunInteractiveUiBaseTest( + GetParam(), + /*fixture_enabled_features=*/{ + {feature_engagement::kIPHSupervisedUserProfileSigninFeature, + {}}}) { scoped_chrome_build_override_ = std::make_unique<base::AutoReset<bool>>( SearchEngineChoiceDialogServiceFactory:: ScopedChromeBuildOverrideForTesting( /*force_chrome_build=*/true)); - - // To allow an IPH for new supervised user profiles. - enabled_features_and_params.push_back( - {feature_engagement::kIPHSupervisedUserProfileSigninFeature, {}}); - - scoped_feature_list_.InitWithFeaturesAndParameters( - enabled_features_and_params, disabled_features); } // FirstRunInteractiveUiTest: void SetUpCommandLine(base::CommandLine* command_line) override { - FirstRunInteractiveUiTest::SetUpCommandLine(command_line); + FirstRunInteractiveUiBaseTest::SetUpCommandLine(command_line); // Change the country to belgium so that the search engine choice test works // as intended. @@ -722,7 +849,7 @@ } void SetUpOnMainThread() override { - FirstRunInteractiveUiTest::SetUpOnMainThread(); + FirstRunInteractiveUiBaseTest::SetUpOnMainThread(); SearchEngineChoiceDialogService::SetDialogDisabledForTests( /*dialog_disabled=*/false); @@ -795,31 +922,9 @@ private: base::UserActionTester user_action_tester_; - base::test::ScopedFeatureList scoped_feature_list_; std::unique_ptr<base::AutoReset<bool>> scoped_chrome_build_override_; }; -class FirstRunParameterizedInteractiveUiTestWithSyncService - : public FirstRunParameterizedInteractiveUiTest { - protected: - void SetUpBrowserContextKeyedServices( - content::BrowserContext* context) override { - FirstRunInteractiveUiTest::SetUpBrowserContextKeyedServices(context); - SyncServiceFactory::GetInstance()->SetTestingFactory( - context, base::BindRepeating(&CreateTestSyncService)); - } -}; - -INSTANTIATE_TEST_SUITE_P(, - FirstRunParameterizedInteractiveUiTest, - testing::ValuesIn(kTestParams), - &ParamToTestSuffix); - -INSTANTIATE_TEST_SUITE_P(, - FirstRunParameterizedInteractiveUiTestWithSyncService, - testing::ValuesIn(kTestParams), - &ParamToTestSuffix); - // This test doesn't check for the search engine choice dialog because the point // of the test suite is to check what's happening in the FRE and not after it is // closed. @@ -891,321 +996,6 @@ } #endif -IN_PROC_BROWSER_TEST_P(FirstRunParameterizedInteractiveUiTestWithSyncService, - SignInAndSync) { - bool should_skip_test = false; -#if BUILDFLAG(IS_WIN) - // TODO(crbug.com/363254870, crbug.com/366082752): Re-enable this test - should_skip_test = true; -#endif // WIN - if (should_skip_test) { - GTEST_SKIP() << "Test is flaky on win64"; - } - - if (SyncButtonsFeatureConfig() == - SyncButtonsFeatureConfig::kButtonsStillLoading) { - GTEST_SKIP() << "Sync not possible until buttons stop loading"; - } - - auto iph_delay = - AvatarToolbarButton::SetScopedIPHMinDelayAfterCreationForTesting( - base::Seconds(0)); - base::test::TestFuture<bool> proceed_future; - - ASSERT_TRUE(IsProfileNameDefault()); - - OpenFirstRun(proceed_future.GetCallback()); - - RunTestSequenceInContext( - views::ElementTrackerViews::GetContextForView(view()), - - // Wait for the profile picker to show the intro. - WaitForShow(kProfilePickerViewId), - InstrumentNonTabWebView(kWebContentsId, web_view()), - WaitForWebContentsReady(kWebContentsId, GURL(chrome::kChromeUIIntroURL)), - - // Waiting for the animation to complete so we can start interacting with - // the button. - WaitForStateChange(kWebContentsId, IsVisible(GetSignInButtonQuery())), - - Do([&] { - EXPECT_FALSE(GetFirstRunFinishedPrefValue()); - histogram_tester().ExpectUniqueSample( - "Signin.SignIn.Offered", signin_metrics::AccessPoint::kForYouFre, - 1); - }), - - // Advance to the sign-in page. - // Note: the button should be disabled after this, but there is no good - // way to verify it in this sequence. It is verified by unit tests in - // chrome/test/data/webui/intro/sign_in_promo_test.ts - PressJsButton(kWebContentsId, GetSignInButtonQuery()), - // Wait for switch to the Gaia sign-in page to complete. - // Note: kPickerWebContentsId now points to the new profile's WebContents. - WaitForWebContentsNavigation(kWebContentsId, - GetSigninChromeSyncDiceUrl()), - - Do([&] { - histogram_tester().ExpectUniqueSample( - "Signin.SignIn.Started", signin_metrics::AccessPoint::kForYouFre, - 1); - })); - - auto sync_transport_state = - GetParam().with_sync_engine_ready - ? syncer::SyncService::TransportState::ACTIVE - : syncer::SyncService::TransportState::INITIALIZING; - ConfigureTestSyncService(SyncServiceFactory::GetForProfile(profile()), - sync_transport_state); - // Pulled out of the test sequence because it waits using `RunLoop`s. - SimulateSignIn(kTestEmail, kTestGivenName); - - histogram_tester().ExpectUniqueSample( - "Signin.SignIn.Completed", signin_metrics::AccessPoint::kForYouFre, 1); - - const DeepQuery first_search_engine = {"search-engine-choice-app", - "cr-radio-button"}; - - if (base::FeatureList::IsEnabled( - syncer::kReplaceSyncPromosWithSignInPromos)) { - GURL history_page_url = GetHistorySyncOptinURL(); - RunTestSequenceInContext( - views::ElementTrackerViews::GetContextForView(view()), - // Web Contents already instrumented in the previous sequence. - WaitForStateChange(kWebContentsId, - PageWithUrl(history_page_url.spec())), - Do([&] { - histogram_tester().ExpectUniqueSample( - "Signin.HistorySyncOptIn.Started", - signin_metrics::AccessPoint::kForYouFre, 1); - }), - // Button is visible once capabilities are loaded or defaulted. - WaitForButtonVisible(kWebContentsId, GetOptInSyncHistoryButtonQuery()), - - EnsurePresent(kWebContentsId, GetOptInSyncHistoryButtonQuery()), - PressJsButton(kWebContentsId, GetOptInSyncHistoryButtonQuery()) - .SetMustRemainVisible(false), - - CompleteSearchEngineChoiceStep(), CompleteDefaultBrowserStep()); - } else { - GURL sync_page_url = AppendSyncConfirmationQueryParams( - GURL("chrome://sync-confirmation/"), SyncConfirmationStyle::kWindow, - /*is_sync_promo=*/true); - RunTestSequenceInContext( - views::ElementTrackerViews::GetContextForView(view()), - // Web Contents already instrumented in the previous sequence. - WaitForStateChange(kWebContentsId, - PageWithUrl(sync_page_url.spec())), - Do([&] { - histogram_tester().ExpectUniqueSample( - "Signin.SyncOptIn.Started", - signin_metrics::AccessPoint::kForYouFre, 1); - }), - - // Button is visible once capabilities are loaded or defaulted. - WaitForButtonVisible(kWebContentsId, GetOptInSyncButtonQuery()), - - EnsurePresent(kWebContentsId, GetOptInSyncButtonQuery()), - PressJsButton(kWebContentsId, GetOptInSyncButtonQuery()) - .SetMustRemainVisible(false), - - CompleteSearchEngineChoiceStep(), CompleteDefaultBrowserStep()); - } - - WaitForPickerClosed(); - - if (base::FeatureList::IsEnabled( - syncer::kReplaceSyncPromosWithSignInPromos)) { - histogram_tester().ExpectUniqueSample( - "Signin.HistorySyncOptIn.Completed", - signin_metrics::AccessPoint::kForYouFre, 1); - } else { - histogram_tester().ExpectUniqueSample( - "Signin.SyncOptIn.Completed", signin_metrics::AccessPoint::kForYouFre, - 1); - } - - histogram_tester().ExpectBucketCount("ProfilePicker.FirstRun.DefaultBrowser", - DefaultBrowserChoice::kClickSetAsDefault, - 1); - - histogram_tester().ExpectBucketCount( - search_engines::kSearchEngineChoiceScreenEventsHistogram, - search_engines::SearchEngineChoiceScreenEvents::kFreDefaultWasSet, 1); - - EXPECT_TRUE(proceed_future.Get()); - - EXPECT_TRUE(GetFirstRunFinishedPrefValue()); - EXPECT_FALSE(fre_service()->ShouldOpenFirstRun()); - EXPECT_EQ(base::ASCIIToUTF16(kTestGivenName), GetProfileName()); - EXPECT_FALSE(IsUsingDefaultProfileName()); - - // Re-assessment of all metrics from this flow, and check for no - // double-logs. - histogram_tester().ExpectUniqueSample( - "Signin.SignIn.Offered", signin_metrics::AccessPoint::kForYouFre, 1); - histogram_tester().ExpectUniqueSample( - "Signin.SignIn.Started", signin_metrics::AccessPoint::kForYouFre, 1); - histogram_tester().ExpectUniqueSample( - "Signin.SignIn.Completed", signin_metrics::AccessPoint::kForYouFre, 1); - if (base::FeatureList::IsEnabled( - syncer::kReplaceSyncPromosWithSignInPromos)) { - histogram_tester().ExpectUniqueSample( - "Signin.HistorySyncOptIn.Started", - signin_metrics::AccessPoint::kForYouFre, 1); - histogram_tester().ExpectUniqueSample( - "Signin.HistorySyncOptIn.Completed", - signin_metrics::AccessPoint::kForYouFre, 1); - } else { - histogram_tester().ExpectUniqueSample( - "Signin.SyncOptIn.Started", signin_metrics::AccessPoint::kForYouFre, 1); - histogram_tester().ExpectUniqueSample( - "Signin.SyncOptIn.Completed", signin_metrics::AccessPoint::kForYouFre, - 1); - } - histogram_tester().ExpectUniqueSample( - "Signin.SyncButtons.Shown", - *ExpectedButtonShownMetric(SyncButtonsFeatureConfig()), 1); - histogram_tester().ExpectUniqueSample( - "ProfilePicker.FirstRun.ExitStatus", - ProfilePicker::FirstRunExitStatus::kCompleted, 1); - - ExpectStepHistograms(Step::kIntro, /*shown=*/true); - ExpectStepHistograms(Step::kAccountSelection, /*shown=*/true); - ExpectStepHistograms(Step::kPostSignInFlow, /*shown=*/true); - ExpectStepHistograms(Step::kSearchEngineChoice, /*shown=*/true); - ExpectStepHistograms(Step::kDefaultBrowser, /*shown=*/true); - ExpectStepHistograms(Step::kFinishFlow, /*shown=*/true, /*with_exit=*/true); - histogram_tester().ExpectTotalCount("ProfilePicker.FREFlow.StepShownDuration", - 6); - histogram_tester().ExpectTotalCount("ProfilePicker.FREFlow.StepTotalDuration", - 6); - - RunTestSequence( - If([]() { return WithSupervisedUser(); }, - Then(WaitForPromo( - feature_engagement::kIPHSupervisedUserProfileSigninFeature)), - Else(EnsureNotPresent( - user_education::HelpBubbleView::kHelpBubbleElementIdForTesting)))); -} - -IN_PROC_BROWSER_TEST_P(FirstRunParameterizedInteractiveUiTestWithSyncService, - DeclineSync) { - bool should_skip_test = false; -#if BUILDFLAG(IS_WIN) - // TODO(crbug.com/366082752): Re-enable this test - should_skip_test = true; -#endif // WIN - if (should_skip_test) { - GTEST_SKIP() << "Test is flaky on win64"; - } - - if (SyncButtonsFeatureConfig() == - SyncButtonsFeatureConfig::kButtonsStillLoading) { - GTEST_SKIP() << "Decline is not possible until buttons stop loading"; - } - auto iph_delay = - AvatarToolbarButton::SetScopedIPHMinDelayAfterCreationForTesting( - base::Seconds(0)); - base::test::TestFuture<bool> proceed_future; - - ASSERT_TRUE(IsProfileNameDefault()); - - OpenFirstRun(proceed_future.GetCallback()); - RunTestSequenceInContext( - views::ElementTrackerViews::GetContextForView(view()), - - // Wait for the profile picker to show the intro. - WaitForShow(kProfilePickerViewId), - InstrumentNonTabWebView(kWebContentsId, web_view()), - CompleteIntroStep(/*sign_in=*/true), - // Wait for switch to the Gaia sign-in page to complete. - // Note: kPickerWebContentsId now points to the new profile's WebContents. - WaitForWebContentsNavigation(kWebContentsId, - GetSigninChromeSyncDiceUrl())); - - auto sync_transport_state = - GetParam().with_sync_engine_ready - ? syncer::SyncService::TransportState::ACTIVE - : syncer::SyncService::TransportState::INITIALIZING; - ConfigureTestSyncService(SyncServiceFactory::GetForProfile(profile()), - sync_transport_state); - // Pulled out of the test sequence because it waits using `RunLoop`s. - SimulateSignIn(kTestEmail, kTestGivenName); - - if (base::FeatureList::IsEnabled( - syncer::kReplaceSyncPromosWithSignInPromos)) { - GURL history_page_url = GetHistorySyncOptinURL(); - RunTestSequenceInContext( - views::ElementTrackerViews::GetContextForView(view()), - // Web Contents already instrumented in the previous sequence. - WaitForStateChange(kWebContentsId, - PageWithUrl(history_page_url.spec())), - // Button is visible once capabilities are loaded or defaulted. - WaitForButtonVisible(kWebContentsId, GetDontSyncHistoryButtonQuery()), - - EnsurePresent(kWebContentsId, GetDontSyncHistoryButtonQuery()), - PressJsButton(kWebContentsId, GetDontSyncHistoryButtonQuery()), - - CompleteSearchEngineChoiceStep(), CompleteDefaultBrowserStep()); - } else { - RunTestSequenceInContext( - views::ElementTrackerViews::GetContextForView(view()), - // Web Contents already instrumented in the previous sequence. - WaitForStateChange(kWebContentsId, - PageWithUrl(AppendSyncConfirmationQueryParams( - GURL("chrome://sync-confirmation/"), - SyncConfirmationStyle::kWindow, - /*is_sync_promo=*/true).spec())), - // Button is visible once capabilities are loaded or defaulted. - WaitForButtonVisible(kWebContentsId, GetDontSyncButtonQuery()), - - EnsurePresent(kWebContentsId, GetDontSyncButtonQuery()), - PressJsButton(kWebContentsId, GetDontSyncButtonQuery()), - - CompleteSearchEngineChoiceStep(), CompleteDefaultBrowserStep()); - } - - // Wait for the picker to be closed and deleted. - WaitForPickerClosed(); - - EXPECT_TRUE(proceed_future.Get()); - - EXPECT_EQ(base::ASCIIToUTF16(kTestGivenName), GetProfileName()); - - // Checking the expected metrics from this flow. - histogram_tester().ExpectUniqueSample( - "Signin.SignIn.Offered", signin_metrics::AccessPoint::kForYouFre, 1); - histogram_tester().ExpectUniqueSample( - "Signin.SignIn.Started", signin_metrics::AccessPoint::kForYouFre, 1); - histogram_tester().ExpectUniqueSample( - "Signin.SignIn.Completed", signin_metrics::AccessPoint::kForYouFre, 1); - if (base::FeatureList::IsEnabled( - syncer::kReplaceSyncPromosWithSignInPromos)) { - histogram_tester().ExpectUniqueSample( - "Signin.HistorySyncOptIn.Started", - signin_metrics::AccessPoint::kForYouFre, 1); - histogram_tester().ExpectTotalCount("Signin.HistorySyncOptIn.Completed", 0); - } else { - histogram_tester().ExpectUniqueSample( - "Signin.SyncOptIn.Started", signin_metrics::AccessPoint::kForYouFre, 1); - histogram_tester().ExpectTotalCount("Signin.SyncOptIn.Completed", 0); - } - histogram_tester().ExpectUniqueSample( - "Signin.SyncButtons.Shown", - *ExpectedButtonShownMetric(SyncButtonsFeatureConfig()), 1); - histogram_tester().ExpectUniqueSample( - "ProfilePicker.FirstRun.ExitStatus", - ProfilePicker::FirstRunExitStatus::kCompleted, 1); - - RunTestSequence( - If([]() { return WithSupervisedUser(); }, - Then(WaitForPromo( - feature_engagement::kIPHSupervisedUserProfileSigninFeature)), - Else(EnsureNotPresent( - user_education::HelpBubbleView::kHelpBubbleElementIdForTesting)))); -} - IN_PROC_BROWSER_TEST_P(FirstRunParameterizedInteractiveUiTest, GoToSettings) { if (base::FeatureList::IsEnabled( syncer::kReplaceSyncPromosWithSignInPromos)) { @@ -1436,7 +1226,10 @@ // The FakeUserPolicySigninService resolves, indicating the the account // is managed and requiring to show the enterprise management opt-in. WaitForWebContentsNavigation( - kWebContentsId, GURL(chrome::kChromeUIManagedUserProfileNoticeUrl)), + kWebContentsId, + UseRefreshedView() + ? GURL(chrome::kChromeUIManagedUserProfileNoticeRefreshURL) + : GURL(chrome::kChromeUIManagedUserProfileNoticeUrl)), EnsurePresent(kWebContentsId, GetDeclineManagementButtonQuery()), PressJsButton(kWebContentsId, GetDeclineManagementButtonQuery()), @@ -1490,11 +1283,347 @@ 6); } +INSTANTIATE_TEST_SUITE_P(, + FirstRunParameterizedInteractiveUiTest, + ValuesIn(GetTestParams()), + &ParamToTestSuffix); + +class FirstRunParameterizedInteractiveUiTestWithSyncService + : public FirstRunParameterizedInteractiveUiTest { + protected: + void SetUpBrowserContextKeyedServices( + content::BrowserContext* context) override { + FirstRunInteractiveUiBaseTest::SetUpBrowserContextKeyedServices(context); + SyncServiceFactory::GetInstance()->SetTestingFactory( + context, base::BindRepeating(&CreateTestSyncService)); + } +}; + +IN_PROC_BROWSER_TEST_P(FirstRunParameterizedInteractiveUiTestWithSyncService, + SignInAndSync) { + bool should_skip_test = false; +#if BUILDFLAG(IS_WIN) + // TODO(crbug.com/363254870, crbug.com/366082752): Re-enable this test + should_skip_test = true; +#endif // WIN + if (should_skip_test) { + GTEST_SKIP() << "Test is flaky on win64"; + } + + if (SyncButtonsFeatureConfig() == + SyncButtonsFeatureConfig::kButtonsStillLoading) { + GTEST_SKIP() << "Sync not possible until buttons stop loading"; + } + + auto iph_delay = + AvatarToolbarButton::SetScopedIPHMinDelayAfterCreationForTesting( + base::Seconds(0)); + base::test::TestFuture<bool> proceed_future; + + ASSERT_TRUE(IsProfileNameDefault()); + + OpenFirstRun(proceed_future.GetCallback()); + + RunTestSequenceInContext( + views::ElementTrackerViews::GetContextForView(view()), + + // Wait for the profile picker to show the intro. + WaitForShow(kProfilePickerViewId), + InstrumentNonTabWebView(kWebContentsId, web_view()), + WaitForWebContentsReady(kWebContentsId, GURL(chrome::kChromeUIIntroURL)), + + // Waiting for the animation to complete so we can start interacting with + // the button. + WaitForStateChange(kWebContentsId, IsVisible(GetSignInButtonQuery())), + + Do([&] { + EXPECT_FALSE(GetFirstRunFinishedPrefValue()); + histogram_tester().ExpectUniqueSample( + "Signin.SignIn.Offered", signin_metrics::AccessPoint::kForYouFre, + 1); + }), + + // Advance to the sign-in page. + // Note: the button should be disabled after this, but there is no good + // way to verify it in this sequence. It is verified by unit tests in + // chrome/test/data/webui/intro/sign_in_promo_test.ts + PressJsButton(kWebContentsId, GetSignInButtonQuery()), + // Wait for switch to the Gaia sign-in page to complete. + // Note: kPickerWebContentsId now points to the new profile's WebContents. + WaitForWebContentsNavigation(kWebContentsId, + GetSigninChromeSyncDiceUrl()), + + Do([&] { + histogram_tester().ExpectUniqueSample( + "Signin.SignIn.Started", signin_metrics::AccessPoint::kForYouFre, + 1); + })); + + auto sync_transport_state = + GetParam().with_sync_engine_ready + ? syncer::SyncService::TransportState::ACTIVE + : syncer::SyncService::TransportState::INITIALIZING; + ConfigureTestSyncService(SyncServiceFactory::GetForProfile(profile()), + sync_transport_state); + // Pulled out of the test sequence because it waits using `RunLoop`s. + SimulateSignIn(kTestEmail, kTestGivenName); + + histogram_tester().ExpectUniqueSample( + "Signin.SignIn.Completed", signin_metrics::AccessPoint::kForYouFre, 1); + + const DeepQuery first_search_engine = {"search-engine-choice-app", + "cr-radio-button"}; + + if (base::FeatureList::IsEnabled( + syncer::kReplaceSyncPromosWithSignInPromos)) { + GURL history_page_url = GetHistorySyncOptinURL(); + RunTestSequenceInContext( + views::ElementTrackerViews::GetContextForView(view()), + // Web Contents already instrumented in the previous sequence. + WaitForStateChange(kWebContentsId, + PageWithUrl(history_page_url.spec())), + Do([&] { + histogram_tester().ExpectUniqueSample( + "Signin.HistorySyncOptIn.Started", + signin_metrics::AccessPoint::kForYouFre, 1); + }), + // Button is visible once capabilities are loaded or defaulted. + WaitForButtonVisible(kWebContentsId, GetOptInSyncHistoryButtonQuery()), + + EnsurePresent(kWebContentsId, GetOptInSyncHistoryButtonQuery()), + PressJsButton(kWebContentsId, GetOptInSyncHistoryButtonQuery()) + .SetMustRemainVisible(false), + + CompleteSearchEngineChoiceStep(), CompleteDefaultBrowserStep()); + } else { + GURL sync_page_url = AppendSyncConfirmationQueryParams( + GURL("chrome://sync-confirmation/"), SyncConfirmationStyle::kWindow, + /*is_sync_promo=*/true); + RunTestSequenceInContext( + views::ElementTrackerViews::GetContextForView(view()), + // Web Contents already instrumented in the previous sequence. + WaitForStateChange(kWebContentsId, PageWithUrl(sync_page_url.spec())), + Do([&] { + histogram_tester().ExpectUniqueSample( + "Signin.SyncOptIn.Started", + signin_metrics::AccessPoint::kForYouFre, 1); + }), + + // Button is visible once capabilities are loaded or defaulted. + WaitForButtonVisible(kWebContentsId, GetOptInSyncButtonQuery()), + + EnsurePresent(kWebContentsId, GetOptInSyncButtonQuery()), + PressJsButton(kWebContentsId, GetOptInSyncButtonQuery()) + .SetMustRemainVisible(false), + + CompleteSearchEngineChoiceStep(), CompleteDefaultBrowserStep()); + } + + WaitForPickerClosed(); + + if (base::FeatureList::IsEnabled( + syncer::kReplaceSyncPromosWithSignInPromos)) { + histogram_tester().ExpectUniqueSample( + "Signin.HistorySyncOptIn.Completed", + signin_metrics::AccessPoint::kForYouFre, 1); + } else { + histogram_tester().ExpectUniqueSample( + "Signin.SyncOptIn.Completed", signin_metrics::AccessPoint::kForYouFre, + 1); + } + + histogram_tester().ExpectBucketCount("ProfilePicker.FirstRun.DefaultBrowser", + DefaultBrowserChoice::kClickSetAsDefault, + 1); + + histogram_tester().ExpectBucketCount( + search_engines::kSearchEngineChoiceScreenEventsHistogram, + search_engines::SearchEngineChoiceScreenEvents::kFreDefaultWasSet, 1); + + EXPECT_TRUE(proceed_future.Get()); + + EXPECT_TRUE(GetFirstRunFinishedPrefValue()); + EXPECT_FALSE(fre_service()->ShouldOpenFirstRun()); + EXPECT_EQ(base::ASCIIToUTF16(kTestGivenName), GetProfileName()); + EXPECT_FALSE(IsUsingDefaultProfileName()); + + // Re-assessment of all metrics from this flow, and check for no + // double-logs. + histogram_tester().ExpectUniqueSample( + "Signin.SignIn.Offered", signin_metrics::AccessPoint::kForYouFre, 1); + histogram_tester().ExpectUniqueSample( + "Signin.SignIn.Started", signin_metrics::AccessPoint::kForYouFre, 1); + histogram_tester().ExpectUniqueSample( + "Signin.SignIn.Completed", signin_metrics::AccessPoint::kForYouFre, 1); + if (base::FeatureList::IsEnabled( + syncer::kReplaceSyncPromosWithSignInPromos)) { + histogram_tester().ExpectUniqueSample( + "Signin.HistorySyncOptIn.Started", + signin_metrics::AccessPoint::kForYouFre, 1); + histogram_tester().ExpectUniqueSample( + "Signin.HistorySyncOptIn.Completed", + signin_metrics::AccessPoint::kForYouFre, 1); + } else { + histogram_tester().ExpectUniqueSample( + "Signin.SyncOptIn.Started", signin_metrics::AccessPoint::kForYouFre, 1); + histogram_tester().ExpectUniqueSample( + "Signin.SyncOptIn.Completed", signin_metrics::AccessPoint::kForYouFre, + 1); + } + histogram_tester().ExpectUniqueSample( + "Signin.SyncButtons.Shown", + *ExpectedButtonShownMetric(SyncButtonsFeatureConfig()), 1); + histogram_tester().ExpectUniqueSample( + "ProfilePicker.FirstRun.ExitStatus", + ProfilePicker::FirstRunExitStatus::kCompleted, 1); + + ExpectStepHistograms(Step::kIntro, /*shown=*/true); + ExpectStepHistograms(Step::kAccountSelection, /*shown=*/true); + ExpectStepHistograms(Step::kPostSignInFlow, /*shown=*/true); + ExpectStepHistograms(Step::kSearchEngineChoice, /*shown=*/true); + ExpectStepHistograms(Step::kDefaultBrowser, /*shown=*/true); + ExpectStepHistograms(Step::kFinishFlow, /*shown=*/true, /*with_exit=*/true); + histogram_tester().ExpectTotalCount("ProfilePicker.FREFlow.StepShownDuration", + 6); + histogram_tester().ExpectTotalCount("ProfilePicker.FREFlow.StepTotalDuration", + 6); + + RunTestSequence( + If([]() { return WithSupervisedUser(); }, + Then(WaitForPromo( + feature_engagement::kIPHSupervisedUserProfileSigninFeature)), + Else(EnsureNotPresent( + user_education::HelpBubbleView::kHelpBubbleElementIdForTesting)))); +} + +IN_PROC_BROWSER_TEST_P(FirstRunParameterizedInteractiveUiTestWithSyncService, + DeclineSync) { + bool should_skip_test = false; +#if BUILDFLAG(IS_WIN) + // TODO(crbug.com/366082752): Re-enable this test + should_skip_test = true; +#endif // WIN + if (should_skip_test) { + GTEST_SKIP() << "Test is flaky on win64"; + } + + if (SyncButtonsFeatureConfig() == + SyncButtonsFeatureConfig::kButtonsStillLoading) { + GTEST_SKIP() << "Decline is not possible until buttons stop loading"; + } + auto iph_delay = + AvatarToolbarButton::SetScopedIPHMinDelayAfterCreationForTesting( + base::Seconds(0)); + base::test::TestFuture<bool> proceed_future; + + ASSERT_TRUE(IsProfileNameDefault()); + + OpenFirstRun(proceed_future.GetCallback()); + RunTestSequenceInContext( + views::ElementTrackerViews::GetContextForView(view()), + + // Wait for the profile picker to show the intro. + WaitForShow(kProfilePickerViewId), + InstrumentNonTabWebView(kWebContentsId, web_view()), + CompleteIntroStep(/*sign_in=*/true), + // Wait for switch to the Gaia sign-in page to complete. + // Note: kPickerWebContentsId now points to the new profile's WebContents. + WaitForWebContentsNavigation(kWebContentsId, + GetSigninChromeSyncDiceUrl())); + + auto sync_transport_state = + GetParam().with_sync_engine_ready + ? syncer::SyncService::TransportState::ACTIVE + : syncer::SyncService::TransportState::INITIALIZING; + ConfigureTestSyncService(SyncServiceFactory::GetForProfile(profile()), + sync_transport_state); + // Pulled out of the test sequence because it waits using `RunLoop`s. + SimulateSignIn(kTestEmail, kTestGivenName); + + if (base::FeatureList::IsEnabled( + syncer::kReplaceSyncPromosWithSignInPromos)) { + GURL history_page_url = GetHistorySyncOptinURL(); + RunTestSequenceInContext( + views::ElementTrackerViews::GetContextForView(view()), + // Web Contents already instrumented in the previous sequence. + WaitForStateChange(kWebContentsId, + PageWithUrl(history_page_url.spec())), + // Button is visible once capabilities are loaded or defaulted. + WaitForButtonVisible(kWebContentsId, GetDontSyncHistoryButtonQuery()), + + EnsurePresent(kWebContentsId, GetDontSyncHistoryButtonQuery()), + PressJsButton(kWebContentsId, GetDontSyncHistoryButtonQuery()), + + CompleteSearchEngineChoiceStep(), CompleteDefaultBrowserStep()); + } else { + RunTestSequenceInContext( + views::ElementTrackerViews::GetContextForView(view()), + // Web Contents already instrumented in the previous sequence. + WaitForStateChange(kWebContentsId, + PageWithUrl(AppendSyncConfirmationQueryParams( + GURL("chrome://sync-confirmation/"), + SyncConfirmationStyle::kWindow, + /*is_sync_promo=*/true) + .spec())), + // Button is visible once capabilities are loaded or defaulted. + WaitForButtonVisible(kWebContentsId, GetDontSyncButtonQuery()), + + EnsurePresent(kWebContentsId, GetDontSyncButtonQuery()), + PressJsButton(kWebContentsId, GetDontSyncButtonQuery()), + + CompleteSearchEngineChoiceStep(), CompleteDefaultBrowserStep()); + } + + // Wait for the picker to be closed and deleted. + WaitForPickerClosed(); + + EXPECT_TRUE(proceed_future.Get()); + + EXPECT_EQ(base::ASCIIToUTF16(kTestGivenName), GetProfileName()); + + // Checking the expected metrics from this flow. + histogram_tester().ExpectUniqueSample( + "Signin.SignIn.Offered", signin_metrics::AccessPoint::kForYouFre, 1); + histogram_tester().ExpectUniqueSample( + "Signin.SignIn.Started", signin_metrics::AccessPoint::kForYouFre, 1); + histogram_tester().ExpectUniqueSample( + "Signin.SignIn.Completed", signin_metrics::AccessPoint::kForYouFre, 1); + if (base::FeatureList::IsEnabled( + syncer::kReplaceSyncPromosWithSignInPromos)) { + histogram_tester().ExpectUniqueSample( + "Signin.HistorySyncOptIn.Started", + signin_metrics::AccessPoint::kForYouFre, 1); + histogram_tester().ExpectTotalCount("Signin.HistorySyncOptIn.Completed", 0); + } else { + histogram_tester().ExpectUniqueSample( + "Signin.SyncOptIn.Started", signin_metrics::AccessPoint::kForYouFre, 1); + histogram_tester().ExpectTotalCount("Signin.SyncOptIn.Completed", 0); + } + histogram_tester().ExpectUniqueSample( + "Signin.SyncButtons.Shown", + *ExpectedButtonShownMetric(SyncButtonsFeatureConfig()), 1); + histogram_tester().ExpectUniqueSample( + "ProfilePicker.FirstRun.ExitStatus", + ProfilePicker::FirstRunExitStatus::kCompleted, 1); + + RunTestSequence( + If([]() { return WithSupervisedUser(); }, + Then(WaitForPromo( + feature_engagement::kIPHSupervisedUserProfileSigninFeature)), + Else(EnsureNotPresent( + user_education::HelpBubbleView::kHelpBubbleElementIdForTesting)))); +} + +INSTANTIATE_TEST_SUITE_P(, + FirstRunParameterizedInteractiveUiTestWithSyncService, + ValuesIn(GetTestParams()), + &ParamToTestSuffix); + class FirstRunWithHatsInteractiveUiTest : public FirstRunInteractiveUiTest { public: FirstRunWithHatsInteractiveUiTest() - : scoped_feature_list_( - /*enable_feature=*/switches::kBeforeFirstRunDesktopRefreshSurvey) {} + : FirstRunInteractiveUiTest(/*fixture_enabled_features=*/{ + {switches::kBeforeFirstRunDesktopRefreshSurvey, {}}}) {} void SetUpOnMainThread() override { FirstRunInteractiveUiTest::SetUpOnMainThread(); @@ -1538,9 +1667,79 @@ private: raw_ptr<MockHatsService> mock_hats_service_ = nullptr; - base::test::ScopedFeatureList scoped_feature_list_; }; +// TODO(crbug.com/366082752): Re-enable this test once the issue is fixed. +#if BUILDFLAG(IS_WIN) +#define MAYBE_DoNotLaunchHatsIfDeclineSignIn \ + DISABLED_DoNotLaunchHatsIfDeclineSignIn +#else +#define MAYBE_DoNotLaunchHatsIfDeclineSignIn DoNotLaunchHatsIfDeclineSignIn +#endif +IN_PROC_BROWSER_TEST_P(FirstRunWithHatsInteractiveUiTest, + MAYBE_DoNotLaunchHatsIfDeclineSignIn) { + ASSERT_TRUE(IsProfileNameDefault()); + ASSERT_TRUE(fre_service()->ShouldOpenFirstRun()); + + EXPECT_CALL( + mock_hats_service(), + LaunchDelayedSurvey(kHatsSurveyTriggerIdentityFirstRunCompleted, _, _, _)) + .Times(0); + + base::test::TestFuture<bool> proceed_future; + OpenFirstRun(proceed_future.GetCallback()); + + RunTestSequenceInContext( + views::ElementTrackerViews::GetContextForView(view()), + WaitForShow(kProfilePickerViewId), + InstrumentNonTabWebView(kWebContentsId, web_view()), + CompleteIntroStep(/*sign_in=*/false)); + + WaitForPickerClosed(); + + EXPECT_TRUE(proceed_future.Get()); + EXPECT_TRUE(GetFirstRunFinishedPrefValue()); + ExpectStepHistograms(Step::kFinishFlow, /*shown=*/true, /*with_exit=*/true); +} + +IN_PROC_BROWSER_TEST_P(FirstRunWithHatsInteractiveUiTest, + DoNotLaunchHatsIfFlowNotCompleted) { + ASSERT_TRUE(IsProfileNameDefault()); + ASSERT_TRUE(fre_service()->ShouldOpenFirstRun()); + + EXPECT_CALL( + mock_hats_service(), + LaunchDelayedSurvey(kHatsSurveyTriggerIdentityFirstRunCompleted, _, _, _)) + .Times(0); + + base::test::TestFuture<bool> proceed_future; + OpenFirstRun(proceed_future.GetCallback()); + + RunTestSequenceInContext( + views::ElementTrackerViews::GetContextForView(view()), + WaitForShow(kProfilePickerViewId), + InstrumentNonTabWebView(kWebContentsId, web_view()), + WaitForWebContentsReady(kWebContentsId, GURL(chrome::kChromeUIIntroURL)), + SendAccelerator(kProfilePickerViewId, GetAccelerator(IDC_CLOSE_WINDOW)) + .SetMustRemainVisible(false)); + + WaitForPickerClosed(); + + EXPECT_TRUE(proceed_future.Get()); + EXPECT_TRUE(GetFirstRunFinishedPrefValue()); + ExpectStepHistograms(Step::kIntro, /*shown=*/true, /*with_exit=*/true); +} + +INSTANTIATE_TEST_SUITE_P( + , + FirstRunWithHatsInteractiveUiTest, + Values(std::nullopt, + switches::FirstRunDesktopSignInPromoVariation::kDefault), + [](const TestParamInfo< + std::optional<switches::FirstRunDesktopSignInPromoVariation>>& info) { + return RefreshedViewSuffix(info.param); + }); + class FirstRunWithHatsInteractiveUiTestWithSyncService : public FirstRunWithHatsInteractiveUiTest { protected: @@ -1558,7 +1757,7 @@ #else #define MAYBE_LaunchHats LaunchHats #endif -IN_PROC_BROWSER_TEST_F(FirstRunWithHatsInteractiveUiTestWithSyncService, +IN_PROC_BROWSER_TEST_P(FirstRunWithHatsInteractiveUiTestWithSyncService, MAYBE_LaunchHats) { ASSERT_TRUE(IsProfileNameDefault()); ASSERT_TRUE(fre_service()->ShouldOpenFirstRun()); @@ -1602,45 +1801,12 @@ // TODO(crbug.com/366082752): Re-enable this test once the issue is fixed. #if BUILDFLAG(IS_WIN) -#define MAYBE_DoNotLaunchHatsIfDeclineSignIn \ - DISABLED_DoNotLaunchHatsIfDeclineSignIn -#else -#define MAYBE_DoNotLaunchHatsIfDeclineSignIn DoNotLaunchHatsIfDeclineSignIn -#endif -IN_PROC_BROWSER_TEST_F(FirstRunWithHatsInteractiveUiTest, - MAYBE_DoNotLaunchHatsIfDeclineSignIn) { - ASSERT_TRUE(IsProfileNameDefault()); - ASSERT_TRUE(fre_service()->ShouldOpenFirstRun()); - - EXPECT_CALL( - mock_hats_service(), - LaunchDelayedSurvey(kHatsSurveyTriggerIdentityFirstRunCompleted, _, _, _)) - .Times(0); - - base::test::TestFuture<bool> proceed_future; - OpenFirstRun(proceed_future.GetCallback()); - - RunTestSequenceInContext( - views::ElementTrackerViews::GetContextForView(view()), - WaitForShow(kProfilePickerViewId), - InstrumentNonTabWebView(kWebContentsId, web_view()), - CompleteIntroStep(/*sign_in=*/false)); - - WaitForPickerClosed(); - - EXPECT_TRUE(proceed_future.Get()); - EXPECT_TRUE(GetFirstRunFinishedPrefValue()); - ExpectStepHistograms(Step::kFinishFlow, /*shown=*/true, /*with_exit=*/true); -} - -// TODO(crbug.com/366082752): Re-enable this test once the issue is fixed. -#if BUILDFLAG(IS_WIN) #define MAYBE_DoNotLaunchHatsIfEnterpriseUser \ DISABLED_DoNotLaunchHatsIfEnterpriseUser #else #define MAYBE_DoNotLaunchHatsIfEnterpriseUser DoNotLaunchHatsIfEnterpriseUser #endif -IN_PROC_BROWSER_TEST_F(FirstRunWithHatsInteractiveUiTestWithSyncService, +IN_PROC_BROWSER_TEST_P(FirstRunWithHatsInteractiveUiTestWithSyncService, MAYBE_DoNotLaunchHatsIfEnterpriseUser) { ASSERT_TRUE(IsProfileNameDefault()); ASSERT_TRUE(fre_service()->ShouldOpenFirstRun()); @@ -1695,7 +1861,10 @@ RunTestSequenceInContext( views::ElementTrackerViews::GetContextForView(view()), WaitForWebContentsNavigation( - kWebContentsId, GURL(chrome::kChromeUIManagedUserProfileNoticeUrl)), + kWebContentsId, + UseRefreshedView() + ? GURL(chrome::kChromeUIManagedUserProfileNoticeRefreshURL) + : GURL(chrome::kChromeUIManagedUserProfileNoticeUrl)), EnsurePresent(kWebContentsId, GetAcceptManagementButtonQuery()), PressJsButton(kWebContentsId, GetAcceptManagementButtonQuery()), DeclineHistorySync()); @@ -1707,49 +1876,23 @@ ExpectStepHistograms(Step::kFinishFlow, /*shown=*/true, /*with_exit=*/true); } -IN_PROC_BROWSER_TEST_F(FirstRunWithHatsInteractiveUiTest, - DoNotLaunchHatsIfFlowNotCompleted) { - ASSERT_TRUE(IsProfileNameDefault()); - ASSERT_TRUE(fre_service()->ShouldOpenFirstRun()); - - EXPECT_CALL( - mock_hats_service(), - LaunchDelayedSurvey(kHatsSurveyTriggerIdentityFirstRunCompleted, _, _, _)) - .Times(0); - - base::test::TestFuture<bool> proceed_future; - OpenFirstRun(proceed_future.GetCallback()); - - RunTestSequenceInContext( - views::ElementTrackerViews::GetContextForView(view()), - WaitForShow(kProfilePickerViewId), - InstrumentNonTabWebView(kWebContentsId, web_view()), - WaitForWebContentsReady(kWebContentsId, GURL(chrome::kChromeUIIntroURL)), - SendAccelerator(kProfilePickerViewId, GetAccelerator(IDC_CLOSE_WINDOW)) - .SetMustRemainVisible(false)); - - WaitForPickerClosed(); - - EXPECT_TRUE(proceed_future.Get()); - EXPECT_TRUE(GetFirstRunFinishedPrefValue()); - ExpectStepHistograms(Step::kIntro, /*shown=*/true, /*with_exit=*/true); -} +INSTANTIATE_TEST_SUITE_P( + , + FirstRunWithHatsInteractiveUiTestWithSyncService, + Values(std::nullopt, + switches::FirstRunDesktopSignInPromoVariation::kDefault), + [](const TestParamInfo< + std::optional<switches::FirstRunDesktopSignInPromoVariation>>& info) { + return RefreshedViewSuffix(info.param); + }); class FirstRunDontSignInOnGaiaPageInteractiveUiTest - : public FirstRunWithHatsInteractiveUiTest { + : public FirstRunInteractiveUiBaseTest { public: - FirstRunDontSignInOnGaiaPageInteractiveUiTest() { - scoped_feature_list_override_.InitWithFeaturesAndParameters( - { - {switches::kFirstRunDesktopRefresh, - {{switches::kFirstRunDesktopSignInPromoVariation.name, - "dont-sign-in-on-gaia-page"}}}, - }, - {}); - } - - private: - base::test::ScopedFeatureList scoped_feature_list_override_; + FirstRunDontSignInOnGaiaPageInteractiveUiTest() + : FirstRunInteractiveUiBaseTest(TestParam{ + .refreshed_view_variant = switches:: + FirstRunDesktopSignInPromoVariation::kDontSignInOnGaiaPage}) {} }; // TODO(crbug.com/366119368): Re-enable this test @@ -1769,7 +1912,7 @@ views::ElementTrackerViews::GetContextForView(view()), WaitForShow(kProfilePickerViewId), InstrumentNonTabWebView(kWebContentsId, web_view()), - CompleteIntroStep(/*sign_in=*/true, /*use_refreshed_view=*/true), + CompleteIntroStep(/*sign_in=*/true), WaitForWebContentsNavigation(kWebContentsId, GetSigninChromeSyncDiceUrl()), WaitForShow(kProfilePickerSignInToolbarDontSignInButtonElementId),
diff --git a/chrome/browser/ui/views/promos/ios_promo_bubble_interactive_uitest.cc b/chrome/browser/ui/views/promos/ios_promo_bubble_interactive_uitest.cc index 8741c544..01b1e4f 100644 --- a/chrome/browser/ui/views/promos/ios_promo_bubble_interactive_uitest.cc +++ b/chrome/browser/ui/views/promos/ios_promo_bubble_interactive_uitest.cc
@@ -91,15 +91,15 @@ case PromoType::kAddress: anchor = button_provider->GetBubbleAnchor( kActionShowAddressesBubbleOrPage); - highlighted_button = button_provider->GetPageActionIconView( - PageActionIconType::kAutofillAddress); + highlighted_button = button_provider->GetPageActionView( + kActionShowAddressesBubbleOrPage); highlighted_element = kAutofillAddressPageActionElementId; break; case PromoType::kPayment: anchor = button_provider->GetBubbleAnchor(kActionShowPaymentsBubbleOrPage); - highlighted_button = button_provider->GetPageActionIconView( - PageActionIconType::kSaveCard); + highlighted_button = + button_provider->GetPageActionView(kActionShowPaymentsBubbleOrPage); highlighted_element = kAutofillSavePaymentsPageActionElementId; break; case PromoType::kEnhancedBrowsing: @@ -124,9 +124,7 @@ IN_PROC_BROWSER_TEST_P(IOSPromoBubbleBrowserTest, ShowQRCode) { if (GetParam() == PromoType::kAddress) { - if (IsPageActionMigrated(PageActionIconType::kAutofillAddress)) { - GTEST_SKIP() << "This test is for the non-migrated state."; - } + GTEST_SKIP() << "kAutofillAddress is migrated, use ShowQRCode_NoPageAction instead."; } RunTestSequence( @@ -142,10 +140,6 @@ GTEST_SKIP() << "Test is only for DesktopToIOSPromoType::kAddress."; } - if (!IsPageActionMigrated(PageActionIconType::kAutofillAddress)) { - GTEST_SKIP() << "This test is for the migrated state."; - } - RunTestSequence( SetOnIncompatibleAction(OnIncompatibleAction::kIgnoreAndContinue, "Kombucha screenshots not supported on all bots"),
diff --git a/chrome/browser/ui/views/tabs/tab_strip_action_container_unittest.cc b/chrome/browser/ui/views/tabs/tab_strip_action_container_unittest.cc index f35e8f7..bab0d99 100644 --- a/chrome/browser/ui/views/tabs/tab_strip_action_container_unittest.cc +++ b/chrome/browser/ui/views/tabs/tab_strip_action_container_unittest.cc
@@ -15,6 +15,8 @@ #include "chrome/browser/ui/browser_element_identifiers.h" #include "chrome/browser/ui/browser_window/test/mock_browser_window_interface.h" #include "chrome/browser/ui/call_to_action/call_to_action_lock.h" +#include "chrome/browser/ui/tabs/tab_list_bridge.h" +#include "chrome/browser/ui/tabs/tab_model.h" #include "chrome/browser/ui/tabs/test_tab_strip_model_delegate.h" #include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/views/interaction/browser_elements_views.h" @@ -134,6 +136,8 @@ glic_nudge_controller_.reset(); browser_window_interface_.reset(); tab_interface_.reset(); + tab_list_bridge_.reset(); + raw_web_contents_ = nullptr; tab_strip_model_.reset(); tab_strip_.reset(); @@ -160,6 +164,9 @@ &tab_strip_model_delegate_, tab_strip_->GetBrowserWindowInterface()->GetProfile()); + tab_list_bridge_ = + std::make_unique<TabListBridge>(*tab_strip_model_, data_host_); + tab_interface_ = std::make_unique<tabs::MockTabInterface>(); browser_window_interface_ = std::make_unique<MockBrowserWindowInterface>(); @@ -178,28 +185,23 @@ ON_CALL(*tab_interface_, GetContents) .WillByDefault(::testing::Return(web_contents_.get())); - ON_CALL(*browser_window_interface_, RegisterActiveTabDidChange) - .WillByDefault([this](auto callback) { - SetActiveTabChangedCallback(callback); - return base::CallbackListSubscription(); - }); + + raw_web_contents_ = web_contents_.get(); + tab_strip_model_->AppendWebContents(std::move(web_contents_), + /*foreground=*/true); glic_nudge_controller_ = std::make_unique<glic::GlicNudgeController>( - browser_window_interface_.get()); + browser_window_interface_.get(), tab_list_bridge_.get()); tab_strip_action_container_ = std::make_unique<TabStripActionContainer>( tab_strip_->GetBrowserWindowInterface(), glic_nudge_controller_.get()); } - void SetActiveTabChangedCallback( - base::RepeatingCallback<void(BrowserWindowInterface*)> cb) { - active_tab_changed_callback_ = cb; - } - protected: glic::GlicUnitTestEnvironment glic_test_environment_; std::unique_ptr<TabStrip> tab_strip_; std::unique_ptr<TabStripModel> tab_strip_model_; + std::unique_ptr<TabListBridge> tab_list_bridge_; std::unique_ptr<glic::GlicNudgeController> glic_nudge_controller_; std::unique_ptr<tabs::MockTabInterface> tab_interface_; std::unique_ptr<MockBrowserWindowInterface> browser_window_interface_; @@ -210,10 +212,13 @@ std::unique_ptr<views::View> locked_expansion_view_; std::unique_ptr<TabStripActionContainer> tab_strip_action_container_; - content::WebContents* web_contents() { return web_contents_.get(); } + content::WebContents* web_contents() { return raw_web_contents_; } void SimulateActiveTabChanged() { - active_tab_changed_callback_.Run(browser_window_interface_.get()); + auto new_contents = content::WebContentsTester::CreateTestWebContents( + profile_.get(), nullptr); + tab_strip_model_->AppendWebContents(std::move(new_contents), + /*foreground=*/true); } private: @@ -225,9 +230,10 @@ #endif // BUILDFLAG(IS_CHROMEOS) raw_ptr<TestingProfile> profile_ = nullptr; std::unique_ptr<content::WebContents> web_contents_; + raw_ptr<content::WebContents> raw_web_contents_ = nullptr; gfx::AnimationTestApi::RenderModeResetter animation_mode_reset_; - base::RepeatingCallback<void(BrowserWindowInterface*)> - active_tab_changed_callback_; + tabs::TabModel::PreventFeatureInitializationForTesting + prevent_feature_initialization_; }; TEST_F(TabStripActionContainerTest, MAYBE(GlicButtonDrawing)) {
diff --git a/chrome/browser/ui/views/toolbar/BUILD.gn b/chrome/browser/ui/views/toolbar/BUILD.gn index 13456412..b89e884 100644 --- a/chrome/browser/ui/views/toolbar/BUILD.gn +++ b/chrome/browser/ui/views/toolbar/BUILD.gn
@@ -362,10 +362,7 @@ if (toolkit_views) { sources = [ "app_menu_interactive_uitest.cc", - "back_button_accessibility_interactive_uitest.cc", "browser_app_menu_button_interactive_uitest.cc", - "forward_button_accessibility_interactive_uitest.cc", - "home_button_accessibility_interactive_uitest.cc", "reload_button_accessibility_interactive_uitest.cc", "reload_button_browsertest.cc", "split_tabs_button_interactive_ui_test.cc", @@ -404,8 +401,6 @@ "//components/feature_engagement/test:test_support", "//components/policy/core/browser", "//components/prefs", - "//components/strings:components_strings", - "//components/strings:components_strings_grit", "//components/user_education/views", "//content/test:test_support", "//testing/gtest",
diff --git a/chrome/browser/ui/views/toolbar/back_button_accessibility_interactive_uitest.cc b/chrome/browser/ui/views/toolbar/back_button_accessibility_interactive_uitest.cc deleted file mode 100644 index c3d38e89..0000000 --- a/chrome/browser/ui/views/toolbar/back_button_accessibility_interactive_uitest.cc +++ /dev/null
@@ -1,174 +0,0 @@ -// Copyright 2026 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/test/run_until.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/browser_element_identifiers.h" -#include "chrome/browser/ui/views/toolbar/toolbar_view.h" -#include "chrome/browser/ui/views/toolbar/webui_toolbar_web_view.h" -#include "chrome/browser/ui/waap/initial_web_ui_manager.h" -#include "chrome/common/chrome_features.h" -#include "chrome/grit/generated_resources.h" -#include "chrome/test/interaction/interactive_browser_test.h" -#include "components/strings/grit/components_strings.h" -#include "content/public/browser/browser_accessibility_state.h" -#include "content/public/browser/scoped_accessibility_mode.h" -#include "content/public/common/content_features.h" -#include "content/public/test/accessibility_notification_waiter.h" -#include "content/public/test/browser_test.h" -#include "ui/accessibility/ax_node.h" -#include "ui/accessibility/ax_node_data.h" -#include "ui/base/interaction/element_identifier.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/base/test/ui_controls.h" -#include "ui/views/accessibility/view_accessibility.h" -#include "ui/views/controls/webview/webview.h" -#include "ui/views/interaction/element_tracker_views.h" -#include "ui/webui/tracked_element/tracked_element_handler.h" -#include "ui/webui/tracked_element/tracked_element_web_ui.h" - -namespace { -DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kWebContentsElementId); -DEFINE_LOCAL_STATE_IDENTIFIER_VALUE(ui::test::PollingStateObserver<int>, - kTabCountState); -} // namespace - -// For now, BackButton is not implemented in WebUI, so we only test Views. -// TODO(crbug.com/470038385): Implement WebUI BackButton and re-enable WebUI -// tests. -class BackButtonAccessibilityTest : public InteractiveBrowserTest { - public: - BackButtonAccessibilityTest() { - feature_list_.InitAndDisableFeature(::features::kInitialWebUI); - } - - void SetUpOnMainThread() override { - InteractiveBrowserTest::SetUpOnMainThread(); - - scoped_accessibility_mode_ = - content::BrowserAccessibilityState::GetInstance() - ->CreateScopedModeForProcess(ui::kAXModeComplete); - } - - static ui::AXNode* FindBackButtonNode(ui::AXNode* node) { - if (node->data().role == ax::mojom::Role::kButton && - node->data().GetString16Attribute(ax::mojom::StringAttribute::kName) == - l10n_util::GetStringUTF16(IDS_ACCNAME_BACK)) { - return node; - } - for (ui::AXNode* child : node->children()) { - if (ui::AXNode* found = FindBackButtonNode(child)) { - return found; - } - } - return nullptr; - } - - static ui::AXNodeData GetBackAXNodeData(const ui::TrackedElement* el, - const char* file, - int line) { - if (auto* const view_el = el->AsA<views::TrackedElementViews>()) { - ui::AXNodeData node_data; - view_el->view()->GetViewAccessibility().GetAccessibleNodeData(&node_data); - return node_data; - } else if (auto* const webui_el = el->AsA<ui::TrackedElementWebUI>()) { - ui::AXNode* root = - webui_el->handler()->web_contents()->GetAccessibilityRootNode(); - if (!root) { - ADD_FAILURE_AT(file, line) << "Could not get AXNode root"; - return {}; - } - ui::AXNode* back_button = FindBackButtonNode(root); - if (!back_button) { - ADD_FAILURE_AT(file, line) << "Could not find AXNode back_button"; - return {}; - } - return back_button->data(); - } else { - ADD_FAILURE_AT(file, line) << "Unsupported element type"; - return {}; - } - } - - auto MoveMouseToElement(ui::ElementIdentifier id) { - return MoveMouseTo(id, base::BindOnce([](ui::TrackedElement* el) { - return el->GetScreenBounds().CenterPoint(); - })); - } - - protected: - std::unique_ptr<content::ScopedAccessibilityMode> scoped_accessibility_mode_; - - private: - base::test::ScopedFeatureList feature_list_; -}; - -IN_PROC_BROWSER_TEST_F(BackButtonAccessibilityTest, LeftClickBack) { - ASSERT_TRUE(embedded_test_server()->Start()); - GURL url1 = embedded_test_server()->GetURL("/title1.html"); - GURL url2 = embedded_test_server()->GetURL("/title2.html"); - RunTestSequence(InstrumentTab(kWebContentsElementId), - NavigateWebContents(kWebContentsElementId, url1), - NavigateWebContents(kWebContentsElementId, url2), - // Click back - MoveMouseToElement(kToolbarBackButtonElementId), ClickMouse(), - // Wait for navigation back to url1 - WaitForWebContentsNavigation(kWebContentsElementId, url1)); -} - -#if BUILDFLAG(IS_MAC) -#define MAYBE_MiddleClickBack DISABLED_MiddleClickBack -#else -#define MAYBE_MiddleClickBack MiddleClickBack -#endif -IN_PROC_BROWSER_TEST_F(BackButtonAccessibilityTest, MAYBE_MiddleClickBack) { - ASSERT_TRUE(embedded_test_server()->Start()); - GURL url1 = embedded_test_server()->GetURL("/title1.html"); - GURL url2 = embedded_test_server()->GetURL("/title2.html"); - RunTestSequence( - InstrumentTab(kWebContentsElementId), - NavigateWebContents(kWebContentsElementId, url1), - NavigateWebContents(kWebContentsElementId, url2), - Check([&]() { return browser()->tab_strip_model()->count() == 1; }), - PollState(kTabCountState, - [this]() { return browser()->tab_strip_model()->count(); }), - MoveMouseToElement(kToolbarBackButtonElementId), - ClickMouse(ui_controls::MIDDLE), WaitForState(kTabCountState, 2), - Check([&]() { - return browser() - ->tab_strip_model() - ->GetWebContentsAt(1) - ->GetVisibleURL() == url1; - })); -} - -IN_PROC_BROWSER_TEST_F(BackButtonAccessibilityTest, ContextMenu) { - ASSERT_TRUE(embedded_test_server()->Start()); - GURL url1 = embedded_test_server()->GetURL("/title1.html"); - GURL url2 = embedded_test_server()->GetURL("/title2.html"); - RunTestSequence(InstrumentTab(kWebContentsElementId), - NavigateWebContents(kWebContentsElementId, url1), - NavigateWebContents(kWebContentsElementId, url2), - // Right-click to open history menu - MoveMouseToElement(kToolbarBackButtonElementId), - ClickMouse(ui_controls::RIGHT), - // Wait for history menu - WaitForShow(kToolbarBackButtonMenuElementId)); -} - -IN_PROC_BROWSER_TEST_F(BackButtonAccessibilityTest, AccessibilityNode) { - RunTestSequence( - WaitForShow(kToolbarBackButtonElementId), - CheckElement( - kToolbarBackButtonElementId, - [](ui::TrackedElement* el) { - return GetBackAXNodeData(el, __FILE__, __LINE__).role; - }, - ax::mojom::Role::kButton), - CheckElement(kToolbarBackButtonElementId, [](ui::TrackedElement* el) { - return GetBackAXNodeData(el, __FILE__, __LINE__) - .GetString16Attribute(ax::mojom::StringAttribute::kName) == - l10n_util::GetStringUTF16(IDS_ACCNAME_BACK); - })); -}
diff --git a/chrome/browser/ui/views/toolbar/forward_button_accessibility_interactive_uitest.cc b/chrome/browser/ui/views/toolbar/forward_button_accessibility_interactive_uitest.cc deleted file mode 100644 index 175582f..0000000 --- a/chrome/browser/ui/views/toolbar/forward_button_accessibility_interactive_uitest.cc +++ /dev/null
@@ -1,211 +0,0 @@ -// Copyright 2026 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/test/run_until.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/browser_element_identifiers.h" -#include "chrome/browser/ui/views/toolbar/toolbar_view.h" -#include "chrome/browser/ui/views/toolbar/webui_toolbar_web_view.h" -#include "chrome/browser/ui/waap/initial_web_ui_manager.h" -#include "chrome/common/chrome_features.h" -#include "chrome/common/pref_names.h" -#include "chrome/grit/generated_resources.h" -#include "chrome/test/interaction/interactive_browser_test.h" -#include "components/prefs/pref_service.h" -#include "components/strings/grit/components_strings.h" -#include "content/public/browser/browser_accessibility_state.h" -#include "content/public/browser/scoped_accessibility_mode.h" -#include "content/public/common/content_features.h" -#include "content/public/test/accessibility_notification_waiter.h" -#include "content/public/test/browser_test.h" -#include "ui/accessibility/ax_node.h" -#include "ui/accessibility/ax_node_data.h" -#include "ui/base/interaction/element_identifier.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/base/test/ui_controls.h" -#include "ui/views/accessibility/view_accessibility.h" -#include "ui/views/controls/webview/webview.h" -#include "ui/views/interaction/element_tracker_views.h" -#include "ui/webui/tracked_element/tracked_element_handler.h" -#include "ui/webui/tracked_element/tracked_element_web_ui.h" - -namespace { -DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kWebContentsElementId); -DEFINE_LOCAL_STATE_IDENTIFIER_VALUE(ui::test::PollingStateObserver<int>, - kTabCountState); -} // namespace - -// For now, ForwardButton is not implemented in WebUI, so we only test Views. -// TODO(crbug.com/470038385): Implement WebUI ForwardButton and re-enable WebUI -// tests. -class ForwardButtonAccessibilityTest : public InteractiveBrowserTest { - public: - ForwardButtonAccessibilityTest() { - feature_list_.InitAndDisableFeature(::features::kInitialWebUI); - } - - void SetUpOnMainThread() override { - InteractiveBrowserTest::SetUpOnMainThread(); - - scoped_accessibility_mode_ = - content::BrowserAccessibilityState::GetInstance() - ->CreateScopedModeForProcess(ui::kAXModeComplete); - } - - static ui::AXNode* FindForwardButtonNode(ui::AXNode* node) { - if (node->data().role == ax::mojom::Role::kButton && - node->data().GetString16Attribute(ax::mojom::StringAttribute::kName) == - l10n_util::GetStringUTF16(IDS_ACCNAME_FORWARD)) { - return node; - } - for (ui::AXNode* child : node->children()) { - if (ui::AXNode* found = FindForwardButtonNode(child)) { - return found; - } - } - return nullptr; - } - - static ui::AXNodeData GetForwardAXNodeData(const ui::TrackedElement* el, - const char* file, - int line) { - if (auto* const view_el = el->AsA<views::TrackedElementViews>()) { - ui::AXNodeData node_data; - view_el->view()->GetViewAccessibility().GetAccessibleNodeData(&node_data); - return node_data; - } else if (auto* const webui_el = el->AsA<ui::TrackedElementWebUI>()) { - ui::AXNode* root = - webui_el->handler()->web_contents()->GetAccessibilityRootNode(); - if (!root) { - ADD_FAILURE_AT(file, line) << "Could not get AXNode root"; - return {}; - } - ui::AXNode* forward_button = FindForwardButtonNode(root); - if (!forward_button) { - ADD_FAILURE_AT(file, line) << "Could not find AXNode forward_button"; - return {}; - } - return forward_button->data(); - } else { - ADD_FAILURE_AT(file, line) << "Unsupported element type"; - return {}; - } - } - - auto MoveMouseToElement(ui::ElementIdentifier id) { - return MoveMouseTo(id, base::BindOnce([](ui::TrackedElement* el) { - return el->GetScreenBounds().CenterPoint(); - })); - } - - protected: - std::unique_ptr<content::ScopedAccessibilityMode> scoped_accessibility_mode_; - - private: - base::test::ScopedFeatureList feature_list_; -}; - -IN_PROC_BROWSER_TEST_F(ForwardButtonAccessibilityTest, LeftClickForward) { - ASSERT_TRUE(embedded_test_server()->Start()); - GURL url1 = embedded_test_server()->GetURL("/title1.html"); - GURL url2 = embedded_test_server()->GetURL("/title2.html"); - RunTestSequence(InstrumentTab(kWebContentsElementId), - NavigateWebContents(kWebContentsElementId, url1), - NavigateWebContents(kWebContentsElementId, url2), - // Go back - PressButton(kToolbarBackButtonElementId), - WaitForWebContentsNavigation(kWebContentsElementId, url1), - // Click forward - MoveMouseToElement(kToolbarForwardButtonElementId), - ClickMouse(), - // Wait for navigation forward to url2 - WaitForWebContentsNavigation(kWebContentsElementId, url2)); -} - -#if BUILDFLAG(IS_MAC) -#define MAYBE_MiddleClickForward DISABLED_MiddleClickForward -#else -#define MAYBE_MiddleClickForward MiddleClickForward -#endif -IN_PROC_BROWSER_TEST_F(ForwardButtonAccessibilityTest, - MAYBE_MiddleClickForward) { - ASSERT_TRUE(embedded_test_server()->Start()); - GURL url1 = embedded_test_server()->GetURL("/title1.html"); - GURL url2 = embedded_test_server()->GetURL("/title2.html"); - RunTestSequence( - InstrumentTab(kWebContentsElementId), - NavigateWebContents(kWebContentsElementId, url1), - NavigateWebContents(kWebContentsElementId, url2), - // Go back - PressButton(kToolbarBackButtonElementId), - WaitForWebContentsNavigation(kWebContentsElementId, url1), - Check([&]() { return browser()->tab_strip_model()->count() == 1; }), - PollState(kTabCountState, - [this]() { return browser()->tab_strip_model()->count(); }), - // Middle-click forward - MoveMouseToElement(kToolbarForwardButtonElementId), - ClickMouse(ui_controls::MIDDLE), WaitForState(kTabCountState, 2), - Check([&]() { - return browser() - ->tab_strip_model() - ->GetWebContentsAt(1) - ->GetVisibleURL() == url2; - })); -} - -IN_PROC_BROWSER_TEST_F(ForwardButtonAccessibilityTest, ContextMenu) { - ASSERT_TRUE(embedded_test_server()->Start()); - GURL url1 = embedded_test_server()->GetURL("/title1.html"); - GURL url2 = embedded_test_server()->GetURL("/title2.html"); - RunTestSequence(InstrumentTab(kWebContentsElementId), - NavigateWebContents(kWebContentsElementId, url1), - NavigateWebContents(kWebContentsElementId, url2), - // Go back - PressButton(kToolbarBackButtonElementId), - WaitForWebContentsNavigation(kWebContentsElementId, url1), - // Right-click to open history menu - MoveMouseToElement(kToolbarForwardButtonElementId), - ClickMouse(ui_controls::RIGHT), - // Wait for history menu - WaitForShow(kToolbarForwardButtonMenuElementId)); -} - -IN_PROC_BROWSER_TEST_F(ForwardButtonAccessibilityTest, AccessibilityNode) { - RunTestSequence( - WaitForShow(kToolbarForwardButtonElementId), - CheckElement( - kToolbarForwardButtonElementId, - [](ui::TrackedElement* el) { - return GetForwardAXNodeData(el, __FILE__, __LINE__).role; - }, - ax::mojom::Role::kButton), - CheckElement(kToolbarForwardButtonElementId, [](ui::TrackedElement* el) { - return GetForwardAXNodeData(el, __FILE__, __LINE__) - .GetString16Attribute(ax::mojom::StringAttribute::kName) == - l10n_util::GetStringUTF16(IDS_ACCNAME_FORWARD); - })); -} - -IN_PROC_BROWSER_TEST_F(ForwardButtonAccessibilityTest, - ToggleForwardButtonVisibilityWithPref) { - RunTestSequence( - // Start visible - Do([this]() { - browser()->profile()->GetPrefs()->SetBoolean(prefs::kShowForwardButton, - true); - }), - WaitForShow(kToolbarForwardButtonElementId), - // Hide it - Do([this]() { - browser()->profile()->GetPrefs()->SetBoolean(prefs::kShowForwardButton, - false); - }), - WaitForHide(kToolbarForwardButtonElementId), - // Show it again - Do([this]() { - browser()->profile()->GetPrefs()->SetBoolean(prefs::kShowForwardButton, - true); - }), - WaitForShow(kToolbarForwardButtonElementId)); -}
diff --git a/chrome/browser/ui/views/toolbar/home_button_accessibility_interactive_uitest.cc b/chrome/browser/ui/views/toolbar/home_button_accessibility_interactive_uitest.cc deleted file mode 100644 index 63846c1..0000000 --- a/chrome/browser/ui/views/toolbar/home_button_accessibility_interactive_uitest.cc +++ /dev/null
@@ -1,199 +0,0 @@ -// Copyright 2026 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/test/run_until.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/browser_element_identifiers.h" -#include "chrome/browser/ui/views/toolbar/toolbar_view.h" -#include "chrome/browser/ui/views/toolbar/webui_toolbar_web_view.h" -#include "chrome/browser/ui/waap/initial_web_ui_manager.h" -#include "chrome/common/chrome_features.h" -#include "chrome/common/pref_names.h" -#include "chrome/grit/generated_resources.h" -#include "chrome/test/interaction/interactive_browser_test.h" -#include "components/prefs/pref_service.h" -#include "content/public/browser/browser_accessibility_state.h" -#include "content/public/browser/scoped_accessibility_mode.h" -#include "content/public/common/content_features.h" -#include "content/public/test/accessibility_notification_waiter.h" -#include "content/public/test/browser_test.h" -#include "ui/accessibility/ax_node.h" -#include "ui/accessibility/ax_node_data.h" -#include "ui/base/interaction/element_identifier.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/base/test/ui_controls.h" -#include "ui/views/accessibility/view_accessibility.h" -#include "ui/views/controls/webview/webview.h" -#include "ui/views/interaction/element_tracker_views.h" -#include "ui/webui/tracked_element/tracked_element_handler.h" -#include "ui/webui/tracked_element/tracked_element_web_ui.h" - -namespace { -DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kWebContentsElementId); -DEFINE_LOCAL_STATE_IDENTIFIER_VALUE(ui::test::PollingStateObserver<int>, - kTabCountState); -} // namespace - -// For now, HomeButton is not implemented in WebUI, so we only test Views. -// TODO(crbug.com/470039765): Implement WebUI HomeButton and re-enable WebUI -// tests. -class HomeButtonAccessibilityTest : public InteractiveBrowserTest { - public: - HomeButtonAccessibilityTest() { - feature_list_.InitAndDisableFeature(::features::kInitialWebUI); - } - - void SetUpOnMainThread() override { - InteractiveBrowserTest::SetUpOnMainThread(); - - scoped_accessibility_mode_ = - content::BrowserAccessibilityState::GetInstance() - ->CreateScopedModeForProcess(ui::kAXModeComplete); - } - - static ui::AXNode* FindHomeButtonNode(ui::AXNode* node) { - if (node->data().role == ax::mojom::Role::kButton && - node->data().GetString16Attribute(ax::mojom::StringAttribute::kName) == - l10n_util::GetStringUTF16(IDS_ACCNAME_HOME)) { - return node; - } - for (ui::AXNode* child : node->children()) { - if (ui::AXNode* found = FindHomeButtonNode(child)) { - return found; - } - } - return nullptr; - } - - static ui::AXNodeData GetHomeAXNodeData(const ui::TrackedElement* el, - const char* file, - int line) { - if (auto* const view_el = el->AsA<views::TrackedElementViews>()) { - ui::AXNodeData node_data; - view_el->view()->GetViewAccessibility().GetAccessibleNodeData(&node_data); - return node_data; - } else if (auto* const webui_el = el->AsA<ui::TrackedElementWebUI>()) { - ui::AXNode* root = - webui_el->handler()->web_contents()->GetAccessibilityRootNode(); - if (!root) { - ADD_FAILURE_AT(file, line) << "Could not get AXNode root"; - return {}; - } - ui::AXNode* home_button = FindHomeButtonNode(root); - if (!home_button) { - ADD_FAILURE_AT(file, line) << "Could not find AXNode home_button"; - return {}; - } - return home_button->data(); - } else { - ADD_FAILURE_AT(file, line) << "Unsupported element type"; - return {}; - } - } - - protected: - std::unique_ptr<content::ScopedAccessibilityMode> scoped_accessibility_mode_; - - private: - base::test::ScopedFeatureList feature_list_; -}; - -IN_PROC_BROWSER_TEST_F(HomeButtonAccessibilityTest, LeftClickHome) { - ASSERT_TRUE(embedded_test_server()->Start()); - GURL home_url = GURL("chrome://newtab/"); - RunTestSequence( - Do([this]() { - browser()->profile()->GetPrefs()->SetBoolean(prefs::kShowHomeButton, - true); - }), - InstrumentTab(kWebContentsElementId), - // Navigate away from home - NavigateWebContents(kWebContentsElementId, - embedded_test_server()->GetURL("/title1.html")), - // Click home - WaitForShow(kToolbarHomeButtonElementId), - WaitForViewProperty(kToolbarHomeButtonElementId, views::View, Enabled, - true), - MoveMouseTo(kToolbarHomeButtonElementId), ClickMouse(), - // Wait for navigation back to home - WaitForWebContentsNavigation(kWebContentsElementId, home_url)); -} - -#if BUILDFLAG(IS_MAC) -#define MAYBE_MiddleClickHome DISABLED_MiddleClickHome -#else -#define MAYBE_MiddleClickHome MiddleClickHome -#endif -IN_PROC_BROWSER_TEST_F(HomeButtonAccessibilityTest, MAYBE_MiddleClickHome) { - ASSERT_TRUE(embedded_test_server()->Start()); - GURL url = embedded_test_server()->GetURL("/title1.html"); - RunTestSequence( - Do([this]() { - browser()->profile()->GetPrefs()->SetBoolean(prefs::kShowHomeButton, - true); - }), - InstrumentTab(kWebContentsElementId), - NavigateWebContents(kWebContentsElementId, url), - Check([&]() { return browser()->tab_strip_model()->count() == 1; }), - PollState(kTabCountState, - [this]() { return browser()->tab_strip_model()->count(); }), - WaitForShow(kToolbarHomeButtonElementId), - // Ensure the button is enabled before clicking. - WaitForViewProperty(kToolbarHomeButtonElementId, views::View, Enabled, - true), - MoveMouseTo(kToolbarHomeButtonElementId), ClickMouse(ui_controls::MIDDLE), - WaitForState(kTabCountState, 2)); -} - -IN_PROC_BROWSER_TEST_F(HomeButtonAccessibilityTest, AccessibilityNode) { - RunTestSequence( - Do([this]() { - browser()->profile()->GetPrefs()->SetBoolean(prefs::kShowHomeButton, - true); - }), - WaitForShow(kToolbarHomeButtonElementId), - CheckElement( - kToolbarHomeButtonElementId, - [](ui::TrackedElement* el) { - return GetHomeAXNodeData(el, __FILE__, __LINE__).role; - }, - ax::mojom::Role::kButton), - CheckElement( - kToolbarHomeButtonElementId, - [](ui::TrackedElement* el) { - return GetHomeAXNodeData(el, __FILE__, __LINE__) - .GetString16Attribute(ax::mojom::StringAttribute::kName); - }, - l10n_util::GetStringUTF16(IDS_ACCNAME_HOME)), - CheckElement( - kToolbarHomeButtonElementId, - [](ui::TrackedElement* el) { - return GetHomeAXNodeData(el, __FILE__, __LINE__) - .GetString16Attribute(ax::mojom::StringAttribute::kDescription); - }, - l10n_util::GetStringUTF16(IDS_TOOLTIP_HOME))); -} - -IN_PROC_BROWSER_TEST_F(HomeButtonAccessibilityTest, - ToggleHomeButtonVisibilityWithPref) { - RunTestSequence( - // Start visible - Do([this]() { - browser()->profile()->GetPrefs()->SetBoolean(prefs::kShowHomeButton, - true); - }), - WaitForShow(kToolbarHomeButtonElementId), - // Hide it - Do([this]() { - browser()->profile()->GetPrefs()->SetBoolean(prefs::kShowHomeButton, - false); - }), - WaitForHide(kToolbarHomeButtonElementId), - // Show it again - Do([this]() { - browser()->profile()->GetPrefs()->SetBoolean(prefs::kShowHomeButton, - true); - }), - WaitForShow(kToolbarHomeButtonElementId)); -}
diff --git a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc index 6894b66..fac5bb3 100644 --- a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc +++ b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc
@@ -126,6 +126,7 @@ #include "ui/views/controls/label.h" #include "ui/views/layout/animating_layout_manager_test_util.h" #include "ui/views/test/views_test_utils.h" +#include "ui/views/test/widget_activation_waiter.h" #include "ui/views/view.h" #include "ui/views/view_observer.h" #include "ui/views/widget/any_widget_observer.h" @@ -2510,16 +2511,9 @@ EXPECT_FALSE(helper()->browser_view()->IsMaximized()); } -// TODO(crbug.com/458526513): Flaky on Linux. -#if BUILDFLAG(IS_LINUX) -#define MAYBE_MaximizeAndRestoreWindowWithApi \ - DISABLED_MaximizeAndRestoreWindowWithApi -#else -#define MAYBE_MaximizeAndRestoreWindowWithApi MaximizeAndRestoreWindowWithApi -#endif IN_PROC_BROWSER_TEST_F( WebAppFrameToolbarBrowserTest_AdditionalWindowingControls, - MAYBE_MaximizeAndRestoreWindowWithApi) { + MaximizeAndRestoreWindowWithApi) { InstallAndLaunchWebApp(); helper()->GrantWindowManagementPermission(); auto* web_contents = helper()->browser_view()->GetActiveWebContents(); @@ -2528,6 +2522,8 @@ helper()->browser_view()->SetCanMaximize(true); EXPECT_TRUE(helper()->browser_view()->CanMaximize()); content::WaitForLoadStop(web_contents); + views::Widget* widget = helper()->browser_view()->GetWidget(); + views::test::WaitForWidgetActive(widget, true); EXPECT_EQ(EvalDisplayStateChange(web_contents, "maximize", "maximized"), "window.maximize() succeeded."); @@ -2592,21 +2588,15 @@ EXPECT_FALSE(helper()->browser_view()->IsMaximized()); } -// TODO(crbug.com/459532445): Flaky on Linux Wayland and mac. -#if BUILDFLAG(SUPPORTS_OZONE_WAYLAND) || BUILDFLAG(IS_MAC) -#define MAYBE_FullscreenAndRestoreWindowWithApi \ - DISABLED_FullscreenAndRestoreWindowWithApi -#else -#define MAYBE_FullscreenAndRestoreWindowWithApi \ - FullscreenAndRestoreWindowWithApi -#endif IN_PROC_BROWSER_TEST_F( WebAppFrameToolbarBrowserTest_AdditionalWindowingControls, - MAYBE_FullscreenAndRestoreWindowWithApi) { + FullscreenAndRestoreWindowWithApi) { InstallAndLaunchWebApp(); helper()->GrantWindowManagementPermission(); auto* web_contents = helper()->browser_view()->GetActiveWebContents(); content::WaitForLoadStop(web_contents); + views::Widget* widget = helper()->browser_view()->GetWidget(); + views::test::WaitForWidgetActive(widget, true); // Enter fullscreen EXPECT_EQ(EvalFullscreenRequest(web_contents),
diff --git a/chrome/browser/ui/views/web_apps/web_app_blocked_migration_infobar_delegate_browsertest.cc b/chrome/browser/ui/views/web_apps/web_app_blocked_migration_infobar_delegate_browsertest.cc index 3b7e761..5836cda 100644 --- a/chrome/browser/ui/views/web_apps/web_app_blocked_migration_infobar_delegate_browsertest.cc +++ b/chrome/browser/ui/views/web_apps/web_app_blocked_migration_infobar_delegate_browsertest.cc
@@ -170,6 +170,27 @@ WebAppBlockedMigrationInfoBarDelegate::FindInfoBar(web_contents)); } +// Regression test for crbug.com/494294070. The infobar blocking migration shows +// up without a navigation to the destination app. +IN_PROC_BROWSER_TEST_F(WebAppBlockedMigrationInfoBarDelegateBrowserTest, + InfoBarShowsUpWithoutNavigationToDestApp) { + ASSERT_TRUE(embedded_test_server()->Start()); + const GURL app_url = embedded_test_server()->GetURL( + "/web_apps/migration/migrate_from/suggest.html"); + webapps::AppId app_id = ForceInstallWebApp(profile(), app_url).value(); + Browser* app_browser = + ::web_app::LaunchWebAppBrowserAndWait(profile(), app_id); + provider().command_manager().AwaitAllCommandsCompleteForTesting(); + content::WebContents* web_contents = + app_browser->tab_strip_model()->GetActiveWebContents(); + + // Wait for the destination app to also be installed. + test::WaitForLoadCompleteAndMaybeManifestSeen(*web_contents); + provider().command_manager().AwaitAllCommandsCompleteForTesting(); + + EXPECT_TRUE(WebAppBlockedMigrationInfoBarDelegate::FindInfoBar(web_contents)); +} + IN_PROC_BROWSER_TEST_F(WebAppBlockedMigrationInfoBarDelegateBrowserTest, RemoveInfoBarWhenMigrationIsGone) { ASSERT_TRUE(embedded_test_server()->Start());
diff --git a/chrome/browser/ui/views/web_apps/web_app_install_dialog_flow_view.cc b/chrome/browser/ui/views/web_apps/web_app_install_dialog_flow_view.cc index 5992205..a9e431c6 100644 --- a/chrome/browser/ui/views/web_apps/web_app_install_dialog_flow_view.cc +++ b/chrome/browser/ui/views/web_apps/web_app_install_dialog_flow_view.cc
@@ -27,20 +27,21 @@ install_dialog_view; // kInstallerOptions - auto* options = - AddChildView(std::make_unique<views::Label>(u"Installer Options View")); + auto* options = AddChildView(views::Builder<views::Label>() + .SetText(u"Installer Options View") + .Build()); options->SetVisible(false); install_step_to_view_[InstallDialogStep::kInstallerOptions] = options; // kProgress - auto* progress = - AddChildView(std::make_unique<views::Label>(u"Progress View")); + auto* progress = AddChildView( + views::Builder<views::Label>().SetText(u"Progress View").Build()); progress->SetVisible(false); install_step_to_view_[InstallDialogStep::kProgress] = progress; // kSuccessful launch app button - auto* successful = - AddChildView(std::make_unique<views::Label>(u"Successful View")); + auto* successful = AddChildView( + views::Builder<views::Label>().SetText(u"Successful View").Build()); successful->SetVisible(false); install_step_to_view_[InstallDialogStep::kSuccessful] = successful; }
diff --git a/chrome/browser/ui/views/web_apps/web_app_install_flow_dialog_delegate.cc b/chrome/browser/ui/views/web_apps/web_app_install_flow_dialog_delegate.cc index 0ca4e14d5..fcdb2e4 100644 --- a/chrome/browser/ui/views/web_apps/web_app_install_flow_dialog_delegate.cc +++ b/chrome/browser/ui/views/web_apps/web_app_install_flow_dialog_delegate.cc
@@ -49,6 +49,9 @@ namespace web_app { +DEFINE_CLASS_ELEMENT_IDENTIFIER_VALUE(WebAppInstallFlowDialogDelegate, + kInstallDialogFlowViewId); + WebAppInstallFlowDialogDelegate::WebAppInstallFlowDialogDelegate( content::WebContents* web_contents, std::unique_ptr<WebAppInstallInfo> install_info, @@ -205,13 +208,12 @@ std::move(flow_view), views::BubbleDialogModelHost::FieldType::kControl, focusable_view), - WebAppInstallDialogDelegate::kDiyAppsDialogInputTextId); + WebAppInstallFlowDialogDelegate::kInstallDialogFlowViewId); if (install_type == InstallDialogType::kDiy) { dialog_model_builder.SetSubtitle( l10n_util::GetStringUTF16(IDS_DIY_APP_INSTALL_DIALOG_SUBTITLE)); - dialog_model_builder.SetInitiallyFocusedField( - WebAppInstallDialogDelegate::kDiyAppsDialogInputTextId); + dialog_model_builder.SetInitiallyFocusedField(kInstallDialogFlowViewId); } if (show_initiating_origin) {
diff --git a/chrome/browser/ui/views/web_apps/web_app_install_flow_dialog_delegate.h b/chrome/browser/ui/views/web_apps/web_app_install_flow_dialog_delegate.h index 4efd268..0b8b2f8 100644 --- a/chrome/browser/ui/views/web_apps/web_app_install_flow_dialog_delegate.h +++ b/chrome/browser/ui/views/web_apps/web_app_install_flow_dialog_delegate.h
@@ -34,6 +34,8 @@ class WebAppInstallFlowDialogDelegate : public WebAppInstallDialogDelegate { public: + DECLARE_CLASS_ELEMENT_IDENTIFIER_VALUE(kInstallDialogFlowViewId); + WebAppInstallFlowDialogDelegate( content::WebContents* web_contents, std::unique_ptr<WebAppInstallInfo> install_info,
diff --git a/chrome/browser/ui/views/webid/fedcm_ambient_ui_browsertest.cc b/chrome/browser/ui/views/webid/fedcm_ambient_ui_browsertest.cc index 1576b92..a12254d 100644 --- a/chrome/browser/ui/views/webid/fedcm_ambient_ui_browsertest.cc +++ b/chrome/browser/ui/views/webid/fedcm_ambient_ui_browsertest.cc
@@ -2,15 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/test/metrics/histogram_tester.h" #include "base/test/run_until.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/ui/actions/chrome_action_id.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_commands.h" +#include "chrome/browser/ui/page_action/page_action_icon_type.h" #include "chrome/browser/ui/tabs/public/tab_features.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/location_bar/location_bar_view.h" -#include "chrome/browser/ui/views/page_action/anchored_message_view.h" #include "chrome/browser/ui/views/page_action/page_action_container_view.h" #include "chrome/browser/ui/views/page_action/page_action_controller.h" #include "chrome/browser/ui/views/page_action/page_action_observer.h" @@ -489,4 +490,157 @@ EXPECT_TRUE(observer.GetCurrentPageActionState().anchored_message_showing); } +// This test verifies the UMA metrics logged during the Ambient UI flow for a +// returning (sign-in) user. +// +// Relevant UMAs for the end-to-end flow: +// 1. PageActionController.ChipTypeShown: Logged with value 'kFederation'. +// 2. Blink.FedCm.AccountsDialogShown: Should be 0 for this flow, as no modal +// dialog widget is shown (only the Page Action anchored message). +// 3. Blink.FedCm.Status.RequestIdToken: Logged when the flow completes. +IN_PROC_BROWSER_TEST_F(FedCmAmbientUiBrowserTest, CollectsSignInMetrics) { + base::HistogramTester histograms; + + auto* controller = browser() + ->GetActiveTabInterface() + ->GetTabFeatures() + ->page_action_controller(); + + page_actions::PageActionObserver observer(kActionFederation); + observer.RegisterAsPageActionObserver(*controller); + + ShowAmbientUi(content::IdentityRequestAccount::LoginState::kSignIn, + content::IdentityRequestAccount::LoginState::kSignIn); + + ASSERT_TRUE(base::test::RunUntil( + [&]() { return observer.GetCurrentPageActionState().chip_showing; })); + + // Check Page Action shown metrics. + histograms.ExpectUniqueSample("PageActionController.ChipTypeShown", + PageActionIconType::kFederation, 1); + + // Simulate click on the omnibox chip. + // Note: We use the real PageActionView and simulate mouse events to ensure + // that the PageAction framework's metric recording logic is triggered. + // Simply calling view()->OnPageActionClicked() would bypass the PageAction + // framework's CTR logging. + // TODO(crbug.com/493584925): consider using the ui::test::EventGenerator or + // views::test::InteractionTestUtilSimulatorViews to simulate the events. + BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser()); + auto* page_action_view = browser_view->GetLocationBarView() + ->page_action_container() + ->GetPageActionView(kActionFederation); + ASSERT_TRUE(page_action_view); + ui::MouseEvent click_event( + ui::EventType::kMousePressed, gfx::Point(), gfx::Point(), + base::TimeTicks(), ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); + page_action_view->OnEvent(&click_event); + ui::MouseEvent release_event( + ui::EventType::kMouseReleased, gfx::Point(), gfx::Point(), + base::TimeTicks(), ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); + page_action_view->OnEvent(&release_event); + + // Re-assert shown metrics after the chip was clicked. + // We expect these to be correctly recorded only once, even after the + // anchored message appears. + histograms.ExpectBucketCount("PageActionController.ChipTypeShown", + PageActionIconType::kFederation, 1); + + // For sign-in, the first click shows the anchored message, not the dialog. + // Blink.FedCm.AccountsDialogShown is currently associated with the widget + // (modal or bubble), which is *not* shown in this case (only the anchored + // message bubble is shown, which is part of the Page Action framework). + histograms.ExpectTotalCount("Blink.FedCm.AccountsDialogShown", 0); + + // Verify anchored message is showing. + ASSERT_TRUE(base::test::RunUntil([&]() { + return observer.GetCurrentPageActionState().anchored_message_showing; + })); + + // Simulate click on the anchored message's chip. + // The Page Action framework itself records the click because the click was + // on the AnchoredMessageBubbleView's chip. + auto* anchored_message = page_action_view->GetAnchoredMessageForTesting(); + ASSERT_TRUE(anchored_message); + // The chip container is the 3rd child (index 2) of the anchored message. + views::View* anchored_message_chip = anchored_message->children()[2]; + ASSERT_TRUE(anchored_message_chip); + ui::MouseEvent anchored_click( + ui::EventType::kMousePressed, gfx::Point(), gfx::Point(), + base::TimeTicks(), ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); + anchored_message_chip->OnEvent(&anchored_click); + + // For sign-in, clicking the anchored message chip completes the flow. + // In a fully integrated browser test (without MockDelegate), we would + // expect the success status (Blink.FedCm.Status.RequestIdToken) to be + // recorded in the content layer here. +} + +// This test verifies the UMA metrics logged during the Ambient UI flow for a +// new (sign-up) user. +// +// Relevant UMAs for the end-to-end flow: +// 1. Blink.FedCm.AccountsDialogShown: Logged when the modal dialog is shown +// (after the chip is clicked). +// 2. Blink.FedCm.Status.RequestIdToken: Logged when the flow completes. +IN_PROC_BROWSER_TEST_F(FedCmAmbientUiBrowserTest, CollectsSignUpMetrics) { + base::HistogramTester histograms; + + auto* controller = browser() + ->GetActiveTabInterface() + ->GetTabFeatures() + ->page_action_controller(); + + page_actions::PageActionObserver observer(kActionFederation); + observer.RegisterAsPageActionObserver(*controller); + + ShowAmbientUi(content::IdentityRequestAccount::LoginState::kSignUp, + content::IdentityRequestAccount::LoginState::kSignUp); + + ASSERT_TRUE(base::test::RunUntil( + [&]() { return observer.GetCurrentPageActionState().chip_showing; })); + + // FedCM dialog shown metric should still be 0 as it's just the chip. + histograms.ExpectTotalCount("Blink.FedCm.AccountsDialogShown", 0); + + // For sign-up, clicking on the chip should trigger the accounts displayed + // callback, which in turn records the FedCM dialog shown metric in the + // content layer. + EXPECT_CALL(*delegate_, OnAccountsDisplayed); + + // Simulate click on the omnibox chip. + // Note: We use the real PageActionView and simulate mouse events to ensure + // that the PageAction framework's metric recording logic is triggered. + BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser()); + auto* page_action_view = browser_view->GetLocationBarView() + ->page_action_container() + ->GetPageActionView(kActionFederation); + ASSERT_TRUE(page_action_view); + ui::MouseEvent click_event( + ui::EventType::kMousePressed, gfx::Point(), gfx::Point(), + base::TimeTicks(), ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); + page_action_view->OnEvent(&click_event); + ui::MouseEvent release_event( + ui::EventType::kMouseReleased, gfx::Point(), gfx::Point(), + base::TimeTicks(), ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); + page_action_view->OnEvent(&release_event); + + // For sign-up, the click shows the dialog widget immediately. + ASSERT_TRUE( + base::test::RunUntil([&]() { return !!view()->GetDialogWidget(); })); + + // Note: We don't check Blink.FedCm.AccountsDialogShown here because it is + // recorded in the content layer by the real delegate, which is mocked in this + // test. The EXPECT_CALL(*delegate_, OnAccountsDisplayed) above confirms that + // the view is correctly triggering the callback that leads to the metric + // being recorded. + + // Select the first account to complete the flow. + view()->OnAccountSelected(accounts_[0], release_event); + + // In a fully integrated browser test (without MockDelegate), we would + // expect the success status (Blink.FedCm.Status.RequestIdToken) to be + // recorded in the content layer here. +} + } // namespace webid
diff --git a/chrome/browser/ui/web_applications/app_browser_controller.cc b/chrome/browser/ui/web_applications/app_browser_controller.cc index ef41ab6f..e796cc1e 100644 --- a/chrome/browser/ui/web_applications/app_browser_controller.cc +++ b/chrome/browser/ui/web_applications/app_browser_controller.cc
@@ -441,7 +441,6 @@ types_enabled.push_back(PageActionIconType::kFileSystemAccess); types_enabled.push_back(PageActionIconType::kCookieControls); types_enabled.push_back(PageActionIconType::kSaveCard); - types_enabled.push_back(PageActionIconType::kAutofillAddress); return types_enabled; }
diff --git a/chrome/browser/ui/webui/ai_overlay_dialog/BUILD.gn b/chrome/browser/ui/webui/ai_overlay_dialog/BUILD.gn index e37da80..04f426edd 100644 --- a/chrome/browser/ui/webui/ai_overlay_dialog/BUILD.gn +++ b/chrome/browser/ui/webui/ai_overlay_dialog/BUILD.gn
@@ -17,15 +17,45 @@ "ai_overlay_dialog_page_handler.h", "ai_overlay_dialog_untrusted_ui.cc", "ai_overlay_dialog_untrusted_ui.h", + "markdown_builder.cc", + "markdown_builder.h", + "page_context_monitor.cc", + "page_context_monitor.h", ] public_deps = [ ":mojo_bindings" ] deps = [ "//chrome/browser/glic", + "//chrome/browser/page_content_annotations:fetcher", + "//chrome/browser/profiles:profile", "//chrome/browser/resources/ai_overlay_dialog:resources", "//chrome/browser/ui:ui_features", + "//chrome/browser/ui/browser_window", + "//chrome/browser/ui/webui:webui_util", "//chrome/browser/ui/webui/top_chrome", "//chrome/common", + "//components/optimization_guide/proto:optimization_guide_proto", + "//components/page_content_annotations/content", + "//components/tabs:public", "//content/public/browser", "//ui/webui", + "//url", + ] +} + +source_set("browser_tests") { + testonly = true + defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] + sources = [ "markdown_builder_browsertest.cc" ] + deps = [ + ":ai_overlay_dialog", + "//base", + "//base/test:test_support", + "//chrome/browser/ui", + "//chrome/test:test_support", + "//components/optimization_guide/content/browser", + "//components/optimization_guide/proto:optimization_guide_proto", + "//content/test:browsertest_support", + "//testing/gtest", + "//url", ] }
diff --git a/chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog.mojom b/chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog.mojom index 4655ea28..3af5daf 100644 --- a/chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog.mojom +++ b/chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog.mojom
@@ -7,7 +7,8 @@ // Factory for creating a PageHandler. interface PageHandlerFactory { // The WebUI calls this method when the page is first initialized. - CreatePageHandler(pending_receiver<PageHandler> handler); + CreatePageHandler(pending_receiver<PageHandler> handler, + pending_remote<Page> page); }; // Implemented by browser C++ code. Called by WebUI. @@ -23,3 +24,13 @@ // without a microphone. GetMockAudioData() => (array<uint8>? data); }; + +// Implemented by the WebUI (TypeScript/JS). Called by the Browser C++. +interface Page { + // Called whenever the page context has become stale (e.g. a new tab has been + // focused, or the current page has navigated). + InvalidatePageContext(); + + // Passes context about the current page to the app. + UpdateCurrentPageContext(string url, string page_title, string page_content); +}; \ No newline at end of file
diff --git a/chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog_page_handler.cc b/chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog_page_handler.cc index bee5e60..66fd598a 100644 --- a/chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog_page_handler.cc +++ b/chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog_page_handler.cc
@@ -10,11 +10,13 @@ #include "base/files/file_path.h" #include "base/files/file_util.h" +#include "base/strings/utf_string_conversions.h" #include "base/task/thread_pool.h" AiOverlayDialogPageHandler::AiOverlayDialogPageHandler( - mojo::PendingReceiver<ai_overlay_dialog::mojom::PageHandler> receiver) - : receiver_(this, std::move(receiver)) {} + mojo::PendingReceiver<ai_overlay_dialog::mojom::PageHandler> receiver, + mojo::PendingRemote<ai_overlay_dialog::mojom::Page> remote) + : receiver_(this, std::move(receiver)), page_(std::move(remote)) {} AiOverlayDialogPageHandler::~AiOverlayDialogPageHandler() = default; @@ -46,3 +48,15 @@ path_string), std::move(callback)); } + +void AiOverlayDialogPageHandler::InvalidatePageContext() { + page_->InvalidatePageContext(); +} + +void AiOverlayDialogPageHandler::UpdateCurrentPageContext( + const GURL& url, + const std::u16string& title, + const std::string& content) { + page_->UpdateCurrentPageContext(url.spec(), base::UTF16ToUTF8(title), + content); +}
diff --git a/chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog_page_handler.h b/chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog_page_handler.h index 06d1903a..4f899d4 100644 --- a/chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog_page_handler.h +++ b/chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog_page_handler.h
@@ -5,24 +5,33 @@ #ifndef CHROME_BROWSER_UI_WEBUI_AI_OVERLAY_DIALOG_AI_OVERLAY_DIALOG_PAGE_HANDLER_H_ #define CHROME_BROWSER_UI_WEBUI_AI_OVERLAY_DIALOG_AI_OVERLAY_DIALOG_PAGE_HANDLER_H_ +#include "base/memory/raw_ptr.h" #include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog.mojom.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" +#include "url/gurl.h" class AiOverlayDialogPageHandler : public ai_overlay_dialog::mojom::PageHandler { public: explicit AiOverlayDialogPageHandler( - mojo::PendingReceiver<ai_overlay_dialog::mojom::PageHandler> receiver); + mojo::PendingReceiver<ai_overlay_dialog::mojom::PageHandler> receiver, + mojo::PendingRemote<ai_overlay_dialog::mojom::Page> remote); ~AiOverlayDialogPageHandler() override; // overlay_dialog::mojom::PageHandler interface void GetApiKey(GetApiKeyCallback callback) override; void GetMockAudioData(GetMockAudioDataCallback callback) override; + void InvalidatePageContext(); + void UpdateCurrentPageContext(const GURL& url, + const std::u16string& title, + const std::string& content); + private: mojo::Receiver<ai_overlay_dialog::mojom::PageHandler> receiver_{this}; + mojo::Remote<ai_overlay_dialog::mojom::Page> page_; }; #endif // CHROME_BROWSER_UI_WEBUI_AI_OVERLAY_DIALOG_AI_OVERLAY_DIALOG_PAGE_HANDLER_H_
diff --git a/chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog_untrusted_ui.cc b/chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog_untrusted_ui.cc index 9c0a564..ad5f089d 100644 --- a/chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog_untrusted_ui.cc +++ b/chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog_untrusted_ui.cc
@@ -10,8 +10,11 @@ #include "base/feature_list.h" #include "chrome/browser/glic/public/glic_enabling.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/browser_window/public/browser_window_interface.h" #include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog_page_handler.h" +#include "chrome/browser/ui/webui/ai_overlay_dialog/page_context_monitor.h" +#include "chrome/browser/ui/webui/webui_embedding_context.h" #include "chrome/common/webui_url_constants.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" @@ -67,7 +70,14 @@ WEB_UI_CONTROLLER_TYPE_IMPL(AiOverlayDialogUntrustedUI) void AiOverlayDialogUntrustedUI::CreatePageHandler( - mojo::PendingReceiver<ai_overlay_dialog::mojom::PageHandler> receiver) { - page_handler_ = - std::make_unique<AiOverlayDialogPageHandler>(std::move(receiver)); + mojo::PendingReceiver<ai_overlay_dialog::mojom::PageHandler> receiver, + mojo::PendingRemote<ai_overlay_dialog::mojom::Page> remote) { + page_handler_ = std::make_unique<AiOverlayDialogPageHandler>( + std::move(receiver), std::move(remote)); + + BrowserWindowInterface* bwi = + webui::GetBrowserWindowInterface(web_ui()->GetWebContents()); + CHECK(bwi); + page_context_monitor_ = + std::make_unique<PageContextMonitor>(*bwi, *page_handler_); }
diff --git a/chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog_untrusted_ui.h b/chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog_untrusted_ui.h index 4da3c6fd..ba8239d 100644 --- a/chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog_untrusted_ui.h +++ b/chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog_untrusted_ui.h
@@ -16,6 +16,7 @@ class AiOverlayDialogUntrustedUI; class AiOverlayDialogPageHandler; +class PageContextMonitor; class AiOverlayDialogUntrustedUIConfig : public content::DefaultWebUIConfig<AiOverlayDialogUntrustedUI> { @@ -41,14 +42,16 @@ // ai_overlay_dialog::mojom::PageHandlerFactor interface void CreatePageHandler( - mojo::PendingReceiver<ai_overlay_dialog::mojom::PageHandler> receiver) - override; + mojo::PendingReceiver<ai_overlay_dialog::mojom::PageHandler> receiver, + mojo::PendingRemote<ai_overlay_dialog::mojom::Page> remote) override; private: WEB_UI_CONTROLLER_TYPE_DECL(); std::unique_ptr<AiOverlayDialogPageHandler> page_handler_; + std::unique_ptr<PageContextMonitor> page_context_monitor_; + mojo::Receiver<ai_overlay_dialog::mojom::PageHandlerFactory> page_handler_factory_receiver_{this}; };
diff --git a/chrome/browser/ui/webui/ai_overlay_dialog/markdown_builder.cc b/chrome/browser/ui/webui/ai_overlay_dialog/markdown_builder.cc new file mode 100644 index 0000000..0017fd5 --- /dev/null +++ b/chrome/browser/ui/webui/ai_overlay_dialog/markdown_builder.cc
@@ -0,0 +1,570 @@ +// Copyright 2026 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/ai_overlay_dialog/markdown_builder.h" + +#include <algorithm> +#include <sstream> + +#include "base/containers/adapters.h" +#include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" + +namespace { + +using ::optimization_guide::proto::AnnotatedRole; +using ::optimization_guide::proto::ContentAttributeType; +using ::optimization_guide::proto::ContentNode; +using ::optimization_guide::proto::DocumentIdentifier; +using ::optimization_guide::proto::FormControlType; +using ::optimization_guide::proto::RedactionDecision; +using ::optimization_guide::proto::TableRowType; +using ::optimization_guide::proto::TextSize; + +bool IsSectionHeader(const ContentNode& node) { + for (const auto& annotated_role : + node.content_attributes().annotated_roles()) { + switch (annotated_role) { + case AnnotatedRole::ANNOTATED_ROLE_HEADER: + case AnnotatedRole::ANNOTATED_ROLE_NAV: + case AnnotatedRole::ANNOTATED_ROLE_SEARCH: + case AnnotatedRole::ANNOTATED_ROLE_MAIN: + case AnnotatedRole::ANNOTATED_ROLE_ARTICLE: + case AnnotatedRole::ANNOTATED_ROLE_SECTION: + case AnnotatedRole::ANNOTATED_ROLE_ASIDE: + case AnnotatedRole::ANNOTATED_ROLE_FOOTER: + return true; + default: + break; + } + } + return false; +} + +std::string GetEmphasisSyntax( + const optimization_guide::proto::TextInfo& text_info) { + int emph_count = 0; + if (text_info.text_style().has_emphasis()) { + emph_count += 1; + } + switch (text_info.text_style().text_size()) { + case TextSize::TEXT_SIZE_L: + emph_count += 1; + break; + case TextSize::TEXT_SIZE_XL: + emph_count += 2; + break; + default: + break; + } + if (emph_count == 0) { + return ""; + } + return std::string(emph_count, '*'); +} + +std::string GetHeadingPrefixForTextSize(TextSize text_size) { + switch (text_size) { + case TextSize::TEXT_SIZE_XS: + return "#####"; + case TextSize::TEXT_SIZE_S: + return "####"; + case TextSize::TEXT_SIZE_L: + return "##"; + case TextSize::TEXT_SIZE_XL: + return "#"; + default: + return "###"; + } +} + +std::string GetHeadingPrefix( + const google::protobuf::RepeatedPtrField<ContentNode>& children) { + for (const auto& child : children) { + if (child.content_attributes().attribute_type() == + ContentAttributeType::CONTENT_ATTRIBUTE_TEXT) { + return GetHeadingPrefixForTextSize( + child.content_attributes().text_data().text_style().text_size()); + } + } + return ""; +} + +int GetNumberOfCellsInRow(const ContentNode& node) { + int count = 0; + for (const auto& child : node.children_nodes()) { + if (child.content_attributes().attribute_type() == + ContentAttributeType::CONTENT_ATTRIBUTE_TABLE_CELL) { + count += 1; + } + } + return count; +} + +bool IsPasswordFieldWithNoRedactionInfo(const ContentNode& node) { + return node.content_attributes().attribute_type() == + ContentAttributeType::CONTENT_ATTRIBUTE_FORM_CONTROL && + node.content_attributes().form_control_data().form_control_type() == + FormControlType::FORM_CONTROL_TYPE_INPUT_PASSWORD && + !node.content_attributes() + .form_control_data() + .has_redaction_decision(); +} + +bool IsPasswordInput(const ContentNode& node) { + return (node.content_attributes().attribute_type() == + ContentAttributeType::CONTENT_ATTRIBUTE_FORM_CONTROL && + node.content_attributes().form_control_data().redaction_decision() == + RedactionDecision:: + REDACTION_DECISION_REDACTED_HAS_BEEN_PASSWORD) || + IsPasswordFieldWithNoRedactionInfo(node); +} + +bool IsCreditCardFormControl(const ContentNode& node) { + return node.content_attributes().attribute_type() == + ContentAttributeType::CONTENT_ATTRIBUTE_FORM_CONTROL && + node.content_attributes().form_control_data().redaction_decision() == + RedactionDecision:: + REDACTION_DECISION_REDACTED_IS_SENSITIVE_PAYMENT_FIELD; +} + +bool ShouldRedactNode(const ContentNode& node) { + return IsPasswordInput(node) || IsCreditCardFormControl(node); +} + +} // namespace + +MarkdownBuilder::WalkState::WalkState() = default; +MarkdownBuilder::WalkState::~WalkState() = default; + +MarkdownBuilder::MarkdownBuilder( + const optimization_guide::proto::AnnotatedPageContent& page_content) + : page_content_(page_content) {} + +MarkdownBuilder::~MarkdownBuilder() = default; + +std::string MarkdownBuilder::Build() { + std::vector<const ContentNode*> parent_chain; + WalkContentNodes(parent_chain, page_content_->root_node(), + page_content_->main_frame_data().document_identifier()); + return JoinLines(); +} + +void MarkdownBuilder::WalkContentNodes( + std::vector<const ContentNode*>& parent_chain, + const ContentNode& node, + const DocumentIdentifier& document_identifier) { + if (!node.has_content_attributes()) { + return; + } + + ProcessNodeBeforeSubtree(parent_chain, node, document_identifier); + + parent_chain.push_back(&node); + + DocumentIdentifier doc_id_for_children = document_identifier; + if (node.content_attributes().attribute_type() == + ContentAttributeType::CONTENT_ATTRIBUTE_IFRAME && + node.content_attributes().iframe_data().has_frame_data() && + node.content_attributes() + .iframe_data() + .frame_data() + .has_document_identifier()) { + doc_id_for_children = node.content_attributes() + .iframe_data() + .frame_data() + .document_identifier(); + } + + if (!ShouldRedactNode(node)) { + for (const auto& child : node.children_nodes()) { + WalkContentNodes(parent_chain, child, doc_id_for_children); + } + } + + parent_chain.pop_back(); + + ProcessNodeAfterSubtree(node, document_identifier); +} + +void MarkdownBuilder::ProcessNodeBeforeSubtree( + const std::vector<const ContentNode*>& parent_chain, + const ContentNode& node, + const DocumentIdentifier& document_identifier) { + SetUpLine(parent_chain, node); + + AddMarkdownBeforeSubtree(parent_chain, node, document_identifier); + + std::string content; + if (IsPasswordInput(node)) { + content = "<redacted password>"; + } else if (IsCreditCardFormControl(node)) { + content = "<redacted credit card data>"; + } else { + content = GetContent(parent_chain, node); + } + + if (!content.empty()) { + walk_state_.lines.back() += content; + } +} + +void MarkdownBuilder::ProcessNodeAfterSubtree( + const ContentNode& node, + const DocumentIdentifier& document_identifier) { + AddMarkdownAfterSubtree(node); + CompleteLine(node); +} + +void MarkdownBuilder::AddMarkdownBeforeSubtree( + const std::vector<const ContentNode*>& parent_chain, + const ContentNode& node, + const DocumentIdentifier& document_identifier) { + switch (node.content_attributes().attribute_type()) { + case ContentAttributeType::CONTENT_ATTRIBUTE_IFRAME: + walk_state_.lines.back() += "---"; + walk_state_.lines.push_back(""); + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_CONTAINER: + if (IsSectionHeader(node)) { + walk_state_.lines.back() += "---"; + walk_state_.lines.push_back(""); + } + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_ORDERED_LIST: + walk_state_.ordered_list_item_index = 1; + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_LIST_ITEM: + walk_state_.lines.back() += GetListItemPrefix(parent_chain, node); + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_TABLE_ROW: + walk_state_.lines.back() += "|"; + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_FORM_CONTROL: + switch ( + node.content_attributes().form_control_data().form_control_type()) { + case FormControlType::FORM_CONTROL_TYPE_INPUT_CHECKBOX: + walk_state_.lines.back() += + node.content_attributes().form_control_data().is_checked() + ? "[x]" + : "[ ]"; + break; + case FormControlType::FORM_CONTROL_TYPE_INPUT_RADIO: + walk_state_.lines.back() += + node.content_attributes().form_control_data().is_checked() + ? "(x)" + : "( )"; + break; + case FormControlType::FORM_CONTROL_TYPE_SELECT_ONE: + case FormControlType::FORM_CONTROL_TYPE_SELECT_MULTIPLE: + walk_state_.lines.back() += "{("; + break; + case FormControlType::FORM_CONTROL_TYPE_BUTTON_BUTTON: + case FormControlType::FORM_CONTROL_TYPE_BUTTON_SUBMIT: + case FormControlType::FORM_CONTROL_TYPE_BUTTON_RESET: + case FormControlType::FORM_CONTROL_TYPE_BUTTON_POPOVER: + case FormControlType::FORM_CONTROL_TYPE_INPUT_BUTTON: + case FormControlType::FORM_CONTROL_TYPE_INPUT_RESET: + case FormControlType::FORM_CONTROL_TYPE_INPUT_SUBMIT: + walk_state_.lines.back() += "["; + break; + default: + walk_state_.lines.back() += "___"; + break; + } + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_ANCHOR: + walk_state_.lines.back() += "["; + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_HEADING: + walk_state_.lines.back() += GetHeadingPrefix(node.children_nodes()); + break; + default: + break; + } +} + +void MarkdownBuilder::AddMarkdownAfterSubtree(const ContentNode& node) { + switch (node.content_attributes().attribute_type()) { + case ContentAttributeType::CONTENT_ATTRIBUTE_IFRAME: + walk_state_.lines.push_back("---"); + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_CONTAINER: + if (IsSectionHeader(node)) { + walk_state_.lines.push_back("---"); + } + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_TABLE_ROW: + if (node.content_attributes().table_row_data().type() == + TableRowType::TABLE_ROW_TYPE_HEADER) { + int cell_count = GetNumberOfCellsInRow(node); + std::string separator = "|"; + for (int i = 0; i < cell_count; ++i) { + separator += " ----- |"; + } + walk_state_.lines.push_back(separator); + } + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_TABLE_CELL: + walk_state_.lines.back() += " |"; + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_ANCHOR: + if (node.content_attributes().anchor_data().has_url()) { + walk_state_.lines.back() += + "](" + node.content_attributes().anchor_data().url() + ")"; + } else { + walk_state_.lines.back() += "]"; + } + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_FORM_CONTROL: + switch ( + node.content_attributes().form_control_data().form_control_type()) { + case FormControlType::FORM_CONTROL_TYPE_SELECT_ONE: + case FormControlType::FORM_CONTROL_TYPE_SELECT_MULTIPLE: { + walk_state_.lines.back() += ")}"; + break; + } + case FormControlType::FORM_CONTROL_TYPE_BUTTON_BUTTON: + case FormControlType::FORM_CONTROL_TYPE_BUTTON_SUBMIT: + case FormControlType::FORM_CONTROL_TYPE_BUTTON_RESET: + case FormControlType::FORM_CONTROL_TYPE_BUTTON_POPOVER: + case FormControlType::FORM_CONTROL_TYPE_INPUT_BUTTON: + case FormControlType::FORM_CONTROL_TYPE_INPUT_RESET: + case FormControlType::FORM_CONTROL_TYPE_INPUT_SUBMIT: + walk_state_.lines.back() += "]"; + break; + default: + break; + } + if (node.content_attributes().form_control_data().is_required()) { + walk_state_.lines.back() += "*"; + } + break; + default: + break; + } +} + +std::string MarkdownBuilder::GetContent( + const std::vector<const ContentNode*>& parent_chain, + const ContentNode& node) { + std::string content; + switch (node.content_attributes().attribute_type()) { + case ContentAttributeType::CONTENT_ATTRIBUTE_TABLE: + content = node.content_attributes().table_data().table_name(); + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_FORM: + content = node.content_attributes().form_data().form_name(); + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_TEXT: + content = FormatText(node.content_attributes().text_data(), parent_chain); + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_SVG_ROOT: + if (node.children_nodes().empty()) { + content = node.content_attributes().svg_root_data().inner_text(); + } + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_IMAGE: + content = FormatImage(node.content_attributes().image_data()); + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_VIDEO: + content = FormatVideo(node.content_attributes().video_data()); + break; + default: + break; + } + if (content.empty() && node.content_attributes().has_label()) { + content = node.content_attributes().label(); + } + return content; +} + +std::string MarkdownBuilder::FormatText( + const optimization_guide::proto::TextInfo& text_info, + const std::vector<const ContentNode*>& parent_chain) { + std::string text = + base::CollapseWhitespaceASCII(text_info.text_content(), false); + if (text.empty()) { + return text; + } + if (!parent_chain.empty()) { + const auto& parent = *parent_chain.back(); + if (IsAnchor(parent.content_attributes()) || + IsFormControlInParentChain(parent_chain) || + IsHeading(parent.content_attributes())) { + return text; + } + } + std::string emphasis = GetEmphasisSyntax(text_info); + return emphasis + text + emphasis; +} + +std::string MarkdownBuilder::FormatImage( + const optimization_guide::proto::ImageInfo& image_info) { + std::string caption = image_info.image_caption(); + if (caption.empty()) { + return ""; + } + return "![" + caption + "]"; +} + +std::string MarkdownBuilder::FormatVideo( + const optimization_guide::proto::VideoData& video_data) { + if (video_data.url().empty()) { + return ""; + } + return " + ")"; +} + +std::string MarkdownBuilder::GetListItemPrefix( + const std::vector<const ContentNode*>& parent_chain, + const ContentNode& node) { + for (const auto* it : base::Reversed(parent_chain)) { + const auto& list_node = *it; + if (list_node.content_attributes().attribute_type() == + ContentAttributeType::CONTENT_ATTRIBUTE_ORDERED_LIST) { + std::string prefix = + base::NumberToString(walk_state_.ordered_list_item_index) + ". "; + walk_state_.ordered_list_item_index++; + return prefix; + } else if (list_node.content_attributes().attribute_type() == + ContentAttributeType::CONTENT_ATTRIBUTE_UNORDERED_LIST) { + return "- "; + } + } + return "- "; +} + +void MarkdownBuilder::AddSpace() { + if (!walk_state_.lines.empty() && !walk_state_.lines.back().empty() && + !base::EndsWith(walk_state_.lines.back(), " ")) { + walk_state_.lines.back() += " "; + } +} + +void MarkdownBuilder::SetUpLine( + const std::vector<const ContentNode*>& parent_chain, + const ContentNode& node) { + if (walk_state_.lines.empty()) { + walk_state_.lines.push_back(""); + } + switch (node.content_attributes().attribute_type()) { + case ContentAttributeType::CONTENT_ATTRIBUTE_ROOT: + case ContentAttributeType::CONTENT_ATTRIBUTE_IFRAME: + case ContentAttributeType::CONTENT_ATTRIBUTE_HEADING: + case ContentAttributeType::CONTENT_ATTRIBUTE_PARAGRAPH: + case ContentAttributeType::CONTENT_ATTRIBUTE_FORM: + case ContentAttributeType::CONTENT_ATTRIBUTE_TABLE: + case ContentAttributeType::CONTENT_ATTRIBUTE_LIST_ITEM: + case ContentAttributeType::CONTENT_ATTRIBUTE_TABLE_ROW: + walk_state_.lines.push_back(""); + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_CONTAINER: + if (IsSectionHeader(node)) { + walk_state_.lines.push_back(""); + } + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_FORM_CONTROL: + case ContentAttributeType::CONTENT_ATTRIBUTE_ANCHOR: + AddSpace(); + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_SVG_ROOT: + case ContentAttributeType::CONTENT_ATTRIBUTE_TEXT: + case ContentAttributeType::CONTENT_ATTRIBUTE_IMAGE: + if (!parent_chain.empty()) { + const auto& parent = *parent_chain.back(); + if (IsAnchor(parent.content_attributes()) || + IsFormControlInParentChain(parent_chain)) { + if (base::EndsWith(walk_state_.lines.back(), "[") || + base::EndsWith(walk_state_.lines.back(), "___") || + base::EndsWith(walk_state_.lines.back(), "(") || + base::EndsWith(walk_state_.lines.back(), "{")) { + return; + } + } + } + AddSpace(); + break; + default: + break; + } +} + +void MarkdownBuilder::CompleteLine(const ContentNode& node) { + switch (node.content_attributes().attribute_type()) { + case ContentAttributeType::CONTENT_ATTRIBUTE_ROOT: + case ContentAttributeType::CONTENT_ATTRIBUTE_IFRAME: + case ContentAttributeType::CONTENT_ATTRIBUTE_HEADING: + case ContentAttributeType::CONTENT_ATTRIBUTE_PARAGRAPH: + case ContentAttributeType::CONTENT_ATTRIBUTE_FORM: + case ContentAttributeType::CONTENT_ATTRIBUTE_TABLE: + case ContentAttributeType::CONTENT_ATTRIBUTE_LIST_ITEM: + case ContentAttributeType::CONTENT_ATTRIBUTE_TABLE_ROW: + walk_state_.lines.push_back(""); + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_CONTAINER: + if (IsSectionHeader(node)) { + walk_state_.lines.push_back(""); + } + break; + case ContentAttributeType::CONTENT_ATTRIBUTE_FORM_CONTROL: + switch ( + node.content_attributes().form_control_data().form_control_type()) { + case FormControlType::FORM_CONTROL_TYPE_INPUT_CHECKBOX: + case FormControlType::FORM_CONTROL_TYPE_INPUT_RADIO: + break; + default: + walk_state_.lines.push_back(""); + break; + } + break; + default: + break; + } +} + +bool MarkdownBuilder::IsHeading( + const optimization_guide::proto::ContentAttributes& attributes) { + return attributes.attribute_type() == + ContentAttributeType::CONTENT_ATTRIBUTE_HEADING; +} + +bool MarkdownBuilder::IsTableCell( + const optimization_guide::proto::ContentAttributes& attributes) { + return attributes.attribute_type() == + ContentAttributeType::CONTENT_ATTRIBUTE_TABLE_CELL; +} + +bool MarkdownBuilder::IsAnchor( + const optimization_guide::proto::ContentAttributes& attributes) { + return attributes.attribute_type() == + ContentAttributeType::CONTENT_ATTRIBUTE_ANCHOR; +} + +bool MarkdownBuilder::IsFormControlInParentChain( + const std::vector<const ContentNode*>& parent_chain) { + for (auto* node : parent_chain) { + if (node->content_attributes().attribute_type() == + ContentAttributeType::CONTENT_ATTRIBUTE_FORM_CONTROL) { + return true; + } + } + return false; +} + +std::string MarkdownBuilder::JoinLines() { + std::stringstream ss; + for (const auto& line : walk_state_.lines) { + std::string trimmed = base::CollapseWhitespaceASCII(line, true); + if (trimmed.empty()) { + continue; + } + if (ss.tellp() != std::streampos(0)) { + ss << "\n"; + } + ss << line; + } + return ss.str(); +}
diff --git a/chrome/browser/ui/webui/ai_overlay_dialog/markdown_builder.h b/chrome/browser/ui/webui/ai_overlay_dialog/markdown_builder.h new file mode 100644 index 0000000..70c9c03 --- /dev/null +++ b/chrome/browser/ui/webui/ai_overlay_dialog/markdown_builder.h
@@ -0,0 +1,105 @@ +// Copyright 2026 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_AI_OVERLAY_DIALOG_MARKDOWN_BUILDER_H_ +#define CHROME_BROWSER_UI_WEBUI_AI_OVERLAY_DIALOG_MARKDOWN_BUILDER_H_ + +#include <string> +#include <vector> + +#include "base/memory/raw_ref.h" +#include "components/optimization_guide/proto/features/common_quality_data.pb.h" + +// Converts optimization_guide::proto::AnnotatedPageContent into a markdown +// representation. This class is roughly derived from Glic's APC to Markdown +// generator. +class MarkdownBuilder { + public: + explicit MarkdownBuilder( + const optimization_guide::proto::AnnotatedPageContent& page_content); + ~MarkdownBuilder(); + + MarkdownBuilder(const MarkdownBuilder&) = delete; + MarkdownBuilder& operator=(const MarkdownBuilder&) = delete; + + // Builds and returns the markdown representation of the page content. + std::string Build(); + + private: + struct WalkState { + WalkState(); + ~WalkState(); + std::vector<std::string> lines; + int32_t ordered_list_item_index = 1; + }; + + void WalkContentNodes( + std::vector<const optimization_guide::proto::ContentNode*>& parent_chain, + const optimization_guide::proto::ContentNode& node, + const optimization_guide::proto::DocumentIdentifier& document_identifier); + + void ProcessNodeBeforeSubtree( + const std::vector<const optimization_guide::proto::ContentNode*>& + parent_chain, + const optimization_guide::proto::ContentNode& node, + const optimization_guide::proto::DocumentIdentifier& document_identifier); + + void ProcessNodeAfterSubtree( + const optimization_guide::proto::ContentNode& node, + const optimization_guide::proto::DocumentIdentifier& document_identifier); + + void AddMarkdownBeforeSubtree( + const std::vector<const optimization_guide::proto::ContentNode*>& + parent_chain, + const optimization_guide::proto::ContentNode& node, + const optimization_guide::proto::DocumentIdentifier& document_identifier); + + void AddMarkdownAfterSubtree( + const optimization_guide::proto::ContentNode& node); + + std::string GetContent( + const std::vector<const optimization_guide::proto::ContentNode*>& + parent_chain, + const optimization_guide::proto::ContentNode& node); + + std::string FormatText( + const optimization_guide::proto::TextInfo& text_info, + const std::vector<const optimization_guide::proto::ContentNode*>& + parent_chain); + + std::string FormatImage( + const optimization_guide::proto::ImageInfo& image_info); + + std::string FormatVideo( + const optimization_guide::proto::VideoData& video_data); + + std::string GetListItemPrefix( + const std::vector<const optimization_guide::proto::ContentNode*>& + parent_chain, + const optimization_guide::proto::ContentNode& node); + + void AddSpace(); + void SetUpLine( + const std::vector<const optimization_guide::proto::ContentNode*>& + parent_chain, + const optimization_guide::proto::ContentNode& node); + void CompleteLine(const optimization_guide::proto::ContentNode& node); + + bool IsHeading( + const optimization_guide::proto::ContentAttributes& attributes); + bool IsTableCell( + const optimization_guide::proto::ContentAttributes& attributes); + bool IsAnchor(const optimization_guide::proto::ContentAttributes& attributes); + bool IsFormControlInParentChain( + const std::vector<const optimization_guide::proto::ContentNode*>& + parent_chain); + + std::string JoinLines(); + + const raw_ref<const optimization_guide::proto::AnnotatedPageContent> + page_content_; + WalkState walk_state_; +}; + +#endif // CHROME_BROWSER_UI_WEBUI_AI_OVERLAY_DIALOG_MARKDOWN_BUILDER_H_
diff --git a/chrome/browser/ui/webui/ai_overlay_dialog/markdown_builder_browsertest.cc b/chrome/browser/ui/webui/ai_overlay_dialog/markdown_builder_browsertest.cc new file mode 100644 index 0000000..ab36348 --- /dev/null +++ b/chrome/browser/ui/webui/ai_overlay_dialog/markdown_builder_browsertest.cc
@@ -0,0 +1,202 @@ +// Copyright 2026 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/ai_overlay_dialog/markdown_builder.h" + +#include "base/strings/string_util.h" +#include "base/test/test_future.h" +#include "chrome/test/base/chrome_test_utils.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "components/optimization_guide/content/browser/page_content_proto_provider.h" +#include "content/public/test/browser_test.h" +#include "content/public/test/browser_test_utils.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/mojom/content_extraction/ai_page_content.mojom.h" +#include "url/gurl.h" + +namespace { + +class MarkdownBuilderBrowserTest : public InProcessBrowserTest { + public: + std::string GetMarkdownFromHtml(const std::string& html) { + content::WebContents* web_contents = + chrome_test_utils::GetActiveTab(this)->GetContents(); + GURL url("data:text/html," + html); + EXPECT_TRUE(content::NavigateToURL(web_contents, url)); + + base::test::TestFuture<optimization_guide::AIPageContentResultOrError> + future; + optimization_guide::GetAIPageContent( + web_contents, optimization_guide::DefaultAIPageContentOptions(true), + future.GetCallback()); + + auto result = future.Take(); + EXPECT_TRUE(result.has_value()) << result.error(); + if (!result.has_value()) { + return ""; + } + + MarkdownBuilder builder(result->proto); + return builder.Build(); + } + + void RunTest(const std::string& html, const std::string& expected) { + std::string trimmed_html; + base::TrimWhitespaceASCII(html, base::TRIM_ALL, &trimmed_html); + std::string trimmed_expected; + base::TrimWhitespaceASCII(expected, base::TRIM_ALL, &trimmed_expected); + EXPECT_EQ(GetMarkdownFromHtml(trimmed_html), trimmed_expected); + } +}; + +IN_PROC_BROWSER_TEST_F(MarkdownBuilderBrowserTest, SimpleText) { + // clang-format off + const std::string html = R"HTML( +Hello World +)HTML"; + const std::string expected = R"EXPECTED( +Hello World +)EXPECTED"; + // clang-format on + RunTest(html, expected); +} + +IN_PROC_BROWSER_TEST_F(MarkdownBuilderBrowserTest, HeadingAndParagraph) { + // clang-format off + const std::string html = R"HTML( +<h1>Title</h1> +<p>This is a paragraph.</p> +)HTML"; + const std::string expected = R"EXPECTED( +# Title +This is a paragraph. +)EXPECTED"; + // clang-format on + RunTest(html, expected); +} + +IN_PROC_BROWSER_TEST_F(MarkdownBuilderBrowserTest, UnorderedList) { + // clang-format off + const std::string html = R"HTML( +<ul> + <li>Item 1</li> + <li>Item 2</li> +</ul> +)HTML"; + const std::string expected = R"EXPECTED( +- Item 1 +- Item 2 +)EXPECTED"; + // clang-format on + RunTest(html, expected); +} + +IN_PROC_BROWSER_TEST_F(MarkdownBuilderBrowserTest, Table) { + // Note: caption text may be duplicated if it's both in table_name and a child + // node. Also table headers are often emphasized due to default styling. + // clang-format off + const std::string html = R"HTML( +<table> + <caption>My Table</caption> + <thead> + <tr> + <th>Col 1</th> + <th>Col 2</th> + </tr> + </thead> +</table> +)HTML"; + const std::string expected = R"EXPECTED( +My Table My Table +| *Col 1* | *Col 2* | +| ----- | ----- | +)EXPECTED"; + // clang-format on + RunTest(html, expected); +} + +IN_PROC_BROWSER_TEST_F(MarkdownBuilderBrowserTest, Redaction) { + // clang-format off + const std::string html = R"HTML( +<input type="password" value="secret123"> +<input type="password" value="secret456"> +)HTML"; + const std::string expected = R"EXPECTED( +___<redacted password> +___<redacted password> +)EXPECTED"; + // clang-format on + + // Password fields should be redacted. + RunTest(html, expected); +} + +IN_PROC_BROWSER_TEST_F(MarkdownBuilderBrowserTest, NestedContent) { + // clang-format off + const std::string html = R"HTML( +<div> + <h1>Title 1</h1> + <p>P1.1</p> + <p>P1.2</p> + <div> + <h2>Title 2</h2> + <p>P2.1</p> + <div> + <p>P3.1</p> + <h3>Title 3</h3> + <p>P3.2</p> + </div> + </div> +</div> +)HTML"; + const std::string expected = R"EXPECTED( +# Title 1 +P1.1 +P1.2 +## Title 2 +P2.1 +P3.1 +## Title 3 +P3.2 +)EXPECTED"; + // clang-format on + RunTest(html, expected); +} + +IN_PROC_BROWSER_TEST_F(MarkdownBuilderBrowserTest, Links) { + // clang-format off + const std::string html = R"HTML( +<p> + <a href="https://google.com/">Simple Link</a> +</p> +<p> + <a href="https://example.com/">Link with <b>nested</b> DOM</a> +</p> +<p> + <a href="https://chromium.org/"><img alt="Chromium Logo"></a> +</p> +<div> + <a href="https://parent.com/"> + Parent Link + <span> + <a href="https://child.com/">Child Link</a> + </span> + </a> +</div> +)HTML"; + // Current behavior: + // 1. Emphasis is suppressed inside anchors. + // 2. Images inside anchors only output their caption/alt text. + // 3. Nested anchors: are correctly handled as separate links. + const std::string expected = R"EXPECTED( +[Simple Link](https://google.com/) +[Link with nested DOM](https://example.com/) +[Chromium Logo](https://chromium.org/) +[Parent Link](https://parent.com/) [Child Link](https://child.com/) +)EXPECTED"; + // clang-format on + RunTest(html, expected); +} + +} // namespace
diff --git a/chrome/browser/ui/webui/ai_overlay_dialog/page_context_monitor.cc b/chrome/browser/ui/webui/ai_overlay_dialog/page_context_monitor.cc new file mode 100644 index 0000000..e00ec5cf --- /dev/null +++ b/chrome/browser/ui/webui/ai_overlay_dialog/page_context_monitor.cc
@@ -0,0 +1,108 @@ +// Copyright 2026 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/ai_overlay_dialog/page_context_monitor.h" + +#include "chrome/browser/page_content_annotations/page_content_screenshot_service_factory.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/browser_window/public/browser_window_interface.h" +#include "chrome/browser/ui/webui/ai_overlay_dialog/markdown_builder.h" +#include "components/tabs/public/tab_interface.h" +#include "content/public/browser/web_contents.h" +#include "third_party/blink/public/mojom/content_extraction/ai_page_content.mojom.h" + +static constexpr int kTruncateThresholdBytes = 30000; + +using page_content_annotations::PageContentScreenshotServiceFactory; + +PageContextMonitor::PageContextMonitor(BrowserWindowInterface& window, + AiOverlayDialogPageHandler& page_handler) + : window_(window), page_handler_(page_handler) { + active_tab_subscription_ = + window.RegisterActiveTabDidChange(base::BindRepeating( + &PageContextMonitor::OnActiveTabChanged, base::Unretained(this))); + OnActiveTabChanged(&window); +} + +PageContextMonitor::~PageContextMonitor() = default; + +void PageContextMonitor::PrimaryPageChanged(content::Page& page) { + page_handler_->InvalidatePageContext(); + StartNewFetch(); +} + +void PageContextMonitor::DidStopLoading() { + if (fetch_waiting_on_load_) { + StartNewFetch(); + } +} + +void PageContextMonitor::OnActiveTabChanged(BrowserWindowInterface* window) { + CHECK_EQ(window, &window_.get()); + + tabs::TabInterface* active_tab = window_->GetActiveTabInterface(); + if (!active_tab) { + return; + } + + Observe(active_tab->GetContents()); + page_handler_->InvalidatePageContext(); + StartNewFetch(); +} + +void PageContextMonitor::StartNewFetch() { + fetch_waiting_on_load_ = false; + fetcher_.reset(); + + content::WebContents* contents = web_contents(); + if (!contents) { + return; + } + + if (contents->IsLoading()) { + fetch_waiting_on_load_ = true; + return; + } + + fetcher_ = std::make_unique<page_content_annotations::PageContextFetcher>( + base::BindRepeating([](content::BrowserContext* context) { + return PageContentScreenshotServiceFactory::GetForProfile( + Profile::FromBrowserContext(context)); + }), + /*progress_listener=*/nullptr); + + page_content_annotations::FetchPageContextOptions options; + options.annotated_page_content_options = + optimization_guide::DefaultAIPageContentOptions( + /* on_critical_path =*/true); + options.annotated_page_content_options->max_meta_elements = 32; + + fetcher_->FetchStart(*contents, options, + base::BindOnce(&PageContextMonitor::OnFetchComplete, + weak_ptr_factory_.GetWeakPtr())); +} + +void PageContextMonitor::OnFetchComplete( + page_content_annotations::FetchPageContextResultCallbackArg result) { + if (!result.has_value()) { + return; + } + + const page_content_annotations::FetchPageContextResult& fetch_result = + **result; + + if (fetch_result.annotated_page_content_result.has_value()) { + MarkdownBuilder markdown_builder( + fetch_result.annotated_page_content_result.value().proto); + std::string markdown_content = markdown_builder.Build(); + + // TODO(bokan): More sophisticated truncation. + std::string markdown_content_truncated = + markdown_content.substr(0, kTruncateThresholdBytes); + + page_handler_->UpdateCurrentPageContext( + web_contents()->GetLastCommittedURL(), web_contents()->GetTitle(), + markdown_content_truncated); + } +}
diff --git a/chrome/browser/ui/webui/ai_overlay_dialog/page_context_monitor.h b/chrome/browser/ui/webui/ai_overlay_dialog/page_context_monitor.h new file mode 100644 index 0000000..d588edb --- /dev/null +++ b/chrome/browser/ui/webui/ai_overlay_dialog/page_context_monitor.h
@@ -0,0 +1,47 @@ +// Copyright 2026 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_AI_OVERLAY_DIALOG_PAGE_CONTEXT_MONITOR_H_ +#define CHROME_BROWSER_UI_WEBUI_AI_OVERLAY_DIALOG_PAGE_CONTEXT_MONITOR_H_ + +#include "base/callback_list.h" +#include "base/memory/raw_ref.h" +#include "chrome/browser/ui/webui/ai_overlay_dialog/ai_overlay_dialog_page_handler.h" +#include "components/page_content_annotations/content/page_context_fetcher.h" +#include "content/public/browser/web_contents_observer.h" + +class BrowserWindowInterface; + +// Responsible for monitors for changes in the given window's active tab. Will +// signal the page_handler whenever the tab changes and schedules a fetch page +// context. +class PageContextMonitor : public content::WebContentsObserver { + public: + PageContextMonitor(BrowserWindowInterface& window, + AiOverlayDialogPageHandler& page_handler); + ~PageContextMonitor() override; + + // content::WebContentsObserver: + void PrimaryPageChanged(content::Page& page) override; + void DidStopLoading() override; + + private: + void OnActiveTabChanged(BrowserWindowInterface* window); + void StartNewFetch(); + void OnFetchComplete( + page_content_annotations::FetchPageContextResultCallbackArg result); + + const base::raw_ref<BrowserWindowInterface> window_; + const base::raw_ref<AiOverlayDialogPageHandler> page_handler_; + + base::CallbackListSubscription active_tab_subscription_; + + bool fetch_waiting_on_load_ = false; + + std::unique_ptr<page_content_annotations::PageContextFetcher> fetcher_; + + base::WeakPtrFactory<PageContextMonitor> weak_ptr_factory_{this}; +}; + +#endif // CHROME_BROWSER_UI_WEBUI_AI_OVERLAY_DIALOG_PAGE_CONTEXT_MONITOR_H_
diff --git a/chrome/browser/ui/webui/ash/login/BUILD.gn b/chrome/browser/ui/webui/ash/login/BUILD.gn index fcd91bc..b8b021f 100644 --- a/chrome/browser/ui/webui/ash/login/BUILD.gn +++ b/chrome/browser/ui/webui/ash/login/BUILD.gn
@@ -152,8 +152,6 @@ "recovery_eligibility_screen_handler.h", "remote_activity_notification_screen_handler.cc", "remote_activity_notification_screen_handler.h", - "remove_local_auth_factors_screen_handler.cc", - "remove_local_auth_factors_screen_handler.h", "reset_screen_handler.cc", "reset_screen_handler.h", "saml_challenge_key_handler.cc",
diff --git a/chrome/browser/ui/webui/ash/login/oobe_ui.cc b/chrome/browser/ui/webui/ash/login/oobe_ui.cc index ee010c92..8ff3adc 100644 --- a/chrome/browser/ui/webui/ash/login/oobe_ui.cc +++ b/chrome/browser/ui/webui/ash/login/oobe_ui.cc
@@ -121,7 +121,6 @@ #include "chrome/browser/ui/webui/ash/login/recommend_apps_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/recovery_eligibility_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/remote_activity_notification_screen_handler.h" -#include "chrome/browser/ui/webui/ash/login/remove_local_auth_factors_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/reset_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/saml_confirm_password_handler.h" #include "chrome/browser/ui/webui/ash/login/signin_fatal_error_screen_handler.h" @@ -603,10 +602,6 @@ } } - if (features::IsManagedLocalPinAndPasswordEnabled()) { - AddScreenHandler(std::make_unique<RemoveLocalAuthFactorsScreenHandler>()); - } - Profile* const profile = Profile::FromWebUI(web_ui()); // Set up the chrome://theme/ source, for Chrome logo. content::URLDataSource::Add(profile, std::make_unique<ThemeSource>(profile));
diff --git a/chrome/browser/ui/webui/ash/login/remove_local_auth_factors_screen_handler.cc b/chrome/browser/ui/webui/ash/login/remove_local_auth_factors_screen_handler.cc deleted file mode 100644 index 60beca57..0000000 --- a/chrome/browser/ui/webui/ash/login/remove_local_auth_factors_screen_handler.cc +++ /dev/null
@@ -1,36 +0,0 @@ -// Copyright 2026 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/remove_local_auth_factors_screen_handler.h" - -#include "chrome/browser/ui/webui/ash/login/base_screen_handler.h" -#include "components/login/localized_values_builder.h" - -namespace ash { - -RemoveLocalAuthFactorsScreenHandler::RemoveLocalAuthFactorsScreenHandler() - : BaseScreenHandler(kScreenId) {} - -RemoveLocalAuthFactorsScreenHandler::~RemoveLocalAuthFactorsScreenHandler() = - default; - -// TODO: b/445628245 - add localized values. -void RemoveLocalAuthFactorsScreenHandler::DeclareLocalizedValues( - ::login::LocalizedValuesBuilder* builder) {} - -void RemoveLocalAuthFactorsScreenHandler::Show() { - ShowInWebUI(); -} - -void RemoveLocalAuthFactorsScreenHandler:: - ShowRemoveLocalAuthFactorsSuccessStep() { - CallExternalAPI("showRemoveLocalAuthFactorsSuccessStep"); -} - -base::WeakPtr<RemoveLocalAuthFactorsScreenView> -RemoveLocalAuthFactorsScreenHandler::AsWeakPtr() { - return weak_ptr_factory_.GetWeakPtr(); -} - -} // namespace ash
diff --git a/chrome/browser/ui/webui/ash/login/remove_local_auth_factors_screen_handler.h b/chrome/browser/ui/webui/ash/login/remove_local_auth_factors_screen_handler.h deleted file mode 100644 index 17b1af9..0000000 --- a/chrome/browser/ui/webui/ash/login/remove_local_auth_factors_screen_handler.h +++ /dev/null
@@ -1,69 +0,0 @@ -// Copyright 2026 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_REMOVE_LOCAL_AUTH_FACTORS_SCREEN_HANDLER_H_ -#define CHROME_BROWSER_UI_WEBUI_ASH_LOGIN_REMOVE_LOCAL_AUTH_FACTORS_SCREEN_HANDLER_H_ - -#include "base/memory/weak_ptr.h" -#include "chrome/browser/ash/login/oobe_screen.h" -#include "chrome/browser/ui/webui/ash/login/base_screen_handler.h" -#include "components/login/localized_values_builder.h" - -namespace ash { - -class RemoveLocalAuthFactorsScreen; - -// Interface for dependency injection between RemoveLocalAuthFactorsScreen and -// its WebUI representation. -class RemoveLocalAuthFactorsScreenView { - public: - // LINT.IfChange(UsageMetrics) - inline constexpr static StaticOobeScreenId kScreenId{ - "remove-local-auth-factors", "RemoveLocalAuthFactorsScreen"}; - // LINT.ThenChange(//tools/metrics/histograms/metadata/oobe/histograms.xml) - - virtual ~RemoveLocalAuthFactorsScreenView() = default; - - // Shows the contents of the screen. - virtual void Show() = 0; - - // Shows the success step of the screen. - virtual void ShowRemoveLocalAuthFactorsSuccessStep() = 0; - - // Gets a WeakPtr to the instance. - virtual base::WeakPtr<RemoveLocalAuthFactorsScreenView> AsWeakPtr() = 0; -}; - -class RemoveLocalAuthFactorsScreenHandler - : public BaseScreenHandler, - public RemoveLocalAuthFactorsScreenView { - public: - using TView = RemoveLocalAuthFactorsScreenView; - - RemoveLocalAuthFactorsScreenHandler(); - - RemoveLocalAuthFactorsScreenHandler( - const RemoveLocalAuthFactorsScreenHandler&) = delete; - RemoveLocalAuthFactorsScreenHandler& operator=( - const RemoveLocalAuthFactorsScreenHandler&) = delete; - - ~RemoveLocalAuthFactorsScreenHandler() override; - - // BaseScreenHandler: - void DeclareLocalizedValues( - ::login::LocalizedValuesBuilder* builder) override; - - // RemoveLocalAuthFactorsScreenView: - void Show() override; - void ShowRemoveLocalAuthFactorsSuccessStep() override; - base::WeakPtr<RemoveLocalAuthFactorsScreenView> AsWeakPtr() override; - - private: - base::WeakPtrFactory<RemoveLocalAuthFactorsScreenView> weak_ptr_factory_{ - this}; -}; - -} // namespace ash - -#endif // CHROME_BROWSER_UI_WEBUI_ASH_LOGIN_REMOVE_LOCAL_AUTH_FACTORS_SCREEN_HANDLER_H_
diff --git a/chrome/browser/ui/webui/cr_components/composebox/composebox_handler.cc b/chrome/browser/ui/webui/cr_components/composebox/composebox_handler.cc index 2664e5a1..9c6a65f 100644 --- a/chrome/browser/ui/webui/cr_components/composebox/composebox_handler.cc +++ b/chrome/browser/ui/webui/cr_components/composebox/composebox_handler.cc
@@ -256,12 +256,8 @@ if (auto* metrics_recorder = GetMetricsRecorder()) { // Record AIM tool and model mode on query submission. const auto& input_state = GetInputState(); - metrics_recorder->RecordModesOnSubmission( - mojo::EnumTraits<composebox_query::mojom::ToolMode, - omnibox::ToolMode>::ToMojom(input_state.active_tool), - mojo::EnumTraits<composebox_query::mojom::ModelMode, - omnibox::ModelMode>::ToMojom(input_state - .active_model)); + metrics_recorder->RecordModesOnSubmission(input_state.active_tool, + input_state.active_model); } ComputeAndOpenQueryUrl(query_text, disposition, aim_entrypoint,
diff --git a/chrome/browser/ui/webui/cr_components/composebox/composebox_handler_unittest.cc b/chrome/browser/ui/webui/cr_components/composebox/composebox_handler_unittest.cc index 23ee770..ce5769f 100644 --- a/chrome/browser/ui/webui/cr_components/composebox/composebox_handler_unittest.cc +++ b/chrome/browser/ui/webui/cr_components/composebox/composebox_handler_unittest.cc
@@ -224,10 +224,10 @@ SubmitQueryAndWaitForNavigation(); histogram_tester().ExpectBucketCount( "ContextualSearch.Tools.ModeOnSubmission.NewTabPage", - composebox_query::mojom::ToolMode::kUnspecified, 1); + omnibox::ToolMode::TOOL_MODE_UNSPECIFIED, 1); histogram_tester().ExpectBucketCount( "ContextualSearch.Models.ModeOnSubmission.NewTabPage", - composebox_query::mojom::ModelMode::kUnspecified, 1); + omnibox::ModelMode::MODEL_MODE_UNSPECIFIED, 1); // Submitting with deep search and Gemini regular model enabled. handler().SetActiveToolMode(omnibox::ToolMode::TOOL_MODE_DEEP_SEARCH); @@ -239,10 +239,10 @@ SubmitQueryAndWaitForNavigation(); histogram_tester().ExpectBucketCount( "ContextualSearch.Tools.ModeOnSubmission.NewTabPage", - composebox_query::mojom::ToolMode::kDeepSearch, 1); + omnibox::ToolMode::TOOL_MODE_DEEP_SEARCH, 1); histogram_tester().ExpectBucketCount( "ContextualSearch.Models.ModeOnSubmission.NewTabPage", - composebox_query::mojom::ModelMode::kGeminiRegular, 1); + omnibox::ModelMode::MODEL_MODE_GEMINI_REGULAR, 1); // Submitting with create image and Gemini Pro model enabled. handler().SetActiveToolMode(omnibox::ToolMode::TOOL_MODE_IMAGE_GEN); @@ -253,10 +253,10 @@ SubmitQueryAndWaitForNavigation(); histogram_tester().ExpectBucketCount( "ContextualSearch.Tools.ModeOnSubmission.NewTabPage", - composebox_query::mojom::ToolMode::kImageGen, 1); + omnibox::ToolMode::TOOL_MODE_IMAGE_GEN, 1); histogram_tester().ExpectBucketCount( "ContextualSearch.Models.ModeOnSubmission.NewTabPage", - composebox_query::mojom::ModelMode::kGeminiPro, 1); + omnibox::ModelMode::MODEL_MODE_GEMINI_PRO, 1); histogram_tester().ExpectTotalCount( "ContextualSearch.Tools.ModeOnSubmission.NewTabPage", 3);
diff --git a/chrome/browser/ui/webui/cr_components/searchbox/contextual_searchbox_handler.cc b/chrome/browser/ui/webui/cr_components/searchbox/contextual_searchbox_handler.cc index 65b88f1..a741d86f 100644 --- a/chrome/browser/ui/webui/cr_components/searchbox/contextual_searchbox_handler.cc +++ b/chrome/browser/ui/webui/cr_components/searchbox/contextual_searchbox_handler.cc
@@ -499,20 +499,14 @@ void ContextualSearchboxHandler::RecordToolSelectionAction( omnibox::ToolMode tool) { if (auto* metrics_recorder = GetMetricsRecorder()) { - composebox_query::mojom::ToolMode mojom_tool_mode = - mojo::EnumTraits<composebox_query::mojom::ToolMode, - omnibox::ToolMode>::ToMojom(tool); - metrics_recorder->RecordToolMode(mojom_tool_mode); + metrics_recorder->RecordToolMode(tool); } } void ContextualSearchboxHandler::RecordModelSelectionAction( omnibox::ModelMode model) { if (auto* metrics_recorder = GetMetricsRecorder()) { - composebox_query::mojom::ModelMode mojom_model_mode = - mojo::EnumTraits<composebox_query::mojom::ModelMode, - omnibox::ModelMode>::ToMojom(model); - metrics_recorder->RecordModelMode(mojom_model_mode); + metrics_recorder->RecordModelMode(model); } }
diff --git a/chrome/browser/ui/webui/history/foreign_session_handler_unittest.cc b/chrome/browser/ui/webui/history/foreign_session_handler_unittest.cc index 51fdbdd..343f5a0 100644 --- a/chrome/browser/ui/webui/history/foreign_session_handler_unittest.cc +++ b/chrome/browser/ui/webui/history/foreign_session_handler_unittest.cc
@@ -10,6 +10,7 @@ #include "chrome/browser/sync/session_sync_service_factory.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" #include "components/sessions/core/session_id.h" +#include "components/sync_sessions/mock_open_tabs_ui_delegate.h" #include "components/sync_sessions/session_sync_service.h" #include "content/public/test/test_web_ui.h" #include "testing/gmock/include/gmock/gmock.h" @@ -17,36 +18,6 @@ namespace browser_sync { -class MockOpenTabsUIDelegate : public sync_sessions::OpenTabsUIDelegate { - public: - MockOpenTabsUIDelegate() = default; - - MOCK_METHOD1(GetAllForeignSessions, - bool(std::vector<raw_ptr<const sync_sessions::SyncedSession, - VectorExperimental>>* sessions)); - - MOCK_CONST_METHOD0(GetAllForeignSessionLastModifiedTimes, - base::flat_map<std::string, base::Time>()); - - MOCK_METHOD3(GetForeignTab, - bool(const std::string& tag, - const SessionID tab_id, - const sessions::SessionTab** tab)); - - MOCK_METHOD1(DeleteForeignSession, void(const std::string& tag)); - - MOCK_METHOD1( - GetForeignSession, - std::vector<const sessions::SessionWindow*>(const std::string& tag)); - - MOCK_METHOD2(GetForeignSessionTabs, - bool(const std::string& tag, - std::vector<const sessions::SessionTab*>* tabs)); - - MOCK_METHOD1(GetLocalSession, - bool(const sync_sessions::SyncedSession** local_session)); -}; - // Partial SessionSyncService that can fake behavior for // SubscribeToForeignSessionsChanged() including the notification to // subscribers. @@ -60,7 +31,7 @@ // SessionSyncService overrides. syncer::GlobalIdMapper* GetGlobalIdMapper() const override { return nullptr; } - MockOpenTabsUIDelegate* GetOpenTabsUIDelegate() override { + sync_sessions::MockOpenTabsUIDelegate* GetOpenTabsUIDelegate() override { return &mock_open_tabs_ui_delegate_; } @@ -76,7 +47,7 @@ private: base::RepeatingClosureList subscriber_list_; - MockOpenTabsUIDelegate mock_open_tabs_ui_delegate_; + sync_sessions::MockOpenTabsUIDelegate mock_open_tabs_ui_delegate_; }; class ForeignSessionHandlerTest : public ChromeRenderViewHostTestHarness {
diff --git a/chrome/browser/ui/webui/new_tab_page/composebox/variations/composebox_fieldtrial.cc b/chrome/browser/ui/webui/new_tab_page/composebox/variations/composebox_fieldtrial.cc index ca5d962..6490b36 100644 --- a/chrome/browser/ui/webui/new_tab_page/composebox/variations/composebox_fieldtrial.cc +++ b/chrome/browser/ui/webui/new_tab_page/composebox/variations/composebox_fieldtrial.cc
@@ -323,7 +323,6 @@ kRealboxLayoutModeOptions[] = { {RealboxLayoutMode::kTallBottomContext, kRealboxLayoutModeTallBottomContext}, - {RealboxLayoutMode::kTallTopContext, kRealboxLayoutModeTallTopContext}, {RealboxLayoutMode::kCompact, kRealboxLayoutModeCompact}}; const base::FeatureParam<RealboxLayoutMode> kRealboxLayoutMode( @@ -341,8 +340,6 @@ switch (realbox_layout_mode) { case RealboxLayoutMode::kTallBottomContext: return kRealboxLayoutModeTallBottomContext; - case RealboxLayoutMode::kTallTopContext: - return kRealboxLayoutModeTallTopContext; case RealboxLayoutMode::kCompact: return kRealboxLayoutModeCompact; default:
diff --git a/chrome/browser/ui/webui/new_tab_page/composebox/variations/composebox_fieldtrial.h b/chrome/browser/ui/webui/new_tab_page/composebox/variations/composebox_fieldtrial.h index 384bc47..c0926a7d 100644 --- a/chrome/browser/ui/webui/new_tab_page/composebox/variations/composebox_fieldtrial.h +++ b/chrome/browser/ui/webui/new_tab_page/composebox/variations/composebox_fieldtrial.h
@@ -111,7 +111,6 @@ // Enum for `kRealboxLayoutMode`. enum class RealboxLayoutMode { kTallBottomContext, - kTallTopContext, kCompact, }; @@ -126,7 +125,6 @@ // String constants for RealboxLayoutMode. inline constexpr char kRealboxLayoutModeTallBottomContext[] = "TallBottomContext"; -inline constexpr char kRealboxLayoutModeTallTopContext[] = "TallTopContext"; inline constexpr char kRealboxLayoutModeCompact[] = "Compact"; // Returns the string representation of `RealboxLayoutMode`.
diff --git a/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_aim_handler_unittest.cc b/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_aim_handler_unittest.cc index ccd9506..a87c6f7 100644 --- a/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_aim_handler_unittest.cc +++ b/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_aim_handler_unittest.cc
@@ -17,6 +17,7 @@ #include "content/public/test/test_web_ui.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/omnibox_proto/tool_mode.pb.h" #include "ui/base/models/menu_model.h" #include "ui/gfx/geometry/point.h" @@ -110,12 +111,12 @@ TEST_F(OmniboxPopupAimHandlerTest, OnPopupShown) { auto context = std::make_unique<SearchboxContextData::Context>(); context->text = "test query"; - context->mode = searchbox::mojom::ToolMode::kDefault; + context->mode = omnibox::TOOL_MODE_UNSPECIFIED; EXPECT_CALL(page_, OnPopupShown(testing::_)) .WillOnce([&](searchbox::mojom::SearchContextPtr context_ptr) { EXPECT_EQ("test query", context_ptr->input); - EXPECT_EQ(searchbox::mojom::ToolMode::kDefault, context_ptr->tool_mode); + EXPECT_EQ(omnibox::TOOL_MODE_UNSPECIFIED, context_ptr->tool_mode); }); handler_->OnPopupShown(std::move(context));
diff --git a/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.cc b/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.cc index 91a7c5b..80913322 100644 --- a/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.cc +++ b/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.cc
@@ -48,8 +48,6 @@ switch (variant) { case AddContextButtonVariant::kBelowResults: return "TallBottomContext"; - case AddContextButtonVariant::kAboveResults: - return "TallTopContext"; case AddContextButtonVariant::kInline: return "Compact"; }
diff --git a/chrome/browser/ui/webui/searchbox/contextual_searchbox_handler_unittest.cc b/chrome/browser/ui/webui/searchbox/contextual_searchbox_handler_unittest.cc index a40e775c..d1a3d2a 100644 --- a/chrome/browser/ui/webui/searchbox/contextual_searchbox_handler_unittest.cc +++ b/chrome/browser/ui/webui/searchbox/contextual_searchbox_handler_unittest.cc
@@ -689,7 +689,7 @@ .WillOnce( [&](const omnibox::InputState& state) { received_state_2 = state; }); EXPECT_CALL(*GetMetricsRecorderPtr(), - RecordToolMode(composebox_query::mojom::ToolMode::kCanvas)) + RecordToolMode(omnibox::ToolMode::TOOL_MODE_CANVAS)) .WillOnce(testing::Invoke( GetMetricsRecorderPtr(), &MockContextualSearchMetricsRecorder::RecordToolModeBase)); @@ -698,13 +698,11 @@ handler_->RecordToolSelectionAction(omnibox::ToolMode::TOOL_MODE_CANVAS); mock_searchbox_page_.FlushForTesting(); EXPECT_EQ(received_state_1.active_tool, omnibox::ToolMode::TOOL_MODE_CANVAS); - histogram_tester().ExpectUniqueSample( - "ContextualSearch.Tools.NewTabPage", - composebox_query::mojom::ToolMode::kCanvas, 1); + histogram_tester().ExpectUniqueSample("ContextualSearch.Tools.NewTabPage", + omnibox::ToolMode::TOOL_MODE_CANVAS, 1); - EXPECT_CALL( - *GetMetricsRecorderPtr(), - RecordModelMode(composebox_query::mojom::ModelMode::kGeminiRegular)) + EXPECT_CALL(*GetMetricsRecorderPtr(), + RecordModelMode(omnibox::ModelMode::MODEL_MODE_GEMINI_REGULAR)) .WillOnce(testing::Invoke( GetMetricsRecorderPtr(), &MockContextualSearchMetricsRecorder::RecordModelModeBase)); @@ -718,7 +716,7 @@ omnibox::ModelMode::MODEL_MODE_GEMINI_REGULAR); histogram_tester().ExpectUniqueSample( "ContextualSearch.Models.NewTabPage", - composebox_query::mojom::ModelMode::kGeminiRegular, 1); + omnibox::ModelMode::MODEL_MODE_GEMINI_REGULAR, 1); } TEST_F(ContextualSearchboxHandlerTest, OpenAutocompleteMatch_ZeroSuggestClick) {
diff --git a/chrome/browser/ui/webui/searchbox/contextual_searchbox_test_utils.h b/chrome/browser/ui/webui/searchbox/contextual_searchbox_test_utils.h index efcc98d6..b5685b6f 100644 --- a/chrome/browser/ui/webui/searchbox/contextual_searchbox_test_utils.h +++ b/chrome/browser/ui/webui/searchbox/contextual_searchbox_test_utils.h
@@ -140,18 +140,14 @@ int file_count), (override)); MOCK_METHOD(void, ActivateMetricsFunnel, (const std::string&), (override)); - MOCK_METHOD(void, - RecordToolMode, - (composebox_query::mojom::ToolMode tool_mode), - (override)); + MOCK_METHOD(void, RecordToolMode, (omnibox::ToolMode tool_mode), (override)); MOCK_METHOD(void, RecordModelMode, - (composebox_query::mojom::ModelMode model_mode), + (omnibox::ModelMode model_mode), (override)); MOCK_METHOD(void, RecordModesOnSubmission, - (composebox_query::mojom::ToolMode tool_mode, - composebox_query::mojom::ModelMode model_mode), + (omnibox::ToolMode tool_mode, omnibox::ModelMode model_mode), (override)); MOCK_METHOD(void, RecordZeroSuggestClick, (bool is_contextual), (override)); MOCK_METHOD(void, @@ -172,17 +168,16 @@ has_tab_context, has_non_tab_context, query_text_length, file_count); } - void RecordToolModeBase(composebox_query::mojom::ToolMode tool_mode) { + void RecordToolModeBase(omnibox::ToolMode tool_mode) { ContextualSearchMetricsRecorder::RecordToolMode(tool_mode); } - void RecordModelModeBase(composebox_query::mojom::ModelMode model_mode) { + void RecordModelModeBase(omnibox::ModelMode model_mode) { ContextualSearchMetricsRecorder::RecordModelMode(model_mode); } - void RecordModesOnSubmissionBase( - composebox_query::mojom::ToolMode tool_mode, - composebox_query::mojom::ModelMode model_mode) { + void RecordModesOnSubmissionBase(omnibox::ToolMode tool_mode, + omnibox::ModelMode model_mode) { ContextualSearchMetricsRecorder::RecordModesOnSubmission(tool_mode, model_mode); }
diff --git a/chrome/browser/ui/webui/settings/search_engines_handler.cc b/chrome/browser/ui/webui/settings/search_engines_handler.cc index 417cc85..1c7a6a3 100644 --- a/chrome/browser/ui/webui/settings/search_engines_handler.cc +++ b/chrome/browser/ui/webui/settings/search_engines_handler.cc
@@ -10,6 +10,7 @@ #include "base/check_deref.h" #include "base/feature_list.h" #include "base/functional/bind.h" +#include "base/i18n/rtl.h" #include "base/metrics/field_trial.h" #include "base/metrics/user_metrics.h" #include "base/strings/strcat.h" @@ -35,13 +36,16 @@ #include "components/search_engines/search_engine_choice/search_engine_choice_utils.h" #include "components/search_engines/search_engines_pref_names.h" #include "components/search_engines/template_url.h" +#include "components/search_engines/template_url_id.h" #include "components/search_engines/template_url_service.h" #include "components/search_engines/template_url_starter_pack_data.h" +#include "components/search_engines/ui_utils.h" #include "content/public/browser/web_ui.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_system.h" #include "extensions/browser/management_policy.h" #include "extensions/common/extension.h" +#include "ui/base/l10n/l10n_util.h" #if BUILDFLAG(IS_CHROMEOS) #include "ash/public/cpp/new_window_delegate.h" @@ -54,9 +58,6 @@ const char kKeywordField[] = "keyword"; const char kQueryUrlField[] = "queryUrl"; -// Dummy number used for indicating that a new search engine is added. -const int kNewSearchEngineIndex = -1; - void ProcessGuestDsePropagation(Profile& profile, bool save_guest_choice, int dse_prepopulate_id) { @@ -84,6 +85,16 @@ choice_service->SetSavedSearchEngineBetweenGuestSessions(dse_prepopulate_id); } +std::u16string GetDisplayName(std::u16string url_short_name, bool is_default) { + // TODO(crbug.com/41290309): Consider adding a special case if the short name + // is a URL, since those should always be displayed LTR. + base::i18n::AdjustStringForLocaleDirection(&url_short_name); + return is_default + ? l10n_util::GetStringFUTF16( + IDS_SEARCH_ENGINES_EDITOR_DEFAULT_ENGINE, url_short_name) + : url_short_name; +} + } // namespace namespace settings { @@ -101,6 +112,11 @@ void SearchEnginesHandler::RegisterMessages() { web_ui()->RegisterMessageCallback( + "getCategorizedTemplateUrls", + base::BindRepeating( + &SearchEnginesHandler::HandleGetCategorizedTemplateUrls, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( "getSearchEnginesList", base::BindRepeating(&SearchEnginesHandler::HandleGetSearchEnginesList, base::Unretained(this))); @@ -157,13 +173,40 @@ pref_change_registrar_.RemoveAll(); } -base::DictValue SearchEnginesHandler::GetSearchEnginesList() { - // Find the default engine. - const TemplateURL* default_engine = - list_controller_.GetDefaultSearchProvider(); - std::optional<size_t> default_index = - list_controller_.table_model()->IndexOfTemplateURL(default_engine); +base::DictValue SearchEnginesHandler::GetCategorizedTemplateUrls() { + base::DictValue search_engines_data; + Profile* profile = Profile::FromWebUI(web_ui()); + CHECK(profile); + TemplateURLService* template_url_service = + TemplateURLServiceFactory::GetForProfile(profile); + CHECK(template_url_service); + + TemplateURLService::CategorizedTemplateUrls data = + template_url_service->GetCategorizedTemplateURLs( + internal::GetDisabledStarterPackIds(profile)); + + auto transform_urls = + [&](const TemplateURL::TemplateURLVector& template_urls) { + base::ListValue transformed_list; + for (const auto& template_url : template_urls) { + transformed_list.Append(CreateDictionaryForEngine(template_url)); + } + return transformed_list; + }; + + search_engines_data.Set("activeSiteShortcuts", + transform_urls(data.active_site_shortcuts)); + search_engines_data.Set("inactiveSiteShortcuts", + transform_urls(data.inactive_site_shortcuts)); + search_engines_data.Set("activeFeatureShortcuts", + transform_urls(data.active_feature_shortcuts)); + search_engines_data.Set("inactiveFeatureShortcuts", + transform_urls(data.inactive_feature_shortcuts)); + return search_engines_data; +} + +base::DictValue SearchEnginesHandler::GetSearchEnginesList() { // Build the first list (default search engines). base::ListValue defaults; size_t last_default_engine_index = @@ -171,7 +214,8 @@ for (size_t i = 0; i < last_default_engine_index; ++i) { // Third argument is false, as the engine is not from an extension. - defaults.Append(CreateDictionaryForEngine(i, i == default_index)); + defaults.Append( + CreateDictionaryForEngine(list_controller_.GetTemplateURLForIndex(i))); } // Build the second list (active search engines). @@ -182,8 +226,8 @@ CHECK_LE(last_default_engine_index, last_active_engine_index); for (size_t i = last_default_engine_index; i < last_active_engine_index; ++i) { - // Third argument is false, as the engine is not from an extension. - actives.Append(CreateDictionaryForEngine(i, i == default_index)); + actives.Append( + CreateDictionaryForEngine(list_controller_.GetTemplateURLForIndex(i))); } // Build the third list (other search engines). @@ -195,7 +239,8 @@ CHECK_LE(last_active_engine_index, last_other_engine_index); for (size_t i = last_active_engine_index; i < last_other_engine_index; ++i) { - others.Append(CreateDictionaryForEngine(i, i == default_index)); + others.Append( + CreateDictionaryForEngine(list_controller_.GetTemplateURLForIndex(i))); } // Build the third list (omnibox extensions). @@ -206,7 +251,8 @@ CHECK_LE(last_other_engine_index, engine_count); for (size_t i = last_other_engine_index; i < engine_count; ++i) { - extensions.Append(CreateDictionaryForEngine(i, i == default_index)); + extensions.Append( + CreateDictionaryForEngine(list_controller_.GetTemplateURLForIndex(i))); } base::DictValue search_engines_info; @@ -219,6 +265,9 @@ void SearchEnginesHandler::OnModelChanged() { AllowJavascript(); + + // TODO(crbug.com/490315684): Fire `GetCategorizedTemplateUrls()` when + // `SearchSettingsUpdate` is enabled instead. FireWebUIListener("search-engines-changed", GetSearchEnginesList()); } @@ -235,15 +284,11 @@ } base::DictValue SearchEnginesHandler::CreateDictionaryForEngine( - size_t index, - bool is_default) { - TemplateURLTableModel* table_model = list_controller_.table_model(); - const TemplateURL* template_url = list_controller_.GetTemplateURL(index); - - // Sanity check for https://crbug.com/781703. - CHECK_LT(index, table_model->RowCount()); + TemplateURL* template_url) { CHECK(template_url); + bool is_default = template_url == list_controller_.GetDefaultSearchProvider(); + // The items which are to be written into |dict| are also described in // chrome/browser/resources/settings/search_engines_page/ // in @typedef for SearchEngine. Please update it whenever you add or remove @@ -252,10 +297,9 @@ dict.Set("id", static_cast<int>(template_url->id())); dict.Set("name", template_url->short_name()); dict.Set("displayName", - table_model->GetText(index, - IDS_SEARCH_ENGINES_EDITOR_DESCRIPTION_COLUMN)); - dict.Set("keyword", table_model->GetText( - index, IDS_SEARCH_ENGINES_EDITOR_KEYWORD_COLUMN)); + GetDisplayName(template_url->short_name(), is_default)); + dict.Set("keyword", base::i18n::GetDisplayStringInLTRDirectionality( + template_url->keyword())); Profile* profile = Profile::FromWebUI(web_ui()); dict.Set("url", template_url->url_ref().DisplayURL(UIThreadSearchTermsData())); @@ -294,8 +338,6 @@ template_url->GetBuiltinImageResourceId(), "@2x"})); } - dict.Set("modelIndex", base::checked_cast<int>(index)); - dict.Set("canBeRemoved", list_controller_.CanRemove(template_url)); dict.Set("canBeDefault", list_controller_.CanMakeDefault(template_url)); dict.Set("default", is_default); @@ -329,6 +371,14 @@ return dict; } +void SearchEnginesHandler::HandleGetCategorizedTemplateUrls( + const base::ListValue& args) { + CHECK_EQ(1U, args.size()); + const base::Value& callback_id = args[0]; + AllowJavascript(); + ResolveJavascriptCallback(callback_id, GetCategorizedTemplateUrls()); +} + void SearchEnginesHandler::HandleGetSearchEnginesList( const base::ListValue& args) { CHECK_EQ(1U, args.size()); @@ -340,11 +390,7 @@ void SearchEnginesHandler::HandleSetDefaultSearchEngine( const base::ListValue& args) { CHECK_EQ(3U, args.size()); - int index = args[0].GetInt(); - if (index < 0 || static_cast<size_t>(index) >= - list_controller_.table_model()->RowCount()) { - return; - } + TemplateURLID id = args[0].GetInt(); search_engines::ChoiceMadeLocation choice_made_location = static_cast<search_engines::ChoiceMadeLocation>(args[1].GetInt()); @@ -352,7 +398,7 @@ search_engines::ChoiceMadeLocation::kSearchSettings || choice_made_location == search_engines::ChoiceMadeLocation::kSearchEngineSettings); - list_controller_.MakeDefaultTemplateURL(index, choice_made_location); + list_controller_.MakeDefaultTemplateURL(id, choice_made_location); base::RecordAction(base::UserMetricsAction("Options_SearchEngineSetDefault")); if (std::optional<bool> save_guest_choice = args[2].GetIfBool(); @@ -382,28 +428,20 @@ void SearchEnginesHandler::HandleSetIsActiveSearchEngine( const base::ListValue& args) { CHECK_EQ(2U, args.size()); - const int index = args[0].GetInt(); + const TemplateURLID id = args[0].GetInt(); const bool is_active = args[1].GetBool(); - if (index < 0 || static_cast<size_t>(index) >= - list_controller_.table_model()->RowCount()) { - return; - } - - list_controller_.SetIsActiveTemplateURL(index, is_active); + list_controller_.SetIsActiveTemplateURL(id, is_active); } void SearchEnginesHandler::HandleRemoveSearchEngine( const base::ListValue& args) { CHECK_EQ(1U, args.size()); - int index = args[0].GetInt(); - if (index < 0 || static_cast<size_t>(index) >= - list_controller_.table_model()->RowCount()) { - return; - } + TemplateURLID id = args[0].GetInt(); - if (list_controller_.CanRemove(list_controller_.GetTemplateURL(index))) { - list_controller_.RemoveTemplateURL(index); + TemplateURL* template_url = list_controller_.GetTemplateURL(id); + if (template_url && list_controller_.CanRemove(template_url)) { + list_controller_.RemoveTemplateURL(id); base::RecordAction(base::UserMetricsAction("Options_SearchEngineRemoved")); } } @@ -411,13 +449,11 @@ void SearchEnginesHandler::HandleSearchEngineEditStarted( const base::ListValue& args) { CHECK_EQ(1U, args.size()); - int index = args[0].GetInt(); + TemplateURLID id = args[0].GetInt(); - TemplateURL* engine = nullptr; - if (index >= 0 && - static_cast<size_t>(index) < list_controller_.table_model()->RowCount()) { - engine = list_controller_.GetTemplateURL(index); - } else if (index != kNewSearchEngineIndex) { + TemplateURL* engine = list_controller_.GetTemplateURL(id); + + if (!engine && id != kInvalidTemplateURLID) { return; }
diff --git a/chrome/browser/ui/webui/settings/search_engines_handler.h b/chrome/browser/ui/webui/settings/search_engines_handler.h index 5bb055d..b54d5b1 100644 --- a/chrome/browser/ui/webui/settings/search_engines_handler.h +++ b/chrome/browser/ui/webui/settings/search_engines_handler.h
@@ -20,6 +20,8 @@ namespace settings { +// TODO(crbug.com/494529875): Use `TemplateURLServiceObserver` instead of +// `ui::TableModelObserver`. class SearchEnginesHandler : public SettingsPageUIHandler, public ui::TableModelObserver, public EditSearchEngineControllerDelegate { @@ -52,6 +54,11 @@ friend class SearchEnginesHandlerTest; // Retrieves all search engines and returns them to WebUI. + void HandleGetCategorizedTemplateUrls(const base::ListValue& args); + + base::DictValue GetCategorizedTemplateUrls(); + + // Retrieves all search engines and returns them to WebUI. void HandleGetSearchEnginesList(const base::ListValue& args); base::DictValue GetSearchEnginesList(); @@ -99,7 +106,7 @@ #endif // Returns a dictionary to pass to WebUI representing the given search engine. - base::DictValue CreateDictionaryForEngine(size_t index, bool is_default); + base::DictValue CreateDictionaryForEngine(TemplateURL* template_url); const raw_ptr<Profile> profile_;
diff --git a/chrome/browser/ui/webui/settings/search_engines_handler_unittest.cc b/chrome/browser/ui/webui/settings/search_engines_handler_unittest.cc index 9d27abee..72761b321 100644 --- a/chrome/browser/ui/webui/settings/search_engines_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/search_engines_handler_unittest.cc
@@ -97,13 +97,13 @@ base::BindRepeating(&TemplateURLServiceFactory::BuildInstanceFor)); TemplateURLService* template_url_service = TemplateURLServiceFactory::GetForProfile(profile); + bing_engine_ = AddSearchEngine(template_url_service, "bing", + TemplateURLPrepopulateData::bing.keyword, + TemplateURLPrepopulateData::bing.id, + TemplateURLPrepopulateData::bing.search_url); TemplateURL* default_engine = AddSearchEngine( template_url_service, "foo.com", u"foo_com", /*prepopulated_id=*/0, /*url=*/std::nullopt); - AddSearchEngine(template_url_service, "bing", - TemplateURLPrepopulateData::bing.keyword, - TemplateURLPrepopulateData::bing.id, - TemplateURLPrepopulateData::bing.search_url); template_url_service->SetUserSelectedDefaultSearchProvider(default_engine); @@ -125,12 +125,15 @@ TestingProfileManager& profile_manager() { return profile_manager_; } + int bing_id() { return bing_engine_->id(); } + private: base::HistogramTester histogram_tester_; content::BrowserTaskEnvironment task_environment_; TestingProfileManager profile_manager_; content::TestWebContentsFactory web_contents_factory_; + raw_ptr<TemplateURL> bing_engine_ = nullptr; raw_ptr<Profile> profile_ = nullptr; std::unique_ptr<content::TestWebUI> web_ui_; std::unique_ptr<SearchEnginesHandler> handler_; @@ -165,7 +168,7 @@ base::ListValue first_call_args; // Search engine model id. - first_call_args.Append(1); + first_call_args.Append(bing_id()); first_call_args.Append(static_cast<int>( search_engines::ChoiceMadeLocation::kSearchEngineSettings)); first_call_args.Append(base::Value()); // saveGuestChoice @@ -177,7 +180,7 @@ base::ListValue second_call_args; // Search engine model id. - second_call_args.Append(1); + second_call_args.Append(bing_id()); second_call_args.Append( static_cast<int>(search_engines::ChoiceMadeLocation::kSearchSettings)); second_call_args.Append(base::Value()); // saveGuestChoice @@ -200,7 +203,7 @@ base::ListValue args; // Search engine model id. - args.Append(1); + args.Append(bing_id()); args.Append(static_cast<int>( search_engines::ChoiceMadeLocation::kSearchEngineSettings)); args.Append(base::Value()); // saveGuestChoice @@ -230,7 +233,7 @@ CHECK_NE(default_search_engine_type, SearchEngineType::SEARCH_ENGINE_BING); base::ListValue args; // Search engine model id. - args.Append(1); + args.Append(bing_id()); args.Append(static_cast<int>( search_engines::ChoiceMadeLocation::kSearchEngineSettings)); args.Append(base::Value()); // saveGuestChoice @@ -343,7 +346,7 @@ { base::ListValue args; // Search engine model id. - args.Append(1); + args.Append(bing_id()); args.Append(static_cast<int>( search_engines::ChoiceMadeLocation::kSearchEngineSettings)); args.Append(true); // saveGuestChoice @@ -356,7 +359,7 @@ { base::ListValue args; // Search engine model id. - args.Append(0); + args.Append(bing_id()); args.Append(static_cast<int>( search_engines::ChoiceMadeLocation::kSearchEngineSettings)); args.Append(base::Value()); // saveGuestChoice @@ -370,7 +373,7 @@ { base::ListValue args; // Search engine model id. - args.Append(0); + args.Append(bing_id()); args.Append(static_cast<int>( search_engines::ChoiceMadeLocation::kSearchEngineSettings)); args.Append(false); // saveGuestChoice @@ -401,7 +404,7 @@ { base::ListValue args; // Search engine model id. - args.Append(1); + args.Append(bing_id()); args.Append(static_cast<int>( search_engines::ChoiceMadeLocation::kSearchEngineSettings)); args.Append(true); // saveGuestChoice
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 5b1d1b2..83bd7f2 100644 --- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -3220,6 +3220,10 @@ {"siteSettingsUsage", IDS_SETTINGS_SITE_SETTINGS_USAGE}, {"siteSettingsUsageNone", IDS_SETTINGS_SITE_SETTINGS_USAGE_NONE}, {"siteSettingsPermissions", IDS_SETTINGS_SITE_SETTINGS_PERMISSIONS}, + {"siteSettingsParentAppPermissionExplanation", + IDS_SETTINGS_SITE_SETTINGS_PARENT_APP_PERMISSION_EXPLANATION}, + {"siteSettingsSubAppPermissionExplanation", + IDS_SETTINGS_SITE_SETTINGS_SUB_APP_PERMISSION_EXPLANATION}, {"siteSettingsPermissionsMore", IDS_SETTINGS_SITE_SETTINGS_PERMISSIONS_MORE}, {"siteSettingsContent", IDS_SETTINGS_SITE_SETTINGS_CONTENT},
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler.cc b/chrome/browser/ui/webui/settings/site_settings_handler.cc index 0309ea4..5162dd61 100644 --- a/chrome/browser/ui/webui/settings/site_settings_handler.cc +++ b/chrome/browser/ui/webui/settings/site_settings_handler.cc
@@ -65,6 +65,9 @@ #include "chrome/browser/usb/usb_chooser_context.h" #include "chrome/browser/usb/usb_chooser_context_factory.h" #include "chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_info.h" +#include "chrome/browser/web_applications/web_app.h" +#include "chrome/browser/web_applications/web_app_filter.h" +#include "chrome/browser/web_applications/web_app_helpers.h" #include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/browser/web_applications/web_app_registrar.h" #include "chrome/common/extensions/manifest_handlers/app_launch_info.h" @@ -845,6 +848,11 @@ base::BindRepeating( &SiteSettingsHandler::HandleOpenSystemPermissionSettings, base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "getSubAppsPermissionExplanation", + base::BindRepeating( + &SiteSettingsHandler::HandleGetSubAppsPermissionExplanation, + base::Unretained(this))); } void SiteSettingsHandler::OnJavascriptAllowed() { @@ -2564,6 +2572,60 @@ system_permission_settings::OpenSystemSettings(web_contents, permission_type); } +void SiteSettingsHandler::HandleGetSubAppsPermissionExplanation( + const base::ListValue& args) { + AllowJavascript(); + + CHECK_EQ(2U, args.size()); + const base::Value& callback_id = args[0]; + const std::string& url_string = args[1].GetString(); + + const GURL url(url_string); + base::DictValue result; + result.Set("isSubApp", false); + result.Set("hasSubApps", false); + + auto* web_app_provider = web_app::WebAppProvider::GetForWebApps(profile_); + if (!web_app_provider) { + ResolveJavascriptCallback(callback_id, result); + return; + } + + const web_app::WebAppRegistrar& registrar = + web_app_provider->registrar_unsafe(); + std::optional<webapps::AppId> app_id = + web_app::FindInstalledAppWithUrlInScope(profile_, url); + + if (app_id.has_value()) { + if (registrar.AppMatches(*app_id, + web_app::WebAppFilter::IsIsolatedSubApp())) { + const web_app::WebApp* app = registrar.GetAppById(*app_id); + if (app && app->parent_app_id().has_value()) { + std::string parent_app_id = app->parent_app_id().value(); + result.Set("isSubApp", true); + result.Set("appName", registrar.GetAppShortName(*app_id)); + result.Set("parentAppName", registrar.GetAppShortName(parent_app_id)); + GURL parent_app_url = registrar.GetAppStartUrl(parent_app_id); + std::string parent_url_string = + parent_app_url.SchemeIs(webapps::kIsolatedAppScheme) + ? parent_app_url.spec() + : url::Origin::Create(parent_app_url).Serialize(); + result.Set("parentAppOrigin", parent_url_string); + } + } + + if (!result.FindBool("isSubApp").value_or(false) && + registrar.AppMatches(*app_id, web_app::WebAppFilter::IsIsolatedApp())) { + if (!registrar.GetAllSubAppIds(*app_id).empty()) { + result.Set("hasSubApps", true); + result.Set("appName", registrar.GetAppShortName(*app_id)); + } + } + } + + ResolveJavascriptCallback(callback_id, result); +} + void SiteSettingsHandler::RemoveNonModelData( const std::vector<url::Origin>& origins) { if (origins.empty()) {
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler.h b/chrome/browser/ui/webui/settings/site_settings_handler.h index d9bb78c..80b8d777 100644 --- a/chrome/browser/ui/webui/settings/site_settings_handler.h +++ b/chrome/browser/ui/webui/settings/site_settings_handler.h
@@ -222,6 +222,12 @@ // Attempts to open the the OS permission settings. void HandleOpenSystemPermissionSettings(const base::ListValue& args); + // Handles the request for info about whether the url points to an isolated + // web app that has sub apps or is a sub app so that we can later on explain + // clearly that an isolated web app shares permissions with its installed + // sub apps and vice versa. + void HandleGetSubAppsPermissionExplanation(const base::ListValue& args); + void ClearAllSitesMapForTesting(); void SetModelForTesting(
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc index afe4de8..2114c5f 100644 --- a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
@@ -71,7 +71,10 @@ #include "chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_info.h" #include "chrome/browser/web_applications/isolated_web_apps/test/isolated_web_app_builder.h" #include "chrome/browser/web_applications/test/web_app_install_test_utils.h" +#include "chrome/browser/web_applications/test/web_app_test_utils.h" #include "chrome/browser/web_applications/web_app_helpers.h" +#include "chrome/browser/web_applications/web_app_registry_update.h" +#include "chrome/browser/web_applications/web_app_sync_bridge.h" #include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" #include "chrome/test/base/browser_with_test_window_test.h" @@ -3000,9 +3003,52 @@ class SiteSettingsHandlerIsolatedWebAppTest : public SiteSettingsHandlerBaseTest { protected: + static constexpr char kAppName[] = "IWA Name"; + static constexpr char kSubAppName[] = "Sub App"; + void SetUpIsolatedWebApp() override { web_app::test::AwaitStartWebAppProviderAndSubsystems(profile()); - iwa_url_info_ = InstallIsolatedWebApp("IWA Name"); + iwa_url_info_ = InstallIsolatedWebApp(kAppName); + } + + const base::ListValue& CallHandleGetOriginPermissions( + const std::string& url, + base::ListValue category_list) { + base::ListValue args; + args.Append(kCallbackId); + args.Append(url); + args.Append(std::move(category_list)); + handler()->HandleGetOriginPermissions(args); + + const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); + EXPECT_EQ("cr.webUIResponse", data.function_name()); + return data.arg3()->GetList(); + } + + const base::DictValue& CallHandleGetSubAppsPermissionExplanation( + const std::string& url) { + base::ListValue args; + args.Append(kCallbackId); + args.Append(url); + handler()->HandleGetSubAppsPermissionExplanation(args); + + const content::TestWebUI::CallData& data = *web_ui()->call_data().back(); + EXPECT_EQ("cr.webUIResponse", data.function_name()); + return data.arg3()->GetDict(); + } + + void InstallSubApp(const GURL& url, const std::string& name) { + auto sub_app = + web_app::test::CreateWebApp(url, web_app::WebAppManagement::kSubApp); + sub_app->SetName(name); + sub_app->SetParentAppId(iwa_url_info_->app_id()); + + auto* provider = web_app::WebAppProvider::GetForTest(profile()); + { + web_app::ScopedRegistryUpdate update = + provider->sync_bridge_unsafe().BeginUpdate(); + update->CreateApp(std::move(sub_app)); + } } protected: @@ -3029,6 +3075,62 @@ data_decoder::test::InProcessDataDecoder in_process_data_decoder_; }; +TEST_F(SiteSettingsHandlerIsolatedWebAppTest, GetOriginPermissionsSubApp) { + GURL sub_app_url = iwa_url_info_->origin().GetURL().Resolve("/sub-app/"); + InstallSubApp(sub_app_url, std::string(kSubAppName)); + + base::ListValue category_list; + category_list.Append(site_settings::ContentSettingsTypeToGroupName( + ContentSettingsType::NOTIFICATIONS)); + + const base::ListValue& permissions = CallHandleGetOriginPermissions( + sub_app_url.spec(), std::move(category_list)); + ASSERT_EQ(1U, permissions.size()); + + const base::DictValue& permission = permissions[0].GetDict(); + // Append " (ID: <id>)" to the name as per HandleGetOriginPermissions + std::string expected_name = l10n_util::GetStringFUTF8( + IDS_SETTINGS_EXTENSION_OR_APP_DISPLAY_NAME, + base::UTF8ToUTF16(std::string_view(kSubAppName)), + base::UTF8ToUTF16(sub_app_url.host())); + EXPECT_EQ(expected_name, *permission.FindString("displayName")); +} + +TEST_F(SiteSettingsHandlerIsolatedWebAppTest, + GetSubAppsPermissionExplanation_NeitherParentNorSubApp) { + const base::DictValue& result = CallHandleGetSubAppsPermissionExplanation( + iwa_url_info_->origin().GetURL().spec()); + EXPECT_FALSE(*result.FindBool("isSubApp")); + EXPECT_FALSE(*result.FindBool("hasSubApps")); +} + +TEST_F(SiteSettingsHandlerIsolatedWebAppTest, + GetSubAppsPermissionExplanation_SubApp) { + GURL sub_app_url = iwa_url_info_->origin().GetURL().Resolve("/sub-app/"); + InstallSubApp(sub_app_url, std::string(kSubAppName)); + + const base::DictValue& result = + CallHandleGetSubAppsPermissionExplanation(sub_app_url.spec()); + EXPECT_TRUE(*result.FindBool("isSubApp")); + EXPECT_FALSE(*result.FindBool("hasSubApps")); + EXPECT_EQ(kSubAppName, *result.FindString("appName")); + EXPECT_EQ(kAppName, *result.FindString("parentAppName")); + EXPECT_EQ(iwa_url_info_->origin().GetURL().spec(), + *result.FindString("parentAppOrigin")); +} + +TEST_F(SiteSettingsHandlerIsolatedWebAppTest, + GetSubAppsPermissionExplanation_ParentApp) { + GURL sub_app_url = iwa_url_info_->origin().GetURL().Resolve("/sub-app/"); + InstallSubApp(sub_app_url, std::string(kSubAppName)); + + const base::DictValue& result = CallHandleGetSubAppsPermissionExplanation( + iwa_url_info_->origin().GetURL().spec()); + EXPECT_FALSE(*result.FindBool("isSubApp")); + EXPECT_TRUE(*result.FindBool("hasSubApps")); + EXPECT_EQ(kAppName, *result.FindString("appName")); +} + TEST_F(SiteSettingsHandlerIsolatedWebAppTest, AllSitesDisplaysAppName) { GURL https_url("https://" + iwa_url_info_->origin().host()); GURL iwa_origin_url = iwa_url_info_->origin().GetURL(); @@ -3052,7 +3154,7 @@ EXPECT_THAT(CHECK_DEREF(group1.FindString("groupingKey")), IsOrigin(iwa_origin_url)); EXPECT_EQ(group1.FindString("etldPlus1"), nullptr); - EXPECT_EQ(CHECK_DEREF(group1.FindString("displayName")), "IWA Name"); + EXPECT_EQ(CHECK_DEREF(group1.FindString("displayName")), kAppName); EXPECT_EQ(CHECK_DEREF(origin1.FindString("origin")), iwa_origin_url); EXPECT_EQ(origin1.FindDouble("usage").value(), 50.0); @@ -3074,11 +3176,11 @@ std::string host_or_spec = iwa_url_info_->origin().Serialize(); iwa_host_zoom_map->SetZoomLevelForHost(iwa_url_info_->origin().host(), 1.1); - ValidateZoom({{host_or_spec, "IWA Name", "122%"}}, 1U); + ValidateZoom({{host_or_spec, kAppName, "122%"}}, 1U); base::ListValue args; handler()->HandleFetchZoomLevels(args); - ValidateZoom({{host_or_spec, "IWA Name", "122%"}}, 2U); + ValidateZoom({{host_or_spec, kAppName, "122%"}}, 2U); args.Append(host_or_spec); handler()->HandleRemoveZoomLevel(args); @@ -3111,7 +3213,7 @@ base::ListValue args; handler()->HandleFetchZoomLevels(args); - ValidateZoom({{iwa_url_info_->origin().Serialize(), "IWA Name", "122%"}, + ValidateZoom({{iwa_url_info_->origin().Serialize(), kAppName, "122%"}, {iwa2_url_info.origin().Serialize(), "IWA Name 2", "122%"}, {iwa3_url_info.origin().Serialize(), "IWA Name 3", "122%"}}, 2U);
diff --git a/chrome/browser/ui/webui/settings/site_settings_helper.cc b/chrome/browser/ui/webui/settings/site_settings_helper.cc index f20b61d8..313c4e3a 100644 --- a/chrome/browser/ui/webui/settings/site_settings_helper.cc +++ b/chrome/browser/ui/webui/settings/site_settings_helper.cc
@@ -994,8 +994,11 @@ .name = base::UTF8ToUTF16(url.spec())}; } + GURL url_to_use = + url.SchemeIs(webapps::kIsolatedAppScheme) ? url : origin.GetURL(); + return UrlIdentity::CreateFromUrl( - profile, origin.GetURL(), kUrlIdentityAllowedTypes, + profile, url_to_use, kUrlIdentityAllowedTypes, hostname_only ? kUrlIdentityOptionsHostOnly : kUrlIdentityOptionsOmitHttps); }
diff --git a/chrome/browser/ui/webui/skills/skills_page_handler.cc b/chrome/browser/ui/webui/skills/skills_page_handler.cc index c8be4450..82a4c4c 100644 --- a/chrome/browser/ui/webui/skills/skills_page_handler.cc +++ b/chrome/browser/ui/webui/skills/skills_page_handler.cc
@@ -34,6 +34,7 @@ translated_skill.icon = skill.icon(); translated_skill.prompt = skill.prompt(); translated_skill.description = skill.description(); + translated_skill.image_url = GURL(skill.image_url()); translated_skill.source = sync_pb::SkillSource::SKILL_SOURCE_FIRST_PARTY; translated_map[skill.category()].push_back(std::move(translated_skill)); }
diff --git a/chrome/browser/ui/webui/skills/skills_page_handler_unittest.cc b/chrome/browser/ui/webui/skills/skills_page_handler_unittest.cc index c7ce6a5..0a5d6a7 100644 --- a/chrome/browser/ui/webui/skills/skills_page_handler_unittest.cc +++ b/chrome/browser/ui/webui/skills/skills_page_handler_unittest.cc
@@ -97,6 +97,7 @@ skill_proto.set_prompt("Skill prompt"); skill_proto.set_category("Category"); skill_proto.set_description("Skill description"); + skill_proto.set_image_url("https://example.com/image.png"); skills_map->insert({"skill_id", skill_proto}); @@ -115,6 +116,7 @@ EXPECT_EQ("icon", skill.icon); EXPECT_EQ("Skill prompt", skill.prompt); EXPECT_EQ("Skill description", skill.description); + EXPECT_EQ("https://example.com/image.png", skill.image_url); EXPECT_EQ(sync_pb::SkillSource::SKILL_SOURCE_FIRST_PARTY, skill.source); run_loop.Quit(); });
diff --git a/chrome/browser/ui/webui/updater/updater_page_handler.cc b/chrome/browser/ui/webui/updater/updater_page_handler.cc index d44bdd29..81cc4ed 100644 --- a/chrome/browser/ui/webui/updater/updater_page_handler.cc +++ b/chrome/browser/ui/webui/updater/updater_page_handler.cc
@@ -218,25 +218,25 @@ UpdaterPageHandler::UnzipUpdaterHistoryFilesCallback callback) { base::ScopedTempDir temp_dir; if (!temp_dir.CreateUniqueTempDir()) { - DPLOG(WARNING) << "Failed to create temporary directory"; - std::move(callback).Run(base::unexpected( - updater_ui::mojom::UnzipUpdaterHistoryFilesError::New())); + std::move(callback).Run( + base::unexpected(updater_ui::mojom::UnzipUpdaterHistoryFilesError::New( + "Failed to create temporary directory"))); return; } base::FilePath archive_path = temp_dir.GetPath().AppendASCII("input.zip"); if (!base::WriteFile(archive_path, zip_data)) { - DPLOG(WARNING) << "Failed to write user-supplied zip data to storage"; - std::move(callback).Run(base::unexpected( - updater_ui::mojom::UnzipUpdaterHistoryFilesError::New())); + std::move(callback).Run( + base::unexpected(updater_ui::mojom::UnzipUpdaterHistoryFilesError::New( + "Failed to write user-supplied zip data to storage"))); return; } const base::FilePath output_path = temp_dir.GetPath().AppendASCII("output"); if (!base::CreateDirectory(output_path)) { - DPLOG(WARNING) << "Failed to create output path in temporary directory"; - std::move(callback).Run(base::unexpected( - updater_ui::mojom::UnzipUpdaterHistoryFilesError::New())); + std::move(callback).Run( + base::unexpected(updater_ui::mojom::UnzipUpdaterHistoryFilesError::New( + "Failed to create output path in temporary directory"))); return; } @@ -257,9 +257,9 @@ UpdaterPageHandler::UnzipUpdaterHistoryFilesCallback callback, bool result) { if (!result) { - DLOG(WARNING) << "Failed to unzip user-supplied archive"; std::move(callback).Run(base::unexpected( - updater_ui::mojom::UnzipUpdaterHistoryFilesError::New())); + updater_ui::mojom::UnzipUpdaterHistoryFilesError::New( + "Failed to unzip user-supplied archive"))); return; } @@ -271,9 +271,10 @@ path = it.Next()) { std::string contents; if (!base::ReadFileToString(path, &contents)) { - DPLOG(WARNING) << "Failed to read " << path; std::move(callback).Run(base::unexpected( - updater_ui::mojom::UnzipUpdaterHistoryFilesError::New())); + updater_ui::mojom::UnzipUpdaterHistoryFilesError::New( + base::StrCat( + {"Failed to read ", path.AsUTF8Unsafe()})))); return; } response->history_file_contents.push_back(std::move(contents)); @@ -337,7 +338,8 @@ FROM_HERE, base::BindOnce( std::move(callback), - base::unexpected(updater_ui::mojom::GetUpdaterStatesError::New()))); + base::unexpected(updater_ui::mojom::GetUpdaterStatesError::New( + "Failed to determine updater installation directories")))); return; } @@ -438,7 +440,9 @@ std::optional<base::FilePath> install_dir = delegate->GetEnterpriseCompanionInstallDirectory(); if (!install_dir) { - return base::unexpected(GetEnterpriseCompanionStateError::New()); + return base::unexpected(GetEnterpriseCompanionStateError::New( + "Failed to determine Chrome Enterprise Companion App " + "installation directory")); } return GetEnterpriseCompanionStateResponse::New(
diff --git a/chrome/browser/ui/webui/updater/updater_ui.mojom b/chrome/browser/ui/webui/updater/updater_ui.mojom index de5ccd21..680712c 100644 --- a/chrome/browser/ui/webui/updater/updater_ui.mojom +++ b/chrome/browser/ui/webui/updater/updater_ui.mojom
@@ -45,7 +45,10 @@ UpdaterState? user; }; -struct GetUpdaterStatesError {}; +struct GetUpdaterStatesError { + // Non localized description of the error suitable for logging in JS. + string message; +}; // A snapshot of a Chrome Enterprise Companion App installation's state. struct EnterpriseCompanionState { @@ -61,7 +64,10 @@ EnterpriseCompanionState? state; }; -struct GetEnterpriseCompanionStateError {}; +struct GetEnterpriseCompanionStateError { + // Non localized description of the error suitable for logging in JS. + string message; +}; struct AppState { // The ASCII AppId of the application this state refers to, in the format @@ -82,7 +88,10 @@ array<AppState> user_apps; }; -struct GetAppStatesError {}; +struct GetAppStatesError { + // Non localized description of the error suitable for logging in JS. + string message; +}; enum ShowDirectoryTarget { kSystemUpdater, @@ -100,7 +109,10 @@ array<string> history_file_contents; }; -struct UnzipUpdaterHistoryFilesError {}; +struct UnzipUpdaterHistoryFilesError { + // Non localized description of the error suitable for logging in JS. + string message; +}; // Called from TS side of chrome://updater (Renderer -> Browser). interface PageHandler {
diff --git a/chrome/browser/ui/webui/whats_new/BUILD.gn b/chrome/browser/ui/webui/whats_new/BUILD.gn index 4872469b..9abc5b45 100644 --- a/chrome/browser/ui/webui/whats_new/BUILD.gn +++ b/chrome/browser/ui/webui/whats_new/BUILD.gn
@@ -4,7 +4,6 @@ import("//chrome/common/features.gni") import("//mojo/public/tools/bindings/mojom.gni") -import("//pdf/features.gni") assert(!is_android && !is_fuchsia) @@ -90,12 +89,8 @@ "//components/history_embeddings/core", "//components/user_education/common", "//components/variations/service", - "//pdf:buildflags", "//ui/webui", ] - if (enable_pdf) { - deps += [ "//pdf:features" ] - } } }
diff --git a/chrome/browser/ui/webui/whats_new/whats_new_registrar.cc b/chrome/browser/ui/webui/whats_new/whats_new_registrar.cc index 3e15139..6e0bdd3 100644 --- a/chrome/browser/ui/webui/whats_new/whats_new_registrar.cc +++ b/chrome/browser/ui/webui/whats_new/whats_new_registrar.cc
@@ -13,14 +13,9 @@ #include "components/performance_manager/public/features.h" #include "components/sync/base/features.h" #include "components/user_education/webui/whats_new_registry.h" -#include "pdf/buildflags.h" #include "ui/accessibility/accessibility_features.h" #include "ui/webui/resources/js/browser_command/browser_command.mojom.h" -#if BUILDFLAG(ENABLE_PDF) -#include "pdf/pdf_features.h" -#endif // BUILDFLAG(ENABLE_PDF) - namespace whats_new { using BrowserCommand = browser_command::mojom::Command; @@ -40,12 +35,6 @@ WhatsNewModule(::syncer::kSyncAccountSettings, "vizcay@google.com", BrowserCommand::kOpenAutofillSettings)); - // M144 -#if BUILDFLAG(ENABLE_PDF) - registry->RegisterModule( - WhatsNewModule(chrome_pdf::features::kPdfInk2, "andyphan@chromium.org")); -#endif // BUILDFLAG(ENABLE_PDF) - // M147 registry->RegisterModule(WhatsNewModule(tabs::kVerticalTabsLaunch, "charlesmeng@google.com",
diff --git a/chrome/browser/web_applications/commands/add_validated_origin_associations_command.cc b/chrome/browser/web_applications/commands/add_validated_origin_associations_command.cc index 57350ad..ce74a747 100644 --- a/chrome/browser/web_applications/commands/add_validated_origin_associations_command.cc +++ b/chrome/browser/web_applications/commands/add_validated_origin_associations_command.cc
@@ -74,10 +74,9 @@ bool needs_migration_validation = !base::STLSetDifference<base::flat_set<MigrationSource>>( - base::MakeFlatSet<MigrationSource>( + base::flat_set<MigrationSource>( app->unvalidated_migration_sources()), - base::MakeFlatSet<MigrationSource>( - app->validated_migration_sources())) + base::flat_set<MigrationSource>(app->validated_migration_sources())) .empty(); if (!needs_scope_validation && !needs_migration_validation) { @@ -152,13 +151,12 @@ } { - auto original_unvalidated = base::MakeFlatSet<MigrationSource>( + base::flat_set<MigrationSource> original_unvalidated( app.unvalidated_migration_sources()); - auto original_validated = - base::MakeFlatSet<MigrationSource>(app.validated_migration_sources()); + base::flat_set<MigrationSource> original_validated( + app.validated_migration_sources()); - base::flat_set<MigrationSource> new_validated; - new_validated.insert_range( + base::flat_set<MigrationSource> new_validated( validated_origin_associations.migration_sources); auto previously_validated_and_requested = @@ -174,11 +172,10 @@ original_unvalidated, final_validated) .empty(); - app.SetValidatedMigrationSources( - std::ranges::to<std::vector<MigrationSource>>(final_validated)); - // Check if any migration sources were added or removed. migration_sources_updated = original_validated != final_validated; + + app.SetValidatedMigrationSources(std::move(final_validated).extract()); } app.SetOriginAssociationLastValidationCheckTime(now_time); }
diff --git a/chrome/browser/web_applications/commands/web_app_install_from_migrate_from_field_command.cc b/chrome/browser/web_applications/commands/web_app_install_from_migrate_from_field_command.cc index 2e65dd4..c88f06768 100644 --- a/chrome/browser/web_applications/commands/web_app_install_from_migrate_from_field_command.cc +++ b/chrome/browser/web_applications/commands/web_app_install_from_migrate_from_field_command.cc
@@ -82,9 +82,13 @@ bool source_installed = false; for (const auto& migrate_from : manifest_->migrate_from) { + // Allow all installed apps, even source apps installed by policy that is + // not allowed to migrate, to also install the destination app but keep it + // hidden from the user, so as to populate the pending migration metadata + // in the source app. if (lock_->registrar().AppMatches( GenerateAppIdFromManifestId(migrate_from->id), - WebAppFilter::IsAppValidMigrationSource())) { + WebAppFilter::CanAppInstallTargetMigrationApp())) { source_installed = true; break; }
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_permissions_policy_browsertest.cc b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_permissions_policy_browsertest.cc index d20d7c9..37dbad4 100644 --- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_permissions_policy_browsertest.cc +++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_permissions_policy_browsertest.cc
@@ -413,4 +413,149 @@ "https://raven.nevermore")); } +class IsolatedWebAppDirectSocketsPrivatePermissionsPolicyUnpackingTest + : public web_app::IsolatedWebAppBrowserTestHarness { + public: + content::RenderFrameHost* InstallAndOpenIWAWithFeatures( + std::map<network::mojom::PermissionsPolicyFeature, + std::vector<url::Origin>> feature_map = {}) { + auto builder = + ManifestBuilder( + /*include_cross_origin_isolated_permissions_policy=*/true) + .AddPermissionsPolicyWildcard( + network::mojom::PermissionsPolicyFeature::kDirectSockets); + + for (const auto& [feature, origins] : feature_map) { + builder.AddPermissionsPolicy(feature, /*self=*/true, origins); + } + + auto app = web_app::IsolatedWebAppBuilder(std::move(builder)).BuildBundle(); + return OpenApp(app->Install(profile()).value().app_id()); + } + + bool IsFeatureAllowed(content::RenderFrameHost* frame, + std::string_view feature) { + return content::EvalJs(frame, + base::ReplaceStringPlaceholders( + "document.featurePolicy.allowsFeature('$1')", + {std::string(feature)}, nullptr)) + .ExtractBool(); + } + + std::vector<std::string> GetAllowlist(content::RenderFrameHost* frame, + std::string_view feature) { + auto result = content::EvalJs( + frame, base::ReplaceStringPlaceholders( + "document.featurePolicy.getAllowlistForFeature('$1')", + {std::string(feature)}, nullptr)); + + std::vector<std::string> allowlist; + for (const auto& item : result.ExtractList()) { + allowlist.push_back(item.GetString()); + } + return allowlist; + } +}; + +IN_PROC_BROWSER_TEST_F( + IsolatedWebAppDirectSocketsPrivatePermissionsPolicyUnpackingTest, + UnpackNetworkPermissionsAndMirrorOrigins) { + url::Origin test_origin = url::Origin::Create(GURL("https://meow.meow")); + + auto* rfh = InstallAndOpenIWAWithFeatures( + {{network::mojom::PermissionsPolicyFeature::kDirectSocketsPrivate, + {test_origin}}}); + const url::Origin& iwa_origin = rfh->GetLastCommittedOrigin(); + + auto dsp_allowlist = GetAllowlist(rfh, "direct-sockets-private"); + auto local_network_allowlist = GetAllowlist(rfh, "local-network"); + auto loopback_network_allowlist = GetAllowlist(rfh, "loopback-network"); + + ASSERT_TRUE(IsFeatureAllowed(rfh, "direct-sockets-private")); + ASSERT_TRUE(IsFeatureAllowed(rfh, "local-network")); + ASSERT_TRUE(IsFeatureAllowed(rfh, "loopback-network")); + + EXPECT_EQ(dsp_allowlist, loopback_network_allowlist); + EXPECT_EQ(dsp_allowlist, local_network_allowlist); + EXPECT_THAT(dsp_allowlist, + testing::UnorderedElementsAre(test_origin.Serialize(), + iwa_origin.Serialize())); +} + +IN_PROC_BROWSER_TEST_F( + IsolatedWebAppDirectSocketsPrivatePermissionsPolicyUnpackingTest, + NoUnpackingWithoutDirectSocketsPrivate) { + auto* rfh = InstallAndOpenIWAWithFeatures({}); + + ASSERT_FALSE(IsFeatureAllowed(rfh, "direct-sockets-private")); + ASSERT_FALSE(IsFeatureAllowed(rfh, "local-network")); + ASSERT_FALSE(IsFeatureAllowed(rfh, "loopback-network")); +} + +IN_PROC_BROWSER_TEST_F( + IsolatedWebAppDirectSocketsPrivatePermissionsPolicyUnpackingTest, + ExplicitLocalNetworkPreservesItsOwnAllowlist) { + url::Origin dsp_only_origin = url::Origin::Create(GURL("https://meow.meow")); + url::Origin local_network_only_origin = + url::Origin::Create(GURL("https://raven.nevermore")); + + auto* rfh = InstallAndOpenIWAWithFeatures( + {{network::mojom::PermissionsPolicyFeature::kDirectSocketsPrivate, + {dsp_only_origin}}, + {network::mojom::PermissionsPolicyFeature::kLocalNetwork, + {local_network_only_origin}}}); + const url::Origin& iwa_origin = rfh->GetLastCommittedOrigin(); + + ASSERT_TRUE(IsFeatureAllowed(rfh, "direct-sockets-private")); + ASSERT_TRUE(IsFeatureAllowed(rfh, "local-network")); + ASSERT_TRUE(IsFeatureAllowed(rfh, "loopback-network")); + + auto dsp_allowlist = GetAllowlist(rfh, "direct-sockets-private"); + auto local_network_allowlist = GetAllowlist(rfh, "local-network"); + auto loopback_network_allowlist = GetAllowlist(rfh, "loopback-network"); + + EXPECT_EQ(dsp_allowlist, loopback_network_allowlist); + EXPECT_THAT(dsp_allowlist, + testing::UnorderedElementsAre(dsp_only_origin.Serialize(), + iwa_origin.Serialize())); + EXPECT_NE(local_network_allowlist, dsp_allowlist); + EXPECT_THAT( + local_network_allowlist, + testing::UnorderedElementsAre(local_network_only_origin.Serialize(), + iwa_origin.Serialize())); +} + +IN_PROC_BROWSER_TEST_F( + IsolatedWebAppDirectSocketsPrivatePermissionsPolicyUnpackingTest, + ExplicitLoopbackNetworkPreservesItsOwnAllowlist) { + url::Origin dsp_only_origin = url::Origin::Create(GURL("https://meow.meow")); + url::Origin loopback_network_only_origin = + url::Origin::Create(GURL("https://raven.nevermore")); + + auto* rfh = InstallAndOpenIWAWithFeatures( + {{network::mojom::PermissionsPolicyFeature::kDirectSocketsPrivate, + {dsp_only_origin}}, + {network::mojom::PermissionsPolicyFeature::kLoopbackNetwork, + {loopback_network_only_origin}}}); + const url::Origin& iwa_origin = rfh->GetLastCommittedOrigin(); + + ASSERT_TRUE(IsFeatureAllowed(rfh, "direct-sockets-private")); + ASSERT_TRUE(IsFeatureAllowed(rfh, "loopback-network")); + ASSERT_TRUE(IsFeatureAllowed(rfh, "local-network")); + + auto dsp_allowlist = GetAllowlist(rfh, "direct-sockets-private"); + auto local_network_allowlist = GetAllowlist(rfh, "local-network"); + auto loopback_network_allowlist = GetAllowlist(rfh, "loopback-network"); + + EXPECT_EQ(dsp_allowlist, local_network_allowlist); + EXPECT_THAT(dsp_allowlist, + testing::UnorderedElementsAre(dsp_only_origin.Serialize(), + iwa_origin.Serialize())); + EXPECT_NE(loopback_network_allowlist, dsp_allowlist); + EXPECT_THAT( + loopback_network_allowlist, + testing::UnorderedElementsAre(loopback_network_only_origin.Serialize(), + iwa_origin.Serialize())); +} + } // namespace web_app
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_throttle.cc b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_throttle.cc index dd81c80..7478dfb 100644 --- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_throttle.cc +++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_throttle.cc
@@ -8,6 +8,8 @@ #include "base/check_deref.h" #include "base/functional/bind.h" #include "base/memory/weak_ptr.h" +#include "base/strings/strcat.h" +#include "base/strings/utf_string_conversions.h" #include "base/task/sequenced_task_runner.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/web_applications/isolated_web_apps/install/non_installed_bundle_inspection_context.h" @@ -18,6 +20,7 @@ #include "chrome/browser/web_applications/web_app_provider.h" #include "components/webapps/isolated_web_apps/types/iwa_origin.h" #include "components/webapps/isolated_web_apps/url_loading/url_loader_factory.h" +#include "content/public/browser/console_message.h" #include "content/public/browser/isolated_web_apps_policy.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/navigation_handle_user_data.h" @@ -34,44 +37,41 @@ namespace { -// The purpose of this is to defer logging violations to after the navigation +// The purpose of this is to defer logging to after the navigation // (so that post-navigation console cleaning won't hide the message). -class DeferredEntitlementViolationLogger - : public content::NavigationHandleUserData< - DeferredEntitlementViolationLogger>, + +class DeferredConsoleLogger + : public content::NavigationHandleUserData<DeferredConsoleLogger>, public content::WebContentsObserver { public: - ~DeferredEntitlementViolationLogger() override = default; + ~DeferredConsoleLogger() override = default; void DidFinishNavigation(content::NavigationHandle* handle) override { if (GetForNavigationHandle(*handle) != this) { return; } if (handle->HasCommitted() && !handle->IsErrorPage()) { - for (const auto& feature : violations_) { + for (const auto& message : messages_) { handle->GetRenderFrameHost()->AddMessageToConsole( - blink::mojom::ConsoleMessageLevel::kWarning, - "IWA entitlement violation: feature '" + feature + - "' is not granted to " + handle->GetURL().spec() + "."); + message.message_level, base::UTF16ToUTF8(message.message)); } } } private: - friend class content::NavigationHandleUserData< - DeferredEntitlementViolationLogger>; + friend class content::NavigationHandleUserData<DeferredConsoleLogger>; - DeferredEntitlementViolationLogger(content::NavigationHandle& handle, - std::vector<std::string> violations) + DeferredConsoleLogger(content::NavigationHandle& handle, + std::vector<content::ConsoleMessage> messages) : content::WebContentsObserver(handle.GetWebContents()), - violations_(std::move(violations)) {} + messages_(std::move(messages)) {} - const std::vector<std::string> violations_; + const std::vector<content::ConsoleMessage> messages_; NAVIGATION_HANDLE_USER_DATA_KEY_DECL(); }; -NAVIGATION_HANDLE_USER_DATA_KEY_IMPL(DeferredEntitlementViolationLogger); +NAVIGATION_HANDLE_USER_DATA_KEY_IMPL(DeferredConsoleLogger); } // namespace @@ -133,7 +133,7 @@ IsolatedWebAppThrottle::WillProcessResponse() { const auto iwa_origin = IwaOrigin::Create(navigation_handle()->GetURL()); if (iwa_origin.has_value()) { - LogEntitlementViolations(*iwa_origin); + LogWarnings(*iwa_origin); } return PROCEED; } @@ -168,17 +168,21 @@ iwa_origin); } -void IsolatedWebAppThrottle::LogEntitlementViolations( - const IwaOrigin& iwa_origin) { - std::vector<std::string> violations = - IwaPermissionsPolicyCacheFactory::GetForProfile(profile())->GetViolations( - iwa_origin); - if (violations.empty() || !navigation_handle()->IsInPrimaryMainFrame()) { +void IsolatedWebAppThrottle::LogWarnings(const IwaOrigin& iwa_origin) { + if (!navigation_handle()->IsInPrimaryMainFrame()) { return; } - DeferredEntitlementViolationLogger::CreateForNavigationHandle( - *navigation_handle(), std::move(violations)); + std::vector<content::ConsoleMessage> warning_messages = + IwaPermissionsPolicyCacheFactory::GetForProfile(profile()) + ->GetWarningMessages(iwa_origin); + + if (warning_messages.empty()) { + return; + } + + DeferredConsoleLogger::CreateForNavigationHandle(*navigation_handle(), + std::move(warning_messages)); } void IsolatedWebAppThrottle::OnCachePopulated(bool success) {
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_throttle.h b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_throttle.h index 37bdde5fe..b16c5181 100644 --- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_throttle.h +++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_throttle.h
@@ -49,7 +49,7 @@ bool NeedsManifestFetch(const IwaOrigin& iwa_origin) const; void OnCachePopulated(bool success); - void LogEntitlementViolations(const IwaOrigin& iwa_origin); + void LogWarnings(const IwaOrigin& iwa_origin); Profile* profile() const; bool is_isolated_web_app_navigation() const;
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_throttle_unittest.cc b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_throttle_unittest.cc index 5a931f7..cf49ea5 100644 --- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_throttle_unittest.cc +++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_throttle_unittest.cc
@@ -104,7 +104,7 @@ throttle->WillStartRequest().action()); // If manifest is already cached, it should PROCEED. - GetCache()->SetPolicy(IwaOrigin::Create(GURL(kIsolatedAppOrigin)).value(), + GetCache()->SetPolicy(IwaOrigin::Create(GURL(kIsolatedAppOrigin)).value(), {}, {}); auto throttle2 = std::make_unique<MockIsolatedWebAppThrottle>(test_registry); EXPECT_EQ(content::NavigationThrottle::PROCEED,
diff --git a/chrome/browser/web_applications/isolated_web_apps/iwa_permissions_policy_cache.cc b/chrome/browser/web_applications/isolated_web_apps/iwa_permissions_policy_cache.cc index 0192879e..aa691310 100644 --- a/chrome/browser/web_applications/isolated_web_apps/iwa_permissions_policy_cache.cc +++ b/chrome/browser/web_applications/isolated_web_apps/iwa_permissions_policy_cache.cc
@@ -11,6 +11,7 @@ #include "base/functional/callback_helpers.h" #include "base/json/json_reader.h" #include "base/strings/string_util.h" +#include "base/strings/utf_string_conversions.h" #include "base/task/sequenced_task_runner.h" #include "base/types/expected_macros.h" #include "base/values.h" @@ -35,6 +36,7 @@ #include "services/network/public/cpp/resource_request.h" #include "services/network/public/cpp/simple_url_loader.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" +#include "third_party/blink/public/common/permissions_policy/policy_helper_public.h" namespace web_app { @@ -55,10 +57,12 @@ IwaPermissionsPolicyCache::Policy::Policy( const std::vector<Entry>& unfiltered, const std::vector<Entry>& filtered, - std::optional<IwaVersion> app_version_for_filtering) + std::optional<IwaVersion> app_version_for_filtering, + std::vector<std::string> deprecation_warnings) : unfiltered(unfiltered), filtered(filtered), - app_version_for_filtering(std::move(app_version_for_filtering)) {} + app_version_for_filtering(std::move(app_version_for_filtering)), + deprecation_warnings(std::move(deprecation_warnings)) {} IwaPermissionsPolicyCache::Policy::Policy(const Policy&) = default; IwaPermissionsPolicyCache::Policy::Policy(Policy&&) = default; IwaPermissionsPolicyCache::Policy& IwaPermissionsPolicyCache::Policy::operator=( @@ -101,8 +105,46 @@ } )"); +std::string GetPermissionsPolicyFeatureName( + network::mojom::PermissionsPolicyFeature feature) { + const auto& map = blink::GetPermissionsPolicyFeatureToNameMap(); + auto it = map.find(feature); + return it != map.end() ? std::string(it->second) : std::string(); +} + +std::optional<std::vector<std::string>> GetAllowedOrigins( + const IwaPermissionsPolicyCache::CacheEntry& manifest, + network::mojom::PermissionsPolicyFeature feature) { + auto it = std::ranges::find_if(manifest, [&](const auto& entry) { + return entry.feature == GetPermissionsPolicyFeatureName(feature); + }); + + if (it == manifest.end()) { + return std::nullopt; + } + + return it->allowed_origins; +} + +void AddDirectSocketsPrivatePermissionPolicyWarningMessage( + std::vector<std::string>& deprecation_warnings, + network::mojom::PermissionsPolicyFeature feature) { + std::string feature_name = GetPermissionsPolicyFeatureName(feature); + + deprecation_warnings.emplace_back(base::StrCat( + {"The 'permissions_policy' field in the manifest includes " + "'direct-sockets-private' but is missing the required '", + feature_name, "' policy. While Chrome is automatically including '", + feature_name, + "' to maintain backward compatibility, this behavior is deprecated and " + "will be removed in Chrome 151. Please update your manifest to include " + "'", + feature_name, "' explicitly."})); +} + std::optional<IwaPermissionsPolicyCache::CacheEntry> ParseManifest( - const std::string& manifest_content) { + const std::string& manifest_content, + std::vector<std::string>& deprecation_warnings) { // Yes, this parses untrusted data in the browser process. But it's Rust JSON // parser so it's alright. std::optional<base::Value> json_value = @@ -162,6 +204,40 @@ } permissions_policy.emplace_back(key, std::move(allowed_origins)); } + + // TODO(b/492476083): Remove backward compatibility code by Chrome Milestone + // 151. Now "direct-sockets-private" requires "loopback-network" and + // "local-network" to function. So "direct-sockets-private" is temporarily + // unpacked to "local-network" and "loopback-network" for backwards + // compatibility to existing apps. A DevTools warning is shown in the console. + // This behavior will be removed in Chrome Milestone 151. + auto direct_sockets_private_origins = GetAllowedOrigins( + permissions_policy, + network::mojom::PermissionsPolicyFeature::kDirectSocketsPrivate); + if (direct_sockets_private_origins) { + if (!GetAllowedOrigins( + permissions_policy, + network::mojom::PermissionsPolicyFeature::kLocalNetwork)) { + permissions_policy.emplace_back( + std::string(GetPermissionsPolicyFeatureName( + network::mojom::PermissionsPolicyFeature::kLocalNetwork)), + *direct_sockets_private_origins); + AddDirectSocketsPrivatePermissionPolicyWarningMessage( + deprecation_warnings, + network::mojom::PermissionsPolicyFeature::kLocalNetwork); + } + if (!GetAllowedOrigins( + permissions_policy, + network::mojom::PermissionsPolicyFeature::kLoopbackNetwork)) { + permissions_policy.emplace_back( + std::string(GetPermissionsPolicyFeatureName( + network::mojom::PermissionsPolicyFeature::kLoopbackNetwork)), + *direct_sockets_private_origins); + AddDirectSocketsPrivatePermissionPolicyWarningMessage( + deprecation_warnings, + network::mojom::PermissionsPolicyFeature::kLoopbackNetwork); + } + } return permissions_policy; } @@ -276,7 +352,8 @@ return policy ? &policy->filtered : nullptr; } -std::vector<std::string> IwaPermissionsPolicyCache::GetViolations( +std::vector<content::ConsoleMessage> +IwaPermissionsPolicyCache::GetViolationWarningMessages( const IwaOrigin& iwa_origin) const { const Policy* policy = base::FindOrNull(cache_, iwa_origin); if (!policy) { @@ -285,13 +362,64 @@ const auto filtered_set = base::MakeFlatSet<std::string>( policy->filtered, std::less(), [](const auto& entry) { return entry.feature; }); - std::vector<std::string> violations; + + const GURL& url = iwa_origin.origin().GetURL(); + std::u16string url_spec = base::UTF8ToUTF16(url.spec()); + + std::vector<content::ConsoleMessage> messages; for (const auto& entry : policy->unfiltered) { if (!filtered_set.contains(entry.feature)) { - violations.push_back(entry.feature); + std::u16string message_text = + base::StrCat({u"IWA entitlement violation: feature '", + base::UTF8ToUTF16(entry.feature), + u"' is not granted to ", url_spec, u"."}); + + messages.emplace_back(blink::mojom::ConsoleMessageSource::kViolation, + blink::mojom::ConsoleMessageLevel::kWarning, + message_text, + /*line_number=*/0, url); } } - return violations; + + return messages; +} + +std::vector<content::ConsoleMessage> +IwaPermissionsPolicyCache::GetDeprecationWarningMessages( + const IwaOrigin& iwa_origin) const { + const Policy* policy = base::FindOrNull(cache_, iwa_origin); + if (!policy || policy->deprecation_warnings.empty()) { + return {}; + } + + const GURL& url = iwa_origin.origin().GetURL(); + std::vector<content::ConsoleMessage> messages; + messages.reserve(policy->deprecation_warnings.size()); + + for (const std::string& warning : policy->deprecation_warnings) { + messages.emplace_back(blink::mojom::ConsoleMessageSource::kDeprecation, + blink::mojom::ConsoleMessageLevel::kWarning, + base::UTF8ToUTF16(warning), + /*line_number=*/0, url); + } + + return messages; +} + +std::vector<content::ConsoleMessage> +IwaPermissionsPolicyCache::GetWarningMessages( + const IwaOrigin& iwa_origin) const { + std::vector<content::ConsoleMessage> messages = + GetDeprecationWarningMessages(iwa_origin); + std::vector<content::ConsoleMessage> violation_messages = + GetViolationWarningMessages(iwa_origin); + + messages.reserve(messages.size() + violation_messages.size()); + + std::move(violation_messages.begin(), violation_messages.end(), + std::back_inserter(messages)); + + return messages; } void IwaPermissionsPolicyCache::ObtainManifestAndCache( @@ -374,22 +502,27 @@ ParseManifestAndSetPolicy(iwa_origin, *manifest_content)); } -void IwaPermissionsPolicyCache::SetPolicy(const IwaOrigin& iwa_origin, - CacheEntry unfiltered_policy) { +void IwaPermissionsPolicyCache::SetPolicy( + const IwaOrigin& iwa_origin, + CacheEntry unfiltered_policy, + std::vector<std::string> deprecation_warnings) { UpdateFilteredPolicy( - iwa_origin, - cache_[iwa_origin] = Policy{/*unfiltered=*/unfiltered_policy, - /*filtered=*/std::move(unfiltered_policy)}); + iwa_origin, cache_[iwa_origin] = + Policy{/*unfiltered=*/unfiltered_policy, + /*filtered=*/std::move(unfiltered_policy), + std::nullopt, std::move(deprecation_warnings)}); } bool IwaPermissionsPolicyCache::ParseManifestAndSetPolicy( const IwaOrigin& iwa_origin, const std::string& manifest_content) { - std::optional<CacheEntry> policy = ParseManifest(manifest_content); + std::vector<std::string> deprecation_warnings; + std::optional<CacheEntry> policy = + ParseManifest(manifest_content, deprecation_warnings); if (!policy) { return false; } - SetPolicy(iwa_origin, std::move(*policy)); + SetPolicy(iwa_origin, std::move(*policy), std::move(deprecation_warnings)); return true; }
diff --git a/chrome/browser/web_applications/isolated_web_apps/iwa_permissions_policy_cache.h b/chrome/browser/web_applications/isolated_web_apps/iwa_permissions_policy_cache.h index 77bb8c9..25af941 100644 --- a/chrome/browser/web_applications/isolated_web_apps/iwa_permissions_policy_cache.h +++ b/chrome/browser/web_applications/isolated_web_apps/iwa_permissions_policy_cache.h
@@ -17,6 +17,7 @@ #include "components/webapps/isolated_web_apps/service/isolated_web_app_browser_context_service_factory.h" #include "components/webapps/isolated_web_apps/types/iwa_origin.h" #include "components/webapps/isolated_web_apps/types/iwa_version.h" +#include "content/public/browser/console_message.h" #include "mojo/public/cpp/bindings/remote.h" class Profile; @@ -59,7 +60,8 @@ explicit Policy( const std::vector<Entry>& unfiltered = {}, const std::vector<Entry>& filtered = {}, - std::optional<IwaVersion> app_version_for_filtering = std::nullopt); + std::optional<IwaVersion> app_version_for_filtering = std::nullopt, + std::vector<std::string> deprecation_warnings = {}); Policy(const Policy&); Policy(Policy&&); Policy& operator=(const Policy&); @@ -68,6 +70,7 @@ std::vector<Entry> unfiltered; std::vector<Entry> filtered; std::optional<IwaVersion> app_version_for_filtering; + std::vector<std::string> deprecation_warnings; }; explicit IwaPermissionsPolicyCache(WebAppProvider& provider); @@ -79,9 +82,8 @@ // Returns nullptr if not found or not yet cached. const CacheEntry* GetPolicy(const IwaOrigin& iwa_origin) const; - // Returns a list of features that were present in the unfiltered policy - // but removed due to entitlement violations. - std::vector<std::string> GetViolations(const IwaOrigin& iwa_origin) const; + std::vector<content::ConsoleMessage> GetWarningMessages( + const IwaOrigin& iwa_origin) const; // Retrieves IWA manifest, parses it and stores in cache. // Callback is queued to run immediately if the cache is already populated. @@ -95,8 +97,18 @@ CacheEntry filtered_policy); private: + // Returns a list of features that were present in the unfiltered policy + // but removed due to entitlement violations. + std::vector<content::ConsoleMessage> GetViolationWarningMessages( + const IwaOrigin& iwa_origin) const; + + std::vector<content::ConsoleMessage> GetDeprecationWarningMessages( + const IwaOrigin& iwa_origin) const; + // Stores the policy for the given IWA origin and runs pending callbacks. - void SetPolicy(const IwaOrigin& iwa_origin, CacheEntry policy); + void SetPolicy(const IwaOrigin& iwa_origin, + CacheEntry policy, + std::vector<std::string> deprecation_warnings); // Parses the manifest and stores the policy for the given IWA origin. // Returns true if the manifest was parsed successfully (even if the policy
diff --git a/chrome/browser/web_applications/isolated_web_apps/iwa_permissions_policy_cache_browsertest.cc b/chrome/browser/web_applications/isolated_web_apps/iwa_permissions_policy_cache_browsertest.cc index 82b8de3..e37e341 100644 --- a/chrome/browser/web_applications/isolated_web_apps/iwa_permissions_policy_cache_browsertest.cc +++ b/chrome/browser/web_applications/isolated_web_apps/iwa_permissions_policy_cache_browsertest.cc
@@ -94,7 +94,7 @@ IwaPermissionsPolicyCache::Entry("camera", {})}; const IwaOrigin iwa_origin = IwaOrigin::Create(url_info.origin().GetURL()).value(); - cache->SetPolicy(iwa_origin, policy); + cache->SetPolicy(iwa_origin, policy, {}); ASSERT_TRUE(cache->GetPolicy(iwa_origin)); @@ -119,7 +119,7 @@ IwaPermissionsPolicyCache::Entry("camera", {})}; const IwaOrigin iwa_origin = IwaOrigin::Create(url_info.origin().GetURL()).value(); - cache->SetPolicy(iwa_origin, policy); + cache->SetPolicy(iwa_origin, policy, {}); ASSERT_TRUE(cache->GetPolicy(iwa_origin)); @@ -150,7 +150,7 @@ IwaOrigin::Create(url_info.origin().GetURL()).value(); // Set fake policy not in line with the manifest (by default, manifest // contains also cross-origin-isolated policy). - cache->SetPolicy(iwa_origin, {}); + cache->SetPolicy(iwa_origin, {}, {}); ASSERT_TRUE(cache->GetPolicy(iwa_origin));
diff --git a/chrome/browser/web_applications/manifest_update_manager.cc b/chrome/browser/web_applications/manifest_update_manager.cc index 555efa38..1494eb6 100644 --- a/chrome/browser/web_applications/manifest_update_manager.cc +++ b/chrome/browser/web_applications/manifest_update_manager.cc
@@ -272,7 +272,7 @@ if (manifest->migrate_to && provider_->registrar_unsafe().AppMatches( GenerateAppIdFromManifest(*manifest), - WebAppFilter::IsAppValidMigrationSource())) { + WebAppFilter::CanAppInstallTargetMigrationApp())) { provider_->scheduler().ScheduleInstallMigrateToApp( manifest->id, manifest->migrate_to->id, manifest->migrate_to->install_url, base::DoNothing());
diff --git a/chrome/browser/web_applications/web_app_database.cc b/chrome/browser/web_applications/web_app_database.cc index 3301dc6a..753653b2 100644 --- a/chrome/browser/web_applications/web_app_database.cc +++ b/chrome/browser/web_applications/web_app_database.cc
@@ -118,12 +118,10 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); CHECK(opened_); - std::unique_ptr<syncer::DataTypeStore::WriteBatch> write_batch = - store_->CreateWriteBatch(); - // |update_data| can be empty here but we should write |metadata_change_list| // anyway. - write_batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); + std::unique_ptr<syncer::DataTypeStore::WriteBatch> write_batch = + store_->CreateWriteBatch(std::move(metadata_change_list)); for (const std::unique_ptr<WebApp>& web_app : update_data.apps_to_create) { auto proto = WebAppToProto(*web_app);
diff --git a/chrome/browser/web_applications/web_app_filter.cc b/chrome/browser/web_applications/web_app_filter.cc index 25e8fa0..dc87af4 100644 --- a/chrome/browser/web_applications/web_app_filter.cc +++ b/chrome/browser/web_applications/web_app_filter.cc
@@ -125,6 +125,12 @@ } // static +WebAppFilter WebAppFilter::CanAppInstallTargetMigrationApp() { + return InstallStateIs(proto::InstallState::INSTALLED_WITH_OS_INTEGRATION) & + !IsIsolatedApp(); +} + +// static WebAppFilter WebAppFilter::IsAppValidMigrationSource() { return InstallStateIs(proto::InstallState::INSTALLED_WITH_OS_INTEGRATION) & !HasSource(WebAppManagement::Type::kPolicy) & !IsIsolatedApp();
diff --git a/chrome/browser/web_applications/web_app_filter.h b/chrome/browser/web_applications/web_app_filter.h index ca8b413..4a4eccd 100644 --- a/chrome/browser/web_applications/web_app_filter.h +++ b/chrome/browser/web_applications/web_app_filter.h
@@ -86,6 +86,12 @@ // migration are not included here. static WebAppFilter IsAppSurfaceableToUser(); + // Only consider web apps that can store pending migration metadata to + // identify if it should be migrated to a different app or not. This can + // usually include all apps installed with OS integration, just not + // isolated ones. + static WebAppFilter CanAppInstallTargetMigrationApp(); + // Only consider web apps that are valid sources to be migrated to a different // app. This mainly includes apps that have valid OS integration and are not // installed by policy.
diff --git a/chrome/browser/webapps/installable/installed_webapp_geolocation_bridge.cc b/chrome/browser/webapps/installable/installed_webapp_geolocation_bridge.cc index aca3c95..6d9bf174 100644 --- a/chrome/browser/webapps/installable/installed_webapp_geolocation_bridge.cc +++ b/chrome/browser/webapps/installable/installed_webapp_geolocation_bridge.cc
@@ -38,7 +38,7 @@ void InstalledWebappGeolocationBridge::StartListeningForUpdates() { JNIEnv* env = base::android::AttachCurrentThread(); if (java_ref_.is_null()) { - java_ref_.Reset(JInstalledWebappGeolocationBridgeJni::create( + java_ref_.Reset(InstalledWebappGeolocationBridgeJni::create( env, reinterpret_cast<intptr_t>(this), url::GURLAndroid::FromNativeGURL(env, url_))); }
diff --git a/chrome/browser/webauthn/enclave_authenticator_browsertest.cc b/chrome/browser/webauthn/enclave_authenticator_browsertest.cc index cce1923..7cd7e00 100644 --- a/chrome/browser/webauthn/enclave_authenticator_browsertest.cc +++ b/chrome/browser/webauthn/enclave_authenticator_browsertest.cc
@@ -1157,7 +1157,7 @@ // Disable user verification support. This can happen e.g. if the user // disables Windows Hello or Touch ID. - DisableUVKeySupport(); + OverrideUVKeyAvailability(false); // Try to make a new credential. The UI should go to the onboarding screen to // avoid surprising the user with a gaia prompt. @@ -1233,7 +1233,7 @@ // Disable user verification support. This can happen e.g. if the user // disables Windows Hello or Touch ID. - DisableUVKeySupport(); + OverrideUVKeyAvailability(false); // Try to get an assertion with the credential. The UI should go to the // onboarding screen to avoid surprising the user with a gaia prompt. @@ -1318,7 +1318,7 @@ // Disable user verification support. This can happen e.g. if the user // disables Windows Hello or Touch ID. - DisableUVKeySupport(); + OverrideUVKeyAvailability(false); // Simulate adding a PIN from another device. AuthenticationFactorsResult registration_state_result;
diff --git a/chrome/browser/webauthn/enclave_authenticator_browsertest_base.cc b/chrome/browser/webauthn/enclave_authenticator_browsertest_base.cc index 34023ba..4452137 100644 --- a/chrome/browser/webauthn/enclave_authenticator_browsertest_base.cc +++ b/chrome/browser/webauthn/enclave_authenticator_browsertest_base.cc
@@ -228,8 +228,13 @@ fake_hardware_backing); } -void EnclaveAuthenticatorTestBase::DisableUVKeySupport() { - fake_uv_provider_.emplace<crypto::ScopedNullUserVerifyingKeyProvider>(); +void EnclaveAuthenticatorTestBase::OverrideUVKeyAvailability(bool available) { + uvkey_override_ = + std::make_unique<crypto::ScopedUserVerifyingKeysSupportedOverride>( + base::BindLambdaForTesting( + [&](crypto::UserVerifyingKeysSupportedCallback uv_callback) { + std::move(uv_callback).Run(available); + })); } bool EnclaveAuthenticatorTestBase::IsUVPAA() {
diff --git a/chrome/browser/webauthn/enclave_authenticator_browsertest_base.h b/chrome/browser/webauthn/enclave_authenticator_browsertest_base.h index 06239e3..2cf0781 100644 --- a/chrome/browser/webauthn/enclave_authenticator_browsertest_base.h +++ b/chrome/browser/webauthn/enclave_authenticator_browsertest_base.h
@@ -92,8 +92,15 @@ webauthn::PasskeyModel& passkey_model(); EnclaveManager& enclave_manager(); + // This makes it so that a UV key provider is returned (i.e. non-null), + // simulating that the platform supports user-verifying keys. By default, UV + // key availability is true. void EnableUVKeySupport(bool fake_hardware_backing = false); - void DisableUVKeySupport(); + + // This lets clients override UV key availability after UV key support is + // enabled with `EnableUVKeySupport`. On some platforms (e.g. Windows), UV + // keys may be supported but not available. + void OverrideUVKeyAvailability(bool available); bool IsUVPAA(); void SetBiometricsEnabled(bool enabled); void AddTestPasskeyToModel(); @@ -144,6 +151,8 @@ #endif std::unique_ptr<FakeRecoveryKeyStore> recovery_key_store_; std::unique_ptr<WebAuthnScopedFakeUnexportableKeyProvider> fake_hw_provider_; + std::unique_ptr<crypto::ScopedUserVerifyingKeysSupportedOverride> + uvkey_override_; network::TestURLLoaderFactory url_loader_factory_; std::unique_ptr<device::BluetoothAdapterFactory::GlobalOverrideValues> bluetooth_values_for_testing_;
diff --git a/chrome/browser/webauthn/enclave_manager.cc b/chrome/browser/webauthn/enclave_manager.cc index 23275e90..162b1f3 100644 --- a/chrome/browser/webauthn/enclave_manager.cc +++ b/chrome/browser/webauthn/enclave_manager.cc
@@ -3766,14 +3766,13 @@ } EnclaveManager::UvKeyState EnclaveManager::uv_key_state( - bool platform_has_biometrics) const { + PlatformUvSupport platform_uv_support) const { CHECK(IsReady()); if (base::FeatureList::IsEnabled( device::kWebAuthnCreatePinWhenSystemUvDisabled)) { - UVKeyOptions uv_key_options; - if (!GetUserVerifyingKeyProviderForSigning(std::move(uv_key_options))) { - // Cannot use any UV keys if the provider is not available. + if (platform_uv_support == PlatformUvSupport::kNoUvKey) { + // Cannot use any UV keys if there is no UV key support. return UvKeyState::kNone; } } @@ -3787,7 +3786,7 @@ return UvKeyState::kNone; } #if BUILDFLAG(IS_MAC) - if (platform_has_biometrics) { + if (platform_uv_support == PlatformUvSupport::kUvKeyWithBiometrics) { // Chrome will display an LAAuthenticationView with a Touch ID prompt. return UvKeyState::kUsesChromeUI; }
diff --git a/chrome/browser/webauthn/enclave_manager.h b/chrome/browser/webauthn/enclave_manager.h index ec63ae0d..2a43930 100644 --- a/chrome/browser/webauthn/enclave_manager.h +++ b/chrome/browser/webauthn/enclave_manager.h
@@ -339,7 +339,20 @@ // biometrics. kUsesChromeUI, }; - UvKeyState uv_key_state(bool platform_has_biometrics) const; + // PlatformUvSupport enumerates the kind of user verifying key support + // available on this device. + enum class PlatformUvSupport { + // User verifying keys are not supported. + kNoUvKey, + + // User verifying keys are supported, but biometrics are not available. + kUvKeyButNoBiometrics, + + // User verifying keys are supported with biometrics. + kUvKeyWithBiometrics, + }; + + UvKeyState uv_key_state(PlatformUvSupport platform_uv_support) const; std::unique_ptr<trusted_vault::TrustedVaultConnection::Request> CheckGpmPinAvailability(GpmPinAvailabilityCallback callback) override;
diff --git a/chrome/browser/webauthn/enclave_manager_unittest.cc b/chrome/browser/webauthn/enclave_manager_unittest.cc index d4a92cc..59e00f9 100644 --- a/chrome/browser/webauthn/enclave_manager_unittest.cc +++ b/chrome/browser/webauthn/enclave_manager_unittest.cc
@@ -2069,7 +2069,8 @@ #if BUILDFLAG(IS_WIN) // Windows does deferred UV key creation. This test has to trigger the actual // create before testing that it is later deleted. - EXPECT_EQ(manager_.uv_key_state(/*platform_has_biometrics=*/false), + EXPECT_EQ(manager_.uv_key_state( + EnclaveManager::PlatformUvSupport::kUvKeyButNoBiometrics), EnclaveManager::UvKeyState::kUsesSystemUIDeferredCreation); std::unique_ptr<EnclaveManager::UvKeyCreationLock> uv_creation_lock; device::enclave::UVKeyCreationCallback key_creation_callback; @@ -2648,10 +2649,12 @@ EXPECT_TRUE(add_future.Wait()); #if BUILDFLAG(IS_WIN) - EXPECT_EQ(manager_.uv_key_state(/*platform_has_biometrics=*/false), + EXPECT_EQ(manager_.uv_key_state( + EnclaveManager::PlatformUvSupport::kUvKeyButNoBiometrics), EnclaveManager::UvKeyState::kUsesSystemUIDeferredCreation); #else - EXPECT_EQ(manager_.uv_key_state(/*platform_has_biometrics=*/false), + EXPECT_EQ(manager_.uv_key_state( + EnclaveManager::PlatformUvSupport::kUvKeyButNoBiometrics), EnclaveManager::UvKeyState::kUsesSystemUI); #endif } @@ -2681,7 +2684,7 @@ ASSERT_FALSE(manager_.is_idle()); EXPECT_TRUE(add_future.Wait()); ASSERT_TRUE(manager_.IsRegistered()); - EXPECT_EQ(manager_.uv_key_state(/*platform_has_biometrics=*/false), + EXPECT_EQ(manager_.uv_key_state(EnclaveManager::PlatformUvSupport::kNoUvKey), EnclaveManager::UvKeyState::kNone); } @@ -2713,7 +2716,8 @@ #if BUILDFLAG(IS_WIN) // Windows does deferred UV key creation. This test has to trigger the actual // create before testing that it is later deleted. - EXPECT_EQ(manager_.uv_key_state(/*platform_has_biometrics=*/false), + EXPECT_EQ(manager_.uv_key_state( + EnclaveManager::PlatformUvSupport::kUvKeyButNoBiometrics), EnclaveManager::UvKeyState::kUsesSystemUIDeferredCreation); std::unique_ptr<EnclaveManager::UvKeyCreationLock> uv_creation_lock; device::enclave::UVKeyCreationCallback key_creation_callback; @@ -2728,7 +2732,8 @@ })); task_env_.RunUntilQuit(); #else - ASSERT_EQ(manager_.uv_key_state(/*platform_has_biometrics=*/false), + ASSERT_EQ(manager_.uv_key_state( + EnclaveManager::PlatformUvSupport::kUvKeyButNoBiometrics), EnclaveManager::UvKeyState::kUsesSystemUI); #endif manager_.ClearCachedKeysForTesting(); @@ -2793,7 +2798,8 @@ ASSERT_FALSE(manager_.is_idle()); EXPECT_TRUE(add_future.Wait()); - ASSERT_EQ(manager_.uv_key_state(/*platform_has_biometrics=*/false), + ASSERT_EQ(manager_.uv_key_state( + EnclaveManager::PlatformUvSupport::kUvKeyButNoBiometrics), EnclaveManager::UvKeyState::kUsesSystemUI); } @@ -3038,12 +3044,14 @@ scoped_fake_keychain_.SetUVMethod( crypto::apple::ScopedFakeKeychainV2::UVMethod::kBiometrics); - EXPECT_EQ(manager_.uv_key_state(/*platform_has_biometrics=*/true), + EXPECT_EQ(manager_.uv_key_state( + EnclaveManager::PlatformUvSupport::kUvKeyWithBiometrics), EnclaveManager::UvKeyState::kUsesChromeUI); scoped_fake_keychain_.SetUVMethod( crypto::apple::ScopedFakeKeychainV2::UVMethod::kPasswordOnly); - EXPECT_EQ(manager_.uv_key_state(/*platform_has_biometrics=*/false), + EXPECT_EQ(manager_.uv_key_state( + EnclaveManager::PlatformUvSupport::kUvKeyButNoBiometrics), EnclaveManager::UvKeyState::kUsesSystemUI); } #endif // BUILDFLAG(IS_MAC) @@ -3073,7 +3081,8 @@ ASSERT_FALSE(manager_.is_idle()); EXPECT_TRUE(add_future.Wait()); - EXPECT_EQ(manager_.uv_key_state(/*platform_has_biometrics=*/false), + EXPECT_EQ(manager_.uv_key_state( + EnclaveManager::PlatformUvSupport::kUvKeyButNoBiometrics), EnclaveManager::UvKeyState::kUsesSystemUIDeferredCreation); const auto& user_state = manager_.local_state_for_testing() .users() @@ -3124,7 +3133,8 @@ ASSERT_FALSE(manager_.is_idle()); EXPECT_TRUE(add_future.Wait()); - EXPECT_EQ(manager_.uv_key_state(/*platform_has_biometrics=*/false), + EXPECT_EQ(manager_.uv_key_state( + EnclaveManager::PlatformUvSupport::kUvKeyButNoBiometrics), EnclaveManager::UvKeyState::kUsesSystemUIDeferredCreation); const auto& user_state = manager_.local_state_for_testing() .users() @@ -3194,7 +3204,8 @@ base::RepeatingClosure quit_closure; - EXPECT_EQ(manager_.uv_key_state(/*platform_has_biometrics=*/false), + EXPECT_EQ(manager_.uv_key_state( + EnclaveManager::PlatformUvSupport::kUvKeyButNoBiometrics), EnclaveManager::UvKeyState::kUsesSystemUIDeferredCreation); // Generate a UV key and reset the deferred UV key flag, without sending a
diff --git a/chrome/browser/webauthn/gpm_enclave_controller.cc b/chrome/browser/webauthn/gpm_enclave_controller.cc index 9846a4bb..56b72558 100644 --- a/chrome/browser/webauthn/gpm_enclave_controller.cc +++ b/chrome/browser/webauthn/gpm_enclave_controller.cc
@@ -27,6 +27,7 @@ #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "base/task/sequenced_task_runner.h" +#include "base/task/single_thread_task_runner.h" #include "base/time/default_tick_clock.h" #include "base/time/tick_clock.h" #include "base/time/time.h" @@ -445,6 +446,29 @@ return; } SetActive(EnclaveEnabledStatus::kEnabled); + FIDO_LOG(EVENT) << "Checking for UV key capability"; + base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, + base::BindOnce(&EnclaveManager::AreUserVerifyingKeysSupported, + base::BindOnce(&GPMEnclaveController::OnUVCapabilityKnown, + weak_ptr_factory_.GetWeakPtr()))); +} + +GPMEnclaveController::~GPMEnclaveController() { + // Ensure that any secret is dropped from memory after a transaction. + enclave_manager_->TakeSecret(); +} + +void GPMEnclaveController::OnUVCapabilityKnown(bool can_make_uv_keys) { + FIDO_LOG(EVENT) << "UV key capability: " << can_make_uv_keys; + if (!can_make_uv_keys) { + platform_uv_support_ = EnclaveManager::PlatformUvSupport::kNoUvKey; + } else { + platform_uv_support_ = + model_->platform_has_biometrics + ? EnclaveManager::PlatformUvSupport::kUvKeyWithBiometrics + : EnclaveManager::PlatformUvSupport::kUvKeyButNoBiometrics; + } if (enclave_manager_->IsLoaded()) { OnEnclaveLoaded(); } else { @@ -455,22 +479,17 @@ } } -GPMEnclaveController::~GPMEnclaveController() { - // Ensure that any secret is dropped from memory after a transaction. - enclave_manager_->TakeSecret(); -} - std::optional<EnclaveUserVerificationMethod> GPMEnclaveController::GetEnclaveUserVerificationMethod() { - // TODO(crbug.com/393055190): Figure out why `ready_for_ui` is not enough for - // `IsReady`. - if (!enclave_manager_->IsReady()) { + if (!enclave_manager_->IsReady() || !platform_uv_support_.has_value()) { + // We allow the UI to show before the controller had time to load the + // enclave and check for UV availability. In that case, we return nullopt to + // signal that we don't know the enclave user verification method. return std::nullopt; } - bool has_pin = enclave_manager_->has_wrapped_pin(); - EnclaveManager::UvKeyState uv_key_state = enclave_manager_->uv_key_state( - model_->platform_has_biometrics.value_or(false)); + EnclaveManager::UvKeyState uv_key_state = + enclave_manager_->uv_key_state(*platform_uv_support_); return PickEnclaveUserVerificationMethod( user_verification_requirement_, /*have_entered_pin_for_recovery=*/false, @@ -540,7 +559,7 @@ user_verification_requirement_, have_added_device_ && !recovered_with_icloud_keychain_, enclave_manager_->has_wrapped_pin(), - enclave_manager_->uv_key_state(*model_->platform_has_biometrics), + enclave_manager_->uv_key_state(*platform_uv_support_), *model_->platform_has_biometrics, BrowserIsApp()); return *uv_method_; } @@ -608,7 +627,7 @@ user_verification_requirement_, /*have_entered_pin_for_recovery=*/false, enclave_manager_->has_wrapped_pin(), - enclave_manager_->uv_key_state(/*platform_has_biometrics=*/false), + enclave_manager_->uv_key_state(*platform_uv_support_), /*platform_has_biometrics=*/false, BrowserIsApp())) { case EnclaveUserVerificationMethod::kPIN: case EnclaveUserVerificationMethod::kUnsatisfiable: @@ -625,20 +644,6 @@ } } } - - FIDO_LOG(EVENT) << "Checking for UV key capability"; - EnclaveManager::AreUserVerifyingKeysSupported( - base::BindOnce(&GPMEnclaveController::OnUVCapabilityKnown, - weak_ptr_factory_.GetWeakPtr())); -} - -void GPMEnclaveController::OnUVCapabilityKnown(bool can_make_uv_keys) { - FIDO_LOG(EVENT) << "UV key capability: " << can_make_uv_keys; - can_make_uv_keys_ = can_make_uv_keys; - DownloadAccountState(); -} - -void GPMEnclaveController::DownloadAccountState() { FIDO_LOG(EVENT) << "Fetching account state"; auto* rfh = content::RenderFrameHost::FromID(render_frame_host_id_); @@ -788,7 +793,7 @@ store_keys_lock_.reset(); if ((pin_metadata_.has_value() && pin_metadata_->usable_pin_metadata) || - *can_make_uv_keys_) { + *platform_uv_support_ != EnclaveManager::PlatformUvSupport::kNoUvKey) { // No need to create a GPM PIN if the user already has a usable GPM PIN or // can make UV keys. if (!enclave_manager_->AddDeviceToAccount( @@ -942,7 +947,7 @@ user_verification_requirement_, have_added_device_ && !recovered_with_icloud_keychain_, enclave_manager_->has_wrapped_pin(), - enclave_manager_->uv_key_state(*model_->platform_has_biometrics), + enclave_manager_->uv_key_state(*platform_uv_support_), *model_->platform_has_biometrics, BrowserIsApp()); switch (*uv_method_) { case EnclaveUserVerificationMethod::kUVKeyWithSystemUI: @@ -1063,7 +1068,7 @@ user_verification_requirement_, have_added_device_ && !recovered_with_icloud_keychain_, enclave_manager_->has_wrapped_pin(), - enclave_manager_->uv_key_state(*model_->platform_has_biometrics), + enclave_manager_->uv_key_state(*platform_uv_support_), *model_->platform_has_biometrics, BrowserIsApp()); switch (*uv_method_) { @@ -1138,7 +1143,7 @@ user_verification_requirement_, have_added_device_ && !recovered_with_icloud_keychain_, enclave_manager_->has_wrapped_pin(), - enclave_manager_->uv_key_state(*model_->platform_has_biometrics), + enclave_manager_->uv_key_state(*platform_uv_support_), *model_->platform_has_biometrics, BrowserIsApp()); switch (*uv_method_) {
diff --git a/chrome/browser/webauthn/gpm_enclave_controller.h b/chrome/browser/webauthn/gpm_enclave_controller.h index 56fc926..a64d147 100644 --- a/chrome/browser/webauthn/gpm_enclave_controller.h +++ b/chrome/browser/webauthn/gpm_enclave_controller.h
@@ -225,10 +225,6 @@ // disk. void OnEnclaveLoaded(); - // Starts downloading the state of the account from the security domain - // service. - void DownloadAccountState(); - // Called when the account state has finished downloading. void OnAccountStateDownloaded( GaiaId gaia_id, @@ -361,8 +357,9 @@ std::optional<bool> is_active_; - // Whether the system can make UV keys. - std::optional<bool> can_make_uv_keys_; + // The level of support for user verification on this system. Set shortly + // after construction. + std::optional<EnclaveManager::PlatformUvSupport> platform_uv_support_; // have_added_device_ is set to true if the local device was added to the // security domain during this transaction. In this case, the security domain
diff --git a/chrome/browser/window_management/window_management_browsertest.cc b/chrome/browser/window_management/window_management_browsertest.cc index 8365972..d55dab27f 100644 --- a/chrome/browser/window_management/window_management_browsertest.cc +++ b/chrome/browser/window_management/window_management_browsertest.cc
@@ -676,7 +676,6 @@ // See: https://chromestatus.com/feature/5137018030391296 IN_PROC_BROWSER_TEST_F(MAYBE_WindowManagementTest, WindowPlacementAliasFails) { auto* tab = browser()->tab_strip_model()->GetActiveWebContents(); - EXPECT_THAT( - EvalJs(tab, "navigator.permissions.query({name:'window-placement'})"), - content::EvalJsResult::IsError()); + EXPECT_FALSE(content::ExecJs( + tab, "navigator.permissions.query({name:'window-placement'})")); }
diff --git a/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/ListContentManager.java b/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/ListContentManager.java index cd4e0212..86e3a32ea 100644 --- a/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/ListContentManager.java +++ b/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/ListContentManager.java
@@ -76,4 +76,7 @@ /** Removes the observer so it's no longer notified of content changes. */ default void removeObserver(ListContentManagerObserver o) {} + + /** Destroy the ListContentManager and clean up. */ + default void destroy() {} }
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt index f163901..ec866b0e 100644 --- a/chrome/build/android-arm32.pgo.txt +++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@ -chrome-android32-main-1773899655-a04df1787e9dea4538c7e0f89d7b88c7963536b7-f79eb8c0c496682cea5e54a3c038b7f770a97804.profdata +chrome-android32-main-1774007849-ca9fc7ee8c92d14cd23512a99e9b8ab17dc23036-9757b1832eed355545fe964bff4b82eee475a6d8.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index a7d251fb..16cab1e 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1773986079-995104341633aa88be6a83cd48c147aafd6bc166-59d31712cea30e93e355e77cfcc47d84c0f85958.profdata +chrome-linux-main-1774007849-8786b97dd5d2f8d5f6eff55c88095870a55b74a0-9757b1832eed355545fe964bff4b82eee475a6d8.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index d260236..fae1e6c 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1774007849-8a7e6de7900266191b2bf106ad03bcf9a8c135d7-9757b1832eed355545fe964bff4b82eee475a6d8.profdata +chrome-mac-arm-main-1774022366-18b5078d97b4c4625f81499174a5736369a60bce-9c56e34ad6fdabadadb281cff531ee087049a8cf.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 3577cbd..f4e10b4 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1773986079-a97aa1e2bb0762c6366135863a74ab04843aeb41-59d31712cea30e93e355e77cfcc47d84c0f85958.profdata +chrome-mac-main-1774007849-83665924a77b52b2ec3b57208a558c62233ae4cc-9757b1832eed355545fe964bff4b82eee475a6d8.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt index 9c7b862..57000478 100644 --- a/chrome/build/win-arm64.pgo.txt +++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@ -chrome-win-arm64-main-1773986079-248164e2f85a67739e18f6cda44033fa7eff0cd5-59d31712cea30e93e355e77cfcc47d84c0f85958.profdata +chrome-win-arm64-main-1774007849-c5549eddc194549c950e9dfb32ec05b30b1e9417-9757b1832eed355545fe964bff4b82eee475a6d8.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 0ff0919d..77e18cb4 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1773996748-2a5fc1398265c5417ba5149939a90cffbe97b55b-e7592fd2bd0d19576f6ccec31d36a4b92121ae33.profdata +chrome-win32-main-1774018684-e07240c8ea88527d7a49da6cb14fbefe5f2573d3-cc674aa6c925128bd4c217ce9c5f1380a6e5f75b.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index ca285d20..f30ff2a 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1773996748-6b760ab3212da85c7d372f9346f63300f80cf281-e7592fd2bd0d19576f6ccec31d36a4b92121ae33.profdata +chrome-win64-main-1774018684-3add8b01c5e408441c5c6634694bd15435a1a4f8-cc674aa6c925128bd4c217ce9c5f1380a6e5f75b.profdata
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index 0f6b9d2..8acf667 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h
@@ -1514,6 +1514,16 @@ // used for metrics reporting purposes. inline constexpr char kVerticalTabsEnabledFirstTime[] = "vertical_tabs.enabled_first_time"; + +// Boolean representing the most recently used vertical tab strip collapse +// state. Only used during startup when session restore is not used. +inline constexpr char kVerticalTabsCollapsedState[] = + "vertical_tabs.collapsed_state"; + +// Integer representing the most recently used vertical tab strip uncollapsed +// width. Only used during startup when session restore is not used. +inline constexpr char kVerticalTabsUncollapsedWidth[] = + "vertical_tabs.uncollapsed_width"; #endif // !BUILDFLAG(IS_ANDROID) #if BUILDFLAG(ENABLE_COMPOSE) @@ -1582,6 +1592,10 @@ // *************** LOCAL STATE *************** // These are attached to the machine/installation +// A time pref storing the last time an audio input stream was created. +inline constexpr char kAudioInputStreamLastTimeCreated[] = + "media.audio_input_stream_last_time_created"; + // Used to store the value of the SerialAllowAllPortsForUrls policy. inline constexpr char kManagedSerialAllowAllPortsForUrls[] = "managed.serial_allow_all_ports_for_urls";
diff --git a/chrome/installer/linux/BUILD.gn b/chrome/installer/linux/BUILD.gn index 20ab87d..737ea72 100644 --- a/chrome/installer/linux/BUILD.gn +++ b/chrome/installer/linux/BUILD.gn
@@ -71,8 +71,6 @@ # (e.g. all locales, resources, etc.) packaging_files = packaging_files_binaries + [ "common/installer.py", - "$root_out_dir/xdg-mime", - "$root_out_dir/xdg-settings", "$root_out_dir/locales/en-US.pak", "$root_out_dir/MEIPreload/manifest.json", "$root_out_dir/MEIPreload/preloaded_data.pb",
diff --git a/chrome/installer/linux/common/installer.py b/chrome/installer/linux/common/installer.py index cee92db64..3c780c3 100644 --- a/chrome/installer/linux/common/installer.py +++ b/chrome/installer/linux/common/installer.py
@@ -758,22 +758,6 @@ else: self.uri_scheme = "x-scheme-handler/chromium;" - # xdg-mime and xdg-settings - artifacts.append( - Artifact( - "xdg-mime", - "xdg-mime", - ArtifactType.RESOURCE, - StandardPermissions.EXECUTABLE, - )) - artifacts.append( - Artifact( - "xdg-settings", - "xdg-settings", - ArtifactType.RESOURCE, - StandardPermissions.EXECUTABLE, - )) - # appdata.xml artifacts.append( Artifact(
diff --git a/chrome/installer/linux/common/wrapper b/chrome/installer/linux/common/wrapper index 0d79eab..eb38e146 100755 --- a/chrome/installer/linux/common/wrapper +++ b/chrome/installer/linux/common/wrapper
@@ -9,21 +9,11 @@ HERE="`dirname "$CHROME_WRAPPER"`" -# We include some xdg utilities next to the binary, and we want to prefer them -# over the system versions when we know the system versions are very old. We -# detect whether the system xdg utilities are sufficiently new to be likely to -# work for us by looking for xdg-settings. If we find it, we leave $PATH alone, -# so that the system xdg utilities (including any distro patches) will be used. -if ! command -v xdg-settings &> /dev/null; then - # Old xdg utilities. Prepend $HERE to $PATH to use ours instead. - export PATH="$HERE:$PATH" -else - # Use system xdg utilities. But first create mimeapps.list if it doesn't - # exist; some systems have bugs in xdg-mime that make it fail without it. - xdg_app_dir="${XDG_DATA_HOME:-$HOME/.local/share/applications}" - mkdir -p "$xdg_app_dir" - [ -f "$xdg_app_dir/mimeapps.list" ] || touch "$xdg_app_dir/mimeapps.list" -fi +# Use system xdg utilities. But first create mimeapps.list if it doesn't +# exist; some systems have bugs in xdg-mime that make it fail without it. +xdg_app_dir="${XDG_DATA_HOME:-$HOME/.local/share/applications}" +mkdir -p "$xdg_app_dir" +[ -f "$xdg_app_dir/mimeapps.list" ] || touch "$xdg_app_dir/mimeapps.list" export CHROME_VERSION_EXTRA="@@channel"
diff --git a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc index 6a62363..a1036abc 100644 --- a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc +++ b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
@@ -21,6 +21,7 @@ #include "base/test/run_until.h" #include "base/test/scoped_feature_list.h" #include "base/test/test_future.h" +#include "base/time/time.h" #include "build/build_config.h" #include "chrome/renderer/autofill/fake_mojo_password_manager_driver.h" #include "chrome/renderer/autofill/fake_password_generation_driver.h" @@ -406,6 +407,93 @@ return testing::Exactly(1); } +class FakeAutofillDriver : public mojom::AutofillDriver { + public: + FakeAutofillDriver() = default; + + void BindReceiver( + mojo::PendingAssociatedReceiver<mojom::AutofillDriver> pending_receiver) { + receiver_.reset(); + receiver_.Bind(std::move(pending_receiver)); + } + + MOCK_METHOD(void, + FormsSeen, + (const std::vector<autofill::FormData>& updated_forms, + const std::vector<autofill::FormRendererId>& removed_forms), + (override)); + MOCK_METHOD(void, + FormSubmitted, + (const autofill::FormData& form, + autofill::mojom::SubmissionSource source), + (override)); + MOCK_METHOD(void, + CaretMovedInFormField, + (const autofill::FormData& form, + autofill::FieldRendererId field_id, + const gfx::Rect& caret_bounds), + (override)); + MOCK_METHOD(void, + TextFieldValueChanged, + (const autofill::FormData& form, + autofill::FieldRendererId field_id, + base::TimeTicks timestamp), + (override)); + MOCK_METHOD(void, + TextFieldDidScroll, + (const autofill::FormData& form, + autofill::FieldRendererId field_id), + (override)); + MOCK_METHOD(void, + SelectControlSelectionChanged, + (const autofill::FormData& form, + autofill::FieldRendererId field_id), + (override)); + MOCK_METHOD(void, + SelectFieldOptionsDidChange, + (const autofill::FormData& form, + autofill::FieldRendererId field_id), + (override)); + MOCK_METHOD(void, + JavaScriptChangedAutofilledValue, + (const autofill::FormData& form, + autofill::FieldRendererId field_id, + const std::u16string& old_value), + (override)); + MOCK_METHOD(void, + AskForValuesToFill, + (const autofill::FormData& form, + autofill::FieldRendererId field_id, + const gfx::Rect& caret_bounds, + autofill::AutofillSuggestionTriggerSource trigger_source, + const std::optional<autofill::PasswordSuggestionRequest>& + password_request), + (override)); + MOCK_METHOD(void, HidePopup, (), (override)); + MOCK_METHOD(void, + SuppressAutomaticRefills, + (const autofill::FillId& fill_id), + (override)); + MOCK_METHOD(void, + RequestRefill, + (const autofill::FillId& fill_id), + (override)); + MOCK_METHOD(void, FocusOnNonFormField, (), (override)); + MOCK_METHOD(void, + FocusOnFormField, + (const autofill::FormData& form, + autofill::FieldRendererId field_id), + (override)); + MOCK_METHOD(void, + DidAutofillForm, + (const autofill::FormData& form), + (override)); + MOCK_METHOD(void, DidEndTextFieldEditing, (), (override)); + + private: + mojo::AssociatedReceiver<mojom::AutofillDriver> receiver_{this}; +}; + class PasswordAutofillAgentTest : public ChromeRenderViewTest { public: PasswordAutofillAgentTest() = default; @@ -513,6 +601,10 @@ base::BindRepeating( &PasswordAutofillAgentTest::BindPasswordManagerDriver, base::Unretained(this))); + remote_associated_interfaces->OverrideBinderForTesting( + mojom::AutofillDriver::Name_, + base::BindRepeating(&PasswordAutofillAgentTest::BindAutofillDriver, + base::Unretained(this))); ON_CALL(fake_driver_, PasswordFormSubmitted) .WillByDefault([this](const autofill::FormData& form_data) { @@ -866,17 +958,19 @@ std::u16string expected_username = show_all ? u"" : typed_username; SCOPED_TRACE(testing::Message() << __func__ << " called from " << location.ToString()); - EXPECT_CALL(fake_driver_, - ShowPasswordSuggestions(AllOf( - Field(&autofill::PasswordSuggestionRequest::field, - Field(&autofill::TriggeringField::typed_username, - expected_username))))) + EXPECT_CALL( + fake_autofill_driver_, + AskForValuesToFill( + _, _, _, _, + Optional(Field(&autofill::PasswordSuggestionRequest::field, + Field(&autofill::TriggeringField::typed_username, + expected_username))))) .Times(NumShowSuggestionsCalls()); base::RunLoop().RunUntilIdle(); } void CheckSuggestionsNotShown() { - EXPECT_CALL(fake_driver_, ShowPasswordSuggestions).Times(0); + EXPECT_CALL(fake_autofill_driver_, AskForValuesToFill).Times(0); base::RunLoop().RunUntilIdle(); } @@ -987,6 +1081,12 @@ std::move(handle))); } + void BindAutofillDriver(mojo::ScopedInterfaceEndpointHandle handle) { + fake_autofill_driver_.BindReceiver( + mojo::PendingAssociatedReceiver<mojom::AutofillDriver>( + std::move(handle))); + } + void ResetPasswordFormsCalls() { called_password_forms_parsed_ = false; form_data_parsed_ = std::nullopt; @@ -1053,6 +1153,7 @@ testing::NiceMock<FakeMojoPasswordManagerDriver> fake_driver_; testing::NiceMock<FakePasswordGenerationDriver> fake_pw_client_; + testing::NiceMock<FakeAutofillDriver> fake_autofill_driver_; std::optional<autofill::FormData> form_data_submitted_; bool called_dynamic_form_submission_ = false; @@ -1549,7 +1650,9 @@ // Tests that fields that are not under a <form> tag are only sent to // PasswordManager if they contain a password field. -TEST_F(PasswordAutofillAgentTest, SendPasswordFormsTest_UnownedtextInputs) { +TEST_F(PasswordAutofillAgentTest, SendPasswordFormsTest_UnownedTextInputs) { + // This allows avoiding the `LoadHTML()` call in the fixture class. + base::RunLoop().RunUntilIdle(); ResetPasswordFormsCalls(); const char kFormlessFieldsNonPasswordHTML[] = " <INPUT type='text' name='email'>" @@ -2452,11 +2555,6 @@ // credential suggestion popup, and the user can autocomplete the password by // selecting the credential from the popup. TEST_F(PasswordAutofillAgentTest, ClickAndSelect) { - // TODO(crbug.com/460655995): Adapt test to a world where - // kAutofillAndPasswordsInSameSurface is enabled. - base::test::ScopedFeatureList test_feature_list; - test_feature_list.InitAndDisableFeature( - features::kAutofillAndPasswordsInSameSurface); FocusElement(kUsernameName); // SimulateElementClick() is called so that a user gesture is actually made @@ -2467,7 +2565,7 @@ ClearUsernameAndPasswordFieldValues(); SimulateOnFillPasswordForm(fill_data_); ASSERT_TRUE(SimulateElementClick(kUsernameName)); - EXPECT_CALL(fake_driver_, ShowPasswordSuggestions); + EXPECT_CALL(fake_autofill_driver_, AskForValuesToFill); base::RunLoop().RunUntilIdle(); histogram_tester_.ExpectUniqueSample( @@ -2475,6 +2573,8 @@ static_cast<int>(autofill::AutofillSuggestionTriggerSource:: kFormControlElementClicked), 1); + + task_environment_.FastForwardBy(base::Seconds(1)); SimulateSuggestionChoice(username_element_); CheckSuggestions(kAliceUsername16, true); @@ -2485,17 +2585,13 @@ // TODO(b:322923603): Clean up when the feature is launched. TEST_F(PasswordAutofillAgentTest, SuggestionsPrefixMatchedByTypedUsername) { ConfigurePasswordSuggestionFiltering(/*enabled=*/false); - // TODO(crbug.com/460655995): Adapt test to a world where - // kAutofillAndPasswordsInSameSurface is enabled. - base::test::ScopedFeatureList test_feature_list; - test_feature_list.InitAndDisableFeature( - features::kAutofillAndPasswordsInSameSurface); ClearUsernameAndPasswordFieldValues(); // Make sure there's password data to fill in the field. SimulateOnFillPasswordForm(fill_data_); // Enter the value manually. SimulateUsernameTyping("ali"); + task_environment_.FastForwardBy(base::Seconds(1)); // Simulate a user clicking on the username element. This should produce a // message with all the usernames. @@ -2509,17 +2605,13 @@ TEST_F(PasswordAutofillAgentTest, SuggestionsNotPrefixMatchedWhenFeatureEnabled) { ConfigurePasswordSuggestionFiltering(/*enabled=*/true); - // TODO(crbug.com/460655995): Adapt test to a world where - // kAutofillAndPasswordsInSameSurface is enabled. - base::test::ScopedFeatureList test_feature_list; - test_feature_list.InitAndDisableFeature( - features::kAutofillAndPasswordsInSameSurface); ClearUsernameAndPasswordFieldValues(); // Make sure there's password data to fill in the field. SimulateOnFillPasswordForm(fill_data_); // Enter the value manually. SimulateUsernameTyping("ali"); + task_environment_.FastForwardBy(base::Seconds(1)); // Simulate a user clicking on the username element. This should produce a // message with all the usernames. @@ -2530,13 +2622,10 @@ // Tests that the popup is suppressed when the user selects address or payments // fallback even when the triggering field that is classified as password. -TEST_F(PasswordAutofillAgentTest, - NoPopupOnPasswordFieldWhereAddressOrPaymentsManualFallbackWasSelected) { - // TODO(crbug.com/460655995): Adapt test to a world where - // kAutofillAndPasswordsInSameSurface is enabled. - base::test::ScopedFeatureList test_feature_list; - test_feature_list.InitAndDisableFeature( - features::kAutofillAndPasswordsInSameSurface); +// TODO(crbug.com/494507627): Re-enable after fixing. +TEST_F( + PasswordAutofillAgentTest, + DISABLED_NoPopupOnPasswordFieldWhereAddressOrPaymentsManualFallbackWasSelected) { SimulateOnFillPasswordForm(fill_data_); // This call is necessary to setup the autofill agent appropriate for the // user selection; simulates the menu actually popping up. @@ -2566,25 +2655,22 @@ password_autofill_agent_->InformNoSavedCredentials(false); - EXPECT_CALL(fake_driver_, ShowPasswordSuggestions).Times(0); + EXPECT_CALL(fake_autofill_driver_, + AskForValuesToFill(_, _, _, _, Eq(std::nullopt))) + .Times(1); ASSERT_TRUE(SimulateElementClick(kPasswordName)); } TEST_F(PasswordAutofillAgentTest, PopupOnPasswordFieldWithoutSuggestionsWhenEligibleForPromo) { - // TODO(crbug.com/460655995): Adapt test to a world where - // kAutofillAndPasswordsInSameSurface is enabled. - base::test::ScopedFeatureList test_feature_list; - test_feature_list.InitAndDisableFeature( - features::kAutofillAndPasswordsInSameSurface); ClearUsernameAndPasswordFieldValues(); UpdateRendererIDsInFillData(); password_autofill_agent_->InformNoSavedCredentials( /*should_show_popup_without_passwords=*/true); - EXPECT_CALL(fake_driver_, ShowPasswordSuggestions) + EXPECT_CALL(fake_autofill_driver_, AskForValuesToFill) .Times(NumShowSuggestionsCalls()); ASSERT_TRUE(SimulateElementClick(kPasswordName)); } @@ -2595,11 +2681,6 @@ // load and the element is autofilled, when the user clicks on an element that // has a matching username. TEST_F(PasswordAutofillAgentTest, CredentialsOnClick) { - // TODO(crbug.com/460655995): Adapt test to a world where - // kAutofillAndPasswordsInSameSurface is enabled. - base::test::ScopedFeatureList test_feature_list; - test_feature_list.InitAndDisableFeature( - features::kAutofillAndPasswordsInSameSurface); // Simulate the browser sending back the login info. SimulateOnFillPasswordForm(fill_data_); @@ -2609,21 +2690,26 @@ // Call SimulateElementClick() to produce a user gesture on the page so // autofill will actually fill. ASSERT_TRUE(SimulateElementClick(kUsernameName)); - EXPECT_CALL(fake_driver_, ShowPasswordSuggestions) + EXPECT_CALL(fake_autofill_driver_, AskForValuesToFill) .Times(NumShowSuggestionsCalls()); base::RunLoop().RunUntilIdle(); + task_environment_.FastForwardBy(base::Seconds(1)); // Simulate a user clicking on the username element. This should produce a // message with all the usernames. SimulateElementClick(username_element_); CheckSuggestions(std::u16string(), true); + task_environment_.FastForwardBy(base::Seconds(1)); // Now simulate a user typing in a saved username. The list is filtered. - EXPECT_CALL(fake_driver_, - ShowPasswordSuggestions(Field( - &autofill::PasswordSuggestionRequest::field, - Field(&autofill::TriggeringField::element_id, - form_util::GetFieldRendererId(username_element_))))) + EXPECT_CALL( + fake_autofill_driver_, + AskForValuesToFill( + _, _, _, _, + Optional( + Field(&autofill::PasswordSuggestionRequest::field, + Field(&autofill::TriggeringField::element_id, + form_util::GetFieldRendererId(username_element_)))))) .Times(NumShowSuggestionsCalls()); SimulateUsernameTyping(kAliceUsername); } @@ -2631,11 +2717,6 @@ // Tests that there is an autosuggestion from the password manager when the // user clicks on the password field. TEST_F(PasswordAutofillAgentTest, NoCredentialsOnPasswordClick) { - // TODO(crbug.com/460655995): Adapt test to a world where - // kAutofillAndPasswordsInSameSurface is enabled. - base::test::ScopedFeatureList test_feature_list; - test_feature_list.InitAndDisableFeature( - features::kAutofillAndPasswordsInSameSurface); SimulateClosingKeyboardReplacingSurfaceIfAndroid(kUsernameName); // Simulate the browser sending back the login info. SimulateOnFillPasswordForm(fill_data_); @@ -2646,13 +2727,13 @@ // Call SimulateElementClick() to produce a user gesture on the page so // autofill will actually fill. ASSERT_TRUE(SimulateElementClick(kUsernameName)); - EXPECT_CALL(fake_driver_, ShowPasswordSuggestions); + EXPECT_CALL(fake_autofill_driver_, AskForValuesToFill); base::RunLoop().RunUntilIdle(); // Simulate a user clicking on the password element. This should produce no // message. SimulateElementClick(password_element_); - EXPECT_CALL(fake_driver_, ShowPasswordSuggestions) + EXPECT_CALL(fake_autofill_driver_, AskForValuesToFill) .Times(NumShowSuggestionsCalls()); base::RunLoop().RunUntilIdle(); } @@ -3213,11 +3294,6 @@ } TEST_F(PasswordAutofillAgentTest, ShowPopupOnEmptyPasswordField) { - // TODO(crbug.com/460655995): Adapt test to a world where - // kAutofillAndPasswordsInSameSurface is enabled. - base::test::ScopedFeatureList test_feature_list; - test_feature_list.InitAndDisableFeature( - features::kAutofillAndPasswordsInSameSurface); // Load a form with no username and update test data. LoadHTML(kVisibleFormWithNoUsernameHTML); UpdateUrlForHTML(kVisibleFormWithNoUsernameHTML); @@ -3243,11 +3319,6 @@ } TEST_F(PasswordAutofillAgentTest, ShowPopupOnAutofilledPasswordField) { - // TODO(crbug.com/460655995): Adapt test to a world where - // kAutofillAndPasswordsInSameSurface is enabled. - base::test::ScopedFeatureList test_feature_list; - test_feature_list.InitAndDisableFeature( - features::kAutofillAndPasswordsInSameSurface); // Load a form with no username and update test data. LoadHTML(kVisibleFormWithNoUsernameHTML); UpdateUrlForHTML(kVisibleFormWithNoUsernameHTML); @@ -3272,30 +3343,6 @@ EXPECT_TRUE(password_element_.IsAutofilled()); } -TEST_F(PasswordAutofillAgentTest, NotShowPopupPasswordField) { - // Load a form with no username and update test data. - LoadHTML(kVisibleFormWithNoUsernameHTML); - UpdateUrlForHTML(kVisibleFormWithNoUsernameHTML); - UpdateOnlyPasswordElement(); - fill_data_.preferred_login.username_value.clear(); - fill_data_.additional_logins.clear(); - - password_element_.SetValue(""); - password_element_.SetAutofillState(WebAutofillState::kNotFilled); - - // Simulate the browser sending back the login info for an initial page load. - SimulateOnFillPasswordForm(fill_data_); - - // Do not show popup suggestion when the password field is not-empty and not - // autofilled. - password_element_.SetValue("123"); - password_element_.SetAutofillState(WebAutofillState::kNotFilled); - - SimulateSuggestionChoiceOfUsernameAndPassword( - password_element_, std::u16string(), kAlicePassword16); - CheckSuggestionsNotShown(); -} - // Tests with fill-on-account-select enabled that if the username element is // read-only and filled with an unknown username, then the password field is not // highlighted as autofillable (regression test for https://crbug.com/40398437). @@ -3472,11 +3519,6 @@ // be displayed when available after the field is focused again. // Regression test for crbug/1495325. TEST_F(PasswordAutofillAgentTest, CanShowSuggestionsAfterManualGeneration) { - // TODO(crbug.com/460655995): Adapt test to a world where - // kAutofillAndPasswordsInSameSurface is enabled. - base::test::ScopedFeatureList test_feature_list; - test_feature_list.InitAndDisableFeature( - features::kAutofillAndPasswordsInSameSurface); // Simulate receiving credentials for filling from the browser. SimulateOnFillPasswordForm(fill_data_); @@ -3484,6 +3526,7 @@ // user. ASSERT_TRUE(SimulateElementClick(kPasswordName)); CheckSuggestions(/*typed_username=*/u"", true); + task_environment_.FastForwardBy(base::Seconds(1)); // Simulate manual generation triggering. base::test::TestFuture<const std::optional< @@ -3537,11 +3580,6 @@ // credential suggestion popup on a change password form. TEST_F(PasswordAutofillAgentTest, SuggestionsOnUsernameFieldOfChangePasswordForm) { - // TODO(crbug.com/460655995): Adapt test to a world where - // kAutofillAndPasswordsInSameSurface is enabled. - base::test::ScopedFeatureList test_feature_list; - test_feature_list.InitAndDisableFeature( - features::kAutofillAndPasswordsInSameSurface); LoadHTML(kPasswordChangeFormHTML); UpdateUrlForHTML(kPasswordChangeFormHTML); UpdateUsernameAndPasswordElements(); @@ -3559,11 +3597,6 @@ // credential suggestion popup on a change password form. TEST_F(PasswordAutofillAgentTest, SuggestionsOnPasswordFieldOfChangePasswordForm) { - // TODO(crbug.com/460655995): Adapt test to a world where - // kAutofillAndPasswordsInSameSurface is enabled. - base::test::ScopedFeatureList test_feature_list; - test_feature_list.InitAndDisableFeature( - features::kAutofillAndPasswordsInSameSurface); LoadHTML(kPasswordChangeFormHTML); UpdateUrlForHTML(kPasswordChangeFormHTML); UpdateUsernameAndPasswordElements(); @@ -4081,11 +4114,6 @@ // Tests that we can correctly suggest to autofill two forms without username // fields. TEST_F(PasswordAutofillAgentTest, ShowSuggestionForNonUsernameFieldForms) { - // TODO(crbug.com/460655995): Adapt test to a world where - // kAutofillAndPasswordsInSameSurface is enabled. - base::test::ScopedFeatureList test_feature_list; - test_feature_list.InitAndDisableFeature( - features::kAutofillAndPasswordsInSameSurface); LoadHTML(kTwoNoUsernameFormsHTML); fill_data_.preferred_login.username_value.clear(); UpdateUrlForHTML(kTwoNoUsernameFormsHTML); @@ -4180,11 +4208,6 @@ // Tests that a suggestion dropdown is shown on a password field even if a // username field is present. TEST_F(PasswordAutofillAgentTest, SuggestPasswordFieldSignInForm) { - // TODO(crbug.com/460655995): Adapt test to a world where - // kAutofillAndPasswordsInSameSurface is enabled. - base::test::ScopedFeatureList test_feature_list; - test_feature_list.InitAndDisableFeature( - features::kAutofillAndPasswordsInSameSurface); SimulateClosingKeyboardReplacingSurfaceIfAndroid(kUsernameName); // Simulate the browser sending back the login info. SimulateOnFillPasswordForm(fill_data_); @@ -4192,7 +4215,7 @@ // Call SimulateElementClick() to produce a user gesture on the page so // autofill will actually fill. ASSERT_TRUE(SimulateElementClick(kUsernameName)); - EXPECT_CALL(fake_driver_, ShowPasswordSuggestions); + EXPECT_CALL(fake_autofill_driver_, AskForValuesToFill); base::RunLoop().RunUntilIdle(); // Simulate a user clicking on the password element. This should produce a @@ -4204,12 +4227,8 @@ // Tests that filling is suggested in a form with read-only username and that // username field index is passed to the driver. TEST_F(PasswordAutofillAgentTest, SuggestPasswordWhenUsernameFieldDisabled) { - // TODO(crbug.com/460655995): Adapt test to a world where - // kAutofillAndPasswordsInSameSurface is enabled. - base::test::ScopedFeatureList test_feature_list; - test_feature_list.InitAndDisableFeature( - features::kAutofillAndPasswordsInSameSurface); SimulateClosingKeyboardReplacingSurfaceIfAndroid(kPasswordName); + // Simulate that the username was pre-filled by website and the username field // is readonly. username_element_.SetValue(WebString::FromUTF16(username1_)); @@ -4217,10 +4236,13 @@ // Simulate the browser sending back the login info. SimulateOnFillPasswordForm(fill_data_); - PasswordSuggestionRequest suggestion_request; - EXPECT_CALL(fake_driver_, ShowPasswordSuggestions) - .WillOnce(testing::SaveArg<0>(&suggestion_request)); base::RunLoop().RunUntilIdle(); + task_environment_.FastForwardBy(base::Seconds(1)); + testing::Mock::VerifyAndClearExpectations(&fake_autofill_driver_); + + std::optional<PasswordSuggestionRequest> suggestion_request; + EXPECT_CALL(fake_autofill_driver_, AskForValuesToFill) + .WillOnce(testing::SaveArg<4>(&suggestion_request)); // Simulate a user clicking on the password element. This should produce a // dropdown with suggestion of all available usernames. @@ -4238,8 +4260,9 @@ std::ranges::find(form.fields(), form_util::GetFieldRendererId(password_element_), &autofill::FormFieldData::renderer_id)); - EXPECT_EQ(suggestion_request.username_field_index, username_index); - EXPECT_EQ(suggestion_request.password_field_index, password_index); + ASSERT_TRUE(suggestion_request); + EXPECT_EQ(suggestion_request->username_field_index, username_index); + EXPECT_EQ(suggestion_request->password_field_index, password_index); } // TODO(crbug.com/40819370): Amend the test to port it on Android if possible. @@ -4249,11 +4272,6 @@ // user chose one of the fields to autofill, a suggestion dropdown will be shown // only on this field. TEST_F(PasswordAutofillAgentTest, SuggestMultiplePasswordFields) { - // TODO(crbug.com/460655995): Adapt test to a world where - // kAutofillAndPasswordsInSameSurface is enabled. - base::test::ScopedFeatureList test_feature_list; - test_feature_list.InitAndDisableFeature( - features::kAutofillAndPasswordsInSameSurface); LoadHTML(kPasswordChangeFormHTML); UpdateUrlForHTML(kPasswordChangeFormHTML); UpdateUsernameAndPasswordElements(); @@ -4264,8 +4282,9 @@ // Call SimulateElementClick() to produce a user gesture on the page so // autofill will actually fill. ASSERT_TRUE(SimulateElementClick(kUsernameName)); - EXPECT_CALL(fake_driver_, ShowPasswordSuggestions); + EXPECT_CALL(fake_autofill_driver_, AskForValuesToFill); base::RunLoop().RunUntilIdle(); + task_environment_.FastForwardBy(base::Seconds(1)); // Simulate a user clicking on the password elements. This should produce // dropdowns with suggestion of all available usernames. @@ -4279,19 +4298,24 @@ CheckSuggestions(u"", true); // The user chooses to autofill the current password field. - EXPECT_CALL(fake_driver_, ShowPasswordSuggestions) + EXPECT_CALL(fake_autofill_driver_, AskForValuesToFill) .Times(NumShowSuggestionsCalls()); SimulateElementClick(password_element_); password_autofill_agent_->FillPasswordSuggestion( kAliceUsername16, kAlicePassword16, base::DoNothing()); base::RunLoop().RunUntilIdle(); + task_environment_.FastForwardBy(base::Seconds(1)); // Simulate a user clicking on not autofilled password fields. This should // produce no suggestion dropdowns. - EXPECT_CALL(fake_driver_, ShowPasswordSuggestions).Times(0); + EXPECT_CALL(fake_autofill_driver_, + AskForValuesToFill(_, _, _, _, Eq(std::nullopt))) + .Times(2); ASSERT_TRUE(SimulateElementClick("newpassword")); + task_environment_.FastForwardBy(base::Seconds(1)); ASSERT_TRUE(SimulateElementClick("confirmpassword")); base::RunLoop().RunUntilIdle(); + task_environment_.FastForwardBy(base::Seconds(1)); // But when the user clicks on the autofilled password field again it should // still produce a suggestion dropdown. @@ -4542,16 +4566,12 @@ } TEST_F(PasswordAutofillAgentTest, SuggestLatestCredentials) { - // TODO(crbug.com/460655995): Adapt test to a world where - // kAutofillAndPasswordsInSameSurface is enabled. - base::test::ScopedFeatureList test_feature_list; - test_feature_list.InitAndDisableFeature( - features::kAutofillAndPasswordsInSameSurface); password_autofill_agent_->ApplyFillDataOnParsingCompletion(fill_data_); ASSERT_TRUE(SimulateElementClick(kPasswordName)); - EXPECT_CALL(fake_driver_, ShowPasswordSuggestions) + EXPECT_CALL(fake_autofill_driver_, AskForValuesToFill) .Times(NumShowSuggestionsCalls()); base::RunLoop().RunUntilIdle(); + task_environment_.FastForwardBy(base::Seconds(1)); // Change fill data fill_data_.preferred_login.username_value = u"a-changed-username"; @@ -4767,11 +4787,6 @@ // Fill on account select for credentials with empty usernames: // Do not refill usernames if non-empty username is already selected. TEST_F(PasswordAutofillAgentTest, NoUsernameCredential) { - // TODO(crbug.com/460655995): Adapt test to a world where - // kAutofillAndPasswordsInSameSurface is enabled. - base::test::ScopedFeatureList test_feature_list; - test_feature_list.InitAndDisableFeature( - features::kAutofillAndPasswordsInSameSurface); const char kPasswordForEmptyUsernameCredential[] = "empty"; const char16_t kPasswordForEmptyUsernameCredential16[] = u"empty"; @@ -4784,14 +4799,15 @@ SimulateOnFillPasswordForm(fill_data_); ClearUsernameAndPasswordFieldValues(); - EXPECT_CALL(fake_driver_, ShowPasswordSuggestions) + EXPECT_CALL(fake_autofill_driver_, AskForValuesToFill) .Times(NumShowSuggestionsCalls()); SimulateSuggestionChoiceOfUsernameAndPassword( password_element_, kAliceUsername16, kAlicePassword16); CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true); base::RunLoop().RunUntilIdle(); + task_environment_.FastForwardBy(base::Seconds(1)); - EXPECT_CALL(fake_driver_, ShowPasswordSuggestions) + EXPECT_CALL(fake_autofill_driver_, AskForValuesToFill) .Times(NumShowSuggestionsCalls()); SimulateSuggestionChoiceOfUsernameAndPassword( password_element_, u"", kPasswordForEmptyUsernameCredential16); @@ -5126,11 +5142,6 @@ ShowSuggestionsOnParsingAutofocusedPasswordForm) { scoped_feature_list_.InitAndEnableFeature( password_manager::features::kShowSuggestionsOnAutofocus); - // TODO(crbug.com/460655995): Adapt test to a world where - // kAutofillAndPasswordsInSameSurface is enabled. - base::test::ScopedFeatureList test_feature_list; - test_feature_list.InitAndDisableFeature( - features::kAutofillAndPasswordsInSameSurface); #if BUILDFLAG(IS_ANDROID) // The method above leaves the field focused, which is not needed for this @@ -5139,7 +5150,18 @@ #endif // BUILDFLAG(IS_ANDROID) FocusElement(kUsernameName); + +#if BUILDFLAG(IS_ANDROID) + EXPECT_CALL(fake_autofill_driver_, + AskForValuesToFill(_, _, _, _, Eq(std::nullopt))) + .Times(1); +#else CheckSuggestionsNotShown(); +#endif + + base::RunLoop().RunUntilIdle(); + task_environment_.FastForwardBy(base::Seconds(1)); + testing::Mock::VerifyAndClearExpectations(&fake_autofill_driver_); // Simulate receiving credentials for filling from the browser and verify that // suggestions are shown to the user. @@ -5159,11 +5181,7 @@ ShowSuggestionsOnParsingAutofocusedWebAuthnForm) { scoped_feature_list_.InitAndEnableFeature( password_manager::features::kShowSuggestionsOnAutofocus); - // TODO(crbug.com/460655995): Adapt test to a world where - // kAutofillAndPasswordsInSameSurface is enabled. - base::test::ScopedFeatureList test_feature_list; - test_feature_list.InitAndDisableFeature( - features::kAutofillAndPasswordsInSameSurface); + LoadHTML(kWebAutnFieldHTML); UpdateUsernameAndPasswordElements(); UpdateRendererIDsInFillData(); @@ -5175,7 +5193,17 @@ #endif // BUILDFLAG(IS_ANDROID) FocusElement(kUsernameName); + +#if BUILDFLAG(IS_ANDROID) + EXPECT_CALL(fake_autofill_driver_, + AskForValuesToFill(_, _, _, _, Eq(std::nullopt))) + .Times(1); + task_environment_.FastForwardBy(base::Seconds(1)); +#else CheckSuggestionsNotShown(); +#endif // BUILDFLAG(IS_ANDROID) + + testing::Mock::VerifyAndClearExpectations(&fake_autofill_driver_); // Simulate receiving credentials for filling from the browser and verify that // suggestions are shown to the user. @@ -5190,11 +5218,6 @@ DoNotShowSuggestionsOnParsingFocusedFormSecondTime) { scoped_feature_list_.InitAndEnableFeature( password_manager::features::kShowSuggestionsOnAutofocus); - // TODO(crbug.com/460655995): Adapt test to a world where - // kAutofillAndPasswordsInSameSurface is enabled. - base::test::ScopedFeatureList test_feature_list; - test_feature_list.InitAndDisableFeature( - features::kAutofillAndPasswordsInSameSurface); #if BUILDFLAG(IS_ANDROID) // The method above leaves the field focused, which is not needed for this @@ -5340,6 +5363,7 @@ SCOPED_TRACE(testing::Message() << "Running for the page: " << html); LoadHTML(html); UpdateUrlForHTML(html); + base::RunLoop().RunUntilIdle(); WebInputElement password = GetInputElementByID("password"), new_password = GetInputElementByID("newpassword"), @@ -5351,6 +5375,7 @@ password_confirmation = autofill::form_util::GetFieldRendererId(confirmation_password); + ASSERT_TRUE(form_data_parsed_); const std::vector<autofill::FormData>& parsed_form_data = form_data_parsed_.value(); EXPECT_EQ(1u, parsed_form_data.size());
diff --git a/chrome/services/speech/internal b/chrome/services/speech/internal index 6d89c85..b655c01 160000 --- a/chrome/services/speech/internal +++ b/chrome/services/speech/internal
@@ -1 +1 @@ -Subproject commit 6d89c858b875cd31e2e3f151453d54bb493c735f +Subproject commit b655c01655dd92e8050a92fd7b2d8c20ce2b45a1
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 97b0685..ee705fb8 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -2843,6 +2843,7 @@ "//chrome/browser/ui/webauthn:browser_tests", "//chrome/browser/ui/webui", "//chrome/browser/ui/webui:webui_util", + "//chrome/browser/ui/webui/ai_overlay_dialog:browser_tests", "//chrome/browser/ui/webui/app_service_internals:browser_tests", "//chrome/browser/ui/webui/autofill_and_password_manager_internals:browser_tests", "//chrome/browser/ui/webui/autofill_ml_internals:browser_tests", @@ -3251,6 +3252,10 @@ "//v8", ] + if (enable_guest_view) { + deps += [ "//chrome/browser/guest_view" ] + } + # TODO(crbug.com/428666921): Remove this dependency when # c/b/ui/views/performance_controls/*browsertest.cc get componentized. deps += [ "//chrome/browser/ui/performance_controls/test_support" ] @@ -10877,6 +10882,7 @@ deps += [ "//chrome/browser/ui/call_to_action", "//chrome/browser/ui/tabs:glic", + "//chrome/browser/ui/tabs:tab_list_bridge", ] if (is_chromeos) { deps += [ "//chrome/browser/ash/test:test_support" ]
diff --git a/chrome/test/data/devtools/extensions/can_inspect_url/devtools.js b/chrome/test/data/devtools/extensions/can_inspect_url/devtools.js index 02a53dc..a2a1e49 100644 --- a/chrome/test/data/devtools/extensions/can_inspect_url/devtools.js +++ b/chrome/test/data/devtools/extensions/can_inspect_url/devtools.js
@@ -25,28 +25,10 @@ if (newPageURL.startsWith('file:')) { chrome.test.openFileUrl(newPageURL); } else { - try { - await new Promise((resolve, reject) => { - chrome.debugger.attach({tabId: inspectedTabId}, '1.3', () => { - if (chrome.runtime.lastError) { - reject(chrome.runtime.lastError); - return; - } - chrome.debugger.sendCommand( - {tabId: inspectedTabId}, 'Page.navigate', {url: newPageURL}, - () => { - if (chrome.runtime.lastError) { - reject(chrome.runtime.lastError); - return; - } - resolve(); - }); - }); - }); - } catch (error) { - output('PASS'); - return; - } + chrome.debugger.attach( + {tabId: inspectedTabId}, '1.3', + () => chrome.debugger.sendCommand( + {tabId: inspectedTabId}, 'Page.navigate', {url: newPageURL})); } await new Promise( resolve => chrome.tabs.onUpdated.addListener((tabId, changedProps) => {
diff --git a/chrome/test/data/extensions/api_test/messaging/background_only/test.js b/chrome/test/data/extensions/api_test/messaging/background_only/test.js index 318ddc7b..67d30547 100644 --- a/chrome/test/data/extensions/api_test/messaging/background_only/test.js +++ b/chrome/test/data/extensions/api_test/messaging/background_only/test.js
@@ -2,18 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -var kPortErrorMessage = +const kPortErrorMessage = 'Could not establish connection. Receiving end does not exist.'; // onMessage / onConnect in the same frame cannot be triggered by sendMessage or // connect, so both attempts to send a message should fail with an error. chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) { - chrome.test.fail('onMessage should not be triggered. Received: ' + msg); + chrome.test.fail(`onMessage should not be triggered. Received: ${msg}`); }); chrome.runtime.onConnect.addListener(function(port) { - chrome.test.fail('onConnect should not be triggered. Port: ' + port.name); + chrome.test.fail(`onConnect should not be triggered. Port: ${port.name}`); }); chrome.test.runTests([ @@ -45,8 +45,8 @@ // Regression test for crbug.com/597698 function sendMessageNoCallback() { - var f = document.createElement('iframe'); - var onMessageInFrame = chrome.test.callbackPass(function(msg) { + const f = document.createElement('iframe'); + const onMessageInFrame = chrome.test.callbackPass(function(msg) { f.remove(); chrome.test.assertEq('sendMessage without callback', msg); }); @@ -63,16 +63,16 @@ // Regression test for crbug.com/597698 function connectAndDisconnectInIframe() { - var gotMessage = chrome.test.callbackAdded(); - var gotDisconnect = chrome.test.callbackAdded(); + const gotMessage = chrome.test.callbackAdded(); + const gotDisconnect = chrome.test.callbackAdded(); - var senderPort; - var f = document.createElement('iframe'); + let senderPort; + const f = document.createElement('iframe'); f.onload = function() { f.contentWindow.chrome.runtime.onConnect.addListener(function(port) { chrome.test.assertEq('port with active frame', port.name); chrome.test.assertEq(null, senderPort, 'onConnect should be async'); - var didCallOnMessage = false; + let didCallOnMessage = false; port.onMessage.addListener(function(msg) { chrome.test.assertEq(false, didCallOnMessage); didCallOnMessage = true;
diff --git a/chrome/test/data/extensions/api_test/messaging/connect/frame.js b/chrome/test/data/extensions/api_test/messaging/connect/frame.js index 612c34ce..60ae5ea 100644 --- a/chrome/test/data/extensions/api_test/messaging/connect/frame.js +++ b/chrome/test/data/extensions/api_test/messaging/connect/frame.js
@@ -7,8 +7,8 @@ if (msg.testSendMessageToFrame) { // page.js created this frame with an unique digit starting at 0. // This number is used in test.js to identify messages from this frame. - var test_id = location.search.slice(-1); - port.postMessage('from_' + test_id); + const testId = location.search.slice(-1); + port.postMessage(`from_${testId}`); } else if (msg.testConnectChildFrameAndNavigate) { location.search = '?testConnectChildFrameAndNavigateDone'; }
diff --git a/chrome/test/data/extensions/api_test/messaging/connect/page.js b/chrome/test/data/extensions/api_test/messaging/connect/page.js index 67953c4..d8935952 100644 --- a/chrome/test/data/extensions/api_test/messaging/connect/page.js +++ b/chrome/test/data/extensions/api_test/messaging/connect/page.js
@@ -6,7 +6,7 @@ chrome.runtime.onConnect.addListener(function onConnect(port) { console.log('connected'); port.onMessage.addListener(function(msg) { - console.log('got ' + JSON.stringify(msg)); + console.log(`got ${JSON.stringify(msg)}`); if (msg.testPostMessage) { port.postMessage({success: true}); } else if (msg.testPostMessageFromTab) { @@ -40,7 +40,7 @@ // background script (test.js) to confirm that these ports // that are opened before navigating away are still // available. - let portFromTab = chrome.runtime.connect(); + const portFromTab = chrome.runtime.connect(); portFromTab.onMessage.addListener(function(msg) { window.addEventListener('pageshow', function(event) { if (event.persisted) { @@ -68,12 +68,12 @@ // Tests that postMessage to the extension and its response works. function testPostMessageFromTab(origPort) { - var portName = "peter"; - var port = chrome.runtime.connect({name: portName}); + const portName = 'peter'; + const port = chrome.runtime.connect({name: portName}); port.postMessage({testPostMessageFromTab: true}); port.onMessage.addListener(function(msg) { origPort.postMessage({success: (msg.success && (msg.portName == portName))}); - console.log('testPostMessageFromTab sent ' + msg.success); + console.log(`testPostMessageFromTab sent ${msg.success}`); port.disconnect(); }); } @@ -93,9 +93,9 @@ // runs in frames whose URL matches ?testSendMessageFromFrame. // frame.js sends a message to the background page, which checks that the // sender has the expected frameId, url, origin, tab and runtime id. - for (var i = 0; i < 2; ++i) { - var f = document.createElement('iframe'); - f.src = '?testSendMessageFromFrame' + i; + for (let i = 0; i < 2; ++i) { + const f = document.createElement('iframe'); + f.src = `?testSendMessageFromFrame${i}`; document.body.appendChild(f); } } @@ -105,42 +105,42 @@ // runs in frames whose URL matches ?testSendMessageFromSandboxFrame. // frame.js sends a message to the background page, which checks that the // sender has the expected frameId, url, origin, tab and runtime id. - for (var i = 2; i < 4; ++i) { - var f = document.createElement('iframe'); + for (let i = 2; i < 4; ++i) { + const f = document.createElement('iframe'); f.sandbox = 'allow-scripts'; - f.src = '?testSendMessageFromSandboxedFrame' + i; + f.src = `?testSendMessageFromSandboxedFrame${i}`; document.body.appendChild(f); } } function testConnectChildFrameAndNavigateSetup() { - var frames = document.querySelectorAll('iframe'); - for (var i = 0; i < frames.length; ++i) { + const frames = document.querySelectorAll('iframe'); + for (let i = 0; i < frames.length; ++i) { frames[i].remove(); } - var f = document.createElement('iframe'); + const f = document.createElement('iframe'); f.src = '?testConnectChildFrameAndNavigateSetup'; document.body.appendChild(f); // Test will continue in frame.js } // Use a potentially-valid extension id. -var fakeExtensionId = 'c'.repeat(32); +const fakeExtensionId = 'c'.repeat(32); // Tests sendMessage to an invalid extension. function testSendMessageFromTabError() { // try sending a request to a bad extension id chrome.runtime.sendMessage(fakeExtensionId, {m: 1}, function(response) { - var success = (response === undefined && chrome.runtime.lastError); + const success = (response === undefined && chrome.runtime.lastError); chrome.runtime.sendMessage({success: success}); }); } // Tests connecting to an invalid extension. function testConnectFromTabError() { - var port = chrome.runtime.connect(fakeExtensionId); + const port = chrome.runtime.connect(fakeExtensionId); port.onDisconnect.addListener(function() { - var success = (chrome.runtime.lastError ? true : false); + const success = (chrome.runtime.lastError ? true : false); chrome.runtime.sendMessage({success: success}); }); }
diff --git a/chrome/test/data/extensions/api_test/messaging/connect/test.js b/chrome/test/data/extensions/api_test/messaging/connect/test.js index 4bdf9801..61d7ded 100644 --- a/chrome/test/data/extensions/api_test/messaging/connect/test.js +++ b/chrome/test/data/extensions/api_test/messaging/connect/test.js
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -var listenOnce = chrome.test.listenOnce; -var listenForever = chrome.test.listenForever; +const listenOnce = chrome.test.listenOnce; +const listenForever = chrome.test.listenForever; // Keep track of the tab that we're running tests in, for simplicity. -var testTab = null; +let testTab = null; function compareSenders(expected, actual) { // The `tab` property on the sender is the full tabs.Tab definition of the @@ -33,9 +33,9 @@ } function createExpectedSender(tab, frameId, url, id) { - var originUrl = null; + let originUrl = null; if (tab.url) { - var tabUrl = new URL(tab.url); + const tabUrl = new URL(tab.url); originUrl = tabUrl.origin; } return createExpectedSenderWithOrigin(tab, frameId, url, originUrl, id); @@ -46,7 +46,7 @@ `http://localhost:${config.testServer.port}/extensions/test_file.html`; chrome.test.runTests([ async function setupTestTab() { - chrome.test.log("Creating tab..."); + chrome.test.log('Creating tab...'); const {openTab} = await import('/_test_resources/test_util/tabs_util.js'); testTab = await openTab(url); @@ -55,7 +55,7 @@ // Tests that postMessage to the tab and its response works. function postMessage() { - var port = chrome.tabs.connect(testTab.id); + const port = chrome.tabs.connect(testTab.id); port.postMessage({testPostMessage: true}); listenOnce(port.onMessage, function(msg) { port.disconnect(); @@ -64,8 +64,8 @@ // Tests that port name is sent & received correctly. function portName() { - var portName = "lemonjello"; - var port = chrome.tabs.connect(testTab.id, {name: portName}); + const portName = 'lemonjello'; + const port = chrome.tabs.connect(testTab.id, {name: portName}); chrome.test.assertEq(portName, port.name); port.postMessage({testPortName: true}); listenOnce(port.onMessage, function(msg) { @@ -85,13 +85,13 @@ listenOnce(port.onMessage, function(msg) { chrome.test.assertTrue(msg.testPostMessageFromTab); port.postMessage({success: true, portName: port.name}); - chrome.test.log("postMessageFromTab: got message from tab"); + chrome.test.log('postMessageFromTab: got message from tab'); }); }); - var port = chrome.tabs.connect(testTab.id); + const port = chrome.tabs.connect(testTab.id); port.postMessage({testPostMessageFromTab: true}); - chrome.test.log("postMessageFromTab: sent first message to tab"); + chrome.test.log('postMessageFromTab: sent first message to tab'); listenOnce(port.onMessage, function(msg) { port.disconnect(); }); @@ -99,7 +99,7 @@ // Tests receiving a request from a content script and responding. function sendMessageFromTab() { - var doneListening = listenForever( + const doneListening = listenForever( chrome.runtime.onMessage, function(request, sender, sendResponse) { expectedSender = createExpectedSender( testTab, @@ -118,16 +118,16 @@ } }); - var port = chrome.tabs.connect(testTab.id); + const port = chrome.tabs.connect(testTab.id); port.postMessage({testSendMessageFromTab: true}); port.disconnect(); - chrome.test.log("sendMessageFromTab: sent first message to tab"); + chrome.test.log('sendMessageFromTab: sent first message to tab'); }, // Tests that a message from a child frame is constructed properly. function sendMessageFromFrameInTab() { constructMessageSenderFromFrameInTab(false); - var port = chrome.tabs.connect(testTab.id); + const port = chrome.tabs.connect(testTab.id); port.postMessage({testSendMessageFromFrame: true}); port.disconnect(); chrome.test.log('sendMessageFromFrameInTab: send 1st message to tab'); @@ -137,7 +137,7 @@ // constructed properly. function sendMessageFromSandboxFrameInTab() { constructMessageSenderFromFrameInTab(true); - var port = chrome.tabs.connect(testTab.id); + const port = chrome.tabs.connect(testTab.id); port.postMessage({testSendMessageFromSandboxedFrame: true}); port.disconnect(); chrome.test.log( @@ -167,7 +167,7 @@ chrome.webNavigation.getAllFrames({ tabId: testTab.id }, function(details) { - var frames = details.filter(function(frame) { + const frames = details.filter(function(frame) { return /\?testSendMessageFromFrame1$/.test(frame.url); }); chrome.test.assertEq(1, frames.length); @@ -189,7 +189,7 @@ chrome.webNavigation.getAllFrames({ tabId: testTab.id }, function(details) { - var frames = details.filter(function(frame) { + const frames = details.filter(function(frame) { return /\?testSendMessageFromFrame1$/.test(frame.url); }); chrome.test.assertEq(1, frames.length); @@ -203,7 +203,7 @@ chrome.webNavigation.getAllFrames({ tabId: testTab.id }, function(details) { - var frames = details.filter(function(frame) { + const frames = details.filter(function(frame) { return /\?testSendMessageFromFrame1$/.test(frame.url); }); chrome.test.assertEq(1, frames.length); @@ -218,7 +218,7 @@ chrome.webNavigation.getAllFrames({ tabId: testTab.id }, function(details) { - var frames = details.filter(function(frame) { + const frames = details.filter(function(frame) { return /\?testSendMessageFromFrame1$/.test(frame.url); }); chrome.test.assertEq(1, frames.length); @@ -250,10 +250,10 @@ } ); - var port = chrome.tabs.connect(testTab.id); + const port = chrome.tabs.connect(testTab.id); port.postMessage({testSendMessageFromTabError: true}); port.disconnect(); - chrome.test.log("testSendMessageFromTabError: send 1st message to tab"); + chrome.test.log('testSendMessageFromTabError: send 1st message to tab'); }, // Tests error handling when connecting to an invalid extension from a @@ -267,10 +267,10 @@ } ); - var port = chrome.tabs.connect(testTab.id); + const port = chrome.tabs.connect(testTab.id); port.postMessage({testConnectFromTabError: true}); port.disconnect(); - chrome.test.log("testConnectFromTabError: sent 1st message to tab"); + chrome.test.log('testConnectFromTabError: sent 1st message to tab'); }, // Tests sending a request to a tab and receiving a response. @@ -283,7 +283,7 @@ // Tests that we get the disconnect event when the tab disconnect. function disconnect() { - var port = chrome.tabs.connect(testTab.id); + const port = chrome.tabs.connect(testTab.id); port.postMessage({testDisconnect: true}); listenOnce(port.onDisconnect, function() {}); }, @@ -310,7 +310,7 @@ chrome.test.assertEq('testConnectChildFrameAndNavigateSetupDone', msg); // Now we have set up a frame and ensured that there is no onConnect // handler in the main frame. Run the actual test: - var port = chrome.tabs.connect(testTab.id); + const port = chrome.tabs.connect(testTab.id); listenOnce(port.onDisconnect, function() {}); port.postMessage({testConnectChildFrameAndNavigate: true}); }); @@ -320,7 +320,7 @@ // The previous test removed the onConnect listener. Add it back. function reloadTabForTest() { - var doneListening = listenForever(chrome.tabs.onUpdated, + const doneListening = listenForever(chrome.tabs.onUpdated, function(tabId, info) { if (tabId === testTab.id && info.status == 'complete') { doneListening(); @@ -345,7 +345,7 @@ portFromTab.postMessage('unloadTabContent'); }); - var port = chrome.tabs.connect(testTab.id); + const port = chrome.tabs.connect(testTab.id); port.postMessage({ testDisconnectOnClose: true }); listenOnce(port.onDisconnect, function () { testTab = null; // the tab is about:blank now. @@ -354,9 +354,9 @@ // Tests that the sendRequest API is disabled. function sendRequest() { - var error; + let error; try { - chrome.extension.sendRequest("hi"); + chrome.extension.sendRequest('hi'); } catch(e) { error = e; } @@ -378,7 +378,7 @@ // like localStorage changed listeners. // Regression test for http://crbug.com/479951. function sendMessageToCurrentContextFails() { - var stopFailing = failWhileListening(chrome.runtime.onMessage); + const stopFailing = failWhileListening(chrome.runtime.onMessage); chrome.runtime.sendMessage('ping', chrome.test.callbackFail( 'Could not establish connection. Receiving end does not exist.', function() { @@ -422,14 +422,14 @@ }); function connectToTabWithOptions(options, expectedMessages) { - var port = chrome.tabs.connect(testTab.id, options); - var messages = []; - var isDone = false; + const port = chrome.tabs.connect(testTab.id, options); + const messages = []; + let isDone = false; port.onMessage.addListener(function(message) { if (isDone) { // Should not get any messages after completing the test. chrome.test.fail( - 'Unexpected message from port to frame ' + JSON.stringify(options) + - ': ' + message); + `Unexpected message from port to frame ${JSON.stringify(options)}:` + + ` ${message}`); return; } @@ -465,12 +465,12 @@ // Listens to |event| and returns a callback to run to stop listening. While // listening, if |event| is fired, calls chrome.test.fail(). function failWhileListening(event, doneListening) { - var failListener = function() { + const failListener = function() { chrome.test.fail('Event listener ran, but it shouldn\'t have. ' + 'It\'s possible that may be triggered flakily, but this ' + 'really is a real failure, not flaky sadness. Promise!'); }; - var release = chrome.test.callbackAdded(); + const release = chrome.test.callbackAdded(); event.addListener(failListener); return function() { event.removeListener(failListener); @@ -485,9 +485,9 @@ // testSendMessageFromSandboxedFrame() adds 2 sandboxed frames that are given // frameIds in the order in which they were added. Make sure we are checking // the correct frames and excluding the main frame. - var minFrameId = isSandbox ? 2 : 0; - var actualSenders = []; - var doneListening = listenForever( + const minFrameId = isSandbox ? 2 : 0; + const actualSenders = []; + const doneListening = listenForever( chrome.runtime.onMessage, function(request, sender, sendResponse) { actualSenders.push(sender); @@ -501,7 +501,7 @@ function sortByFrameId(a, b) { return a.frameId < b.frameId ? 1 : -1; } - var expectedSenders = + const expectedSenders = details .filter(function(frame) { return frame.frameId > minFrameId;
diff --git a/chrome/test/data/extensions/api_test/messaging/connect_crash/page.js b/chrome/test/data/extensions/api_test/messaging/connect_crash/page.js index 6e47eab..c7fbe62 100644 --- a/chrome/test/data/extensions/api_test/messaging/connect_crash/page.js +++ b/chrome/test/data/extensions/api_test/messaging/connect_crash/page.js
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -var port = chrome.runtime.connect(); +const port = chrome.runtime.connect(); port.onDisconnect.addListener(function() { chrome.test.fail('onDisconnect should not be triggered because the ' + 'background page exists and the tab should have been crashed'); }); -var ref; +let ref; chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) { chrome.test.assertEq('Rob says hi', msg); port.postMessage('is_ready_to_crash');
diff --git a/chrome/test/data/extensions/api_test/messaging/connect_crash/test.js b/chrome/test/data/extensions/api_test/messaging/connect_crash/test.js index 4e56f521..c091152 100644 --- a/chrome/test/data/extensions/api_test/messaging/connect_crash/test.js +++ b/chrome/test/data/extensions/api_test/messaging/connect_crash/test.js
@@ -3,19 +3,19 @@ // found in the LICENSE file. chrome.runtime.onConnect.addListener(function(port) { - var is_ready_to_crash = false; - var succeed1 = chrome.test.callbackAdded(); - var succeed2 = chrome.test.callbackAdded(); + let isReadyToCrash = false; + const succeed1 = chrome.test.callbackAdded(); + const succeed2 = chrome.test.callbackAdded(); port.onMessage.addListener(function(msg) { chrome.test.assertEq('is_ready_to_crash', msg); - is_ready_to_crash = true; + isReadyToCrash = true; chrome.test.sendMessage('ready_to_crash'); // Now the browser test should kill the tab, and the port should be closed. }); port.onDisconnect.addListener(function() { chrome.test.log('port.onDisconnect was triggered.'); - chrome.test.assertTrue(is_ready_to_crash); + chrome.test.assertTrue(isReadyToCrash); succeed1(); });
diff --git a/chrome/test/data/extensions/api_test/messaging/connect_fenced_frames/test.js b/chrome/test/data/extensions/api_test/messaging/connect_fenced_frames/test.js index 2fb994b..d408c7b3 100644 --- a/chrome/test/data/extensions/api_test/messaging/connect_fenced_frames/test.js +++ b/chrome/test/data/extensions/api_test/messaging/connect_fenced_frames/test.js
@@ -2,26 +2,26 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -var listenOnce = chrome.test.listenOnce; -var listenForever = chrome.test.listenForever; +const listenOnce = chrome.test.listenOnce; +const listenForever = chrome.test.listenForever; // Keep track of the tab that we're running tests in, for simplicity. -var testTab = null; +let testTab = null; -var serverOrigin; -var serverURL; +let serverOrigin; +let serverURL; -var tests = [ +const tests = [ // Tests that sendMessage from the fenced frame works. async function sendMessageFromTab() { - const url = serverURL + 'main.html'; + const url = `${serverURL}main.html`; // Because there is no way to observe that a fenced frame has loaded we // need to first wait for a message from the fenced frame indicating it // has loaded. To avoid racy behavior we first bind a listener, then load // the tab and wait for that message. let actualSender; - let messagePromise = new Promise((resolve) => { + const messagePromise = new Promise((resolve) => { chrome.runtime.onMessage.addListener( function messageListener(message, sender) { chrome.test.assertEq(message.connected, true); @@ -43,7 +43,7 @@ chrome.test.assertNe(undefined, actualSender.documentId); chrome.test.assertNe(undefined, actualSender.frameId); chrome.test.assertEq('active', actualSender.documentLifecycle); - chrome.test.assertEq(serverURL + 'fenced_frame.html', actualSender.url); + chrome.test.assertEq(`${serverURL}fenced_frame.html`, actualSender.url); chrome.test.assertEq(serverOrigin, actualSender.origin); chrome.test.assertEq(chrome.runtime.id, actualSender.id); chrome.test.succeed(); @@ -51,7 +51,7 @@ // Tests that postMessage to the fenced frame and its response works. function postMessage() { - var port = chrome.tabs.connect(testTab.id); + const port = chrome.tabs.connect(testTab.id); port.postMessage({testPostMessage: true}); listenOnce(port.onMessage, function(msg) { port.disconnect(); @@ -60,7 +60,7 @@ // Tests that we get the disconnect event when the tab disconnect. function disconnect() { - var port = chrome.tabs.connect(testTab.id); + const port = chrome.tabs.connect(testTab.id); port.postMessage({testDisconnect: true}); listenOnce(port.onDisconnect, function() {}); } @@ -68,7 +68,7 @@ chrome.test.getConfig(async (config) => { serverOrigin = `http://localhost:${config.testServer.port}`; - serverURL = serverOrigin + '/extensions/api_test/messaging/' + + serverURL = `${serverOrigin}/extensions/api_test/messaging/` + 'connect_fenced_frames/'; chrome.test.runTests(tests); });
diff --git a/chrome/test/data/extensions/api_test/messaging/connect_nobackground/contentscript.js b/chrome/test/data/extensions/api_test/messaging/connect_nobackground/contentscript.js index bd2e3b8..0ee9903e 100644 --- a/chrome/test/data/extensions/api_test/messaging/connect_nobackground/contentscript.js +++ b/chrome/test/data/extensions/api_test/messaging/connect_nobackground/contentscript.js
@@ -7,6 +7,6 @@ sendResponse('Reply here'); }); -var port = chrome.runtime.connect(); +const port = chrome.runtime.connect(); port.postMessage('Hello from content script'); port.disconnect();
diff --git a/chrome/test/data/extensions/api_test/messaging/connect_nobackground/test.js b/chrome/test/data/extensions/api_test/messaging/connect_nobackground/test.js index 33726a0..c499ce7 100644 --- a/chrome/test/data/extensions/api_test/messaging/connect_nobackground/test.js +++ b/chrome/test/data/extensions/api_test/messaging/connect_nobackground/test.js
@@ -3,9 +3,9 @@ // found in the LICENSE file. chrome.runtime.onConnect.addListener(function(port) { - var succeed1 = chrome.test.callbackAdded(); - var succeed2 = chrome.test.callbackAdded(); - var succeed3 = chrome.test.callbackAdded(); + const succeed1 = chrome.test.callbackAdded(); + const succeed2 = chrome.test.callbackAdded(); + const succeed3 = chrome.test.callbackAdded(); port.onMessage.addListener(function(msg) { chrome.test.log('port.onMessage was triggered.'); @@ -26,7 +26,7 @@ }); chrome.test.getConfig(function(config) { - var url = 'http://localhost:' + config.testServer.port + + const url = `http://localhost:${config.testServer.port}` + '/extensions/test_file.html?will_test_connect_and_sendMessage'; // Content script will try to connect and trigger onConnect. chrome.tabs.create({
diff --git a/chrome/test/data/extensions/api_test/messaging/connect_panel/test.js b/chrome/test/data/extensions/api_test/messaging/connect_panel/test.js index 13f44f6..b195f76 100644 --- a/chrome/test/data/extensions/api_test/messaging/connect_panel/test.js +++ b/chrome/test/data/extensions/api_test/messaging/connect_panel/test.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -var panelWindowId = 0; +let panelWindowId = 0; chrome.test.runTests([ function openPanelThatConnectsToExtension() { @@ -11,7 +11,7 @@ chrome.test.assertTrue(port.sender.tab.id > 0); }); chrome.windows.create( - { 'url': chrome.runtime.getURL('panel.html'), 'type': 'panel' }, + { url: chrome.runtime.getURL('panel.html'), type: 'panel' }, chrome.test.callbackPass(function(win) { chrome.test.assertEq('panel', win.type); panelWindowId = win.id;
diff --git a/chrome/test/data/extensions/api_test/messaging/event_url/test.js b/chrome/test/data/extensions/api_test/messaging/event_url/test.js index c452306d..08b49e3 100644 --- a/chrome/test/data/extensions/api_test/messaging/event_url/test.js +++ b/chrome/test/data/extensions/api_test/messaging/event_url/test.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -var messages = []; +const messages = []; function messageReceived(data) { messages.push(data); @@ -10,12 +10,12 @@ function evaluateMessages() { if (messages.length != 3) - chrome.test.notifyFail("Got " + messages.length + " messages instead of 3"); - else if (messages[0] != "no restriction" || - messages[1] != "http://a.com/" || - messages[2] != "last message") - chrome.test.notifyFail("Got wrong messages: " + messages[0] + ", " + - messages[1] + ", " + messages[2]); + chrome.test.notifyFail(`Got ${messages.length} messages instead of 3`); + else if (messages[0] != 'no restriction' || + messages[1] != 'http://a.com/' || + messages[2] != 'last message') + chrome.test.notifyFail(`Got wrong messages: ${messages[0]}, ` + + `${messages[1]}, ${messages[2]}`); else chrome.test.notifyPass(); }
diff --git a/chrome/test/data/extensions/api_test/messaging/externally_connectable/sites/assertions.js b/chrome/test/data/extensions/api_test/messaging/externally_connectable/sites/assertions.js index 22cfaf68..6eb3fce 100644 --- a/chrome/test/data/extensions/api_test/messaging/externally_connectable/sites/assertions.js +++ b/chrome/test/data/extensions/api_test/messaging/externally_connectable/sites/assertions.js
@@ -5,20 +5,29 @@ (function() { // We are going to kill all of the builtins, so hold onto the ones we need. -var defineProperty = Object.defineProperty; -var Error = window.Error; -var forEach = Array.prototype.forEach; -var push = Array.prototype.push; -var hasOwnProperty = Object.prototype.hasOwnProperty; -var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; -var getOwnPropertyNames = Object.getOwnPropertyNames; -var stringify = JSON.stringify; +const defineProperty = Object.defineProperty; +const Error = window.Error; +const forEach = Array.prototype.forEach; +const push = Array.prototype.push; +const hasOwnProperty = Object.prototype.hasOwnProperty; +const getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; +const getOwnPropertyNames = Object.getOwnPropertyNames; +const stringify = JSON.stringify; // Kill all of the builtins functions to give us a fairly high confidence that // the environment our bindings run in can't interfere with our code. // These are taken from the ECMAScript spec. -var builtinTypes = [ - Object, Function, Array, String, Boolean, Number, Math, Date, RegExp, JSON, +const builtinTypes = [ + Object, + Function, + Array, + String, + Boolean, + Number, + Math, + Date, + RegExp, + JSON, ]; function clobber(obj, name, qualifiedName) { @@ -41,47 +50,46 @@ qualifiedName == 'Object.valueOf') { return; } - var desc = getOwnPropertyDescriptor(obj, name); + const desc = getOwnPropertyDescriptor(obj, name); if (!desc.configurable) return; - var new_desc; + let newDesc; if (desc.get || desc.set || typeof desc.value !== 'function') { - new_desc = - { get: function() { - throw new Error('Clobbered ' + qualifiedName + ' getter'); - }, - set: function(x) { - throw new Error('Clobbered ' + qualifiedName + ' setter'); - }, - }; + newDesc = { + get: function() { + throw new Error(`Clobbered ${qualifiedName} getter`); + }, + set: function(x) { + throw new Error(`Clobbered ${qualifiedName} setter`); + }, + }; } else { - new_desc = - { value: function() { - throw new Error('Clobbered ' + qualifiedName + ' function'); - } - }; + newDesc = { + value: function() { + throw new Error(`Clobbered ${qualifiedName} function`); + } + }; } - defineProperty(obj, name, new_desc); + defineProperty(obj, name, newDesc); } forEach.call(builtinTypes, function(builtin) { - var prototype = builtin.prototype; - var typename = '<unknown>'; + const prototype = builtin.prototype; + const typename = prototype ? prototype.constructor.name : '<unknown>'; if (prototype) { - typename = prototype.constructor.name; forEach.call(getOwnPropertyNames(prototype), function(name) { - clobber(prototype, name, typename + '.' + name); + clobber(prototype, name, `${typename}.${name}`); }); } forEach.call(getOwnPropertyNames(builtin), function(name) { - clobber(builtin, name, typename + '.' + name); + clobber(builtin, name, `${typename}.${name}`); }); if (builtin.name) - clobber(window, builtin.name, 'window.' + builtin.name); + clobber(window, builtin.name, `window.${builtin.name}`); }); // Codes for test results. Must match ExternallyConnectableMessagingTest::Result // in c/b/extensions/extension_messages_apitest.cc. -var results = { +const results = { OK: 0, NAMESPACE_NOT_DEFINED: 1, FUNCTION_NOT_DEFINED: 2, @@ -99,17 +107,17 @@ } // Make the messages sent vaguely complex, but unambiguously JSON-ifiable. -var kMessage = [{'a': {'b': 10}}, 20, 'c\x10\x11']; +const kMessage = [{a: {b: 10}}, 20, 'c\x10\x11']; // Text of the error message set in |chrome.runtime.lastError| when the // messaging target does not exist. -var kCouldNotEstablishConnection = +const kCouldNotEstablishConnection = 'Could not establish connection. Receiving end does not exist.'; // Our tab's location. Normally this would be our document's location but if // we're an iframe it will be the location of the parent - in which case, // expect to be told. -var tabLocationHref = null; +let tabLocationHref = null; if (parent == window) { tabLocationHref = document.location.href; @@ -132,7 +140,7 @@ // MessageSender (with the tab field stripped down). // // First check the sender was correct. - var incorrectSender = false; + let incorrectSender = false; if (!isApp) { // Only extensions get access to a 'tab' property. if (!hasOwnProperty.call(response.sender, 'tab')) { @@ -140,18 +148,18 @@ incorrectSender = true; } if (response.sender.tab.url != tabLocationHref) { - console.warn('Expected tab url ' + tabLocationHref + ' got ' + - response.sender.tab.url); + console.warn( + `Expected tab url ${tabLocationHref} got ${response.sender.tab.url}`); incorrectSender = true; } } if (hasOwnProperty.call(response.sender, 'id')) { - console.warn('Expected no id, got "' + response.sender.id + '"'); + console.warn(`Expected no id, got "${response.sender.id}"`); incorrectSender = true; } if (response.sender.url != document.location.href) { - console.warn('Expected url ' + document.location.href + ' got ' + - response.sender.url); + console.warn( + `Expected url ${document.location.href} got ${response.sender.url}`); incorrectSender = true; } if (incorrectSender) { @@ -159,11 +167,11 @@ } // Check the correct content was echoed. - var expectedJson = stringify(expectedMessage); - var actualJson = stringify(response.message); + const expectedJson = stringify(expectedMessage); + const actualJson = stringify(response.message); if (actualJson == expectedJson) return; - console.warn('Expected message ' + expectedJson + ' got ' + actualJson); + console.warn(`Expected message ${expectedJson} got ${actualJson}`); throw new ResultError(results.INCORRECT_RESPONSE_MESSAGE); } @@ -172,7 +180,7 @@ // TLS channel ID string from the same value, they require the result code // to be sent as a string. // String() is clobbered, so coerce string creation with +. - return "" + result; + return '' + result; } function checkRuntime() { @@ -199,7 +207,7 @@ window.actions = { appendIframe: function(src) { - var iframe = document.createElement('iframe'); + const iframe = document.createElement('iframe'); // When iframe has loaded, notify it of our tab location (probably // document.location) to use in its assertions, then continue. return new Promise(resolve => { @@ -237,11 +245,11 @@ } async function canConnectAndSendMessages() { - var port = chrome.runtime.connect(extensionId); + const port = chrome.runtime.connect(extensionId); return new Promise((resolve) => { port.postMessage(message); port.postMessage(message); - var pendingResponses = 2; + let pendingResponses = 2; port.onMessage.addListener(function(response) { pendingResponses--; checkResponse(response, message, isApp); @@ -290,7 +298,7 @@ } catch (e) { return true; } - console.error('Function did not throw exception: ' + fun); + console.error(`Function did not throw exception: ${fun}`); return false; } return runIllegalFunction(chrome.runtime.connect) && @@ -319,11 +327,11 @@ }, areAnyRuntimePropertiesDefined: function(names) { - var result = false; + let result = false; if (chrome.runtime) { forEach.call(names, function(name) { if (chrome.runtime[name]) { - console.log('runtime.' + name + ' is defined'); + console.log(`runtime.${name} is defined`); result = true; } }); @@ -331,8 +339,8 @@ return result; }, - getTlsChannelIdFromPortConnect: function(extensionId, includeTlsChannelId, - message) { + getTlsChannelIdFromPortConnect: function( + extensionId, includeTlsChannelId, message) { try { checkRuntime(); } catch (err) { @@ -345,16 +353,16 @@ if (!message) message = kMessage; - var port = chrome.runtime.connect(extensionId, - {'includeTlsChannelId': includeTlsChannelId}); + const port = chrome.runtime.connect( + extensionId, {includeTlsChannelId: includeTlsChannelId}); return new Promise(resolve => { port.onMessage.addListener(resolve); port.postMessage(message); }).then(checkTlsChannelIdResponse); }, - getTlsChannelIdFromSendMessage: function(extensionId, includeTlsChannelId, - message) { + getTlsChannelIdFromSendMessage: function( + extensionId, includeTlsChannelId, message) { try { checkRuntime(); } catch (err) { @@ -368,10 +376,11 @@ message = kMessage; return new Promise(resolve => { - chrome.runtime.sendMessage(extensionId, message, - {'includeTlsChannelId': includeTlsChannelId}, - resolve); - }).then(checkTlsChannelIdResponse); + chrome.runtime.sendMessage( + extensionId, message, + {includeTlsChannelId: includeTlsChannelId}, resolve); + }) + .then(checkTlsChannelIdResponse); } };
diff --git a/chrome/test/data/extensions/api_test/messaging/interstitial_component/background.js b/chrome/test/data/extensions/api_test/messaging/interstitial_component/background.js index 1cd8575..e7e4906 100644 --- a/chrome/test/data/extensions/api_test/messaging/interstitial_component/background.js +++ b/chrome/test/data/extensions/api_test/messaging/interstitial_component/background.js
@@ -4,8 +4,8 @@ // This port is opened by a content script in an interstitial. This is used by // the tests to drive the tests. -var testPort; -var testPortPromise = new Promise(function(resolve) { +let testPort; +const testPortPromise = new Promise(function(resolve) { chrome.test.listenOnce(chrome.runtime.onConnect, function(port) { testPort = port; resolve(); @@ -27,8 +27,8 @@ chrome.test.assertTrue(port.sender.url.startsWith('data:')); } -var httpsTabId; -var httpsTabIdPromise = new Promise(function(resolve) { +let httpsTabId; +const httpsTabIdPromise = new Promise(function(resolve) { // The test runner will open a https page after loading the extension. chrome.tabs.onUpdated.addListener(function listener(tabId, changeInfo, tab) { if (tab.url.startsWith('https://')) { @@ -64,9 +64,9 @@ function(msg, sender, sendResponse) { chrome.test.assertEq('First from interstitial', msg); - var kResponse = 'hello me!'; + const kResponse = 'hello me!'; chrome.test.listenOnce(chrome.runtime.onMessage, function(msg) { - chrome.test.assertEq('interstitial received: ' + kResponse, msg); + chrome.test.assertEq(`interstitial received: ${kResponse}`, msg); }); sendResponse(kResponse); });
diff --git a/chrome/test/data/extensions/api_test/messaging/interstitial_component/contentscript.js b/chrome/test/data/extensions/api_test/messaging/interstitial_component/contentscript.js index af5ae917..ecdfaa8 100644 --- a/chrome/test/data/extensions/api_test/messaging/interstitial_component/contentscript.js +++ b/chrome/test/data/extensions/api_test/messaging/interstitial_component/contentscript.js
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -var testPort = chrome.runtime.connect({ +const testPort = chrome.runtime.connect({ name: 'port from interstitial' }); -var currentTest; +let currentTest; testPort.onMessage.addListener(function(msg) { console.assert(!currentTest, 'Should only run one test at a time'); currentTest = msg; @@ -18,7 +18,7 @@ } else if (msg === 'testDisconnectByInterstitial') { testDisconnectByInterstitial(); } else { - done('Unexpected test: ' + msg); + done(`Unexpected test: ${msg}`); } }); @@ -30,13 +30,13 @@ function testSendMessage() { chrome.runtime.sendMessage('First from interstitial', function(msg) { - chrome.runtime.sendMessage('interstitial received: ' + msg); + chrome.runtime.sendMessage(`interstitial received: ${msg}`); done('testSendMessage'); }); } function testDisconnectByBackground() { - var port = chrome.runtime.connect({ + const port = chrome.runtime.connect({ name: 'disconnect by background' }); port.onDisconnect.addListener(function() { @@ -45,7 +45,7 @@ } function testDisconnectByInterstitial() { - var port = chrome.runtime.connect({ + const port = chrome.runtime.connect({ name: 'disconnect by interstitial' }); port.disconnect();
diff --git a/chrome/test/data/extensions/api_test/messaging/large_messages/background.js b/chrome/test/data/extensions/api_test/messaging/large_messages/background.js index 1d98857..5f679aed 100644 --- a/chrome/test/data/extensions/api_test/messaging/large_messages/background.js +++ b/chrome/test/data/extensions/api_test/messaging/large_messages/background.js
@@ -4,11 +4,11 @@ try { // Passing super-large messages should be prevented by the renderer. - var tooLarge = 1024 * 1024 * 128; + const tooLarge = 1024 * 1024 * 128; chrome.runtime.sendMessage('a'.repeat(tooLarge)); chrome.test.notifyFail(); } catch (e) { - let expected = /Message exceeded maximum allowed size of 64MiB/; + const expected = /Message exceeded maximum allowed size of 64MiB/; chrome.test.assertTrue(expected.test(e.message), e.message); chrome.test.notifyPass(); }
diff --git a/chrome/test/data/webui/chromeos/settings/os_search_page/search_engine_test.ts b/chrome/test/data/webui/chromeos/settings/os_search_page/search_engine_test.ts index e9ae7d7d..3892a81 100644 --- a/chrome/test/data/webui/chromeos/settings/os_search_page/search_engine_test.ts +++ b/chrome/test/data/webui/chromeos/settings/os_search_page/search_engine_test.ts
@@ -14,7 +14,6 @@ suite(`<${SettingsSearchEngineElement.is}>`, () => { let searchEngineElement: SettingsSearchEngineElement; let browserProxy: TestSearchEnginesBrowserProxy; - let searchEngineInfo: SearchEnginesInfo; function createSampleSearchEngine(props: Partial<SearchEngine>): SearchEngine { @@ -28,7 +27,6 @@ id: 0, isOmniboxExtension: false, keyword: 'google.com', - modelIndex: 0, name: '', url: 'https://search.foo.com/search?p=%s', urlLocked: false, @@ -40,12 +38,12 @@ const searchEngines0 = createSampleSearchEngine({ default: true, displayName: 'SearchEngine0', - modelIndex: 0, + id: 0, name: 'SearchEngine0', }); const searchEngines1 = createSampleSearchEngine({ displayName: 'SearchEngine1', - modelIndex: 1, + id: 1, name: 'SearchEngine1', }); @@ -62,8 +60,8 @@ isQuickAnswersSupported: false, }); - searchEngineInfo = generateSearchEngineInfo(); - browserProxy = new TestSearchEnginesBrowserProxy(searchEngineInfo); + browserProxy = new TestSearchEnginesBrowserProxy(); + browserProxy.setSearchEnginesInfo(generateSearchEngineInfo()); SearchEnginesBrowserProxyImpl.setInstanceForTesting(browserProxy); clearBody();
diff --git a/chrome/test/data/webui/chromeos/settings/os_search_page/test_search_engines_browser_proxy.ts b/chrome/test/data/webui/chromeos/settings/os_search_page/test_search_engines_browser_proxy.ts index 7bde79c..522d70d 100644 --- a/chrome/test/data/webui/chromeos/settings/os_search_page/test_search_engines_browser_proxy.ts +++ b/chrome/test/data/webui/chromeos/settings/os_search_page/test_search_engines_browser_proxy.ts
@@ -2,24 +2,54 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import type {SearchEnginesBrowserProxy, SearchEnginesInfo} from 'chrome://os-settings/os_settings.js'; +import type {CategorizedTemplateUrls, SearchEnginesBrowserProxy, SearchEnginesInfo} from 'chrome://os-settings/os_settings.js'; import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js'; export class TestSearchEnginesBrowserProxy extends TestBrowserProxy implements SearchEnginesBrowserProxy { - constructor(private searchEngineInfo: SearchEnginesInfo) { + private categorizedTemplateUrls_: CategorizedTemplateUrls = { + activeSiteShortcuts: [], + inactiveSiteShortcuts: [], + activeFeatureShortcuts: [], + inactiveFeatureShortcuts: [], + }; + + private searchEnginesInfo_: SearchEnginesInfo = + {defaults: [], actives: [], others: [], extensions: []}; + + constructor() { super([ + 'getCategorizedTemplateUrls', 'getSearchEnginesList', 'openBrowserSearchSettings', ]); } + getCategorizedTemplateUrls() { + this.methodCalled('getCategorizedTemplateUrls'); + return Promise.resolve(this.categorizedTemplateUrls_); + } + getSearchEnginesList(): Promise<SearchEnginesInfo> { this.methodCalled('getSearchEnginesList'); - return Promise.resolve(this.searchEngineInfo); + return Promise.resolve(this.searchEnginesInfo_); } openBrowserSearchSettings(): void { this.methodCalled('openBrowserSearchSettings'); } + + /** + * Sets the response to be returned by `getCategorizedTemplateUrls`. + */ + setCategorizedTemplateUrls(categorizedTemplateUrls: CategorizedTemplateUrls) { + this.categorizedTemplateUrls_ = categorizedTemplateUrls; + } + + /** + * Sets the response to be returned by `getSearchEnginesList`. + */ + setSearchEnginesInfo(searchEnginesInfo: SearchEnginesInfo) { + this.searchEnginesInfo_ = searchEnginesInfo; + } }
diff --git a/chrome/test/data/webui/contextual_tasks/composebox_misc_inputs_test.ts b/chrome/test/data/webui/contextual_tasks/composebox_misc_inputs_test.ts index bfdf0da6..2b23524 100644 --- a/chrome/test/data/webui/contextual_tasks/composebox_misc_inputs_test.ts +++ b/chrome/test/data/webui/contextual_tasks/composebox_misc_inputs_test.ts
@@ -11,7 +11,7 @@ import type {ComposeboxElement} from 'chrome://resources/cr_components/composebox/composebox.js'; import {PageCallbackRouter as ComposeboxPageCallbackRouter, PageHandlerRemote as ComposeboxPageHandlerRemote} from 'chrome://resources/cr_components/composebox/composebox.mojom-webui.js'; import {ComposeboxProxyImpl} from 'chrome://resources/cr_components/composebox/composebox_proxy.js'; -import {ContextUploadStatus, InputType, ToolMode as ComposeboxToolMode} from 'chrome://resources/cr_components/composebox/composebox_query.mojom-webui.js'; +import {ContextUploadStatus, InputType, ToolMode} from 'chrome://resources/cr_components/composebox/composebox_query.mojom-webui.js'; import type {ComposeboxVoiceSearchElement} from 'chrome://resources/cr_components/composebox/composebox_voice_search.js'; import type {ComposeboxFileCarouselElement} from 'chrome://resources/cr_components/composebox/file_carousel.js'; import type {ComposeboxFileThumbnailElement} from 'chrome://resources/cr_components/composebox/file_thumbnail.js'; @@ -157,7 +157,7 @@ let mockTimer: MockTimer; let metrics: MetricsTracker; - async function setActiveTool(tool: ComposeboxToolMode) { + async function setActiveTool(tool: ToolMode) { searchboxCallbackRouterRemote.onInputStateChanged({ ...mockInputState, activeTool: tool, @@ -429,7 +429,7 @@ 'Voice search transcript should be updated with voice result'); assertEquals( - '', composebox.input, + '', composebox.input_, 'Composebox input should be empty if not final result'); assertEquals( @@ -459,7 +459,7 @@ assertEquals( - 'hellogoodbye', composebox.input, + 'hellogoodbye', composebox.input_, 'Composebox input should be updated with final result'); assertEquals( @@ -532,7 +532,7 @@ 'Transcript should be updated immediately on result'); assertEquals( - '', composebox.input, + '', composebox.input_, 'Input should not be updated in composebox without final result'); callback(); @@ -548,7 +548,7 @@ assertEquals( composebox.animationState, GlowAnimationState.SUBMITTING, 'Query is submitted via submitQuery_()'); - assertEquals(composebox.input, '', 'Input should be cleared after submit'); + assertEquals(composebox.input_, '', 'Input should be cleared after submit'); assertEquals( '', voiceSearchInput.value, @@ -687,20 +687,20 @@ }); interface ToolModeInfo { - toolMode: ComposeboxToolMode; + toolMode: ToolMode; text: string; } [{ - toolMode: ComposeboxToolMode.kDeepSearch, + toolMode: ToolMode.kDeepSearch, text: 'Deep Search', }, { - toolMode: ComposeboxToolMode.kImageGen, + toolMode: ToolMode.kImageGen, text: 'Create Images', }, { - toolMode: ComposeboxToolMode.kCanvas, + toolMode: ToolMode.kCanvas, text: 'Canvas', }].forEach((toolModeInfo: ToolModeInfo) => { test( @@ -721,7 +721,7 @@ })); await setActiveTool(toolModeInfo.toolMode); assertEquals( - toolModeInfo.toolMode, composebox.inputState.activeTool, + toolModeInfo.toolMode, composebox.inputState_.activeTool, 'Active tool should be' + toolModeInfo.text + ' after clicking tool'); await contextEntrypoint.dispatchEvent(new CustomEvent('tool-click', { @@ -730,11 +730,10 @@ composed: true, })); - await setActiveTool(ComposeboxToolMode.kUnspecified); + await setActiveTool(ToolMode.kUnspecified); assertEquals( - ComposeboxToolMode.kUnspecified, - composebox.inputState.activeTool, + ToolMode.kUnspecified, composebox.inputState_.activeTool, 'Active tool should be unspecified after clicking tool twice'); }); @@ -781,7 +780,7 @@ assertTrue(!!toolChip, toolModeInfo.text + ' chip should be present'); // Simulate cancel button click without having to fully render button. composebox.onCancelClick_(); - await setActiveTool(ComposeboxToolMode.kUnspecified); + await setActiveTool(ToolMode.kUnspecified); await composebox.updateComplete; await microtasksFinished(); @@ -797,7 +796,7 @@ assertTrue(!!toolChip, toolModeInfo.text + ' chip should be present'); composebox.handleEscapeKeyLogic(); - await setActiveTool(ComposeboxToolMode.kUnspecified); + await setActiveTool(ToolMode.kUnspecified); await composebox.updateComplete; await microtasksFinished();
diff --git a/chrome/test/data/webui/contextual_tasks/composebox_submit_test.ts b/chrome/test/data/webui/contextual_tasks/composebox_submit_test.ts index 6e125f710..c4fdcda5 100644 --- a/chrome/test/data/webui/contextual_tasks/composebox_submit_test.ts +++ b/chrome/test/data/webui/contextual_tasks/composebox_submit_test.ts
@@ -464,7 +464,7 @@ await composebox.updateComplete; await microtasksFinished(); - assertEquals(0, composebox.files.size); + assertEquals(0, composebox.files_.size); // Should be no longer `EXPANDING` after successful upload and submit click. assertNotEquals(composebox.animationState, GlowAnimationState.EXPANDING); @@ -480,7 +480,7 @@ ContextUploadStatus.kProcessingSuggestSignalsReady, /*error_type=*/ null, ); - composebox.input = 'test'; + composebox.input_ = 'test'; await searchboxCallbackRouterRemote.$.flushForTesting(); await microtasksFinished(); await composebox.updateComplete; @@ -667,7 +667,7 @@ await composebox.updateComplete; await microtasksFinished(); - assertEquals(0, composebox.files.size); + assertEquals(0, composebox.files_.size); // Should be no longer `EXPANDING` after successful upload and submit click. assertNotEquals(composebox.animationState, GlowAnimationState.EXPANDING); @@ -675,7 +675,7 @@ test('Composebox submit button disabled when uploading tabs', async () => { const callback = (file: ComposeboxFile) => { - composebox.files.set(file.uuid, file); + composebox.files_.set(file.uuid, file); composebox.contextFilesSize_ += 1; composebox.submitEnabled_ = composebox.computeSubmitEnabled_(); composebox.requestUpdate(); @@ -766,7 +766,7 @@ await composebox.updateComplete; await microtasksFinished(); - assertEquals(0, composebox.files.size); + assertEquals(0, composebox.files_.size); // Should be no longer `EXPANDING` after successful upload and submit click. assertNotEquals(composebox.animationState, GlowAnimationState.EXPANDING); @@ -825,12 +825,12 @@ composebox.animationState, GlowAnimationState.SUBMITTING, 'Query is submitted via submitQuery_()'); - assertEquals(0, composebox.files.size); + assertEquals(0, composebox.files_.size); }); test('delayed tabs do not delay submission', async () => { const callback = (file: any) => { - composebox.files.set(file.uuid, file); + composebox.files_.set(file.uuid, file); composebox.contextFilesSize_ = 1; composebox.submitEnabled_ = composebox.computeSubmitEnabled_(); composebox.requestUpdate(); @@ -1100,7 +1100,7 @@ /*supportsUnimodal=*/ false); searchboxCallbackRouterRemote.onContextualInputStatusChanged( FAKE_TOKEN_STRING, ContextUploadStatus.kUploadSuccessful, null); - composebox.input = 'test'; + composebox.input_ = 'test'; // Multiple calls needed to avoid flaking. // TODO(crbug.com/490496860): Investigate removing.
diff --git a/chrome/test/data/webui/contextual_tasks/composebox_test.ts b/chrome/test/data/webui/contextual_tasks/composebox_test.ts index eee6634..771dc9e 100644 --- a/chrome/test/data/webui/contextual_tasks/composebox_test.ts +++ b/chrome/test/data/webui/contextual_tasks/composebox_test.ts
@@ -274,7 +274,7 @@ microtasksFinished(), ]); - assertEquals(0, composebox.files.size); + assertEquals(0, composebox.files_.size); const submitButton: HTMLButtonElement|null = getSubmitButton(composebox); assertTrue(!!submitButton, 'Submit button should exist'); @@ -302,7 +302,7 @@ token1, new File(['foo'], 'foo.jpg', {type: 'image/jpeg'}), composebox, mockSearchboxPageHandler); - const currentFiles = composebox.files; + const currentFiles = composebox.files_; currentFiles.forEach((file: ComposeboxFile) => { file.isDeletable = false; }); @@ -365,7 +365,7 @@ await composebox.updateComplete; await microtasksFinished(); - const currentFiles2 = composebox.files; + const currentFiles2 = composebox.files_; currentFiles2.forEach((file: ComposeboxFile) => { file.isDeletable = false; });
diff --git a/chrome/test/data/webui/contextual_tasks/composebox_zero_state_test.ts b/chrome/test/data/webui/contextual_tasks/composebox_zero_state_test.ts index 4618898..e0d2644 100644 --- a/chrome/test/data/webui/contextual_tasks/composebox_zero_state_test.ts +++ b/chrome/test/data/webui/contextual_tasks/composebox_zero_state_test.ts
@@ -10,7 +10,7 @@ import type {ComposeboxFile} from 'chrome://resources/cr_components/composebox/common.js'; import {PageCallbackRouter as ComposeboxPageCallbackRouter, PageHandlerRemote as ComposeboxPageHandlerRemote} from 'chrome://resources/cr_components/composebox/composebox.mojom-webui.js'; import {ComposeboxProxyImpl} from 'chrome://resources/cr_components/composebox/composebox_proxy.js'; -import {ContextUploadStatus, ToolMode as ComposeboxToolMode} from 'chrome://resources/cr_components/composebox/composebox_query.mojom-webui.js'; +import {ContextUploadStatus, ToolMode} from 'chrome://resources/cr_components/composebox/composebox_query.mojom-webui.js'; import {WindowProxy} from 'chrome://resources/cr_components/composebox/window_proxy.js'; import {GlowAnimationState} from 'chrome://resources/cr_components/search/constants.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; @@ -67,7 +67,7 @@ let windowProxy: TestMock<WindowProxy>; let mockTimer: MockTimer; - async function setActiveTool(tool: ComposeboxToolMode) { + async function setActiveTool(tool: ToolMode) { searchboxCallbackRouterRemote.onInputStateChanged({ ...mockInputState, activeTool: tool, @@ -721,7 +721,7 @@ await composebox.updateComplete; await microtasksFinished(); - assertEquals(0, composebox.files.size); + assertEquals(0, composebox.files_.size); // Should be no longer `EXPANDING` after successful upload and submit // click. @@ -732,26 +732,25 @@ interface ToolModeInfo { - toolMode: ComposeboxToolMode; + toolMode: ToolMode; text: string; } [{ - toolMode: ComposeboxToolMode.kDeepSearch, + toolMode: ToolMode.kDeepSearch, text: 'Deep Search', }, { - toolMode: ComposeboxToolMode.kImageGen, + toolMode: ToolMode.kImageGen, text: 'Create Images', }, { - toolMode: ComposeboxToolMode.kCanvas, + toolMode: ToolMode.kCanvas, text: 'Canvas', }].forEach((toolModeInfo: ToolModeInfo) => { test(toolModeInfo.text + ': thread change resets input', async () => { await setActiveTool(toolModeInfo.toolMode); - await composebox.updateComplete; await microtasksFinished(); @@ -767,7 +766,7 @@ await microtasksFinished(); toolChip = composebox.shadowRoot.querySelector('cr-composebox-tool-chip'); - assertFalse(!!composebox.input, 'Input value should be cleared'); + assertFalse(!!composebox.input_, 'Input value should be cleared'); assertTrue( composebox.fileUploadsComplete, 'File uploads should be complete'); assertFalse(
diff --git a/chrome/test/data/webui/contextual_tasks/test_utils.ts b/chrome/test/data/webui/contextual_tasks/test_utils.ts index 1c2e178..22a22513 100644 --- a/chrome/test/data/webui/contextual_tasks/test_utils.ts +++ b/chrome/test/data/webui/contextual_tasks/test_utils.ts
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {ToolMode as ComposeboxToolMode} from 'chrome://resources/cr_components/composebox/composebox_query.mojom-webui.js'; +import {ToolMode} from 'chrome://resources/cr_components/composebox/composebox_query.mojom-webui.js'; import {createAutocompleteMatch, createAutocompleteResultForTesting} from 'chrome://resources/cr_components/searchbox/searchbox_browser_proxy.js'; import {type PageHandlerRemote as SearchboxPageHandlerRemote, type PageRemote as SearchboxPageRemote} from 'chrome://resources/mojo/components/omnibox/browser/searchbox.mojom-webui.js'; import type {InputState} from 'chrome://resources/mojo/components/omnibox/composebox/composebox_query.mojom-webui.js'; @@ -56,7 +56,7 @@ hintText: '', toolConfigs: [ { - tool: ComposeboxToolMode.kDeepSearch, + tool: ToolMode.kDeepSearch, hintText: '', menuLabel: '', chipLabel: '', @@ -64,7 +64,7 @@ aimUrlParams: [], }, { - tool: ComposeboxToolMode.kImageGen, + tool: ToolMode.kImageGen, hintText: '', menuLabel: '', chipLabel: '', @@ -72,7 +72,7 @@ aimUrlParams: [], }, { - tool: ComposeboxToolMode.kCanvas, + tool: ToolMode.kCanvas, hintText: '', menuLabel: '', chipLabel: '',
diff --git a/chrome/test/data/webui/cr_components/composebox/composebox_drag_drop_test.ts b/chrome/test/data/webui/cr_components/composebox/composebox_drag_drop_test.ts index 75b1784..b27a90fe 100644 --- a/chrome/test/data/webui/cr_components/composebox/composebox_drag_drop_test.ts +++ b/chrome/test/data/webui/cr_components/composebox/composebox_drag_drop_test.ts
@@ -16,7 +16,7 @@ import type {DragAndDropHost} from 'chrome://resources/cr_components/search/drag_drop_host.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {PageCallbackRouter as SearchboxPageCallbackRouter, PageHandlerRemote as SearchboxPageHandlerRemote} from 'chrome://resources/mojo/components/omnibox/browser/searchbox.mojom-webui.js'; -import {InputType, ToolMode as ComposeboxToolMode} from 'chrome://resources/mojo/components/omnibox/composebox/composebox_query.mojom-webui.js'; +import {InputType, ToolMode} from 'chrome://resources/mojo/components/omnibox/composebox/composebox_query.mojom-webui.js'; import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import type {TestMock} from 'chrome://webui-test/test_mock.js'; import {microtasksFinished} from 'chrome://webui-test/test_util.js'; @@ -442,10 +442,9 @@ const contextEntrypoint = composeboxElement.shadowRoot.querySelector('#contextEntrypoint'); assertTrue(!!contextEntrypoint); - contextEntrypoint.dispatchEvent( - new CustomEvent('tool-click', { - detail: {tool: ComposeboxToolMode.kDeepSearch}, - })); + contextEntrypoint.dispatchEvent(new CustomEvent('tool-click', { + detail: {tool: ToolMode.kDeepSearch}, + })); await microtasksFinished(); const imageFile = new File([''], 'test.png', {type: 'image/png'}); @@ -485,10 +484,9 @@ const contextEntrypoint = composeboxElement.shadowRoot.querySelector('#contextEntrypoint'); assertTrue(!!contextEntrypoint); - contextEntrypoint.dispatchEvent( - new CustomEvent('tool-click', { - detail: {tool: ComposeboxToolMode.kImageGen}, - })); + contextEntrypoint.dispatchEvent(new CustomEvent('tool-click', { + detail: {tool: ToolMode.kImageGen}, + })); await microtasksFinished(); // 1. Drop a PDF (should be blocked). @@ -537,10 +535,9 @@ const contextEntrypoint = composeboxElement.shadowRoot.querySelector('#contextEntrypoint'); assertTrue(!!contextEntrypoint); - contextEntrypoint.dispatchEvent( - new CustomEvent('tool-click', { - detail: {tool: ComposeboxToolMode.kCanvas}, - })); + contextEntrypoint.dispatchEvent(new CustomEvent('tool-click', { + detail: {tool: ToolMode.kCanvas}, + })); await microtasksFinished(); // 1. Drop an image.
diff --git a/chrome/test/data/webui/cr_components/composebox/composebox_input_placeholder_test.ts b/chrome/test/data/webui/cr_components/composebox/composebox_input_placeholder_test.ts index e07abbfa..e95acdbc 100644 --- a/chrome/test/data/webui/cr_components/composebox/composebox_input_placeholder_test.ts +++ b/chrome/test/data/webui/cr_components/composebox/composebox_input_placeholder_test.ts
@@ -9,7 +9,7 @@ import type {ComposeboxElement} from 'chrome://resources/cr_components/composebox/composebox.js'; import {PageCallbackRouter, PageHandlerRemote} from 'chrome://resources/cr_components/composebox/composebox.mojom-webui.js'; import {ComposeboxProxyImpl} from 'chrome://resources/cr_components/composebox/composebox_proxy.js'; -import {ContextUploadStatus, ModelMode, ToolMode as ComposeboxToolMode} from 'chrome://resources/cr_components/composebox/composebox_query.mojom-webui.js'; +import {ContextUploadStatus, ModelMode, ToolMode} from 'chrome://resources/cr_components/composebox/composebox_query.mojom-webui.js'; import type {InputState} from 'chrome://resources/cr_components/composebox/composebox_query.mojom-webui.js'; import {WindowProxy} from 'chrome://resources/cr_components/composebox/window_proxy.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; @@ -40,7 +40,7 @@ composebox.state = { text: '', files: [], - mode: ComposeboxToolMode.kUnspecified, + mode: ToolMode.kUnspecified, model: ModelMode.kUnspecified, }; @@ -122,17 +122,17 @@ const toolConfigTestCases = [ { - tool: ComposeboxToolMode.kDeepSearch, + tool: ToolMode.kDeepSearch, hint: 'Research anything', name: 'DeepSearch', }, { - tool: ComposeboxToolMode.kImageGen, + tool: ToolMode.kImageGen, hint: 'Describe your image', name: 'ImageGen', }, { - tool: ComposeboxToolMode.kCanvas, + tool: ToolMode.kCanvas, hint: 'Create anything', name: 'Canvas', }, @@ -186,7 +186,7 @@ await microtasksFinished(); searchboxPageRemote.onInputStateChanged({ ...mockInputState, - activeTool: ComposeboxToolMode.kUnspecified, + activeTool: ToolMode.kUnspecified, }); await searchboxPageRemote.$.flushForTesting(); microtasksFinished();
diff --git a/chrome/test/data/webui/cr_components/cr_components_browsertest.cc b/chrome/test/data/webui/cr_components/cr_components_browsertest.cc index b7ebb80..95d6c87 100644 --- a/chrome/test/data/webui/cr_components/cr_components_browsertest.cc +++ b/chrome/test/data/webui/cr_components/cr_components_browsertest.cc
@@ -122,11 +122,6 @@ RunTest("cr_components/searchbox/searchbox_icon_test.js", "mocha.run()"); } -IN_PROC_BROWSER_TEST_F(CrComponentsSearchboxTest, SearchboxFocusTest) { - set_test_loader_host(chrome::kChromeUINewTabPageHost); - RunTest("cr_components/searchbox/searchbox_focus_test.js", "mocha.run()"); -} - class CrComponentsHistoryClustersTest : public WebUIMochaBrowserTest { protected: CrComponentsHistoryClustersTest() {
diff --git a/chrome/test/data/webui/cr_components/cr_components_interactive_test.cc b/chrome/test/data/webui/cr_components/cr_components_interactive_test.cc index 97fbf5a..0c6ca2c 100644 --- a/chrome/test/data/webui/cr_components/cr_components_interactive_test.cc +++ b/chrome/test/data/webui/cr_components/cr_components_interactive_test.cc
@@ -20,6 +20,11 @@ "mocha.run()"); } +IN_PROC_BROWSER_TEST_F(CrComponentsFocusTest, Searchbox) { + set_test_loader_host(chrome::kChromeUINewTabPageHost); + RunTest("cr_components/searchbox/searchbox_focus_test.js", "mocha.run()"); +} + class CrComponentsHistoryClustersFocusTest : public WebUIMochaFocusTest { protected: CrComponentsHistoryClustersFocusTest() {
diff --git a/chrome/test/data/webui/new_tab_page/app_test.ts b/chrome/test/data/webui/new_tab_page/app_test.ts index b04e61a..5cf8ec7 100644 --- a/chrome/test/data/webui/new_tab_page/app_test.ts +++ b/chrome/test/data/webui/new_tab_page/app_test.ts
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {ActionChipsHandlerRemote, IconType, PageCallbackRouter as ActionChipsPageCallbackRouter, ToolMode} from 'chrome://new-tab-page/action_chips.mojom-webui.js'; +import {ActionChipsHandlerRemote, IconType, PageCallbackRouter as ActionChipsPageCallbackRouter} from 'chrome://new-tab-page/action_chips.mojom-webui.js'; import type {PageRemote as ActionChipsPageRemote, TabInfo} from 'chrome://new-tab-page/action_chips.mojom-webui.js'; import type {CustomizeButtonsDocumentRemote} from 'chrome://new-tab-page/customize_buttons.mojom-webui.js'; import {CustomizeButtonsDocumentCallbackRouter, CustomizeButtonsHandlerRemote, SidePanelOpenTrigger} from 'chrome://new-tab-page/customize_buttons.mojom-webui.js'; @@ -15,7 +15,7 @@ import type {PageRemote} from 'chrome://new-tab-page/new_tab_page.mojom-webui.js'; import {NtpBackgroundImageSource, PageCallbackRouter, PageHandlerRemote} from 'chrome://new-tab-page/new_tab_page.mojom-webui.js'; import {PageCallbackRouter as ComposeboxPageCallbackRouter, PageHandlerRemote as ComposeboxPageHandlerRemote} from 'chrome://resources/cr_components/composebox/composebox.mojom-webui.js'; -import {ToolMode as ComposeboxToolMode} from 'chrome://resources/cr_components/composebox/composebox_query.mojom-webui.js'; +import {ToolMode} from 'chrome://resources/cr_components/composebox/composebox_query.mojom-webui.js'; import type {SearchboxElement} from 'chrome://resources/cr_components/searchbox/searchbox.js'; import type {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.js'; import type {CrToastElement} from 'chrome://resources/cr_elements/cr_toast/cr_toast.js'; @@ -2439,7 +2439,7 @@ assertTrue(!!composebox); assertEquals(1, searchboxHandler.getCallCount('setActiveToolMode')); assertEquals( - ComposeboxToolMode.kImageGen, + ToolMode.kImageGen, searchboxHandler.getArgs('setActiveToolMode')[0]); }); test( @@ -2462,7 +2462,7 @@ assertTrue(!!composebox); assertEquals(1, searchboxHandler.getCallCount('setActiveToolMode')); assertEquals( - ComposeboxToolMode.kDeepSearch, + ToolMode.kDeepSearch, searchboxHandler.getArgs('setActiveToolMode')[0]); }); test('Recent tab chip click opens composebox with context', async () => {
diff --git a/chrome/test/data/webui/new_tab_page/composebox/composebox_context_menu_test.ts b/chrome/test/data/webui/new_tab_page/composebox/composebox_context_menu_test.ts index 34a3ead0..898543d 100644 --- a/chrome/test/data/webui/new_tab_page/composebox/composebox_context_menu_test.ts +++ b/chrome/test/data/webui/new_tab_page/composebox/composebox_context_menu_test.ts
@@ -92,7 +92,7 @@ test('tab changes calls getRecentTabs', async () => { createComposeboxElement(testProxy); loadTimeData.overrideValues({ - realboxLayoutMode: 'TallTopContext', + realboxLayoutMode: 'Compact', composeboxShowRecentTabChip: true, }); const sampleTabs = [ @@ -146,7 +146,7 @@ test('mousedown prevents default when not Compact', async () => { createComposeboxElement(testProxy); - testProxy.element.searchboxLayoutMode = 'TallTopContext'; + testProxy.element.searchboxLayoutMode = 'TallBottomContext'; await testProxy.element.updateComplete; const contextMenuContainer = @@ -188,7 +188,7 @@ 'mousedown does not prevent default when target is not container', async () => { createComposeboxElement(testProxy); - testProxy.element.searchboxLayoutMode = 'TallTopContext'; + testProxy.element.searchboxLayoutMode = 'TallBottomContext'; await testProxy.element.updateComplete; const contextMenuContainer = @@ -212,7 +212,7 @@ test('mouse click prevents default and focuses input', async () => { createComposeboxElement(testProxy); - testProxy.element.searchboxLayoutMode = 'TallTopContext'; + testProxy.element.searchboxLayoutMode = 'TallBottomContext'; await testProxy.element.updateComplete; const contextMenuContainer = @@ -238,7 +238,7 @@ test('mouse click ignores non-primary button', async () => { createComposeboxElement(testProxy); - testProxy.element.searchboxLayoutMode = 'TallTopContext'; + testProxy.element.searchboxLayoutMode = 'TallBottomContext'; await testProxy.element.updateComplete; const contextMenuContainer =
diff --git a/chrome/test/data/webui/new_tab_page/composebox/composebox_test.ts b/chrome/test/data/webui/new_tab_page/composebox/composebox_test.ts index 18dbed5..fbfa171 100644 --- a/chrome/test/data/webui/new_tab_page/composebox/composebox_test.ts +++ b/chrome/test/data/webui/new_tab_page/composebox/composebox_test.ts
@@ -3,7 +3,7 @@ // found in the LICENSE file. import {$$} from 'chrome://new-tab-page/new_tab_page.js'; -import {ModelMode, ToolMode as ComposeboxToolMode} from 'chrome://resources/cr_components/composebox/composebox_query.mojom-webui.js'; +import {ModelMode, ToolMode} from 'chrome://resources/cr_components/composebox/composebox_query.mojom-webui.js'; import {createAutocompleteResultForTesting, createSearchMatchForTesting} from 'chrome://resources/cr_components/searchbox/searchbox_browser_proxy.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import type {SelectedFileInfo} from 'chrome://resources/mojo/components/omnibox/browser/searchbox.mojom-webui.js'; @@ -36,7 +36,7 @@ // Change tool to Deep Search const inputState = Object.assign({}, mockInputState, { - activeTool: ComposeboxToolMode.kDeepSearch, + activeTool: ToolMode.kDeepSearch, }); testProxy.searchboxCallbackRouterRemote.onInputStateChanged(inputState); await testProxy.searchboxCallbackRouterRemote.$.flushForTesting(); @@ -60,7 +60,7 @@ text: 'hello world', files: [{file: new File(['test'], 'test.pdf', {type: 'application/pdf'})}], - mode: ComposeboxToolMode.kDeepSearch, + mode: ToolMode.kDeepSearch, model: ModelMode.kGeminiRegular, }; await testProxy.searchboxHandler.whenCalled(ADD_FILE_CONTEXT_FN); @@ -70,7 +70,7 @@ assertEquals('hello world', composebox.getText()); const activeTool = await testProxy.searchboxHandler.whenCalled('setActiveToolMode'); - assertEquals(ComposeboxToolMode.kDeepSearch, activeTool); + assertEquals(ToolMode.kDeepSearch, activeTool); assertEquals(1, composebox.getNumOfFilesForTesting()); const activeModel = await testProxy.searchboxHandler.whenCalled('setActiveModelMode'); @@ -820,7 +820,7 @@ } as InputState; testProxy.searchboxCallbackRouterRemote.onInputStateChanged(inputState); await microtasksFinished(); - assertDeepEquals((testProxy.element as any).inputState, inputState); + assertDeepEquals((testProxy.element as any).inputState_, inputState); }); test('setDefaultModel uses activeModel from backend', async () => { @@ -865,20 +865,20 @@ // Set active tool mode to DeepSearch. const inputState = Object.assign({}, mockInputState, { - activeTool: ComposeboxToolMode.kDeepSearch, + activeTool: ToolMode.kDeepSearch, }); testProxy.searchboxCallbackRouterRemote.onInputStateChanged(inputState); await testProxy.searchboxCallbackRouterRemote.$.flushForTesting(); await microtasksFinished(); // Click on the same tool mode to deselect/delete it. - testProxy.element['handleToolClick_'](ComposeboxToolMode.kDeepSearch); + testProxy.element['handleToolClick_'](ToolMode.kDeepSearch); await microtasksFinished(); // Assert tool mode is reset. const activeTool = await testProxy.searchboxHandler.whenCalled('setActiveToolMode'); - assertEquals(ComposeboxToolMode.kUnspecified, activeTool); + assertEquals(ToolMode.kUnspecified, activeTool); const metricName = 'ContextualSearch.UserAction.InputStateDeletion.Tool.NewTabPage';
diff --git a/chrome/test/data/webui/new_tab_page/composebox/composebox_upload_test.ts b/chrome/test/data/webui/new_tab_page/composebox/composebox_upload_test.ts index a5c6181..c1cf8b81 100644 --- a/chrome/test/data/webui/new_tab_page/composebox/composebox_upload_test.ts +++ b/chrome/test/data/webui/new_tab_page/composebox/composebox_upload_test.ts
@@ -3,11 +3,10 @@ // found in the LICENSE file. import {$$} from 'chrome://new-tab-page/new_tab_page.js'; -import {ContextUploadErrorType, ContextUploadStatus, InputType, ToolMode as ComposeboxToolMode} from 'chrome://resources/cr_components/composebox/composebox_query.mojom-webui.js'; +import {ContextUploadErrorType, ContextUploadStatus, InputType, ToolMode} from 'chrome://resources/cr_components/composebox/composebox_query.mojom-webui.js'; import {createAutocompleteResultForTesting, createSearchMatchForTesting} from 'chrome://resources/cr_components/searchbox/searchbox_browser_proxy.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import type {TabInfo} from 'chrome://resources/mojo/components/omnibox/browser/searchbox.mojom-webui.js'; -import {ToolMode} from 'chrome://resources/mojo/components/omnibox/browser/searchbox.mojom-webui.js'; import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {eventToPromise, microtasksFinished} from 'chrome://webui-test/test_util.js'; @@ -529,13 +528,13 @@ // Enter create image mode. testProxy.searchboxCallbackRouterRemote.onInputStateChanged( - {...testInputState, activeTool: ComposeboxToolMode.kImageGen}); + {...testInputState, activeTool: ToolMode.kImageGen}); await testProxy.element.updateComplete; assertFalse(testProxy.element['uploadButtonDisabled_']); // Exit create image mode. `uploadButtonDisabled` should be false. testProxy.searchboxCallbackRouterRemote.onInputStateChanged( - {...testInputState, activeTool: ComposeboxToolMode.kUnspecified}); + {...testInputState, activeTool: ToolMode.kUnspecified}); await testProxy.element.updateComplete; assertFalse(testProxy.element['uploadButtonDisabled_']); }); @@ -956,19 +955,19 @@ const contextEntrypoint = $$(testProxy.element, '#contextEntrypoint'); assertTrue(!!contextEntrypoint); contextEntrypoint.dispatchEvent(new CustomEvent('tool-click', { - detail: {toolMode: ComposeboxToolMode.kImageGen}, + detail: {toolMode: ToolMode.kImageGen}, })); await microtasksFinished(); assertEquals( testProxy.searchboxHandler.getCallCount('setActiveToolMode'), 1); assertEquals( - ComposeboxToolMode.kImageGen, + ToolMode.kImageGen, testProxy.searchboxHandler.getArgs('setActiveToolMode')[0]); assertEquals( testProxy.searchboxHandler.getCallCount('recordToolSelectionAction'), 1); assertEquals( - ComposeboxToolMode.kImageGen, + ToolMode.kImageGen, testProxy.searchboxHandler.getArgs('recordToolSelectionAction')[0]); }); @@ -1364,7 +1363,7 @@ attachments: [ {fileAttachment: fileAttachment, tabAttachment: undefined}, ], - toolMode: ToolMode.kDefault, + toolMode: ToolMode.kUnspecified, }; testProxy.element.addSearchContext(context); @@ -1396,7 +1395,7 @@ attachments: [ {fileAttachment: fileAttachment, tabAttachment: undefined}, ], - toolMode: ToolMode.kDefault, + toolMode: ToolMode.kUnspecified, }; testProxy.element.addSearchContext(context); @@ -1429,7 +1428,7 @@ attachments: [ {fileAttachment: undefined, tabAttachment: tabAttachment}, ], - toolMode: ToolMode.kDefault, + toolMode: ToolMode.kUnspecified, }; testProxy.searchboxHandler.setPromiseResolveFor( @@ -1469,24 +1468,22 @@ }; testProxy.element.addSearchContext(deepSearchContext); await microtasksFinished(); - let activeTool = await testProxy.searchboxHandler.whenCalled('setActiveToolMode'); - assertEquals(ComposeboxToolMode.kDeepSearch, activeTool); + assertEquals(ToolMode.kDeepSearch, activeTool); testProxy.searchboxHandler.resetResolver('setActiveToolMode'); const imageContext = { input: '', files: [], attachments: [], - toolMode: ToolMode.kCreateImage, + toolMode: ToolMode.kImageGen, }; testProxy.element.addSearchContext(imageContext); await microtasksFinished(); - activeTool = await testProxy.searchboxHandler.whenCalled('setActiveToolMode'); - assertEquals(ComposeboxToolMode.kImageGen, activeTool); + assertEquals(ToolMode.kImageGen, activeTool); testProxy.searchboxHandler.resetResolver('setActiveToolMode'); const canvasContext = { @@ -1497,10 +1494,9 @@ }; testProxy.element.addSearchContext(canvasContext); await microtasksFinished(); - activeTool = await testProxy.searchboxHandler.whenCalled('setActiveToolMode'); - assertEquals(ComposeboxToolMode.kCanvas, activeTool); + assertEquals(ToolMode.kCanvas, activeTool); testProxy.searchboxHandler.resetResolver('setActiveToolMode'); });
diff --git a/chrome/test/data/webui/new_tab_page/composebox/test_support.ts b/chrome/test/data/webui/new_tab_page/composebox/test_support.ts index 87017613..064ce99 100644 --- a/chrome/test/data/webui/new_tab_page/composebox/test_support.ts +++ b/chrome/test/data/webui/new_tab_page/composebox/test_support.ts
@@ -6,7 +6,7 @@ import {$$} from 'chrome://new-tab-page/new_tab_page.js'; import type {ComposeboxFile} from 'chrome://resources/cr_components/composebox/common.js'; import {PageCallbackRouter, PageHandlerRemote} from 'chrome://resources/cr_components/composebox/composebox.mojom-webui.js'; -import {ContextUploadStatus, InputType, ToolMode as ComposeboxToolMode} from 'chrome://resources/cr_components/composebox/composebox_query.mojom-webui.js'; +import {ContextUploadStatus, InputType, ToolMode} from 'chrome://resources/cr_components/composebox/composebox_query.mojom-webui.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {PageCallbackRouter as SearchboxPageCallbackRouter, PageHandlerRemote as SearchboxPageHandlerRemote} from 'chrome://resources/mojo/components/omnibox/browser/searchbox.mojom-webui.js'; import type {PageRemote as SearchboxPageRemote} from 'chrome://resources/mojo/components/omnibox/browser/searchbox.mojom-webui.js'; @@ -64,7 +64,7 @@ hintText: '', // Will be set in setup toolConfigs: [ { - tool: ComposeboxToolMode.kDeepSearch, + tool: ToolMode.kDeepSearch, hintText: 'Research anything', menuLabel: '', chipLabel: '', @@ -72,7 +72,7 @@ aimUrlParams: [], }, { - tool: ComposeboxToolMode.kImageGen, + tool: ToolMode.kImageGen, hintText: 'Describe your image', menuLabel: '', chipLabel: '', @@ -80,7 +80,7 @@ aimUrlParams: [], }, { - tool: ComposeboxToolMode.kCanvas, + tool: ToolMode.kCanvas, hintText: 'Create anything', menuLabel: '', chipLabel: '',
diff --git a/chrome/test/data/webui/new_tab_page/realbox_test.ts b/chrome/test/data/webui/new_tab_page/realbox_test.ts index 46302d84..732199b 100644 --- a/chrome/test/data/webui/new_tab_page/realbox_test.ts +++ b/chrome/test/data/webui/new_tab_page/realbox_test.ts
@@ -353,26 +353,6 @@ assertEquals(ToolMode.kImageGen, event.detail.mode); }); - // TODO(crbug.com/453570027): Test is flaky. - test.skip( - 'Contextual component empty area click focuses search input', - async () => { - // Arrange. - realbox = await createAndAppendRealbox({ - composeButtonEnabled: true, - composeboxEnabled: true, - searchboxLayoutMode: 'TallTopContext', - ntpRealboxNextEnabled: true, - }); - const contextElement = realbox.shadowRoot.querySelector<HTMLElement>( - 'contextual-entrypoint-and-carousel'); - assertTrue(!!contextElement); - contextElement.dispatchEvent( - new CustomEvent('context-menu-container-click')); - assertEquals(1, testProxy.handler.getCallCount('onFocusChanged')); - assertEquals(1, testProxy.handler.getCallCount('queryAutocomplete')); - }); - test('pasting files opens composebox', async () => { loadTimeData.overrideValues({composeboxFileMaxCount: 2}); realbox = await createAndAppendRealbox({ntpRealboxNextEnabled: true});
diff --git a/chrome/test/data/webui/omnibox_popup/app_test.ts b/chrome/test/data/webui/omnibox_popup/app_test.ts index 82917d2..b1afd9a3 100644 --- a/chrome/test/data/webui/omnibox_popup/app_test.ts +++ b/chrome/test/data/webui/omnibox_popup/app_test.ts
@@ -93,7 +93,7 @@ document.body.innerHTML = window.trustedTypes!.emptyHTML; loadTimeData.overrideValues({ omniboxAimPopupEnabled: true, - searchboxLayoutMode: 'TallTopContext', + searchboxLayoutMode: 'TallBottomContext', }); localApp = document.createElement('omnibox-popup-app'); @@ -175,7 +175,7 @@ test('RecentTabChipShown', async () => { loadTimeData.overrideValues({ - searchboxLayoutMode: 'TallTopContext', + searchboxLayoutMode: 'TallBottomContext', composeboxShowRecentTabChip: true, addTabUploadDelayOnRecentTabChipClick: true, });
diff --git a/chrome/test/data/webui/settings/search_engine_entry_test.ts b/chrome/test/data/webui/settings/search_engine_entry_test.ts index f51550d..636e4fc 100644 --- a/chrome/test/data/webui/settings/search_engine_entry_test.ts +++ b/chrome/test/data/webui/settings/search_engine_entry_test.ts
@@ -115,9 +115,9 @@ const deleteButton = entry.$.delete; assertTrue(isVisible(deleteButton)); deleteButton.click(); - const modelIndex = await browserProxy.whenCalled('removeSearchEngine'); + const id = await browserProxy.whenCalled('removeSearchEngine'); assertFalse(menu.open); - assertEquals(entry.engine.modelIndex, modelIndex); + assertEquals(entry.engine.id, id); }); test('MakeDefault_Enabled', async function() { @@ -126,11 +126,11 @@ const makeDefaultButton = entry.$.makeDefault; assertTrue(!!makeDefaultButton); makeDefaultButton.click(); - const [modelIndex, choiceMadeLocation] = + const [id, choiceMadeLocation] = await browserProxy.whenCalled('setDefaultSearchEngine'); assertEquals(choiceMadeLocation, ChoiceMadeLocation.SEARCH_ENGINE_SETTINGS); assertFalse(menu.open); - assertEquals(entry.engine.modelIndex, modelIndex); + assertEquals(entry.engine.id, id); }); // Test that clicking the "edit" menu item fires an edit event. @@ -199,9 +199,9 @@ activateButton.click(); // Ensure that the activate event is fired. - const [modelIndex, isActive] = + const [id, isActive] = await browserProxy.whenCalled('setIsActiveSearchEngine'); - assertEquals(entry.engine.modelIndex, modelIndex); + assertEquals(entry.engine.id, id); assertTrue(isActive); }); @@ -221,9 +221,9 @@ deactivateButton.click(); // Ensure that the deactivate event is fired. - const [modelIndex, isActive] = + const [id, isActive] = await browserProxy.whenCalled('setIsActiveSearchEngine'); - assertEquals(entry.engine.modelIndex, modelIndex); + assertEquals(entry.engine.id, id); assertFalse(isActive); }); @@ -535,10 +535,10 @@ assertTrue(isVisible(deactivateButton)); deactivateButton.click(); - const [modelIndex, isActive] = + const [id, isActive] = await browserProxy.whenCalled('setIsActiveSearchEngine'); assertFalse(menu.open); - assertEquals(entry.engine.modelIndex, modelIndex); + assertEquals(entry.engine.id, id); assertFalse(isActive); };
diff --git a/chrome/test/data/webui/settings/search_engines_page_test.ts b/chrome/test/data/webui/settings/search_engines_page_test.ts index 9e49346..ac866426 100644 --- a/chrome/test/data/webui/settings/search_engines_page_test.ts +++ b/chrome/test/data/webui/settings/search_engines_page_test.ts
@@ -408,8 +408,8 @@ anchorElement: page.shadowRoot!.querySelector('#addSearchEngine')!, }, })); - const modelIndex = await browserProxy.whenCalled('searchEngineEditStarted'); - assertEquals(engine.modelIndex, modelIndex); + const id = await browserProxy.whenCalled('searchEngineEditStarted'); + assertEquals(engine.id, id); const dialog = page.shadowRoot!.querySelector('settings-search-engine-edit-dialog')!; assertTrue(!!dialog); @@ -449,8 +449,8 @@ anchorElement: page.shadowRoot!.querySelector('#addSearchEngine')!, }, })); - const modelIndex = await browserProxy.whenCalled('searchEngineEditStarted'); - assertEquals(engine.modelIndex, modelIndex); + const id = await browserProxy.whenCalled('searchEngineEditStarted'); + assertEquals(engine.id, id); const dialog = page.shadowRoot!.querySelector('settings-search-engine-edit-dialog'); assertTrue(!!dialog); @@ -526,8 +526,8 @@ anchorElement: page.shadowRoot!.querySelector('#addSearchEngine')!, }, })); - const modelIndex = await browserProxy.whenCalled('searchEngineEditStarted'); - assertEquals(engine.modelIndex, modelIndex); + const id = await browserProxy.whenCalled('searchEngineEditStarted'); + assertEquals(engine.id, id); const dialog = page.shadowRoot!.querySelector('settings-search-engine-edit-dialog')!; assertTrue(!!dialog);
diff --git a/chrome/test/data/webui/settings/site_details_test.ts b/chrome/test/data/webui/settings/site_details_test.ts index c06161b..911d060e 100644 --- a/chrome/test/data/webui/settings/site_details_test.ts +++ b/chrome/test/data/webui/settings/site_details_test.ts
@@ -4,6 +4,7 @@ // clang-format off import {isChromeOS} from 'chrome://resources/js/platform.js'; +import {assert} from 'chrome://resources/js/assert.js'; import {webUIListenerCallback} from 'chrome://resources/js/cr.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import type {SiteDetailsElement, WebsiteUsageBrowserProxy} from 'chrome://settings/lazy_load.js'; @@ -659,4 +660,118 @@ routes.SITE_SETTINGS_ALL.path, Router.getInstance().getCurrentRoute().path); }); + + test('sub app permission explanation', async function() { + const isolatedAppOrigin = 'isolated-app://hubeit66v45f5a2n'; + const regularOrigin = 'https://foo.com:443'; + + // Add exceptions for isolatedAppOrigin to prefs so that getOriginPermissions + // doesn't assert. + browserProxy.getCategoryListForTest(isolatedAppOrigin).forEach(category => { + prefs.exceptions[category].push(createRawSiteException(isolatedAppOrigin)); + }); + + browserProxy.setPrefs(prefs); + browserProxy.setSubAppsPermissionExplanation({ + isSubApp: true, + hasSubApps: false, + appName: 'Sub App', + parentAppName: 'Parent App', + parentAppOrigin: 'isolated-app://hubeit66v45f5a2n', + }); + + testElement = createSiteDetails(isolatedAppOrigin); + await browserProxy.whenCalled('getSubAppsPermissionExplanation'); + await flushTasks(); + + const explanation = testElement.shadowRoot!.querySelector<HTMLElement>( + '#subAppsPermissionExplanation'); + assert(explanation); + assertFalse(explanation.hidden); + const linkElement = explanation.querySelector('localized-link'); + assert(linkElement); + + // Should contain both app name and parent app name. + assertTrue(linkElement.localizedString.includes('Sub App')); + assertTrue(linkElement.localizedString.includes('Parent App')); + + browserProxy.resetResolver('getSubAppsPermissionExplanation'); + browserProxy.setSubAppsPermissionExplanation({ + isSubApp: false, + hasSubApps: true, + appName: 'Parent App', + }); + + // Navigate again with isolated app origin. + Router.getInstance().navigateTo( + routes.SITE_SETTINGS_SITE_DETAILS, + new URLSearchParams('site=' + isolatedAppOrigin)); + + await browserProxy.whenCalled('getSubAppsPermissionExplanation'); + await flushTasks(); + + assertFalse(explanation.hidden); + assertTrue(linkElement.localizedString.includes('Parent App')); + + browserProxy.resetResolver('getSubAppsPermissionExplanation'); + browserProxy.setSubAppsPermissionExplanation({ + isSubApp: false, + hasSubApps: false, + }); + + // Navigate with a regular origin + Router.getInstance().navigateTo( + routes.SITE_SETTINGS_SITE_DETAILS, + new URLSearchParams('site=' + regularOrigin)); + + await browserProxy.whenCalled('getSubAppsPermissionExplanation'); + await flushTasks(); + + assertTrue(explanation.hidden); + assertEquals('', linkElement.localizedString); + }); + + test('sub app permission explanation link click', async function() { + const subAppOrigin = 'isolated-app://sub-app'; + const parentAppOrigin = 'isolated-app://parent-app'; + + // Add exceptions for subAppOrigin and parentAppOrigin to prefs so that + // getOriginPermissions doesn't assert. + browserProxy.getCategoryListForTest(subAppOrigin).forEach(category => { + prefs.exceptions[category].push(createRawSiteException(subAppOrigin)); + }); + browserProxy.getCategoryListForTest(parentAppOrigin).forEach(category => { + prefs.exceptions[category].push(createRawSiteException(parentAppOrigin)); + }); + + browserProxy.setPrefs(prefs); + browserProxy.setSubAppsPermissionExplanation({ + isSubApp: true, + hasSubApps: false, + appName: 'Sub App', + parentAppName: 'Parent App', + parentAppOrigin: parentAppOrigin, + }); + + testElement = createSiteDetails(subAppOrigin); + await browserProxy.whenCalled('getSubAppsPermissionExplanation'); + await flushTasks(); + + const explanation = testElement.shadowRoot!.querySelector<HTMLElement>( + '#subAppsPermissionExplanation'); + assert(explanation); + assertFalse(explanation.hidden); + const linkElement = explanation.querySelector('localized-link'); + assert(linkElement); + + // Click the link and verify navigation. + linkElement.dispatchEvent(new CustomEvent('link-clicked')); + + assertEquals( + routes.SITE_SETTINGS_SITE_DETAILS.path, + Router.getInstance().getCurrentRoute().path); + assertEquals( + parentAppOrigin, + Router.getInstance().getQueryParameters().get('site')); + }); });
diff --git a/chrome/test/data/webui/settings/test_search_engines_browser_proxy.ts b/chrome/test/data/webui/settings/test_search_engines_browser_proxy.ts index 1baed17..50a0bee8 100644 --- a/chrome/test/data/webui/settings/test_search_engines_browser_proxy.ts +++ b/chrome/test/data/webui/settings/test_search_engines_browser_proxy.ts
@@ -3,7 +3,7 @@ // found in the LICENSE file. // clang-format off -import type {SearchEngine, SearchEnginesBrowserProxy, SearchEnginesInfo, SearchEnginesInteractions, ChoiceMadeLocation} from 'chrome://settings/settings.js'; +import type {SearchEngine, SearchEnginesBrowserProxy, SearchEnginesInfo, CategorizedTemplateUrls, SearchEnginesInteractions, ChoiceMadeLocation} from 'chrome://settings/settings.js'; import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js'; // clang-format on @@ -15,11 +15,21 @@ */ export class TestSearchEnginesBrowserProxy extends TestBrowserProxy implements SearchEnginesBrowserProxy { - private searchEnginesInfo_: SearchEnginesInfo; - private saveGuestChoice_: boolean|null; + private categorizedTemplateUrls_: CategorizedTemplateUrls = { + activeSiteShortcuts: [], + inactiveSiteShortcuts: [], + activeFeatureShortcuts: [], + inactiveFeatureShortcuts: [], + }; + + private searchEnginesInfo_: SearchEnginesInfo = + {defaults: [], actives: [], others: [], extensions: []}; + + private saveGuestChoice_: boolean|null = null; constructor() { super([ + 'getCategorizedTemplateUrls', 'getSearchEnginesList', 'getSaveGuestChoice', 'removeSearchEngine', @@ -31,30 +41,25 @@ 'validateSearchEngineInput', 'recordSearchEnginesPageHistogram', ]); - - this.searchEnginesInfo_ = - {defaults: [], actives: [], others: [], extensions: []}; - this.saveGuestChoice_ = null; } setDefaultSearchEngine( - modelIndex: number, choiceMadeLocation: ChoiceMadeLocation, + id: number, choiceMadeLocation: ChoiceMadeLocation, saveGuestChoice?: boolean|null) { this.methodCalled( - 'setDefaultSearchEngine', modelIndex, choiceMadeLocation, - saveGuestChoice); + 'setDefaultSearchEngine', id, choiceMadeLocation, saveGuestChoice); } - setIsActiveSearchEngine(modelIndex: number, isActive: boolean) { - this.methodCalled('setIsActiveSearchEngine', [modelIndex, isActive]); + setIsActiveSearchEngine(id: number, isActive: boolean) { + this.methodCalled('setIsActiveSearchEngine', [id, isActive]); } - removeSearchEngine(modelIndex: number) { - this.methodCalled('removeSearchEngine', modelIndex); + removeSearchEngine(id: number) { + this.methodCalled('removeSearchEngine', id); } - searchEngineEditStarted(modelIndex: number) { - this.methodCalled('searchEngineEditStarted', modelIndex); + searchEngineEditStarted(id: number) { + this.methodCalled('searchEngineEditStarted', id); } searchEngineEditCancelled() { @@ -67,6 +72,11 @@ 'searchEngineEditCompleted', [searchEngine, keyword, queryUrl]); } + getCategorizedTemplateUrls() { + this.methodCalled('getCategorizedTemplateUrls'); + return Promise.resolve(this.categorizedTemplateUrls_); + } + getSearchEnginesList() { this.methodCalled('getSearchEnginesList'); return Promise.resolve(this.searchEnginesInfo_); @@ -87,7 +97,14 @@ } /** - * Sets the response to be returned by |getSearchEnginesList|. + * Sets the response to be returned by `getCategorizedTemplateUrls`. + */ + setCategorizedTemplateUrls(categorizedTemplateUrls: CategorizedTemplateUrls) { + this.categorizedTemplateUrls_ = categorizedTemplateUrls; + } + + /** + * Sets the response to be returned by `getSearchEnginesList`. */ setSearchEnginesInfo(searchEnginesInfo: SearchEnginesInfo) { this.searchEnginesInfo_ = searchEnginesInfo; @@ -123,7 +140,6 @@ isPrepopulated: false, isStarterPack: false, keyword: 'google.com', - modelIndex: 0, name: 'Google', shouldConfirmRemoval: false, url: 'https://search.foo.com/search?p=%s', @@ -154,7 +170,6 @@ isPrepopulated: false, isStarterPack: false, keyword: 'oe', - modelIndex: 6, name: 'Omnibox extension', shouldConfirmRemoval: false, url: 'chrome-extension://dummyextensionid/?q=%s',
diff --git a/chrome/test/data/webui/settings/test_site_settings_browser_proxy.ts b/chrome/test/data/webui/settings/test_site_settings_browser_proxy.ts index d32e2a23..03f3fa1e 100644 --- a/chrome/test/data/webui/settings/test_site_settings_browser_proxy.ts +++ b/chrome/test/data/webui/settings/test_site_settings_browser_proxy.ts
@@ -5,7 +5,7 @@ // clang-format off import {assert} from 'chrome://resources/js/assert.js'; import {webUIListenerCallback} from 'chrome://resources/js/cr.js'; -import type {StorageAccessSiteException, AppProtocolEntry, ChooserType, HandlerEntry, OriginFileSystemGrants, ProtocolEntry, RawChooserException, RawSiteException, RecentSitePermissions, SiteGroup, SiteSettingsBrowserProxy, ZoomLevelEntry} from 'chrome://settings/lazy_load.js'; +import type {StorageAccessSiteException, AppProtocolEntry, ChooserType, HandlerEntry, OriginFileSystemGrants, ProtocolEntry, RawChooserException, RawSiteException, RecentSitePermissions, SiteGroup, SiteSettingsBrowserProxy, SubAppsPermissionExplanationInfo, ZoomLevelEntry} from 'chrome://settings/lazy_load.js'; import {ContentSetting, ContentSettingsTypes, SiteSettingSource} from 'chrome://settings/lazy_load.js'; import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js'; @@ -36,6 +36,10 @@ private recentSitePermissions_: RecentSitePermissions[] = []; private fileSystemGrantsList_: OriginFileSystemGrants[] = []; private storageAccessExceptionList_: StorageAccessSiteException[] = []; + private subAppsPermissionExplanation_: SubAppsPermissionExplanationInfo = { + isSubApp: false, + hasSubApps: false, + }; constructor() { super([ @@ -76,6 +80,7 @@ 'getNumCookiesString', 'getSystemDeniedPermissions', 'openSystemPermissionSettings', + 'getSubAppsPermissionExplanation', 'getExtensionName', 'getFileSystemGrants', 'revokeFileSystemGrant', @@ -638,6 +643,15 @@ this.methodCalled('openSystemPermissionSettings', contentType); } + setSubAppsPermissionExplanation(info: SubAppsPermissionExplanationInfo) { + this.subAppsPermissionExplanation_ = info; + } + + getSubAppsPermissionExplanation(url: string) { + this.methodCalled('getSubAppsPermissionExplanation', url); + return Promise.resolve(this.subAppsPermissionExplanation_); + } + getExtensionName(id: string) { this.methodCalled('getExtensionName', id); return Promise.resolve(`Test Extension ${id}`);
diff --git a/chrome/test/data/webui/skills/discover_skills_page_test.ts b/chrome/test/data/webui/skills/discover_skills_page_test.ts index 27e42190..e8394d2 100644 --- a/chrome/test/data/webui/skills/discover_skills_page_test.ts +++ b/chrome/test/data/webui/skills/discover_skills_page_test.ts
@@ -42,6 +42,7 @@ icon: '', prompt: '', description: '', + imageUrl: '', source: SkillSource.kFirstParty, creationTime: {internalValue: 0n}, lastUpdateTime: {internalValue: 0n},
diff --git a/chrome/test/data/webui/skills/skills_dialog_test.ts b/chrome/test/data/webui/skills/skills_dialog_test.ts index f4cbaf04..267db76 100644 --- a/chrome/test/data/webui/skills/skills_dialog_test.ts +++ b/chrome/test/data/webui/skills/skills_dialog_test.ts
@@ -54,26 +54,33 @@ {handler: dialogHandler} as SkillsDialogBrowserProxy); dialogHandler.setResultFor('submitSkill', Promise.resolve({success: true})); dialogHandler.setResultFor( - 'refineSkill', Promise.resolve({refinedSkill: {}})); + 'refineSkill', Promise.resolve({refinedSkill: createSkill()})); dialogHandler.setResultFor( - 'generateNameAndEmoji', Promise.resolve({refinedSkill: {}})); + 'generateNameAndEmoji', Promise.resolve({refinedSkill: createSkill()})); dialogHandler.setResultFor( 'getSignedInEmail', Promise.resolve({email: ''})); - const emptySkill: Skill = { + const emptySkill = createSkill(); + testWindowProxy = new TestWindowProxy(); + WindowProxyImpl.setInstance(testWindowProxy); + await setupDialogInitialState(emptySkill); + }); + + // Helper to create a valid Skill object with defaults. + function createSkill(overrides: Partial<Skill> = {}): Skill { + return { id: '', sourceSkillId: '', name: '', icon: '', prompt: '', description: '', + imageUrl: '', source: SkillSource.kUnknown, creationTime: {internalValue: 0n}, lastUpdateTime: {internalValue: 0n}, + ...overrides, }; - testWindowProxy = new TestWindowProxy(); - WindowProxyImpl.setInstance(testWindowProxy); - await setupDialogInitialState(emptySkill); - }); + } async function setupDialogInitialState( initialSkill: Skill, @@ -109,17 +116,13 @@ }); test('SkillsDialogPrepopulatesInitialSkill', async function() { - const testSkill: Skill = { + const testSkill = createSkill({ id: '123', - sourceSkillId: '', name: 'test skill', - icon: '', prompt: 'test prompt', description: 'test description', source: SkillSource.kUserCreated, - creationTime: {internalValue: 0n}, - lastUpdateTime: {internalValue: 0n}, - }; + }); await setupDialogInitialState(testSkill); assertEquals(testSkill.name, skillsDialogApp.$.nameText.value); @@ -127,34 +130,26 @@ }); test('AddingFirstPartySkill', async function() { - const testSkill: Skill = { + const testSkill = createSkill({ id: 'first-party-skill', - sourceSkillId: '', name: 'test skill', - icon: '', prompt: 'test prompt', description: 'test description', source: SkillSource.kFirstParty, - creationTime: {internalValue: 0n}, - lastUpdateTime: {internalValue: 0n}, - }; + }); await setupDialogInitialState(testSkill); assertEquals('Add skill', skillsDialogApp.$.header.textContent); }); test('EditingUserCreatedSkill', async function() { - const testSkill: Skill = { + const testSkill = createSkill({ id: '123', - sourceSkillId: '', name: 'test skill', - icon: '', prompt: 'test prompt', description: 'test description', source: SkillSource.kUserCreated, - creationTime: {internalValue: 0n}, - lastUpdateTime: {internalValue: 0n}, - }; + }); await setupDialogInitialState(testSkill, SkillsDialogType.kEdit); assertEquals('Edit skill', skillsDialogApp.$.header.textContent); @@ -200,17 +195,14 @@ }); test('SubmitsRemixedSkill', async function() { - const firstPartySkill: Skill = { + const firstPartySkill = createSkill({ id: 'first-party-skill', sourceSkillId: 'sourceSkillId', name: 'test skill', - icon: '', prompt: 'test prompt', description: 'test description', source: SkillSource.kFirstParty, - creationTime: {internalValue: 0n}, - lastUpdateTime: {internalValue: 0n}, - }; + }); await setupDialogInitialState(firstPartySkill); // Remix the fields. @@ -230,17 +222,13 @@ }); test('EditUserCreatedSkill', async function() { - const userCreatedSkill: Skill = { + const userCreatedSkill = createSkill({ id: 'user-created-skill', - sourceSkillId: '', name: 'test skill', - icon: '', prompt: 'test prompt', description: 'test description', source: SkillSource.kUserCreated, - creationTime: {internalValue: 0n}, - lastUpdateTime: {internalValue: 0n}, - }; + }); await setupDialogInitialState(userCreatedSkill, SkillsDialogType.kEdit); // Edit the fields. @@ -259,17 +247,14 @@ }); test('EditDerivedFromFirstPartySkill', async function() { - const derivedFromFirstPartySkill: Skill = { + const derivedFromFirstPartySkill = createSkill({ id: 'derived-from-first-party-skill', sourceSkillId: 'first-party-skill', name: 'test skill', - icon: '', prompt: 'test prompt', description: 'test description', source: SkillSource.kDerivedFromFirstParty, - creationTime: {internalValue: 0n}, - lastUpdateTime: {internalValue: 0n}, - }; + }); await setupDialogInitialState( derivedFromFirstPartySkill, SkillsDialogType.kEdit); @@ -317,17 +302,13 @@ }); test('DeleteSkill', async function() { - const testSkill: Skill = { + const testSkill = createSkill({ id: '123', - sourceSkillId: '', name: 'test skill', - icon: '', prompt: 'test prompt', description: 'test description', source: SkillSource.kUserCreated, - creationTime: {internalValue: 0n}, - lastUpdateTime: {internalValue: 0n}, - }; + }); await setupDialogInitialState(testSkill, SkillsDialogType.kEdit); assertFalse(skillsDialogApp.$.deleteButton.hidden); @@ -338,17 +319,12 @@ test('EmojiZeroStateVisibility', async function() { // 1. Setup with empty icon - const emptyIconSkill: Skill = { - id: '', - sourceSkillId: '', + const emptyIconSkill = createSkill({ name: 'test skill', - icon: '', prompt: 'test prompt', description: 'test description', source: SkillSource.kUserCreated, - creationTime: {internalValue: 0n}, - lastUpdateTime: {internalValue: 0n}, - }; + }); await setupDialogInitialState(emptyIconSkill, SkillsDialogType.kAdd); const zeroStateIcon = skillsDialogApp.$.emojiZeroStateIcon; @@ -420,17 +396,14 @@ }); test('EmojiInputHandlesEmptyAndAppliesDefaultOnSubmit', async function() { - const emptyIconSkill: Skill = { + const emptyIconSkill = createSkill({ id: 'empty-icon-skill', sourceSkillId: 'sourceSkillId', name: 'test skill', - icon: '', prompt: 'test prompt', description: 'test description', source: SkillSource.kFirstParty, - creationTime: {internalValue: 0n}, - lastUpdateTime: {internalValue: 0n}, - }; + }); await setupDialogInitialState(emptyIconSkill, SkillsDialogType.kEdit); // Click the save button and verify the proxy call. @@ -469,9 +442,9 @@ // 3. Mock the refine call and Click Refine const refinedMockText = 'AI Refined Prompt'; - dialogHandler.setResultFor( - 'refineSkill', - Promise.resolve({refinedSkill: {prompt: refinedMockText}})); + dialogHandler.setResultFor('refineSkill', Promise.resolve({ + refinedSkill: createSkill({prompt: refinedMockText}), + })); skillsDialogApp.$.iconRefine.click(); await dialogHandler.whenCalled('refineSkill'); @@ -524,9 +497,9 @@ // 2. Perform the first refinement const firstRefinedText = 'AI Refined Prompt 1'; - dialogHandler.setResultFor( - 'refineSkill', - Promise.resolve({refinedSkill: {prompt: firstRefinedText}})); + dialogHandler.setResultFor('refineSkill', Promise.resolve({ + refinedSkill: createSkill({prompt: firstRefinedText}), + })); skillsDialogApp.$.iconRefine.click(); @@ -543,9 +516,9 @@ // 3. Perform a second refinement immediately after (without manual edits) const secondRefinedText = 'AI Refined Prompt 2'; - dialogHandler.setResultFor( - 'refineSkill', - Promise.resolve({refinedSkill: {prompt: secondRefinedText}})); + dialogHandler.setResultFor('refineSkill', Promise.resolve({ + refinedSkill: createSkill({prompt: secondRefinedText}), + })); skillsDialogApp.$.iconRefine.click(); @@ -652,17 +625,7 @@ // 4. Resolve Request resolver.resolve({ - refinedSkill: { - id: '', - sourceSkillId: '', - name: '', - icon: '', - prompt: 'Done', - description: '', - source: SkillSource.kUserCreated, - creationTime: {internalValue: 0n}, - lastUpdateTime: {internalValue: 0n}, - }, + refinedSkill: createSkill({prompt: 'Done'}), }); await microtasksFinished(); @@ -714,17 +677,7 @@ // 6. Resolve the "Late" Response resolver.resolve({ - refinedSkill: { - id: '', - sourceSkillId: '', - name: '', - icon: '', - prompt: 'Late Response', - description: '', - source: SkillSource.kUserCreated, - creationTime: {internalValue: 0n}, - lastUpdateTime: {internalValue: 0n}, - }, + refinedSkill: createSkill({prompt: 'Late Response'}), }); await microtasksFinished(); @@ -739,31 +692,16 @@ const generatedName = 'Auto Generated Name'; const generatedIcon = '🤖'; dialogHandler.setResultFor('generateNameAndEmoji', Promise.resolve({ - refinedSkill: { - id: '', - sourceSkillId: '', + refinedSkill: createSkill({ name: generatedName, icon: generatedIcon, prompt: 'refined prompt', - description: '', - source: SkillSource.kUserCreated, - creationTime: {internalValue: 0n}, - lastUpdateTime: {internalValue: 0n}, - }, + }), })); // 2. Initialize a new skill with a prompt but no name/icon. - const newSkill: Skill = { - id: '', - sourceSkillId: '', - name: '', - icon: '', - prompt: 'Instruction that triggers auto-gen', - description: '', - source: SkillSource.kUserCreated, - creationTime: {internalValue: 0n}, - lastUpdateTime: {internalValue: 0n}, - }; + const newSkill = + createSkill({prompt: 'Instruction that triggers auto-gen'}); // 3. Mount the component await setupDialogInitialState(newSkill, SkillsDialogType.kAdd); @@ -776,27 +714,20 @@ test('AutoPopulateDoesNotOverwriteExistingData', async function() { // 1. Setup mock response dialogHandler.setResultFor('generateNameAndEmoji', Promise.resolve({ - refinedSkill: { + refinedSkill: createSkill({ name: 'Should Not Be Used', icon: '❌', - prompt: '', - }, + }), })); // 2. Initialize with user-defined name and icon const existingName = 'My Custom Name'; const existingIcon = '✅'; - const customSkill: Skill = { - id: '', - sourceSkillId: '', + const customSkill = createSkill({ name: existingName, icon: existingIcon, prompt: 'Instructions', - source: SkillSource.kUserCreated, - description: '', - creationTime: {internalValue: 0n}, - lastUpdateTime: {internalValue: 0n}, - }; + }); // 3. Mount await setupDialogInitialState(customSkill); @@ -811,17 +742,10 @@ const resolver = new PromiseResolver<{refinedSkill: Skill}>(); dialogHandler.generateNameAndEmoji = () => resolver.promise; - const newSkill: Skill = { - id: '', - sourceSkillId: '', - name: '', + const newSkill = createSkill({ icon: '⚡', prompt: 'Instructions', - source: SkillSource.kUserCreated, - description: '', - creationTime: {internalValue: 0n}, - lastUpdateTime: {internalValue: 0n}, - }; + }); // 2. Mount - this triggers the call immediately in connectedCallback await setupDialogInitialState(newSkill, SkillsDialogType.kAdd); @@ -836,17 +760,10 @@ // 4. Resolve the request resolver.resolve({ - refinedSkill: { + refinedSkill: createSkill({ name: 'Done', icon: '🏁', - prompt: '', - id: '', - sourceSkillId: '', - description: '', - source: SkillSource.kUserCreated, - creationTime: {internalValue: 0n}, - lastUpdateTime: {internalValue: 0n}, - }, + }), }); await microtasksFinished(); @@ -867,17 +784,10 @@ const resolver = new PromiseResolver<{refinedSkill: Skill}>(); dialogHandler.generateNameAndEmoji = () => resolver.promise; - const newSkill: Skill = { - id: '', - sourceSkillId: '', - name: '', + const newSkill = createSkill({ icon: '⚡', prompt: 'Trigger auto-pop', - description: '', - source: SkillSource.kUserCreated, - creationTime: {internalValue: 0n}, - lastUpdateTime: {internalValue: 0n}, - }; + }); // 2. Mount await setupDialogInitialState(newSkill, SkillsDialogType.kAdd); @@ -908,17 +818,11 @@ test('AutoPopulateSkippedWhenNameIsNotEmpty', async function() { // 1. Define a skill that looks like a "new" skill (no ID) so it triggers // the "Add" flow, but give it a name to test the guard clause. - const preNamedSkill: Skill = { - id: '', - sourceSkillId: '', + const preNamedSkill = createSkill({ name: 'Pre-existing Name', icon: '⚡', prompt: 'Instructions triggering auto-pop logic', - source: SkillSource.kUserCreated, - description: '', - creationTime: {internalValue: 0n}, - lastUpdateTime: {internalValue: 0n}, - }; + }); // 2. Mount the component. await setupDialogInitialState(preNamedSkill, SkillsDialogType.kAdd);
diff --git a/chrome/test/data/webui/skills/user_skills_page_test.ts b/chrome/test/data/webui/skills/user_skills_page_test.ts index f2e58ca..dd8cbd27 100644 --- a/chrome/test/data/webui/skills/user_skills_page_test.ts +++ b/chrome/test/data/webui/skills/user_skills_page_test.ts
@@ -41,6 +41,7 @@ icon: '', prompt: '', description: '', + imageUrl: '', source: SkillSource.kUserCreated, creationTime: {internalValue: 0n}, lastUpdateTime: {internalValue: 0n},
diff --git a/chrome/test/data/webui/updater/app_test.ts b/chrome/test/data/webui/updater/app_test.ts index 60d62cc..f1f70097 100644 --- a/chrome/test/data/webui/updater/app_test.ts +++ b/chrome/test/data/webui/updater/app_test.ts
@@ -12,7 +12,7 @@ import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {TestMock} from 'chrome://webui-test/test_mock.js'; import {TestPluralStringProxy} from 'chrome://webui-test/test_plural_string_proxy.js'; -import {microtasksFinished} from 'chrome://webui-test/test_util.js'; +import {microtasksFinished, whenCheck} from 'chrome://webui-test/test_util.js'; suite('UpdaterAppElement', () => { let element: UpdaterAppElement; @@ -161,8 +161,9 @@ assertEquals(PageDataSource.INSTALL, element.pageDataSource); await setInputFile('history.jsonl', events); + await whenCheck( + element, () => element.pageDataSource === PageDataSource.FILE); - assertEquals(PageDataSource.FILE, element.pageDataSource); assertFalse(element.historyLoadError); assertEquals(3, element.messages.length); assertEquals(1, element.apps.length); @@ -188,8 +189,9 @@ }); await setInputFile('history.zip', 'zip content'); + await whenCheck( + element, () => element.pageDataSource === PageDataSource.FILE); - assertEquals(PageDataSource.FILE, element.pageDataSource); assertFalse(element.historyLoadError); assertEquals(3, element.messages.length); assertEquals(1, element.apps.length); @@ -210,28 +212,28 @@ handler.setPromiseRejectFor('unzipUpdaterHistoryFiles'); await setInputFile('history.zip', 'zip content'); + await whenCheck(element, () => element.historyLoadError); assertEquals(1, handler.getCallCount('unzipUpdaterHistoryFiles')); assertEquals(PageDataSource.INSTALL, element.pageDataSource); - assertTrue(element.historyLoadError); }); test('handles invalid file extension', async () => { await initApp(); await setInputFile('invalid.txt', 'some data'); + await whenCheck(element, () => element.historyLoadError); assertEquals(PageDataSource.INSTALL, element.pageDataSource); - assertTrue(element.historyLoadError); }); test('handles invalid JSON', async () => { await initApp(); await setInputFile('invalid.jsonl', 'not json'); + await whenCheck(element, () => element.historyLoadError); assertEquals(PageDataSource.INSTALL, element.pageDataSource); - assertTrue(element.historyLoadError); }); }); });
diff --git a/chrome/tools/build/linux/chrome-wrapper b/chrome/tools/build/linux/chrome-wrapper index 718b9ef3..6f7736d 100755 --- a/chrome/tools/build/linux/chrome-wrapper +++ b/chrome/tools/build/linux/chrome-wrapper
@@ -73,21 +73,11 @@ HERE="`dirname "$CHROME_WRAPPER"`" -# We include some xdg utilities next to the binary, and we want to prefer them -# over the system versions when we know the system versions are very old. We -# detect whether the system xdg utilities are sufficiently new to be likely to -# work for us by looking for xdg-settings. If we find it, we leave $PATH alone, -# so that the system xdg utilities (including any distro patches) will be used. -if ! which xdg-settings &> /dev/null; then - # Old xdg utilities. Prepend $HERE to $PATH to use ours instead. - export PATH="$HERE:$PATH" -else - # Use system xdg utilities. But first create mimeapps.list if it doesn't - # exist; some systems have bugs in xdg-mime that make it fail without it. - xdg_app_dir="${XDG_DATA_HOME:-$HOME/.local/share/applications}" - mkdir -p "$xdg_app_dir" - [ -f "$xdg_app_dir/mimeapps.list" ] || touch "$xdg_app_dir/mimeapps.list" -fi +# Use system xdg utilities. But first create mimeapps.list if it doesn't +# exist; some systems have bugs in xdg-mime that make it fail without it. +xdg_app_dir="${XDG_DATA_HOME:-$HOME/.local/share/applications}" +mkdir -p "$xdg_app_dir" +[ -f "$xdg_app_dir/mimeapps.list" ] || touch "$xdg_app_dir/mimeapps.list" # Always use our ffmpeg and other shared libs. export LD_LIBRARY_PATH="$HERE:$HERE/lib:$HERE/lib.target${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}"
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index be1db33c..0282691 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -16621.0.0-1076085 \ No newline at end of file +16622.0.0-1076099 \ No newline at end of file
diff --git a/chromeos/ash/components/sync_wifi/wifi_configuration_bridge.cc b/chromeos/ash/components/sync_wifi/wifi_configuration_bridge.cc index 307a77e5..c8e10a5 100644 --- a/chromeos/ash/components/sync_wifi/wifi_configuration_bridge.cc +++ b/chromeos/ash/components/sync_wifi/wifi_configuration_bridge.cc
@@ -161,6 +161,9 @@ sync_networks[id] = proto; } + std::unique_ptr<syncer::DataTypeStore::WriteBatch> batch = + store_->CreateWriteBatch(std::move(metadata_change_list)); + // Iterate through local networks and add to sync where appropriate. for (sync_pb::WifiConfigurationSpecifics& proto : local_network_list) { NetworkIdentifier id = NetworkIdentifier::FromProto(proto); @@ -178,12 +181,10 @@ // Upload the local network configuration to sync. This could be a new // configuration or an update to an existing one. change_processor()->Put(storage_key, std::move(entity_data), - metadata_change_list.get()); + batch->GetMetadataChangeList()); entries_[storage_key] = proto; } - std::unique_ptr<syncer::DataTypeStore::WriteBatch> batch = - store_->CreateWriteBatch(); // Iterate through synced networks and update local stack where appropriate. for (const auto& [id, proto] : sync_networks) { if (auto it = local_networks.find(id); @@ -203,7 +204,6 @@ } // Mark the changes as processed. - batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); Commit(std::move(batch)); RecordNetworkMetrics(); } @@ -213,7 +213,7 @@ std::unique_ptr<syncer::MetadataChangeList> metadata_change_list, syncer::EntityChangeList entity_changes) { std::unique_ptr<syncer::DataTypeStore::WriteBatch> batch = - store_->CreateWriteBatch(); + store_->CreateWriteBatch(std::move(metadata_change_list)); NET_LOG(EVENT) << "Applying " << entity_changes.size() << " pending changes."; @@ -247,7 +247,6 @@ entries_[change->storage_key()] = std::move(specifics); } - batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); Commit(std::move(batch)); RecordNetworkMetrics();
diff --git a/chromeos/strings/chromeos_strings_iw.xtb b/chromeos/strings/chromeos_strings_iw.xtb index f40f3fc5..995048a 100644 --- a/chromeos/strings/chromeos_strings_iw.xtb +++ b/chromeos/strings/chromeos_strings_iw.xtb
@@ -46,7 +46,7 @@ <translation id="1164939766849482256">שומר המסך: מעלות השחר עד לרדת החושך</translation> <translation id="1167755866710282443">פתיחת התפריט להתאמה אישית של המפתחות. יש לגרור את התפריט כדי להזיז אותו.</translation> <translation id="1171349345463658120">לגונה חולית</translation> -<translation id="1174073918202301297">קיצור הדרך נוסף</translation> +<translation id="1174073918202301297">קיצור הדרך התווסף</translation> <translation id="11743817593307477">אפשר להשתמש במקשי החיצים כדי להעביר את הרכיב האינטראקטיבי הזה לפעולת המשחק הרצויה. מציבים את הרכיב באמצעות מקש Enter. כדי לבטל, אפשר להשתמש במקש Escape.</translation> <translation id="1175697296044146566"><ph name="DEVICE_TYPE" /> זה מנוהל על-ידי <ph name="MANAGER" />.</translation> <translation id="1175951029573070619">ממוצע (<ph name="SIGNAL_STRENGTH" />)</translation>
diff --git a/clank b/clank index d507352..0866e4d 160000 --- a/clank +++ b/clank
@@ -1 +1 @@ -Subproject commit d507352a730c95af3d4ed1fa585904ea329a4685 +Subproject commit 0866e4d3a520fc4673b772866ceb510dd63ed6ac
diff --git a/components/accessibility_annotator/content/content_annotator/BUILD.gn b/components/accessibility_annotator/content/content_annotator/BUILD.gn index bba08972..77f400a 100644 --- a/components/accessibility_annotator/content/content_annotator/BUILD.gn +++ b/components/accessibility_annotator/content/content_annotator/BUILD.gn
@@ -4,6 +4,8 @@ source_set("content_annotator") { sources = [ + "content_annotation_validator.cc", + "content_annotation_validator.h", "content_annotator_classifier_rules_parser.cc", "content_annotator_classifier_rules_parser.h", "content_annotator_rule_based_classifier.cc", @@ -43,6 +45,7 @@ source_set("unit_tests") { testonly = true sources = [ + "content_annotation_validator_unittest.cc", "content_annotator_classifier_rules_parser_unittest.cc", "content_annotator_rule_based_classifier_unittest.cc", "content_annotator_semantic_match_classifier_unittest.cc",
diff --git a/components/accessibility_annotator/content/content_annotator/content_annotation_validator.cc b/components/accessibility_annotator/content/content_annotator/content_annotation_validator.cc new file mode 100644 index 0000000..09b6692 --- /dev/null +++ b/components/accessibility_annotator/content/content_annotator/content_annotation_validator.cc
@@ -0,0 +1,80 @@ +// Copyright 2026 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/accessibility_annotator/content/content_annotator/content_annotation_validator.h" + +#include <algorithm> + +#include "base/json/json_reader.h" +#include "base/strings/string_util.h" +#include "components/accessibility_annotator/core/accessibility_annotator_features.h" + +namespace accessibility_annotator { + +namespace { + +bool IsInvalidChar(char c) { + if (c == '<' || c == '>') { + return true; + } + if (base::IsAsciiControl(c) && !base::IsAsciiWhitespace(c)) { + return true; + } + return false; +} + +} // namespace + +// static +std::unique_ptr<ContentAnnotationValidator> +ContentAnnotationValidator::Create() { + std::string schema_json = + kContentAnnotatorExtractedDataValidationSchema.Get(); + + if (schema_json.empty()) { + return std::make_unique<ContentAnnotationValidator>(base::DictValue()); + } + + std::optional<base::DictValue> parsed_json = + base::JSONReader::ReadDict(schema_json, base::JSON_PARSE_RFC); + + return parsed_json.has_value() ? std::make_unique<ContentAnnotationValidator>( + std::move(*parsed_json)) + : nullptr; +} + +ContentAnnotationValidator::ContentAnnotationValidator(base::DictValue schema) + : schema_(std::move(schema)) {} + +ContentAnnotationValidator::~ContentAnnotationValidator() = default; + +bool ContentAnnotationValidator::IsValidatorEnabled() const { + return !schema_.empty(); +} + +std::optional<std::string> ContentAnnotationValidator::Validate( + std::string extracted_data) const { + if (!IsValidatorEnabled()) { + // Validate should only be called if the schema is non-empty. + return std::nullopt; + } + + if (std::ranges::any_of(extracted_data, IsInvalidChar)) { + // For safety, reject data with HTML tags or control characters to create a + // trusted data set. + return std::nullopt; + } + + std::optional<base::Value> parsed_data = + base::JSONReader::Read(extracted_data, base::JSON_PARSE_RFC); + if (!parsed_data || !parsed_data->is_dict()) { + return std::nullopt; + } + + // TODO(crbug.com/492271405): Implement top-level and extracted data + // validation. + return extracted_data; +} + +} // namespace accessibility_annotator
diff --git a/components/accessibility_annotator/content/content_annotator/content_annotation_validator.h b/components/accessibility_annotator/content/content_annotator/content_annotation_validator.h new file mode 100644 index 0000000..b168a1f --- /dev/null +++ b/components/accessibility_annotator/content/content_annotator/content_annotation_validator.h
@@ -0,0 +1,42 @@ +// Copyright 2026 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_ACCESSIBILITY_ANNOTATOR_CONTENT_CONTENT_ANNOTATOR_CONTENT_ANNOTATION_VALIDATOR_H_ +#define COMPONENTS_ACCESSIBILITY_ANNOTATOR_CONTENT_CONTENT_ANNOTATOR_CONTENT_ANNOTATION_VALIDATOR_H_ + +#include <memory> +#include <string> + +#include "base/values.h" + +namespace accessibility_annotator { + +// Validates and sanitizes data extracted by the model. +class ContentAnnotationValidator { + public: + // Returns a nullptr if the schema is malformed JSON. + static std::unique_ptr<ContentAnnotationValidator> Create(); + + explicit ContentAnnotationValidator(base::DictValue schema); + virtual ~ContentAnnotationValidator(); + + ContentAnnotationValidator(const ContentAnnotationValidator&) = delete; + ContentAnnotationValidator& operator=(const ContentAnnotationValidator&) = + delete; + + // Returns true if the validator was created with a non-empty schema. + virtual bool IsValidatorEnabled() const; + + // Validates the extracted data against the expected schema and sanitizes it. + // Returns the validated data as a JSON string, if acceptable. + // Virtual for testing. + virtual std::optional<std::string> Validate(std::string extracted_data) const; + + private: + base::DictValue schema_; +}; + +} // namespace accessibility_annotator + +#endif // COMPONENTS_ACCESSIBILITY_ANNOTATOR_CONTENT_CONTENT_ANNOTATOR_CONTENT_ANNOTATION_VALIDATOR_H_
diff --git a/components/accessibility_annotator/content/content_annotator/content_annotation_validator_unittest.cc b/components/accessibility_annotator/content/content_annotator/content_annotation_validator_unittest.cc new file mode 100644 index 0000000..77dece4 --- /dev/null +++ b/components/accessibility_annotator/content/content_annotator/content_annotation_validator_unittest.cc
@@ -0,0 +1,120 @@ +// Copyright 2026 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/accessibility_annotator/content/content_annotator/content_annotation_validator.h" + +#include "base/json/json_reader.h" +#include "base/test/scoped_feature_list.h" +#include "base/values.h" +#include "components/accessibility_annotator/core/accessibility_annotator_features.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace accessibility_annotator { + +class ContentAnnotationValidatorTest : public testing::Test { + public: + ContentAnnotationValidatorTest() = default; + ~ContentAnnotationValidatorTest() override = default; + + protected: + void SetSchema(const std::string& schema) { + feature_list_.Reset(); + feature_list_.InitAndEnableFeatureWithParameters( + kContentAnnotator, + {{"content_annotator_extracted_data_validation_schema", schema}}); + } + + private: + base::test::ScopedFeatureList feature_list_; +}; + +TEST_F(ContentAnnotationValidatorTest, CreateReturnsNullForMalformedSchema) { + SetSchema("invalid json"); + std::unique_ptr<ContentAnnotationValidator> validator = + ContentAnnotationValidator::Create(); + EXPECT_EQ(validator, nullptr); +} + +TEST_F(ContentAnnotationValidatorTest, IsValidatorEnabled) { + { + std::unique_ptr<ContentAnnotationValidator> validator = + ContentAnnotationValidator::Create(); + ASSERT_NE(validator, nullptr); + EXPECT_FALSE(validator->IsValidatorEnabled()); + } + { + SetSchema("{}"); + std::unique_ptr<ContentAnnotationValidator> validator = + ContentAnnotationValidator::Create(); + ASSERT_NE(validator, nullptr); + EXPECT_FALSE(validator->IsValidatorEnabled()); + } + { + SetSchema(R"({"cat": {"field": "string"}})"); + std::unique_ptr<ContentAnnotationValidator> validator = + ContentAnnotationValidator::Create(); + ASSERT_NE(validator, nullptr); + EXPECT_TRUE(validator->IsValidatorEnabled()); + } +} + +TEST_F(ContentAnnotationValidatorTest, ValidateFailsWithNoSchema) { + std::unique_ptr<ContentAnnotationValidator> validator = + ContentAnnotationValidator::Create(); + ASSERT_NE(validator, nullptr); + std::string data = R"({"key": "value"})"; + + // Validate returns nullopt if schema is empty. + std::optional<std::string> result = validator->Validate(data); + EXPECT_FALSE(result.has_value()); +} + +TEST_F(ContentAnnotationValidatorTest, ValidateRejectsInvalidJson) { + SetSchema(R"({"cat": {"field": "string"}})"); + std::unique_ptr<ContentAnnotationValidator> validator = + ContentAnnotationValidator::Create(); + ASSERT_NE(validator, nullptr); + std::string data = "invalid json"; + + std::optional<std::string> result = validator->Validate(data); + EXPECT_FALSE(result.has_value()); +} + +TEST_F(ContentAnnotationValidatorTest, ValidateRejectsHtmlChars) { + SetSchema(R"({"cat": {"field": "string"}})"); + std::unique_ptr<ContentAnnotationValidator> validator = + ContentAnnotationValidator::Create(); + ASSERT_NE(validator, nullptr); + std::string data = R"({"key": "some <script>alert(1)</script> value"})"; + + std::optional<std::string> result = validator->Validate(data); + EXPECT_FALSE(result.has_value()); +} + +TEST_F(ContentAnnotationValidatorTest, ValidateRejectsControlChars) { + SetSchema(R"({"cat": {"field": "string"}})"); + std::unique_ptr<ContentAnnotationValidator> validator = + ContentAnnotationValidator::Create(); + ASSERT_NE(validator, nullptr); + + std::string data = "{\"key\": \"some \x01 value\"}"; + + std::optional<std::string> result = validator->Validate(data); + EXPECT_FALSE(result.has_value()); +} + +TEST_F(ContentAnnotationValidatorTest, ValidateAllowsWhitespace) { + SetSchema(R"({"cat": {"field": "string"}})"); + std::unique_ptr<ContentAnnotationValidator> validator = + ContentAnnotationValidator::Create(); + ASSERT_NE(validator, nullptr); + + std::string data = "{\"key\": \t\n\r\"some value\"}"; + + std::optional<std::string> result = validator->Validate(data); + EXPECT_TRUE(result.has_value()); + EXPECT_EQ(result.value(), data); +} + +} // namespace accessibility_annotator
diff --git a/components/accessibility_annotator/content/content_annotator/content_annotator_service.cc b/components/accessibility_annotator/content/content_annotator/content_annotator_service.cc index 48244c84..0304dca 100644 --- a/components/accessibility_annotator/content/content_annotator/content_annotator_service.cc +++ b/components/accessibility_annotator/content/content_annotator/content_annotator_service.cc
@@ -14,6 +14,7 @@ #include "base/memory/ref_counted.h" #include "base/metrics/histogram_functions.h" #include "base/types/optional_util.h" +#include "components/accessibility_annotator/content/content_annotator/content_annotation_validator.h" #include "components/accessibility_annotator/content/content_annotator/content_classifier.h" #include "components/accessibility_annotator/content/content_annotator/content_classifier_types.h" #include "components/accessibility_annotator/core/accessibility_annotator_features.h" @@ -62,11 +63,16 @@ if (!content_classifier) { return nullptr; } + std::unique_ptr<ContentAnnotationValidator> validator = + ContentAnnotationValidator::Create(); + if (!validator) { + return nullptr; + } return base::WrapUnique(new ContentAnnotatorService( page_content_annotations_service, page_content_extraction_service, optimization_guide_remote_model_executor, page_embeddings_service, accessibility_annotator_backend, embedder, embedder_metadata_provider, - std::move(content_classifier))); + std::move(content_classifier), std::move(validator))); } ContentAnnotatorService::ContentAnnotatorService( @@ -80,7 +86,8 @@ AccessibilityAnnotatorBackend& accessibility_annotator_backend, passage_embeddings::Embedder* embedder, passage_embeddings::EmbedderMetadataProvider* embedder_metadata_provider, - std::unique_ptr<ContentClassifier> content_classifier) + std::unique_ptr<ContentClassifier> content_classifier, + std::unique_ptr<ContentAnnotationValidator> validator) : page_content_annotations_service_(page_content_annotations_service), optimization_guide_remote_model_executor_( optimization_guide_remote_model_executor), @@ -88,8 +95,10 @@ accessibility_annotator_backend_(accessibility_annotator_backend), embedder_(embedder), join_entries_(kContentAnnotatorMaxPendingUrls.Get()), - content_classifier_(std::move(content_classifier)) { + content_classifier_(std::move(content_classifier)), + validator_(std::move(validator)) { CHECK(content_classifier_); + CHECK(validator_); page_content_annotations_service_->AddObserver( page_content_annotations::AnnotationType::kContentVisibility, this); page_content_extraction_service_observation_.Observe( @@ -267,8 +276,14 @@ }); if (extracted_data.has_value() && !extracted_data->empty()) { - accessibility_annotator_backend_->SetContentAnnotationsCacheData( - url, std::move(page_title), std::move(*extracted_data)); + std::optional<std::string> data_to_cache = + validator_->IsValidatorEnabled() + ? validator_->Validate(std::move(*extracted_data)) + : std::move(extracted_data); + if (data_to_cache) { + accessibility_annotator_backend_->SetContentAnnotationsCacheData( + url, std::move(page_title), std::move(*data_to_cache)); + } } }
diff --git a/components/accessibility_annotator/content/content_annotator/content_annotator_service.h b/components/accessibility_annotator/content/content_annotator/content_annotator_service.h index b5befcd..28ae4e3 100644 --- a/components/accessibility_annotator/content/content_annotator/content_annotator_service.h +++ b/components/accessibility_annotator/content/content_annotator/content_annotator_service.h
@@ -35,6 +35,7 @@ namespace accessibility_annotator { class ContentClassifier; +class ContentAnnotationValidator; class ContentAnnotatorService : public KeyedService, @@ -104,7 +105,8 @@ AccessibilityAnnotatorBackend& accessibility_annotator_backend, passage_embeddings::Embedder* embedder, passage_embeddings::EmbedderMetadataProvider* embedder_metadata_provider, - std::unique_ptr<ContentClassifier> content_classifier); + std::unique_ptr<ContentClassifier> content_classifier, + std::unique_ptr<ContentAnnotationValidator> validator); private: using CacheIterator = @@ -174,6 +176,7 @@ SEQUENCE_CHECKER(sequence_checker_); std::unique_ptr<ContentClassifier> content_classifier_; + std::unique_ptr<ContentAnnotationValidator> validator_; base::WeakPtrFactory<ContentAnnotatorService> weak_ptr_factory_{this}; };
diff --git a/components/accessibility_annotator/content/content_annotator/content_annotator_service_unittest.cc b/components/accessibility_annotator/content/content_annotator/content_annotator_service_unittest.cc index ba97d1b..c4295967 100644 --- a/components/accessibility_annotator/content/content_annotator/content_annotator_service_unittest.cc +++ b/components/accessibility_annotator/content/content_annotator/content_annotator_service_unittest.cc
@@ -13,6 +13,7 @@ #include "base/test/run_until.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" +#include "components/accessibility_annotator/content/content_annotator/content_annotation_validator.h" #include "components/accessibility_annotator/content/content_annotator/content_classifier.h" #include "components/accessibility_annotator/content/content_annotator/content_classifier_types.h" #include "components/accessibility_annotator/core/accessibility_annotator_features.h" @@ -73,6 +74,20 @@ (const, override)); }; +class MockContentAnnotationValidator : public ContentAnnotationValidator { + public: + MockContentAnnotationValidator() + : ContentAnnotationValidator(base::DictValue()) {} + ~MockContentAnnotationValidator() override = default; + + MOCK_METHOD(std::optional<std::string>, + Validate, + (std::string), + (const, override)); + + MOCK_METHOD(bool, IsValidatorEnabled, (), (const, override)); +}; + class MockPageEmbeddingsService : public page_content_annotations::PageEmbeddingsService { public: @@ -108,7 +123,8 @@ passage_embeddings::Embedder* embedder, passage_embeddings::EmbedderMetadataProvider* embedder_metadata_provider, - std::unique_ptr<ContentClassifier> content_classifier) + std::unique_ptr<ContentClassifier> content_classifier, + std::unique_ptr<ContentAnnotationValidator> validator) : ContentAnnotatorService(page_content_annotations_service, page_content_extraction_service, optimization_guide_remote_model_executor, @@ -116,7 +132,8 @@ accessibility_annotator_backend, embedder, embedder_metadata_provider, - std::move(content_classifier)) {} + std::move(content_classifier), + std::move(validator)) {} }; ContentAnnotatorServiceTest() = default; @@ -164,17 +181,23 @@ std::make_unique<testing::StrictMock<MockContentClassifier>>(); mock_classifier_ = mock_classifier.get(); + auto mock_validator = + std::make_unique<testing::StrictMock<MockContentAnnotationValidator>>(); + mock_validator_ = mock_validator.get(); + service_ = std::make_unique<TestContentAnnotatorService>( *page_content_annotations_service_, *page_content_extraction_service_, *mock_remote_model_executor_, *mock_page_embeddings_service_, *accessibility_annotator_backend_, mock_embedder_.get(), - mock_embedder_metadata_provider_.get(), std::move(mock_classifier)); + mock_embedder_metadata_provider_.get(), std::move(mock_classifier), + std::move(mock_validator)); } void TearDown() override { // Explicitly destroy services before the TestHarness tears down the // environment. mock_classifier_ = nullptr; + mock_validator_ = nullptr; service_.reset(); mock_embedder_.reset(); mock_embedder_metadata_provider_.reset(); @@ -251,6 +274,7 @@ mock_embedder_metadata_provider_; std::unique_ptr<TestContentAnnotatorService> service_; raw_ptr<testing::StrictMock<MockContentClassifier>> mock_classifier_; + raw_ptr<testing::StrictMock<MockContentAnnotationValidator>> mock_validator_; }; TEST_F(ContentAnnotatorServiceTest, TestMaybeAnnotate_ClassificationTriggered) { @@ -478,7 +502,7 @@ "AccessibilityAnnotator.ContentAnnotator.DependentInformationMissing", 5); } -TEST_F(ContentAnnotatorServiceTest, TestMaybeAnnotate_FullAnnotationTriggered) { +TEST_F(ContentAnnotatorServiceTest, TestMaybeAnnotate_FullAnnotationReached) { // 1. Enable kContentAnnotatorEnableFullAnnotation flag. base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeatureWithParameters( @@ -549,11 +573,15 @@ optimization_guide::OptimizationGuideModelExecutionResult mock_result( base::ok(any_proto), /*execution_info=*/nullptr); + // 5. Empty schema means no validation is performed. + EXPECT_CALL(*mock_validator_, IsValidatorEnabled()).WillOnce(Return(false)); + EXPECT_CALL(*mock_validator_, Validate).Times(0); + ASSERT_NO_FATAL_FAILURE(std::move(captured_callback) .Run(std::move(mock_result), /*log_entry=*/nullptr)); - // 5. Verify that the data is cached in the backend. + // 6. Verify that the data is cached in the backend. std::optional<AccessibilityAnnotatorBackend::ContentAnnotationsData> cached_data = accessibility_annotator_backend_->GetContentAnnotationsCacheData(url); @@ -632,7 +660,7 @@ // Tests that a metadata update enables semantic classification and subsequent // full annotations. TEST_F(ContentAnnotatorServiceTest, - TestMaybeAnnotate_FullAnnotationTriggeredAfterEmbedderMetadataUpdate) { + TestMaybeAnnotate_FullAnnotationReachedAfterEmbedderMetadataUpdate) { base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeatureWithParameters( kContentAnnotator, @@ -645,7 +673,7 @@ // 1. Classification fails before metadata update. EXPECT_CALL(*mock_classifier_, Classify(_)) .WillOnce(Return(ContentClassificationResult())); - EXPECT_CALL(*mock_remote_model_executor_, ExecuteModel(_, _, _, _)).Times(0); + EXPECT_CALL(*mock_remote_model_executor_, ExecuteModel).Times(0); TriggerClassification(url, base_time); histogram_tester.ExpectUniqueSample( @@ -662,11 +690,78 @@ result.is_in_target_language = true; EXPECT_CALL(*mock_classifier_, Classify(_)).WillOnce(Return(result)); - EXPECT_CALL(*mock_remote_model_executor_, ExecuteModel(_, _, _, _)).Times(1); + EXPECT_CALL(*mock_remote_model_executor_, ExecuteModel).Times(1); TriggerClassification(url, base_time); histogram_tester.ExpectBucketCount( "AccessibilityAnnotator.FullAnnotationReached", true, 1); } +// Tests that annotations are not saved when their validation fails. +TEST_F(ContentAnnotatorServiceTest, + TestMaybeAnnotate_FullAnnotationReachedValidationFails) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeatureWithParameters( + kContentAnnotator, + {{"content_annotator_enable_full_annotation", "true"}}); + + GURL url("https://example.com/validation_failed"); + base::Time base_time = base::Time::Now(); + std::string data = "invalid data"; + + // 1. Mock Classify to return a result that triggers full annotation. + ContentClassificationResult classifier_result; + classifier_result.title_keyword_result = + ContentClassificationResult::Result(); + classifier_result.title_keyword_result->category = "test category"; + classifier_result.is_sensitive = false; + classifier_result.is_in_target_language = true; + + EXPECT_CALL(*mock_classifier_, Classify(_)) + .WillOnce(Return(classifier_result)); + + // 2. Capture the callback. + base::OnceCallback<void( + optimization_guide::OptimizationGuideModelExecutionResult, + std::unique_ptr<optimization_guide::ModelQualityLogEntry>)> + captured_callback; + + EXPECT_CALL(*mock_remote_model_executor_, ExecuteModel) + .WillOnce( + [&captured_callback]( + optimization_guide::ModelBasedCapabilityKey feature, + const google::protobuf::MessageLite& request, + const optimization_guide::ModelExecutionOptions& options, + optimization_guide::OptimizationGuideModelExecutionResultCallback + callback) { captured_callback = std::move(callback); }); + + TriggerClassification(url, base_time); + + // 3. Simulate model output. + ASSERT_TRUE(captured_callback); + optimization_guide::proto::ContentAnnotationResponse mock_response_proto; + mock_response_proto.set_extracted_data(data); + + optimization_guide::proto::Any any_proto; + any_proto.set_type_url(base::StrCat( + {"type.googleapis.com/", mock_response_proto.GetTypeName()})); + any_proto.set_value(mock_response_proto.SerializeAsString()); + + optimization_guide::OptimizationGuideModelExecutionResult mock_result( + base::ok(any_proto), /*execution_info=*/nullptr); + + // 4. Mock validator to return nullopt (validation failed). + EXPECT_CALL(*mock_validator_, IsValidatorEnabled()).WillOnce(Return(true)); + EXPECT_CALL(*mock_validator_, Validate(data)).WillOnce(Return(std::nullopt)); + + std::move(captured_callback) + .Run(std::move(mock_result), /*log_entry=*/nullptr); + + // 5. Verify that NO data is cached in the backend. + std::optional<AccessibilityAnnotatorBackend::ContentAnnotationsData> + cached_data = + accessibility_annotator_backend_->GetContentAnnotationsCacheData(url); + EXPECT_FALSE(cached_data.has_value()); +} + } // namespace accessibility_annotator
diff --git a/components/accessibility_annotator/core/accessibility_annotator_features.cc b/components/accessibility_annotator/core/accessibility_annotator_features.cc index 8c94b56..daca8b4d 100644 --- a/components/accessibility_annotator/core/accessibility_annotator_features.cc +++ b/components/accessibility_annotator/core/accessibility_annotator_features.cc
@@ -71,8 +71,19 @@ &kContentAnnotator, "content_annotator_semantic_match_threshold", 0.8); +BASE_FEATURE_PARAM(std::string, + kContentAnnotatorExtractedDataValidationSchema, + &kContentAnnotator, + "content_annotator_extracted_data_validation_schema", + ""); BASE_FEATURE(kAccessibilityAnnotationReducerOnePResolver, base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE_PARAM(std::string, + kAccessibilityAnnotatorOnePServiceUrl, + &kAccessibilityAnnotationReducerOnePResolver, + "one_p_service_url", + ""); + } // namespace accessibility_annotator
diff --git a/components/accessibility_annotator/core/accessibility_annotator_features.h b/components/accessibility_annotator/core/accessibility_annotator_features.h index 529cea5..f2af4fc 100644 --- a/components/accessibility_annotator/core/accessibility_annotator_features.h +++ b/components/accessibility_annotator/core/accessibility_annotator_features.h
@@ -31,9 +31,13 @@ BASE_DECLARE_FEATURE_PARAM(std::string, kContentAnnotatorClassifierSemanticMatchRules); BASE_DECLARE_FEATURE_PARAM(double, kContentAnnotatorSemanticMatchThreshold); +BASE_DECLARE_FEATURE_PARAM(std::string, + kContentAnnotatorExtractedDataValidationSchema); BASE_DECLARE_FEATURE(kAccessibilityAnnotationReducerOnePResolver); +BASE_DECLARE_FEATURE_PARAM(std::string, kAccessibilityAnnotatorOnePServiceUrl); + } // namespace accessibility_annotator #endif // COMPONENTS_ACCESSIBILITY_ANNOTATOR_CORE_ACCESSIBILITY_ANNOTATOR_FEATURES_H_
diff --git a/components/accessibility_annotator/core/accessibility_query_service.cc b/components/accessibility_annotator/core/accessibility_query_service.cc index 3c85f3a..9d05976f 100644 --- a/components/accessibility_annotator/core/accessibility_query_service.cc +++ b/components/accessibility_annotator/core/accessibility_query_service.cc
@@ -24,18 +24,22 @@ data_provider_.reset(); } -std::vector<MemorySearchResult> AccessibilityQueryService::Query( - std::u16string_view query) { +void AccessibilityQueryService::Query( + std::u16string_view query, + base::RepeatingCallback<void(std::vector<MemorySearchResult>)> + update_callback) { if (!data_provider_) { - return {}; + update_callback.Run({}); + return; } QueryIntentType intent = classifier_.Run(query); if (intent == QueryIntentType::kUnknown) { - return {}; + update_callback.Run({}); + return; } - return data_provider_->RetrieveAll(intent); + update_callback.Run(data_provider_->RetrieveAll(intent)); } } // namespace accessibility_annotator
diff --git a/components/accessibility_annotator/core/accessibility_query_service.h b/components/accessibility_annotator/core/accessibility_query_service.h index 2f386c6..256d2df 100644 --- a/components/accessibility_annotator/core/accessibility_query_service.h +++ b/components/accessibility_annotator/core/accessibility_query_service.h
@@ -10,6 +10,7 @@ #include <string_view> #include <vector> +#include "base/functional/callback.h" #include "components/accessibility_annotator/core/annotation_reducer/memory_search_result.h" #include "components/accessibility_annotator/core/annotation_reducer/query_classifier.h" #include "components/keyed_service/core/keyed_service.h" @@ -31,8 +32,11 @@ // KeyedService: void Shutdown() override; - // Executes a query and returns suggestions. - virtual std::vector<MemorySearchResult> Query(std::u16string_view query); + // Executes a query and returns suggestions via `update_callback`. + virtual void Query( + std::u16string_view query, + base::RepeatingCallback<void(std::vector<MemorySearchResult>)> + update_callback); private: std::unique_ptr<AutofillDataProvider> data_provider_;
diff --git a/components/accessibility_annotator/core/accessibility_query_service_unittest.cc b/components/accessibility_annotator/core/accessibility_query_service_unittest.cc index 64b4827..d292e5e 100644 --- a/components/accessibility_annotator/core/accessibility_query_service_unittest.cc +++ b/components/accessibility_annotator/core/accessibility_query_service_unittest.cc
@@ -8,11 +8,12 @@ #include <string> #include <vector> +#include "base/functional/bind.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/bind.h" #include "base/test/task_environment.h" #include "components/accessibility_annotator/core/annotation_reducer/autofill_data_provider.h" #include "components/accessibility_annotator/core/annotation_reducer/memory_search_result.h" -#include "components/accessibility_annotator/core/annotation_reducer/query_classifier.h" #include "components/accessibility_annotator/core/annotation_reducer/query_intent_type.h" #include "testing/gtest/include/gtest/gtest.h" @@ -60,9 +61,16 @@ result.description = u"Name"; fake_data_provider->set_results({result}); - auto results = service->Query(u"what is my name"); - ASSERT_EQ(results.size(), 1u); - EXPECT_EQ(results[0].value, u"John Doe"); + bool callback_called = false; + service->Query( + u"what is my name", + base::BindLambdaForTesting([&](std::vector<MemorySearchResult> results) { + callback_called = true; + ASSERT_EQ(results.size(), 1u); + EXPECT_EQ(results[0].value, u"John Doe"); + })); + + EXPECT_TRUE(callback_called); EXPECT_EQ(fake_data_provider->last_type(), QueryIntentType::kNameFull); } @@ -71,8 +79,14 @@ auto service = std::make_unique<AccessibilityQueryService>(std::move(data_provider)); - auto results = service->Query(u"random query"); - EXPECT_TRUE(results.empty()); + bool callback_called = false; + service->Query( + u"random query", + base::BindLambdaForTesting([&](std::vector<MemorySearchResult> results) { + callback_called = true; + EXPECT_TRUE(results.empty()); + })); + EXPECT_TRUE(callback_called); } } // namespace
diff --git a/components/accessibility_annotator/core/annotation_reducer/BUILD.gn b/components/accessibility_annotator/core/annotation_reducer/BUILD.gn index 57d2b93..5dc22753 100644 --- a/components/accessibility_annotator/core/annotation_reducer/BUILD.gn +++ b/components/accessibility_annotator/core/annotation_reducer/BUILD.gn
@@ -2,6 +2,12 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//third_party/protobuf/proto_library.gni") + +proto_library("one_p_service_proto") { + sources = [ "one_p_service.proto" ] +} + source_set("one_p_resolver") { sources = [ "one_p_resolver.h", @@ -11,8 +17,13 @@ deps = [ ":annotation_reducer", + ":one_p_service_proto", "//base", "//components/accessibility_annotator/core:features", + "//components/signin/public/identity_manager", + "//google_apis", + "//net", + "//services/network/public/cpp", ] } @@ -39,9 +50,14 @@ deps = [ ":annotation_reducer", ":one_p_resolver", + ":one_p_service_proto", "//base", "//base/test:test_support", "//components/accessibility_annotator/core:features", + "//components/signin/public/identity_manager:test_support", + "//net:test_support", + "//services/network:test_support", + "//services/network/public/cpp", "//testing/gmock", "//testing/gtest", ]
diff --git a/components/accessibility_annotator/core/annotation_reducer/DEPS b/components/accessibility_annotator/core/annotation_reducer/DEPS index 48f1043..ff2da423 100644 --- a/components/accessibility_annotator/core/annotation_reducer/DEPS +++ b/components/accessibility_annotator/core/annotation_reducer/DEPS
@@ -1,4 +1,10 @@ include_rules = [ - "+components/keyed_service/core", - "+components/sync/test", + "+components/signin/public/base", + "+components/signin/public/identity_manager", + "+google_apis", + "+net/http", + "+net/test/embedded_test_server", + "+net/traffic_annotation", + "+services/network/public/cpp", + "+services/network/test", ]
diff --git a/components/accessibility_annotator/core/annotation_reducer/one_p_resolver.h b/components/accessibility_annotator/core/annotation_reducer/one_p_resolver.h index 59a917c..d7857c3 100644 --- a/components/accessibility_annotator/core/annotation_reducer/one_p_resolver.h +++ b/components/accessibility_annotator/core/annotation_reducer/one_p_resolver.h
@@ -23,7 +23,10 @@ // Retrieves accessibility annotations from the 1P service for a given // query and resolves it into memory search results. - virtual void Query(const std::u16string& query, QueryCallback callback) = 0; + // Note: Calling this method while a previous request is still in-flight + // cancels the previous request, and its callback is immediately + // invoked with an empty result set. + virtual void Query(std::u16string query, QueryCallback callback) = 0; }; } // namespace accessibility_annotator
diff --git a/components/accessibility_annotator/core/annotation_reducer/one_p_resolver_impl.cc b/components/accessibility_annotator/core/annotation_reducer/one_p_resolver_impl.cc index 40a139e0..2367b88 100644 --- a/components/accessibility_annotator/core/annotation_reducer/one_p_resolver_impl.cc +++ b/components/accessibility_annotator/core/annotation_reducer/one_p_resolver_impl.cc
@@ -8,30 +8,184 @@ #include "base/feature_list.h" #include "base/functional/bind.h" +#include "base/json/json_reader.h" +#include "base/strings/escape.h" +#include "base/strings/utf_string_conversions.h" #include "base/task/sequenced_task_runner.h" +#include "base/values.h" #include "components/accessibility_annotator/core/accessibility_annotator_features.h" +#include "components/accessibility_annotator/core/annotation_reducer/one_p_service.pb.h" +#include "components/signin/public/base/consent_level.h" +#include "components/signin/public/base/oauth_consumer_id.h" +#include "components/signin/public/identity_manager/access_token_info.h" +#include "components/signin/public/identity_manager/identity_manager.h" +#include "google_apis/credentials_mode.h" +#include "google_apis/gaia/gaia_constants.h" +#include "net/http/http_request_headers.h" +#include "net/traffic_annotation/network_traffic_annotation.h" +#include "services/network/public/cpp/resource_request.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" +#include "services/network/public/cpp/simple_url_loader.h" +#include "url/gurl.h" namespace accessibility_annotator { -OnePResolverImpl::OnePResolverImpl() = default; +OnePResolverImpl::OnePResolverImpl( + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, + signin::IdentityManager* identity_manager) + : url_loader_factory_(std::move(url_loader_factory)), + identity_manager_(identity_manager) {} OnePResolverImpl::~OnePResolverImpl() = default; -void OnePResolverImpl::Query(const std::u16string& query, - QueryCallback callback) { +void OnePResolverImpl::Query(std::u16string query, QueryCallback callback) { + // Explicitly cancels any in-flight request and invokes its callback with an + // empty result set. This enforces the contract that only one request can + // be active at a time. + if (in_flight_query_callback_) { + std::move(in_flight_query_callback_).Run({}); + } + in_flight_query_callback_ = std::move(callback); + + // Cancel any asynchronous operations (token fetch or URL loading) that were + // tied to the previous request. + weak_ptr_factory_.InvalidateWeakPtrs(); + simple_url_loader_.reset(); + + // Helper to post an empty callback securely, avoiding re-entrancy issues + // with synchronous callers. + auto post_empty = [&]() { + base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, base::BindOnce(std::move(in_flight_query_callback_), + std::vector<MemorySearchResult>())); + }; + + // Pre-flight checks. Validate feature state, user sign-in status, and the + // configured endpoint URL. if (!base::FeatureList::IsEnabled( kAccessibilityAnnotationReducerOnePResolver)) { - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, - base::BindOnce(std::move(callback), std::vector<MemorySearchResult>())); + post_empty(); return; } - // TODO(crbug.com/487416734): Implement real 1P network request. - // For now, stub implementation: - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, - base::BindOnce(std::move(callback), std::vector<MemorySearchResult>())); + if (!identity_manager_ || + !identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSignin)) { + post_empty(); + return; + } + + GURL url(kAccessibilityAnnotatorOnePServiceUrl.Get()); + if (!url.is_valid()) { + post_empty(); + return; + } + + // Request an OAuth access token to authenticate the service request. + access_token_fetcher_.reset(); + access_token_fetcher_ = identity_manager_->CreateAccessTokenFetcherForAccount( + identity_manager_->GetPrimaryAccountId(signin::ConsentLevel::kSignin), + signin::OAuthConsumerId::kAccessibilityAnnotator, + base::BindOnce(&OnePResolverImpl::OnAccessTokenFetched, + weak_ptr_factory_.GetWeakPtr(), std::move(query), + std::move(url)), + signin::AccessTokenFetcher::Mode::kImmediate); +} + +void OnePResolverImpl::OnAccessTokenFetched( + std::u16string query, + GURL url, + GoogleServiceAuthError error, + signin::AccessTokenInfo access_token_info) { + // Helper to immediately execute the callback with an empty result set. + auto run_empty = [&]() { + if (in_flight_query_callback_) { + std::move(in_flight_query_callback_).Run({}); + } + }; + + // Clean up the fetcher now that the token request is complete. + // This is safe to do inside the callback. + access_token_fetcher_.reset(); + + if (error.state() != GoogleServiceAuthError::NONE) { + run_empty(); + return; + } + + // Construct the HTTP request with the newly acquired access token. + auto resource_request = std::make_unique<network::ResourceRequest>(); + resource_request->url = std::move(url); + resource_request->method = "POST"; + resource_request->credentials_mode = + google_apis::GetOmitCredentialsModeForGaiaRequests(); + + resource_request->headers.SetHeader(net::HttpRequestHeaders::kAuthorization, + "Bearer " + access_token_info.token); + + // TODO(b:494582740): Add real traffic annotation later. + simple_url_loader_ = network::SimpleURLLoader::Create( + std::move(resource_request), MISSING_TRAFFIC_ANNOTATION); + + // Serialize the query into the protobuf request body. + accessibility_annotator::OnePAnnotationsRequest request_proto; + request_proto.set_query(base::UTF16ToUTF8(query)); + std::string request_body; + request_proto.SerializeToString(&request_body); + + simple_url_loader_->AttachStringForUpload(std::move(request_body), + "application/x-protobuf"); + + // Execute the network request to fetch annotations. + simple_url_loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie( + url_loader_factory_.get(), + base::BindOnce(&OnePResolverImpl::OnUrlLoadComplete, + weak_ptr_factory_.GetWeakPtr())); +} + +void OnePResolverImpl::OnUrlLoadComplete( + std::optional<std::string> response_body) { + // Helper to immediately execute the callback with an empty result set. + auto run_empty = [&]() { + if (in_flight_query_callback_) { + std::move(in_flight_query_callback_).Run({}); + } + }; + + // Validate the network response and clean up the loader. + if (!simple_url_loader_ || simple_url_loader_->NetError() != net::OK || + !response_body) { + simple_url_loader_.reset(); + run_empty(); + return; + } + simple_url_loader_.reset(); + + // Parse the protobuf response. + accessibility_annotator::OnePAnnotationsResponse response_proto; + if (!response_proto.ParseFromString(*response_body)) { + run_empty(); + return; + } + + // Extract the embedded JSON payload from the response proto. + std::optional<base::Value> root_value = + base::JSONReader::Read(response_proto.response(), base::JSON_PARSE_RFC); + if (!root_value || !root_value->is_dict()) { + run_empty(); + return; + } + + const std::string* context_str = root_value->GetDict().FindString("context"); + if (!context_str) { + run_empty(); + return; + } + + // Resolve data. + // TODO(b:487416734): The next phase is to actually resolve the query and the + // fetched annotations into meaningful memory search results using the + // optimization keyed service. For now, we return empty results. + run_empty(); } } // namespace accessibility_annotator
diff --git a/components/accessibility_annotator/core/annotation_reducer/one_p_resolver_impl.h b/components/accessibility_annotator/core/annotation_reducer/one_p_resolver_impl.h index 2e4ebdb..8fd4cca 100644 --- a/components/accessibility_annotator/core/annotation_reducer/one_p_resolver_impl.h +++ b/components/accessibility_annotator/core/annotation_reducer/one_p_resolver_impl.h
@@ -5,20 +5,64 @@ #ifndef COMPONENTS_ACCESSIBILITY_ANNOTATOR_CORE_ANNOTATION_REDUCER_ONE_P_RESOLVER_IMPL_H_ #define COMPONENTS_ACCESSIBILITY_ANNOTATOR_CORE_ANNOTATION_REDUCER_ONE_P_RESOLVER_IMPL_H_ +#include <memory> +#include <string> +#include <string_view> + +#include "base/memory/raw_ptr.h" +#include "base/memory/scoped_refptr.h" +#include "base/memory/weak_ptr.h" #include "components/accessibility_annotator/core/annotation_reducer/one_p_resolver.h" +#include "components/signin/public/identity_manager/access_token_fetcher.h" +#include "components/signin/public/identity_manager/identity_manager.h" +#include "google_apis/gaia/google_service_auth_error.h" +#include "url/gurl.h" + +namespace network { +class SharedURLLoaderFactory; +class SimpleURLLoader; +} // namespace network namespace accessibility_annotator { -// Stub implementation of OnePResolver that returns an empty list. +// Implementation of OnePResolver. +// Note: Currently, this class only handles fetching accessibility annotations +// for the feature from the OneP service. The next phase will resolve the query +// and the annotations into meaningful memory search results using an +// optimization keyed service. class OnePResolverImpl : public OnePResolver { public: - OnePResolverImpl(); + explicit OnePResolverImpl( + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, + signin::IdentityManager* identity_manager); OnePResolverImpl(const OnePResolverImpl&) = delete; OnePResolverImpl& operator=(const OnePResolverImpl&) = delete; ~OnePResolverImpl() override; // OnePResolver: - void Query(const std::u16string& query, QueryCallback callback) override; + void Query(std::u16string query, QueryCallback callback) override; + + private: + void OnAccessTokenFetched(std::u16string query, + GURL url, + GoogleServiceAuthError error, + signin::AccessTokenInfo access_token_info); + + void OnUrlLoadComplete(std::optional<std::string> response_body); + + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; + raw_ptr<signin::IdentityManager> identity_manager_; + + // These are created and destroyed during the async Query() process. + // They are destroyed early if a new Query() arrives before the previous + // one completes. + std::unique_ptr<network::SimpleURLLoader> simple_url_loader_; + std::unique_ptr<signin::AccessTokenFetcher> access_token_fetcher_; + + // Callback for the currently active query request. + QueryCallback in_flight_query_callback_; + + base::WeakPtrFactory<OnePResolverImpl> weak_ptr_factory_{this}; }; } // namespace accessibility_annotator
diff --git a/components/accessibility_annotator/core/annotation_reducer/one_p_resolver_impl_unittest.cc b/components/accessibility_annotator/core/annotation_reducer/one_p_resolver_impl_unittest.cc index 2b9a15e..e88ec806 100644 --- a/components/accessibility_annotator/core/annotation_reducer/one_p_resolver_impl_unittest.cc +++ b/components/accessibility_annotator/core/annotation_reducer/one_p_resolver_impl_unittest.cc
@@ -4,56 +4,376 @@ #include "components/accessibility_annotator/core/annotation_reducer/one_p_resolver_impl.h" +#include <memory> #include <string> #include <vector> +#include "base/functional/bind.h" +#include "base/memory/scoped_refptr.h" +#include "base/strings/utf_string_conversions.h" +#include "base/synchronization/lock.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "base/test/test_future.h" +#include "base/thread_annotations.h" #include "components/accessibility_annotator/core/accessibility_annotator_features.h" #include "components/accessibility_annotator/core/annotation_reducer/memory_search_result.h" +#include "components/accessibility_annotator/core/annotation_reducer/one_p_service.pb.h" +#include "components/signin/public/identity_manager/identity_manager.h" +#include "components/signin/public/identity_manager/identity_test_environment.h" +#include "google_apis/gaia/google_service_auth_error.h" +#include "net/http/http_request_headers.h" +#include "net/test/embedded_test_server/embedded_test_server.h" +#include "net/test/embedded_test_server/http_request.h" +#include "net/test/embedded_test_server/http_response.h" +#include "services/network/test/test_shared_url_loader_factory.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" namespace accessibility_annotator { +namespace { + +constexpr char kFakeToken[] = "fake_access_token"; + +enum class ServerResponseType { + kSuccess, + kMalformed, + kMissingContext, + kBadProto, + kError +}; + +enum class FeatureState { kEnabledWithUrl, kEnabledEmptyUrl, kDisabled }; class OnePResolverImplTest : public ::testing::Test { public: - OnePResolverImplTest() = default; - ~OnePResolverImplTest() override = default; + explicit OnePResolverImplTest( + FeatureState feature_state = FeatureState::kEnabledWithUrl) { + test_server_.RegisterRequestHandler(base::BindRepeating( + &OnePResolverImplTest::HandleRequest, base::Unretained(this))); + CHECK(test_server_.Start()); + + if (feature_state == FeatureState::kEnabledWithUrl) { + scoped_feature_list_.InitAndEnableFeatureWithParameters( + kAccessibilityAnnotationReducerOnePResolver, + {{"one_p_service_url", test_server_.GetURL("/context").spec()}}); + } else if (feature_state == FeatureState::kEnabledEmptyUrl) { + scoped_feature_list_.InitAndEnableFeature( + kAccessibilityAnnotationReducerOnePResolver); + } else { + scoped_feature_list_.InitAndDisableFeature( + kAccessibilityAnnotationReducerOnePResolver); + } + } + + void SetUp() override { + url_loader_factory_ = + base::MakeRefCounted<network::TestSharedURLLoaderFactory>( + /*network_service=*/nullptr, /*is_trusted=*/true); + resolver_ = std::make_unique<OnePResolverImpl>( + url_loader_factory_, identity_test_environment_.identity_manager()); + } protected: + void SetServerResponse(ServerResponseType type) { + base::AutoLock auto_lock(request_lock_); + response_type_ = type; + } + + void SignIn() { + identity_test_environment_.MakePrimaryAccountAvailable( + "test@example.com", signin::ConsentLevel::kSignin); + } + + void IssueToken() { + identity_test_environment_ + .WaitForAccessTokenRequestIfNecessaryAndRespondWithToken( + kFakeToken, base::Time::Max()); + } + + void IssueTokenError() { + identity_test_environment_ + .WaitForAccessTokenRequestIfNecessaryAndRespondWithError( + GoogleServiceAuthError(GoogleServiceAuthError::CONNECTION_FAILED)); + } + + [[nodiscard]] testing::AssertionResult VerifyCapturedRequest( + const std::u16string& expected_query) { + base::AutoLock auto_lock(request_lock_); + + // Verify the HTTP method. + if (last_request_.method != net::test_server::METHOD_POST) { + return testing::AssertionFailure() + << "Expected method POST, got " << last_request_.method; + } + + // Verify required request headers (Auth and Content-Type). + auto auth_it = last_request_.headers.find("Authorization"); + if (auth_it == last_request_.headers.end() || + auth_it->second != std::string("Bearer ") + kFakeToken) { + return testing::AssertionFailure() + << "Missing or incorrect Authorization header"; + } + + auto content_type_it = last_request_.headers.find("Content-Type"); + if (content_type_it == last_request_.headers.end() || + content_type_it->second != "application/x-protobuf") { + return testing::AssertionFailure() + << "Missing or incorrect Content-Type header"; + } + + // Parse and verify the protobuf body payload. + OnePAnnotationsRequest request_proto; + if (!request_proto.ParseFromString(last_request_.content)) { + return testing::AssertionFailure() << "Failed to parse request content " + "as OnePAnnotationsRequest proto"; + } + + std::string expected_query_utf8 = base::UTF16ToUTF8(expected_query); + if (request_proto.query() != expected_query_utf8) { + return testing::AssertionFailure() + << "Expected query '" << expected_query_utf8 << "', got '" + << request_proto.query() << "'"; + } + + return testing::AssertionSuccess(); + } + + // These dependencies must be declared before `resolver_` so they are + // guaranteed to outlive it during test teardown. base::test::ScopedFeatureList scoped_feature_list_; - base::test::TaskEnvironment task_environment_; - OnePResolverImpl resolver_; + base::test::TaskEnvironment task_environment_{ + base::test::TaskEnvironment::MainThreadType::IO}; + signin::IdentityTestEnvironment identity_test_environment_; + + // Accessed directly by tests. + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; + std::unique_ptr<OnePResolverImpl> resolver_; + + private: + std::unique_ptr<net::test_server::HttpResponse> HandleRequest( + const net::test_server::HttpRequest& request) { + // Only intercept requests to the expected endpoint. + if (request.relative_url != "/context") { + return nullptr; + } + + // Safely capture the incoming request and read the expected response type. + ServerResponseType response_type; + { + base::AutoLock auto_lock(request_lock_); + last_request_ = request; + response_type = response_type_; + } + + // Construct the appropriate mocked HTTP response based on the test setup. + auto response = std::make_unique<net::test_server::BasicHttpResponse>(); + if (response_type == ServerResponseType::kSuccess) { + OnePAnnotationsResponse response_proto; + response_proto.set_response("{\"context\": \"fake context\"}"); + response->set_code(net::HTTP_OK); + response->set_content(response_proto.SerializeAsString()); + response->set_content_type("application/x-protobuf"); + } else if (response_type == ServerResponseType::kMalformed) { + OnePAnnotationsResponse response_proto; + response_proto.set_response("{\"bad_json\": }"); + response->set_code(net::HTTP_OK); + response->set_content(response_proto.SerializeAsString()); + response->set_content_type("application/x-protobuf"); + } else if (response_type == ServerResponseType::kMissingContext) { + OnePAnnotationsResponse response_proto; + response_proto.set_response("{\"other_field\": \"value\"}"); + response->set_code(net::HTTP_OK); + response->set_content(response_proto.SerializeAsString()); + response->set_content_type("application/x-protobuf"); + } else if (response_type == ServerResponseType::kBadProto) { + response->set_code(net::HTTP_OK); + response->set_content("not a valid proto"); + response->set_content_type("application/x-protobuf"); + } else if (response_type == ServerResponseType::kError) { + response->set_code(net::HTTP_INTERNAL_SERVER_ERROR); + } else { + response->set_code(net::HTTP_NOT_FOUND); + } + return response; + } + + base::Lock request_lock_; + net::test_server::HttpRequest last_request_ GUARDED_BY(request_lock_); + ServerResponseType response_type_ GUARDED_BY(request_lock_) = + ServerResponseType::kSuccess; + + net::EmbeddedTestServer test_server_; +}; + +// Verifies that instantiating with a null IdentityManager degrades gracefully. +TEST_F(OnePResolverImplTest, NullIdentityManagerReturnsEmpty) { + auto resolver_without_identity = + std::make_unique<OnePResolverImpl>(url_loader_factory_, nullptr); + + base::test::TestFuture<std::vector<MemorySearchResult>> future; + resolver_without_identity->Query(u"any query", future.GetCallback()); + + std::vector<MemorySearchResult> results = future.Take(); + EXPECT_TRUE(results.empty()); +} + +// Verifies that querying without a signed-in user returns an empty result set. +TEST_F(OnePResolverImplTest, NotSignedInReturnsEmpty) { + base::test::TestFuture<std::vector<MemorySearchResult>> future; + resolver_->Query(u"any query", future.GetCallback()); + + std::vector<MemorySearchResult> results = future.Take(); + EXPECT_TRUE(results.empty()); +} + +// Verifies that a failure to fetch an access token returns an empty result set. +TEST_F(OnePResolverImplTest, TokenFetchFailureReturnsEmpty) { + SignIn(); + + base::test::TestFuture<std::vector<MemorySearchResult>> future; + resolver_->Query(u"any query", future.GetCallback()); + IssueTokenError(); + + std::vector<MemorySearchResult> results = future.Take(); + EXPECT_TRUE(results.empty()); +} + +// A fixture subclass for tests where the feature is completely disabled. +class OnePResolverImplDisabledTest : public OnePResolverImplTest { + public: + OnePResolverImplDisabledTest() + : OnePResolverImplTest(FeatureState::kDisabled) {} }; // Verifies that Query successfully executes its asynchronous callback, // but returns an empty result set when the OneP resolver feature is disabled. -TEST_F(OnePResolverImplTest, FeatureDisabledReturnsEmpty) { - scoped_feature_list_.InitAndDisableFeature( - kAccessibilityAnnotationReducerOnePResolver); +TEST_F(OnePResolverImplDisabledTest, FeatureDisabledReturnsEmpty) { + SignIn(); base::test::TestFuture<std::vector<MemorySearchResult>> future; - resolver_.Query(u"any query", future.GetCallback()); + resolver_->Query(u"any query", future.GetCallback()); std::vector<MemorySearchResult> results = future.Take(); EXPECT_TRUE(results.empty()); } -// Verifies that Query successfully executes its asynchronous callback -// and, while the OneP resolver feature is still unimplemented, returns an empty -// result. -// TODO(b:487416734) Once fully implemented, this should not return empty -// results. -TEST_F(OnePResolverImplTest, FeatureEnabledReturnsEmpty) { - scoped_feature_list_.InitAndEnableFeature( - kAccessibilityAnnotationReducerOnePResolver); +// A fixture subclass for tests where the feature is enabled but URL is empty. +class OnePResolverImplEmptyUrlTest : public OnePResolverImplTest { + public: + OnePResolverImplEmptyUrlTest() + : OnePResolverImplTest(FeatureState::kEnabledEmptyUrl) {} +}; + +// Verifies that if no URL is provided in the feature parameters, the resolver +// immediately returns an empty result without requesting a token. +TEST_F(OnePResolverImplEmptyUrlTest, EmptyServiceUrlReturnsEmpty) { + SignIn(); base::test::TestFuture<std::vector<MemorySearchResult>> future; - resolver_.Query(u"any query", future.GetCallback()); + resolver_->Query(u"any query", future.GetCallback()); std::vector<MemorySearchResult> results = future.Take(); EXPECT_TRUE(results.empty()); } +// Verifies that a concurrent request will cancel the previous one and execute +// the previous callback explicitly with an empty result set. +TEST_F(OnePResolverImplTest, ConcurrentQueriesCancelPrevious) { + SignIn(); + + base::test::TestFuture<std::vector<MemorySearchResult>> future1; + base::test::TestFuture<std::vector<MemorySearchResult>> future2; + + resolver_->Query(u"first query", future1.GetCallback()); + + // This will cancel the first request implicitly and fulfill its future. + resolver_->Query(u"second query", future2.GetCallback()); + + std::vector<MemorySearchResult> results1 = future1.Take(); + EXPECT_TRUE(results1.empty()); + + // Respond to the token request and let the network request succeed for the + // second query. + IssueToken(); + + std::vector<MemorySearchResult> results2 = future2.Take(); + EXPECT_TRUE(results2.empty()); +} + +// TODO(b:487416734): Update to verify memory search results once the mapping is +// implemented. Verifies that a successful response from the OneP service is +// handled correctly. +TEST_F(OnePResolverImplTest, ValidOnePServiceResponse) { + SignIn(); + + base::test::TestFuture<std::vector<MemorySearchResult>> future; + resolver_->Query(u"any query", future.GetCallback()); + IssueToken(); + + std::vector<MemorySearchResult> results = future.Take(); + EXPECT_TRUE(results.empty()); + EXPECT_TRUE(VerifyCapturedRequest(u"any query")); +} + +// Verifies that a malformed response from the OneP service gracefully returns +// an empty vector. +TEST_F(OnePResolverImplTest, MalformedOnePServiceResponse) { + SetServerResponse(ServerResponseType::kMalformed); + SignIn(); + + base::test::TestFuture<std::vector<MemorySearchResult>> future; + resolver_->Query(u"any query", future.GetCallback()); + IssueToken(); + + std::vector<MemorySearchResult> results = future.Take(); + EXPECT_TRUE(results.empty()); + EXPECT_TRUE(VerifyCapturedRequest(u"any query")); +} + +// Verifies that a response missing the context field returns an empty vector. +TEST_F(OnePResolverImplTest, MissingContextInOnePServiceResponse) { + SetServerResponse(ServerResponseType::kMissingContext); + SignIn(); + + base::test::TestFuture<std::vector<MemorySearchResult>> future; + resolver_->Query(u"any query", future.GetCallback()); + IssueToken(); + + std::vector<MemorySearchResult> results = future.Take(); + EXPECT_TRUE(results.empty()); + EXPECT_TRUE(VerifyCapturedRequest(u"any query")); +} + +// Verifies that an HTTP error from the OneP service returns an empty vector. +TEST_F(OnePResolverImplTest, HttpErrorFromOnePService) { + SetServerResponse(ServerResponseType::kError); + SignIn(); + + base::test::TestFuture<std::vector<MemorySearchResult>> future; + resolver_->Query(u"any query", future.GetCallback()); + IssueToken(); + + std::vector<MemorySearchResult> results = future.Take(); + EXPECT_TRUE(results.empty()); + EXPECT_TRUE(VerifyCapturedRequest(u"any query")); +} + +// Verifies that a response that fails to parse as a proto returns an empty +// vector. +TEST_F(OnePResolverImplTest, BadProtoFromOnePService) { + SetServerResponse(ServerResponseType::kBadProto); + SignIn(); + + base::test::TestFuture<std::vector<MemorySearchResult>> future; + resolver_->Query(u"any query", future.GetCallback()); + IssueToken(); + + std::vector<MemorySearchResult> results = future.Take(); + EXPECT_TRUE(results.empty()); + EXPECT_TRUE(VerifyCapturedRequest(u"any query")); +} + +} // namespace + } // namespace accessibility_annotator
diff --git a/components/accessibility_annotator/core/annotation_reducer/one_p_service.proto b/components/accessibility_annotator/core/annotation_reducer/one_p_service.proto new file mode 100644 index 0000000..4915c22 --- /dev/null +++ b/components/accessibility_annotator/core/annotation_reducer/one_p_service.proto
@@ -0,0 +1,20 @@ +// Copyright 2026 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +edition = "2024"; + +package accessibility_annotator; + +option optimize_for = LITE_RUNTIME; +option features.utf8_validation = NONE; + +message OnePAnnotationsRequest { + // The natural language user query. + string query = 1; +} + +message OnePAnnotationsResponse { + // The relevant accessibility annotations as stringified JSON. + string response = 1; +}
diff --git a/components/accessibility_annotator/core/direct_server_entity_provider.cc b/components/accessibility_annotator/core/direct_server_entity_provider.cc index 996fe370..96fc080 100644 --- a/components/accessibility_annotator/core/direct_server_entity_provider.cc +++ b/components/accessibility_annotator/core/direct_server_entity_provider.cc
@@ -7,8 +7,6 @@ #include <utility> #include <vector> -#include "base/functional/bind.h" -#include "base/task/sequenced_task_runner.h" #include "components/accessibility_annotator/core/data_models/entity_converter.h" #include "components/accessibility_annotator/core/storage/accessibility_annotator_backend.h" @@ -44,10 +42,12 @@ return; } + std::vector<sync_pb::AccessibilityAnnotationSpecifics> annotations = + bridge->GetAnnotationsByTypes(types); std::vector<Entity> entities; - for (const auto& specifics : bridge->GetAnnotationsByTypes(types)) { - std::optional<Entity> entity = CreateEntityFromSpecifics(specifics); - if (entity.has_value()) { + entities.reserve(annotations.size()); + for (const auto& specifics : annotations) { + if (std::optional<Entity> entity = CreateEntityFromSpecifics(specifics)) { entities.push_back(std::move(*entity)); } }
diff --git a/components/accessibility_annotator/core/direct_server_entity_provider.h b/components/accessibility_annotator/core/direct_server_entity_provider.h index f68f517..17e7139 100644 --- a/components/accessibility_annotator/core/direct_server_entity_provider.h +++ b/components/accessibility_annotator/core/direct_server_entity_provider.h
@@ -41,9 +41,9 @@ void OnAccessibilityAnnotationSyncBridgeLoaded() override; void OnAccessibilityAnnotationChanged() override; + private: void NotifyObservers(); - private: base::ObserverList<EntityDataProvider::Observer> observers_; // `backend_` is owned by the BrowserContext and is guaranteed to outlive this
diff --git a/components/accessibility_annotator/core/direct_server_entity_provider_unittest.cc b/components/accessibility_annotator/core/direct_server_entity_provider_unittest.cc index 2b2d347a..93cef0a 100644 --- a/components/accessibility_annotator/core/direct_server_entity_provider_unittest.cc +++ b/components/accessibility_annotator/core/direct_server_entity_provider_unittest.cc
@@ -4,10 +4,9 @@ #include "components/accessibility_annotator/core/direct_server_entity_provider.h" -#include "base/run_loop.h" #include "base/test/gmock_callback_support.h" -#include "base/test/mock_callback.h" #include "base/test/task_environment.h" +#include "base/test/test_future.h" #include "base/version_info/channel.h" #include "components/accessibility_annotator/core/data_models/entity.h" #include "components/accessibility_annotator/core/data_models/entity_types.h" @@ -24,11 +23,15 @@ namespace { -using ::base::test::RunClosure; +using ::base::test::RunOnceClosure; +using ::testing::AllOf; using ::testing::ElementsAre; +using ::testing::Field; using ::testing::IsEmpty; +using ::testing::Property; using ::testing::Ref; using ::testing::SizeIs; +using ::testing::UnorderedElementsAre; sync_pb::AccessibilityAnnotationSpecifics CreateSpecifics(const std::string& id, EntityType type) { @@ -73,7 +76,7 @@ protected: void AddSpecificsToBridge( - const std::vector<sync_pb::AccessibilityAnnotationSpecifics>& specifics) { + std::vector<sync_pb::AccessibilityAnnotationSpecifics> specifics) { syncer::EntityChangeList change_list; for (const auto& s : specifics) { syncer::EntityData data; @@ -96,70 +99,60 @@ }; TEST_F(DirectServerEntityProviderTest, GetEntitiesReturnsEmpty) { - base::RunLoop run_loop; - base::MockOnceCallback<void(std::vector<Entity>)> cb; - EXPECT_CALL(cb, Run(IsEmpty())).WillOnce(RunClosure(run_loop.QuitClosure())); - provider_->GetEntities(/*types=*/{}, cb.Get()); - run_loop.Run(); + base::test::TestFuture<std::vector<Entity>> future; + provider_->GetEntities(/*types=*/{}, future.GetCallback()); + EXPECT_THAT(future.Get(), IsEmpty()); } TEST_F(DirectServerEntityProviderTest, GetEntities_AllTypes) { AddSpecificsToBridge({CreateSpecifics("1", EntityType::kOrder), CreateSpecifics("2", EntityType::kShipment)}); - base::RunLoop run_loop; - base::MockOnceCallback<void(std::vector<Entity>)> cb; - EXPECT_CALL(cb, Run(testing::UnorderedElementsAre( - testing::Field(&Entity::entity_id, "1"), - testing::Field(&Entity::entity_id, "2")))) - .WillOnce([&](std::vector<Entity> /*entities*/) { run_loop.Quit(); }); - provider_->GetEntities(EntityTypeEnumSet::All(), cb.Get()); - run_loop.Run(); + base::test::TestFuture<std::vector<Entity>> future; + provider_->GetEntities(EntityTypeEnumSet::All(), future.GetCallback()); + EXPECT_THAT(future.Get(), + UnorderedElementsAre(Field(&Entity::entity_id, "1"), + Field(&Entity::entity_id, "2"))); } TEST_F(DirectServerEntityProviderTest, GetEntities_SubsetTypes) { AddSpecificsToBridge({CreateSpecifics("1", EntityType::kOrder), CreateSpecifics("2", EntityType::kShipment)}); - base::RunLoop run_loop; - base::MockOnceCallback<void(std::vector<Entity>)> cb; - EXPECT_CALL(cb, Run(SizeIs(1))).WillOnce([&](std::vector<Entity> entities) { - EXPECT_EQ(entities[0].entity_id, "1"); - EXPECT_EQ(entities[0].GetType(), EntityType::kOrder); - run_loop.Quit(); - }); - provider_->GetEntities({EntityType::kOrder}, cb.Get()); - run_loop.Run(); + base::test::TestFuture<std::vector<Entity>> future; + provider_->GetEntities({EntityType::kOrder}, future.GetCallback()); + + std::vector<Entity> entities = future.Take(); + ASSERT_THAT(entities, SizeIs(1)); + EXPECT_THAT(entities[0], + AllOf(Field(&Entity::entity_id, "1"), + Property(&Entity::GetType, EntityType::kOrder))); } TEST_F(DirectServerEntityProviderTest, GetEntities_NoTypes) { AddSpecificsToBridge({CreateSpecifics("1", EntityType::kOrder), CreateSpecifics("2", EntityType::kShipment)}); - base::RunLoop run_loop; - base::MockOnceCallback<void(std::vector<Entity>)> cb; - EXPECT_CALL(cb, Run(IsEmpty())).WillOnce(RunClosure(run_loop.QuitClosure())); - provider_->GetEntities(/*types=*/{}, cb.Get()); - run_loop.Run(); + base::test::TestFuture<std::vector<Entity>> future; + provider_->GetEntities(/*types=*/{}, future.GetCallback()); + EXPECT_THAT(future.Get(), IsEmpty()); } TEST_F(DirectServerEntityProviderTest, GetEntities_TypeNotPresent) { AddSpecificsToBridge({CreateSpecifics("1", EntityType::kOrder)}); - base::RunLoop run_loop; - base::MockOnceCallback<void(std::vector<Entity>)> cb; - EXPECT_CALL(cb, Run(IsEmpty())).WillOnce(RunClosure(run_loop.QuitClosure())); - provider_->GetEntities({EntityType::kShipment}, cb.Get()); - run_loop.Run(); + base::test::TestFuture<std::vector<Entity>> future; + provider_->GetEntities({EntityType::kShipment}, future.GetCallback()); + EXPECT_THAT(future.Get(), IsEmpty()); } TEST_F(DirectServerEntityProviderTest, ObserverNotifiedOnBridgeLoaded) { provider_->AddObserver(&mock_observer_); - base::RunLoop run_loop; + base::RunLoop run_loop; EXPECT_CALL(mock_observer_, OnEntityDataChanged(Ref(*provider_), EntityTypeEnumSet::All())) - .WillOnce(RunClosure(run_loop.QuitClosure())); + .WillOnce(RunOnceClosure(run_loop.QuitClosure())); provider_->OnAccessibilityAnnotationSyncBridgeLoaded(); run_loop.Run(); @@ -169,11 +162,11 @@ TEST_F(DirectServerEntityProviderTest, ObserverNotifiedOnAnnotationChanged) { provider_->AddObserver(&mock_observer_); - base::RunLoop run_loop; + base::RunLoop run_loop; EXPECT_CALL(mock_observer_, OnEntityDataChanged(Ref(*provider_), EntityTypeEnumSet::All())) - .WillOnce(RunClosure(run_loop.QuitClosure())); + .WillOnce(RunOnceClosure(run_loop.QuitClosure())); provider_->OnAccessibilityAnnotationChanged(); run_loop.Run();
diff --git a/components/accessibility_annotator/core/storage/accessibility_annotation_sync_bridge.cc b/components/accessibility_annotator/core/storage/accessibility_annotation_sync_bridge.cc index 85daf5e..4b9d786 100644 --- a/components/accessibility_annotator/core/storage/accessibility_annotation_sync_bridge.cc +++ b/components/accessibility_annotator/core/storage/accessibility_annotation_sync_bridge.cc
@@ -58,7 +58,7 @@ std::unique_ptr<syncer::MetadataChangeList> metadata_change_list, syncer::EntityChangeList entity_changes) { std::unique_ptr<syncer::DataTypeStore::WriteBatch> batch = - data_type_store_->CreateWriteBatch(); + data_type_store_->CreateWriteBatch(std::move(metadata_change_list)); for (const std::unique_ptr<syncer::EntityChange>& change : entity_changes) { const sync_pb::EntitySpecifics& entity_specifics = change->data().specifics; @@ -80,7 +80,6 @@ break; } } - batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); data_type_store_->CommitWriteBatch( std::move(batch), base::BindOnce(&AccessibilityAnnotationSyncBridge::OnDataTypeStoreCommit, @@ -142,6 +141,12 @@ return !entity_data.specifics.accessibility_annotation().id().empty(); } +bool AccessibilityAnnotationSyncBridge::SupportsIncrementalUpdates() const { + // TODO(crbug.com/483214801): Re-enable incremental updates before the rollout + // starts. + return false; +} + std::optional<sync_pb::AccessibilityAnnotationSpecifics> AccessibilityAnnotationSyncBridge::GetAnnotation(std::string_view id) const { return base::OptionalFromPtr(base::FindOrNull(annotation_entries_, id));
diff --git a/components/accessibility_annotator/core/storage/accessibility_annotation_sync_bridge.h b/components/accessibility_annotator/core/storage/accessibility_annotation_sync_bridge.h index 72352a9..7a11cd8e7 100644 --- a/components/accessibility_annotator/core/storage/accessibility_annotation_sync_bridge.h +++ b/components/accessibility_annotator/core/storage/accessibility_annotation_sync_bridge.h
@@ -80,6 +80,7 @@ const sync_pb::EntitySpecifics& entity_specifics) const override; void ApplyDisableSyncChanges(std::unique_ptr<syncer::MetadataChangeList> delete_metadata_change_list) override; + bool SupportsIncrementalUpdates() const override; bool IsEntityDataValid(const syncer::EntityData& entity_data) const override; void AddObserver(Observer* observer);
diff --git a/components/affiliations/core/browser/affiliation_backend.cc b/components/affiliations/core/browser/affiliation_backend.cc index 5c3f237..7e9c2d3 100644 --- a/components/affiliations/core/browser/affiliation_backend.cc +++ b/components/affiliations/core/browser/affiliation_backend.cc
@@ -311,7 +311,7 @@ cache_->UpdatePslExtensions(result.psl_extensions); } - auto psl_extensions = base::MakeFlatSet<std::string>(result.psl_extensions); + base::flat_set<std::string> psl_extensions(result.psl_extensions); result.groupings = MergeRelatedGroups(psl_extensions, result.groupings); std::map<std::string, const GroupedFacets*> map_facet_to_group; for (const GroupedFacets& grouped_facets : result.groupings) {
diff --git a/components/autofill/content/renderer/autofill_agent.cc b/components/autofill/content/renderer/autofill_agent.cc index f0c29ef..3061fec 100644 --- a/components/autofill/content/renderer/autofill_agent.cc +++ b/components/autofill/content/renderer/autofill_agent.cc
@@ -443,11 +443,7 @@ const std::optional<PasswordSuggestionRequest>& password_request) override { DeferMsg(&mojom::AutofillDriver::AskForValuesToFill, form, field_id, - caret_bounds, trigger_source, - base::FeatureList::IsEnabled( - features::kAutofillAndPasswordsInSameSurface) - ? password_request - : std::nullopt); + caret_bounds, trigger_source, password_request); } void HidePopup() override { DeferMsg(&mojom::AutofillDriver::HidePopup); } void SuppressAutomaticRefills(const FillId& fill_id) override { @@ -822,63 +818,6 @@ } } -bool AutofillAgent::TryShowPasswordSuggestions( - const WebInputElement& input, - IsPasswordRequestManuallyTriggered manually_triggered_password_request, - base::optional_ref<const PasswordSuggestionRequest> password_request) { - if (base::FeatureList::IsEnabled( - features::kAutofillAndPasswordsInSameSurface)) { - // No update to `is_popup_possibly_visible_` yet: it could still be open. - return false; - } - - const bool is_field_empty_or_autofilled = - input.IsAutofilled() || input.Value().IsEmpty(); - const bool is_password_field = input.FormControlTypeForAutofill() == - blink::mojom::FormControlType::kInputPassword; - - // Only show password suggestions on password-type fields if the field is - // either empty or autofilled. This will effectively close the popup on a - // password-type field once the user starts typing. - if (is_password_field && !is_field_empty_or_autofilled) { - HidePopup(); - return false; - } - - if (password_request) { - password_autofill_agent_->ShowSuggestions(password_request.value()); - is_popup_possibly_visible_ = true; - return true; - } - // Beyond this point, the renderer won't be called. Earlier renderer calls may - // have shown/suppressed popups, so update visibility & success of this call. - - // Treat the popup as (still) visible if - // - a suggestion was accepted on another field, or if - // - it was already open and no manual request force-closes the popup. - is_popup_possibly_visible_ = - password_autofill_agent_->HasAcceptedSuggestionOnOtherField(input) || - (is_popup_possibly_visible_ && !manually_triggered_password_request); - - // Call `FormControlType()` instead of `FormControlTypeForAutofill()` to - // determine whether the focsed field is *currently* a password field, not - // whether it has ever been a password field. - bool is_password_field_now = input.FormControlType() == // nocheck - blink::mojom::FormControlType::kInputPassword; - - // Return whether the password autofill agent has handled this request. Above, - // we already returned true if suggestions were shown. But there are several - // cases were the AutofillAgent should not show non-password Autofill: - // a) when the user request password explicitly. - // b) when the focused field is a password field (right now). - // Special condition for b: if the autofill agent handles all requests, don't - // defer to the password agent either. - // TODO: crbug.com/410753794 - Check if an early return works better here. - return manually_triggered_password_request // --> case a. - || (is_password_field_now && // --> case b. - !config_.query_password_suggestions); // --> case b without PWM. -} - void AutofillAgent::TextFieldCleared(const WebFormControlElement& element) { const WebInputElement input_element = element.DynamicTo<WebInputElement>(); CHECK(input_element || form_util::IsTextAreaElement(element)); @@ -978,14 +917,6 @@ std::optional<PasswordSuggestionRequest> password_request = password_autofill_agent_->CreateRequestForChangeInTextField( input_element, form_cache); - if (password_request && - TryShowPasswordSuggestions(input_element, - IsPasswordRequestManuallyTriggered(false), - password_request.value())) { - last_queried_element_ = FieldRef(element); - return; - } - ShowSuggestions(element, AutofillSuggestionTriggerSource::kTextFieldValueChanged, form_cache, password_request); @@ -1621,12 +1552,6 @@ return; } } - bool password_agent_handled_request = TryShowPasswordSuggestions( - input_element, IsPasswordsAutofillManuallyTriggered(trigger_source), - password_request); - if (password_agent_handled_request) { - return; - } } if (config_.secure_context_required &&
diff --git a/components/autofill/content/renderer/autofill_agent.h b/components/autofill/content/renderer/autofill_agent.h index 61ed9cf..a17154ca 100644 --- a/components/autofill/content/renderer/autofill_agent.h +++ b/components/autofill/content/renderer/autofill_agent.h
@@ -318,14 +318,6 @@ // document is loaded. void Reset(); - // Tries to show the given `passwords_request` for the given fields and update - // `is_popup_possibly_visible` accordingly. Returns true if the password agent - // handles the request. - bool TryShowPasswordSuggestions( - const blink::WebInputElement& input, - IsPasswordRequestManuallyTriggered manually_triggered_password_request, - base::optional_ref<const PasswordSuggestionRequest> password_request); - // blink::WebAutofillClient: void TextFieldCleared(const blink::WebFormControlElement&) override; void TextFieldDidEndEditing(const blink::WebInputElement& element) override;
diff --git a/components/autofill/content/renderer/password_autofill_agent.cc b/components/autofill/content/renderer/password_autofill_agent.cc index 3177e6b..6c628a0 100644 --- a/components/autofill/content/renderer/password_autofill_agent.cc +++ b/components/autofill/content/renderer/password_autofill_agent.cc
@@ -1330,11 +1330,6 @@ #endif } -void PasswordAutofillAgent::ShowSuggestions( - const PasswordSuggestionRequest& password_request) { - GetPasswordManagerDriver().ShowPasswordSuggestions(password_request); -} - bool PasswordAutofillAgent::FrameCanAccessPasswordManager() { // about:blank or about:srcdoc frames should not be allowed to use password // manager. See https://crbug.com/756587.
diff --git a/components/autofill/content/renderer/password_autofill_agent.h b/components/autofill/content/renderer/password_autofill_agent.h index 15dfbecd6..60a27a1 100644 --- a/components/autofill/content/renderer/password_autofill_agent.h +++ b/components/autofill/content/renderer/password_autofill_agent.h
@@ -207,12 +207,6 @@ // This is useful to suppress a popups for already filled forms. bool HasAcceptedSuggestionOnOtherField(const blink::WebInputElement& element); - // Shows password suggestions for the given `password_request`. - // Returns true if any suggestions were shown, false otherwise. `form_cache` - // can be used to optimize form extractions occurring synchronously after this - // function call. - void ShowSuggestions(const PasswordSuggestionRequest& password_request); - // Called when new form controls are inserted. `form_cache` can be used to // optimize form extractions occurring synchronously after this function call. void OnDynamicFormsSeen(const SynchronousFormCache& form_cache);
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn index 8744c3d..5d6f85e 100644 --- a/components/autofill/core/browser/BUILD.gn +++ b/components/autofill/core/browser/BUILD.gn
@@ -1859,7 +1859,7 @@ ] } - if (!is_ios && !is_android && !is_fuchsia) { + if (!is_fuchsia) { sources += [ "filling/autofill_ai/field_filling_entity_util_unittest.cc", "permissions/autofill_ai/autofill_ai_permission_utils_unittest.cc",
diff --git a/components/autofill/core/browser/filling/form_filler.cc b/components/autofill/core/browser/filling/form_filler.cc index 75f36ff..aade72e 100644 --- a/components/autofill/core/browser/filling/form_filler.cc +++ b/components/autofill/core/browser/filling/form_filler.cc
@@ -864,6 +864,7 @@ } manager_->driver().ApplyFieldAction(action_type, action_persistence, field.global_id(), value); + manager_->OnDidFillOrPreviewField(action_persistence, field_type_used); } void FormFiller::FillOrPreviewForm(
diff --git a/components/autofill/core/browser/foundations/browser_autofill_manager.cc b/components/autofill/core/browser/foundations/browser_autofill_manager.cc index dab548f..1a46597 100644 --- a/components/autofill/core/browser/foundations/browser_autofill_manager.cc +++ b/components/autofill/core/browser/foundations/browser_autofill_manager.cc
@@ -1213,13 +1213,8 @@ FormControlType::kInputPassword && !autofill_field->value().empty() && autofill_field->last_modifier() != FieldModifier::kAutofill) { - // Hiding the dialog is put behind this feature flag since the agent is - // also performing a hide. - if (base::FeatureList::IsEnabled( - features::kAutofillAndPasswordsInSameSurface)) { - client().HideAutofillSuggestions( - SuggestionHidingReason::kFieldValueChanged); - } + client().HideAutofillSuggestions( + SuggestionHidingReason::kFieldValueChanged); return; } #if !BUILDFLAG(IS_ANDROID) @@ -1329,10 +1324,9 @@ std::ignore = GetCachedFormAndField(form.global_id(), field.global_id(), &form_structure, &autofill_field); - auto all_suggestion_data = - base::MakeFlatMap<SuggestionDataSource, - std::vector<SuggestionGenerator::SuggestionData>>( - suggestion_data); + base::flat_map<SuggestionDataSource, + std::vector<SuggestionGenerator::SuggestionData>> + all_suggestion_data(std::move(suggestion_data)); // Clear some of the suggestions based on the ablation study. if (autofill_field && @@ -3052,6 +3046,24 @@ filling_payload); } +void BrowserAutofillManager::OnDidFillOrPreviewField( + mojom::ActionPersistence action_persistence, + std::optional<FieldType> field_type_used) { + if (action_persistence == mojom::ActionPersistence::kPreview) { + return; + } + CHECK_EQ(action_persistence, mojom::ActionPersistence::kFill); + if (field_type_used == IBAN_VALUE) { + // If the fill is triggered by the IBAN flow. We log form filling + // specifically for IBAN field as the it is single form field filling + // and not handled by FormEventLogger. + IbanManager* iban_manager = + client().GetPaymentsAutofillClient()->GetIbanManager(); + CHECK(iban_manager); + iban_manager->LogIbanFormFilled(); + } +} + void BrowserAutofillManager::LogAndRecordCreditCardFill( const FormStructure& form_structure, const AutofillField& trigger_field,
diff --git a/components/autofill/core/browser/foundations/browser_autofill_manager.h b/components/autofill/core/browser/foundations/browser_autofill_manager.h index 27f9abb2..1a6490d 100644 --- a/components/autofill/core/browser/foundations/browser_autofill_manager.h +++ b/components/autofill/core/browser/foundations/browser_autofill_manager.h
@@ -274,6 +274,11 @@ AutofillTriggerSource trigger_source, std::optional<RefillTriggerReason> refill_trigger_reason); + // Handles post-filling logic of `field_type_used`, like logging field + // metrics. + void OnDidFillOrPreviewField(mojom::ActionPersistence action_persistence, + std::optional<FieldType> field_type_used); + // AutofillManager: base::WeakPtr<AutofillManager> GetWeakPtr() override; bool ShouldClearPreviewedForm() override;
diff --git a/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc b/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc index 4fab1fe..d31af6b 100644 --- a/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc +++ b/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc
@@ -1933,11 +1933,8 @@ base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( /*enabled_features=*/ - { - autofill::features::kAutofillAndPasswordsInSameSurface, - password_manager::features:: - kAutofillReintroduceHybridPasskeyDropdownItem, - }, + {password_manager::features:: + kAutofillReintroduceHybridPasskeyDropdownItem}, /*disabled_features=*/{}); FormData form = CreateTestHybridSignUpFormData(); FormsSeen({form}); @@ -1967,11 +1964,8 @@ base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( /*enabled_features=*/ - { - autofill::features::kAutofillAndPasswordsInSameSurface, - password_manager::features:: - kAutofillReintroduceHybridPasskeyDropdownItem, - }, + {password_manager::features:: + kAutofillReintroduceHybridPasskeyDropdownItem}, /*disabled_features=*/{}); FormData form = CreateTestAddressFormData(); @@ -2012,8 +2006,7 @@ WebauthnSignInWithAnotherDeviceSuggestion_FlagDisabled) { base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( - /*enabled_features=*/{autofill::features:: - kAutofillAndPasswordsInSameSurface}, + /*enabled_features=*/{}, /*disabled_features=*/{ password_manager::features:: kAutofillReintroduceHybridPasskeyDropdownItem}); @@ -2044,11 +2037,8 @@ base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( /*enabled_features=*/ - { - autofill::features::kAutofillAndPasswordsInSameSurface, - password_manager::features:: - kAutofillReintroduceHybridPasskeyDropdownItem, - }, + {password_manager::features:: + kAutofillReintroduceHybridPasskeyDropdownItem}, /*disabled_features=*/{}); FormData form = CreateTestHybridSignUpFormData(); form.set_fields({CreateTestFormField( @@ -2071,11 +2061,8 @@ base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( /*enabled_features=*/ - { - autofill::features::kAutofillAndPasswordsInSameSurface, - password_manager::features:: - kAutofillReintroduceHybridPasskeyDropdownItem, - }, + {password_manager::features:: + kAutofillReintroduceHybridPasskeyDropdownItem}, /*disabled_features=*/{}); FormData form = CreateTestHybridSignUpFormData(); FormsSeen({form}); @@ -2095,11 +2082,8 @@ base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( /*enabled_features=*/ - { - autofill::features::kAutofillAndPasswordsInSameSurface, - password_manager::features:: - kAutofillReintroduceHybridPasskeyDropdownItem, - }, + {password_manager::features:: + kAutofillReintroduceHybridPasskeyDropdownItem}, /*disabled_features=*/{}); FormData form = CreateTestHybridSignUpFormData(); FormsSeen({form}); @@ -2119,11 +2103,8 @@ base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( /*enabled_features=*/ - { - autofill::features::kAutofillAndPasswordsInSameSurface, - password_manager::features:: - kAutofillReintroduceHybridPasskeyDropdownItem, - }, + {password_manager::features:: + kAutofillReintroduceHybridPasskeyDropdownItem}, /*disabled_features=*/{}); FormData form = CreateTestHybridSignUpFormData(); FormsSeen({form}); @@ -6594,6 +6575,49 @@ HasSubstr("Autofill.FormEvents.CreditCard")))); } +// Test that we record field log events correctly for the single field form +// with the IBAN field. +TEST_F(BrowserAutofillManagerTest, + DidSelectIbanSuggestionAndSubmit_LogIbanFieldMetrics) { + // Replace the MockSingleFieldFillRouter with the REAL SingleFieldFillRouter. + autofill_client().set_single_field_fill_router( + std::make_unique<SingleFieldFillRouter>( + autofill_client().GetAutocompleteHistoryManager(), + payments_autofill_client().GetIbanManager(), + payments_autofill_client().GetMerchantPromoCodeManager())); + + FormData form = CreateTestIbanFormData(); + FormsSeen({form}); + + base::HistogramTester histogram_tester; + // Trigger IBAN suggestion shown. + DidShowSuggestions(form, /*field_index=*/0, SuggestionType::kIbanEntry); + Suggestion iban_suggestion(u"TestValue", SuggestionType::kIbanEntry); + + // Verify that the REAL SingleFieldFillRouter successfully routes the + // selection event, and forward the call to the real IbanManager method. + EXPECT_CALL(iban_manager(), OnSingleFieldSuggestionSelected(iban_suggestion)) + .WillOnce([&](const Suggestion& suggestion) { + iban_manager().IbanManager::OnSingleFieldSuggestionSelected(suggestion); + }); + autofill_manager().OnSingleFieldSuggestionSelected( + iban_suggestion, form.global_id(), test_api(form).field(0).global_id()); + + autofill_manager().FillOrPreviewField( + mojom::ActionPersistence::kFill, mojom::FieldActionType::kReplaceAll, + form, form.fields().front(), u"CH93 0076 2011 6238 5295 7", + SuggestionType::kIbanEntry, IBAN_VALUE); + + FormSubmitted(form); + + histogram_tester.ExpectBucketCount( + "Autofill.FormEvents.Iban", + autofill_metrics::IbanFormEvent::kLocalIbanFilled, 1); + histogram_tester.ExpectBucketCount( + "Autofill.FormEvents.Iban", + autofill_metrics::IbanFormEvent::kFormSubmitted, 1); +} + TEST_F(BrowserAutofillManagerTest, DidShowSuggestions_LogIbanSuggestionsShownMetric) { FormData form = CreateTestIbanFormData(); @@ -6615,6 +6639,9 @@ base::Bucket( autofill_metrics::IbanSuggestionsEvent::kIbanSuggestionsShownOnce, 1))); + histogram_tester.ExpectUniqueSample( + "Autofill.FormEvents.Iban", + autofill_metrics::IbanFormEvent::kSuggestionShown, 1); } TEST_F(BrowserAutofillManagerTest, DidShowSuggestions_LogByType_AddressOnly) {
diff --git a/components/autofill/core/browser/integrators/autofill_ai/autofill_ai_labels.cc b/components/autofill/core/browser/integrators/autofill_ai/autofill_ai_labels.cc index 9aafa62..fb975e5 100644 --- a/components/autofill/core/browser/integrators/autofill_ai/autofill_ai_labels.cc +++ b/components/autofill/core/browser/integrators/autofill_ai/autofill_ai_labels.cc
@@ -142,15 +142,15 @@ if (!attribute_type.is_disambiguation_type()) { return false; } - std::vector<std::u16string> values; - for (const EntityInstance* entity : entities) { - auto [value, types_used] = GetValueAndTypesForLabel( - *entity, attribute_type, obfuscate_sensitive_types, app_locale); - values.push_back(std::move(value)); - } + std::vector<std::u16string> values = + base::ToVector(entities, [&](const EntityInstance* entity) { + return GetValueAndTypesForLabel(*entity, attribute_type, + obfuscate_sensitive_types, app_locale) + .first; + }); return values.size() == 1 ? !values.back().empty() - : base::MakeFlatSet<std::u16string>(values).size() > 1; + : base::flat_set<std::u16string>(std::move(values)).size() > 1; }; std::vector<AttributeType> types = base::ToVector(entity_type.attributes());
diff --git a/components/autofill/core/browser/metrics/payments/iban_metrics.cc b/components/autofill/core/browser/metrics/payments/iban_metrics.cc index 638d910..7f65299 100644 --- a/components/autofill/core/browser/metrics/payments/iban_metrics.cc +++ b/components/autofill/core/browser/metrics/payments/iban_metrics.cc
@@ -15,6 +15,10 @@ namespace autofill::autofill_metrics { +void LogIbanFormEvent(IbanFormEvent event) { + base::UmaHistogramEnumeration("Autofill.FormEvents.Iban", event); +} + void LogStoredIbanMetrics( const std::vector<std::unique_ptr<Iban>>& local_ibans, const std::vector<std::unique_ptr<Iban>>& server_ibans,
diff --git a/components/autofill/core/browser/metrics/payments/iban_metrics.h b/components/autofill/core/browser/metrics/payments/iban_metrics.h index 3f4cdc83..785514e 100644 --- a/components/autofill/core/browser/metrics/payments/iban_metrics.h +++ b/components/autofill/core/browser/metrics/payments/iban_metrics.h
@@ -139,6 +139,27 @@ kMaxValue = kIgnored, }; +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. The event will be logged only once +// per flow. +enum class IbanFormEvent { + // The IBAN suggestion was shown to the user. + kSuggestionShown = 0, + // A local IBAN is filled for the IBAN form. For local IBANs, the `select` + // and `fill` events happen simultaneously, so only a single 'filled' status + // is recorded. + kLocalIbanFilled = 1, + // A server IBAN is selected for the form field. + kServerIbanSelected = 2, + // A server IBAN is filled for the IBAN form. + kServerIbanFilled = 3, + // The form was submitted after IBAN autofill finished. + kFormSubmitted = 4, + kMaxValue = kFormSubmitted, +}; + +void LogIbanFormEvent(IbanFormEvent event); + // Logs various metrics about the local/server IBANs associated with a profile. // This should be called each time a new Chrome profile is launched. // `disused_data_threshold` is the time threshold to mark an IBAN as disused.
diff --git a/components/autofill/core/browser/payments/iban_manager.cc b/components/autofill/core/browser/payments/iban_manager.cc index 6a40d80d..8fe0e596 100644 --- a/components/autofill/core/browser/payments/iban_manager.cc +++ b/components/autofill/core/browser/payments/iban_manager.cc
@@ -25,7 +25,23 @@ IbanManager::IbanManager(PaymentsDataManager* payments_data_manager) : payments_data_manager_(payments_data_manager) {} -IbanManager::~IbanManager() = default; +void IbanManager::LogIbanFormFilled() { + if (suggestion_status_ == SuggestionStatus::kSelected) { + suggestion_status_ = SuggestionStatus::kFilled; + autofill_metrics::LogIbanFormEvent( + is_local_iban_suggestion_selected_ + ? autofill_metrics::IbanFormEvent::kLocalIbanFilled + : autofill_metrics::IbanFormEvent::kServerIbanFilled); + } +} + +void IbanManager::OnWillSubmitFormWithFields() { + if (suggestion_status_ == SuggestionStatus::kFilled) { + suggestion_status_ = SuggestionStatus::kFormSubmitted; + autofill_metrics::LogIbanFormEvent( + autofill_metrics::IbanFormEvent::kFormSubmitted); + } +} bool IbanManager::OnGetSingleFieldSuggestions( const FormStructure& form, @@ -69,9 +85,23 @@ void IbanManager::OnSingleFieldSuggestionSelected( const Suggestion& suggestion) { uma_recorder_.OnIbanSuggestionSelected(suggestion); + if (suggestion_status_ == SuggestionStatus::kShown) { + suggestion_status_ = SuggestionStatus::kSelected; + is_local_iban_suggestion_selected_ = + std::holds_alternative<Suggestion::Guid>(suggestion.payload); + if (!is_local_iban_suggestion_selected_) { + autofill_metrics::LogIbanFormEvent( + autofill_metrics::IbanFormEvent::kServerIbanSelected); + } + } } void IbanManager::OnIbanSuggestionsShown(FieldGlobalId field_global_id) { + if (suggestion_status_ == SuggestionStatus::kNotShown) { + suggestion_status_ = SuggestionStatus::kShown; + autofill_metrics::LogIbanFormEvent( + autofill_metrics::IbanFormEvent::kSuggestionShown); + } uma_recorder_.OnIbanSuggestionsShown(field_global_id); }
diff --git a/components/autofill/core/browser/payments/iban_manager.h b/components/autofill/core/browser/payments/iban_manager.h index c801102..969a445a 100644 --- a/components/autofill/core/browser/payments/iban_manager.h +++ b/components/autofill/core/browser/payments/iban_manager.h
@@ -10,7 +10,6 @@ #include "components/autofill/core/browser/metrics/payments/iban_metrics.h" #include "components/autofill/core/browser/single_field_fillers/single_field_fill_router.h" #include "components/autofill/core/browser/suggestions/suggestion_type.h" -#include "components/keyed_service/core/keyed_service.h" #include "components/webdata/common/web_data_service_consumer.h" namespace autofill { @@ -18,11 +17,11 @@ class AutofillClient; class PaymentsDataManager; -// Per-profile IBAN Manager. This class handles IBAN-related functionality +// Per-tab IBAN Manager. This class handles IBAN-related functionality // such as retrieving IBAN data from PersonalDataManager, managing IBAN // suggestions, filling IBAN fields, and handling form submission data when // there is an IBAN field present. -class IbanManager : public KeyedService { +class IbanManager { public: // Initializes the instance with the given parameters. `payments_data_manager` // is a profile-scope data manager used to retrieve IBAN data from the @@ -32,7 +31,13 @@ IbanManager(const IbanManager&) = delete; IbanManager& operator=(const IbanManager&) = delete; - ~IbanManager() override; + virtual ~IbanManager() = default; + + // Log IBAN form filled metrics. + void LogIbanFormFilled(); + + // Log the form has been submitted metrics if the IBAN has been filled. + void OnWillSubmitFormWithFields(); // May generate IBAN suggestions for the given `autofill_field` in `form`. // If `OnGetSingleFieldSuggestions` decides to claim the opportunity to fill @@ -74,9 +79,27 @@ FieldGlobalId most_recent_suggestion_selected_field_global_id_; }; + // The current status of the IBAN autofill flow. This is used for logging + // purpose to ensure the same logging won't happen twice. + enum class SuggestionStatus { + kNotShown = 0, + kShown = 1, + kSelected = 2, + kFilled = 3, + kFormSubmitted = 4, + kMaxValue = kFormSubmitted, + }; + const raw_ptr<PaymentsDataManager> payments_data_manager_; UmaRecorder uma_recorder_; + + SuggestionStatus suggestion_status_ = SuggestionStatus::kNotShown; + + // If true, the selected IBAN suggestion is a local IBAN. This value + // is set upon the first selection; it will not be updated if the user + // re-triggers the suggestions and chooses a different IBAN type. + bool is_local_iban_suggestion_selected_ = false; }; } // namespace autofill
diff --git a/components/autofill/core/browser/payments/iban_manager_unittest.cc b/components/autofill/core/browser/payments/iban_manager_unittest.cc index f0ac37d..a99144d 100644 --- a/components/autofill/core/browser/payments/iban_manager_unittest.cc +++ b/components/autofill/core/browser/payments/iban_manager_unittest.cc
@@ -633,6 +633,7 @@ *autofill_field_, *autofill_field_, autofill_client_, mock_callback.GetNewRef())); Suggestion suggestion(kIbanValue, SuggestionType::kIbanEntry); + iban_manager_.OnIbanSuggestionsShown(autofill_field_->global_id()); iban_manager_.OnSingleFieldSuggestionSelected(suggestion); histogram_tester.ExpectBucketCount( @@ -643,6 +644,10 @@ autofill_metrics::IbanSuggestionsEvent::kLocalIbanSuggestionSelectedOnce, 1); + histogram_tester.ExpectBucketCount( + "Autofill.FormEvents.Iban", + autofill_metrics::IbanFormEvent::kServerIbanSelected, 0); + EXPECT_TRUE(iban_manager_.OnGetSingleFieldSuggestions(*form_structure_, *autofill_field_, *autofill_field_, autofill_client_, mock_callback.GetNewRef())); @@ -655,6 +660,9 @@ "Autofill.Iban.Suggestions", autofill_metrics::IbanSuggestionsEvent::kLocalIbanSuggestionSelectedOnce, 1); + histogram_tester.ExpectBucketCount( + "Autofill.FormEvents.Iban", + autofill_metrics::IbanFormEvent::kServerIbanSelected, 0); } // Test that the metrics for server IBAN suggestion selected (once and total @@ -670,6 +678,8 @@ test_api(iban_manager_).set_most_recent_suggestions_shown_field_global_id( autofill_field_->global_id()); + iban_manager_.OnIbanSuggestionsShown(autofill_field_->global_id()); + // Simulate request for suggestions and select one suggested IBAN. MockSuggestionsReturnedCallback mock_callback; EXPECT_TRUE(iban_manager_.OnGetSingleFieldSuggestions(*form_structure_, @@ -684,6 +694,9 @@ "Autofill.Iban.Suggestions", autofill_metrics::IbanSuggestionsEvent::kServerIbanSuggestionSelectedOnce, 1); + histogram_tester.ExpectBucketCount( + "Autofill.FormEvents.Iban", + autofill_metrics::IbanFormEvent::kServerIbanSelected, 1); EXPECT_TRUE(iban_manager_.OnGetSingleFieldSuggestions(*form_structure_, *autofill_field_, *autofill_field_, autofill_client_, @@ -697,6 +710,9 @@ "Autofill.Iban.Suggestions", autofill_metrics::IbanSuggestionsEvent::kServerIbanSuggestionSelectedOnce, 1); + histogram_tester.ExpectBucketCount( + "Autofill.FormEvents.Iban", + autofill_metrics::IbanFormEvent::kServerIbanSelected, 1); } TEST_F(IbanManagerTest, Metrics_SuggestionSelected_CountryOfSelectedIban) {
diff --git a/components/autofill/core/browser/single_field_fillers/single_field_fill_router.cc b/components/autofill/core/browser/single_field_fillers/single_field_fill_router.cc index b926b25f..a4f7f41e 100644 --- a/components/autofill/core/browser/single_field_fillers/single_field_fill_router.cc +++ b/components/autofill/core/browser/single_field_fillers/single_field_fill_router.cc
@@ -50,6 +50,9 @@ } autocomplete_history_manager_->OnWillSubmitFormWithFields( autocomplete_fields, is_autocomplete_enabled); + if (iban_manager_) { + iban_manager_->OnWillSubmitFormWithFields(); + } } void SingleFieldFillRouter::CancelPendingQueries() {
diff --git a/components/autofill/core/browser/webdata/account_settings/account_setting_sync_bridge.cc b/components/autofill/core/browser/webdata/account_settings/account_setting_sync_bridge.cc index 8e644ea9..9067c47d 100644 --- a/components/autofill/core/browser/webdata/account_settings/account_setting_sync_bridge.cc +++ b/components/autofill/core/browser/webdata/account_settings/account_setting_sync_bridge.cc
@@ -109,8 +109,7 @@ syncer::EntityChangeList entity_changes) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); std::unique_ptr<syncer::DataTypeStore::WriteBatch> batch = - store_->CreateWriteBatch(); - batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); + store_->CreateWriteBatch(std::move(metadata_change_list)); for (const std::unique_ptr<syncer::EntityChange>& change : entity_changes) { switch (change->type()) { case syncer::EntityChange::ACTION_ADD:
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc index 5d0c707..0b71bc5f 100644 --- a/components/autofill/core/common/autofill_features.cc +++ b/components/autofill/core/common/autofill_features.cc
@@ -332,12 +332,6 @@ BASE_FEATURE(kAutofillAllowFillingModifiedInitialValues, base::FEATURE_DISABLED_BY_DEFAULT); -// TODO(crbug.com/460645840): Remove this feature flag once it is no longer -// needed. Guards the refactoring to allow showing Autofill and Password -// suggestions in the same surface instead of being mutually exclusive. -BASE_FEATURE(kAutofillAndPasswordsInSameSurface, - base::FEATURE_ENABLED_BY_DEFAULT); - // If enabled, on Android desktop, the Autofill keyboard accessory will have a // new behavior and design. // TODO(crbug.com/438125774): Remove when launched.
diff --git a/components/autofill/core/common/autofill_features.h b/components/autofill/core/common/autofill_features.h index 83f72048..a79579b 100644 --- a/components/autofill/core/common/autofill_features.h +++ b/components/autofill/core/common/autofill_features.h
@@ -109,8 +109,6 @@ COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillAllowFillingModifiedInitialValues); COMPONENT_EXPORT(AUTOFILL) -BASE_DECLARE_FEATURE(kAutofillAndPasswordsInSameSurface); -COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillAndroidDesktopKeyboardAccessoryRevamp); COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillAndroidDesktopSuppressAccessoryOnEmpty);
diff --git a/components/autofill_payments_strings_grdp/IDS_PAYMENTS_AUTOFILL_EDIT_CARD_MANDATORY_REAUTH_PROMPT.png.sha1 b/components/autofill_payments_strings_grdp/IDS_PAYMENTS_AUTOFILL_EDIT_CARD_MANDATORY_REAUTH_PROMPT.png.sha1 index 7b95b63..08343ab 100644 --- a/components/autofill_payments_strings_grdp/IDS_PAYMENTS_AUTOFILL_EDIT_CARD_MANDATORY_REAUTH_PROMPT.png.sha1 +++ b/components/autofill_payments_strings_grdp/IDS_PAYMENTS_AUTOFILL_EDIT_CARD_MANDATORY_REAUTH_PROMPT.png.sha1
@@ -1 +1 @@ -4ae25593878602358017ba3f04e6622ec405d0a8 \ No newline at end of file +6dadfc30b67ae0e2a72f6cb9824adaaff475b944 \ No newline at end of file
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 index b51f91e..6a72ce6 100644 --- 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
@@ -1 +1 @@ -a34bbf938c2398c18ba2ee2cdd6bf5d51e7c576f \ No newline at end of file +12c5a00bc14fddba06f109f4205c5643886da9e7 \ No newline at end of file
diff --git a/components/autofill_payments_strings_grdp/IDS_PAYMENTS_AUTOFILL_MANDATORY_REAUTH_PROMPT.png.sha1 b/components/autofill_payments_strings_grdp/IDS_PAYMENTS_AUTOFILL_MANDATORY_REAUTH_PROMPT.png.sha1 index 218f9a1..f7570e2 100644 --- a/components/autofill_payments_strings_grdp/IDS_PAYMENTS_AUTOFILL_MANDATORY_REAUTH_PROMPT.png.sha1 +++ b/components/autofill_payments_strings_grdp/IDS_PAYMENTS_AUTOFILL_MANDATORY_REAUTH_PROMPT.png.sha1
@@ -1 +1 @@ -03fc54f18598aa2be6caa7be16af21ea8ebbda07 \ No newline at end of file +8e661981b673efe9c33cab7ee30dbf83ba126f4a \ No newline at end of file
diff --git a/components/autofill_strings.grdp b/components/autofill_strings.grdp index 57c289a..11e28a3 100644 --- a/components/autofill_strings.grdp +++ b/components/autofill_strings.grdp
@@ -706,6 +706,28 @@ Travel </message> + <!-- Autofill and passwords entry point summaries - mobile only --> + <if expr="is_android"> + <message name="IDS_AUTOFILL_AND_PASSWORDS_PASSWORD_MANAGER_SUMMARY" desc="Summary for the Google Password Manager entry in the Autofill and passwords settings." formatter_data="android_java"> + Passwords and passkeys + </message> + <message name="IDS_AUTOFILL_AND_PASSWORDS_PAYMENTS_SUMMARY" desc="Summary for the Payments entry in the Autofill and passwords settings." formatter_data="android_java"> + Credit & debit cards · IBANs · Loyalty cards + </message> + <message name="IDS_AUTOFILL_AND_PASSWORDS_CONTACT_INFO_SUMMARY" desc="Summary for the Contact info entry in the Autofill and passwords settings." formatter_data="android_java"> + Addresses + </message> + <message name="IDS_AUTOFILL_AND_PASSWORDS_IDENTITY_DOCS_SUMMARY" desc="Summary for the Identity docs entry in the Autofill and passwords settings." formatter_data="android_java"> + Driver’s licenses · Identity cards · Passports + </message> + <message name="IDS_AUTOFILL_AND_PASSWORDS_TRAVEL_SUMMARY" desc="Summary for the Travel entry in the Autofill and passwords settings." formatter_data="android_java"> + Travel info · Vehicles + </message> + <message name="IDS_AUTOFILL_AND_PASSWORDS_SETTINGS_SUMMARY" desc="Summary for the Settings entry in the Autofill and passwords settings." formatter_data="android_java"> + Change autofill provider and other settings + </message> + </if> + <!-- Used on Desktop: --> <if expr="not is_android and not is_ios"> <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.">
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_AND_PASSWORDS_CONTACT_INFO_SUMMARY.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_AND_PASSWORDS_CONTACT_INFO_SUMMARY.png.sha1 new file mode 100644 index 0000000..e83997b --- /dev/null +++ b/components/autofill_strings_grdp/IDS_AUTOFILL_AND_PASSWORDS_CONTACT_INFO_SUMMARY.png.sha1
@@ -0,0 +1 @@ +fb26b4029775665ae7d57f2527dd9de45248d854 \ No newline at end of file
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_AND_PASSWORDS_IDENTITY_DOCS_SUMMARY.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_AND_PASSWORDS_IDENTITY_DOCS_SUMMARY.png.sha1 new file mode 100644 index 0000000..722152e11 --- /dev/null +++ b/components/autofill_strings_grdp/IDS_AUTOFILL_AND_PASSWORDS_IDENTITY_DOCS_SUMMARY.png.sha1
@@ -0,0 +1 @@ +792befdd0cd8844294da5d3edbba69a11f99e17b \ No newline at end of file
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_AND_PASSWORDS_PASSWORD_MANAGER_SUMMARY.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_AND_PASSWORDS_PASSWORD_MANAGER_SUMMARY.png.sha1 new file mode 100644 index 0000000..ef906365 --- /dev/null +++ b/components/autofill_strings_grdp/IDS_AUTOFILL_AND_PASSWORDS_PASSWORD_MANAGER_SUMMARY.png.sha1
@@ -0,0 +1 @@ +f01aabe39b17abcecd800f533eed66023c9e1611 \ No newline at end of file
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_AND_PASSWORDS_PAYMENTS_SUMMARY.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_AND_PASSWORDS_PAYMENTS_SUMMARY.png.sha1 new file mode 100644 index 0000000..62b7259 --- /dev/null +++ b/components/autofill_strings_grdp/IDS_AUTOFILL_AND_PASSWORDS_PAYMENTS_SUMMARY.png.sha1
@@ -0,0 +1 @@ +2ef9af1384912c0dbe4ba77dc3d9401a1c8c9381 \ No newline at end of file
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_AND_PASSWORDS_SETTINGS_SUMMARY.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_AND_PASSWORDS_SETTINGS_SUMMARY.png.sha1 new file mode 100644 index 0000000..248be03 --- /dev/null +++ b/components/autofill_strings_grdp/IDS_AUTOFILL_AND_PASSWORDS_SETTINGS_SUMMARY.png.sha1
@@ -0,0 +1 @@ +30c6673822257f2ba574ffbb143e55eddfc8cbb5 \ No newline at end of file
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_AND_PASSWORDS_TRAVEL_SUMMARY.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_AND_PASSWORDS_TRAVEL_SUMMARY.png.sha1 new file mode 100644 index 0000000..e48e8e6 --- /dev/null +++ b/components/autofill_strings_grdp/IDS_AUTOFILL_AND_PASSWORDS_TRAVEL_SUMMARY.png.sha1
@@ -0,0 +1 @@ +fc14c9e8b3d33c21f9b0ab409a08b99cd75db5e4 \ No newline at end of file
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 18fead1..33460ea 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
@@ -64,6 +64,7 @@ <translation id="1644574205037202324">سابقه</translation> <translation id="1652197001188145583">هرگاه روشن باشد، سایتها میتوانند استفاده از دستگاههای NFC را درخواست کنند. هرگاه خاموش باشد، سایتها نمیتوانند از دستگاههای NFC استفاده کنند.</translation> <translation id="1660204651932907780">به سایتها اجازه داده شود صدا پخش کنند (توصیه میشود)</translation> +<translation id="1676590040242013349">«همیشه از اتصالهای امن استفاده شود» روشن است.</translation> <translation id="1677097821151855053">از کوکیها و دیگر دادههای سایت برای بهخاطر سپردن شما استفاده میشود؛ برای مثال ورود به سیستم یا نمایش آگهیهای شخصیسازیشده. برای مدیریت کردن کوکیها برای همه سایتها، به <ph name="BEGIN_LINK" />تنظیمات<ph name="END_LINK" /> بروید.</translation> <translation id="1679305402657584804">سایتها میتوانند برای استفاده از دستگاههای NFC درخواست دهند</translation> <translation id="1686785653877010442">سایتها معمولاً اعلان ارسال میکنند تا شما را از اخبار فوری یا پیامهای گپ مطلع کنند.</translation> @@ -573,6 +574,7 @@ <translation id="6912998170423641340">سایتها از خواندن نوشتار و تصاویر بریدهدان منع شوند</translation> <translation id="6945221475159498467">انتخاب</translation> <translation id="6950072572526089586">سایتی که بازدید میکنید میتواند اطلاعاتی درباره کاری که انجام میدهید ذخیره کند تا عملکردی مطابق انتظار داشته باشد — برای مثال، برای اینکه در سیستم سایت باقی بمانید یا برای ذخیره کردن مواردی که در سبد خریدتان است. سایتها در اغلب موارد این اطلاعات را بهصورت موقتی در دستگاهتان ذخیره میکنند.</translation> +<translation id="6964291282260073066">«WebGPU» غیرفعال است.</translation> <translation id="6965382102122355670">تأیید</translation> <translation id="6980507581230208647">زمینه صورتی</translation> <translation id="6980861169612950611">دادههای سایت حذف شود؟ <ph name="SITE_NAME" /></translation> @@ -605,6 +607,9 @@ <translation id="7276071417425470385">هرگاه روشن باشد، سایتها میتوانند استفاده از دستگاههای واقعیت مجازی را درخواست کنند. هرگاه خاموش باشد، سایتها نمیتوانند از دستگاههای واقعیت مجازی استفاده کنند.</translation> <translation id="7282197670900591579">زمینه لیمویی</translation> <translation id="728412880473384942">سایتها سرعت بیشتری دارند اما امنیت آنها کمتر است</translation> +<translation id="7352902948037373520">در <ph name="BEGIN_LINK1" />تنظیمات Android<ph name="END_LINK1" /> مدیریت کنید + +«محافظت پیشرفته» این تنظیمات Chrome را کنترل میکند:</translation> <translation id="7366415735885268578">افزودن سایت</translation> <translation id="7368695150573390554">همه دادههای آفلاین حذف خواهند شد</translation> <translation id="7369678931043226462">برگ زیرین «سفارشیسازی صفحه زبانه جدید» بهصورت نیمه باز شده است</translation> @@ -715,6 +720,7 @@ <translation id="8471525937465764768">سایتها معمولاً برای ارائه ویژگیهایی مانند چاپ سند یا ذخیره در دستگاه ذخیرهسازی به دستگاههای USB متصل میشوند</translation> <translation id="8473055640493819707">«<ph name="APP_NAME" />» قدیمی است. لطفاً این برنامه را دوباره نصب کنید.</translation> <translation id="847433688444405067">پیمایش بین دستگاهها</translation> +<translation id="8484556725636319115">• «بهینهساز جاوا اسکریپت» خاموش است. <ph name="BEGIN_LINK2" />مدیریت کردن استثناهای «سایت»<ph name="END_LINK2" /></translation> <translation id="8487700953926739672">دردسترس در حالت آفلاین</translation> <translation id="848952951823693243">همیشه سایت ویژه تلفن همراه درخواست شود</translation> <translation id="8492822722330266509">سایتها میتوانند بالاپر ارسال کنند و از هدایتها استفاده کنند</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 e2b6dd2..57f3dae 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
@@ -64,6 +64,7 @@ <translation id="1644574205037202324">History</translation> <translation id="1652197001188145583">Kapag naka-on, puwedeng hilingin ng mga site na gumamit ng mga NFC device. Kapag naka-off, hindi makakagamit ang mga site ng mga NFC device.</translation> <translation id="1660204651932907780">Payagan ang mga site na mag-play ng tunog (inirerekomenda)</translation> +<translation id="1676590040242013349">Naka-on ang "Palaging gumamit ng mga secure na koneksyon."</translation> <translation id="1677097821151855053">Ginagamit ang cookies at iba pang data ng site para tandaan ka, halimbawa para i-sign in ka o i-personalize ang mga ad. Para mapamahalaan ang cookies para sa lahat ng site, tingnan ang <ph name="BEGIN_LINK" />Mga Setting<ph name="END_LINK" />.</translation> <translation id="1679305402657584804">Puwedeng hilingin ng mga site na gumamit ng mga NFC device</translation> <translation id="1686785653877010442">Karaniwang nagpapadala ng mga notification ang mga site para ipaalam sa iyo ang tungkol sa breaking news o mga mensahe sa chat.</translation> @@ -573,6 +574,7 @@ <translation id="6912998170423641340">I-block ang mga site sa pag-read ng text at mga larawan mula sa clipboard</translation> <translation id="6945221475159498467">Pumili</translation> <translation id="6950072572526089586">Puwedeng mag-save ang site na binibisita mo ng impormasyon tungkol sa kung ano ang ginagawa mo para gumana ito na gaya ng inaasahan — halimbawa, para panatilihin kang naka-sign in sa isang site o para mag-save ng mga item sa iyong shopping cart. Kadalasang pansamantalang sine-save ng mga site ang impormasyong ito sa iyong device.</translation> +<translation id="6964291282260073066">Naka-disable ang "WebGPU."</translation> <translation id="6965382102122355670">OK</translation> <translation id="6980507581230208647">Rose na tema</translation> <translation id="6980861169612950611">I-delete ang data ng site? <ph name="SITE_NAME" /></translation> @@ -605,6 +607,9 @@ <translation id="7276071417425470385">Kapag naka-on, puwedeng hilingin ng mga site na gumamit ng mga virtual reality device. Kapag naka-off, hindi makakagamit ang mga site ng mga virtual reality device.</translation> <translation id="7282197670900591579">Citron na tema</translation> <translation id="728412880473384942">Mas mabilis ang mga site pero hindi gaanong secure</translation> +<translation id="7352902948037373520">Pamahalaan sa <ph name="BEGIN_LINK1" />mga setting ng Android<ph name="END_LINK1" /> + +Kinokontrol ng Advanced na Proteksyon ang mga setting ng Chrome na ito:</translation> <translation id="7366415735885268578">Magdagdag ng site</translation> <translation id="7368695150573390554">Made-delete ang anumang offline data</translation> <translation id="7369678931043226462">Binuksan nang kalahati ang bottom sheet ng pag-customize ng page ng bagong tab mo</translation> @@ -715,6 +720,7 @@ <translation id="8471525937465764768">Karaniwang kumokonekta ang mga site sa mga USB device para sa mga feature gaya ng pag-print ng dokumento o pag-save sa storage device</translation> <translation id="8473055640493819707">Luma na ang '<ph name="APP_NAME" />.' Paki-install ulit ang app.</translation> <translation id="847433688444405067">Mag-browse sa lahat ng device</translation> +<translation id="8484556725636319115">Naka-off ang "JavaScript optimizer." <ph name="BEGIN_LINK2" />Pamahalaan ang mga exception sa Site<ph name="END_LINK2" /></translation> <translation id="8487700953926739672">Available sa offline</translation> <translation id="848952951823693243">Palaging hilingin ang pang-mobile na site</translation> <translation id="8492822722330266509">Puwedeng magpadala ng mga pop-up at gumamit ng mga pag-redirect ang mga site</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 064b6e6..f0e1031 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
@@ -64,6 +64,7 @@ <translation id="1644574205037202324">Logg</translation> <translation id="1652197001188145583">Når dette er på, kan nettsteder be om å få bruke NFC-enheter. Når dette er av, kan ikke nettsteder bruke NFC-enheter.</translation> <translation id="1660204651932907780">Tillat nettsteder å spille av lyd (anbefales)</translation> +<translation id="1676590040242013349">«Bruk alltid sikre tilkoblinger» er på.</translation> <translation id="1677097821151855053">Informasjonskapsler og andre nettstedsdata brukes til å huske deg, for eksempel for å logge deg på eller for å vise deg personlig tilpassede annonser. For å administrere informasjonskapsler for alle nettsteder, se <ph name="BEGIN_LINK" />Innstillinger<ph name="END_LINK" />.</translation> <translation id="1679305402657584804">Nettsteder kan be om å få bruke NFC-enheter</translation> <translation id="1686785653877010442">Nettsteder sender vanligvis varsler for å informere deg om siste nytt eller chatmeldinger.</translation> @@ -573,6 +574,7 @@ <translation id="6912998170423641340">Blokkér nettsteder fra å få tilgang til tekst og bilder fra utklippstavlen</translation> <translation id="6945221475159498467">Velg</translation> <translation id="6950072572526089586">Nettsteder du besøker, kan lagre informasjon om hva du gjør, slik at nettstedene fungerer som forventet – for eksempel for å holde deg pålogget eller for å lagre varer i handlekurven din. Ofte lagrer nettsteder denne informasjonen midlertidig på enheten din.</translation> +<translation id="6964291282260073066">«WebGPU» er deaktivert.</translation> <translation id="6965382102122355670">OK</translation> <translation id="6980507581230208647">Rose tema</translation> <translation id="6980861169612950611">Vil du slette nettstedsdata? <ph name="SITE_NAME" /></translation> @@ -605,6 +607,9 @@ <translation id="7276071417425470385">Når dette er på, kan nettsteder be om å få bruke virtuell virkelighet-enheter. Når dette er av, kan ikke nettsteder bruke virtuell virkelighet-enheter.</translation> <translation id="7282197670900591579">Sitron tema</translation> <translation id="728412880473384942">Nettsteder er raskere, men mindre sikre</translation> +<translation id="7352902948037373520">Administrer i <ph name="BEGIN_LINK1" />Android-innstillingene<ph name="END_LINK1" /> + +Avansert beskyttelse styrer disse Chrome-innstillingene:</translation> <translation id="7366415735885268578">Legg til et nettsted</translation> <translation id="7368695150573390554">Alle data som er lagret for bruk uten nett, blir slettet</translation> <translation id="7369678931043226462">Feltet nederst for tilpasning av Ny fane-siden er åpnet i halv høyde</translation> @@ -715,6 +720,7 @@ <translation id="8471525937465764768">Nettsteder kobler vanligvis til USB-enheter for å kunne tilby funksjoner som å skrive ut dokumenter eller lagre filer på lagringsenheter</translation> <translation id="8473055640493819707">«<ph name="APP_NAME" />» er utdatert. Installer appen på nytt.</translation> <translation id="847433688444405067">Bla gjennom enheter</translation> +<translation id="8484556725636319115">«JavaScript-optimalisering» er av. <ph name="BEGIN_LINK2" />Administrer nettstedsunntak<ph name="END_LINK2" /></translation> <translation id="8487700953926739672">Tilgjengelig utenfor nettet</translation> <translation id="848952951823693243">Be alltid om mobilnettstedet</translation> <translation id="8492822722330266509">Nettsteder kan sende forgrunnsvinduer og bruke viderekoblinger</translation>
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index eecbf316..75547125 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "85.20", - "log_list_timestamp": "2026-03-19T13:35:34Z", + "version": "85.21", + "log_list_timestamp": "2026-03-20T13:36:33Z", "operators": [ { "name": "Google",
diff --git a/components/collaboration/internal/android/collaboration_service_android.cc b/components/collaboration/internal/android/collaboration_service_android.cc index be29597..277dde81 100644 --- a/components/collaboration/internal/android/collaboration_service_android.cc +++ b/components/collaboration/internal/android/collaboration_service_android.cc
@@ -59,7 +59,7 @@ : collaboration_service_(collaboration_service) { DCHECK(collaboration_service_); JNIEnv* env = base::android::AttachCurrentThread(); - java_obj_.Reset(env, JCollaborationServiceImplJni::create( + java_obj_.Reset(env, CollaborationServiceImplJni::create( env, reinterpret_cast<int64_t>(this))); } @@ -114,7 +114,7 @@ JNIEnv* env) { ServiceStatus status = collaboration_service_->GetServiceStatus(); - return JServiceStatusJni::createServiceStatus( + return ServiceStatusJni::createServiceStatus( env, static_cast<int>(status.signin_status), static_cast<int>(status.sync_status), static_cast<int>(status.collaboration_status)); @@ -169,11 +169,11 @@ const ServiceStatusUpdate& update) { JNIEnv* env = base::android::AttachCurrentThread(); - auto j_old_status = JServiceStatusJni::createServiceStatus( + auto j_old_status = ServiceStatusJni::createServiceStatus( env, static_cast<int>(update.old_status.signin_status), static_cast<int>(update.old_status.sync_status), static_cast<int>(update.old_status.collaboration_status)); - auto j_new_status = JServiceStatusJni::createServiceStatus( + auto j_new_status = ServiceStatusJni::createServiceStatus( env, static_cast<int>(update.new_status.signin_status), static_cast<int>(update.new_status.sync_status), static_cast<int>(update.new_status.collaboration_status));
diff --git a/components/contextual_search/contextual_search_metrics_recorder.cc b/components/contextual_search/contextual_search_metrics_recorder.cc index 344c5a0..97bcf4b 100644 --- a/components/contextual_search/contextual_search_metrics_recorder.cc +++ b/components/contextual_search/contextual_search_metrics_recorder.cc
@@ -561,30 +561,30 @@ } void ContextualSearchMetricsRecorder::RecordToolMode( - composebox_query::mojom::ToolMode tool_mode) { + omnibox::ToolMode tool_mode) { base::UmaHistogramEnumeration( - base::StrCat({"ContextualSearch.Tools", ".", metrics_suffix_}), - tool_mode); + base::StrCat({"ContextualSearch.Tools", ".", metrics_suffix_}), tool_mode, + static_cast<omnibox::ToolMode>(omnibox::ToolMode_MAX + 1)); } void ContextualSearchMetricsRecorder::RecordModelMode( - composebox_query::mojom::ModelMode model_mode) { + omnibox::ModelMode model_mode) { base::UmaHistogramEnumeration( base::StrCat({"ContextualSearch.Models", ".", metrics_suffix_}), - model_mode); + model_mode, static_cast<omnibox::ModelMode>(omnibox::ModelMode_MAX + 1)); } void ContextualSearchMetricsRecorder::RecordModesOnSubmission( - composebox_query::mojom::ToolMode tool_mode, - composebox_query::mojom::ModelMode model_mode) { + omnibox::ToolMode tool_mode, + omnibox::ModelMode model_mode) { base::UmaHistogramEnumeration( base::StrCat( {"ContextualSearch.Tools.ModeOnSubmission", ".", metrics_suffix_}), - tool_mode); + tool_mode, static_cast<omnibox::ToolMode>(omnibox::ToolMode_MAX + 1)); base::UmaHistogramEnumeration( base::StrCat( {"ContextualSearch.Models.ModeOnSubmission", ".", metrics_suffix_}), - model_mode); + model_mode, static_cast<omnibox::ModelMode>(omnibox::ModelMode_MAX + 1)); } void ContextualSearchMetricsRecorder::RecordZeroSuggestClick(
diff --git a/components/contextual_search/contextual_search_metrics_recorder.h b/components/contextual_search/contextual_search_metrics_recorder.h index 47eb1fa9..fc4c5bc 100644 --- a/components/contextual_search/contextual_search_metrics_recorder.h +++ b/components/contextual_search/contextual_search_metrics_recorder.h
@@ -13,6 +13,8 @@ #include "components/contextual_search/contextual_search_types.h" #include "components/omnibox/composebox/composebox_query.mojom.h" +#include "third_party/omnibox_proto/model_mode.pb.h" +#include "third_party/omnibox_proto/tool_mode.pb.h" namespace base { class ElapsedTimer; @@ -150,15 +152,14 @@ bool success); // Records the tool mode (i.e. Deep Search, Create Images, etc.). - virtual void RecordToolMode(composebox_query::mojom::ToolMode tool_mode); + virtual void RecordToolMode(omnibox::ToolMode tool_mode); // Records the model mode (i.e. Gemini Pro, Gemini Pro Autoroute, etc.). - virtual void RecordModelMode(composebox_query::mojom::ModelMode model_mode); + virtual void RecordModelMode(omnibox::ModelMode model_mode); // Records tool mode and model mode on query submission. - virtual void RecordModesOnSubmission( - composebox_query::mojom::ToolMode tool_mode, - composebox_query::mojom::ModelMode model_mode); + virtual void RecordModesOnSubmission(omnibox::ToolMode tool_mode, + omnibox::ModelMode model_mode); // Records when a zero-suggest suggestion is clicked. virtual void RecordZeroSuggestClick(bool is_contextual);
diff --git a/components/contextual_search/contextual_search_metrics_recorder_unittest.cc b/components/contextual_search/contextual_search_metrics_recorder_unittest.cc index 395b633..741f1693 100644 --- a/components/contextual_search/contextual_search_metrics_recorder_unittest.cc +++ b/components/contextual_search/contextual_search_metrics_recorder_unittest.cc
@@ -346,34 +346,31 @@ TEST_F(ContextualSearchMetricsRecorderTest, ToolMode) { metrics().NotifySessionStateChanged(SessionState::kSessionStarted); - metrics().RecordToolMode(composebox_query::mojom::ToolMode::kImageGen); + metrics().RecordToolMode(omnibox::ToolMode::TOOL_MODE_IMAGE_GEN); DestructMetricsRecorder(); histogram_tester().ExpectUniqueSample( - kContextualSearchToolMode, composebox_query::mojom::ToolMode::kImageGen, - 1); + kContextualSearchToolMode, omnibox::ToolMode::TOOL_MODE_IMAGE_GEN, 1); } TEST_F(ContextualSearchMetricsRecorderTest, ModelMode) { metrics().NotifySessionStateChanged(SessionState::kSessionStarted); - metrics().RecordModelMode(composebox_query::mojom::ModelMode::kGeminiPro); + metrics().RecordModelMode(omnibox::ModelMode::MODEL_MODE_GEMINI_PRO); DestructMetricsRecorder(); histogram_tester().ExpectUniqueSample( - kContextualSearchModelMode, - composebox_query::mojom::ModelMode::kGeminiPro, 1); + kContextualSearchModelMode, omnibox::ModelMode::MODEL_MODE_GEMINI_PRO, 1); } TEST_F(ContextualSearchMetricsRecorderTest, ModesOnSubmission) { metrics().NotifySessionStateChanged(SessionState::kSessionStarted); - metrics().RecordModesOnSubmission( - composebox_query::mojom::ToolMode::kImageGen, - composebox_query::mojom::ModelMode::kGeminiPro); + metrics().RecordModesOnSubmission(omnibox::ToolMode::TOOL_MODE_IMAGE_GEN, + omnibox::ModelMode::MODEL_MODE_GEMINI_PRO); DestructMetricsRecorder(); - histogram_tester().ExpectUniqueSample( - kContextualSearchToolModeOnSubmission, - composebox_query::mojom::ToolMode::kImageGen, 1); + histogram_tester().ExpectUniqueSample(kContextualSearchToolModeOnSubmission, + omnibox::ToolMode::TOOL_MODE_IMAGE_GEN, + 1); histogram_tester().ExpectUniqueSample( kContextualSearchModelModeOnSubmission, - composebox_query::mojom::ModelMode::kGeminiPro, 1); + omnibox::ModelMode::MODEL_MODE_GEMINI_PRO, 1); } TEST_F(ContextualSearchMetricsRecorderTest, TabContextAdded) {
diff --git a/components/contextual_tasks/internal/ai_thread_sync_bridge.cc b/components/contextual_tasks/internal/ai_thread_sync_bridge.cc index 7092d5d..36d526f 100644 --- a/components/contextual_tasks/internal/ai_thread_sync_bridge.cc +++ b/components/contextual_tasks/internal/ai_thread_sync_bridge.cc
@@ -71,7 +71,7 @@ std::unique_ptr<syncer::MetadataChangeList> metadata_change_list, syncer::EntityChangeList entity_changes) { std::unique_ptr<syncer::DataTypeStore::WriteBatch> batch = - data_type_store_->CreateWriteBatch(); + data_type_store_->CreateWriteBatch(std::move(metadata_change_list)); std::vector<proto::AiThreadEntity> added_or_updated; std::vector<base::Uuid> removed; for (const std::unique_ptr<syncer::EntityChange>& change : entity_changes) { @@ -97,7 +97,6 @@ } } - batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); data_type_store_->CommitWriteBatch( std::move(batch), base::BindOnce(&AiThreadSyncBridge::OnDataTypeStoreCommit,
diff --git a/components/contextual_tasks/internal/gemini_thread_sync_bridge.cc b/components/contextual_tasks/internal/gemini_thread_sync_bridge.cc index 26385ec..631ce32 100644 --- a/components/contextual_tasks/internal/gemini_thread_sync_bridge.cc +++ b/components/contextual_tasks/internal/gemini_thread_sync_bridge.cc
@@ -65,7 +65,7 @@ std::unique_ptr<syncer::MetadataChangeList> metadata_change_list, syncer::EntityChangeList entity_changes) { std::unique_ptr<syncer::DataTypeStore::WriteBatch> batch = - data_type_store_->CreateWriteBatch(); + data_type_store_->CreateWriteBatch(std::move(metadata_change_list)); std::vector<sync_pb::GeminiThreadSpecifics> added_or_updated; std::vector<base::Uuid> removed; for (const std::unique_ptr<syncer::EntityChange>& change : entity_changes) { @@ -91,7 +91,6 @@ } } - batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); data_type_store_->CommitWriteBatch( std::move(batch), base::BindOnce(&GeminiThreadSyncBridge::OnDataTypeStoreCommit,
diff --git a/components/data_sharing/internal/collaboration_group_sync_bridge.cc b/components/data_sharing/internal/collaboration_group_sync_bridge.cc index e0e243b5..e4d43685 100644 --- a/components/data_sharing/internal/collaboration_group_sync_bridge.cc +++ b/components/data_sharing/internal/collaboration_group_sync_bridge.cc
@@ -85,7 +85,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); std::unique_ptr<syncer::DataTypeStore::WriteBatch> batch = - data_type_store_->CreateWriteBatch(); + data_type_store_->CreateWriteBatch(std::move(metadata_change_list)); std::vector<GroupId> added_ids; std::vector<GroupId> updated_ids; @@ -127,7 +127,6 @@ } } - batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); data_type_store_->CommitWriteBatch( std::move(batch), base::BindOnce(&CollaborationGroupSyncBridge::OnDataTypeStoreCommit,
diff --git a/components/data_sharing/internal/personal_collaboration_data/personal_collaboration_data_sync_bridge.cc b/components/data_sharing/internal/personal_collaboration_data/personal_collaboration_data_sync_bridge.cc index 8590b73a6..031d8a3 100644 --- a/components/data_sharing/internal/personal_collaboration_data/personal_collaboration_data_sync_bridge.cc +++ b/components/data_sharing/internal/personal_collaboration_data/personal_collaboration_data_sync_bridge.cc
@@ -188,7 +188,7 @@ MaybeNotifyObserversInitialized(); std::unique_ptr<syncer::DataTypeStore::WriteBatch> batch = - store_->CreateWriteBatch(); + store_->CreateWriteBatch(std::move(metadata_change_list)); for (const std::unique_ptr<syncer::EntityChange>& change : entity_change_list) { @@ -219,7 +219,6 @@ } } - batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); store_->CommitWriteBatch( std::move(batch), base::BindOnce(
diff --git a/components/data_sharing/internal/personal_collaboration_data/personal_collaboration_data_sync_bridge_unittest.cc b/components/data_sharing/internal/personal_collaboration_data/personal_collaboration_data_sync_bridge_unittest.cc index 64b17dc1..4ca712d 100644 --- a/components/data_sharing/internal/personal_collaboration_data/personal_collaboration_data_sync_bridge_unittest.cc +++ b/components/data_sharing/internal/personal_collaboration_data/personal_collaboration_data_sync_bridge_unittest.cc
@@ -643,19 +643,18 @@ }); // Mock CreateWriteBatch to return a valid batch. - ON_CALL(*mock_store, CreateWriteBatch).WillByDefault([]() { + ON_CALL(*mock_store, CreateWriteBatch(_)).WillByDefault([]() { return std::make_unique<FakeWriteBatch>(); }); // Mock CommitWriteBatch to fail. EXPECT_CALL(*mock_store, CommitWriteBatch) - .WillOnce( - [](std::unique_ptr<syncer::DataTypeStore::WriteBatch> batch, - syncer::DataTypeStore::CallbackWithResult callback) { - std::move(callback).Run(syncer::ModelError( - FROM_HERE, - syncer::ModelError::Type::kDataTypeStoreBackendDbWriteFailed)); - }); + .WillOnce([](std::unique_ptr<syncer::DataTypeStore::WriteBatch> batch, + syncer::DataTypeStore::CallbackWithResult callback) { + std::move(callback).Run(syncer::ModelError( + FROM_HERE, + syncer::ModelError::Type::kDataTypeStoreBackendDbWriteFailed)); + }); base::RunLoop run_loop; EXPECT_CALL(mock_processor(), ModelReadyToSync).WillOnce([&]() {
diff --git a/components/desks_storage/core/desk_sync_bridge.cc b/components/desks_storage/core/desk_sync_bridge.cc index 664067e1..97cd023 100644 --- a/components/desks_storage/core/desk_sync_bridge.cc +++ b/components/desks_storage/core/desk_sync_bridge.cc
@@ -180,7 +180,8 @@ syncer::EntityChangeList entity_changes) { std::vector<raw_ptr<const DeskTemplate, VectorExperimental>> added_or_updated; std::vector<base::Uuid> removed; - std::unique_ptr<DataTypeStore::WriteBatch> batch = store_->CreateWriteBatch(); + std::unique_ptr<DataTypeStore::WriteBatch> batch = + store_->CreateWriteBatch(std::move(metadata_change_list)); for (const std::unique_ptr<syncer::EntityChange>& change : entity_changes) { const base::Uuid uuid = @@ -224,8 +225,6 @@ } } } - - batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); Commit(std::move(batch)); NotifyRemoteDeskTemplateAddedOrUpdated(added_or_updated);
diff --git a/components/enterprise/browser/reporting/reporting_features.cc b/components/enterprise/browser/reporting/reporting_features.cc index 2a65b6f..ea89ab8 100644 --- a/components/enterprise/browser/reporting/reporting_features.cc +++ b/components/enterprise/browser/reporting/reporting_features.cc
@@ -10,4 +10,7 @@ BASE_FEATURE(kSaasUsageReporting, base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kBrowserLaunchMetadataReporting, + base::FEATURE_DISABLED_BY_DEFAULT); + } // namespace enterprise_reporting
diff --git a/components/enterprise/browser/reporting/reporting_features.h b/components/enterprise/browser/reporting/reporting_features.h index 9f18e5de..0fc70e73 100644 --- a/components/enterprise/browser/reporting/reporting_features.h +++ b/components/enterprise/browser/reporting/reporting_features.h
@@ -12,6 +12,10 @@ // Controls whether SaaS usage reporting is enabled. BASE_DECLARE_FEATURE(kSaasUsageReporting); +// Controls whether the browser should report launch-related metadata, +// such as the exact command line switches used at startup. +BASE_DECLARE_FEATURE(kBrowserLaunchMetadataReporting); + } // namespace enterprise_reporting #endif // COMPONENTS_ENTERPRISE_BROWSER_REPORTING_REPORTING_FEATURES_H_
diff --git a/components/guest_view/browser/slim_web_view/README.md b/components/guest_view/browser/slim_web_view/README.md new file mode 100644 index 0000000..79cd533 --- /dev/null +++ b/components/guest_view/browser/slim_web_view/README.md
@@ -0,0 +1,118 @@ +# SlimWebview + +`SlimWebview` is a minimal, non-extensions-based implementation of `<webview>` +for Chrome WebUIs. + +It is used **only on Android mobile**, where extensions are unavailable. + +## Enabling in C++ + +When implementing a WebUI that runs both on desktop platforms and +Android mobile, you should check the `ENABLE_EXTENSIONS_CORE` buildflag to +decide which implementation of `<webview>` to use. + +To enable `SlimWebview` in your WebUI: + +### 1. WebUI Configuration + +In your `MojoWebUIController` implementation: +- Set the `content::BindingsPolicyValue::kSlimWebView` bindings policy. +- Add `kGuestViewSharedResources` from + [guest_view_shared_resources_map.h](https://source.chromium.org/chromium/chromium/src/+/main:chrome/grit/guest_view_shared_resources_map.h) + to your `WebUIDataSource`. + +Example from [glic_ui.cc](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/glic/host/glic_ui.cc): + +```cpp +#if !BUILDFLAG(ENABLE_EXTENSIONS_CORE) + auto bindings = web_ui->GetBindings(); + bindings.Put(content::BindingsPolicyValue::kSlimWebView); + web_ui->SetBindings(bindings); + source->AddResourcePaths(kGuestViewSharedResources); +#endif +``` + +### 2. Mojo Interface + +Your `WebUIController` should directly inherit from `guest_view::SlimWebViewPageHandlerFactory`. + +Example from [glic_ui.h](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/glic/host/glic_ui.h): + +```cpp +class GlicUI : public ui::MojoWebUIController, +#if !BUILDFLAG(ENABLE_EXTENSIONS_CORE) + public guest_view::SlimWebViewPageHandlerFactory, +#endif + ... + public: +#if !BUILDFLAG(ENABLE_EXTENSIONS_CORE) + using SlimWebViewPageHandlerFactory::BindInterface; +#endif + + ... + private: +#if !BUILDFLAG(ENABLE_EXTENSIONS_CORE) + using SlimWebViewPageHandlerFactory::CreatePageHandler; +#endif +``` + +### 3. Interface Binding + +Register the factory in `chrome/browser/chrome_browser_interface_binders_webui_parts_features.cc`. + +```cpp +#if !BUILDFLAG(ENABLE_EXTENSIONS_CORE) + RegisterWebUIControllerInterfaceBinder<guest_view::mojom::PageHandlerFactory, + glic::GlicUI, + your_namespace::YourUI>(map); +#endif +``` + +## Frontend Configuration + +### BUILD.gn + +You need to add `ts_path_mappings` for the shared `SlimWebview` resources and include the dependencies conditionally. + +Example from [chrome/browser/resources/glic/BUILD.gn](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/resources/glic/BUILD.gn): +```gn + if (enable_guest_view && !enable_extensions_core) { + ts_deps += [ "//chrome/browser/resources/guest_view_shared:build_ts" ] + + ts_path_mappings += + [ "/shared/guest_view/*|" + rebase_path( + "$root_gen_dir/chrome/browser/resources/guest_view_shared/tsc/*", + target_gen_dir) ] + } +``` + +## Frontend Usage + +### Shared Types + +You can use a shared type to support both webview implementations conditionally. + +Example from +[web_view_type.ts](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/resources/glic/shared/web_view_type.ts): +```typescript +// <if expr="not enable_extensions_core"> +import '/shared/guest_view/slim_webview.js'; +// </if> +import type {SlimWebviewElement} from '/shared/guest_view/slim_webview.js'; + +export type WebViewType = chrome.webviewTag.WebView|SlimWebviewElement; +``` + +### Conditional Import + +Use preprocess `if` expressions to import `slim_webview.js` only when extensions +are not enabled. + +```typescript +// <if expr="not enable_extensions_core"> +import '/shared/guest_view/slim_webview.js'; +// </if> +``` + +The markup remains the same as a standard `<webview>`, but it will be backed by +`SlimWebviewElement` on Android.
diff --git a/components/live_caption/live_translate_controller.cc b/components/live_caption/live_translate_controller.cc index d2e0c094..34019af 100644 --- a/components/live_caption/live_translate_controller.cc +++ b/components/live_caption/live_translate_controller.cc
@@ -34,27 +34,16 @@ constexpr char kLiveGoogleApiTranslateDispatcherResult[] = "Accessibility.LiveTranslate.GoogleApiTranslation.Result"; -void OnGetTranslation(std::string_view source_language, - std::string_view target_language, - TranslateEventCallback callback, - const TranslateEvent& translate_event) { - std::string_view histogram_name = - base::FeatureList::IsEnabled( - live_caption::kLiveCaptionOnDeviceTranslation) - ? kLiveOnDeviceTranslateDispatcherResult - : kLiveGoogleApiTranslateDispatcherResult; - base::UmaHistogramBoolean(histogram_name, translate_event.has_value()); - std::move(callback).Run(translate_event); -} - } // namespace LiveTranslateController::LiveTranslateController( PrefService* profile_prefs, - std::unique_ptr<TranslationDispatcher> translation_dispatcher) + std::unique_ptr<TranslationDispatcher> on_device_dispatcher, + std::unique_ptr<TranslationDispatcher> google_api_dispatcher) : profile_prefs_(profile_prefs), pref_change_registrar_(std::make_unique<PrefChangeRegistrar>()), - translation_dispatcher_(std::move(translation_dispatcher)) { + on_device_dispatcher_(std::move(on_device_dispatcher)), + google_api_dispatcher_(std::move(google_api_dispatcher)) { pref_change_registrar_->Init(profile_prefs_); pref_change_registrar_->Add( prefs::kLiveTranslateEnabled, @@ -84,10 +73,48 @@ base::UmaHistogramSparse( "Accessibility.LiveTranslate.GetTranslation.SourceLanguage", base::HashMetricName(source_language)); - translation_dispatcher_->GetTranslation( - result, source_language, target_language, - base::BindOnce(OnGetTranslation, source_language, target_language, - std::move(callback))); + + if (base::FeatureList::IsEnabled( + live_caption::kLiveCaptionOnDeviceTranslation)) { + on_device_dispatcher_->GetTranslation( + result, source_language, target_language, + base::BindOnce(&LiveTranslateController::OnOnDeviceTranslated, + weak_factory_.GetWeakPtr(), result, source_language, + target_language, std::move(callback))); + } else { + google_api_dispatcher_->GetTranslation( + result, source_language, target_language, + base::BindOnce(&LiveTranslateController::OnGoogleApiTranslated, + weak_factory_.GetWeakPtr(), std::move(callback))); + } +} + +void LiveTranslateController::OnOnDeviceTranslated( + std::string_view result, + std::string_view source_language, + std::string_view target_language, + TranslateEventCallback callback, + const TranslateEvent& translate_event) { + base::UmaHistogramBoolean(kLiveOnDeviceTranslateDispatcherResult, + translate_event.has_value()); + if (!translate_event.has_value() && google_api_dispatcher_) { + google_api_dispatcher_->GetTranslation( + std::string(result), std::string(source_language), + std::string(target_language), + base::BindOnce(&LiveTranslateController::OnGoogleApiTranslated, + weak_factory_.GetWeakPtr(), std::move(callback))); + return; + } + + std::move(callback).Run(translate_event); +} + +void LiveTranslateController::OnGoogleApiTranslated( + TranslateEventCallback callback, + const TranslateEvent& translate_event) { + base::UmaHistogramBoolean(kLiveGoogleApiTranslateDispatcherResult, + translate_event.has_value()); + std::move(callback).Run(translate_event); } void LiveTranslateController::OnLiveTranslateEnabledChanged() {
diff --git a/components/live_caption/live_translate_controller.h b/components/live_caption/live_translate_controller.h index a9f8590..e75b523 100644 --- a/components/live_caption/live_translate_controller.h +++ b/components/live_caption/live_translate_controller.h
@@ -35,7 +35,8 @@ public: LiveTranslateController( PrefService* profile_prefs, - std::unique_ptr<TranslationDispatcher> translation_dispatcher); + std::unique_ptr<TranslationDispatcher> translation_dispatcher, + std::unique_ptr<TranslationDispatcher> google_api_dispatcher); LiveTranslateController(const LiveTranslateController&) = delete; LiveTranslateController& operator=(const LiveTranslateController&) = delete; ~LiveTranslateController() override; @@ -49,9 +50,17 @@ private: void OnLiveTranslateEnabledChanged(); + void OnOnDeviceTranslated(std::string_view result, + std::string_view source_language, + std::string_view target_language, + TranslateEventCallback callback, + const TranslateEvent& translate_event); + void OnGoogleApiTranslated(TranslateEventCallback callback, + const TranslateEvent& translate_event); raw_ptr<PrefService> profile_prefs_; const std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_; - const std::unique_ptr<TranslationDispatcher> translation_dispatcher_; + const std::unique_ptr<TranslationDispatcher> on_device_dispatcher_; + const std::unique_ptr<TranslationDispatcher> google_api_dispatcher_; base::WeakPtrFactory<LiveTranslateController> weak_factory_{this}; };
diff --git a/components/live_caption/live_translate_controller_unittest.cc b/components/live_caption/live_translate_controller_unittest.cc index 1ce2c0a..3ef6b47 100644 --- a/components/live_caption/live_translate_controller_unittest.cc +++ b/components/live_caption/live_translate_controller_unittest.cc
@@ -55,16 +55,19 @@ live_caption::kLiveCaptionOnDeviceTranslation); base::HistogramTester histogram_tester; - auto mock_translation_dispatcher = + auto mock_on_device_dispatcher = std::make_unique<testing::StrictMock<MockTranslationDispatcher>>(); - auto* translation_dispatcher_ptr = mock_translation_dispatcher.get(); + auto mock_google_api_dispatcher = + std::make_unique<testing::StrictMock<MockTranslationDispatcher>>(); + auto* google_api_dispatcher_ptr = mock_google_api_dispatcher.get(); LiveTranslateController controller(&prefs_, - std::move(mock_translation_dispatcher)); + std::move(mock_on_device_dispatcher), + std::move(mock_google_api_dispatcher)); // Verify that the controller forwards translation requests to the underlying // dispatcher and successfully records true (success) in the Google API UMA // histogram. - EXPECT_CALL(*translation_dispatcher_ptr, + EXPECT_CALL(*google_api_dispatcher_ptr, GetTranslation("hello", "en", "es", testing::_)) .WillOnce([](absl::string_view result, absl::string_view source_language, absl::string_view target_language, @@ -82,37 +85,48 @@ /*sample=*/true, /*expected_bucket_count=*/1); } -TEST_F(LiveTranslateControllerTest, - GetTranslationRecordsMetrics_OnDevice_Failure) { +TEST_F(LiveTranslateControllerTest, GetTranslation_FallsBackToGoogleApi) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature( live_caption::kLiveCaptionOnDeviceTranslation); base::HistogramTester histogram_tester; - auto mock_translation_dispatcher = - std::make_unique<testing::StrictMock<MockTranslationDispatcher>>(); - auto* translation_dispatcher_ptr = mock_translation_dispatcher.get(); - LiveTranslateController controller(&prefs_, - std::move(mock_translation_dispatcher)); + auto mock_on_device_dispatcher = + std::make_unique<testing::NiceMock<MockTranslationDispatcher>>(); + auto mock_google_api_dispatcher = + std::make_unique<testing::NiceMock<MockTranslationDispatcher>>(); - // Controller calls dispatcher and successfully records false (failure) in the - // On-Device UMA histogram. - EXPECT_CALL(*translation_dispatcher_ptr, - GetTranslation("hello", "en", "es", testing::_)) + auto* on_device_ptr = mock_on_device_dispatcher.get(); + auto* google_api_ptr = mock_google_api_dispatcher.get(); + + LiveTranslateController controller(&prefs_, + std::move(mock_on_device_dispatcher), + std::move(mock_google_api_dispatcher)); + // 1. On-device fails + EXPECT_CALL(*on_device_ptr, GetTranslation("hello", "en", "fr", testing::_)) .WillOnce([](absl::string_view result, absl::string_view source_language, absl::string_view target_language, TranslateEventCallback callback) { - std::move(callback).Run(base::unexpected("translation failed")); + std::move(callback).Run(base::unexpected("on-device failed")); + }); + + // 2. Google API is called as fallback + EXPECT_CALL(*google_api_ptr, GetTranslation("hello", "en", "fr", testing::_)) + .WillOnce([](absl::string_view result, absl::string_view source_language, + absl::string_view target_language, + TranslateEventCallback callback) { + std::move(callback).Run(base::ok("bonjour")); }); base::MockCallback<TranslateEventCallback> translate_callback; EXPECT_CALL(translate_callback, Run(testing::_)).Times(1); - controller.GetTranslation("hello", "en", "es", translate_callback.Get()); + controller.GetTranslation("hello", "en", "fr", translate_callback.Get()); - histogram_tester.ExpectUniqueSample( - "Accessibility.LiveTranslate.OnDeviceTranslation.Result", - /*sample=*/false, /*expected_bucket_count=*/1); + histogram_tester.ExpectBucketCount( + "Accessibility.LiveTranslate.OnDeviceTranslation.Result", false, 1); + histogram_tester.ExpectBucketCount( + "Accessibility.LiveTranslate.GoogleApiTranslation.Result", true, 1); } } // namespace captions
diff --git a/components/metrics/BUILD.gn b/components/metrics/BUILD.gn index 90f8de8..4f9e044 100644 --- a/components/metrics/BUILD.gn +++ b/components/metrics/BUILD.gn
@@ -602,6 +602,7 @@ "daily_event_unittest.cc", "data_use_tracker_unittest.cc", "date_changed_helper_unittest.cc", + "drive_metrics_provider_unittest.cc", "entropy_state_provider_unittest.cc", "entropy_state_unittest.cc", "environment_recorder_unittest.cc",
diff --git a/components/metrics/drive_metrics_provider.cc b/components/metrics/drive_metrics_provider.cc index c26cb8e..8b1e0b4 100644 --- a/components/metrics/drive_metrics_provider.cc +++ b/components/metrics/drive_metrics_provider.cc
@@ -16,32 +16,55 @@ #include "base/task/task_traits.h" #include "base/task/thread_pool.h" #include "base/threading/scoped_blocking_call.h" +#include "components/metrics/metrics_pref_names.h" +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/pref_service.h" namespace metrics { namespace { #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum class OptionalBoolRecord { + kUnknown = 0, + kFalse = 1, + kTrue = 2, + kMaxValue = kTrue, +}; + void RecordTriStateMetric(const char* name, std::optional<bool> sample) { base::UmaHistogramEnumeration( - name, !sample.has_value() - ? DriveMetricsProvider::OptionalBoolRecord::kUnknown - : (*sample ? DriveMetricsProvider::OptionalBoolRecord::kTrue - : DriveMetricsProvider::OptionalBoolRecord::kFalse)); + name, !sample.has_value() ? OptionalBoolRecord::kUnknown + : (*sample ? OptionalBoolRecord::kTrue + : OptionalBoolRecord::kFalse)); } #endif } // namespace -DriveMetricsProvider::DriveMetricsProvider(int local_state_path_key) - : local_state_path_key_(local_state_path_key) {} +DriveMetricsProvider::DriveMetricsProvider(int local_state_path_key, + PrefService* local_state) + : local_state_path_key_(local_state_path_key), local_state_(local_state) { + CHECK(local_state_); +} DriveMetricsProvider::~DriveMetricsProvider() = default; void DriveMetricsProvider::ProvideSystemProfileMetrics( metrics::SystemProfileProto* system_profile_proto) { auto* hardware = system_profile_proto->mutable_hardware(); - FillDriveMetrics(metrics_.app_drive, hardware->mutable_app_drive()); + FillDriveMetrics(metrics_.app_drive, hardware->mutable_app_drive(), + prefs::kMetricsAppDriveHasSeekPenalty); FillDriveMetrics(metrics_.user_data_drive, - hardware->mutable_user_data_drive()); + hardware->mutable_user_data_drive(), + prefs::kMetricsUserDataDriveHasSeekPenalty); +} + +// static +void DriveMetricsProvider::RegisterPrefs(PrefRegistrySimple* registry) { + registry->RegisterBooleanPref(prefs::kMetricsAppDriveHasSeekPenalty, false); + registry->RegisterBooleanPref(prefs::kMetricsUserDataDriveHasSeekPenalty, + false); } void DriveMetricsProvider::AsyncInit(base::OnceClosure done_callback) { @@ -100,9 +123,14 @@ void DriveMetricsProvider::FillDriveMetrics( const DriveMetricsProvider::SeekPenaltyResponse& response, - metrics::SystemProfileProto::Hardware::Drive* drive) { + metrics::SystemProfileProto::Hardware::Drive* drive, + const char* pref_name) { if (response.has_seek_penalty.has_value()) { drive->set_has_seek_penalty(*response.has_seek_penalty); + local_state_->SetBoolean(pref_name, *response.has_seek_penalty); + } else if (local_state_->HasPrefPath(pref_name)) { + // If the async task hasn't finished, read the value from the local state. + drive->set_has_seek_penalty(local_state_->GetBoolean(pref_name)); } #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
diff --git a/components/metrics/drive_metrics_provider.h b/components/metrics/drive_metrics_provider.h index af507f8..e4b95d4 100644 --- a/components/metrics/drive_metrics_provider.h +++ b/components/metrics/drive_metrics_provider.h
@@ -6,18 +6,23 @@ #define COMPONENTS_METRICS_DRIVE_METRICS_PROVIDER_H_ #include "base/functional/callback_forward.h" +#include "base/gtest_prod_util.h" +#include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" #include "components/metrics/metrics_provider.h" #include "third_party/metrics_proto/system_profile.pb.h" +class PrefRegistrySimple; +class PrefService; + namespace metrics { // Provides metrics about the local drives on a user's computer. Currently only // checks to see if they incur a seek-time penalty (e.g. if they're SSDs). class DriveMetricsProvider : public metrics::MetricsProvider { public: - explicit DriveMetricsProvider(int local_state_path_key); + DriveMetricsProvider(int local_state_path_key, PrefService* local_state); DriveMetricsProvider(const DriveMetricsProvider&) = delete; DriveMetricsProvider& operator=(const DriveMetricsProvider&) = delete; @@ -29,14 +34,8 @@ void ProvideSystemProfileMetrics( metrics::SystemProfileProto* system_profile_proto) override; - // These values are persisted to logs. Entries should not be renumbered and - // numeric values should never be reused. - enum class OptionalBoolRecord { - kUnknown = 0, - kFalse = 1, - kTrue = 2, - kMaxValue = kTrue, - }; + // Registers local state prefs used by this class. + static void RegisterPrefs(PrefRegistrySimple* registry); private: // A response to querying a drive as to whether it incurs a seek penalty. @@ -69,18 +68,28 @@ const DriveMetrics& metrics); // Fills |drive| with information from successful |response|s. + // |pref_name| is used to cache/retrieve the information in/from + // |local_state_|. void FillDriveMetrics(const SeekPenaltyResponse& response, - metrics::SystemProfileProto::Hardware::Drive* drive); + metrics::SystemProfileProto::Hardware::Drive* drive, + const char* pref_name); // The key to give to base::PathService to obtain the path to local state // (supplied by the embedder). int local_state_path_key_; + raw_ptr<PrefService> local_state_; + // Information gathered about various important drives. DriveMetrics metrics_; SEQUENCE_CHECKER(sequence_checker_); base::WeakPtrFactory<DriveMetricsProvider> weak_ptr_factory_{this}; + + FRIEND_TEST_ALL_PREFIXES(DriveMetricsProviderTest, + HasSeekPenalty_FallbackToLocalState); + FRIEND_TEST_ALL_PREFIXES(DriveMetricsProviderTest, + HasSeekPenalty_WritesToLocalState); }; } // namespace metrics
diff --git a/components/metrics/drive_metrics_provider_unittest.cc b/components/metrics/drive_metrics_provider_unittest.cc new file mode 100644 index 0000000..609a29a --- /dev/null +++ b/components/metrics/drive_metrics_provider_unittest.cc
@@ -0,0 +1,61 @@ +// Copyright 2026 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/metrics/drive_metrics_provider.h" + +#include "base/test/metrics/histogram_tester.h" +#include "components/metrics/metrics_pref_names.h" +#include "components/prefs/testing_pref_service.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/metrics_proto/system_profile.pb.h" + +namespace metrics { + +class DriveMetricsProviderTest : public testing::Test { + protected: + void SetUp() override { + DriveMetricsProvider::RegisterPrefs(local_state_.registry()); + } + + TestingPrefServiceSimple local_state_; +}; + +TEST_F(DriveMetricsProviderTest, HasSeekPenalty_FallbackToLocalState) { + // Set the pref indicating the app drive has a seek penalty. + local_state_.SetBoolean(prefs::kMetricsAppDriveHasSeekPenalty, true); + + DriveMetricsProvider provider(0, &local_state_); + SystemProfileProto::Hardware::Drive drive_proto; + + // Create an empty response, simulating that the async task hasn't finished. + DriveMetricsProvider::SeekPenaltyResponse response; + + provider.FillDriveMetrics(response, &drive_proto, + prefs::kMetricsAppDriveHasSeekPenalty); + + EXPECT_TRUE(drive_proto.has_has_seek_penalty()); + EXPECT_TRUE(drive_proto.has_seek_penalty()); +} + +TEST_F(DriveMetricsProviderTest, HasSeekPenalty_WritesToLocalState) { + DriveMetricsProvider provider(0, &local_state_); + SystemProfileProto::Hardware::Drive drive_proto; + + DriveMetricsProvider::SeekPenaltyResponse response; + response.has_seek_penalty = false; + + provider.FillDriveMetrics(response, &drive_proto, + prefs::kMetricsUserDataDriveHasSeekPenalty); + + EXPECT_TRUE(drive_proto.has_has_seek_penalty()); + EXPECT_FALSE(drive_proto.has_seek_penalty()); + + // Verify the pref is updated. + EXPECT_TRUE( + local_state_.HasPrefPath(prefs::kMetricsUserDataDriveHasSeekPenalty)); + EXPECT_FALSE( + local_state_.GetBoolean(prefs::kMetricsUserDataDriveHasSeekPenalty)); +} + +} // namespace metrics
diff --git a/components/metrics/metrics_pref_names.h b/components/metrics/metrics_pref_names.h index 57a5f27..8032c8996 100644 --- a/components/metrics/metrics_pref_names.h +++ b/components/metrics/metrics_pref_names.h
@@ -155,6 +155,12 @@ inline constexpr char kMetricsFileMetricsMetadata[] = "user_experience_metrics.file_metrics_metadata"; +// Drive metrics for SSD/HDD status reporting as fallbacks. +inline constexpr char kMetricsAppDriveHasSeekPenalty[] = + "user_experience_metrics.app_drive_has_seek_penalty"; +inline constexpr char kMetricsUserDataDriveHasSeekPenalty[] = + "user_experience_metrics.user_data_drive_has_seek_penalty"; + // Preferences for cloned installs. // The number of times the client has been reset due to cloned install.
diff --git a/components/metrics/metrics_service.cc b/components/metrics/metrics_service.cc index fc2dfb6..5f29b77 100644 --- a/components/metrics/metrics_service.cc +++ b/components/metrics/metrics_service.cc
@@ -152,6 +152,7 @@ #include "base/trace_event/named_trigger.h" #include "build/build_config.h" #include "components/metrics/clean_exit_beacon.h" +#include "components/metrics/drive_metrics_provider.h" #include "components/metrics/environment_recorder.h" #include "components/metrics/field_trials_provider.h" #include "components/metrics/metrics_features.h" @@ -321,6 +322,7 @@ void MetricsService::RegisterPrefs(PrefRegistrySimple* registry) { MetricsStateManager::RegisterPrefs(registry); MetricsLog::RegisterPrefs(registry); + DriveMetricsProvider::RegisterPrefs(registry); StabilityMetricsProvider::RegisterPrefs(registry); MetricsReportingService::RegisterPrefs(registry);
diff --git a/components/metrics/profile_metrics_service.cc b/components/metrics/profile_metrics_service.cc index c28b070..4bfd6d1 100644 --- a/components/metrics/profile_metrics_service.cc +++ b/components/metrics/profile_metrics_service.cc
@@ -19,9 +19,7 @@ constexpr size_t kMaxProfileIndexForIndividualLog = 19; constexpr std::string_view kHistogramSuffixMaxProfileCountCombinedName = ".Profile%dPlus"; -// LINT.ThenChange(//tools/metrics/histograms/metadata/signin/histograms.xml:ProfileIndexSignin, -// //tools/metrics/histograms/metadata/profile/histograms.xml:ProfileIndexProfile, -// //tools/metrics/histograms/metadata/search/histograms.xml:ProfileIndexSearch) +// LINT.ThenChange(//tools/metrics/histograms/variants.xml:ProfileIndex) std::string GetHistogramSuffix(std::optional<size_t> profile_index) { if (!profile_index.has_value()) {
diff --git a/components/multistep_filter/core/annotation_index/annotation_index_client.h b/components/multistep_filter/core/annotation_index/annotation_index_client.h index 61a1e939b..edd0a4aa 100644 --- a/components/multistep_filter/core/annotation_index/annotation_index_client.h +++ b/components/multistep_filter/core/annotation_index/annotation_index_client.h
@@ -17,7 +17,7 @@ namespace multistep_filter { struct FilterAnnotation; -class UrlFilterSuggestion; +struct FilterSuggestionCandidate; // `AnnotationIndexClient` serves as the dedicated network and translation layer // between the `multistep_filter` component and the remote @@ -42,23 +42,23 @@ virtual ~AnnotationIndexClient() = default; // Evaluates potential filter candidates and generates a list of - // `UrlFilterSuggestion`s. If no suggestions are found, returns an empty - // vector. - virtual void GetUrlFilterSuggestions( + // `FilterSuggestionCandidate`s. If no candidates were found, invokes + // `callback` with `std::nullopt`. + virtual void GetFilterSuggestionCandidates( const GURL& url, base::span<const FilterAnnotation> filter_annotations, - base::OnceCallback<void(std::optional<std::vector<UrlFilterSuggestion>>)> - callback) = 0; + base::OnceCallback<void( + std::optional<std::vector<FilterSuggestionCandidate>>)> callback) = 0; // Retrieves the supported task types for a specific domain. If the domain is - // not supported, returns `std::nullopt`. + // not supported, invokes `callback` with `std::nullopt`. virtual void GetSupportedTaskTypesForDomain( std::string_view domain, base::OnceCallback<void(std::optional<std::vector<std::string>>)> callback) = 0; // Parses a raw URL to identify and extract a `FilterAnnotation`. If no - // annotation is present, returns `std::nullopt`. + // annotation is present, invokes `callback` with `std::nullopt`. virtual void ExtractFilterAnnotation( const GURL& url, base::OnceCallback<void(std::optional<FilterAnnotation>)> callback) = 0;
diff --git a/components/multistep_filter/core/annotation_index/annotation_index_client_impl.cc b/components/multistep_filter/core/annotation_index/annotation_index_client_impl.cc index 1ef80143..e40cd9b 100644 --- a/components/multistep_filter/core/annotation_index/annotation_index_client_impl.cc +++ b/components/multistep_filter/core/annotation_index/annotation_index_client_impl.cc
@@ -12,9 +12,8 @@ #include "base/functional/callback.h" #include "base/notimplemented.h" -#include "components/multistep_filter/core/annotation_index/proto/annotation_index.pb.h" #include "components/multistep_filter/core/data_models/filter_annotation.h" -#include "components/multistep_filter/core/data_models/url_filter_suggestion.h" +#include "components/multistep_filter/core/data_models/filter_suggestion_candidate.h" #include "url/gurl.h" namespace multistep_filter { @@ -27,13 +26,13 @@ AnnotationIndexClientImpl::AnnotationIndexClientImpl() = default; AnnotationIndexClientImpl::~AnnotationIndexClientImpl() = default; -void AnnotationIndexClientImpl::GetUrlFilterSuggestions( +void AnnotationIndexClientImpl::GetFilterSuggestionCandidates( const GURL& url, base::span<const FilterAnnotation> filter_annotations, - base::OnceCallback<void(std::optional<std::vector<UrlFilterSuggestion>>)> - callback) { + base::OnceCallback< + void(std::optional<std::vector<FilterSuggestionCandidate>>)> callback) { // TODO(crbug.com/483677417): Implement the logic to retrieve the - // `UrlFilterSuggestion`s for a given url and filter annotations. + // `FilterSuggestionCandidate`s for a given url and filter annotations. NOTIMPLEMENTED(); std::move(callback).Run(std::nullopt); }
diff --git a/components/multistep_filter/core/annotation_index/annotation_index_client_impl.h b/components/multistep_filter/core/annotation_index/annotation_index_client_impl.h index f032d871..9cbebce5 100644 --- a/components/multistep_filter/core/annotation_index/annotation_index_client_impl.h +++ b/components/multistep_filter/core/annotation_index/annotation_index_client_impl.h
@@ -16,7 +16,7 @@ namespace multistep_filter { struct FilterAnnotation; -class UrlFilterSuggestion; +struct FilterSuggestionCandidate; class AnnotationIndexClientImpl : public AnnotationIndexClient { public: @@ -24,11 +24,12 @@ ~AnnotationIndexClientImpl() override; // AnnotationIndexClient overrides: - void GetUrlFilterSuggestions( + void GetFilterSuggestionCandidates( const GURL& url, base::span<const FilterAnnotation> filter_annotations, - base::OnceCallback<void(std::optional<std::vector<UrlFilterSuggestion>>)> - callback) override; + base::OnceCallback< + void(std::optional<std::vector<FilterSuggestionCandidate>>)> callback) + override; void GetSupportedTaskTypesForDomain( std::string_view domain,
diff --git a/components/multistep_filter/core/annotation_index/mock_annotation_index_client.h b/components/multistep_filter/core/annotation_index/mock_annotation_index_client.h index 13402e5..dc385107 100644 --- a/components/multistep_filter/core/annotation_index/mock_annotation_index_client.h +++ b/components/multistep_filter/core/annotation_index/mock_annotation_index_client.h
@@ -13,6 +13,7 @@ #include "base/functional/callback.h" #include "components/multistep_filter/core/annotation_index/annotation_index_client.h" #include "components/multistep_filter/core/data_models/filter_annotation.h" +#include "components/multistep_filter/core/data_models/filter_suggestion_candidate.h" #include "components/multistep_filter/core/data_models/url_filter_suggestion.h" #include "testing/gmock/include/gmock/gmock.h" @@ -25,11 +26,11 @@ MOCK_METHOD( void, - GetUrlFilterSuggestions, + GetFilterSuggestionCandidates, (const GURL& url, base::span<const FilterAnnotation> filter_annotations, - base::OnceCallback<void(std::optional<std::vector<UrlFilterSuggestion>>)> - callback), + base::OnceCallback<void( + std::optional<std::vector<FilterSuggestionCandidate>>)> callback), (override)); MOCK_METHOD(void,
diff --git a/components/multistep_filter/core/data_models/BUILD.gn b/components/multistep_filter/core/data_models/BUILD.gn index d7c5b24b..9afe163 100644 --- a/components/multistep_filter/core/data_models/BUILD.gn +++ b/components/multistep_filter/core/data_models/BUILD.gn
@@ -6,6 +6,9 @@ sources = [ "filter_annotation.cc", "filter_annotation.h", + "filter_suggestion_candidate.cc", + "filter_suggestion_candidate.h", + "url_filter_suggestion.cc", "url_filter_suggestion.h", ] deps = [ @@ -16,7 +19,10 @@ source_set("unit_tests") { testonly = true - sources = [ "filter_annotation_unittest.cc" ] + sources = [ + "filter_annotation_unittest.cc", + "url_filter_suggestion_unittest.cc", + ] deps = [ ":data_models",
diff --git a/components/multistep_filter/core/data_models/filter_suggestion_candidate.cc b/components/multistep_filter/core/data_models/filter_suggestion_candidate.cc new file mode 100644 index 0000000..1bf8938 --- /dev/null +++ b/components/multistep_filter/core/data_models/filter_suggestion_candidate.cc
@@ -0,0 +1,42 @@ +// Copyright 2026 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/multistep_filter/core/data_models/filter_suggestion_candidate.h" + +#include <string> +#include <utility> +#include <vector> + +#include "url/gurl.h" + +namespace multistep_filter { + +FilterSuggestionCandidateAttribute::FilterSuggestionCandidateAttribute( + std::string key, + std::string label) + : key(std::move(key)), label(std::move(label)) {} + +FilterSuggestionCandidate::FilterSuggestionCandidate( + std::string filter_annotation_id, + GURL navigation_url, + std::vector<FilterSuggestionCandidateAttribute> attributes) + : filter_annotation_id(std::move(filter_annotation_id)), + navigation_url(std::move(navigation_url)), + attributes(std::move(attributes)) {} + +FilterSuggestionCandidate::FilterSuggestionCandidate( + const FilterSuggestionCandidate&) = default; +FilterSuggestionCandidate::FilterSuggestionCandidate( + FilterSuggestionCandidate&&) = default; +FilterSuggestionCandidate& FilterSuggestionCandidate::operator=( + const FilterSuggestionCandidate&) = default; +FilterSuggestionCandidate& FilterSuggestionCandidate::operator=( + FilterSuggestionCandidate&&) = default; + +FilterSuggestionCandidate::~FilterSuggestionCandidate() = default; + +bool operator==(const FilterSuggestionCandidate&, + const FilterSuggestionCandidate&) = default; + +} // namespace multistep_filter
diff --git a/components/multistep_filter/core/data_models/filter_suggestion_candidate.h b/components/multistep_filter/core/data_models/filter_suggestion_candidate.h new file mode 100644 index 0000000..188039a --- /dev/null +++ b/components/multistep_filter/core/data_models/filter_suggestion_candidate.h
@@ -0,0 +1,71 @@ +// Copyright 2026 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_MULTISTEP_FILTER_CORE_DATA_MODELS_FILTER_SUGGESTION_CANDIDATE_H_ +#define COMPONENTS_MULTISTEP_FILTER_CORE_DATA_MODELS_FILTER_SUGGESTION_CANDIDATE_H_ + +#include <string> +#include <vector> + +#include "url/gurl.h" + +namespace multistep_filter { + +// Represents an applied filter attribute for a +// `FilterSuggestionCandidate`. +struct FilterSuggestionCandidateAttribute { + // The normalized key of the filter (e.g., "PRICE_MIN"). + std::string key; + // User-visible label for the filter (e.g., "Minimum Price"). + std::string label; + + FilterSuggestionCandidateAttribute(std::string key, std::string label); + + FilterSuggestionCandidateAttribute( + const FilterSuggestionCandidateAttribute&) = default; + FilterSuggestionCandidateAttribute(FilterSuggestionCandidateAttribute&&) = + default; + FilterSuggestionCandidateAttribute& operator=( + const FilterSuggestionCandidateAttribute&) = default; + FilterSuggestionCandidateAttribute& operator=( + FilterSuggestionCandidateAttribute&&) = default; + + ~FilterSuggestionCandidateAttribute() = default; + + friend bool operator==(const FilterSuggestionCandidateAttribute&, + const FilterSuggestionCandidateAttribute&) = default; +}; + +// Represents a potential filter suggestion generated by the server. +// Contains some necessary data to display the suggestion in the UI (e.g., +// `attributes` with user-friendly labels) and the action to take when +// applied (navigating to the `navigation_url`). +struct FilterSuggestionCandidate { + // ID of the suggestion candidate. This comes from the `FilterAnnotation` used + // to generate this suggestion candidate. + std::string filter_annotation_id; + // The URL to navigate to when the suggestion is applied. + GURL navigation_url; + // Attributes applied to this suggestion. + std::vector<FilterSuggestionCandidateAttribute> attributes; + + FilterSuggestionCandidate( + std::string filter_annotation_id, + GURL navigation_url, + std::vector<FilterSuggestionCandidateAttribute> attributes); + + FilterSuggestionCandidate(const FilterSuggestionCandidate&); + FilterSuggestionCandidate(FilterSuggestionCandidate&&); + FilterSuggestionCandidate& operator=(const FilterSuggestionCandidate&); + FilterSuggestionCandidate& operator=(FilterSuggestionCandidate&&); + + ~FilterSuggestionCandidate(); + + friend bool operator==(const FilterSuggestionCandidate&, + const FilterSuggestionCandidate&); +}; + +} // namespace multistep_filter + +#endif // COMPONENTS_MULTISTEP_FILTER_CORE_DATA_MODELS_FILTER_SUGGESTION_CANDIDATE_H_
diff --git a/components/multistep_filter/core/data_models/url_filter_suggestion.cc b/components/multistep_filter/core/data_models/url_filter_suggestion.cc new file mode 100644 index 0000000..a9add65 --- /dev/null +++ b/components/multistep_filter/core/data_models/url_filter_suggestion.cc
@@ -0,0 +1,22 @@ +// Copyright 2026 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/multistep_filter/core/data_models/url_filter_suggestion.h" + +#include <utility> + +#include "components/multistep_filter/core/data_models/filter_suggestion_candidate.h" + +namespace multistep_filter { + +UrlFilterSuggestion::UrlFilterSuggestion(std::string text, GURL url) + : text_(std::move(text)), url_(std::move(url)) {} + +UrlFilterSuggestion::UrlFilterSuggestion(FilterSuggestionCandidate candidate) + : url_(std::move(candidate.navigation_url)) { + // TODO(crbug.com/491202866): Change it with the UX approved text. + text_ = "Recall info from previous tabs?"; +} + +} // namespace multistep_filter
diff --git a/components/multistep_filter/core/data_models/url_filter_suggestion.h b/components/multistep_filter/core/data_models/url_filter_suggestion.h index 5fa50bf..1926369 100644 --- a/components/multistep_filter/core/data_models/url_filter_suggestion.h +++ b/components/multistep_filter/core/data_models/url_filter_suggestion.h
@@ -7,6 +7,7 @@ #include <string> +#include "components/multistep_filter/core/data_models/filter_suggestion_candidate.h" #include "url/gurl.h" namespace multistep_filter { @@ -14,8 +15,10 @@ // A class to hold the data for a URL based filter suggestion. class UrlFilterSuggestion { public: - explicit UrlFilterSuggestion(std::string text, GURL url) - : text_(std::move(text)), url_(std::move(url)) {} + explicit UrlFilterSuggestion(std::string text, GURL url); + + explicit UrlFilterSuggestion(FilterSuggestionCandidate candidate); + ~UrlFilterSuggestion() = default; const std::string& text() const { return text_; }
diff --git a/components/multistep_filter/core/data_models/url_filter_suggestion_unittest.cc b/components/multistep_filter/core/data_models/url_filter_suggestion_unittest.cc new file mode 100644 index 0000000..33bc0ccd --- /dev/null +++ b/components/multistep_filter/core/data_models/url_filter_suggestion_unittest.cc
@@ -0,0 +1,25 @@ +// Copyright 2026 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/multistep_filter/core/data_models/url_filter_suggestion.h" + +#include <utility> + +#include "components/multistep_filter/core/data_models/filter_suggestion_candidate.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +namespace multistep_filter { + +TEST(UrlFilterSuggestionTest, ConstructorFromFilterSuggestionCandidate) { + FilterSuggestionCandidate candidate("test_id", GURL("https://example.com"), + {}); + + UrlFilterSuggestion suggestion(std::move(candidate)); + + EXPECT_EQ(suggestion.url(), GURL("https://example.com")); + EXPECT_EQ(suggestion.text(), "Recall info from previous tabs?"); +} + +} // namespace multistep_filter
diff --git a/components/multistep_filter/core/suggestion/filter_suggestion_generator.cc b/components/multistep_filter/core/suggestion/filter_suggestion_generator.cc index 39c0c2d..2b7e0d0 100644 --- a/components/multistep_filter/core/suggestion/filter_suggestion_generator.cc +++ b/components/multistep_filter/core/suggestion/filter_suggestion_generator.cc
@@ -97,23 +97,24 @@ all_annotations.end()); } - annotation_index_client_->GetUrlFilterSuggestions( + annotation_index_client_->GetFilterSuggestionCandidates( url, all_annotations, - base::BindOnce(&FilterSuggestionGenerator::OnUrlFilterSuggestionsFetched, - weak_ptr_factory_.GetWeakPtr(), std::move(callback))); + base::BindOnce( + &FilterSuggestionGenerator::OnFilterSuggestionCandidatesFetched, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } -void FilterSuggestionGenerator::OnUrlFilterSuggestionsFetched( +void FilterSuggestionGenerator::OnFilterSuggestionCandidatesFetched( base::OnceCallback<void(std::optional<UrlFilterSuggestion>)> callback, - std::optional<std::vector<UrlFilterSuggestion>> suggestions) { - if (!suggestions || suggestions->empty()) { + std::optional<std::vector<FilterSuggestionCandidate>> candidates) { + if (!candidates || candidates->empty()) { std::move(callback).Run(std::nullopt); return; } - // TODO(crbug.com/493511925): For the time being, the first suggestion is + // TODO(crbug.com/493511925): For the time being, the first candidate is // chosen by default. Implement the logic to select the best execution - // candidate from server suggestions. - std::move(callback).Run(std::move(suggestions->front())); + // candidate. + std::move(callback).Run(UrlFilterSuggestion(std::move(candidates->front()))); } } // namespace multistep_filter
diff --git a/components/multistep_filter/core/suggestion/filter_suggestion_generator.h b/components/multistep_filter/core/suggestion/filter_suggestion_generator.h index d5d9422..00e1ddea 100644 --- a/components/multistep_filter/core/suggestion/filter_suggestion_generator.h +++ b/components/multistep_filter/core/suggestion/filter_suggestion_generator.h
@@ -20,6 +20,7 @@ class AnnotationIndexClient; class FilterStore; struct FilterAnnotation; +struct FilterSuggestionCandidate; // Responsible for orchestrating the suggestion generation process for a given // URL. This class is owned by the `MultistepFilterService` and shares its @@ -46,7 +47,7 @@ // 3) On the store response (`OnAllAnnotationsFetched()`), query the server // via the `AnnotationIndexClient` a second time to evaluate these // candidates and generate concrete filter suggestions. - // 4) On the second server response (`OnUrlFilterSuggestionsFetched()`), + // 4) On the second server response (`OnFilterSuggestionCandidatesFetched()`), // invoke the `callback` with the first suggestion if available, or // std::nullopt otherwise. virtual void GenerateSuggestion( @@ -63,9 +64,9 @@ const GURL& url, base::OnceCallback<void(std::optional<UrlFilterSuggestion>)> callback, std::vector<std::vector<FilterAnnotation>> filter_annotations); - void OnUrlFilterSuggestionsFetched( + void OnFilterSuggestionCandidatesFetched( base::OnceCallback<void(std::optional<UrlFilterSuggestion>)> callback, - std::optional<std::vector<UrlFilterSuggestion>> suggestions); + std::optional<std::vector<FilterSuggestionCandidate>> candidates); // The client used to fetch supported task types and URL filter suggestions. // This is a non-owning reference. The lifetime of the `AnnotationIndexClient`
diff --git a/components/multistep_filter/core/suggestion/filter_suggestion_generator_unittest.cc b/components/multistep_filter/core/suggestion/filter_suggestion_generator_unittest.cc index 9efad238..c2012925 100644 --- a/components/multistep_filter/core/suggestion/filter_suggestion_generator_unittest.cc +++ b/components/multistep_filter/core/suggestion/filter_suggestion_generator_unittest.cc
@@ -14,6 +14,7 @@ #include "base/uuid.h" #include "components/multistep_filter/core/annotation_index/mock_annotation_index_client.h" #include "components/multistep_filter/core/data_models/filter_annotation.h" +#include "components/multistep_filter/core/data_models/filter_suggestion_candidate.h" #include "components/multistep_filter/core/data_models/url_filter_suggestion.h" #include "components/multistep_filter/core/storage/filter_store.h" #include "testing/gmock/include/gmock/gmock.h" @@ -24,12 +25,13 @@ namespace { +constexpr char kTestId[] = "0"; constexpr char kTestUrl[] = "https://example.com"; constexpr char kTestDomain[] = "example.com"; constexpr char kShoppingTask[] = "SHOPPING"; constexpr char kTestAttributeKey[] = "category"; constexpr char kTestAttributeValue[] = "shoes"; -constexpr char kTestSuggestionTitle[] = "Shoes"; +constexpr char kTestSuggestionText[] = "Recall info from previous tabs?"; constexpr char kTestSuggestionUrl[] = "https://example.com/shoes"; using testing::_; @@ -88,20 +90,25 @@ store()->StoreAnnotation(annotation, store_future.GetCallback()); ASSERT_TRUE(store_future.Get()); - UrlFilterSuggestion expected_suggestion(kTestSuggestionTitle, + FilterSuggestionCandidate expected_candidate( + kTestId, GURL(kTestSuggestionUrl), + {FilterSuggestionCandidateAttribute(kTestAttributeKey, + kTestAttributeValue)}); + UrlFilterSuggestion expected_suggestion(kTestSuggestionText, GURL(kTestSuggestionUrl)); - EXPECT_CALL(mock_client(), GetUrlFilterSuggestions(url, _, _)) - .WillOnce([expected_suggestion]( - const GURL& u, - base::span<const FilterAnnotation> filter_annotations, - base::OnceCallback<void( - std::optional<std::vector<UrlFilterSuggestion>>)> cb) { - ASSERT_EQ(filter_annotations.size(), 1u); - EXPECT_EQ(filter_annotations[0].task_type, kShoppingTask); - std::move(cb).Run( - std::vector<UrlFilterSuggestion>{expected_suggestion}); - }); + EXPECT_CALL(mock_client(), GetFilterSuggestionCandidates(url, _, _)) + .WillOnce( + [expected_candidate]( + const GURL& u, + base::span<const FilterAnnotation> filter_annotations, + base::OnceCallback<void( + std::optional<std::vector<FilterSuggestionCandidate>>)> cb) { + ASSERT_EQ(filter_annotations.size(), 1u); + EXPECT_EQ(filter_annotations[0].task_type, kShoppingTask); + std::move(cb).Run( + std::vector<FilterSuggestionCandidate>{expected_candidate}); + }); base::test::TestFuture<std::optional<UrlFilterSuggestion>> future; generator()->GenerateSuggestion(url, future.GetCallback());
diff --git a/components/offline_items_collection/core/android/offline_item_bridge_unittest.cc b/components/offline_items_collection/core/android/offline_item_bridge_unittest.cc index 030d6823..5642408 100644 --- a/components/offline_items_collection/core/android/offline_item_bridge_unittest.cc +++ b/components/offline_items_collection/core/android/offline_item_bridge_unittest.cc
@@ -22,7 +22,7 @@ class OfflineItemBridgeUnitTest : public ::testing::Test { public: OfflineItemBridgeUnitTest() - : j_test_(JOfflineItemBridgeUnitTestJni::New(AttachCurrentThread())) {} + : j_test_(OfflineItemBridgeUnitTestJni::New(AttachCurrentThread())) {} const jni_zero::ScopedJavaGlobalRef<JOfflineItemBridgeUnitTest>& j_test() { return j_test_;
diff --git a/components/omnibox/browser/searchbox.mojom b/components/omnibox/browser/searchbox.mojom index efed792..7839148 100644 --- a/components/omnibox/browser/searchbox.mojom +++ b/components/omnibox/browser/searchbox.mojom
@@ -111,14 +111,7 @@ mojo_base.mojom.TimeTicks last_active; }; -// See also: -// https://crsrc.org/c/third_party/omnibox_proto/aim_tools.proto -enum ToolMode { - kDefault = 0, - kDeepSearch = 1, - kCanvas = 2, - kCreateImage = 4, -}; + // Represents a file attachment who's upload was started browser-side (currently // an image or PDF only). @@ -161,7 +154,7 @@ // A list of attachments to the search context. array<SearchContextAttachment> attachments; // The mode of the search query. - ToolMode tool_mode; + composebox_query.mojom.ToolMode tool_mode; }; // Information about a contextual input.
diff --git a/components/on_device_translation/metrics.cc b/components/on_device_translation/metrics.cc index 5eb632e..0ebe637 100644 --- a/components/on_device_translation/metrics.cc +++ b/components/on_device_translation/metrics.cc
@@ -89,24 +89,6 @@ } // namespace -void RecordOnDeviceTranslationSupportedSourceLanguage( - std::string_view action_name, - bool is_supported) { - base::UmaHistogramBoolean( - base::StrCat({"Translate.OnDeviceTranslation.", action_name, - ".IsSourceLanguageSupported"}), - is_supported); -} - -void RecordOnDeviceTranslationSupportedTargetLanguage( - std::string_view action_name, - bool is_supported) { - base::UmaHistogramBoolean( - base::StrCat({"Translate.OnDeviceTranslation.", action_name, - ".IsTargetLanguageSupported"}), - is_supported); -} - void RecordLanguageUma(std::string_view uma_name, std::string_view language_code) { std::optional<SupportedLanguage> code = ToSupportedLanguage(language_code);
diff --git a/components/on_device_translation/metrics.h b/components/on_device_translation/metrics.h index 9dfcfbde..7528ef5 100644 --- a/components/on_device_translation/metrics.h +++ b/components/on_device_translation/metrics.h
@@ -38,15 +38,6 @@ std::string_view source_lang, std::string_view target_lang); -// Translate.OnDeviceTranslation.{action_name}.IsSourceLanguageSupported -void RecordOnDeviceTranslationSupportedSourceLanguage( - std::string_view action_name, - bool is_supported); -// Translate.OnDeviceTranslation.{action_name}.IsTargetLanguageSupported -void RecordOnDeviceTranslationSupportedTargetLanguage( - std::string_view action_name, - bool is_supported); - // Record the character count UMA for: // Translate.TranslatorApi.TranslationLength // Translate.TranslatorApi.Source.${source_lang}.TranslationLength
diff --git a/components/on_device_translation/metrics_unittest.cc b/components/on_device_translation/metrics_unittest.cc index bc409c8d..45b97510 100644 --- a/components/on_device_translation/metrics_unittest.cc +++ b/components/on_device_translation/metrics_unittest.cc
@@ -8,7 +8,6 @@ #include "base/test/gtest_util.h" #include "base/test/metrics/histogram_tester.h" #include "components/on_device_translation/public/language_pack.h" -#include "metrics.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -190,33 +189,5 @@ 1); } -TEST_F(TranslationMetricsTest, RecordTranslatorApiLanguageSupportTrue) { - base::HistogramTester histogram_tester; - RecordOnDeviceTranslationSupportedSourceLanguage("CreateTranslator", true); - RecordOnDeviceTranslationSupportedTargetLanguage("CreateTranslator", true); - histogram_tester.ExpectUniqueSample( - "Translate.OnDeviceTranslation.CreateTranslator." - "IsSourceLanguageSupported", - 1, 1); - histogram_tester.ExpectUniqueSample( - "Translate.OnDeviceTranslation.CreateTranslator." - "IsTargetLanguageSupported", - 1, 1); -} - -TEST_F(TranslationMetricsTest, RecordTranslatorApiLanguageSupportFalse) { - base::HistogramTester histogram_tester; - RecordOnDeviceTranslationSupportedSourceLanguage("CreateTranslator", false); - RecordOnDeviceTranslationSupportedTargetLanguage("CreateTranslator", false); - histogram_tester.ExpectUniqueSample( - "Translate.OnDeviceTranslation.CreateTranslator." - "IsSourceLanguageSupported", - 0, 1); - histogram_tester.ExpectUniqueSample( - "Translate.OnDeviceTranslation.CreateTranslator." - "IsTargetLanguageSupported", - 0, 1); -} - } // namespace } // namespace on_device_translation
diff --git a/components/on_device_translation/service_controller.cc b/components/on_device_translation/service_controller.cc index a457473..c3ac489 100644 --- a/components/on_device_translation/service_controller.cc +++ b/components/on_device_translation/service_controller.cc
@@ -12,6 +12,7 @@ #include "base/files/file_path.h" #include "base/functional/bind.h" #include "base/functional/callback_helpers.h" +#include "base/metrics/histogram_functions.h" #include "base/path_service.h" #include "base/strings/strcat.h" #include "base/strings/string_split.h" @@ -36,7 +37,6 @@ #include "components/on_device_translation/translation_manager_util.h" #include "content/public/browser/service_process_host.h" #include "content/public/browser/service_process_host_passkeys.h" -#include "metrics.h" #include "mojo/public/cpp/bindings/callback_helpers.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" @@ -57,15 +57,32 @@ // Prefix for the display name of the on-device translation service. The origin // is appended to the prefix. -const char kOnDeviceTranslationServiceDisplayNamePrefix[] = +constexpr std::string_view kOnDeviceTranslationServiceDisplayNamePrefix = "On-device Translation Service: "; -constexpr char kCreateTranslatorMetricActionName[] = "CreateTranslator"; -constexpr char kCanTranslateMetricActionName[] = "CanTranslate"; +constexpr std::string_view kCreateTranslatorMetricActionName = + "CreateTranslator"; +constexpr std::string_view kCanTranslateMetricActionName = "CanTranslate"; + +constexpr std::string_view + kCreateTranslatorSourceLanguageIsSupportedMetricName = + "Translate.OnDeviceTranslation.CreateTranslator." + "IsSourceLanguageSupported"; +constexpr std::string_view + kCreateTranslatorTargetLanguageIsSupportedMetricName = + "Translate.OnDeviceTranslation.CreateTranslator." + "IsTargetLanguageSupported"; +constexpr std::string_view kCanTranslateSourceLanguageIsSupportedMetricName = + "Translate.OnDeviceTranslation.CanTranslate.IsSourceLanguageSupported"; +constexpr std::string_view kCanTranslateTargetLanguageIsSupportedMetricName = + "Translate.OnDeviceTranslation.CanTranslate.IsTargetLanguageSupported"; // TODO(crbug.com/419848973): This is a workaround until the "he" language code // is fully supported. std::string SwitchLanguageCodeToIwIfHe(std::string_view language_code) { + if (language_code == "he") { + return "iw"; + } auto split = base::SplitStringOnce(language_code, "-"); if (!split || split->first != "he") { return std::string(language_code); @@ -93,7 +110,7 @@ std::vector<base::FilePath> GetLanguagePackInfo( std::vector<mojom::OnDeviceTranslationLanguagePackagePtr>& packages) { CHECK(packages.empty()); - std::vector<base::FilePath> package_pathes; + std::vector<base::FilePath> package_paths; for (const auto& it : kLanguagePackComponentConfigMap) { auto file_path = OnDeviceTranslationInstaller::GetInstance()->GetLanguagePackPath( @@ -102,11 +119,11 @@ packages.push_back(mojom::OnDeviceTranslationLanguagePackage::New( std::string(ToLanguageCode(it.second->language1)), std::string(ToLanguageCode(it.second->language2)))); - package_pathes.push_back(file_path); + package_paths.push_back(file_path); } } - return package_pathes; + return package_paths; } LanguagePackRequirements GetLanguagePackRequirements( @@ -197,11 +214,12 @@ GetBestFitLanguageCode(source_lang); std::optional<std::string> best_fit_target_language = GetBestFitLanguageCode(target_lang); - - RecordOnDeviceTranslationSupportedSourceLanguage( - "CreateTranslator", best_fit_source_language.has_value()); - RecordOnDeviceTranslationSupportedTargetLanguage( - "CreateTranslator", best_fit_target_language.has_value()); + base::UmaHistogramBoolean( + kCreateTranslatorSourceLanguageIsSupportedMetricName, + best_fit_source_language.has_value()); + base::UmaHistogramBoolean( + kCreateTranslatorTargetLanguageIsSupportedMetricName, + best_fit_target_language.has_value()); if (!best_fit_source_language.has_value() || !best_fit_target_language.has_value()) { std::move(callback).Run( @@ -306,10 +324,10 @@ GetBestFitLanguageCode(source_lang_arg); std::optional<std::string> best_fit_target_language = GetBestFitLanguageCode(target_lang_arg); - RecordOnDeviceTranslationSupportedSourceLanguage( - "CanTranslate", best_fit_source_language.has_value()); - RecordOnDeviceTranslationSupportedTargetLanguage( - "CanTranslate", best_fit_target_language.has_value()); + base::UmaHistogramBoolean(kCanTranslateSourceLanguageIsSupportedMetricName, + best_fit_source_language.has_value()); + base::UmaHistogramBoolean(kCanTranslateTargetLanguageIsSupportedMetricName, + best_fit_target_language.has_value()); if (!best_fit_source_language.has_value() || !best_fit_target_language.has_value()) { std::move(callback).Run(CanTranslateResult::kNoNotSupportedLanguage); @@ -371,13 +389,6 @@ MaybeRunPendingTasks(); } -// Called when the TranslateKitBinaryPath pref is changed. -void OnDeviceTranslationServiceController::OnTranslateKitBinaryPathChanged( - const std::string& pref_name) { - service_remote_.reset(); - MaybeRunPendingTasks(); -} - void OnDeviceTranslationServiceController::MaybeRunPendingTasks() { if (pending_tasks_.empty()) { return;
diff --git a/components/on_device_translation/service_controller.h b/components/on_device_translation/service_controller.h index 7614f1df..81281683 100644 --- a/components/on_device_translation/service_controller.h +++ b/components/on_device_translation/service_controller.h
@@ -145,12 +145,6 @@ const std::string& target_lang, CreateTranslatorCallback callback); - // Called when the TranslateKitBinaryPath pref is changed. - void OnTranslateKitBinaryPathChanged(const std::string& pref_name); - - // Called when the language pack key pref is changed. - void OnLanguagePackKeyPrefChanged(const std::string& pref_name); - // Tries to start the service if it is not already running. Returns true if // the service is running or is started successfully. bool MaybeStartService();
diff --git a/components/page_content_annotations/core/tracked_element_feature.h b/components/page_content_annotations/core/tracked_element_feature.h index 901bfca5..f876937 100644 --- a/components/page_content_annotations/core/tracked_element_feature.h +++ b/components/page_content_annotations/core/tracked_element_feature.h
@@ -18,11 +18,11 @@ // For the cc TrackedElementRects definition, see // cc/trees/tracked_element_rects.h. -// If any new features are added, TRACKED_ELEMENT_FEATURE_MAX in +// If any new features are added, `kTrackedElementFeatureMax` in // cc/trees/tracked_element_rects.h should be updated. // LINT.IfChange(TrackedElementFeature) -enum TrackedElementFeature : int32_t { +enum class TrackedElementFeature : int32_t { kAIHighlight = 0, kIframeTracking = 1, };
diff --git a/components/password_manager/core/browser/actor_login/actor_login_permission_service.h b/components/password_manager/core/browser/actor_login/actor_login_permission_service.h index 56b83d2..279100a 100644 --- a/components/password_manager/core/browser/actor_login/actor_login_permission_service.h +++ b/components/password_manager/core/browser/actor_login/actor_login_permission_service.h
@@ -66,11 +66,6 @@ // Lists all actor login permissions for the primary profile. virtual void ListAllPermissions(ListPermissionsResult callback) = 0; - // Deletes permission for the given embedder origin. If the origin is opaque, - // the callback will be called with false. - virtual void DeletePermission(const url::Origin& embedder_origin, - DeletePermissionResult callback) = 0; - // Deletes permission for the given embedder origin and display name. If the // origin is opaque, the callback will be called with false. // `display_name` is a human-readable name of a federated account, e.g.
diff --git a/components/password_manager/core/browser/actor_login/internal/actor_login_permission_service_impl.cc b/components/password_manager/core/browser/actor_login/internal/actor_login_permission_service_impl.cc index 634165c..9522e28e 100644 --- a/components/password_manager/core/browser/actor_login/internal/actor_login_permission_service_impl.cc +++ b/components/password_manager/core/browser/actor_login/internal/actor_login_permission_service_impl.cc
@@ -370,12 +370,6 @@ void ActorLoginPermissionServiceImpl::DeletePermission( const url::Origin& embedder_origin, - DeletePermissionResult callback) { - DeletePermission(embedder_origin, "", std::move(callback)); -} - -void ActorLoginPermissionServiceImpl::DeletePermission( - const url::Origin& embedder_origin, const std::string& display_name, DeletePermissionResult callback) { if (embedder_origin.opaque()) {
diff --git a/components/password_manager/core/browser/actor_login/internal/actor_login_permission_service_impl.h b/components/password_manager/core/browser/actor_login/internal/actor_login_permission_service_impl.h index 7913251..9ef5b99 100644 --- a/components/password_manager/core/browser/actor_login/internal/actor_login_permission_service_impl.h +++ b/components/password_manager/core/browser/actor_login/internal/actor_login_permission_service_impl.h
@@ -40,8 +40,6 @@ ListPermissionsResult callback) override; void ListAllPermissions(ListPermissionsResult callback) override; void DeletePermission(const url::Origin& embedder_origin, - DeletePermissionResult callback) override; - void DeletePermission(const url::Origin& embedder_origin, const std::string& display_name, DeletePermissionResult callback) override; void GrantPermission(const FederatedPermission& permission,
diff --git a/components/password_manager/core/browser/actor_login/internal/actor_login_permission_service_impl_unittest.cc b/components/password_manager/core/browser/actor_login/internal/actor_login_permission_service_impl_unittest.cc index f5ce65f..d87c650 100644 --- a/components/password_manager/core/browser/actor_login/internal/actor_login_permission_service_impl_unittest.cc +++ b/components/password_manager/core/browser/actor_login/internal/actor_login_permission_service_impl_unittest.cc
@@ -271,33 +271,6 @@ } TEST_F(ActorLoginPermissionServiceImplTest, - DeletePermissionSendsCorrectRequest) { - base::test::TestFuture<bool> future; - service_.DeletePermission(url::Origin::Create(GURL("https://embedder.com")), - future.GetCallback()); - IssueAccessToken(); - - ASSERT_EQ(1, test_url_loader_factory_.NumPending()); - const network::ResourceRequest& request = - test_url_loader_factory_.GetPendingRequest(0)->request; - - EXPECT_EQ(kTestDeleteUrl, request.url.spec()); - EXPECT_EQ("POST", request.method); - EXPECT_EQ(network::mojom::CredentialsMode::kOmit, request.credentials_mode); - EXPECT_EQ(base::test::ParseJson(R"({ - "filter": [ - { - "federatedCredentialPermissionFilter": { - "matchAffiliatedRequesterOrigins": true, - "rpEmbedderOrigin": "https://embedder.com" - } - } - ] - })"), - base::test::ParseJson(network::GetUploadData(request))); -} - -TEST_F(ActorLoginPermissionServiceImplTest, DeletePermissionWithDisplayNameSendsCorrectRequest) { base::test::TestFuture<bool> future; service_.DeletePermission(url::Origin::Create(GURL("https://embedder.com")), @@ -329,7 +302,7 @@ DeletePermissionReturnsTrueOnSuccess) { base::test::TestFuture<bool> future; service_.DeletePermission(url::Origin::Create(GURL("https://embedder.com")), - future.GetCallback()); + "username", future.GetCallback()); IssueAccessToken(); test_url_loader_factory_.SimulateResponseForPendingRequest(kTestDeleteUrl, @@ -342,7 +315,7 @@ DeletePermissionReturnsFalseOnError) { base::test::TestFuture<bool> future; service_.DeletePermission(url::Origin::Create(GURL("https://embedder.com")), - future.GetCallback()); + "username", future.GetCallback()); IssueAccessToken(); test_url_loader_factory_.AddResponse(kTestDeleteUrl, "",
diff --git a/components/password_manager/core/browser/actor_login/test/mock_actor_login_permission_service.h b/components/password_manager/core/browser/actor_login/test/mock_actor_login_permission_service.h index ebd1345..8be5839 100644 --- a/components/password_manager/core/browser/actor_login/test/mock_actor_login_permission_service.h +++ b/components/password_manager/core/browser/actor_login/test/mock_actor_login_permission_service.h
@@ -23,10 +23,6 @@ MOCK_METHOD(void, ListAllPermissions, (ListPermissionsResult), (override)); MOCK_METHOD(void, DeletePermission, - (const url::Origin&, DeletePermissionResult), - (override)); - MOCK_METHOD(void, - DeletePermission, (const url::Origin&, const std::string&, DeletePermissionResult), (override)); MOCK_METHOD(void,
diff --git a/components/password_manager/core/browser/password_autofill_manager.cc b/components/password_manager/core/browser/password_autofill_manager.cc index 670bad29..6f745f8 100644 --- a/components/password_manager/core/browser/password_autofill_manager.cc +++ b/components/password_manager/core/browser/password_autofill_manager.cc
@@ -509,7 +509,7 @@ password_client_->GetProfilePasswordStore(), password_client_->GetAccountPasswordStore())); } - manual_fallback_flow_->RunFlow(field.element_id, GetBounds(field), + manual_fallback_flow_->RunFlow(field.element_id, field.bounds, field.text_direction); return; } @@ -590,7 +590,7 @@ void PasswordAutofillManager::ContinueShowingSuggestions( const autofill::TriggeringField& field) { bool autofill_available = ShowPopup( - GetBounds(field), field.text_direction, + field.bounds, field.text_direction, GetSuggestions(field.typed_username, OffersGeneration(false), ShowPasswordSuggestions(true), ShowWebAuthnCredentials(field.show_webauthn_credentials), @@ -908,13 +908,4 @@ show_identity_credentials); } -gfx::RectF PasswordAutofillManager::GetBounds( - const autofill::TriggeringField& field) { - return base::FeatureList::IsEnabled( - autofill::features::kAutofillAndPasswordsInSameSurface) - ? field.bounds // Already transformed in ContentAutofillDriver. - : password_manager_driver_->TransformToRootCoordinates( - field.bounds); -} - } // namespace password_manager
diff --git a/components/password_manager/core/browser/password_autofill_manager.h b/components/password_manager/core/browser/password_autofill_manager.h index 88356b40..3b4914d 100644 --- a/components/password_manager/core/browser/password_autofill_manager.h +++ b/components/password_manager/core/browser/password_autofill_manager.h
@@ -240,10 +240,6 @@ ShowWebAuthnCredentials show_webauthn_credentials, ShowIdentityCredentials show_identity_credentials); - // Returns the bounds from the provided field and transforms them if it hasn't - // already happened in the driver. - gfx::RectF GetBounds(const autofill::TriggeringField& field); - std::unique_ptr<autofill::PasswordFormFillData> fill_data_; password_manager::PasswordSuggestionGenerator suggestion_generator_;
diff --git a/components/password_manager/core/browser/sharing/incoming_password_sharing_invitation_sync_bridge.cc b/components/password_manager/core/browser/sharing/incoming_password_sharing_invitation_sync_bridge.cc index 685173f..15570675 100644 --- a/components/password_manager/core/browser/sharing/incoming_password_sharing_invitation_sync_bridge.cc +++ b/components/password_manager/core/browser/sharing/incoming_password_sharing_invitation_sync_bridge.cc
@@ -77,7 +77,7 @@ CHECK(password_receiver_service_); std::unique_ptr<syncer::DataTypeStore::WriteBatch> batch = - sync_metadata_store_->CreateWriteBatch(); + sync_metadata_store_->CreateWriteBatch(std::move(metadata_change_list)); for (const std::unique_ptr<syncer::EntityChange>& change : entity_changes) { if (change->type() == syncer::EntityChange::ACTION_DELETE) { @@ -93,10 +93,9 @@ // that no other client will process it. change_processor()->Delete(change->storage_key(), syncer::DeletionOrigin::Unspecified(), - metadata_change_list.get()); + batch->GetMetadataChangeList()); } - batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); CommitSyncMetadata(std::move(batch)); return std::nullopt; }
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentFeatureList.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentFeatureList.java index 634c122..4cf29ad 100644 --- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentFeatureList.java +++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentFeatureList.java
@@ -38,8 +38,6 @@ public static final String WEB_PAYMENTS_EXPERIMENTAL_FEATURES = "WebPaymentsExperimentalFeatures"; public static final String WEB_PAYMENTS_SINGLE_APP_UI_SKIP = "WebPaymentsSingleAppUiSkip"; - public static final String SECURE_PAYMENT_CONFIRMATION_FALLBACK = - "SecurePaymentConfirmationFallback"; public static final String PAYMENT_REQUEST_USE_RENDERER_URL_LOADER = "PaymentRequestUseRendererUrlLoader";
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java index 4f47ca0..f58183b 100644 --- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java +++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java
@@ -687,10 +687,8 @@ // credentials to do that. if (obscureRealError && reason == PaymentErrorReason.USER_CANCEL - && (PaymentFeatureList.isEnabledOrExperimentalFeaturesEnabled( - PaymentFeatureList.SECURE_PAYMENT_CONFIRMATION_FALLBACK) - || ContentFeatureMap.isEnabled( - BlinkFeatures.SECURE_PAYMENT_CONFIRMATION_UX_REFRESH))) { + && ContentFeatureMap.isEnabled( + BlinkFeatures.SECURE_PAYMENT_CONFIRMATION_UX_REFRESH)) { obscureRealError = false; } @@ -981,10 +979,7 @@ } private boolean shouldShowSecurePaymentConfirmationFallback() { - if (!(PaymentFeatureList.isEnabledOrExperimentalFeaturesEnabled( - PaymentFeatureList.SECURE_PAYMENT_CONFIRMATION_FALLBACK) - || ContentFeatureMap.isEnabled( - BlinkFeatures.SECURE_PAYMENT_CONFIRMATION_UX_REFRESH))) { + if (!ContentFeatureMap.isEnabled(BlinkFeatures.SECURE_PAYMENT_CONFIRMATION_UX_REFRESH)) { return false; } assert mSpec.isSecurePaymentConfirmationRequested();
diff --git a/components/payments/content/android/junit/src/org/chromium/components/payments/PaymentRequestServiceTest.java b/components/payments/content/android/junit/src/org/chromium/components/payments/PaymentRequestServiceTest.java index 94a18e9..ec8e797 100644 --- a/components/payments/content/android/junit/src/org/chromium/components/payments/PaymentRequestServiceTest.java +++ b/components/payments/content/android/junit/src/org/chromium/components/payments/PaymentRequestServiceTest.java
@@ -867,23 +867,7 @@ @Test @Feature({"Payments"}) - @EnableFeatures({PaymentFeatureList.SECURE_PAYMENT_CONFIRMATION_FALLBACK}) - @DisableFeatures({BlinkFeatures.SECURE_PAYMENT_CONFIRMATION_UX_REFRESH}) - public void - disconnectFromClientWithDebugMessage_userCancelPaymentErrorReason_whenSpcFallbackEnabled() { - PaymentRequestService service = - defaultBuilder().setOnlySpcMethodWithoutPaymentOptions().build(); - - service.disconnectFromClientWithDebugMessage( - ErrorStrings.USER_CANCELLED, PaymentErrorReason.USER_CANCEL); - - assertErrorAndReason(ErrorStrings.USER_CANCELLED, PaymentErrorReason.USER_CANCEL); - } - - @Test - @Feature({"Payments"}) - @EnableFeatures({BlinkFeatures.SECURE_PAYMENT_CONFIRMATION_UX_REFRESH}) - @DisableFeatures({PaymentFeatureList.SECURE_PAYMENT_CONFIRMATION_FALLBACK}) + @EnableFeatures(BlinkFeatures.SECURE_PAYMENT_CONFIRMATION_UX_REFRESH) public void disconnectFromClientWithDebugMessage_userCancelPaymentErrorReason_whenUxRefreshEnabled() { PaymentRequestService service = @@ -897,12 +881,9 @@ @Test @Feature({"Payments"}) - @DisableFeatures({ - BlinkFeatures.SECURE_PAYMENT_CONFIRMATION_UX_REFRESH, - PaymentFeatureList.SECURE_PAYMENT_CONFIRMATION_FALLBACK - }) + @DisableFeatures(BlinkFeatures.SECURE_PAYMENT_CONFIRMATION_UX_REFRESH) public void - disconnectFromClientWithDebugMessage_userCancelPaymentErrorReason_whenSpcFallbackAndUxRefreshDisabled() { + disconnectFromClientWithDebugMessage_userCancelPaymentErrorReason_whenUxRefreshDisabled() { PaymentRequestService service = defaultBuilder().setOnlySpcMethodWithoutPaymentOptions().build();
diff --git a/components/payments/content/android/payment_feature_map.cc b/components/payments/content/android/payment_feature_map.cc index d0f558c..f285b171 100644 --- a/components/payments/content/android/payment_feature_map.cc +++ b/components/payments/content/android/payment_feature_map.cc
@@ -34,7 +34,6 @@ &features::kGPayAppDynamicUpdate, &features::kWebPaymentsExperimentalFeatures, &features::kWebPaymentsSingleAppUiSkip, - &features::kSecurePaymentConfirmationFallback, &kAndroidPaymentIntentsOmitDeprecatedParameters, &kDeduplicateNativePaymentApps, &kGooglePayViaAndroidIntents,
diff --git a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnController.java b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnController.java index 6c3110d..17accab4 100644 --- a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnController.java +++ b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnController.java
@@ -21,6 +21,7 @@ import androidx.core.content.res.ResourcesCompat; import org.chromium.base.Callback; +import org.chromium.blink_public.common.BlinkFeatures; import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent; @@ -28,12 +29,12 @@ import org.chromium.components.browser_ui.bottomsheet.BottomSheetControllerProvider; import org.chromium.components.browser_ui.bottomsheet.BottomSheetObserver; import org.chromium.components.browser_ui.bottomsheet.EmptyBottomSheetObserver; -import org.chromium.components.payments.PaymentFeatureList; import org.chromium.components.payments.R; import org.chromium.components.payments.ui.CurrencyFormatter; import org.chromium.components.payments.ui.InputProtector; import org.chromium.components.url_formatter.SchemeDisplay; import org.chromium.components.url_formatter.UrlFormatter; +import org.chromium.content_public.browser.ContentFeatureMap; import org.chromium.content_public.browser.WebContents; import org.chromium.payments.mojom.PaymentItem; import org.chromium.ui.base.WindowAndroid; @@ -211,8 +212,8 @@ String rpId, boolean informOnly) { assert !informOnly - || PaymentFeatureList.isEnabledOrExperimentalFeaturesEnabled( - PaymentFeatureList.SECURE_PAYMENT_CONFIRMATION_FALLBACK); + || ContentFeatureMap.isEnabled( + BlinkFeatures.SECURE_PAYMENT_CONFIRMATION_UX_REFRESH); mInformOnly = informOnly; if (mHider != null) return false; @@ -245,8 +246,8 @@ SpannableString footnote = null; if (!mInformOnly - && PaymentFeatureList.isEnabledOrExperimentalFeaturesEnabled( - PaymentFeatureList.SECURE_PAYMENT_CONFIRMATION_FALLBACK)) { + && ContentFeatureMap.isEnabled( + BlinkFeatures.SECURE_PAYMENT_CONFIRMATION_UX_REFRESH)) { footnote = SpanApplier.applySpans( context.getString(R.string.secure_payment_confirmation_footnote), @@ -390,8 +391,7 @@ private void onCancel() { hide(); assumeNonNull(mResponseCallback); - if (PaymentFeatureList.isEnabledOrExperimentalFeaturesEnabled( - PaymentFeatureList.SECURE_PAYMENT_CONFIRMATION_FALLBACK)) { + if (ContentFeatureMap.isEnabled(BlinkFeatures.SECURE_PAYMENT_CONFIRMATION_UX_REFRESH)) { mResponseCallback.onResult(SpcResponseStatus.CANCEL); } else { mResponseCallback.onResult(SpcResponseStatus.ANOTHER_WAY);
diff --git a/components/payments/content/android/spc/junit/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnTest.java b/components/payments/content/android/spc/junit/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnTest.java index f12c12b..7c1f6b8a 100644 --- a/components/payments/content/android/spc/junit/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnTest.java +++ b/components/payments/content/android/spc/junit/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnTest.java
@@ -31,6 +31,7 @@ import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.Features.DisableFeatures; import org.chromium.base.test.util.Features.EnableFeatures; +import org.chromium.blink_public.common.BlinkFeatures; import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.browser_ui.bottomsheet.BottomSheetControllerProvider; @@ -54,7 +55,7 @@ /** A test for SecurePaymentConfirmationAuthn. */ @RunWith(BaseRobolectricTestRunner.class) @Config(manifest = Config.NONE) -@EnableFeatures({PaymentFeatureList.SECURE_PAYMENT_CONFIRMATION_FALLBACK}) +@EnableFeatures(BlinkFeatures.SECURE_PAYMENT_CONFIRMATION_UX_REFRESH) @DisableFeatures(PaymentFeatureList.WEB_PAYMENTS_EXPERIMENTAL_FEATURES) public class SecurePaymentConfirmationAuthnTest { private static final long IGNORED_INPUT_DELAY = @@ -223,7 +224,7 @@ @Test @Feature({"Payments"}) - @DisableFeatures(PaymentFeatureList.SECURE_PAYMENT_CONFIRMATION_FALLBACK) + @DisableFeatures(BlinkFeatures.SECURE_PAYMENT_CONFIRMATION_UX_REFRESH) public void testOnAuthnCancellationFeatureDisabled() { createAuthnController(); show(); @@ -308,7 +309,7 @@ @Test @Feature({"Payments"}) - @DisableFeatures(PaymentFeatureList.SECURE_PAYMENT_CONFIRMATION_FALLBACK) + @DisableFeatures(BlinkFeatures.SECURE_PAYMENT_CONFIRMATION_UX_REFRESH) public void testOnVerifyAnotherWayFeatureDisabled() { createAuthnController(); @@ -469,7 +470,7 @@ @Test @Feature({"Payments"}) - @DisableFeatures(PaymentFeatureList.SECURE_PAYMENT_CONFIRMATION_FALLBACK) + @DisableFeatures(BlinkFeatures.SECURE_PAYMENT_CONFIRMATION_UX_REFRESH) public void testShowInformOnlyFeatureIsDisabled() { createAuthnController(); Assert.assertThrows(AssertionError.class, this::showInformOnly);
diff --git a/components/payments/content/secure_payment_confirmation_app.cc b/components/payments/content/secure_payment_confirmation_app.cc index 247f687d..bc389130 100644 --- a/components/payments/content/secure_payment_confirmation_app.cc +++ b/components/payments/content/secure_payment_confirmation_app.cc
@@ -189,14 +189,12 @@ } bool SecurePaymentConfirmationApp::HasEnrolledInstrument() const { - // If the fallback feature is disabled, the factory should only create this + // If the ux refresh feature is disabled, the factory should only create this // app if the authenticator and credentials were available. Therefore, this - // function can always return true with the fallback feature disabled. + // function can always return true with the ux refresh feature disabled. return (authenticator_ && !credential_id_.empty()) || - !(PaymentsExperimentalFeatures::IsEnabled( - features::kSecurePaymentConfirmationFallback) || - base::FeatureList::IsEnabled( - blink::features::kSecurePaymentConfirmationUxRefresh)); + !base::FeatureList::IsEnabled( + blink::features::kSecurePaymentConfirmationUxRefresh); } bool SecurePaymentConfirmationApp::NeedsInstallation() const { @@ -205,10 +203,8 @@ std::string SecurePaymentConfirmationApp::GetId() const { if (credential_id_.empty()) { - CHECK(PaymentsExperimentalFeatures::IsEnabled( - features::kSecurePaymentConfirmationFallback) || - base::FeatureList::IsEnabled( - blink::features::kSecurePaymentConfirmationUxRefresh)); + CHECK(base::FeatureList::IsEnabled( + blink::features::kSecurePaymentConfirmationUxRefresh)); // Since there is no credential_id_ in the fallback flow, we still must // return a non-empty app ID. return "spc";
diff --git a/components/payments/content/secure_payment_confirmation_app_factory.cc b/components/payments/content/secure_payment_confirmation_app_factory.cc index 3907070..94f6e63 100644 --- a/components/payments/content/secure_payment_confirmation_app_factory.cc +++ b/components/payments/content/secure_payment_confirmation_app_factory.cc
@@ -474,8 +474,6 @@ skip_spc_app_creation = skip_spc_app_creation || (!has_authenticator_and_credential && - !PaymentsExperimentalFeatures::IsEnabled( - features::kSecurePaymentConfirmationFallback) && !base::FeatureList::IsEnabled( blink::features::kSecurePaymentConfirmationUxRefresh)); if (skip_spc_app_creation) { @@ -502,10 +500,8 @@ } if (!request->authenticator || !request->credential) { - CHECK(PaymentsExperimentalFeatures::IsEnabled( - features::kSecurePaymentConfirmationFallback) || - base::FeatureList::IsEnabled( - blink::features::kSecurePaymentConfirmationUxRefresh)); + CHECK(base::FeatureList::IsEnabled( + blink::features::kSecurePaymentConfirmationUxRefresh)); // In the case of no authenticator or credentials, we still create the // SecurePaymentConfirmationApp, which holds the information to be shown // in the fallback UX.
diff --git a/components/payments/content/secure_payment_confirmation_app_factory_unittest.cc b/components/payments/content/secure_payment_confirmation_app_factory_unittest.cc index d27821a..3bad8575 100644 --- a/components/payments/content/secure_payment_confirmation_app_factory_unittest.cc +++ b/components/payments/content/secure_payment_confirmation_app_factory_unittest.cc
@@ -850,53 +850,6 @@ } #endif // !BUILDFLAG(IS_IOS) -class SecurePaymentConfirmationAppFactoryFallbackTest - : public SecurePaymentConfirmationAppFactoryTest { - public: - SecurePaymentConfirmationAppFactoryFallbackTest() { - feature_list_.InitAndEnableFeature( - features::kSecurePaymentConfirmationFallback); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -// Test that the SecurePaymentConfirmationApp can be created without credentials -// for the fallback flow, with HasEnrolledInstrument false. -TEST_F(SecurePaymentConfirmationAppFactoryFallbackTest, - Fallback_NoCredentials) { - auto method_data = mojom::PaymentMethodData::New(); - method_data->supported_method = "secure-payment-confirmation"; - method_data->secure_payment_confirmation = - CreateSecurePaymentConfirmationRequest(); - GURL icon = method_data->secure_payment_confirmation->instrument->icon; - - std::unique_ptr<MockPaymentAppFactoryDelegate> mock_delegate = - CreateMockDelegate(std::move(method_data)); - url::Origin caller_origin = url::Origin::Create(GURL("https://site.example")); - EXPECT_CALL(*mock_delegate, GetFrameSecurityOrigin()) - .WillOnce(ReturnRef(caller_origin)); - std::unique_ptr<PaymentApp> secure_payment_confirmation_app; - EXPECT_CALL(*mock_delegate, OnPaymentAppCreated(_)) - .WillOnce(MoveArg<0>(&secure_payment_confirmation_app)); - EXPECT_CALL(*mock_delegate, OnPaymentAppCreationError(_, _)).Times(0); - EXPECT_CALL(*mock_delegate, OnDoneCreatingPaymentApps()).Times(1); - - EXPECT_CALL(*mock_credential_finder_, GetMatchingCredentials) - .WillOnce(RunOnceCallback<5>(NoMatchingCredentials())); - - secure_payment_confirmation_app_factory_->Create(mock_delegate->GetWeakPtr()); - std::vector<gfx::Size> icon_sizes({{32, 32}}); - std::vector<SkBitmap> icon_bitmaps(1); - icon_bitmaps[0].allocN32Pixels(/*width=*/32, /*height=*/32); - static_cast<content::TestWebContents*>(web_contents_.get()) - ->TestDidDownloadImage(icon, /*http_status_code=*/200, - std::move(icon_bitmaps), std::move(icon_sizes)); - - ASSERT_TRUE(secure_payment_confirmation_app); - EXPECT_FALSE(secure_payment_confirmation_app->HasEnrolledInstrument()); -} class SecurePaymentConfirmationAppFactoryUxRefreshTest : public SecurePaymentConfirmationAppFactoryTest {
diff --git a/components/payments/content/secure_payment_confirmation_app_unittest.cc b/components/payments/content/secure_payment_confirmation_app_unittest.cc index 950b15c95a..083f7ab1 100644 --- a/components/payments/content/secure_payment_confirmation_app_unittest.cc +++ b/components/payments/content/secure_payment_confirmation_app_unittest.cc
@@ -696,58 +696,6 @@ EXPECT_TRUE(on_instrument_details_error_called_); } -class SecurePaymentConfirmationAppFallbackTest - : public SecurePaymentConfirmationAppTest { - public: - SecurePaymentConfirmationAppFallbackTest() { - feature_list_.InitAndEnableFeature( - features::kSecurePaymentConfirmationFallback); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -// Test that the SPC app can be created without credentials. -TEST_F(SecurePaymentConfirmationAppFallbackTest, NoCredentials) { - web_contents_ = web_contents_factory_.CreateWebContents(&context_); - SecurePaymentConfirmationApp app( - web_contents_, "effective_rp.example", payment_instrument_label_, - payment_instrument_details_, - /*payment_instrument_icon=*/std::make_unique<SkBitmap>(), - /*credential_id=*/std::vector<uint8_t>(), - /*passkey_browser_binder=*/nullptr, - /*device_supports_browser_bound_keys_in_hardware=*/false, - url::Origin::Create(GURL("https://merchant.example")), spec_->AsWeakPtr(), - MakeRequest(), /*authenticator=*/nullptr, - /*payment_entities_logos=*/{}, - /*is_error_dialog=*/true); - - EXPECT_FALSE(app.HasEnrolledInstrument()); - EXPECT_EQ(app.GetId(), "spc"); -} - -// Test that the SPC app returns HasEnrolledInstrument true when the fallback -// feature is enabled but there are credentials (i.e. no fallback). -TEST_F(SecurePaymentConfirmationAppFallbackTest, WithCredentials) { - web_contents_ = web_contents_factory_.CreateWebContents(&context_); - std::vector<uint8_t> credential_id(credential_id_bytes_.begin(), - credential_id_bytes_.end()); - SecurePaymentConfirmationApp app( - web_contents_, "effective_rp.example", payment_instrument_label_, - payment_instrument_details_, - /*payment_instrument_icon=*/std::make_unique<SkBitmap>(), credential_id, - /*passkey_browser_binder=*/nullptr, - /*device_supports_browser_bound_keys_in_hardware=*/false, - url::Origin::Create(GURL("https://merchant.example")), spec_->AsWeakPtr(), - MakeRequest(), - std::make_unique<webauthn::MockInternalAuthenticator>(web_contents_), - /*payment_entities_logos=*/{}, - /*is_error_dialog=*/false); - - EXPECT_TRUE(app.HasEnrolledInstrument()); - EXPECT_EQ(app.GetId(), base::Base64Encode(credential_id)); -} } // namespace } // namespace payments
diff --git a/components/payments/core/features.cc b/components/payments/core/features.cc index 66066316..3c4084e3 100644 --- a/components/payments/core/features.cc +++ b/components/payments/core/features.cc
@@ -44,8 +44,6 @@ #endif ); -BASE_FEATURE(kSecurePaymentConfirmationFallback, - base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kPaymentRequestUseRendererUrlLoader, base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/components/payments/core/features.h b/components/payments/core/features.h index bff106d8..77e8decd 100644 --- a/components/payments/core/features.h +++ b/components/payments/core/features.h
@@ -43,8 +43,6 @@ // credential store APIs, or if it can only rely on the user-profile database. BASE_DECLARE_FEATURE(kSecurePaymentConfirmationUseCredentialStoreAPIs); -// Used to enable the refreshed fallback flow for Secure Payment Confirmation. -BASE_DECLARE_FEATURE(kSecurePaymentConfirmationFallback); // Used to control the usage of the renderer URL loader in the payment request. BASE_DECLARE_FEATURE(kPaymentRequestUseRendererUrlLoader);
diff --git a/components/plus_addresses/core/browser/settings/plus_address_setting_sync_bridge.cc b/components/plus_addresses/core/browser/settings/plus_address_setting_sync_bridge.cc index c6dc1ff..15213ef 100644 --- a/components/plus_addresses/core/browser/settings/plus_address_setting_sync_bridge.cc +++ b/components/plus_addresses/core/browser/settings/plus_address_setting_sync_bridge.cc
@@ -93,9 +93,8 @@ metadata_change_list.get()); // Update the `store_`'s data and metadata. std::unique_ptr<syncer::DataTypeStore::WriteBatch> batch = - store_->CreateWriteBatch(); + store_->CreateWriteBatch(std::move(metadata_change_list)); batch->WriteData(storage_key, specifics.SerializeAsString()); - batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); store_->CommitWriteBatch( std::move(batch), base::BindOnce(&PlusAddressSettingSyncBridge::ReportErrorIfSet, @@ -124,8 +123,7 @@ syncer::EntityChangeList entity_changes) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); std::unique_ptr<syncer::DataTypeStore::WriteBatch> batch = - store_->CreateWriteBatch(); - batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); + store_->CreateWriteBatch(std::move(metadata_change_list)); for (const std::unique_ptr<syncer::EntityChange>& change : entity_changes) { switch (change->type()) { case syncer::EntityChange::ACTION_ADD:
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index 22b80925..10be5aa 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -7359,9 +7359,6 @@ <translation id="5882345429632338713">Verzögerung vor dem Starten eines alternativen Browsers (Millisekunden)</translation> <translation id="5883015257301027298">Standardeinstellungen für Cookies</translation> <translation id="5883631290631802010">Live-Übersetzung aktivieren</translation> -<translation id="5883754873839596178">Wenn diese Richtlinie konfiguriert ist, legt sie die maximale Anzahl gleichzeitiger Verbindungen zum Proxyserver fest. Einige Proxyserver können eine hohe Anzahl gleichzeitiger Verbindungen pro Client nicht verarbeiten. Dieses Problem kann umgangen werden, indem für diese Richtlinie ein niedrigerer Wert festgelegt wird. Der Wert sollte kleiner als 100 und größer als 6 sein. Einige Web-Apps nutzen viele Verbindungen mit hängenden GETs. Daher kann ein Wert unter 32 dazu führen, dass der Browser hängt, wenn zu viele solcher Web-Apps geöffnet sind. Wenn du einen Wert unter dem Standardwert festlegst, geschieht dies auf eigenes Risiko. - - Ist diese Richtlinie nicht konfiguriert, so kommt der Standardwert von 32 zum Einsatz.</translation> <translation id="5886280631293123880">Diese Richtlinie bietet die Möglichkeit, eine bereits eingestellte und entfernte Reihe von Plattformereignissen namens Mutationsereignisse vorübergehend wieder zu aktivieren. Wenn diese Richtlinie aktiviert ist, werden Mutationsereignisse weiterhin ausgelöst, selbst wenn sie für normale Webnutzer standardmäßig deaktiviert wurden. Ist die Richtlinie deaktiviert oder nicht konfiguriert, werden diese Ereignisse möglicherweise nicht ausgelöst. Diese Richtlinie ist eine vorübergehende Behelfslösung und wird in M137 nicht mehr funktionieren.</translation>
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index a5457a5..c59ba4b 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -7632,9 +7632,6 @@ <translation id="5882345429632338713">Retraso antes de ejecutar otro navegador (milisegundos)</translation> <translation id="5883015257301027298">Configuración de cookies predeterminada</translation> <translation id="5883631290631802010">Habilitar la Traducción instantánea</translation> -<translation id="5883754873839596178">Si estableces la política, se especificará la cantidad máxima de conexiones en simultáneo al servidor proxy. Algunos servidores proxy no pueden soportar una gran cantidad de conexiones en simultáneo por cliente. Para solucionar este problema, establece un valor más bajo para esta política. El valor debe ser menor a 100 y mayor a 6. Algunas apps web son conocidas por utilizar muchas conexiones con solicitudes GET pendientes. Por lo tanto, si estableces un valor menor a 32 es posible que la red del navegador quede pendiente si hay demasiadas apps web con conexiones pendientes abiertas. Usa un valor menor al valor predeterminado bajo tu responsabilidad. - - Si no estableces la política, se usará el valor predeterminado de 32.</translation> <translation id="5886280631293123880">Esta política proporciona una opción temporal para volver a habilitar un conjunto de eventos de la plataforma que ya no están disponibles y se quitaron, llamados eventos de mutación. Si habilitas esta política, se seguirán activando los eventos de mutación, incluso si se inhabilitaron de forma predeterminada para los usuarios normales de la Web. Si la inhabilitas o no la estableces, no se podrán activar estos eventos. Esta política es una solución temporal y ya no funcionará en la versión M137.</translation>
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index 043abef..4546c31 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -7400,9 +7400,6 @@ <translation id="5882345429632338713">Retraso antes de iniciar un navegador alternativo (en milisegundos)</translation> <translation id="5883015257301027298">Configuración de cookies predeterminada</translation> <translation id="5883631290631802010">Habilitar Traducción instantánea</translation> -<translation id="5883754873839596178">Establecer esta política permite especificar el número máximo de conexiones simultáneas al servidor proxy. Algunos servidores proxy no son capaces de gestionar un número elevado de conexiones simultáneas por cliente, lo que se puede solucionar estableciendo un valor inferior para esta política. El valor debe ser inferior a 100 y superior a 6. Algunas aplicaciones web consumen muchas conexiones con las solicitudes GET pendientes, por lo que un valor inferior a 32 puede hacer que la red del navegador se bloquee si se abren muchas aplicaciones web de este tipo. Si estableces un valor inferior al predeterminado, debes hacerlo bajo tu propia responsabilidad. - - Si no se establece esta política, se utilizará el valor predeterminado (32).</translation> <translation id="5886280631293123880">Esta política proporciona un mecanismo temporal para volver a activar un conjunto de eventos de plataforma obsoletos y retirados que se denominan eventos de mutación. Si se habilita esta política, los eventos de mutación seguirán activándose aunque se hayan inhabilitado de forma predeterminada para los usuarios web normales. Si se inhabilita esta política o no se define, estos eventos no se podrán activar. Esta política es una solución temporal y dejará de funcionar en la versión M137.</translation>
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index 34f34fc..5d5c3b1 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -7371,9 +7371,6 @@ <translation id="5882345429632338713">Délai avant le lancement du navigateur secondaire (en millisecondes)</translation> <translation id="5883015257301027298">Paramètre de cookies par défaut</translation> <translation id="5883631290631802010">Activer la traduction instantanée</translation> -<translation id="5883754873839596178">Cette règle permet de spécifier le nombre maximal de connexions simultanées au serveur proxy. Toutefois, certains serveurs proxy ne peuvent pas gérer de nombreuses connexions simultanées par client. Pour résoudre ce problème, il suffit de diminuer la valeur de cette règle, laquelle doit être supérieure à 6 et inférieure à 100. Certaines applications Web sont connues pour utiliser de nombreuses connexions avec des requêtes GET en attente. Par conséquent, si vous définissez une valeur inférieure à 32, le réseau du navigateur risque de se bloquer si trop d'applications Web avec des connexions de ce type sont ouvertes. Toute diminution de la valeur par défaut est effectuée à vos propres risques. - - Si cette règle n'est pas configurée, la valeur par défaut (32) est utilisée.</translation> <translation id="5886280631293123880">Cette règle permet de réactiver temporairement un ensemble d'événements de plate-forme obsolète et supprimé appelé "Événements de mutation". Si cette règle est activée, les événements de mutation continuent de se déclencher, même s'ils ont été désactivés par défaut pour les utilisateurs Web standards. Si elle est désactivée ou n'est pas configurée, il est possible que ces événements ne soient pas déclenchés. Cette règle est une solution temporaire et ne fonctionnera plus dans M137.</translation>
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index a0eda8a..d1dbecf 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -7642,9 +7642,6 @@ <translation id="5882345429632338713">Penundaan sebelum meluncurkan browser alternatif (milidetik)</translation> <translation id="5883015257301027298">Setelan cookie default</translation> <translation id="5883631290631802010">Aktifkan fitur Terjemahan Langsung</translation> -<translation id="5883754873839596178">Menyetel kebijakan akan menentukan jumlah maksimal koneksi simultan ke server proxy. Beberapa server proxy tidak dapat menangani koneksi serentak tiap klien dalam jumlah besar, yang dapat diselesaikan dengan menyetel kebijakan ini ke nilai yang lebih rendah. Nilai harus lebih rendah dari 100 dan lebih tinggi dari 6. Beberapa aplikasi web diketahui menggunakan banyak koneksi dengan GET yang macet, jadi dengan menyetel nilai lebih rendah dari 32 dapat menyebabkan jaringan browser menjadi macet jika terlalu banyak aplikasi web dengan jaringan macet terbuka. Turunkan di bawah nilai default dengan menanggung sendiri risikonya. - - Tidak menyetel kebijakan berarti nilai default 32 akan digunakan.</translation> <translation id="5886280631293123880">Kebijakan ini memberikan pilihan pengaktifan kembali sementara ke rangkaian peristiwa platform yang tidak digunakan lagi dan dihapus, yang disebut Peristiwa Mutasi. Jika kebijakan ini disetel ke Aktif, peristiwa mutasi akan terus diaktifkan, meskipun telah dinonaktifkan secara default untuk pengguna web normal. Jika kebijakan ini disetel ke Nonaktif atau tidak disetel, peristiwa ini mungkin tidak akan diaktifkan. Kebijakan ini adalah solusi sementara, dan tidak akan berfungsi lagi di M137.</translation>
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index 50aa56b..1b2d8709 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -7462,9 +7462,6 @@ <translation id="5882345429632338713">Ritardo prima di avviare il browser alternativo (in millisecondi)</translation> <translation id="5883015257301027298">Impostazione cookie predefiniti</translation> <translation id="5883631290631802010">Attiva Traduzione dal Vivo</translation> -<translation id="5883754873839596178">La configurazione della policy consente di specificare il numero massimo di connessioni simultanee al server proxy. Alcuni server proxy non riescono a gestire un numero elevato di connessioni contemporanee per client, ma è sufficiente impostare la policy su un numero inferiore per risolvere questo problema. Il valore deve essere inferiore a 100 e superiore a 6. Alcune app web sono note per richiedere molte connessioni con Hanging-GET, pertanto impostare un valore inferiore a 32 potrebbe causare interruzioni di rete del browser se sono aperte troppe app web di questo tipo. È sconsigliato utilizzare un valore inferiore a quello predefinito. - - Se la policy non viene configurata, viene utilizzato il valore predefinito 32.</translation> <translation id="5886280631293123880">Questa policy consente di riattivare temporaneamente un insieme di eventi della piattaforma deprecato e rimosso chiamato eventi Mutazione. Se questa policy viene attivata, gli eventi Mutazione continueranno a essere attivati, anche se sono stati disattivati per impostazione predefinita per i normali utenti web. Se questa policy viene disattivata o se non viene configurata, questi eventi potrebbero non essere attivati. Questa policy è una soluzione alternativa temporanea e non sarà più valida nella versione M137.</translation>
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index 431ee396..fa9a8d6 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -7120,9 +7120,6 @@ <translation id="5882345429632338713">代替ブラウザ起動までの待機時間(ミリ秒)</translation> <translation id="5883015257301027298">デフォルトの Cookie 設定</translation> <translation id="5883631290631802010">リアルタイム翻訳を有効にする</translation> -<translation id="5883754873839596178">このポリシーでは、プロキシ サーバーへの最大同時接続数を指定できます。プロキシ サーバーによっては 1 クライアントに対して多数の同時接続を処理できない場合があります。この問題を解決するには、このポリシーを小さい値に設定します。この値は 7 以上 100 未満の間で指定する必要があります。一部のウェブアプリは、GET がハングした接続を複数同時に行う場合があります。そのため、32 より小さい値を設定した場合、接続がハングしているウェブアプリを多く開きすぎると、ブラウザのネットワーク接続が異常停止する可能性があります。なお、デフォルト値より小さい値を設定する場合は、ご自身の責任において行ってください。 - - このポリシーを未設定のままにした場合、デフォルト値の 32 が使用されます。</translation> <translation id="5886280631293123880">このポリシーでは、ミューテーション イベントと呼ばれる、非推奨の削除されたプラットフォーム イベントのセットを一時的に再度オプトインします。 このポリシーを有効に設定すると、通常のウェブユーザーに対してデフォルトで無効になっていても、ミューテーション イベントは引き続き発生します。このポリシーを無効に設定するか未設定のままにした場合、このイベントは発生しません。 このポリシーは一時的な回避策で、M137 では機能しなくなります。</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 088583a..aac1aa6 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -7482,9 +7482,6 @@ <translation id="5882345429632338713">대체 브라우저 실행 전 대기 시간(밀리초)</translation> <translation id="5883015257301027298">기본 쿠키 설정</translation> <translation id="5883631290631802010">실시간 번역 사용 설정</translation> -<translation id="5883754873839596178">정책을 설정하면 프록시 서버에 동시 연결할 수 있는 최대 대수가 지정됩니다. 일부 프록시 서버는 클라이언트당 많은 수의 동시 연결을 처리할 수 없으며 정책을 더 낮은 값으로 설정하여 해결할 수 있습니다. 값은 6보다 크고 100보다 작아야 합니다. 일부 웹 앱은 중지 상태인 GET에 너무 많은 연결을 사용하는 것으로 알려져 있으므로 32 밑으로 낮추면 연결이 중지 상태인 웹 앱이 여러 개 열려 있을 때 브라우저 네트워크가 끊길 수 있습니다. 기본값 밑으로 낮추는 데 따르는 위험은 사용자가 감수해야 합니다. - - 정책을 설정하지 않으면 기본값 32가 사용됩니다.</translation> <translation id="5886280631293123880">이 정책은 지원 중단 및 삭제된 변형 이벤트라는 플랫폼 이벤트를 일시적으로 다시 선택할 수 있습니다. 정책을 사용 설정하면 일반 웹 사용자에 대해 기본적으로 사용 중지된 경우에도 변형 이벤트가 계속 실행됩니다. 정책을 사용 중지하거나 설정하지 않으면 이러한 이벤트가 실행되지 않을 수 있습니다. 이 정책은 일시적인 해결 방법이며 M137에서는 더 이상 작동하지 않습니다.</translation>
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 0c087c3..e193c1c6 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -6543,7 +6543,7 @@ <translation id="5362531528507578966">Hiermee wordt de standaardmodus voor afdrukken met achtergrondbeelden overschreven.</translation> <translation id="5365476955714838841">Opdrachtregelparameters voor de alternatieve browser.</translation> <translation id="5365946944967967336">Homepage-knop in de werkbalk tonen</translation> -<translation id="5366977351895725771">Als dit is ingesteld op False, kan deze gebruiker geen gebruikers onder toezicht maken. Bestaande gebruikers met beperkte rechten blijven beschikbaar. +<translation id="5366977351895725771">Als dit is ingesteld op False, kan deze gebruiker geen gebruikers onder toezicht maken. Bestaande gebruikers onder toezicht blijven beschikbaar. Als dit is ingesteld op True of niet is ingesteld, kunnen gebruikers onder toezicht worden gemaakt en beheerd door deze gebruiker.</translation> <translation id="5367255280764736002">Als <ph name="DEFAULT_SEARCH_PROVIDER_ENABLED_POLICY_NAME" /> aanstaat en je daarna <ph name="DEFAULT_SEARCH_PROVIDER_IMAGE_URL_POST_PARMS_POLICY_NAME" /> instelt, worden de parameters aangegeven tijdens afbeeldingszoekopdrachten met POST. Deze bestaan uit door komma's gescheiden naam/waarde-paren. Als een waarde een templateparameter (zoals {imageThumbnail}) is, wordt de waarde vervangen door echte thumbnailgegevens. @@ -7329,9 +7329,6 @@ <translation id="5882345429632338713">Vertraging voor starten van alternatieve browser (in milliseconden)</translation> <translation id="5883015257301027298">Standaardinstelling voor cookies</translation> <translation id="5883631290631802010">Live vertalen aanzetten</translation> -<translation id="5883754873839596178">Als je het beleid instelt, kun je het maximale aantal gelijktijdige verbindingen met de proxyserver opgeven. Bepaalde proxyservers kunnen niet een groot aantal gelijktijdige verbindingen per client verwerken. Dit kan worden opgelost door dit beleid op een lagere waarde in te stellen. De waarde moet lager dan 100 en hoger dan 6 zijn. Het is bekend dat sommige web-apps veel verbindingen gebruiken voor openstaande GET-verzoeken. Als je een waarde lager dan 32 instelt, lopen netwerkprocessen van de browser daarom mogelijk vast als er te veel web-apps met openstaande verbindingen zijn geopend. Het tot onder de standaardwaarde verlagen van deze waarde is daarom op eigen risico. - - Als je het beleid niet instelt, wordt de standaardwaarde 32 gebruikt.</translation> <translation id="5886280631293123880">Dit beleid biedt een tijdelijke aanmelding voor een beëindigde en verwijderde set platformgebeurtenissen met de naam Mutatiegebeurtenissen. Als je dit beleid toepast, worden mutatiegebeurtenissen nog steeds geactiveerd, zelfs als ze standaard zijn uitgezet voor normale internetgebruikers. Als je dit beleid niet toepast of niet instelt, worden deze gebeurtenissen misschien niet geactiveerd. Dit beleid is een tijdelijke oplossing en werkt niet meer in M137.</translation>
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 77f0c1f..84d80b2f 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -7621,9 +7621,6 @@ <translation id="5882345429632338713">Atraso para iniciar um navegador alternativo (milésimos de segundo)</translation> <translation id="5883015257301027298">Configuração de cookies padrão</translation> <translation id="5883631290631802010">Ativar a tradução instantânea</translation> -<translation id="5883754873839596178">Se a política for definida, o número máximo de conexões simultâneas ao servidor proxy será especificado. Alguns servidores proxy não podem administrar um grande número de conexões simultâneas por cliente, o que pode ser resolvido com a definição de um número menor para esta política. Defina um valor inferior a 100 e superior a 6. Alguns apps da Web são conhecidos por consumir muitas conexões com GETs irresponsivos, então definir um valor inferior a 32 pode gerar deslocamentos na rede do navegador caso haja muitos apps da Web com conexões deslocadas abertas. A definição de valores inferiores ao padrão fica por sua conta e risco. - - Se a política não for definida, o valor padrão de 32 será usado.</translation> <translation id="5886280631293123880">Esta política fornece uma reativação temporária para um conjunto de eventos de plataforma descontinuados e removidos chamado "Eventos de mutação". Quando esta política estiver ativada, os eventos de mutação continuarão a ser acionados, mesmo que tenham sido desativados por padrão para usuários normais da Web. Se a política for desativada ou não for definida, esses eventos não poderão ser disparados. Ela é uma solução temporária e não vai mais funcionar na versão M137.</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index 1e73874..0177d00 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -7372,9 +7372,6 @@ <translation id="5882345429632338713">Задержка перед запуском альтернативного браузера (в миллисекундах)</translation> <translation id="5883015257301027298">Настройки файлов cookie по умолчанию</translation> <translation id="5883631290631802010">Включить мгновенный перевод</translation> -<translation id="5883754873839596178">Правило позволяет задать максимальное количество одновременных подключений к прокси-серверу. Некоторые прокси-серверы не могут обработать множество одновременных подключений к одному клиенту. Чтобы решить эту проблему, необходимо установить более низкое значение. Значение должно быть меньше 100 и больше 6. Некоторые веб-приложения используют сразу несколько подключений с ожидающими выполнения GET-запросами, поэтому при установке значения ниже 32 возможно зависание браузера, если таких веб-приложений слишком много. Если выбрано значение ниже значения по умолчанию, мы не отвечаем за последствия. - - Если правило не настроено, используется значение по умолчанию – 32.</translation> <translation id="5886280631293123880">Это правило – временное решение для включения событий изменения на платформе, которые устарели и были удалены. Когда оно включено, события изменения будут срабатывать, даже если для обычных пользователей интернета они деактивированы по умолчанию. Если правило отключено или не настроено, этого происходить не будет. Это временное решение, которое мы удалим в версии M137.</translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index f0bb62a..098eda85 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -7340,9 +7340,6 @@ <translation id="5882345429632338713">หน่วงเวลาก่อนเปิดเบราว์เซอร์สำรอง (มิลลิวินาที)</translation> <translation id="5883015257301027298">การตั้งค่าคุกกี้เริ่มต้น</translation> <translation id="5883631290631802010">เปิดใช้ฟีเจอร์แปลสด</translation> -<translation id="5883754873839596178">การตั้งค่านโยบายจะระบุจำนวนการเชื่อมต่อพร็อกซีเซิร์ฟเวอร์พร้อมกันสูงสุด บางพร็อกซีเซิร์ฟเวอร์จัดการการเชื่อมต่อที่เกิดขึ้นพร้อมกันจำนวนมากต่อไคลเอ็นต์ไม่ได้ ปัญหานี้แก้ไขได้โดยการตั้งค่านโยบายนี้ให้มีค่าต่ำลง ค่าไม่ควรเกิน 100 แต่สูงกว่า 6 เว็บแอปบางรายการนั้นเป็นที่ทราบว่าต้องใช้การเชื่อมต่อจำนวนมากเนื่องจากใช้ Hanging GET การตั้งค่าที่ต่ำกว่า 32 จึงอาจส่งผลให้การเชื่อมโยงเครือข่ายของเบราว์เซอร์ค้างได้ในกรณีที่เปิดเว็บแอปที่ใช้การเชื่อมต่อ Hanging เป็นจำนวนมากเกินไป คุณต้องยอมรับความเสี่ยงเองหากตั้งค่าต่ำกว่าค่าเริ่มต้น - - การไม่ตั้งค่านโยบายจะทำให้ระบบใช้ค่าเริ่มต้นที่ 32</translation> <translation id="5886280631293123880">นโยบายนี้ช่วยให้สามารถเลือกใช้ชุดเหตุการณ์แพลตฟอร์มที่เลิกใช้งานและนำออกไปแล้วซึ่งเรียกว่า Mutation Event อีกครั้งได้ชั่วคราว เมื่อเปิดใช้นโยบายนี้ Mutation Event จะยังคงเริ่มทำงานต่อไป แม้ว่าระบบจะปิดใช้โดยค่าเริ่มต้นสำหรับผู้ใช้เว็บทั่วไปก็ตาม เมื่อปิดใช้หรือไม่ได้ตั้งค่านโยบายนี้ เหตุการณ์เหล่านี้อาจไม่เริ่มทำงาน นโยบายนี้เป็นวิธีแก้ปัญหาชั่วคราวและจะไม่ทำงานใน M137 อีกต่อไป</translation>
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index 1993710..e620f80 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -7494,9 +7494,6 @@ <translation id="5882345429632338713">Alternatif tarayıcı açılmadan önce geçecek süre (milisaniye)</translation> <translation id="5883015257301027298">Varsayılan çerezler ayarı</translation> <translation id="5883631290631802010">Canlı Çeviri'yi etkinleştir</translation> -<translation id="5883754873839596178">Politika ayarlanırsa proxy sunucuyla yapılabilecek maksimum eşzamanlı bağlantı sayısı belirtilir. Bazı proxy sunucular istemci başına çok sayıda eşzamanlı bağlantıyı işleyemez. Bu sorun, bu politikanın daha düşük bir değere ayarlanmasıyla çözülür. Değer, 100'den küçük, 6'dan büyük olmalıdır. Bazı web uygulamalarının askıda kalan GET'lerle çok fazla bağlantı kullandığı bilinmektedir. Bu nedenle, 32'den küçük bir değerin ayarlanması, askıda bağlantısı olan çok fazla web uygulamasının açık olması halinde tarayıcı bağlantılarının yavaşlamasına neden olabilir. Varsayılanın altında bir değer ayarlayacaksanız bunun tüm riski size aittir. - - Politika ayarlanmadan bırakılırsa, varsayılan değer olarak 32 kullanılır.</translation> <translation id="5886280631293123880">Bu politika mutasyon etkinliği olarak bilinen, desteği sonlandırılmış ve kaldırılmış bir grup platform etkinliğini geçici olarak tekrar kapsama imkanı sağlar. Politika, Etkin olarak ayarlandığında, normal web kullanıcıları için varsayılan olarak devre dışı bırakılmış olsa bile mutasyon etkinliklerinin tetiklenmesine devam edilir. Politika, Devre dışı değerine ayarlanır veya ayarlanmadan bırakılırsa bu etkinlikler tetiklenemez. Geçici bir çözüm olan bu politika M137 sürümünde artık geçerli olmayacaktır.</translation>
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index 96285fc9..a7a16658 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -7409,9 +7409,6 @@ <translation id="5882345429632338713">Затримка перед запуском альтернативного веб-переглядача (мілісекунди)</translation> <translation id="5883015257301027298">Налаштування файлів cookie за умовчанням</translation> <translation id="5883631290631802010">Увімкнути миттєвий переклад</translation> -<translation id="5883754873839596178">За допомогою цього правила можна вказати максимальну кількість одночасних підключень до проксі-сервера. Деякі проксі-сервери не можуть обробляти велику кількість паралельних підключень для одного клієнта. Щоб вирішити таку проблему, укажіть для цього правила менше значення. Значення має бути більшим ніж 6 і меншим ніж 100. Деякі веб-додатки використовують багато підключень із запитами GET, які очікують виконання, тому значення, нижче ніж 32, може спричинити "зависання" мережі веб-переглядача, якщо відкрито забагато веб-додатків. Встановлюйте менше значення, ніж значення за умовчанням, на власний ризик. - - Якщо це правило не налаштовано, використовується значення за умовчанням (32).</translation> <translation id="5886280631293123880">Це правило дає змогу тимчасово ввімкнути непідтримуваний і вилучений набір подій платформи під назвою "Події мутації". Якщо ввімкнути це правило, події мутації працюватимуть, навіть коли їх вимкнено за умовчанням для звичайних користувачів вебсайтів. Якщо його вимкнути або не налаштувати, ці події не активуватимуться. Це правило діє тимчасово. Починаючи з версії M137, воно не працюватиме.</translation>
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index b870276..5b2a7db 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -7475,9 +7475,6 @@ <translation id="5882345429632338713">Hoãn lại trước khi chạy trình duyệt thay thế (mili giây)</translation> <translation id="5883015257301027298">Cài đặt cookie mặc định</translation> <translation id="5883631290631802010">Bật tính năng Dịch trực tiếp</translation> -<translation id="5883754873839596178">Nếu bạn đặt chính sách này, số lượng tối đa lượt kết nối đồng thời đến máy chủ proxy sẽ được chỉ định. Một số máy chủ proxy không thể xử lý lượng lớn lượt kết nối đồng thời trên mỗi máy khách. Tuy nhiên, bạn có thể giải quyết vấn đề đó bằng cách đặt chính sách này về giá trị thấp hơn. Bạn nên đặt giá trị cao hơn 6 và thấp hơn 100. Một số ứng dụng web tiêu hao lượng lớn lượt kết nối khi có các lệnh GET bị treo. Vì vậy, việc đặt giá trị dưới 32 có thể khiến mạng của trình duyệt bị treo nếu có quá nhiều ứng dụng web (với các lượt kết nối bị treo) đang mở. Bạn phải tự chịu rủi ro khi đặt giá trị thấp hơn giá trị mặc định. - - Nếu bạn không đặt chính sách này, giá trị mặc định được dùng sẽ là 32.</translation> <translation id="5886280631293123880">Chính sách này cho phép chọn tham gia lại tạm thời đối với một nhóm sự kiện nền tảng không được dùng nữa và đã bị loại bỏ, được gọi là Sự kiện đột biến. Khi bạn đặt chính sách này thành Bật, các sự kiện đột biến sẽ tiếp tục được kích hoạt ngay cả khi đã bị tắt theo mặc định đối với người dùng web thông thường. Khi bạn đặt chính sách này thành Tắt hoặc không đặt, hệ thống sẽ không thể kích hoạt các sự kiện này. Chính sách này chỉ là giải pháp tạm thời và sẽ không còn hoạt động trong phiên bản M137.</translation>
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index cd93023..98a4299 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -7304,9 +7304,6 @@ <translation id="5882345429632338713">在启动替代浏览器之前的延迟时间(以毫秒为单位)</translation> <translation id="5883015257301027298">默认 Cookie 设置</translation> <translation id="5883631290631802010">启用“实时翻译”功能</translation> -<translation id="5883754873839596178">通过设置此政策,您可以指定可同时连接到代理服务器的连接数上限。某些代理服务器无法处理由同一客户端同时发出的大量连接,您只需将此政策设为较小的值即可解决该问题。此政策的值应大于 6 且小于 100。众所周知,某些 Web 应用采用了挂起 GET,这样会消耗大量连接,因此如果打开的此类 Web 应用过多,将政策值设为小于 32 就可能会导致浏览器网络连接挂起。如果所设的政策值小于默认值,您需自担风险。 - - 如果您未设置此政策,系统将使用默认值 32。</translation> <translation id="5886280631293123880">此政策旨在让您临时重新启用一组已弃用和已移除的平台事件,这些事件称为“变更事件”。 如果已启用此政策,系统会继续触发变更事件,即使已针对普通网络用户默认停用变更事件也是如此。如果已停用或未设置此政策,这些事件可能无法触发。 此政策是一种临时的变通方案,在 M137 中将不再有效。</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index 174d18f..e2a85693 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -7177,9 +7177,6 @@ <translation id="5882345429632338713">在啟動替代瀏覽器前的延遲時間 (以毫秒為單位)</translation> <translation id="5883015257301027298">預設 Cookie 設定</translation> <translation id="5883631290631802010">啟用即時翻譯</translation> -<translation id="5883754873839596178">你可以透過這項政策設定 Proxy 伺服器的同時連線數量上限。部分 Proxy 伺服器無法處理單一用戶端的大量並行連線,你可以調降這項政策的值來解決這個問題。這項政策的值必須介於 6 到 100 之間。已知部分網頁應用程式會耗用許多連線來處理停滯的 GET 動作,因此如果設定低於 32 的值,當太多這類網頁應用程式開啟時,可能會導致瀏覽器網路當機。請自行承擔低於預設值的風險。 - - 如果未設定這項政策,系統將採用 32 做為預設值。</translation> <translation id="5886280631293123880">設定這項政策後,可暫時重新啟用一組已淘汰並移除的平台事件,即變化事件。 如果啟用這項政策,即使一般網頁使用者預設停用變化事件,系統仍會持續觸發。如果停用這項政策或不設定,可能無法觸發這類事件。 這項政策只是暫時解決方案,從 M137 起將不再有效。</translation>
diff --git a/components/policy/resources/templates/policy_definitions/GenerativeAI/AutofillPredictionSettings.yaml b/components/policy/resources/templates/policy_definitions/GenerativeAI/AutofillPredictionSettings.yaml index d84b1db..57b709dc 100644 --- a/components/policy/resources/templates/policy_definitions/GenerativeAI/AutofillPredictionSettings.yaml +++ b/components/policy/resources/templates/policy_definitions/GenerativeAI/AutofillPredictionSettings.yaml
@@ -40,5 +40,8 @@ supported_on: - chrome.*:137- - chrome_os:137- +future_on: +- android +- ios tags: [] type: int-enum
diff --git a/components/policy/test/data/pref_mapping/AutofillPredictionSettings.json b/components/policy/test/data/pref_mapping/AutofillPredictionSettings.json index 086ef76b..d06251d 100644 --- a/components/policy/test/data/pref_mapping/AutofillPredictionSettings.json +++ b/components/policy/test/data/pref_mapping/AutofillPredictionSettings.json
@@ -4,7 +4,8 @@ "win", "linux", "mac", - "chromeos" + "chromeos", + "android" ], "simple_policy_pref_mapping_test": { "pref_name": "optimization_guide.model_execution.autofill_prediction_improvements_enterprise_policy_allowed",
diff --git a/components/safe_browsing/content/browser/client_side_detection_host.cc b/components/safe_browsing/content/browser/client_side_detection_host.cc index c1ec482e..e854dc8 100644 --- a/components/safe_browsing/content/browser/client_side_detection_host.cc +++ b/components/safe_browsing/content/browser/client_side_detection_host.cc
@@ -981,6 +981,8 @@ last_request_type_, ClientSideDetectionType_MAX + 1); } is_csd_running_ = false; + last_request_type_ = + ClientSideDetectionType::CLIENT_SIDE_DETECTION_TYPE_UNSPECIFIED; if (base::FeatureList::IsEnabled(kClientSideDetectionNewObservers)) { if (did_first_visually_non_empty_paint_ ^ on_first_contentful_paint_) {
diff --git a/components/saved_tab_groups/internal/android/tab_group_sync_service_android_unittest.cc b/components/saved_tab_groups/internal/android/tab_group_sync_service_android_unittest.cc index f899736..cb0741145 100644 --- a/components/saved_tab_groups/internal/android/tab_group_sync_service_android_unittest.cc +++ b/components/saved_tab_groups/internal/android/tab_group_sync_service_android_unittest.cc
@@ -65,8 +65,7 @@ ~TabGroupSyncServiceAndroidTest() override = default; void SetUp() override { - j_test_ = - JTabGroupSyncServiceAndroidUnitTestJni::New(AttachCurrentThread()); + j_test_ = TabGroupSyncServiceAndroidUnitTestJni::New(AttachCurrentThread()); CreateBridge(); SetUpJavaTestObserver(); }
diff --git a/components/saved_tab_groups/internal/saved_tab_group_model.cc b/components/saved_tab_groups/internal/saved_tab_group_model.cc index 6971bdd..57299c1 100644 --- a/components/saved_tab_groups/internal/saved_tab_group_model.cc +++ b/components/saved_tab_groups/internal/saved_tab_group_model.cc
@@ -993,16 +993,31 @@ saved_tab_groups_.begin(), saved_tab_groups_.end(), [](const tab_groups::SavedTabGroup& left, const tab_groups::SavedTabGroup& right) { - bool left_pinned = left.pinned_position_for_migration().has_value(); - bool right_pinned = right.pinned_position_for_migration().has_value(); + const bool left_pinned = + left.pinned_position_for_migration().has_value(); + const bool right_pinned = + right.pinned_position_for_migration().has_value(); + if (left_pinned != right_pinned) { return left_pinned; } - if (left_pinned) { - return left.pinned_position_for_migration().value() < - right.pinned_position_for_migration().value(); + + if (!left_pinned) { + return left.creation_time() > right.creation_time(); } - return left.creation_time() > right.creation_time(); + + const size_t left_pos = left.pinned_position_for_migration().value(); + const size_t right_pos = right.pinned_position_for_migration().value(); + + // If two groups have the same pinned_position, order the + // more recently updated group first. This matches how + // conflicts with pinned_position are resolved in + // ShouldPlaceBefore. + if (left_pos == right_pos) { + return left.update_time() > right.update_time(); + } + + return left_pos < right_pos; }); for (size_t i = 0; i < saved_tab_groups_.size(); ++i) {
diff --git a/components/saved_tab_groups/internal/saved_tab_group_model_unittest.cc b/components/saved_tab_groups/internal/saved_tab_group_model_unittest.cc index 174d85c..f34b465c 100644 --- a/components/saved_tab_groups/internal/saved_tab_group_model_unittest.cc +++ b/components/saved_tab_groups/internal/saved_tab_group_model_unittest.cc
@@ -1713,8 +1713,7 @@ saved_tab_group_model_->Get(guid)->pinned_position_for_migration()); } -TEST_F(SavedTabGroupModelTest, - MigratePinnedPositionToProjectsPositionWithProjectsPanel) { +TEST_F(SavedTabGroupModelTest, MigratePinnedPositionToProjectsPosition) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(tab_groups::kProjectsPanel); @@ -1793,6 +1792,72 @@ EXPECT_EQ(3, groups[3].position()); } +TEST_F(SavedTabGroupModelTest, + MigratePinnedPositionToProjectsPosition_SomePositionsEqual) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(tab_groups::kProjectsPanel); + + RemoveTestData(); + + base::Time fixed_time = + base::Time::FromDeltaSinceWindowsEpoch(base::Hours(1)); + base::Time creation_time = fixed_time - base::Minutes(10); + base::Uuid pinned_id_1 = base::Uuid::GenerateRandomV4(); + base::Uuid pinned_id_2 = base::Uuid::GenerateRandomV4(); + base::Uuid pinned_id_3 = base::Uuid::GenerateRandomV4(); + + // Pinned group 1, position 0, older update time. + SavedTabGroup pinned_group_1( + u"Pinned 1", tab_groups::TabGroupColorId::kRed, {}, 0, pinned_id_1, + /*local_group_id=*/std::nullopt, /*creator_cache_guid=*/std::nullopt, + /*last_updater_cache_guid=*/std::nullopt, + /*created_before_syncing_tab_groups=*/false, creation_time, + /*update_time=*/fixed_time - base::Minutes(10)); + pinned_group_1.SetPinnedPositionForMigration(0); + + // Pinned group 2, position 0, newer update time. + SavedTabGroup pinned_group_2( + u"Pinned 2", tab_groups::TabGroupColorId::kBlue, {}, 0, pinned_id_2, + /*local_group_id=*/std::nullopt, /*creator_cache_guid=*/std::nullopt, + /*last_updater_cache_guid=*/std::nullopt, + /*created_before_syncing_tab_groups=*/false, creation_time, + /*update_time=*/fixed_time - base::Minutes(5)); + pinned_group_2.SetPinnedPositionForMigration(0); + + // Pinned group 3, position 1. + SavedTabGroup pinned_group_3( + u"Pinned 3", tab_groups::TabGroupColorId::kGreen, {}, 1, pinned_id_3, + /*local_group_id=*/std::nullopt, /*creator_cache_guid=*/std::nullopt, + /*last_updater_cache_guid=*/std::nullopt, + /*created_before_syncing_tab_groups=*/false, creation_time, + /*update_time=*/fixed_time - base::Minutes(1)); + pinned_group_3.SetPinnedPositionForMigration(1); + + saved_tab_group_model_->AddedLocally(pinned_group_1); + saved_tab_group_model_->AddedLocally(pinned_group_2); + saved_tab_group_model_->AddedLocally(pinned_group_3); + + // Trigger the migration. + saved_tab_group_model_->MigratePinnedPositionToProjectsPosition(); + + // Expected order: + // 1. Pinned 2 (Position 0, more recently updated) + // 2. Pinned 1 (Position 0, less recently updated) + // 3. Pinned 3 (Position 1) + + ASSERT_EQ(3, saved_tab_group_model_->Count()); + const auto& groups = saved_tab_group_model_->saved_tab_groups(); + + EXPECT_EQ(pinned_id_2, groups[0].saved_guid()); + EXPECT_EQ(0, groups[0].position()); + + EXPECT_EQ(pinned_id_1, groups[1].saved_guid()); + EXPECT_EQ(1, groups[1].position()); + + EXPECT_EQ(pinned_id_3, groups[2].saved_guid()); + EXPECT_EQ(2, groups[2].position()); +} + } // namespace } // namespace tab_groups
diff --git a/components/saved_tab_groups/internal/saved_tab_group_sync_bridge.cc b/components/saved_tab_groups/internal/saved_tab_group_sync_bridge.cc index a4db2e28..57a8dd8 100644 --- a/components/saved_tab_groups/internal/saved_tab_group_sync_bridge.cc +++ b/components/saved_tab_groups/internal/saved_tab_group_sync_bridge.cc
@@ -168,8 +168,8 @@ // error after the scoped write batch is destroyed (otherwise, changes would // be committed in case of error). base::ScopedClosureRunner scoped_write_batch_destroy_runner = - MaybeCreateScopedWriteBatch( - /*commit_write_batch_on_destroy=*/false); + MaybeCreateScopedWriteBatch(/*commit_write_batch_on_destroy=*/false, + std::move(metadata_change_list)); CHECK(ongoing_write_batch_); std::set<std::string> synced_items; @@ -185,7 +185,7 @@ for (const auto& change : entity_changes) { synced_items.insert(change->storage_key()); AddDataToLocalStorage(std::move(change->data().specifics.saved_tab_group()), - metadata_change_list.get(), + ongoing_write_batch_->GetMetadataChangeList(), ongoing_write_batch_.get(), /*notify_sync=*/true); } @@ -200,19 +200,16 @@ continue; } SendToSync(SavedTabGroupTabToData(tab).specifics(), - metadata_change_list.get()); + ongoing_write_batch_->GetMetadataChangeList()); } if (synced_items.count(group->saved_guid().AsLowercaseString())) { continue; } SendToSync(SavedTabGroupToData(*group).specifics(), - metadata_change_list.get()); + ongoing_write_batch_->GetMetadataChangeList()); } - ongoing_write_batch_->TakeMetadataChangesFrom( - std::move(metadata_change_list)); - // Successfully applied all the changes. Explicitly commit the write batch to // store. CommitOngoingWriteBatch(); @@ -229,8 +226,8 @@ // ApplyIncrementalSyncChanges(). CHECK(!ongoing_write_batch_); base::ScopedClosureRunner scoped_write_batch_destroy_runner = - MaybeCreateScopedWriteBatch( - /*commit_write_batch_on_destroy=*/false); + MaybeCreateScopedWriteBatch(/*commit_write_batch_on_destroy=*/false, + std::move(metadata_change_list)); CHECK(ongoing_write_batch_); std::vector<std::string> deleted_entities; @@ -244,7 +241,8 @@ case syncer::EntityChange::ACTION_UPDATE: { AddDataToLocalStorage( std::move(change->data().specifics.saved_tab_group()), - metadata_change_list.get(), ongoing_write_batch_.get(), + ongoing_write_batch_->GetMetadataChangeList(), + ongoing_write_batch_.get(), /*notify_sync=*/false); break; } @@ -265,9 +263,6 @@ ResolveTabsMissingGroups(ongoing_write_batch_.get()); ResolveGroupsMissingTabs(ongoing_write_batch_.get()); - ongoing_write_batch_->TakeMetadataChangesFrom( - std::move(metadata_change_list)); - // Successfully applied all the changes. Explicitly commit the write batch to // store. CommitOngoingWriteBatch(); @@ -317,10 +312,9 @@ // They should still exist in sync server. CHECK(!ongoing_write_batch_); base::ScopedClosureRunner scoped_write_batch_destroy_runner = - MaybeCreateScopedWriteBatch(/*commit_write_batch_on_destroy=*/true); - CHECK(ongoing_write_batch_); - ongoing_write_batch_->TakeMetadataChangesFrom( - std::move(delete_metadata_change_list)); + MaybeCreateScopedWriteBatch(/*commit_write_batch_on_destroy=*/true, + std::move(delete_metadata_change_list)); + std::vector<base::Uuid> groups_to_close_locally; for (const SavedTabGroup* group : model_wrapper_->GetTabGroups()) { if (group->created_before_syncing_tab_groups()) { @@ -522,7 +516,8 @@ void SavedTabGroupSyncBridge::SavedTabGroupAddedLocally( const base::Uuid& guid) { base::ScopedClosureRunner scoped_write_batch_destroy_runner = - MaybeCreateScopedWriteBatch(/*commit_write_batch_on_destroy=*/true); + MaybeCreateScopedWriteBatch(/*commit_write_batch_on_destroy=*/true, + /*metadata_change_list=*/nullptr); CHECK(ongoing_write_batch_); const SavedTabGroup* group = model_wrapper_->GetGroup(guid); @@ -546,7 +541,8 @@ void SavedTabGroupSyncBridge::SavedTabGroupRemovedLocally( const SavedTabGroup& removed_group) { base::ScopedClosureRunner scoped_write_batch_destroy_runner = - MaybeCreateScopedWriteBatch(/*commit_write_batch_on_destroy=*/true); + MaybeCreateScopedWriteBatch(/*commit_write_batch_on_destroy=*/true, + /*metadata_change_list=*/nullptr); CHECK(ongoing_write_batch_); // Intentionally only remove the group (creating orphaned tabs in the @@ -570,7 +566,8 @@ const base::Uuid& group_guid, const std::optional<base::Uuid>& tab_guid) { base::ScopedClosureRunner scoped_write_batch_destroy_runner = - MaybeCreateScopedWriteBatch(/*commit_write_batch_on_destroy=*/true); + MaybeCreateScopedWriteBatch(/*commit_write_batch_on_destroy=*/true, + /*metadata_change_list=*/nullptr); CHECK(ongoing_write_batch_); const SavedTabGroup* const group = model_wrapper_->GetGroup(group_guid); @@ -608,7 +605,8 @@ void SavedTabGroupSyncBridge::SavedTabGroupTabsReorderedLocally( const base::Uuid& group_guid) { base::ScopedClosureRunner scoped_write_batch_destroy_runner = - MaybeCreateScopedWriteBatch(/*commit_write_batch_on_destroy=*/true); + MaybeCreateScopedWriteBatch(/*commit_write_batch_on_destroy=*/true, + /*metadata_change_list=*/nullptr); CHECK(ongoing_write_batch_); const SavedTabGroup* const group = model_wrapper_->GetGroup(group_guid); @@ -626,7 +624,8 @@ void SavedTabGroupSyncBridge::SavedTabGroupLocalIdChanged( const base::Uuid& group_guid) { base::ScopedClosureRunner scoped_write_batch_destroy_runner = - MaybeCreateScopedWriteBatch(/*commit_write_batch_on_destroy=*/true); + MaybeCreateScopedWriteBatch(/*commit_write_batch_on_destroy=*/true, + /*metadata_change_list=*/nullptr); CHECK(ongoing_write_batch_); const SavedTabGroup* const group = model_wrapper_->GetGroup(group_guid); @@ -643,7 +642,8 @@ CHECK(group); base::ScopedClosureRunner scoped_write_batch_destroy_runner = - MaybeCreateScopedWriteBatch(/*commit_write_batch_on_destroy=*/true); + MaybeCreateScopedWriteBatch(/*commit_write_batch_on_destroy=*/true, + /*metadata_change_list=*/nullptr); CHECK(ongoing_write_batch_); proto::SavedTabGroupData data = SavedTabGroupToData(*group); ongoing_write_batch_->WriteData(data.specifics().guid(), @@ -652,7 +652,8 @@ void SavedTabGroupSyncBridge::SavedTabGroupReorderedLocally() { base::ScopedClosureRunner scoped_write_batch_destroy_runner = - MaybeCreateScopedWriteBatch(/*commit_write_batch_on_destroy=*/true); + MaybeCreateScopedWriteBatch(/*commit_write_batch_on_destroy=*/true, + /*metadata_change_list=*/nullptr); CHECK(ongoing_write_batch_); for (const SavedTabGroup* group : model_wrapper_->GetTabGroups()) { @@ -1024,8 +1025,8 @@ // write batch commit logic and hence should be committed explicitly. CHECK(!ongoing_write_batch_); base::ScopedClosureRunner scoped_write_batch_destroy_runner = - MaybeCreateScopedWriteBatch( - /*commit_write_batch_on_destroy=*/false); + MaybeCreateScopedWriteBatch(/*commit_write_batch_on_destroy=*/false, + /*metadata_change_list=*/nullptr); CHECK(ongoing_write_batch_); int parse_failure_count = 0; @@ -1168,16 +1169,22 @@ } base::ScopedClosureRunner SavedTabGroupSyncBridge::MaybeCreateScopedWriteBatch( - bool commit_write_batch_on_destroy) { + bool commit_write_batch_on_destroy, + std::unique_ptr<syncer::MetadataChangeList> metadata_change_list) { if (ongoing_write_batch_) { // There is an ongoing write batch, hence do not create a new one and do not // destroy the existing one in the current scope. + if (metadata_change_list) { + ongoing_write_batch_->TakeMetadataChangesFrom( + std::move(metadata_change_list)); + } return base::ScopedClosureRunner(base::DoNothing()); } // This is not a reentrant call, create a new write batch and return a scoped // closure runner that will destroy it when it goes out of scope. - ongoing_write_batch_ = store_->CreateWriteBatch(); + ongoing_write_batch_ = + store_->CreateWriteBatch(std::move(metadata_change_list)); return base::ScopedClosureRunner(base::BindOnce( &SavedTabGroupSyncBridge::DestroyOngoingWriteBatch, weak_ptr_factory_.GetWeakPtr(), commit_write_batch_on_destroy));
diff --git a/components/saved_tab_groups/internal/saved_tab_group_sync_bridge.h b/components/saved_tab_groups/internal/saved_tab_group_sync_bridge.h index 6353f6f..90118ef1 100644 --- a/components/saved_tab_groups/internal/saved_tab_group_sync_bridge.h +++ b/components/saved_tab_groups/internal/saved_tab_group_sync_bridge.h
@@ -228,9 +228,12 @@ // committed to the store when destroyed, and the caller is responsible for // committing it when needed by calling CommitOngoingWriteBatch(). // `commit_write_batch_on_destroy` has no impact if there is an ongoing write - // batch (i.e. this method is called reentrantly). + // batch (i.e. this method is called reentrantly). Data from the + // `metadata_change_list` is transferred to the ongoing write batch if + // provided. base::ScopedClosureRunner MaybeCreateScopedWriteBatch( - bool commit_write_batch_on_destroy); + bool commit_write_batch_on_destroy, + std::unique_ptr<syncer::MetadataChangeList> metadata_change_list); // Commits the ongoing write batch to the store. This method should only be // called after `MaybeCreateScopedWriteBatch()` and when the current scope is
diff --git a/components/saved_tab_groups/internal/shared_tab_group_account_data_sync_bridge.cc b/components/saved_tab_groups/internal/shared_tab_group_account_data_sync_bridge.cc index 07cf9314..c0316cb 100644 --- a/components/saved_tab_groups/internal/shared_tab_group_account_data_sync_bridge.cc +++ b/components/saved_tab_groups/internal/shared_tab_group_account_data_sync_bridge.cc
@@ -163,7 +163,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); std::unique_ptr<syncer::DataTypeStore::WriteBatch> batch = - store_->CreateWriteBatch(); + store_->CreateWriteBatch(std::move(metadata_change_list)); for (const std::unique_ptr<syncer::EntityChange>& change : entity_change_list) { @@ -200,7 +200,6 @@ } } - batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); store_->CommitWriteBatch( std::move(batch), base::BindOnce(
diff --git a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.cc b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.cc index f9e2a9a..64d6c65 100644 --- a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.cc +++ b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.cc
@@ -606,7 +606,8 @@ CHECK(!ongoing_write_batch_); base::ScopedClosureRunner write_batch_scoped_destroy_closure = CreateWriteBatchWithDestroyClosure( - /*store_write_batch_on_destroy=*/false); + /*store_write_batch_on_destroy=*/false, + std::move(metadata_change_list)); CHECK(ongoing_write_batch_); std::vector<std::unique_ptr<syncer::EntityChange>> delete_changes; @@ -625,7 +626,8 @@ if (std::optional<syncer::ModelError> error = AddGroupToLocalStorage( change->data().specifics.shared_tab_group_data(), change->data().collaboration_metadata.value(), - change->data().creation_time, metadata_change_list.get(), + change->data().creation_time, + ongoing_write_batch_->GetMetadataChangeList(), *ongoing_write_batch_)) { return error; } @@ -680,8 +682,8 @@ for (const std::unique_ptr<syncer::EntityChange>& change : tab_updates) { if (std::optional<syncer::ModelError> error = ApplyRemoteTabUpdate( change->data().specifics.shared_tab_group_data(), - metadata_change_list.get(), *ongoing_write_batch_, - tab_ids_with_pending_model_update, + ongoing_write_batch_->GetMetadataChangeList(), + *ongoing_write_batch_, tab_ids_with_pending_model_update, change->data().collaboration_metadata.value(), change->data().creation_time, change->data().modification_time)) { return error; @@ -694,14 +696,11 @@ // Note that ResolveTabsMissingGroups() must be called after all the tab // updates are applied to the model to correctly handle unique positions. - if (std::optional<syncer::ModelError> error = - ResolveTabsMissingGroups(*metadata_change_list)) { + if (std::optional<syncer::ModelError> error = ResolveTabsMissingGroups( + *ongoing_write_batch_->GetMetadataChangeList())) { return error; } - ongoing_write_batch_->TakeMetadataChangesFrom( - std::move(metadata_change_list)); - // Successfully applied all the changes. Explicitly destroy the write batch // and store data to the store. DestroyOngoingWriteBatch(/*store_write_batch_on_destroy=*/true); @@ -951,7 +950,8 @@ CHECK(group->is_shared_tab_group()); base::ScopedClosureRunner write_batch_scoped_destroy_closure = - CreateWriteBatchWithDestroyClosure(/*store_write_batch_on_destroy=*/true); + CreateWriteBatchWithDestroyClosure(/*store_write_batch_on_destroy=*/true, + /*metadata_change_list=*/nullptr); CHECK(ongoing_write_batch_); CHECK(group->collaboration_id().has_value()); @@ -1011,7 +1011,8 @@ CHECK(group->is_shared_tab_group()); base::ScopedClosureRunner write_batch_scoped_destroy_closure = - CreateWriteBatchWithDestroyClosure(/*store_write_batch_on_destroy=*/true); + CreateWriteBatchWithDestroyClosure(/*store_write_batch_on_destroy=*/true, + /*metadata_change_list=*/nullptr); CHECK(ongoing_write_batch_); if (tab_guid.has_value()) { // The tab has been updated, added or removed. @@ -1044,7 +1045,8 @@ CHECK(removed_group.is_shared_tab_group()); base::ScopedClosureRunner write_batch_scoped_destroy_closure = - CreateWriteBatchWithDestroyClosure(/*store_write_batch_on_destroy=*/true); + CreateWriteBatchWithDestroyClosure(/*store_write_batch_on_destroy=*/true, + /*metadata_change_list=*/nullptr); CHECK(ongoing_write_batch_); RemoveEntitySpecifics(removed_group.saved_guid(), *ongoing_write_batch_); @@ -1065,7 +1067,8 @@ } base::ScopedClosureRunner write_batch_scoped_destroy_closure = - CreateWriteBatchWithDestroyClosure(/*store_write_batch_on_destroy=*/true); + CreateWriteBatchWithDestroyClosure(/*store_write_batch_on_destroy=*/true, + /*metadata_change_list=*/nullptr); CHECK(ongoing_write_batch_); const SavedTabGroup* const group = model_wrapper_->GetGroup(group_guid); @@ -1078,7 +1081,8 @@ void SharedTabGroupDataSyncBridge::UntrackEntitiesForCollaboration( const syncer::CollaborationId& collaboration_id) { base::ScopedClosureRunner write_batch_scoped_destroy_closure = - CreateWriteBatchWithDestroyClosure(/*store_write_batch_on_destroy=*/true); + CreateWriteBatchWithDestroyClosure(/*store_write_batch_on_destroy=*/true, + /*metadata_change_list=*/nullptr); CHECK(ongoing_write_batch_); for (const SavedTabGroup* group : model_wrapper_->GetTabGroups()) { @@ -1176,7 +1180,8 @@ FixLocalTabGroupIDsForSharedGroupsDuringFeatureEnabling( std::vector<proto::SharedTabGroupData>& stored_entries) { base::ScopedClosureRunner write_batch_scoped_destroy_closure = - CreateWriteBatchWithDestroyClosure(/*store_write_batch_on_destroy=*/true); + CreateWriteBatchWithDestroyClosure(/*store_write_batch_on_destroy=*/true, + /*metadata_change_list=*/nullptr); CHECK(ongoing_write_batch_); for (proto::SharedTabGroupData& proto : stored_entries) { @@ -1523,16 +1528,23 @@ base::ScopedClosureRunner SharedTabGroupDataSyncBridge::CreateWriteBatchWithDestroyClosure( - bool store_write_batch_on_destroy) { + bool store_write_batch_on_destroy, + std::unique_ptr<syncer::MetadataChangeList> metadata_change_list) { if (ongoing_write_batch_) { // There is an ongoing write batch, hence do not create a new one and do not // destroy the existing one in the current scope. + + if (metadata_change_list) { + ongoing_write_batch_->TakeMetadataChangesFrom( + std::move(metadata_change_list)); + } return base::ScopedClosureRunner(base::DoNothing()); } // This is not a reentrant call, create a new write batch and return a scoped // closure runner that will destroy it when it goes out of scope. - ongoing_write_batch_ = store_->CreateWriteBatch(); + ongoing_write_batch_ = + store_->CreateWriteBatch(std::move(metadata_change_list)); return base::ScopedClosureRunner(base::BindOnce( &SharedTabGroupDataSyncBridge::DestroyOngoingWriteBatch, weak_ptr_factory_.GetWeakPtr(), store_write_batch_on_destroy));
diff --git a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.h b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.h index 52331a2..781077f 100644 --- a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.h +++ b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.h
@@ -189,9 +189,11 @@ // When `store_write_batch_on_destroy` is false, the write batch is not // committed to the store when destroyed, and the caller is responsible for // committing it when needed. `store_write_batch_on_destroy` has no impact if - // there is an ongoing write batch. + // there is an ongoing write batch. Data from the `metadata_change_list` is + // transferred to the ongoing write batch if provided. base::ScopedClosureRunner CreateWriteBatchWithDestroyClosure( - bool store_write_batch_on_destroy); + bool store_write_batch_on_destroy, + std::unique_ptr<syncer::MetadataChangeList> metadata_change_list); // Destroys the ongoing write batch and commits it to the store if // `store_write_batch_on_destroy` is true.
diff --git a/components/segmentation_platform/embedder/input_delegate/tab_rank_dispatcher_unittest.cc b/components/segmentation_platform/embedder/input_delegate/tab_rank_dispatcher_unittest.cc index 442d974..eded32d5 100644 --- a/components/segmentation_platform/embedder/input_delegate/tab_rank_dispatcher_unittest.cc +++ b/components/segmentation_platform/embedder/input_delegate/tab_rank_dispatcher_unittest.cc
@@ -19,6 +19,7 @@ #include "components/segmentation_platform/public/trigger.h" #include "components/sessions/core/session_id.h" #include "components/sessions/core/session_types.h" +#include "components/sync_sessions/mock_open_tabs_ui_delegate.h" #include "components/sync_sessions/mock_session_sync_service.h" #include "components/sync_sessions/synced_session.h" #include "testing/gmock/include/gmock/gmock.h" @@ -60,7 +61,7 @@ return session->windows.begin()->second->wrapped_window.tabs[0].get(); } -class MockOpenTabsUIDelegate : public sync_sessions::OpenTabsUIDelegate { +class MockOpenTabsUIDelegate : public sync_sessions::MockOpenTabsUIDelegate { public: MockOpenTabsUIDelegate() { local_session_ = @@ -78,6 +79,8 @@ GetTab(foreign_sessions_owned_.back().get()); } + ~MockOpenTabsUIDelegate() override = default; + bool GetAllForeignSessions( std::vector<raw_ptr<const sync_sessions::SyncedSession, VectorExperimental>>* sessions) override { @@ -116,16 +119,6 @@ return true; } - MOCK_METHOD1(DeleteForeignSession, void(const std::string& tag)); - - MOCK_METHOD1( - GetForeignSession, - std::vector<const sessions::SessionWindow*>(const std::string& tag)); - - MOCK_METHOD2(GetForeignSessionTabs, - bool(const std::string& tag, - std::vector<const sessions::SessionTab*>* tabs)); - private: std::vector<std::unique_ptr<sync_sessions::SyncedSession>> foreign_sessions_owned_;
diff --git a/components/segmentation_platform/embedder/input_delegate/tab_session_source_unittest.cc b/components/segmentation_platform/embedder/input_delegate/tab_session_source_unittest.cc index 2ac113d..0a7d766 100644 --- a/components/segmentation_platform/embedder/input_delegate/tab_session_source_unittest.cc +++ b/components/segmentation_platform/embedder/input_delegate/tab_session_source_unittest.cc
@@ -17,6 +17,7 @@ #include "components/segmentation_platform/internal/metadata/metadata_writer.h" #include "components/segmentation_platform/public/input_context.h" #include "components/sessions/core/session_id.h" +#include "components/sync_sessions/mock_open_tabs_ui_delegate.h" #include "components/sync_sessions/mock_session_sync_service.h" #include "components/sync_sessions/open_tabs_ui_delegate.h" #include "components/sync_sessions/synced_session.h" @@ -52,7 +53,7 @@ return session; } -class MockOpenTabsUIDelegate : public sync_sessions::OpenTabsUIDelegate { +class MockOpenTabsUIDelegate : public sync_sessions::MockOpenTabsUIDelegate { public: MockOpenTabsUIDelegate() { local_session_ = @@ -65,6 +66,8 @@ foreign_sessions_.push_back(foreign_sessions_owned_.back().get()); } + ~MockOpenTabsUIDelegate() override = default; + bool GetAllForeignSessions( std::vector<raw_ptr<const sync_sessions::SyncedSession, VectorExperimental>>* sessions) override { @@ -94,21 +97,6 @@ return *local_session != nullptr; } - MOCK_METHOD3(GetForeignTab, - bool(const std::string& tag, - const SessionID tab_id, - const sessions::SessionTab** tab)); - - MOCK_METHOD1(DeleteForeignSession, void(const std::string& tag)); - - MOCK_METHOD1( - GetForeignSession, - std::vector<const sessions::SessionWindow*>(const std::string& tag)); - - MOCK_METHOD2(GetForeignSessionTabs, - bool(const std::string& tag, - std::vector<const sessions::SessionTab*>* tabs)); - private: std::vector<std::unique_ptr<sync_sessions::SyncedSession>> foreign_sessions_owned_; @@ -178,16 +166,22 @@ }; TEST_F(TabSessionSourceTest, Bucketize) { - EXPECT_NEAR(TabSessionSource::BucketizeExp(0, /*max_buckets*/50), 0, 0.01); - EXPECT_NEAR(TabSessionSource::BucketizeLinear(0, /*max_buckets*/10), 0, 0.01); - EXPECT_NEAR(TabSessionSource::BucketizeExp(1, /*max_buckets*/50), 1, 0.01); - EXPECT_NEAR(TabSessionSource::BucketizeLinear(1, /*max_buckets*/10), 1, 0.01); - EXPECT_NEAR(TabSessionSource::BucketizeExp(5, /*max_buckets*/50), 4, 0.01); - EXPECT_NEAR(TabSessionSource::BucketizeLinear(5, /*max_buckets*/10), 5, 0.01); - EXPECT_NEAR(TabSessionSource::BucketizeExp(10, /*max_buckets*/50), 8, 0.01); - EXPECT_NEAR(TabSessionSource::BucketizeLinear(10, /*max_buckets*/10), 10, 0.01); - EXPECT_NEAR(TabSessionSource::BucketizeExp(pow(2, 60), /*max_buckets*/50), pow(2, 50), 0.01); - EXPECT_NEAR(TabSessionSource::BucketizeLinear(16, /*max_buckets*/10), 10, 0.01); + EXPECT_NEAR(TabSessionSource::BucketizeExp(0, /*max_buckets*/ 50), 0, 0.01); + EXPECT_NEAR(TabSessionSource::BucketizeLinear(0, /*max_buckets*/ 10), 0, + 0.01); + EXPECT_NEAR(TabSessionSource::BucketizeExp(1, /*max_buckets*/ 50), 1, 0.01); + EXPECT_NEAR(TabSessionSource::BucketizeLinear(1, /*max_buckets*/ 10), 1, + 0.01); + EXPECT_NEAR(TabSessionSource::BucketizeExp(5, /*max_buckets*/ 50), 4, 0.01); + EXPECT_NEAR(TabSessionSource::BucketizeLinear(5, /*max_buckets*/ 10), 5, + 0.01); + EXPECT_NEAR(TabSessionSource::BucketizeExp(10, /*max_buckets*/ 50), 8, 0.01); + EXPECT_NEAR(TabSessionSource::BucketizeLinear(10, /*max_buckets*/ 10), 10, + 0.01); + EXPECT_NEAR(TabSessionSource::BucketizeExp(pow(2, 60), /*max_buckets*/ 50), + pow(2, 50), 0.01); + EXPECT_NEAR(TabSessionSource::BucketizeLinear(16, /*max_buckets*/ 10), 10, + 0.01); } TEST_F(TabSessionSourceTest, ProcessLocal) {
diff --git a/components/segmentation_platform/internal/android/segmentation_platform_service_android.cc b/components/segmentation_platform/internal/android/segmentation_platform_service_android.cc index a54c68a..c3c2908 100644 --- a/components/segmentation_platform/internal/android/segmentation_platform_service_android.cc +++ b/components/segmentation_platform/internal/android/segmentation_platform_service_android.cc
@@ -89,7 +89,7 @@ : segmentation_platform_service_(segmentation_platform_service) { DCHECK(segmentation_platform_service_); JNIEnv* env = base::android::AttachCurrentThread(); - java_obj_.Reset(env, JSegmentationPlatformServiceImplJni::create( + java_obj_.Reset(env, SegmentationPlatformServiceImplJni::create( env, reinterpret_cast<int64_t>(this))); }
diff --git a/components/send_tab_to_self/send_tab_to_self_bridge.cc b/components/send_tab_to_self/send_tab_to_self_bridge.cc index 8716408..5fa9581 100644 --- a/components/send_tab_to_self/send_tab_to_self_bridge.cc +++ b/components/send_tab_to_self/send_tab_to_self_bridge.cc
@@ -184,7 +184,8 @@ // opened. std::vector<const SendTabToSelfEntry*> opened; std::vector<std::string> removed; - std::unique_ptr<DataTypeStore::WriteBatch> batch = store_->CreateWriteBatch(); + std::unique_ptr<DataTypeStore::WriteBatch> batch = + store_->CreateWriteBatch(std::move(metadata_change_list)); for (const std::unique_ptr<syncer::EntityChange>& change : entity_changes) { const std::string& guid = change->storage_key(); @@ -241,7 +242,6 @@ } } - batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); Commit(std::move(batch)); NotifyRemoteSendTabToSelfEntryDeleted(removed);
diff --git a/components/skills/internal/skills_downloader_unittest.cc b/components/skills/internal/skills_downloader_unittest.cc index dca01bd..7215ca0 100644 --- a/components/skills/internal/skills_downloader_unittest.cc +++ b/components/skills/internal/skills_downloader_unittest.cc
@@ -30,6 +30,7 @@ skill->set_category("Test Category"); skill->set_prompt("Test prompt."); skill->set_id("test-id"); + skill->set_image_url("https://example.com/some-image.png"); return skills_list.SerializeAsString(); } @@ -90,6 +91,7 @@ auto it = result_map->find("test-id"); ASSERT_NE(it, result_map->end()); EXPECT_EQ(it->second.name(), "/test-skill"); + EXPECT_EQ(it->second.image_url(), "https://example.com/some-image.png"); histogram_tester_.ExpectUniqueSample( "Skills.Downloader.FirstParty.FetchResult", SkillsFetchResult::kSuccess,
diff --git a/components/skills/internal/skills_service_impl.cc b/components/skills/internal/skills_service_impl.cc index 24941b2..ea9acc51 100644 --- a/components/skills/internal/skills_service_impl.cc +++ b/components/skills/internal/skills_service_impl.cc
@@ -289,6 +289,7 @@ for (const auto& [id, proto_skill] : first_party_skills_map_) { Skill skill(id, proto_skill.name(), proto_skill.icon(), proto_skill.prompt(), proto_skill.description(), + GURL(proto_skill.image_url()), sync_pb::SkillSource::SKILL_SOURCE_FIRST_PARTY); first_party_skill_objects_map_.insert({id, std::move(skill)}); }
diff --git a/components/skills/internal/skills_sync_bridge.cc b/components/skills/internal/skills_sync_bridge.cc index 66e6de6..54ce2fd 100644 --- a/components/skills/internal/skills_sync_bridge.cc +++ b/components/skills/internal/skills_sync_bridge.cc
@@ -148,8 +148,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); std::unique_ptr<syncer::DataTypeStore::WriteBatch> write_batch = - store_->CreateWriteBatch(); - write_batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); + store_->CreateWriteBatch(std::move(metadata_change_list)); for (const std::unique_ptr<syncer::EntityChange>& entity_change : entity_changes) {
diff --git a/components/skills/proto/skill.proto b/components/skills/proto/skill.proto index c4640b0..83719d0 100644 --- a/components/skills/proto/skill.proto +++ b/components/skills/proto/skill.proto
@@ -27,6 +27,11 @@ // A user-facing short description of the Skill. optional string description = 6; + + // The image to use when rendering this Skill. The number here should match + // exactly with the proto defined in + // google3/chrome/breve/cacao/boq/skills/config/skill.proto. + optional string image_url = 8; } // Contains a list of Skills received from the server.
diff --git a/components/skills/public/BUILD.gn b/components/skills/public/BUILD.gn index 801b548..4de3b67 100644 --- a/components/skills/public/BUILD.gn +++ b/components/skills/public/BUILD.gn
@@ -22,7 +22,10 @@ traits_public_deps = [ ":skill" ] }, ] - public_deps = [ "//mojo/public/mojom/base" ] + public_deps = [ + "//mojo/public/mojom/base", + "//url/mojom:url_mojom_gurl", + ] } source_set("skill") { @@ -33,6 +36,7 @@ public_deps = [ "//base", "//components/sync/protocol", + "//url", ] }
diff --git a/components/skills/public/skill.cc b/components/skills/public/skill.cc index ef589c3..752343dc 100644 --- a/components/skills/public/skill.cc +++ b/components/skills/public/skill.cc
@@ -13,12 +13,14 @@ const std::string& icon, const std::string& prompt, const std::string& description, + const GURL& image_url, const sync_pb::SkillSource& source) : id(id), name(name), icon(icon), prompt(prompt), description(description), + image_url(image_url), source(source) {} Skill::Skill(const Skill&) = default;
diff --git a/components/skills/public/skill.h b/components/skills/public/skill.h index 41705ea..aa983bf4 100644 --- a/components/skills/public/skill.h +++ b/components/skills/public/skill.h
@@ -9,6 +9,7 @@ #include "base/time/time.h" #include "components/sync/protocol/skill_specifics.pb.h" +#include "url/gurl.h" namespace skills { @@ -34,6 +35,9 @@ // The description of the skill. std::string description; + // The image URL associated with the skill. + GURL image_url; + // The source of the skill which can be 1P or user created. sync_pb::SkillSource source = sync_pb::SkillSource::SKILL_SOURCE_USER_CREATED; @@ -49,6 +53,7 @@ const std::string& icon, const std::string& prompt, const std::string& description = "", + const GURL& image_url = GURL(), const sync_pb::SkillSource& source = sync_pb::SkillSource::SKILL_SOURCE_USER_CREATED); Skill(const Skill&);
diff --git a/components/skills/public/skill.mojom b/components/skills/public/skill.mojom index c7aa984a..04eb8e8 100644 --- a/components/skills/public/skill.mojom +++ b/components/skills/public/skill.mojom
@@ -5,6 +5,7 @@ module skills.mojom; import "mojo/public/mojom/base/time.mojom"; +import "url/mojom/url.mojom"; // LINT.IfChange(SkillSource) enum SkillSource { @@ -48,6 +49,9 @@ // The description of the skill. string description; + // The image URL for the skill. + url.mojom.Url? image_url; + // The Time when the skill was created. mojo_base.mojom.Time creation_time;
diff --git a/components/skills/public/skills_mojom_traits.cc b/components/skills/public/skills_mojom_traits.cc index 8a76305..efe52432 100644 --- a/components/skills/public/skills_mojom_traits.cc +++ b/components/skills/public/skills_mojom_traits.cc
@@ -6,6 +6,7 @@ #include "base/uuid.h" #include "mojo/public/cpp/base/time_mojom_traits.h" +#include "url/mojom/url_gurl_mojom_traits.h" namespace mojo { @@ -14,14 +15,17 @@ skills::mojom::SkillDataView data, skills::Skill* out) { std::optional<std::string> source_skill_id; + std::optional<GURL> image_url; if (!data.ReadId(&out->id) || !data.ReadName(&out->name) || !data.ReadIcon(&out->icon) || !data.ReadSourceSkillId(&source_skill_id) || !data.ReadPrompt(&out->prompt) || !data.ReadSource(&out->source) || !data.ReadDescription(&out->description) || + !data.ReadImageUrl(&image_url) || !data.ReadCreationTime(&out->creation_time) || !data.ReadLastUpdateTime(&out->last_update_time)) { return false; } + out->image_url = image_url.value_or(GURL()); const bool is_derived_from_first_party = out->source ==
diff --git a/components/skills/public/skills_mojom_traits.h b/components/skills/public/skills_mojom_traits.h index c80f254..af6e4a4c 100644 --- a/components/skills/public/skills_mojom_traits.h +++ b/components/skills/public/skills_mojom_traits.h
@@ -5,11 +5,14 @@ #ifndef COMPONENTS_SKILLS_PUBLIC_SKILLS_MOJOM_TRAITS_H_ #define COMPONENTS_SKILLS_PUBLIC_SKILLS_MOJOM_TRAITS_H_ +#include <optional> + #include "base/notreached.h" #include "components/skills/public/skill.h" #include "components/skills/public/skill.mojom-shared.h" #include "components/sync/protocol/skill_specifics.pb.h" #include "mojo/public/cpp/bindings/struct_traits.h" +#include "url/gurl.h" namespace mojo { @@ -70,6 +73,12 @@ static const std::string& description(const skills::Skill& skill) { return skill.description; } + static std::optional<GURL> image_url(const skills::Skill& skill) { + if (skill.image_url.is_empty()) { + return std::nullopt; + } + return skill.image_url; + } static base::Time creation_time(const skills::Skill& skill) { return skill.creation_time; }
diff --git a/components/spellcheck/renderer/spellcheck.cc b/components/spellcheck/renderer/spellcheck.cc index e138d45a..afc1862 100644 --- a/components/spellcheck/renderer/spellcheck.cc +++ b/components/spellcheck/renderer/spellcheck.cc
@@ -33,6 +33,7 @@ #include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_frame_visitor.h" #include "content/public/renderer/render_thread.h" +#include "third_party/blink/public/platform/web_runtime_features.h" #include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_text_check_client.h" @@ -212,11 +213,24 @@ content::RenderFrame::ForEach(&updater); } +void SpellCheck::SpellCheckCustomDictionaryChanged( + const std::vector<std::string>& words_added, + const std::vector<std::string>& words_removed) { + if (blink::WebRuntimeFeatures::IsSpellCheckCustomDictionaryAPIEnabled()) { + const std::set<std::string> added(words_added.begin(), words_added.end()); + NotifyDictionaryObservers(ConvertToWebStringFromUtf8(added)); + // Add or remove the word in the spell checker custom dictionary + (*languages_.begin()) + ->SpellCheckCustomDictionaryChanged(words_added, words_removed); + } +} + void SpellCheck::CustomDictionaryChanged( const std::vector<std::string>& words_added, const std::vector<std::string>& words_removed) { const std::set<std::string> added(words_added.begin(), words_added.end()); NotifyDictionaryObservers(ConvertToWebStringFromUtf8(added)); + // Add or remove the word in the browser's custom dictionary custom_dictionary_.OnCustomDictionaryChanged( added, std::set<std::string>(words_removed.begin(), words_removed.end())); }
diff --git a/components/spellcheck/renderer/spellcheck.h b/components/spellcheck/renderer/spellcheck.h index 11abab6..7b3d74b 100644 --- a/components/spellcheck/renderer/spellcheck.h +++ b/components/spellcheck/renderer/spellcheck.h
@@ -152,6 +152,10 @@ bool IsSpellcheckEnabled(); + void SpellCheckCustomDictionaryChanged( + const std::vector<std::string>& words_added, + const std::vector<std::string>& words_removed); + // Add observer on dictionary update event. void AddDictionaryUpdateObserver(DictionaryUpdateObserver* observer); // Remove observer on dictionary update event.
diff --git a/components/spellcheck/renderer/spellcheck_language.cc b/components/spellcheck/renderer/spellcheck_language.cc index 6bec80d..07a004c0 100644 --- a/components/spellcheck/renderer/spellcheck_language.cc +++ b/components/spellcheck/renderer/spellcheck_language.cc
@@ -10,6 +10,7 @@ #include "base/logging.h" #include "components/spellcheck/renderer/spellcheck_worditerator.h" #include "components/spellcheck/renderer/spelling_engine.h" +#include "third_party/blink/public/platform/web_runtime_features.h" SpellcheckLanguage::SpellcheckLanguage( service_manager::LocalInterfaceProvider* embedder_provider) @@ -89,6 +90,12 @@ continue; } + if (blink::WebRuntimeFeatures::IsSpellCheckCustomDictionaryAPIEnabled() && + local_dictionary_engine_.SpellCheckWord(word, word_start, + word_length)) { + continue; + } + // If the given word is a concatenated word of two or more valid words // (e.g. "hello:hello"), we should treat it as a valid word. if (IsValidContraction(word, host)) { @@ -150,6 +157,17 @@ return platform_spelling_engine_->IsEnabled(); } +void SpellcheckLanguage::SpellCheckCustomDictionaryChanged( + const std::vector<std::string>& words_added, + const std::vector<std::string>& words_removed) { + if (blink::WebRuntimeFeatures::IsSpellCheckCustomDictionaryAPIEnabled()) { + const std::set<std::string> added(words_added.begin(), words_added.end()); + local_dictionary_engine_.OnCustomDictionaryChanged( + added, + std::set<std::string>(words_removed.begin(), words_removed.end())); + } +} + bool SpellcheckLanguage::IsTextInSameScript(const std::u16string& text) const { return character_attributes_.IsTextInSameScript(text); }
diff --git a/components/spellcheck/renderer/spellcheck_language.h b/components/spellcheck/renderer/spellcheck_language.h index 67ee7e1..05d92f47 100644 --- a/components/spellcheck/renderer/spellcheck_language.h +++ b/components/spellcheck/renderer/spellcheck_language.h
@@ -11,6 +11,7 @@ #include <vector> #include "base/files/file.h" +#include "components/spellcheck/renderer/custom_dictionary_engine.h" #include "components/spellcheck/renderer/spellcheck_worditerator.h" namespace service_manager { @@ -73,6 +74,9 @@ size_t* skip_or_misspelling_len, std::vector<std::u16string>* optional_suggestions); + void SpellCheckCustomDictionaryChanged( + const std::vector<std::string>& words_added, + const std::vector<std::string>& words_removed); // Initialize |spellcheck_| if that hasn't happened yet. bool InitializeIfNeeded(); @@ -107,6 +111,9 @@ // Pointer to a platform-specific spelling engine, if it is in use. This // should only be set if hunspell is not used. (I.e. on OSX, for now) std::unique_ptr<SpellingEngine> platform_spelling_engine_; + + // Local dictionary spelling engine from renderer side + CustomDictionaryEngine local_dictionary_engine_; }; #endif // COMPONENTS_SPELLCHECK_RENDERER_SPELLCHECK_LANGUAGE_H_
diff --git a/components/spellcheck/renderer/spellcheck_multilingual_unittest.cc b/components/spellcheck/renderer/spellcheck_multilingual_unittest.cc index 90d156b..ba1754a 100644 --- a/components/spellcheck/renderer/spellcheck_multilingual_unittest.cc +++ b/components/spellcheck/renderer/spellcheck_multilingual_unittest.cc
@@ -24,6 +24,7 @@ #include "components/spellcheck/renderer/spellcheck.h" #include "components/spellcheck/renderer/spellcheck_provider_test.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/platform/web_runtime_features.h" #include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/public/web/web_text_checking_result.h" @@ -80,11 +81,9 @@ TestingSpellCheckProvider* provider() { return provider_.get(); } protected: - void ExpectSpellCheckWordResults( + void CheckSpellCheckWordResults( const std::string& languages, base::span<const SpellcheckTestCase> test_cases) { - ReinitializeSpellCheck(languages); - for (size_t i = 0; i < test_cases.size(); ++i) { size_t misspelling_start = 0; size_t misspelling_length = 0; @@ -102,6 +101,13 @@ } } + void ExpectSpellCheckWordResults( + const std::string& languages, + base::span<const SpellcheckTestCase> test_cases) { + ReinitializeSpellCheck(languages); + CheckSpellCheckWordResults(languages, test_cases); + } + void ExpectSpellCheckParagraphResults( const std::u16string& input, const std::vector<SpellCheckResult>& expected) { @@ -189,6 +195,75 @@ ExpectSpellCheckWordResults("en-US,es-ES", kTestCases); } +TEST_F(MultilingualSpellCheckTest, + MultilingualSpellCheckCustomDictionarySpellCheckWord) { + blink::WebRuntimeFeatures::EnableFeatureFromString( + "SpellCheckCustomDictionaryAPI", true); + static const SpellcheckTestCase kTestCases[] = { + // An Pokemon name. + {L"Pikachu destruyan", 0, 7}, + // A misspelled Spanish word. + {L"hello destruynn", 6, 9}, + }; + // ReinitializeSpellCheck. + ExpectSpellCheckWordResults("en-US,es-ES", kTestCases); + + // Insert the Pokemon name & misspelled word to SpellCheckDictionary. + + // Insert the Pokemon name and the misspelled Spanish word to + // SpellCheckDictionary. + static_cast<blink::WebTextCheckClient*>(provider()) + ->SpellCheckCustomDictionaryChanged({"Pikachu", "destruynn"}, {}); + static const SpellcheckTestCase kNewTestCases1[] = { + // An Pokemon name. + {L"Pikachu destruyan", 0, 0}, + // A misspelled Spanish word. + {L"hello destruynn", 0, 0}, + }; + // Use the same SpellCheck instance. + CheckSpellCheckWordResults("en-US,es-ES", kNewTestCases1); + + // Remove the the misspelled Spanish word from SpellCheckDictionary. + static_cast<blink::WebTextCheckClient*>(provider()) + ->SpellCheckCustomDictionaryChanged({}, {"destruynn"}); + static const SpellcheckTestCase kNewTestCases2[] = { + // An Pokemon name. + {L"Pikachu destruyan", 0, 0}, + // A misspelled Spanish word. + {L"hello destruynn", 6, 9}, + }; + CheckSpellCheckWordResults("en-US,es-ES", kNewTestCases2); +} + +// Word added to the SpellCheckDictionary applies for all languages. +TEST_F(MultilingualSpellCheckTest, + SpellCheckCustomDictionarySpellCheckWordRegardlessLang) { + blink::WebRuntimeFeatures::EnableFeatureFromString( + "SpellCheckCustomDictionaryAPI", true); + + static const SpellcheckTestCase kTestCases[] = { + // A Pokemon name in English. + {L"Pikachu hola", 0, 7}, + // A Pokemon name in Spanish. + {L"hello Pikachu", 6, 7}, + }; + // ReinitializeSpellCheck. + ExpectSpellCheckWordResults("en-US,es-ES", kTestCases); + + // Insert the misspelled words to SpellCheckDictionary. + static_cast<blink::WebTextCheckClient*>(provider()) + ->SpellCheckCustomDictionaryChanged({"Pikachu"}, {}); + + static const SpellcheckTestCase kNewTestCases[] = { + // A Pokemon name in English. + {L"Pikachu hola", 0, 0}, + // A Pokemon name in Spanish. + {L"hello Pikachu", 0, 0}, + }; + // Use the same SpellCheck instance - no initialization here. + CheckSpellCheckWordResults("en-US,es-ES", kNewTestCases); +} + // If there are no spellcheck languages, no text should be marked as misspelled. TEST_F(MultilingualSpellCheckTest, MultilingualSpellCheckParagraphBlank) { ReinitializeSpellCheck(std::string()); @@ -221,6 +296,46 @@ u"rocket Schwarzkommando destruyan pcnyhon", expected); } +TEST_F(MultilingualSpellCheckTest, + MultilingualCustomDictionarySpellCheckParagraph) { + blink::WebRuntimeFeatures::EnableFeatureFromString( + "SpellCheckCustomDictionaryAPI", true); + + ReinitializeSpellCheck("en-US,es-ES"); + std::vector<SpellCheckResult> expected; + expected.emplace_back(spellcheck::Decoration::SPELLING, 7, 15); + expected.emplace_back(spellcheck::Decoration::SPELLING, 33, 7); + + ExpectSpellCheckParagraphResults( + // English, German, Spanish, and a misspelled word. + u"rocket Schwarzkommando destruyan pcnyhon", expected); + + // Insert one of the misspelled word to SpellCheckDictionary. + static_cast<blink::WebTextCheckClient*>(provider()) + ->SpellCheckCustomDictionaryChanged({"Schwarzkommando"}, {}); + std::vector<SpellCheckResult> expected1; + expected1.emplace_back(spellcheck::Decoration::SPELLING, 33, 7); + ExpectSpellCheckParagraphResults( + // English, German, Spanish, and a misspelled word. + u"rocket Schwarzkommando destruyan pcnyhon", expected1); + + // Remove the inserted word from the SpellCheckDictionary. + static_cast<blink::WebTextCheckClient*>(provider()) + ->SpellCheckCustomDictionaryChanged({}, {"Schwarzkommando"}); + ExpectSpellCheckParagraphResults( + // English, German, Spanish, and a misspelled word. + u"rocket Schwarzkommando destruyan pcnyhon", expected); + + // Insert all the misspelled word to SpellCheckDictionary. + static_cast<blink::WebTextCheckClient*>(provider()) + ->SpellCheckCustomDictionaryChanged({"Schwarzkommando", "pcnyhon"}, {}); + + ExpectSpellCheckParagraphResults( + // English, German, and Spanish words, all spelled correctly. + u"rocket Schwarzkommando destruyan pcnyhon", + std::vector<SpellCheckResult>()); +} + // Ensure that suggestions are handled properly for multiple languages. TEST_F(MultilingualSpellCheckTest, MultilingualSpellCheckSuggestions) { ReinitializeSpellCheck("en-US,es-ES");
diff --git a/components/spellcheck/renderer/spellcheck_provider.cc b/components/spellcheck/renderer/spellcheck_provider.cc index d7d8ca8..3f39573 100644 --- a/components/spellcheck/renderer/spellcheck_provider.cc +++ b/components/spellcheck/renderer/spellcheck_provider.cc
@@ -339,6 +339,12 @@ base::saturated_cast<int>(text.length())); } +void SpellCheckProvider::SpellCheckCustomDictionaryChanged( + const std::vector<std::string>& words_added, + const std::vector<std::string>& words_removed) { + spellcheck_->SpellCheckCustomDictionaryChanged(words_added, words_removed); +} + #if BUILDFLAG(USE_RENDERER_SPELLCHECKER) void SpellCheckProvider::OnRespondSpellingService( int identifier,
diff --git a/components/spellcheck/renderer/spellcheck_provider.h b/components/spellcheck/renderer/spellcheck_provider.h index d8971f0a..3b683367 100644 --- a/components/spellcheck/renderer/spellcheck_provider.h +++ b/components/spellcheck/renderer/spellcheck_provider.h
@@ -125,6 +125,10 @@ should_force_refresh, std::unique_ptr<blink::WebTextCheckingCompletion> completion) override; + void SpellCheckCustomDictionaryChanged( + const std::vector<std::string>& words_added, + const std::vector<std::string>& words_removed) override; + #if BUILDFLAG(USE_RENDERER_SPELLCHECKER) void OnRespondSpellingService(int identifier, const std::u16string& text,
diff --git a/components/spellcheck/renderer/spellcheck_provider_test.cc b/components/spellcheck/renderer/spellcheck_provider_test.cc index 0676134..465c050d 100644 --- a/components/spellcheck/renderer/spellcheck_provider_test.cc +++ b/components/spellcheck/renderer/spellcheck_provider_test.cc
@@ -95,6 +95,12 @@ } #endif // BUILDFLAG(IS_WIN) && BUILDFLAG(USE_BROWSER_SPELLCHECKER) +void FakeSpellCheck::InitializeSpellCheckWithLanguage() { + // Add the SpellcheckLanguage manually to the SpellCheck object. + SpellCheck::languages_.push_back( + std::make_unique<SpellcheckLanguage>(embedder_provider_)); +} + size_t FakeSpellCheck::LanguageCount() { return use_fake_counts_ ? language_count_ : SpellCheck::LanguageCount(); }
diff --git a/components/spellcheck/renderer/spellcheck_provider_test.h b/components/spellcheck/renderer/spellcheck_provider_test.h index 7a02a00..cbea25a 100644 --- a/components/spellcheck/renderer/spellcheck_provider_test.h +++ b/components/spellcheck/renderer/spellcheck_provider_test.h
@@ -67,6 +67,8 @@ // Returns the current number of spell check languages with enabled engines. size_t EnabledLanguageCount() override; + void InitializeSpellCheckWithLanguage(); + private: bool use_fake_counts_ = false; size_t language_count_ = 0;
diff --git a/components/spellcheck/renderer/spellcheck_provider_unittest.cc b/components/spellcheck/renderer/spellcheck_provider_unittest.cc index 0fc87ff5..dc91186 100644 --- a/components/spellcheck/renderer/spellcheck_provider_unittest.cc +++ b/components/spellcheck/renderer/spellcheck_provider_unittest.cc
@@ -12,6 +12,7 @@ #include "components/spellcheck/renderer/spellcheck_provider_test.h" #include "components/spellcheck/spellcheck_buildflags.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/platform/web_runtime_features.h" #include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/public/web/web_text_checking_result.h" #include "third_party/blink/public/web/web_text_decoration_type.h" @@ -131,6 +132,28 @@ EXPECT_EQ(result.completion_count_, 0U); } +TEST_F(SpellCheckProviderCacheTest, + ResetCacheOnSpellCheckCustomDictionaryUpdate) { + blink::WebRuntimeFeatures::EnableFeatureFromString( + "SpellCheckCustomDictionaryAPI", true); + + FakeTextCheckingResult result; + FakeTextCheckingCompletion completion(&result); + + std::vector<blink::WebTextCheckingResult> last_results; + provider_.SetLastResults(u"This is a test", last_results); + + SpellCheck* spellcheck = provider_.spellcheck(); + EXPECT_NE(spellcheck, nullptr); + + provider_.spellcheck()->InitializeSpellCheckWithLanguage(); + static_cast<blink::WebTextCheckClient*>(&provider_) + ->SpellCheckCustomDictionaryChanged({}, {}); + + EXPECT_FALSE(provider_.SatisfyRequestFromCache(u"This is a", &completion)); + EXPECT_EQ(result.completion_count_, 0U); +} + #if BUILDFLAG(IS_WIN) && BUILDFLAG(USE_BROWSER_SPELLCHECKER) // Tests that the SpellCheckProvider does not call into the native spell checker // on Windows when the native spell checker flags are disabled.
diff --git a/components/strings/components_strings_af.xtb b/components/strings/components_strings_af.xtb index 7f6a22f..ea5b790 100644 --- a/components/strings/components_strings_af.xtb +++ b/components/strings/components_strings_af.xtb
@@ -4568,6 +4568,7 @@ <translation id="8175796834047840627">Chrome bied aan om jou kaarte in jou Google-rekening te stoor omdat jy aangemeld is. Jy kan hierdie gedrag in instellings verander.</translation> <translation id="8176440868214972690">Die administrateur van hierdie toestel het sommige inligting, soos instellings of beleide, na die volgende webwerwe gestuur.</translation> <translation id="817820454357658398">Produkte vir vrouehigiëne</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Inhoud op die betaalpuntbladsy word met Google gedeel om hierdie opsies te bied.<ph name="END_BOLD" /> Betaalpakkette is onderworpe aan geskiktheid. Gaan na <ph name="BEGIN_LINK" />betalinginstellings<ph name="END_LINK" /> om Betaal Later-opsies te versteek</translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> is weens inhoud geblokkeer}other{<ph name="FILE_COUNT" /> lêers is weens inhoud geblokkeer}}</translation> <translation id="8183800802493617952">Gesinsgerigte speletjies en aktiwiteite</translation> <translation id="8184538546369750125">Gebruik globale verstek (Laat toe)</translation>
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index 23bbf7e..f20c9b7bd 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -4568,6 +4568,7 @@ <translation id="8175796834047840627">እርስዎ በመለያ ስለገቡ Chrome ወደ የእርስዎ የGoogle መለያ ለማስቀመጥ አማራጭ እያቀረበ ነው። ይህን ባህሪ በቅንብሮች ውስጥ መለወጥ ይችላሉ።</translation> <translation id="8176440868214972690">የዚህ መሣሪያ አስተዳዳሪ እንደ ቅንብሮች ወይም መመሪያዎች ላሉት ለሚከተሉት ድር ጣቢያዎች የተወሰነ መረጃ ልኳል።</translation> <translation id="817820454357658398">የሴቶች የንጽህና መጠበቂያ ምርቶች</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />እነዚህን አማራጮች ለማቅረብ ከክፍያ ማጠናቀቂያ ገጽ ላይ የመጣ ይዘት ከGoogle ጋር ይጋራል።<ph name="END_BOLD" /> የክፍያ ዕቅዶች ለብቁነት ተገዢ ናቸው። የበኋላ ላይ መክፈል አማራጮችን ለመደበቅ ወደ <ph name="BEGIN_LINK" />የክፍያ ቅንብሮች<ph name="END_LINK" /> ይሂዱ</translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> በይዘት ምክንያት ታግዷል}one{<ph name="FILE_COUNT" /> ፋይል በይዘት ምክንያት ታግዷል}other{<ph name="FILE_COUNT" /> ፋይሎች በይዘት ምክንያት ታግደዋል}}</translation> <translation id="8183800802493617952">ቤተሰብ-ተኮር ጨዋታዎች እና እንቅስቃሴዎች</translation> <translation id="8184538546369750125">ሁለንተናዊ ነባሪውን ተጠቀም (ፍቀድ)</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index f1d2ec6..14e3686 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -4569,6 +4569,7 @@ <translation id="8175796834047840627">يتيح لك Chrome حفظ بطاقاتك في حسابك على Google لأنك سجَّلت الدخول. يمكنك تغيير هذا السلوك في الإعدادات.</translation> <translation id="8176440868214972690">أرسل مشرف هذا الجهاز بعض المعلومات، مثل الإعدادات أو السياسات، إلى المواقع الإلكترونية التالية.</translation> <translation id="817820454357658398">منتجات نظافة نسائية</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />تتم مشاركة محتوى صفحة الدفع مع Google لتقديم هذه الخيارات.<ph name="END_BOLD" /> تخضع خطط الدفع لمتطلبات الأهلية. لإخفاء خيارات "الدفع لاحقًا"، يُرجى الانتقال إلى <ph name="BEGIN_LINK" />إعدادات الدفع<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{تم حظر <ph name="FILE_NAME" /> بسبب المحتوى.}zero{تم حظر <ph name="FILE_COUNT" /> ملف بسبب المحتوى.}two{تم حظر ملفَين (<ph name="FILE_COUNT" />) بسبب المحتوى.}few{تم حظر <ph name="FILE_COUNT" /> ملفات بسبب المحتوى.}many{تم حظر <ph name="FILE_COUNT" /> ملفًا بسبب المحتوى.}other{تم حظر <ph name="FILE_COUNT" /> ملف بسبب المحتوى.}}</translation> <translation id="8183800802493617952">ألعاب وأنشطة موجهة نحو الأسرة</translation> <translation id="8184538546369750125">استخدام الإعداد التلقائي العمومي (سماح)</translation>
diff --git a/components/strings/components_strings_as.xtb b/components/strings/components_strings_as.xtb index 72317349..f8cad69 100644 --- a/components/strings/components_strings_as.xtb +++ b/components/strings/components_strings_as.xtb
@@ -4563,6 +4563,7 @@ <translation id="8175796834047840627">আপুনি ছাইন ইন কৰি থোৱাৰ বাবে Chromeএ আপোনাৰ Google একাউণ্টত আপোনাৰ কার্ডসমূহ ছেভ কৰাৰ সুবিধা দিছে। আপুনি ছেটিংসমূহ-ত এয়া সলনি কৰিব পাৰে।</translation> <translation id="8176440868214972690">এই ডিভাইচটোৰ প্ৰশাসকে এই ৱেবছাইটসমূহলৈ ছেটিং অথবা নীতিৰ দৰে কিছুমান তথ্য পঠিয়াইছে।</translation> <translation id="817820454357658398">নাৰীৰ স্বাস্থ্যবিধিৰ সামগ্ৰী</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />এই বিকল্পসমূহ আগবঢ়াবলৈ চেকআউট পৃষ্ঠাৰ সমল Googleৰ সৈতে শ্বেয়াৰ কৰা হয়।<ph name="END_BOLD" /> পৰিশোধৰ আঁচনিসমূহ যোগ্যতাৰ অধীন। পাছত পৰিশোধ কৰাৰ বিকল্পসমূহ লুকুৱাবলৈ, <ph name="BEGIN_LINK" />পৰিশোধৰ ছেটিঙ<ph name="END_LINK" />লৈ যাওক</translation> <translation id="818254048113802060">{0,plural, =1{সমলৰ বাবে <ph name="FILE_NAME" /> অৱৰোধ কৰা হৈছে}one{সমলৰ বাবে <ph name="FILE_COUNT" /> টা ফাইল অৱৰোধ কৰা হৈছে}other{সমলৰ বাবে <ph name="FILE_COUNT" /> টা ফাইল অৱৰোধ কৰা হৈছে}}</translation> <translation id="8183800802493617952">পৰিয়ালৰ উপযোগী গে’ম আৰু কাৰ্যকলাপ</translation> <translation id="8184538546369750125">গ্ল’বেল ডিফ’ল্ট ব্যৱহাৰ কৰক (অনুমতি দিয়ক)</translation>
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb index de74d401..b2fa9fe 100644 --- a/components/strings/components_strings_az.xtb +++ b/components/strings/components_strings_az.xtb
@@ -4564,6 +4564,7 @@ <translation id="8175796834047840627">Daxil olduğunuza görə Chrome kartları Google Hesabında yadda saxlamağı təklif edir. Bunu ayarlarda dəyişə bilərsiniz.</translation> <translation id="8176440868214972690">Bu cihazın administratoru aşağıdakı veb saytlara ayarlar və ya siyasətlər kimi bəzi məlumatlar göndərib.</translation> <translation id="817820454357658398">Qadınlar üçün gigiyena məhsulları</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Bu seçimləri təklif etmək üçün ödəniş səhifəsindəki kontent Google ilə paylaşılır.<ph name="END_BOLD" /> Ödəniş planları uyğunluqdan asılıdır. Sonra ödəmə seçimlərini gizlətmək üçün <ph name="BEGIN_LINK" />ödəniş ayarlarına<ph name="END_LINK" /> keçin</translation> <translation id="818254048113802060">{0,plural, =1{Kontentə görə <ph name="FILE_NAME" /> bloklandı}other{Kontentə görə <ph name="FILE_COUNT" /> fayl bloklandı}}</translation> <translation id="8183800802493617952">Ailəyönümlü oyun və fəaliyyətlər</translation> <translation id="8184538546369750125">Qlobal defoltdan istifadə edin (İcazə verin)</translation>
diff --git a/components/strings/components_strings_be.xtb b/components/strings/components_strings_be.xtb index e50d91b..42ec66c 100644 --- a/components/strings/components_strings_be.xtb +++ b/components/strings/components_strings_be.xtb
@@ -4568,6 +4568,7 @@ <translation id="8175796834047840627">Chrome прапаноўвае захоўваць карткі ва Уліковым запісе Google, бо вы ўвайшлі ў сістэму. Гэту функцыю можна выключыць у наладах.</translation> <translation id="8176440868214972690">Адміністратар гэтай прылады адправіў на наступныя вэб-сайты пэўныя звесткі (напрыклад, налады або палітыкі).</translation> <translation id="817820454357658398">Сродкі жаночай гігіены</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Каб прапанаваць гэтыя варыянты, змесціва са старонкі афармлення заказу абагульваецца з Google.<ph name="END_BOLD" /> Тарыфныя планы даступныя пры адпаведнасці патрабаванням. Каб схаваць варыянты аплаты ў растэрміноўку, адкрыйце <ph name="BEGIN_LINK" />налады аплаты<ph name="END_LINK" />.</translation> <translation id="818254048113802060">{0,plural, =1{Файл "<ph name="FILE_NAME" />" заблакіраваны з-за яго змесціва}one{<ph name="FILE_COUNT" /> файл заблакіраваны з-за яго змесціва}few{<ph name="FILE_COUNT" /> файлы заблакіраваны з-за іх змесціва}many{<ph name="FILE_COUNT" /> файлаў заблакіраваны з-за іх змесціва}other{<ph name="FILE_COUNT" /> файла заблакіраваны з-за яго змесціва}}</translation> <translation id="8183800802493617952">Сямейныя гульні і забавы</translation> <translation id="8184538546369750125">Выкарыстоўваць глабальныя стандартныя налады (дазволіць)</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index 5ffef96..c5338419 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -4569,6 +4569,7 @@ <translation id="8175796834047840627">Chrome предлага да запази картите ви в профила ви в Google, защото сте влезли в него. Можете да промените това поведение от настройките.</translation> <translation id="8176440868214972690">Администраторът на това устройство изпрати известна информация, като например настройки или правила, до долупосочените уебсайтове.</translation> <translation id="817820454357658398">Дамски хигиенни продукти</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Съдържанието от страницата за плащане се споделя с Google, за да предлагаме тези опции.<ph name="END_BOLD" /> Плановете за плащане зависят от това дали отговаряте на условията. За да скриете опциите за плащане по-късно, отворете <ph name="BEGIN_LINK" />настройките за плащане<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{Файлът <ph name="FILE_NAME" /> бе блокиран поради деликатно съдържание}other{<ph name="FILE_COUNT" /> файла бяха блокирани поради деликатно съдържание}}</translation> <translation id="8183800802493617952">Семейни игри и дейности</translation> <translation id="8184538546369750125">Използване на глобалната стандартна стойност (разрешаване)</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index 108cb6d..a7826ca 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -4569,6 +4569,7 @@ <translation id="8175796834047840627">আপনি সাইন-ইন করে রয়েছেন বলে, Chrome আপনার কার্ডগুলি আপনার Google অ্যাকাউন্টে সেভ করার অফার করছে। সেটিংসে গিয়ে এই আচরণটি পরিবর্তন করতে পারেন।</translation> <translation id="8176440868214972690">এই ডিভাইসের অ্যাডমিনিস্ট্রেটর নিম্নলিখিত ওয়েবসাইটগুলিকে সেটিংস বা নীতির মতো কিছু তথ্য পাঠিয়েছে।</translation> <translation id="817820454357658398">মহিলাদের পরিচ্ছন্নতা সংক্রান্ত প্রোডাক্ট</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />এইসব বিকল্প অফার করতে, চেক-আউট করার পৃষ্ঠা থেকে কন্টেন্ট Google-এর সাথে শেয়ার করা হয়।<ph name="END_BOLD" /> পেমেন্ট প্ল্যান উপযুক্ততার উপর নির্ভর করে। পরে পেমেন্ট করার বিকল্প লুকাতে, <ph name="BEGIN_LINK" />পেমেন্টের সেটিংসে<ph name="END_LINK" /> যান</translation> <translation id="818254048113802060">{0,plural, =1{কন্টেন্টের কারণে <ph name="FILE_NAME" /> ব্লক করা হয়েছে}one{কন্টেন্টের কারণে <ph name="FILE_COUNT" />টি ফাইল ব্লক করা হয়েছে}other{কন্টেন্টের কারণে <ph name="FILE_COUNT" />টি ফাইল ব্লক করা হয়েছে}}</translation> <translation id="8183800802493617952">পরিবারিক খেলা ও অ্যাক্টিভিটি</translation> <translation id="8184538546369750125">বিশ্বব্যাপী ডিফল্ট ব্যবহার করুন (অনুমতি দিন)</translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb index 0f32f22..d2ace175 100644 --- a/components/strings/components_strings_bs.xtb +++ b/components/strings/components_strings_bs.xtb
@@ -4569,6 +4569,7 @@ <translation id="8175796834047840627">Chrome vam nudi pohranjivanje vaših kartica na Google računu zato što ste prijavljeni. Ovo ponašanje možete promjeniti u postavkama</translation> <translation id="8176440868214972690">Administrator ovog uređaja je poslao određene informacije web lokacijama u nastavku, naprimjer postavke ili pravila.</translation> <translation id="817820454357658398">Proizvodi za žensku higijenu</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Sadržaj stranice za nastavak na plaćanje se dijeli s Googleom da ponudi ove opcije.<ph name="END_BOLD" /> Planovi plaćanja su podložni ispunjavanju uslova. Da sakrijete opcije kasnijeg plaćanja, idite u <ph name="BEGIN_LINK" />postavke plaćanja<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{Fajl <ph name="FILE_NAME" /> je blokiran zbog sadržaja}one{<ph name="FILE_COUNT" /> fajl je blokiran zbog sadržaja}few{<ph name="FILE_COUNT" /> fajla su blokirana zbog sadržaja}other{<ph name="FILE_COUNT" /> fajlova je blokirano zbog sadržaja}}</translation> <translation id="8183800802493617952">Porodične igre i aktivnosti</translation> <translation id="8184538546369750125">Koristi opću zadanu postavku (dozvoli)</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index 19edab6b..9ccf85ddc 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -4569,6 +4569,7 @@ <translation id="8175796834047840627">Chrome t'està oferint desar les targetes al Compte de Google perquè tens la sessió iniciada. Pots canviar aquest comportament a la configuració.</translation> <translation id="8176440868214972690">L'administrador d'aquest dispositiu ha enviat informació als llocs web següents, com ara opcions de configuració o polítiques.</translation> <translation id="817820454357658398">Productes d'higiene femenina</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />El contingut de la pàgina de tramitació de la compra es comparteix amb Google per oferir aquestes opcions<ph name="END_BOLD" />. Els plans de pagament estan subjectes a la idoneïtat. Per amagar les opcions que permeten pagar més tard, ves a la <ph name="BEGIN_LINK" />configuració de pagament<ph name="END_LINK" />.</translation> <translation id="818254048113802060">{0,plural, =1{S'ha bloquejat <ph name="FILE_NAME" /> a causa del contingut}other{S'han bloquejat <ph name="FILE_COUNT" /> fitxers a causa del contingut}}</translation> <translation id="8183800802493617952">Jocs i activitats orientats a la família</translation> <translation id="8184538546369750125">Utilitza l'opció predeterminada global (Permet)</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index d417088..f3e9cb3c 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -4563,6 +4563,7 @@ <translation id="8175796834047840627">Chrome vám nabízí uložení karet do účtu Google, protože jste přihlášeni. Toto chování můžete změnit v Nastavení.</translation> <translation id="8176440868214972690">Administrátor tohoto zařízení odeslal určité informace (například nastavení nebo zásady) následujícím webům.</translation> <translation id="817820454357658398">Dámské hygienické potřeby</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Aby bylo možné nabízet tyto možnosti, sdílí se obsah stránky placení s Googlem.<ph name="END_BOLD" /> Platební tarify jsou závislé na způsobilosti. Pokud chcete možnosti uhrazení na splátky skrýt, přejděte na <ph name="BEGIN_LINK" />nastavení plateb<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{Soubor <ph name="FILE_NAME" /> byl kvůli obsahu zablokován}few{<ph name="FILE_COUNT" /> soubory byly kvůli obsahu zablokovány}many{<ph name="FILE_COUNT" /> souboru bylo kvůli obsahu zablokováno}other{<ph name="FILE_COUNT" /> souborů bylo kvůli obsahu zablokováno}}</translation> <translation id="8183800802493617952">Rodinné hry a aktivity</translation> <translation id="8184538546369750125">Použít výchozí globální hodnotu (Povolit)</translation>
diff --git a/components/strings/components_strings_cy.xtb b/components/strings/components_strings_cy.xtb index f07ff98..0df2aff 100644 --- a/components/strings/components_strings_cy.xtb +++ b/components/strings/components_strings_cy.xtb
@@ -4568,6 +4568,7 @@ <translation id="8175796834047840627">Mae Chrome yn cynnig cadw eich cardiau yn eich Cyfrif Google oherwydd eich bod wedi mewngofnodi. Gallwch newid yr ymddygiad hwn yn y gosodiadau.</translation> <translation id="8176440868214972690">Mae gweinyddwr y ddyfais hon wedi anfon rhywfaint o wybodaeth at y gwefannau canlynol, megis gosodiadau neu bolisïau.</translation> <translation id="817820454357658398">Cynnyrch Hylendid i Fenywod</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Mae cynnwys o'r dudalen dalu yn cael ei rannu â Google i gynnig yr opsiynau hyn.<ph name="END_BOLD" /> Mae cynlluniau talu yn amodol ar gymhwysedd. I guddio opsiynau talu'n ddiweddarach, ewch i'r <ph name="BEGIN_LINK" />gosodiadau talu<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{Cafodd <ph name="FILE_NAME" /> ei rhwystro oherwydd y cynnwys}zero{Cafodd <ph name="FILE_COUNT" /> ffeil eu rhwystro oherwydd y cynnwys}two{Cafodd <ph name="FILE_COUNT" /> ffeil eu rhwystro oherwydd y cynnwys}few{Cafodd <ph name="FILE_COUNT" /> ffeil eu rhwystro oherwydd y cynnwys}many{Cafodd <ph name="FILE_COUNT" /> ffeil eu rhwystro oherwydd y cynnwys}other{Cafodd <ph name="FILE_COUNT" /> ffeil eu rhwystro oherwydd y cynnwys}}</translation> <translation id="8183800802493617952">Gemau a Gweithgareddau Teuluol</translation> <translation id="8184538546369750125">Defnyddio'r gosodiad diofyn cyffredinol (Caniatáu)</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index dc7032d..7fa2c32 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -4569,6 +4569,7 @@ <translation id="8175796834047840627">Chrome tilbyder at gemme dine kort på din Google-konto, fordi du er logget ind. Du kan ændre dette i indstillingerne.</translation> <translation id="8176440868214972690">Administratoren af denne enhed har sendt nogle oplysninger til følgende websites, f.eks. indstillinger eller politikker.</translation> <translation id="817820454357658398">Hygiejneprodukter til kvinder</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Indhold fra betalingssiden deles med Google for at give disse valgmuligheder.<ph name="END_BOLD" /> Betalingsplaner forudsætter, at du er kvalificeret. Gå til <ph name="BEGIN_LINK" />betalingsindstillingerne<ph name="END_LINK" /> for at skjule valgmuligheder for Betal senere</translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> blev blokeret på grund af indhold}one{<ph name="FILE_COUNT" /> fil blev blokeret på grund af indhold}other{<ph name="FILE_COUNT" /> filer blev blokeret på grund af indhold}}</translation> <translation id="8183800802493617952">Familiespil og -aktiviteter</translation> <translation id="8184538546369750125">Brug global standard (tillad)</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index 5502502..2926d9d1a 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -4567,6 +4567,7 @@ <translation id="8175796834047840627">Chrome bietet dir die Möglichkeit, die Karten in deinem Google-Konto zu speichern, weil du angemeldet bist. Du kannst dies in den Einstellungen ändern.</translation> <translation id="8176440868214972690">Der Administrator dieses Geräts hat Informationen wie z. B. Einstellungen oder Richtlinien an folgende Websites gesendet.</translation> <translation id="817820454357658398">Intimpflegeprodukte</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Inhalte von der Zahlungsseite werden an Google weitergegeben, um diese Optionen anzubieten.<ph name="END_BOLD" /> Die Verfügbarkeit von Ratenzahlungen hängt von der Erfüllung bestimmter Voraussetzungen ab. Du kannst die Option „Später bezahlen“ in den <ph name="BEGIN_LINK" />Zahlungseinstellungen<ph name="END_LINK" /> ausblenden.</translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> wurde aufgrund des Inhalts blockiert}other{<ph name="FILE_COUNT" /> Dateien wurden aufgrund des Inhalts blockiert}}</translation> <translation id="8183800802493617952">Spiele und Aktivitäten für Familien</translation> <translation id="8184538546369750125">Globalen Standard verwenden (Zulassen)</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index 092416a..c1965fd 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -4571,6 +4571,7 @@ <translation id="8175796834047840627">Το Chrome προσφέρεται να αποθηκεύσει τις κάρτες σας στον Λογαριασμό σας Google επειδή έχετε συνδεθεί. Μπορείτε να αλλάξετε αυτήν τη συμπεριφορά στις ρυθμίσεις.</translation> <translation id="8176440868214972690">Ο διαχειριστής αυτής της συσκευής έστειλε ορισμένες πληροφορίες στους παρακάτω ιστοτόπους, όπως ρυθμίσεις ή πολιτικές.</translation> <translation id="817820454357658398">Προϊόντα γυναικείας υγιεινής</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Το περιεχόμενο της σελίδας ολοκλήρωσης αγοράς κοινοποιείται στην Google για την παροχή αυτών των επιλογών.<ph name="END_BOLD" /> Τα προγράμματα πληρωμών εξαρτώνται από την καταλληλότητα. Για να αποκρύψετε τις επιλογές πληρωμής αργότερα, μεταβείτε στις <ph name="BEGIN_LINK" />ρυθμίσεις πληρωμής<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{Το αρχείο <ph name="FILE_NAME" /> αποκλείστηκε λόγω περιεχομένου}other{<ph name="FILE_COUNT" /> αρχεία αποκλείστηκαν λόγω περιεχομένου}}</translation> <translation id="8183800802493617952">Οικογενειακά παιχνίδια και δραστηριότητες</translation> <translation id="8184538546369750125">Χρήση καθολικής προεπιλεγμένης ρύθμισης (Επιτρέπεται)</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index bae9c32..4ef9be5 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -4569,6 +4569,7 @@ <translation id="8175796834047840627">Chrome is offering to save your cards in your Google Account because you are signed in. You can change this behaviour in settings.</translation> <translation id="8176440868214972690">The administrator of this device has sent some info to the following websites, like settings or policies.</translation> <translation id="817820454357658398">Feminine Hygiene Products</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Content from the checkout page is shared with Google to offer these options.<ph name="END_BOLD" /> Payment plans are subject to eligibility. To hide pay later options, go to <ph name="BEGIN_LINK" />payment settings<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> was blocked because of content}other{<ph name="FILE_COUNT" /> files were blocked because of content}}</translation> <translation id="8183800802493617952">Family-Orientated Games and Activities</translation> <translation id="8184538546369750125">Use global default (Allow)</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index 77f14b8..aecf3be 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -4570,6 +4570,7 @@ <translation id="8175796834047840627">Como accediste a tu cuenta, Chrome te ofrece guardar tus tarjetas en tu Cuenta de Google. Puedes modificar este comportamiento en la configuración.</translation> <translation id="8176440868214972690">El administrador de este dispositivo envió parte de la información, como la configuración o las políticas, a los siguientes sitios web.</translation> <translation id="817820454357658398">Productos para la higiene femenina</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />El contenido de la página de confirmación de compra se comparte con Google para ofrecer estas opciones.<ph name="END_BOLD" /> Los planes de pagos están sujetos a elegibilidad. Para ocultar las opciones de pago más tarde, ve a la <ph name="BEGIN_LINK" />configuración de pagos<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{Se bloqueó el archivo <ph name="FILE_NAME" /> debido al contenido}other{Se bloquearon <ph name="FILE_COUNT" /> archivos debido al contenido}}</translation> <translation id="8183800802493617952">Juegos y actividades para la familia</translation> <translation id="8184538546369750125">Usar configuración global predeterminada (Permitir)</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index 82cc6d6..50318cc 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -881,7 +881,7 @@ <translation id="23703388716193220">Golfivarustus</translation> <translation id="2370368710215137370">Failide üleslaadimine</translation> <translation id="2370739752330685659">Võib-olla hiljem</translation> -<translation id="2371084566192454134">Vaheleht</translation> +<translation id="2371084566192454134">Vahelehed ja vahelehegrupid</translation> <translation id="237379235388498999">Video salvestati OneDrive’i</translation> <translation id="2374629208601905275">Teie piirkonna seaduste põhjal palub Chrome teil valida oma vaikeotsingumootori. Need otsingumootorid on teie piirkonnas populaarsed ja need kuvatakse juhuslikus järjestuses.</translation> <translation id="2377241607395428273">Graafika- ja animatsioonitarkvara</translation> @@ -4569,6 +4569,7 @@ <translation id="8175796834047840627">Chrome pakub võimalust salvestada kaardid teie Google'i kontole, kuna olete sisse logitud. Seda käitumist saab seadetes muuta.</translation> <translation id="8176440868214972690">Seadme administraator on järgmistele veebisaitidele teatud teavet saatnud, näiteks seadete ja eeskirjade teavet.</translation> <translation id="817820454357658398">Naiste hügieenitooted</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Nende valikute pakkumiseks jagatakse Google’iga kassalehe sisu.<ph name="END_BOLD" /> Maksegraafikutele kehtivad sobilikkuse nõuded. Hiljem maksmise valikute peitmiseks avage <ph name="BEGIN_LINK" />makseseaded<ph name="END_LINK" />.</translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> blokeeriti sisu tõttu}other{<ph name="FILE_COUNT" /> faili blokeeriti sisu tõttu}}</translation> <translation id="8183800802493617952">Peredele suunatud mängud ja tegevused</translation> <translation id="8184538546369750125">Kasuta globaalset vaikeseadet (luba)</translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb index 3e1d6d8..04b026a 100644 --- a/components/strings/components_strings_eu.xtb +++ b/components/strings/components_strings_eu.xtb
@@ -4563,6 +4563,7 @@ <translation id="8175796834047840627">Saioa hasita duzunez, txartelak Google-ko kontuan gordetzeko aukera ematen dizu Chrome-k. Aukera hori aldatzeko, joan Ezarpenak atalera.</translation> <translation id="8176440868214972690">Gailuaren administratzaileak ezarpenei eta gidalerroei buruzko informazioa bidali du, besteak beste, jarraian ageri diren webguneetara.</translation> <translation id="817820454357658398">Hilekoaren higienerako produktuak</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Ordainketa-orriaren edukia Google-rekin partekatzen da aukera horiek eskaintzeko.<ph name="END_BOLD" /> Ordainketa-planak baldintza batzuk betetzen dituztenentzat daude erabilgarri. Geroago ordaintzeko aukerak ezkutatzeko, joan <ph name="BEGIN_LINK" />Ordainketa-ezarpenak<ph name="END_LINK" /> atalera.</translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> blokeatu da, edukia dela eta}other{<ph name="FILE_COUNT" /> fitxategi blokeatu dira, edukia dela eta}}</translation> <translation id="8183800802493617952">Familientzako jokoak eta jarduerak</translation> <translation id="8184538546369750125">Erabili lehenespen globala (Baimendu)</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index 6f56d88..1b9c02e3 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -224,7 +224,7 @@ <translation id="1339601241726513588">دامنه ثبتنام:</translation> <translation id="1340482604681802745">نشانی تحویل گرفتن</translation> <translation id="1343356790768851700">این سایت چیزهایی را که میپسندید تعیین میکند و سپس به سایتهای دیگر آگهی پیشنهاد میدهد</translation> -<translation id="1343830902827845050">ورود به سیستم Chrome</translation> +<translation id="1343830902827845050">وارد سیستم Chrome شوید</translation> <translation id="1346748346194534595">راست</translation> <translation id="1348779747280417563">تأیید نام</translation> <translation id="1355158069018170842">نمایش کاهش قیمت در زبانهها</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index 9ceb982..ebbb1770 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -4570,6 +4570,7 @@ <translation id="8175796834047840627">Chrome tarjoaa korttien tallentamista Google-tilillesi, koska olet kirjautuneena sisään. Voit muuttaa tätä koska tahansa asetuksista.</translation> <translation id="8176440868214972690">Laitteen järjestelmänvalvoja on lähettänyt seuraaville verkkosivustoille joitakin tietoja, esim. asetuksia tai käytäntöjä.</translation> <translation id="817820454357658398">Naisten hygieniatuotteet</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Kassasivun sisältö jaetaan Googlelle näiden vaihtoehtojen tarjoamiseksi.<ph name="END_BOLD" /> Maksusopimukset edellyttävät kelpoisuutta. Jos haluat piilottaa maksa myöhemmin ‑vaihtoehdot, siirry <ph name="BEGIN_LINK" />maksuasetuksiin<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> estetty sisällön vuoksi}other{<ph name="FILE_COUNT" /> tiedostoa estetty sisällön vuoksi}}</translation> <translation id="8183800802493617952">Perhepelit ja ‑harrastukset</translation> <translation id="8184538546369750125">Käytä yleistä oletusasetusta (salli)</translation>
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb index b12ed2fb..fd94a14 100644 --- a/components/strings/components_strings_fr-CA.xtb +++ b/components/strings/components_strings_fr-CA.xtb
@@ -4568,6 +4568,7 @@ <translation id="8175796834047840627">Chrome vous propose d'enregistrer vos cartes dans votre compte Google parce que vous y êtes connecté. Vous pouvez modifier ce comportement dans les paramètres.</translation> <translation id="8176440868214972690">L'administrateur de cet appareil a envoyé de l'information, comme des paramètres ou des politiques, aux sites Web suivants.</translation> <translation id="817820454357658398">Produits d'hygiène féminine</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Le contenu de la page de paiement est partagé avec Google pour proposer ces options.<ph name="END_BOLD" /> Les forfaits de paiement sont assujettis à des critères d'admissibilité. Pour masquer les options de paiement différé, accédez aux <ph name="BEGIN_LINK" />paramètres des paiements<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> a été bloqué en raison de son contenu}one{<ph name="FILE_COUNT" /> fichier a été bloqué en raison de son contenu}other{<ph name="FILE_COUNT" /> fichiers ont été bloqués en raison de leur contenu}}</translation> <translation id="8183800802493617952">Activités et jeux pour la famille</translation> <translation id="8184538546369750125">Utiliser le paramètre global par défaut (« Autoriser »)</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index b8944630..9e119b1 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -4570,6 +4570,7 @@ <translation id="8175796834047840627">Chrome propose d'enregistrer vos cartes dans votre compte Google, car vous êtes connecté. Vous pouvez modifier ce comportement dans les paramètres.</translation> <translation id="8176440868214972690">L'administrateur de cet appareil a envoyé des infos, comme des paramètres ou des règles, aux sites Web suivants.</translation> <translation id="817820454357658398">Articles d'hygiène féminine</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Le contenu de la page de paiement est partagé avec Google pour proposer ces options.<ph name="END_BOLD" /> Les forfaits sont soumis à des critères d'éligibilité. Pour masquer les options de paiement différé, accédez aux <ph name="BEGIN_LINK" />paramètres de paiement<ph name="END_LINK" />.</translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> a été bloqué en raison de son contenu}one{<ph name="FILE_COUNT" /> fichier a été bloqué en raison de son contenu}other{<ph name="FILE_COUNT" /> fichiers ont été bloqués en raison de leur contenu}}</translation> <translation id="8183800802493617952">Jeux et activités pour la famille</translation> <translation id="8184538546369750125">Utiliser le paramètre global par défaut ("Autoriser")</translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb index 972def66..315337b 100644 --- a/components/strings/components_strings_gl.xtb +++ b/components/strings/components_strings_gl.xtb
@@ -4568,6 +4568,7 @@ <translation id="8175796834047840627">Chrome permíteche gardar as túas tarxetas na túa Conta de Google porque tes a sesión iniciada. Podes cambiar esta opción na configuración cando queiras.</translation> <translation id="8176440868214972690">O administrador deste dispositivo enviou algúns datos (por exemplo, opcións de configuración ou políticas) aos seguintes sitios web.</translation> <translation id="817820454357658398">Produtos para a hixiene feminina</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />O contido da páxina de tramitación da compra compártese con Google para poder ofrecer estas opcións.<ph name="END_BOLD" /> Os plans de pago están suxeitos ao cumprimento de requisitos. Para ocultar as opcións de pago aprazado, vai á <ph name="BEGIN_LINK" />configuración de pago<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{Bloqueouse <ph name="FILE_NAME" /> debido ao contido}other{Bloqueáronse <ph name="FILE_COUNT" /> ficheiros debido ao contido}}</translation> <translation id="8183800802493617952">Xogos e actividades para a familia</translation> <translation id="8184538546369750125">Utilizar axuste predeterminado global (permitir)</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index 73e481a3..883268a 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -4569,6 +4569,7 @@ <translation id="8175796834047840627">आपके साइन इन किए होने की वजह से Chrome आपको Google खाते में कार्ड सेव करने की सुविधा देता है. आप सेटिंग में जाकर इसे बदल सकते हैं.</translation> <translation id="8176440868214972690">इस डिवाइस के एडमिन ने नीचे दी गई वेबसाइटों को सेटिंग या नीतियों वगैरह के बारे में कुछ जानकारी भेजी है.</translation> <translation id="817820454357658398">महिलाओं के लिए हाइजीन से जुड़े प्रॉडक्ट</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />ये विकल्प उपलब्ध कराने के लिए, चेकआउट पेज का कॉन्टेंट Google के साथ शेयर किया जाता है.<ph name="END_BOLD" /> बिलिंग प्लान, ज़रूरी शर्तें पूरी करने पर ही उपलब्ध होते हैं. बाद में पेमेंट करने के विकल्प छिपाने के लिए, <ph name="BEGIN_LINK" />पेमेंट सेटिंग<ph name="END_LINK" /> पर जाएं</translation> <translation id="818254048113802060">{0,plural, =1{कॉन्टेंट की वजह से <ph name="FILE_NAME" /> को रोका गया है}one{कॉन्टेंट की वजह से <ph name="FILE_COUNT" /> फ़ाइल रोका गया है}other{कॉन्टेंट की वजह से <ph name="FILE_COUNT" /> फ़ाइलों को रोका गया है}}</translation> <translation id="8183800802493617952">पारिवारिक गेम और गतिविधियां</translation> <translation id="8184538546369750125">वैश्विक डिफ़ॉल्ट का उपयोग करें (अनुमति दें)</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index 21b3361..e61d366 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -4568,6 +4568,7 @@ <translation id="8175796834047840627">Chrome vam nudi spremanje vaših kartica na vaš Google račun jer ste prijavljeni. To ponašanje možete promijeniti u postavkama.</translation> <translation id="8176440868214972690">Administrator uređaja poslao je neke podatke, poput postavki ili pravila, sljedećim web-lokacijama.</translation> <translation id="817820454357658398">Proizvodi za žensku higijenu</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Sadržaj stranice za naplatu dijeli se s Googleom kako bi Google ponudio te opcije<ph name="END_BOLD" />. Planovi plaćanja ovise o ispunjavanju kriterija. Da biste sakrili opcije plaćanja kasnije, otvorite <ph name="BEGIN_LINK" />postavke plaćanja<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{Datoteka <ph name="FILE_NAME" /> blokirana je zbog sadržaja}one{<ph name="FILE_COUNT" /> datoteka blokirana je zbog sadržaja}few{<ph name="FILE_COUNT" /> datoteke blokirane su zbog sadržaja}other{<ph name="FILE_COUNT" /> datoteka blokirano je zbog sadržaja}}</translation> <translation id="8183800802493617952">Igre i aktivnosti usmjerene na obitelj</translation> <translation id="8184538546369750125">Upotrijebi globalnu zadanu vrijednost (dopusti)</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb index 4b1f2618..944498b6 100644 --- a/components/strings/components_strings_hu.xtb +++ b/components/strings/components_strings_hu.xtb
@@ -4566,6 +4566,7 @@ <translation id="8175796834047840627">A Chrome felajánlja a kártyák mentését az Ön Google-fiókjába, mert be van jelentkezve. A beállítások között ezt bármikor módosíthatja.</translation> <translation id="8176440868214972690">Az eszköz rendszergazdája elküldött bizonyos információkat (pl. a beállításokat és a házirendeket) a következő webhelyeknek.</translation> <translation id="817820454357658398">Női higiéniai termékek</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />A fizetési oldal tartalmát megosztjuk a Google-lal, hogy felkínálhassuk ezeket a lehetőségeket.<ph name="END_BOLD" /> A fizetési konstrukciók a jogosultságtól függnek. A későbbi fizetési lehetőségek elrejtéséhez lépjen a <ph name="BEGIN_LINK" />fizetési beállításokhoz<ph name="END_LINK" />.</translation> <translation id="818254048113802060">{0,plural, =1{A(z) <ph name="FILE_NAME" /> le van tiltva a tartalma miatt}other{<ph name="FILE_COUNT" /> fájl le van tiltva a tartalmuk miatt}}</translation> <translation id="8183800802493617952">Családi játékok és tevékenységek</translation> <translation id="8184538546369750125">Globális alapértelmezés használata (Engedélyezés)</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index 2833dded..06d7b33 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -4567,6 +4567,7 @@ <translation id="8175796834047840627">Chrome menawarkan untuk menyimpan informasi kartu ke Akun Google Anda karena Anda sedang login. Anda dapat mengubah perilaku ini di setelan.</translation> <translation id="8176440868214972690">Administrator perangkat ini telah mengirim beberapa info ke situs berikut, seperti setelan atau kebijakan.</translation> <translation id="817820454357658398">Produk Kebersihan Bagian Kewanitaan</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Konten dari halaman checkout dibagikan kepada Google untuk menawarkan opsi ini.<ph name="END_BOLD" /> Paket pembayaran tunduk kepada kelayakan. Untuk menyembunyikan opsi bayar nanti, buka <ph name="BEGIN_LINK" />setelan pembayaran<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> diblokir karena konten}other{<ph name="FILE_COUNT" /> file diblokir karena konten}}</translation> <translation id="8183800802493617952">Aktivitas & Game Berorientasi Keluarga</translation> <translation id="8184538546369750125">Gunakan default global (Izinkan)</translation>
diff --git a/components/strings/components_strings_is.xtb b/components/strings/components_strings_is.xtb index 4151c8a3..06d99b9 100644 --- a/components/strings/components_strings_is.xtb +++ b/components/strings/components_strings_is.xtb
@@ -4568,6 +4568,7 @@ <translation id="8175796834047840627">Chrome býður þér að vista kortin þín á Google-reikningnum vegna þess að þú ert innskráð(ur). Þú getur breytt þessu í stillingunum.</translation> <translation id="8176440868214972690">Stjórnandi tækisins hefur sent einhverjar upplýsingar á eftirfarandi vefsvæði, á borð við stillingar og reglur.</translation> <translation id="817820454357658398">Hreinlætisvörur fyrir konur</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Efni frá greiðslusíðunni er deilt með Google til að bjóða upp á þessa valkosti.<ph name="END_BOLD" /> Greiðsluáætlanir eru háðar gjaldgengi. Farðu í <ph name="BEGIN_LINK" />greiðslustillingar<ph name="END_LINK" /> til að fela valkosti greiðslufrests</translation> <translation id="818254048113802060">{0,plural, =1{Lokað var á <ph name="FILE_NAME" /> vegna efnis}one{Lokað var á <ph name="FILE_COUNT" /> skrá vegna efnis}other{Lokað var á <ph name="FILE_COUNT" /> skrár vegna efnis}}</translation> <translation id="8183800802493617952">Fjölskylduvænir leikir og afþreying</translation> <translation id="8184538546369750125">Nota altækt sjálfgildi (leyfa)</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index b73e839..5da0d77 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -4565,6 +4565,7 @@ <translation id="8175796834047840627">Chrome chiede se vuoi salvare le tue carte nel tuo Account Google perché hai eseguito l'accesso. Puoi modificare questo comportamento nelle impostazioni.</translation> <translation id="8176440868214972690">L'amministratore di questo dispositivo ha inviato alcune informazioni, quali impostazioni o policy, ai siti web indicati di seguito.</translation> <translation id="817820454357658398">Prodotti per l'igiene femminile</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />I contenuti della pagina di pagamento vengono condivisi con Google per offrire queste opzioni.<ph name="END_BOLD" /> I piani di pagamento sono soggetti a idoneità. Per nascondere le opzioni di pagamento posticipato, vai alle <ph name="BEGIN_LINK" />impostazioni di pagamento<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{Blocco del file <ph name="FILE_NAME" /> a causa di contenuti}other{Blocco di <ph name="FILE_COUNT" /> file a causa di contenuti}}</translation> <translation id="8183800802493617952">Giochi e attività per le famiglie</translation> <translation id="8184538546369750125">Usa predefinita globale (Consenti)</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index 03170b6..1f9a245 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -4574,6 +4574,7 @@ <translation id="8175796834047840627">Chrome מציע לשמור את הכרטיסים שלך בחשבון Google כי התחברת לחשבון. אפשר לשנות את ההתנהגות הזאת בהגדרות.</translation> <translation id="8176440868214972690">מנהל המערכת של המכשיר הזה שלח מספר פרטים, כמו הגדרות ומדיניות, לאתרים הבאים.</translation> <translation id="817820454357658398">מוצרי היגיינה לנשים</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />כדי להציע את האפשרויות האלה, התוכן של דף התשלום משותף עם Google.<ph name="END_BOLD" /> תוכניות התשלומים כפופות לעמידה בדרישות. כדי להסתיר את האפשרויות לתשלום אחר כך, צריך לעבור אל <ph name="BEGIN_LINK" />הגדרות התשלומים<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{הקובץ <ph name="FILE_NAME" /> נחסם מסיבה שקשורה לתוכן}one{<ph name="FILE_COUNT" /> קבצים נחסמו מסיבות שקשורות לתוכן}two{<ph name="FILE_COUNT" /> קבצים נחסמו מסיבות שקשורות לתוכן}other{<ph name="FILE_COUNT" /> קבצים נחסמו מסיבות שקשורות לתוכן}}</translation> <translation id="8183800802493617952">משחקים ופעילויות לכל המשפחה</translation> <translation id="8184538546369750125">שימוש בברירת המחדל הכללית (אפשר)</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index 63ec618..caa6b0df 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -4569,6 +4569,7 @@ <translation id="8175796834047840627">ログインしている場合は、その Google アカウントにカードを保存できます。この動作は設定で変更できます。</translation> <translation id="8176440868214972690">このデバイスの管理者は、次のウェブサイトに設定やポリシーなどの情報を送信するよう設定しています。</translation> <translation id="817820454357658398">女性向け衛生用品</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />購入手続きページのコンテンツは、これらのオプションを提供するために Google と共有されます。<ph name="END_BOLD" />お支払いプランは、ご利用条件を満たしていることが条件となります。後払いオプションを非表示にするには、<ph name="BEGIN_LINK" />お支払い設定<ph name="END_LINK" />に移動してください。</translation> <translation id="818254048113802060">{0,plural, =1{コンテンツが原因で <ph name="FILE_NAME" /> がブロックされました}other{コンテンツが原因で <ph name="FILE_COUNT" /> 個のファイルがブロックされました}}</translation> <translation id="8183800802493617952">家族向けゲーム、アクティビティ</translation> <translation id="8184538546369750125">グローバルのデフォルト値([許可])を使用</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb index 9cb06e2..4240ebe 100644 --- a/components/strings/components_strings_kk.xtb +++ b/components/strings/components_strings_kk.xtb
@@ -4567,6 +4567,7 @@ <translation id="8175796834047840627">Сіз аккаунтқа кіргендіктен, Chrome браузері карталарыңызды Google аккаунтына сақтауды ұсынып отыр. Мұны параметрлерге кіріп өзгертуіңізге болады.</translation> <translation id="8176440868214972690">Бұл құрылғының әкімшісі келесі веб-сайттарға бірқатар ақпарат (мысалы, параметрлер немесе саясаттар) жіберді.</translation> <translation id="817820454357658398">Әйелдер гигиенасына арналған өнімдер</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Бұл опцияларды ұсыну үшін төлеу бетіндегі контент Google-ға жіберіледі.<ph name="END_BOLD" /> Төлем жоспарлары талаптарға сай болуы керек. Кейін төлеу опцияларын жасыру үшін <ph name="BEGIN_LINK" />төлем параметрлеріне<ph name="END_LINK" /> өтіңіз.</translation> <translation id="818254048113802060">{0,plural, =1{Саясатқа байланысты <ph name="FILE_NAME" /> файлына блок қойылған}other{Саясатқа байланысты <ph name="FILE_COUNT" /> файлға блок қойылған}}</translation> <translation id="8183800802493617952">Отбасына арналған ойындар мен жаттығулар</translation> <translation id="8184538546369750125">Ғаламдық әдепкі параметрді пайдалану (рұқсат беру)</translation>
diff --git a/components/strings/components_strings_km.xtb b/components/strings/components_strings_km.xtb index 3e64357..ab52f265 100644 --- a/components/strings/components_strings_km.xtb +++ b/components/strings/components_strings_km.xtb
@@ -4574,6 +4574,7 @@ <translation id="8175796834047840627">Chrome ផ្ដល់ជូនជម្រើសរក្សាទុកបណ្ណរបស់អ្នកនៅក្នុងគណនី Google របស់អ្នក ដោយសារអ្នកចូលគណនី។ អ្នកអាចប្ដូរសកម្មភាពនេះបាននៅក្នុងការកំណត់។</translation> <translation id="8176440868214972690">អ្នកគ្រប់គ្រងឧបករណ៍នេះបានបញ្ជូនព័ត៌មានមួយចំនួនទៅគេហទំព័រខាងក្រោមដូចជា ការកំណត់ ឬគោលការណ៍ជាដើម។</translation> <translation id="817820454357658398">ផលិតផលអនាម័យស្ត្រី</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />ខ្លឹមសារពីទំព័របង់ប្រាក់ចេញត្រូវបានចែករំលែកជាមួយ Google ដើម្បីផ្ដល់ជូនជម្រើសទាំងនេះ។<ph name="END_BOLD" /> គម្រោងបង់ប្រាក់អាស្រ័យលើសិទ្ធិទទួលបាន។ ដើម្បីលាក់ជម្រើសទូទាត់ពេលក្រោយ សូមចូលទៅកាន់<ph name="BEGIN_LINK" />ការកំណត់ការបង់ប្រាក់<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> ត្រូវបានទប់ស្កាត់ដោយសារតែខ្លឹមសារ}other{ឯកសារ <ph name="FILE_COUNT" /> ត្រូវបានទប់ស្កាត់ដោយសារតែខ្លឹមសារ}}</translation> <translation id="8183800802493617952">សកម្មភាព និងហ្គេមសម្រាប់គ្រួសារ</translation> <translation id="8184538546369750125">ប្រើលំនាំដើមជាសកល (អនុញ្ញាត)</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index 5711b78f..e5e7537 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -4565,6 +4565,7 @@ <translation id="8175796834047840627">ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿರುವ ಕಾರಣದಿಂದಾಗಿ, ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ನಿಮ್ಮ ಕಾರ್ಡ್ಗಳನ್ನು ಉಳಿಸಲು Chrome ಅವಕಾಶ ನೀಡುತ್ತಿದೆ. ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ನೀವು ಈ ವರ್ತನೆಯನ್ನು ಬದಲಿಸಬಹುದು.</translation> <translation id="8176440868214972690">ಈ ಸಾಧನದ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್ಗಳು ಅಥವಾ ಕಾರ್ಯನೀತಿಗಳಂತಹ ಕೆಲವು ಮಾಹಿತಿಯನ್ನು ಈ ಕೆಳಗಿನ ವೆಬ್ಸೈಟ್ಗಳಿಗೆ ಕಳುಹಿಸಿದ್ದಾರೆ.</translation> <translation id="817820454357658398">ಮಹಿಳೆಯರ ನೈರ್ಮಲ್ಯದ ಉತ್ಪನ್ನಗಳು</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />ಈ ಆಯ್ಕೆಗಳನ್ನು ನೀಡಲು ಚೆಕ್ಔಟ್ ಪುಟದಿಂದ ಕಂಟೆಂಟ್ ಅನ್ನು Google ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತದೆ.<ph name="END_BOLD" /> ಪಾವತಿ ಪ್ಲಾನ್ಗಳು ಅರ್ಹತೆಗೆ ಒಳಪಟ್ಟಿರುತ್ತವೆ. ನಂತರ ಪಾವತಿಸುವ ಆಯ್ಕೆಗಳನ್ನು ಮರೆಮಾಡಲು, <ph name="BEGIN_LINK" />ಪಾವತಿ ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ<ph name="END_LINK" /> ಹೋಗಿ</translation> <translation id="818254048113802060">{0,plural, =1{ಕಂಟೆಂಟ್ ಕಾರಣದಿಂದಾಗಿ <ph name="FILE_NAME" /> ಫೈಲ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ}one{ಕಂಟೆಂಟ್ ಕಾರಣದಿಂದಾಗಿ <ph name="FILE_COUNT" /> ಫೈಲ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ}other{ಕಂಟೆಂಟ್ ಕಾರಣದಿಂದಾಗಿ <ph name="FILE_COUNT" /> ಫೈಲ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ}}</translation> <translation id="8183800802493617952">ಕುಟುಂಬ-ಸ್ನೇಹಿ ಆಟಗಳು ಮತ್ತು ಚಟುವಟಿಕೆಗಳು</translation> <translation id="8184538546369750125">ಜಾಗತಿಕ ಡಿಫಾಲ್ಟ್ ಬಳಸಿ (ಅನುಮತಿಸಿ)</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index 6337893..548ede0 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -4568,6 +4568,7 @@ <translation id="8175796834047840627">로그인되어 있는 경우 Chrome에서 Google 계정에 카드를 저장할지 묻는 메시지가 표시됩니다. 설정에서 이 동작을 변경할 수 있습니다.</translation> <translation id="8176440868214972690">기기 관리자가 다음 웹사이트로 설정 또는 정책과 같은 정보를 전송했습니다.</translation> <translation id="817820454357658398">여성용품</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />이러한 옵션을 제공하기 위해 결제 페이지의 페이지 콘텐츠가 Google과 공유됩니다.<ph name="END_BOLD" /> 요금제는 자격 요건을 충족해야 이용할 수 있습니다. 후불 결제 옵션을 숨기려면 <ph name="BEGIN_LINK" />결제 설정<ph name="END_LINK" />으로 이동하세요.</translation> <translation id="818254048113802060">{0,plural, =1{콘텐츠로 인해 <ph name="FILE_NAME" /> 파일이 차단되었습니다}other{콘텐츠로 인해 파일 <ph name="FILE_COUNT" />개가 차단되었습니다}}</translation> <translation id="8183800802493617952">가족용 게임 및 활동</translation> <translation id="8184538546369750125">전체 기본값 사용(허용)</translation>
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb index d10beee..974d1fa 100644 --- a/components/strings/components_strings_ky.xtb +++ b/components/strings/components_strings_ky.xtb
@@ -4567,6 +4567,7 @@ <translation id="8175796834047840627">Аккаунтуңузга кирип турганыңыздан улам, Chrome карталарыңызды Google аккаунтуңузга сактап коюуну сунуштап жатат. Бул параметрди параметрлерге өтүп, өзгөртүп койсоңуз болот.</translation> <translation id="8176440868214972690">Бул түзмөктүн администратору жөндөөлөр же саясаттар сыяктуу айрым маалыматты төмөндөгү вебсайттарга жөнөттү.</translation> <translation id="817820454357658398">Аялдардын гигиенасы үчүн өнүмдөр</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Бул варианттарды сунуштоо үчүн төлөө бетиндеги нерселер Google менен бөлүшүлөт.<ph name="END_BOLD" /> Төлөм пландары жарамдуулукка жараша жеткиликтүү болот. Кийинчерээк төлөө параметрлерин жашыруу үчүн <ph name="BEGIN_LINK" />төлөм параметрлерине<ph name="END_LINK" /> өтүңүз</translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> файлы мазмундан улам бөгөттөлдү}other{<ph name="FILE_COUNT" /> файл мазмундан улам бөгөттөлдү}}</translation> <translation id="8183800802493617952">Үй-бүлөгө багытталган оюндар жана иш-чаралар</translation> <translation id="8184538546369750125">Дүйнөлүк демейки жөндөөнү колдонуу (Уруксат берүү)</translation>
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb index 852f2d3..0cdfd34 100644 --- a/components/strings/components_strings_lo.xtb +++ b/components/strings/components_strings_lo.xtb
@@ -4568,6 +4568,7 @@ <translation id="8175796834047840627">Chrome ກຳລັງສະເໜີບັນທຶກບັດຂອງທ່ານໄວ້ໃນບັນຊີ Google ຂອງທ່ານ ເພາະວ່າທ່ານເຂົ້າສູ່ລະບົບຢູ່. ທ່ານສາມາດປ່ຽນລັກສະນະການນໍາໃຊ້ນີ້ໄດ້ໃນການຕັ້ງຄ່າ.</translation> <translation id="8176440868214972690">ຜູ້ເບິ່ງແຍງລະບົບຂອງອຸປະກອນນີ້ໄດ້ສົ່ງຂໍ້ມູນຈຳນວນໜຶ່ງໄປໃຫ້ເວັບໄຊຕໍ່ໄປນີ້ແລ້ວ ເຊັ່ນ: ການຕັ້ງຄ່າ ຫຼື ນະໂຍບາຍ.</translation> <translation id="817820454357658398">ຜະລິດຕະພັນສຸຂະອະນາໄມສຳລັບຜູ້ຍິງ</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />ລະບົບຈະແບ່ງປັນເນື້ອຫາຈາກໜ້າຈ່າຍເງິນກັບ Google ເພື່ອສະເໜີຕົວເລືອກເຫຼົ່ານີ້.<ph name="END_BOLD" /> ແພັກເກດການຈ່າຍເງິນຂຶ້ນຢູ່ກັບການມີສິດ. ເພື່ອເຊື່ອງຕົວເລືອກຈ່າຍພາຍຫຼັງ, ໃຫ້ເຂົ້າໄປ <ph name="BEGIN_LINK" />ການຕັ້ງຄ່າການຈ່າຍເງິນ<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> ຖືກບລັອກເນື່ອງຈາກເນື້ອຫາ}other{<ph name="FILE_COUNT" /> ໄຟລ໌ຖືກບລັອກເນື່ອງຈາກເນື້ອຫາ}}</translation> <translation id="8183800802493617952">ເກມ ແລະ ກິດຈະກຳສຳລັບຄອບຄົວ</translation> <translation id="8184538546369750125">ໃຊ້ຄ່າມາດຕະຖານທົ່ວໂລກ (ອະນຸຍາດ)</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index 8dac0f10..b6bbd677 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -4570,6 +4570,7 @@ <translation id="8175796834047840627">„Chrome“ siūlo išsaugoti korteles „Google“ paskyroje, nes esate prisijungę. Šią elgseną galite pakeisti nustatymuose.</translation> <translation id="8176440868214972690">Šio įrenginio administratorius nusiuntė tam tikros informacijos, pvz., informacijos apie nustatymus ar politikos nuostatas, toliau nurodytoms svetainėms.</translation> <translation id="817820454357658398">Moteriški higienos produktai</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Turinys iš atsiskaitymo puslapio bendrinamas su „Google“, kad būtų galima pasiūlyti šias parinktis.<ph name="END_BOLD" /> Mokėjimo planai priklauso nuo tinkamumo. Jei norite paslėpti mokėjimo vėliau parinktis, eikite į <ph name="BEGIN_LINK" />mokėjimo nustatymus<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{Failas „<ph name="FILE_NAME" />“ užblokuotas dėl turinio}one{<ph name="FILE_COUNT" /> failas užblokuotas dėl turinio}few{<ph name="FILE_COUNT" /> failai užblokuoti dėl turinio}many{<ph name="FILE_COUNT" /> failo užblokuota dėl turinio}other{<ph name="FILE_COUNT" /> failų užblokuota dėl turinio}}</translation> <translation id="8183800802493617952">Šeimai skirti žaidimai ir veikla</translation> <translation id="8184538546369750125">Naudoti visuotinį numatytąjį nustatymą (leisti)</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index bfd3604..78005eda 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -4567,6 +4567,7 @@ <translation id="8175796834047840627">Pārlūkprogrammā Chrome tiek piedāvāts saglabāt jūsu kartes Google kontā, jo esat pierakstījies. Varat mainīt šo darbību iestatījumos.</translation> <translation id="8176440868214972690">Šīs ierīces administrators ir nosūtījis informāciju, piemēram, iestatījumus vai politikas, uz tālāk norādītajām vietnēm.</translation> <translation id="817820454357658398">Menstruālās higiēnas produkti</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Lai piedāvātu šīs iespējas, ar Google tiek kopīgots saturs no norēķināšanās lapas.<ph name="END_BOLD" /> Uz maksājumu plāniem attiecas piemērotības prasības. Lai paslēptu vēlākas maksāšanas iespējas, pārejiet uz <ph name="BEGIN_LINK" />maksājumu iestatījumiem<ph name="END_LINK" />.</translation> <translation id="818254048113802060">{0,plural, =1{Fails “<ph name="FILE_NAME" />” tika bloķēts satura dēļ}zero{<ph name="FILE_COUNT" /> faili tika bloķēti satura dēļ}one{<ph name="FILE_COUNT" /> fails tika bloķēts satura dēļ}other{<ph name="FILE_COUNT" /> faili tika bloķēti satura dēļ}}</translation> <translation id="8183800802493617952">Ģimenei paredzētas spēles un aktivitātes</translation> <translation id="8184538546369750125">Izmantot globālo noklusējumu (Atļaut)</translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb index adf2b39a..e711aaf 100644 --- a/components/strings/components_strings_mk.xtb +++ b/components/strings/components_strings_mk.xtb
@@ -4568,6 +4568,7 @@ <translation id="8175796834047840627">Chrome нуди да ви ги зачува картичките во вашата сметка на Google бидејќи сте најавени. Ваквото однесување може да го смените во поставки.</translation> <translation id="8176440868214972690">Администраторот на уредов испратил одредени информации на следниве веб-сајтови, како поставки или правила.</translation> <translation id="817820454357658398">Производи за хигиена за жени</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Содржините од страницата за наплата се споделуваат со Google за да се понудат опцииве.<ph name="END_BOLD" /> Тарифните пакети зависат од подобноста. За да ги скриете опциите за „Платете подоцна“, одете во <ph name="BEGIN_LINK" />поставките за плаќање<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{Датотеката <ph name="FILE_NAME" /> е блокирана поради содржини}one{<ph name="FILE_COUNT" /> датотека се блокирани поради содржини}other{<ph name="FILE_COUNT" /> датотеки се блокирани поради содржини}}</translation> <translation id="8183800802493617952">Игри и активности за семејства</translation> <translation id="8184538546369750125">Користи глобална стандардна поставка (Дозволи)</translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb index 3a5273f..00aa7089 100644 --- a/components/strings/components_strings_mn.xtb +++ b/components/strings/components_strings_mn.xtb
@@ -4568,6 +4568,7 @@ <translation id="8175796834047840627">Та нэвтэрсэн тул Chrome таны картыг таны Google Бүртгэлд хадгалахыг санал болгож байна. Та энэ ажиллах төлөвийг тохиргоонд өөрчилж болно.</translation> <translation id="8176440868214972690">Энэ төхөөрөмжийн администратор дараах вебсайтууд руу тохиргоо эсвэл бодлого зэрэг зарим мэдээллийг илгээсэн.</translation> <translation id="817820454357658398">Эмэгтэйчүүдийн эрүүл ахуйн бүтээгдэхүүнүүд</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Эдгээр сонголтыг санал болгохын тулд тооцоо хийх хуудасны агуулгыг Google-тэй хуваалцдаг.<ph name="END_BOLD" /> Төлбөрийн төлөвлөгөө нь зохих эрхтэй эсэхээс хамаарна. Дараа төлөх сонголтуудыг нуухын тулд <ph name="BEGIN_LINK" />төлбөрийн тохиргоо<ph name="END_LINK" /> руу очно уу</translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" />-г контентын улмаас блоклосон}other{<ph name="FILE_COUNT" /> файлыг контентын улмаас блоклосон}}</translation> <translation id="8183800802493617952">Гэр бүлд чиглэсэн тоглоом болон үйл ажиллагаанууд</translation> <translation id="8184538546369750125">Ерөнхий анхдагч хэлбэрийг ашиглах (зөвшөөрөх)</translation>
diff --git a/components/strings/components_strings_my.xtb b/components/strings/components_strings_my.xtb index bf8a559c..25a8e82 100644 --- a/components/strings/components_strings_my.xtb +++ b/components/strings/components_strings_my.xtb
@@ -4570,6 +4570,7 @@ <translation id="8175796834047840627">လက်မှတ်ထိုးဝင်ထားသဖြင့် သင်၏ ကတ်များကို သင့် Google အကောင့်တွင် သိမ်းရန် Chrome က ကမ်းလှမ်းထားပါသည်။ ဤလုပ်ဆောင်ပုံကို ဆက်တင်များတွင် ပြောင်းနိုင်သည်။</translation> <translation id="8176440868214972690">ဤစက်စီမံခန့်ခွဲသူသည် ဆက်တင်များ (သို့) မူဝါဒများကဲ့သို့ အချက်အလက်အချို့ကို အောက်ပါဝဘ်ဆိုက်များသို့ ပို့လိုက်သည်။</translation> <translation id="817820454357658398">အမျိုးသမီးသုံး တစ်ကိုယ်ရေသန့်ရှင်းရေး ထုတ်ကုန်</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />ဤရွေးစရာများကို ကမ်းလှမ်းရန်အတွက် ငွေရှင်းရန်စာမျက်နှာမှ အကြောင်းအရာကို Google နှင့် မျှဝေထားသည်။<ph name="END_BOLD" /> ငွေပေးချေမှုအစီအစဉ်များသည် သတ်မှတ်ချက်ပြည့်မီမှုပေါ် မူတည်သည်။ ‘နောက်မှပေး’ ရွေးစရာကို ဖျောက်ရန် <ph name="BEGIN_LINK" />ငွေပေးချေမှု ဆက်တင်များ<ph name="END_LINK" /> သို့ သွားပါ</translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> ကို အကြောင်းအရာကြောင့် ပိတ်ထားသည်}other{ဖိုင် <ph name="FILE_COUNT" /> ဖိုင်ကို အကြောင်းအရာကြောင့် ပိတ်ထားသည်}}</translation> <translation id="8183800802493617952">မိသားစုအတွက်စီစဉ်ထားသော ဂိမ်းနှင့် လှုပ်ရှားမှု</translation> <translation id="8184538546369750125">အထွေထွေ ပုံသေကို သုံးရန် (ခွင့်ပြုရန်)</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb index ab9816b..462a799 100644 --- a/components/strings/components_strings_ne.xtb +++ b/components/strings/components_strings_ne.xtb
@@ -4566,6 +4566,7 @@ <translation id="8175796834047840627">तपाईं साइन इन हुनुभएकाले Chrome ले तपाईंको Google खातामा तपाईंका कार्डहरू सुरक्षित गरिदिने प्रस्ताव गर्दै छ। तपाईं सेटिङहरूमा गई उक्त व्यवहार परिवर्तन गर्न सक्नुहुन्छ।</translation> <translation id="8176440868214972690">यो डिभाइसका एड्मिनले निम्न वेबसाइटहरूमा सेटिङ वा नीतिहरू जस्ता केही जानकारी पठाउनुभएको छ।</translation> <translation id="817820454357658398">महिलालाई सफा रहन सघाउने उत्पादनहरू</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />यी विकल्पहरू उपलब्ध गराउन चेकआउट पेजमा भएको कन्टेन्ट Google सँग सेयर गरिन्छ।<ph name="END_BOLD" /> तपाईंको योग्यताका आधारमा भुक्तानी योजनाहरू उपलब्ध हुने छन्। पछि भुक्तानी गर्ने विकल्पहरू लुकाउन <ph name="BEGIN_LINK" />भुक्तानीसम्बन्धी सेटिङ<ph name="END_LINK" />मा जानुहोस्</translation> <translation id="818254048113802060">{0,plural, =1{सामग्रीका कारण <ph name="FILE_NAME" /> लाई रोक गरिएको छ}other{सामग्रीका कारण <ph name="FILE_COUNT" /> वटा फाइललाई रोक लगाइएको छ}}</translation> <translation id="8183800802493617952">पारिवारिक खेल तथा गतिविधि</translation> <translation id="8184538546369750125">विश्वव्यापी डिफल्ट प्रयोग गर्नुहोस् (अनुमति दिनुहोस्)</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index 3e515117..4b45ba4 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -3286,7 +3286,7 @@ <translation id="6177531123306197852">Envelop C2</translation> <translation id="6180316780098470077">Interval voor nieuwe poging</translation> <translation id="6182972682129119950">A4x5</translation> -<translation id="6184099524311454384">Tabbladen doorzoeken</translation> +<translation id="6184099524311454384">Tabbladen zoeken</translation> <translation id="6189351761800074311">Je tekst en paginacontent worden naar Google gestuurd, maar worden niet gebruikt om AI te verbeteren. <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation> <translation id="6190518157737269631">Sommige toetsen op je toetsenbord overschrijven, zoals Esc</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index 3ba5bbc..5c342c46 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -4568,6 +4568,7 @@ <translation id="8175796834047840627">Chrome tilbyr å lagre kort i Google-kontoen din fordi du er logget på. Du kan endre dette i innstillingene.</translation> <translation id="8176440868214972690">Enhetsadministratoren har sendt noe informasjon til de følgende nettstedene, for eksempel innstillinger eller retningslinjer.</translation> <translation id="817820454357658398">Feminine hygieneprodukter</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Innhold fra betalingssiden deles med Google for å tilby disse alternativene.<ph name="END_BOLD" /> Betalingsavtaler er avhengig av kvalifikasjon. Gå til <ph name="BEGIN_LINK" />betalingsinnstillingene<ph name="END_LINK" /> for å skjule alternativene for å betale senere.</translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> er blokkert på grunn av innholdet}other{<ph name="FILE_COUNT" /> filer er blokkert på grunn av innholdet}}</translation> <translation id="8183800802493617952">Familievennlige spill og aktiviteter</translation> <translation id="8184538546369750125">Bruk global standardinnstilling (Tillat)</translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb index c44ada9e..da17e92 100644 --- a/components/strings/components_strings_pa.xtb +++ b/components/strings/components_strings_pa.xtb
@@ -4564,6 +4564,7 @@ <translation id="8175796834047840627">ਤੁਹਾਡੇ ਸਾਈਨ-ਇਨ ਹੋਣ ਕਰਕੇ Chrome ਤੁਹਾਡੇ ਕਾਰਡਾਂ ਨੂੰ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਕਰਨ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰ ਰਿਹਾ ਹੈ। ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਇਸ ਵਤੀਰੇ ਨੂੰ ਬਦਲ ਸਕਦੇ ਹੋ।</translation> <translation id="8176440868214972690">ਇਸ ਡੀਵਾਈਸ ਦੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ ਅੱਗੇ ਦਿੱਤੀਆਂ ਵੈੱਬਸਾਈਟਾਂ ਨੂੰ ਕੁਝ ਜਾਣਕਾਰੀ ਭੇਜੀ ਹੈ, ਜਿਵੇਂ ਸੈਟਿੰਗਾਂ ਜਾਂ ਨੀਤੀਆਂ।</translation> <translation id="817820454357658398">ਔਰਤਾਂ ਨਾਲ ਸੰਬੰਧਿਤ ਸਿਹਤ ਸੰਬੰਧੀ ਉਤਪਾਦ</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />ਇਨ੍ਹਾਂ ਵਿਕਲਪਾਂ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰਨ ਲਈ ਚੈੱਕ-ਆਊਟ ਪੰਨੇ ਦੀ ਸਮੱਗਰੀ Google ਨਾਲ ਸਾਂਝੀ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।<ph name="END_BOLD" /> ਭੁਗਤਾਨ ਪਲਾਨ ਯੋਗਤਾ ਦੇ ਅਧੀਨ ਹੁੰਦੇ ਹਨ। ਬਾਅਦ ਵਿੱਚ ਭੁਗਤਾਨ ਕਰਨ ਸੰਬੰਧੀ ਵਿਕਲਪ ਲੁਕਾਉਣ ਲਈ, <ph name="BEGIN_LINK" />ਭੁਗਤਾਨ ਸੈਟਿੰਗਾਂ<ph name="END_LINK" /> 'ਤੇ ਜਾਓ</translation> <translation id="818254048113802060">{0,plural, =1{ਸਮੱਗਰੀ ਦੇ ਕਾਰਨ <ph name="FILE_NAME" /> ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ}one{ਸਮੱਗਰੀ ਦੇ ਕਾਰਨ <ph name="FILE_COUNT" /> ਫ਼ਾਈਲ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ}other{ਸਮੱਗਰੀ ਦੇ ਕਾਰਨ <ph name="FILE_COUNT" /> ਫ਼ਾਈਲਾਂ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ}}</translation> <translation id="8183800802493617952">ਪਰਿਵਾਰ-ਸੰਬੰਧੀ ਗੇਮਾਂ ਅਤੇ ਸਰਗਰਮੀਆਂ</translation> <translation id="8184538546369750125">ਗਲੋਬਲ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਸੈਟਿੰਗ ਵਰਤੋ (ਇਜਾਜ਼ਤ ਦਿਓ)</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index b35f0cf..bfe086c 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -3377,6 +3377,7 @@ <translation id="6326947323444967009">Defina o Chrome como o navegador predefinido do sistema nas definições do iOS</translation> <translation id="6327065120806001832">acesso à rede local</translation> <translation id="6328639280570009161">Tente desativar a previsão de rede</translation> +<translation id="6329742260390895689">Para preencher automaticamente as suas informações, ative a opção "Usar passes na rede Google" nas definições da Carteira</translation> <translation id="6329815962353376655"><Escreva uma pergunta></translation> <translation id="6331597954316706229">Para receber as respostas mais personalizadas, permita que todas as discussões façam referência aos seus separadores abertos relevantes.</translation> <translation id="633348045801643466">Apresente opções para <ph name="PAY_LATER_OPTIONS_HELP_LINK_BEGIN" />pagar depois<ph name="PAY_LATER_OPTIONS_HELP_LINK_END" /> no ato do pagamento</translation> @@ -3464,6 +3465,7 @@ <translation id="6436994298828707228">A ligação está bloqueada porque foi iniciada por uma página pública para estabelecer ligação a dispositivos ou servidores na sua rede local.</translation> <translation id="6437647869369934905">Desenhos do Google</translation> <translation id="643917412048333145">Vestidos</translation> +<translation id="6440450906295708112">Origem das variações</translation> <translation id="6440503408713884761">Ignorado</translation> <translation id="6443406338865242315">As extensões e os plug-ins que instalou.</translation> <translation id="6444329331928531170">Reforma e pensões</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index e27b738..e4051ad 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -4569,6 +4569,7 @@ <translation id="8175796834047840627">Chrome oferă salvarea cardurilor în Contul Google pentru că te-ai conectat. Poți schimba acest comportament în setări.</translation> <translation id="8176440868214972690">Administratorul dispozitivului a trimis câteva informații următoarelor site-uri, cum ar fi setări sau politici.</translation> <translation id="817820454357658398">Produse de igienă feminină</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Conținutul paginii de finalizare a achiziției este trimis la Google pentru a oferi aceste opțiuni.<ph name="END_BOLD" /> Planurile de plată se supun condițiilor de eligibilitate. Pentru a ascunde opțiunile de plată mai târziu, accesează <ph name="BEGIN_LINK" />setările pentru plăți<ph name="END_LINK" />.</translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> a fost blocat din cauza conținutului}few{<ph name="FILE_COUNT" /> fișiere au fost blocate din cauza conținutului}other{<ph name="FILE_COUNT" /> de fișiere au fost blocate din cauza conținutului}}</translation> <translation id="8183800802493617952">Jocuri și activități pentru întreaga familie</translation> <translation id="8184538546369750125">Utilizați setarea prestabilită la nivel global (Permiteți)</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index c9569f05..9564de5 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -4568,6 +4568,7 @@ <translation id="8175796834047840627">Chrome предлагает вам сохранить карты в аккаунте Google, поскольку вы вошли в систему. Этот параметр можно изменить в разделе настроек.</translation> <translation id="8176440868214972690">Администратор устройства отправил на следующие веб-сайты некоторые данные, такие как настройки и правила.</translation> <translation id="817820454357658398">Предметы женской гигиены</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Для показа этих вариантов данные о контенте на странице покупки передаются в Google.<ph name="END_BOLD" /> Платежи в рассрочку доступны при соответствии требованиям. Чтобы скрыть варианты оплаты в рассрочку, перейдите в <ph name="BEGIN_LINK" />платежные настройки<ph name="END_LINK" />.</translation> <translation id="818254048113802060">{0,plural, =1{Файл "<ph name="FILE_NAME" />" заблокирован из-за его содержания}one{<ph name="FILE_COUNT" /> файл заблокирован из-за их содержания}few{<ph name="FILE_COUNT" /> файла заблокированы из-за их содержания}many{<ph name="FILE_COUNT" /> файлов заблокированы из-за их содержания}other{<ph name="FILE_COUNT" /> файла заблокировано из-за содержания}}</translation> <translation id="8183800802493617952">Семейные игры и развлечения</translation> <translation id="8184538546369750125">Использовать глобальный параметр по умолчанию (разрешать)</translation>
diff --git a/components/strings/components_strings_si.xtb b/components/strings/components_strings_si.xtb index 80776b7e..14efaa9c 100644 --- a/components/strings/components_strings_si.xtb +++ b/components/strings/components_strings_si.xtb
@@ -4568,6 +4568,7 @@ <translation id="8175796834047840627">ඔබ පුරනය වී සිටින බැවින් Chrome ඔබට ඔබේ කාඩ්පත් ඔබේ Google ගිණුමට සුරැකීම පිරිනමයි. ඔබට මෙම හැසිරීම සැකසීම් තුළ වෙනස් කළ හැක.</translation> <translation id="8176440868214972690">සැකසීම් හෝ ප්රතිපත්ති වැනි, පහත සඳහන් වෙබ් අඩවි වෙත මෙම උපාංගයේ පරිපාලක යම් තොරතුරු යවා ඇත.</translation> <translation id="817820454357658398">කාන්තා සනීපාරක්ෂක නිෂ්පාදන</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />මෙම විකල්ප පිරිනැමීමට ගෙවා පිටවීමේ පිටුවෙන් අන්තර්ගතය Google සමග බෙදා ගනු ලැබේ.<ph name="END_BOLD" /> ගෙවීම් සැලසුම් සුදුසුකම් ලැබීමට යටත් වේ. පසුව ගෙවීමේ විකල්ප සැඟවීමට, <ph name="BEGIN_LINK" />ගෙවීම් සැකසීම්<ph name="END_LINK" /> වෙත යන්න</translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> අන්තර්ගතය නිසා අවහිර කරන ලදි}one{ගොනු <ph name="FILE_COUNT" />ක් අන්තර්ගතය නිසා අවහිර කරන ලදි}other{ගොනු <ph name="FILE_COUNT" />ක් අන්තර්ගතය නිසා අවහිර කරන ලදි}}</translation> <translation id="8183800802493617952">පවුල්-සම්බන්ධිත ක්රීඩා සහ ක්රියාකාරකම්</translation> <translation id="8184538546369750125">ගෝලීය පෙරනිමිය භාවිතා කරන්න (අවසර)</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index d26d225..9de822a 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -4564,6 +4564,7 @@ <translation id="8175796834047840627">Chrome poskytuje možnosť uložiť karty v účte Google, pretože ste sa prihlásili. Toto správanie môžete zmeniť v nastaveniach.</translation> <translation id="8176440868214972690">Správca tohto zariadenia odoslal na nasledujúce weby nejaké informácie, napríklad nastavenia alebo pravidlá.</translation> <translation id="817820454357658398">Hygienické výrobky pre ženy</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Obsah stránky platby sa zdieľa s Googlom, aby sa vám mohli ponúkať tieto možnosti.<ph name="END_BOLD" /> Ak chcete používať platobné tarify, musíte spĺňať príslušné podmienky. Ak chcete možnosti zaplatenia neskôr skryť, prejdite do <ph name="BEGIN_LINK" />nastavení platieb<ph name="END_LINK" />.</translation> <translation id="818254048113802060">{0,plural, =1{Súbor <ph name="FILE_NAME" /> bol zablokovaný na základe obsahu}few{<ph name="FILE_COUNT" /> súbory boli zablokované na základe obsahu}many{<ph name="FILE_COUNT" /> files were blocked because of content}other{<ph name="FILE_COUNT" /> súborov bolo zablokovaných na základe obsahu}}</translation> <translation id="8183800802493617952">Rodinné hry a aktivity</translation> <translation id="8184538546369750125">Použiť predvolené všeobecné nastavenie (Povoliť)</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index cc33abd..c761ed0b 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -4569,6 +4569,7 @@ <translation id="8175796834047840627">Chrome ponuja shranjevanje kartic v račun Google, ker ste prijavljeni. To lahko spremenite v nastavitvah.</translation> <translation id="8176440868214972690">Skrbnik te naprave je poslal nekatere podatke, kot so nastavitve ali pravilniki, na ta spletna mesta.</translation> <translation id="817820454357658398">Izdelki za žensko intimno nego</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Vsebina s strani za zaključek nakupa se deli z Googlom, da je mogoče ponuditi te možnosti.<ph name="END_BOLD" /> Plačilni paketi so odvisni od primernosti. Če želite skriti možnosti poznejšega plačila, odprite <ph name="BEGIN_LINK" />nastavitve plačil<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{Datoteka <ph name="FILE_NAME" /> je bila blokirana zaradi vsebine}one{<ph name="FILE_COUNT" /> datoteka je bila blokirana zaradi vsebine}two{<ph name="FILE_COUNT" /> datoteki sta bili blokirani zaradi vsebine}few{<ph name="FILE_COUNT" /> datoteke so bile blokirane zaradi vsebine}other{<ph name="FILE_COUNT" /> datotek je bilo blokiranih zaradi vsebine}}</translation> <translation id="8183800802493617952">Družinske igre in dejavnosti</translation> <translation id="8184538546369750125">Uporabi globalno privzeto (Dovoli)</translation>
diff --git a/components/strings/components_strings_sq.xtb b/components/strings/components_strings_sq.xtb index e3e66b5..890ba836 100644 --- a/components/strings/components_strings_sq.xtb +++ b/components/strings/components_strings_sq.xtb
@@ -4567,6 +4567,7 @@ <translation id="8175796834047840627">Chrome po ofron që të ruash kartat e tua në "Llogarinë tënde të Google" sepse je identifikuar. Mund ta ndryshosh këtë sjellje te cilësimet.</translation> <translation id="8176440868214972690">Administratori i kësaj pajisjeje ka dërguar disa informacione te sajtet e mëposhtme të uebit, si p.sh. cilësime ose politika.</translation> <translation id="817820454357658398">Produkte të higjienës për femrat</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Përmbajtja nga faqja e përfundimit të blerjes ndahet me Google për të ofruar këto opsione.<ph name="END_BOLD" /> Planet e pagesave janë objekt i kualifikueshmërisë. Për të fshehur opsionet e "Paguaj më vonë", shko te <ph name="BEGIN_LINK" />cilësimet e pagesës<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> është bllokuar për shkak të përmbajtjes}other{<ph name="FILE_COUNT" /> skedarë janë bllokuar për shkak të përmbajtjes}}</translation> <translation id="8183800802493617952">Lojëra dhe aktivitete për familjen</translation> <translation id="8184538546369750125">Përdor parazgjedhjen globale (Lejo)</translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb index 076b4a0d..eb3ca5fd 100644 --- a/components/strings/components_strings_sr-Latn.xtb +++ b/components/strings/components_strings_sr-Latn.xtb
@@ -4568,6 +4568,7 @@ <translation id="8175796834047840627">Chrome vam nudi čuvanje kartica na Google nalogu zato što ste prijavljeni. To možete da promenite u podešavanjima.</translation> <translation id="8176440868214972690">Administrator ovog uređaja je poslao određene podatke sledećim veb-sajtovima, poput podešavanja ili smernica.</translation> <translation id="817820454357658398">Proizvodi za žensku higijenu</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Sadržaj sa stranice za plaćanje deli se sa Google-om da bi Google pružao ove opcije<ph name="END_BOLD" />. Planovi plaćanja podležu uslovima. Da biste sakrili opcije za kasnije plaćanje, idite u <ph name="BEGIN_LINK" />podešavanja plaćanja<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{Fajl <ph name="FILE_NAME" /> je blokiran zbog sadržaja}one{<ph name="FILE_COUNT" /> fajl je blokiran zbog sadržaja}few{<ph name="FILE_COUNT" /> fajla su blokirana zbog sadržaja}other{<ph name="FILE_COUNT" /> fajlova je blokirano zbog sadržaja}}</translation> <translation id="8183800802493617952">Porodične igre i aktivnosti</translation> <translation id="8184538546369750125">Koristi globalnu podrazumevanu vrednost (Dozvoli)</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index 5b69443d..d93bd5e 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -4568,6 +4568,7 @@ <translation id="8175796834047840627">Chrome вам нуди чување картица на Google налогу зато што сте пријављени. То можете да промените у подешавањима.</translation> <translation id="8176440868214972690">Администратор овог уређаја је послао одређене податке следећим веб-сајтовима, попут подешавања или смерница.</translation> <translation id="817820454357658398">Производи за женску хигијену</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Садржај са странице за плаћање дели се са Google-ом да би Google пружао ове опције<ph name="END_BOLD" />. Планови плаћања подлежу условима. Да бисте сакрили опције за касније плаћање, идите у <ph name="BEGIN_LINK" />подешавања плаћања<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{Фајл <ph name="FILE_NAME" /> је блокиран због садржаја}one{<ph name="FILE_COUNT" /> фајл је блокиран због садржаја}few{<ph name="FILE_COUNT" /> фајла су блокирана због садржаја}other{<ph name="FILE_COUNT" /> фајлова је блокирано због садржаја}}</translation> <translation id="8183800802493617952">Породичне игре и активности</translation> <translation id="8184538546369750125">Користи глобалну подразумевану вредност (Дозволи)</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index 1243f63..758e3df 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -4569,6 +4569,7 @@ <translation id="8175796834047840627">Du erbjuds av Chrome att spara dina kort i Google-kontot eftersom du är inloggad. Du kan ändra detta i inställningarna.</translation> <translation id="8176440868214972690">Administratören för enheten har skickat en del information, t.ex. inställningar eller principer, till följande webbplatser.</translation> <translation id="817820454357658398">Hygienprodukter för kvinnor</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Innehåll från kassasidan delas med Google för att erbjuda dessa alternativ.<ph name="END_BOLD" /> Kvalificering krävs för betalningsplaner. Gå till <ph name="BEGIN_LINK" />betalningsinställningarna<ph name="END_LINK" /> om du vill dölja alternativen för att betala senare.</translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> har blockerats på grund av innehåll}other{<ph name="FILE_COUNT" /> filer har blockerats på grund av innehåll}}</translation> <translation id="8183800802493617952">Familjevänliga spel och aktiviteter</translation> <translation id="8184538546369750125">Använd global standardinställning (Tillåt)</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index 19ec874..04875847 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -4567,6 +4567,7 @@ <translation id="8175796834047840627">Chrome ina huduma ya kuhifadhi kadi zako kwenye Akaunti yako ya Google kwa sababu umeingia katika akaunti. Unaweza kubadilisha hali hii katika mipangilio.</translation> <translation id="8176440868214972690">Msimamizi wa kifaa hiki ametuma maelezo fulani kwenye tovuti zifuatazo, kama vile mipangilio au sera.</translation> <translation id="817820454357658398">Bidhaa za Usafi wa Wanawake</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Google itaruhusiwa ifikie maudhui kwenye ukurasa wa kulipa ili kuweka chaguo hizi.<ph name="END_BOLD" /> Mipango ya malipo inategemea kutimiza masharti. Nenda kwenye <ph name="BEGIN_LINK" />mipangilio ya malipo<ph name="END_LINK" /> ili ufiche chaguo za kulipa baadaye</translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> ilizuiwa kwa sababu ya maudhui}other{Faili <ph name="FILE_COUNT" /> zilizuiwa kwa sababu ya maudhui}}</translation> <translation id="8183800802493617952">Michezo na Shughuli Zinazolenga Familia</translation> <translation id="8184538546369750125">Tumia chaguomsingi la duniani (Ruhusu)</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index e24dd1c..ce9ecb73 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -4568,6 +4568,7 @@ <translation id="8175796834047840627">Chrome เสนอที่จะบันทึกบัตรลงในบัญชี Google ของคุณเพราะคุณลงชื่อเข้าใช้อยู่ คุณปรับเปลี่ยนลักษณะการทำงานนี้ได้ในการตั้งค่า</translation> <translation id="8176440868214972690">ผู้ดูแลระบบของอุปกรณ์นี้ได้ส่งข้อมูลบางอย่าง เช่น การตั้งค่าหรือนโยบายไปยังเว็บไซต์ต่อไปนี้</translation> <translation id="817820454357658398">ผลิตภัณฑ์เพื่อสุขอนามัยของผู้หญิง</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />ระบบจะแชร์เนื้อหาจากหน้าชำระเงินกับ Google เพื่อเสนอตัวเลือกเหล่านี้<ph name="END_BOLD" /> แพ็กเกจการชำระเงินขึ้นอยู่กับสิทธิ์ หากต้องการซ่อนตัวเลือกการชำระเงินภายหลัง ให้ไปที่<ph name="BEGIN_LINK" />การตั้งค่าการชำระเงิน<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> ถูกบล็อกเนื่องจากเนื้อหา}other{ไฟล์ <ph name="FILE_COUNT" /> รายการถูกบล็อกเนื่องจากเนื้อหา}}</translation> <translation id="8183800802493617952">เกมและกิจกรรมสำหรับครอบครัว</translation> <translation id="8184538546369750125">ใช้ค่าเริ่มต้นสากล (อนุญาต)</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index 2f0e524..d66f9f4 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -4569,6 +4569,7 @@ <translation id="8175796834047840627">Chrome, oturumunuz açık olduğu için kartlarınızı Google Hesabınıza kaydetmeyi öneriyor. Bu davranışı ayarlardan değiştirebilirsiniz.</translation> <translation id="8176440868214972690">Bu cihazın yöneticisi, aşağıdaki web sitelerine ayarlar ve politikalar gibi bazı bilgiler gönderdi.</translation> <translation id="817820454357658398">Kadın Hijyen Ürünleri</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Bu seçenekleri sunmak için ödeme sayfasındaki sayfa içeriği Google ile paylaşılır.<ph name="END_BOLD" /> Ödeme planları, uygunluk durumuna bağlıdır. Sonra ödeme seçeneklerini gizlemek için <ph name="BEGIN_LINK" />ödeme ayarlarına<ph name="END_LINK" /> gidin.</translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" />, içerik nedeniyle engellendi}other{<ph name="FILE_COUNT" /> dosya, içerik nedeniyle engellendi}}</translation> <translation id="8183800802493617952">Aileye Yönelik Oyunlar ve Etkinlikler</translation> <translation id="8184538546369750125">Genel varsayılanı kullan (İzin ver)</translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb index d2c7e45..31ca50e 100644 --- a/components/strings/components_strings_ur.xtb +++ b/components/strings/components_strings_ur.xtb
@@ -4570,6 +4570,7 @@ <translation id="8175796834047840627">آپ کے سائن ان ہونے کی وجہ سے Chrome آپ کے کارڈز کو آپ کے Google اکاؤنٹ میں محفوظ کرنے کی پیشکش کر رہا ہے۔ آپ اس برتاؤ کو ترتیبات میں تبدیل کر سکتے ہیں۔</translation> <translation id="8176440868214972690">اس آلہ کے منتظم نے کچھ معلومات جیسے ترتیبات یا پالیسیاں درج ذیل ویب سائٹ پر بھیجی ہیں۔</translation> <translation id="817820454357658398">نسوانی صفائی ستھرائی کے پروڈکٹس</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />ان اختیارات کی پیشکش کرنے کیلئے، چیک آؤٹ صفحے سے صفحے کے مواد کا اشتراک Google کے ساتھ کیا جاتا ہے۔<ph name="END_BOLD" /> ادائیگی کے پلانز اہلیت کے ساتھ مشروط ہیں۔ بعد میں ادائیگی کے اختیارات کو چھپانے کے لیے، <ph name="BEGIN_LINK" />ادائیگی کی ترتیبات<ph name="END_LINK" /> پر جائیں</translation> <translation id="818254048113802060">{0,plural, =1{<ph name="FILE_NAME" /> کو مواد کی وجہ سے بلاک کر دیا گیا}other{<ph name="FILE_COUNT" /> فائلز کو مواد کی وجہ سے بلاک کر دیا گیا}}</translation> <translation id="8183800802493617952">فیملی کے لحاظ سے مناسب گیمز اور سرگرمیاں</translation> <translation id="8184538546369750125">عالمی ڈیفالٹ استعمال کریں (اجازت دیں)</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index 89f251b..94ecd0491 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -4564,6 +4564,7 @@ <translation id="8175796834047840627">Chrome 会主动询问是否要将您的卡保存到您的 Google 账号中,因为您已登录。您可在“设置”中更改此行为。</translation> <translation id="8176440868214972690">此设备的管理员已将某些信息(例如设置或政策)发送给下列网站。</translation> <translation id="817820454357658398">女性卫生产品</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />系统会将结账页中的内容分享给 Google,以便提供这些选项。<ph name="END_BOLD" />付款方案需满足资格要求。如要隐藏先买后付选项,请前往<ph name="BEGIN_LINK" />支付设置<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{由于内容原因,<ph name="FILE_NAME" /> 已被屏蔽}other{由于内容原因,<ph name="FILE_COUNT" /> 个文件已被屏蔽}}</translation> <translation id="8183800802493617952">面向家庭的游戏和活动</translation> <translation id="8184538546369750125">使用全局默认设置(允许)</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index 9f4de913..392f6ba3 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -4567,6 +4567,7 @@ <translation id="8175796834047840627">你已登入帳戶,因此 Chrome 詢問你是否要將卡片儲存至你的 Google 帳戶。你可以在設定中變更這項行為。</translation> <translation id="8176440868214972690">這部裝置的管理員已將一些資訊 (例如設定或政策) 傳送到下列網站。</translation> <translation id="817820454357658398">女性衛生產品</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />系統會將結帳頁面的內容分享給 Google,以便提供這些選項。<ph name="END_BOLD" />付款方案須符合資格條件。如要隱藏「先買後付」選項,請前往<ph name="BEGIN_LINK" />付款設定<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{「<ph name="FILE_NAME" />」因內容而遭封鎖}other{這 <ph name="FILE_COUNT" /> 個檔案因內容而遭封鎖}}</translation> <translation id="8183800802493617952">適合家庭的遊戲和活動</translation> <translation id="8184538546369750125">使用全域預設值 (允許)</translation>
diff --git a/components/strings/components_strings_zu.xtb b/components/strings/components_strings_zu.xtb index bb16479..5ccc389 100644 --- a/components/strings/components_strings_zu.xtb +++ b/components/strings/components_strings_zu.xtb
@@ -4565,6 +4565,7 @@ <translation id="8175796834047840627">I-Chrome inikezela ngokulondoloza amakhadi akho ku-akhawunti yakho ye-Google ngoba ungene ngemvume. Ungashintsha lokhu kuziphatha kuzilungiselelo.</translation> <translation id="8176440868214972690">Umlawuli wale divayisi uthumele ulwazi kumawebhusayithi alandelayo, njengamasethingi noma izinqumbomgomo.</translation> <translation id="817820454357658398">Imikhiqizo Yenhlanzeko Yabesifazane</translation> +<translation id="8182470873445638343"><ph name="BEGIN_BOLD" />Ikhontenti evela ekhasini lokuphuma yabelwa iGoogle ukuze inikeze lokhu okungakhethwa kukho.<ph name="END_BOLD" /> Izinhlelo zokukhokha zingaphansi kokufaneleka. Ukuze ufihle okungakhethwa kukho kokukhokha kamuva, iya <ph name="BEGIN_LINK" />kumasethingi okukhokha<ph name="END_LINK" /></translation> <translation id="818254048113802060">{0,plural, =1{I-<ph name="FILE_NAME" /> ivinjiwe ngenxa yokuqukethwe}one{Amafayela angu-<ph name="FILE_COUNT" /> avinjiwe ngenxa yokuqukethwe}other{Amafayela angu-<ph name="FILE_COUNT" /> avinjiwe ngenxa yokuqukethwe}}</translation> <translation id="8183800802493617952">Amageyimu Nemisebenzi Esuselwe Emndenini</translation> <translation id="8184538546369750125">Sebenzisa komhlaba okuzenzakalelayo (Vumela)</translation>
diff --git a/components/sync/model/data_type_store.h b/components/sync/model/data_type_store.h index 56fd413b..ec5c5c4 100644 --- a/components/sync/model/data_type_store.h +++ b/components/sync/model/data_type_store.h
@@ -95,8 +95,17 @@ CallbackWithResult completion_on_frontend_sequence_callback) = 0; // Creates write batch for write operations. + // Deprecated: use CreateWriteBatch with metadata changes instead where + // possible. + // TODO(crbug.com/469455164): remove this method once all callers are + // migrated. virtual std::unique_ptr<WriteBatch> CreateWriteBatch() = 0; + // Creates write batch for write operations with metadata changes. If + // `metadata_change_list` is null, an empty metadata change list is created. + virtual std::unique_ptr<WriteBatch> CreateWriteBatch( + std::unique_ptr<MetadataChangeList> metadata_change_list) = 0; + // Commits write operations accumulated in write batch. If write operation // fails result is UNSPECIFIED_ERROR and write operations will not be // reflected in the store.
diff --git a/components/sync/model/data_type_store_impl.cc b/components/sync/model/data_type_store_impl.cc index cc7f35e..875702b8 100644 --- a/components/sync/model/data_type_store_impl.cc +++ b/components/sync/model/data_type_store_impl.cc
@@ -233,6 +233,17 @@ return BlockingDataTypeStoreImpl::CreateWriteBatch(data_type_, storage_type_); } +std::unique_ptr<DataTypeStore::WriteBatch> DataTypeStoreImpl::CreateWriteBatch( + std::unique_ptr<MetadataChangeList> metadata_change_list) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + std::unique_ptr<DataTypeStore::WriteBatch> write_batch = + BlockingDataTypeStoreImpl::CreateWriteBatch(data_type_, storage_type_); + if (metadata_change_list) { + write_batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); + } + return write_batch; +} + void DataTypeStoreImpl::CommitWriteBatch( std::unique_ptr<WriteBatch> write_batch, CallbackWithResult callback) {
diff --git a/components/sync/model/data_type_store_impl.h b/components/sync/model/data_type_store_impl.h index 60f4275..8607db10 100644 --- a/components/sync/model/data_type_store_impl.h +++ b/components/sync/model/data_type_store_impl.h
@@ -47,6 +47,8 @@ PreprocessCallback preprocess_on_backend_sequence_callback, CallbackWithResult completion_on_frontend_sequence_callback) override; std::unique_ptr<WriteBatch> CreateWriteBatch() override; + std::unique_ptr<WriteBatch> CreateWriteBatch( + std::unique_ptr<MetadataChangeList> metadata_change_list) override; void CommitWriteBatch(std::unique_ptr<WriteBatch> write_batch, CallbackWithResult callback) override; void DeleteAllDataAndMetadata(CallbackWithResult callback) override;
diff --git a/components/sync/model/syncable_service_based_bridge.cc b/components/sync/model/syncable_service_based_bridge.cc index 58adec9..bcbbe80 100644 --- a/components/sync/model/syncable_service_based_bridge.cc +++ b/components/sync/model/syncable_service_based_bridge.cc
@@ -600,8 +600,8 @@ SyncChangeList SyncableServiceBasedBridge::StoreAndConvertRemoteChanges( std::unique_ptr<MetadataChangeList> initial_metadata_change_list, EntityChangeList input_entity_change_list) { - std::unique_ptr<DataTypeStore::WriteBatch> batch = store_->CreateWriteBatch(); - batch->TakeMetadataChangesFrom(std::move(initial_metadata_change_list)); + std::unique_ptr<DataTypeStore::WriteBatch> batch = + store_->CreateWriteBatch(std::move(initial_metadata_change_list)); SyncChangeList output_sync_change_list; output_sync_change_list.reserve(input_entity_change_list.size());
diff --git a/components/sync/protocol/proto_visitors.h b/components/sync/protocol/proto_visitors.h index 7d6d161..23523df 100644 --- a/components/sync/protocol/proto_visitors.h +++ b/components/sync/protocol/proto_visitors.h
@@ -1301,6 +1301,7 @@ VISIT_ENUM(color); VISIT(pinned_position); VISIT(bookmark_node_id); + VISIT(projects_position); } VISIT_PROTO_FIELDS(const sync_pb::SavedTabGroupTab& proto) {
diff --git a/components/sync/test/data_type_store_test_util.cc b/components/sync/test/data_type_store_test_util.cc index 136f165..82e4176 100644 --- a/components/sync/test/data_type_store_test_util.cc +++ b/components/sync/test/data_type_store_test_util.cc
@@ -58,6 +58,11 @@ return other_->CreateWriteBatch(); } + std::unique_ptr<WriteBatch> CreateWriteBatch( + std::unique_ptr<MetadataChangeList> metadata_change_list) override { + return other_->CreateWriteBatch(std::move(metadata_change_list)); + } + void CommitWriteBatch(std::unique_ptr<WriteBatch> write_batch, CallbackWithResult callback) override { other_->CommitWriteBatch(std::move(write_batch), std::move(callback));
diff --git a/components/sync/test/mock_data_type_store.h b/components/sync/test/mock_data_type_store.h index 5198d66..26015f2 100644 --- a/components/sync/test/mock_data_type_store.h +++ b/components/sync/test/mock_data_type_store.h
@@ -36,6 +36,10 @@ CallbackWithResult completion_on_frontend_sequence_callback), (override)); MOCK_METHOD(std::unique_ptr<WriteBatch>, CreateWriteBatch, (), (override)); + MOCK_METHOD(std::unique_ptr<WriteBatch>, + CreateWriteBatch, + (std::unique_ptr<MetadataChangeList> metadata_change_list), + (override)); MOCK_METHOD(void, CommitWriteBatch, (std::unique_ptr<WriteBatch> write_batch,
diff --git a/components/sync_device_info/device_info_sync_bridge.cc b/components/sync_device_info/device_info_sync_bridge.cc index c1c2ecc..1e8cbf4 100644 --- a/components/sync_device_info/device_info_sync_bridge.cc +++ b/components/sync_device_info/device_info_sync_bridge.cc
@@ -449,7 +449,8 @@ local_device_name_info_.full_hardware_class, /*device_info_restored_from_store=*/nullptr); - std::unique_ptr<WriteBatch> batch = store_->CreateWriteBatch(); + std::unique_ptr<WriteBatch> batch = + store_->CreateWriteBatch(std::move(metadata_change_list)); for (const auto& change : entity_data) { const DeviceInfoSpecifics& specifics = change->data().specifics.device_info(); @@ -464,7 +465,6 @@ StoreSpecifics(specifics, batch.get()); } - batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); // Complete batch with local data and commit. SendLocalDataWithBatch(std::move(batch)); return std::nullopt; @@ -475,7 +475,8 @@ EntityChangeList entity_changes) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(!local_cache_guid_.empty()); - std::unique_ptr<WriteBatch> batch = store_->CreateWriteBatch(); + std::unique_ptr<WriteBatch> batch = + store_->CreateWriteBatch(std::move(metadata_change_list)); bool has_changes = false; bool has_tombstone_for_local_device = false; for (const std::unique_ptr<EntityChange>& change : entity_changes) { @@ -505,7 +506,6 @@ } } - batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); CommitAndNotify(std::move(batch), has_changes); if (!change_processor()->IsEntityUnsynced(local_cache_guid_)) {
diff --git a/components/sync_preferences/BUILD.gn b/components/sync_preferences/BUILD.gn index 78a68a1..bf81fde 100644 --- a/components/sync_preferences/BUILD.gn +++ b/components/sync_preferences/BUILD.gn
@@ -31,6 +31,7 @@ ] deps = [ + ":features", "//base", "//components/metrics/demographics", "//components/policy/core/browser",
diff --git a/components/sync_preferences/features.cc b/components/sync_preferences/features.cc index 72394bb8..1434e81 100644 --- a/components/sync_preferences/features.cc +++ b/components/sync_preferences/features.cc
@@ -6,6 +6,8 @@ namespace sync_preferences::features { +BASE_FEATURE(kAccountScopedPrefs, base::FEATURE_DISABLED_BY_DEFAULT); + BASE_FEATURE(kEnableCrossDevicePrefTracker, #if BUILDFLAG(IS_IOS) base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/components/sync_preferences/features.h b/components/sync_preferences/features.h index 327baf0..9767f8a 100644 --- a/components/sync_preferences/features.h +++ b/components/sync_preferences/features.h
@@ -9,6 +9,10 @@ namespace sync_preferences::features { +// If enabled, supports account-scoping of preferences. That is, the values of +// the specially tagged preferences will be cleared upon sign out. +BASE_DECLARE_FEATURE(kAccountScopedPrefs); + // Enables the CrossDevicePrefTracker, a KeyedService for tracking select // non-syncing Prefs across a user's devices. BASE_DECLARE_FEATURE(kEnableCrossDevicePrefTracker);
diff --git a/components/sync_preferences/syncable_prefs_database.cc b/components/sync_preferences/syncable_prefs_database.cc index 9f6fb12..0031c68 100644 --- a/components/sync_preferences/syncable_prefs_database.cc +++ b/components/sync_preferences/syncable_prefs_database.cc
@@ -6,11 +6,18 @@ #include <string_view> +#include "base/feature_list.h" #include "base/logging.h" #include "components/sync/base/features.h" +#include "components/sync_preferences/features.h" namespace sync_preferences { +WriteBehavior SyncablePrefMetadata::write_behavior() const { + CHECK(base::FeatureList::IsEnabled(features::kAccountScopedPrefs)); + return write_behavior_; +} + bool SyncablePrefsDatabase::IsPreferenceSyncable( std::string_view pref_name) const { return GetSyncablePrefMetadata(pref_name).has_value();
diff --git a/components/sync_preferences/syncable_prefs_database.h b/components/sync_preferences/syncable_prefs_database.h index 941a4a1..711e37e 100644 --- a/components/sync_preferences/syncable_prefs_database.h +++ b/components/sync_preferences/syncable_prefs_database.h
@@ -49,17 +49,35 @@ kCustom }; +// When preferences sync is enabled, this enum is used to determine whether a +// pref update should be applied to the account value, or both the account value +// and the local value. +// NOTE: The default behavior is to write to both. Unless the pref values really +// need to be account-scoped, prefer to use `kWriteToBoth`. +enum class WriteBehavior { + // The pref is written to both - the local value as well as the account value. + kWriteToBoth, + // The pref is only written to the account value. + // NOTE: The pref is written the account store only, iff the user is + // signed-in. Else, the pref is not written at all. + kWriteToAccountOnly, +}; + // This class represents the metadata corresponding to a syncable preference. class SyncablePrefMetadata { public: - constexpr SyncablePrefMetadata(int syncable_pref_id, - syncer::DataType data_type, - PrefSensitivity pref_sensitivity, - MergeBehavior merge_behavior) + constexpr SyncablePrefMetadata( + int syncable_pref_id, + syncer::DataType data_type, + PrefSensitivity pref_sensitivity, + MergeBehavior merge_behavior, + // TODO(crbug.com/441437179): Make this a required field. + WriteBehavior write_behavior = WriteBehavior::kWriteToBoth) : syncable_pref_id_(syncable_pref_id), data_type_(data_type), pref_sensitivity_(pref_sensitivity), - merge_behaviour_(merge_behavior) { + merge_behaviour_(merge_behavior), + write_behavior_(write_behavior) { CHECK(data_type_ == syncer::PREFERENCES || data_type_ == syncer::PRIORITY_PREFERENCES #if BUILDFLAG(IS_CHROMEOS) @@ -92,11 +110,14 @@ MergeBehavior merge_behavior() const { return merge_behaviour_; } + WriteBehavior write_behavior() const; + private: int syncable_pref_id_; syncer::DataType data_type_; PrefSensitivity pref_sensitivity_; MergeBehavior merge_behaviour_; + WriteBehavior write_behavior_; }; // This class provides an interface to define the list of syncable
diff --git a/components/sync_sessions/BUILD.gn b/components/sync_sessions/BUILD.gn index 0370c2f..27c1a56 100644 --- a/components/sync_sessions/BUILD.gn +++ b/components/sync_sessions/BUILD.gn
@@ -72,6 +72,8 @@ sources = [ "fake_open_tabs_ui_delegate.cc", "fake_open_tabs_ui_delegate.h", + "mock_open_tabs_ui_delegate.cc", + "mock_open_tabs_ui_delegate.h", "mock_session_sync_service.cc", "mock_session_sync_service.h", "mock_sync_sessions_client.cc",
diff --git a/components/sync_sessions/mock_open_tabs_ui_delegate.cc b/components/sync_sessions/mock_open_tabs_ui_delegate.cc new file mode 100644 index 0000000..7bc47542 --- /dev/null +++ b/components/sync_sessions/mock_open_tabs_ui_delegate.cc
@@ -0,0 +1,13 @@ +// Copyright 2026 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/sync_sessions/mock_open_tabs_ui_delegate.h" + +namespace sync_sessions { + +MockOpenTabsUIDelegate::MockOpenTabsUIDelegate() = default; + +MockOpenTabsUIDelegate::~MockOpenTabsUIDelegate() = default; + +} // namespace sync_sessions
diff --git a/components/sync_sessions/mock_open_tabs_ui_delegate.h b/components/sync_sessions/mock_open_tabs_ui_delegate.h new file mode 100644 index 0000000..0ae8792f --- /dev/null +++ b/components/sync_sessions/mock_open_tabs_ui_delegate.h
@@ -0,0 +1,66 @@ +// Copyright 2026 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_SYNC_SESSIONS_MOCK_OPEN_TABS_UI_DELEGATE_H_ +#define COMPONENTS_SYNC_SESSIONS_MOCK_OPEN_TABS_UI_DELEGATE_H_ + +#include <string> +#include <vector> + +#include "base/containers/flat_map.h" +#include "base/memory/raw_ptr.h" +#include "base/time/time.h" +#include "components/sessions/core/session_id.h" +#include "components/sync_sessions/open_tabs_ui_delegate.h" +#include "testing/gmock/include/gmock/gmock.h" + +namespace sessions { +struct SessionTab; +struct SessionWindow; +} // namespace sessions + +namespace sync_sessions { + +struct SyncedSession; + +class MockOpenTabsUIDelegate : public OpenTabsUIDelegate { + public: + MockOpenTabsUIDelegate(); + + MockOpenTabsUIDelegate(const MockOpenTabsUIDelegate&) = delete; + MockOpenTabsUIDelegate& operator=(const MockOpenTabsUIDelegate&) = delete; + + ~MockOpenTabsUIDelegate() override; + + MOCK_METHOD(bool, + GetAllForeignSessions, + ((std::vector<raw_ptr<const SyncedSession, VectorExperimental>> * + sessions)), + (override)); + MOCK_METHOD((base::flat_map<std::string, base::Time>), + GetAllForeignSessionLastModifiedTimes, + (), + (const, override)); + MOCK_METHOD(bool, + GetForeignTab, + (const std::string& tag, + SessionID tab_id, + const sessions::SessionTab** tab), + (override)); + MOCK_METHOD(void, DeleteForeignSession, (const std::string& tag), (override)); + MOCK_METHOD(std::vector<const sessions::SessionWindow*>, + GetForeignSession, + (const std::string& tag), + (override)); + MOCK_METHOD(bool, + GetForeignSessionTabs, + (const std::string& tag, + std::vector<const sessions::SessionTab*>* tabs), + (override)); + MOCK_METHOD(bool, GetLocalSession, (const SyncedSession** local), (override)); +}; + +} // namespace sync_sessions + +#endif // COMPONENTS_SYNC_SESSIONS_MOCK_OPEN_TABS_UI_DELEGATE_H_
diff --git a/components/visited_url_ranking/internal/session_url_visit_data_fetcher_unittest.cc b/components/visited_url_ranking/internal/session_url_visit_data_fetcher_unittest.cc index 3e1150e6..7558dc2 100644 --- a/components/visited_url_ranking/internal/session_url_visit_data_fetcher_unittest.cc +++ b/components/visited_url_ranking/internal/session_url_visit_data_fetcher_unittest.cc
@@ -11,6 +11,7 @@ #include "base/functional/callback.h" #include "base/test/task_environment.h" #include "base/time/time.h" +#include "components/sync_sessions/mock_open_tabs_ui_delegate.h" #include "components/sync_sessions/mock_session_sync_service.h" #include "components/sync_sessions/open_tabs_ui_delegate.h" #include "components/sync_sessions/session_sync_service.h" @@ -89,43 +90,6 @@ } // namespace -namespace sync_sessions { - -class MockOpenTabsUIDelegate : public OpenTabsUIDelegate { - public: - MockOpenTabsUIDelegate() = default; - MockOpenTabsUIDelegate(const MockOpenTabsUIDelegate&) = delete; - MockOpenTabsUIDelegate& operator=(const MockOpenTabsUIDelegate&) = delete; - ~MockOpenTabsUIDelegate() override = default; - - MOCK_METHOD1( - GetAllForeignSessions, - bool(std::vector<raw_ptr<const SyncedSession, VectorExperimental>>* - sessions)); - - MOCK_CONST_METHOD0(GetAllForeignSessionLastModifiedTimes, - base::flat_map<std::string, base::Time>()); - - MOCK_METHOD3(GetForeignTab, - bool(const std::string& tag, - const SessionID tab_id, - const sessions::SessionTab** tab)); - - MOCK_METHOD1(DeleteForeignSession, void(const std::string& tag)); - - MOCK_METHOD1( - GetForeignSession, - std::vector<const sessions::SessionWindow*>(const std::string& tag)); - - MOCK_METHOD2(GetForeignSessionTabs, - bool(const std::string& tag, - std::vector<const sessions::SessionTab*>* tabs)); - - MOCK_METHOD1(GetLocalSession, bool(const SyncedSession** local_session)); -}; - -} // namespace sync_sessions - namespace visited_url_ranking { using Source = URLVisit::Source;
diff --git a/components/webauthn/core/browser/passkey_sync_bridge.cc b/components/webauthn/core/browser/passkey_sync_bridge.cc index 5b8c6d4..e06c1f96 100644 --- a/components/webauthn/core/browser/passkey_sync_bridge.cc +++ b/components/webauthn/core/browser/passkey_sync_bridge.cc
@@ -146,7 +146,7 @@ std::unique_ptr<syncer::MetadataChangeList> metadata_change_list, syncer::EntityChangeList entity_changes) { std::unique_ptr<syncer::DataTypeStore::WriteBatch> write_batch = - store_->CreateWriteBatch(); + store_->CreateWriteBatch(std::move(metadata_change_list)); std::vector<PasskeyModelChange> changes; for (const auto& entity_change : entity_changes) { @@ -178,7 +178,6 @@ } } - write_batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); store_->CommitWriteBatch( std::move(write_batch), base::BindOnce(&PasskeySyncBridge::OnStoreCommitWriteBatch,
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.cc b/content/browser/accessibility/browser_accessibility_manager_android.cc index 2591f9d..4851442 100644 --- a/content/browser/accessibility/browser_accessibility_manager_android.cc +++ b/content/browser/accessibility/browser_accessibility_manager_android.cc
@@ -26,30 +26,6 @@ namespace content { -namespace { - -// In case the `node` does not exist on Android, updates node and offset to the -// highest leaf node (ancestor of node). -void UpdateTextPositionForSelection(BrowserAccessibilityAndroid*& node, - int& offset) { - ui::BrowserAccessibility* platform_ancestor = - node->PlatformGetLowestPlatformAncestor(); - if (platform_ancestor == node) { - return; - } - ui::BrowserAccessibility::AXPosition position = - node->CreatePositionForSelectionAt(offset); - while (position->GetAnchor()->id() != platform_ancestor->GetId()) { - position = position->CreateParentPosition(); - } - - CHECK_EQ(ui::AXPositionKind::TEXT_POSITION, position->kind()); - node = static_cast<BrowserAccessibilityAndroid*>(platform_ancestor); - offset = position->text_offset(); -} - -} // namespace - // static ui::BrowserAccessibilityManager* BrowserAccessibilityManagerAndroid::Create( const ui::AXTreeUpdate& initial_tree, @@ -962,7 +938,7 @@ selection.is_backward ? ui::AXPositionAdjustmentBehavior::kMoveBackward : ui::AXPositionAdjustmentBehavior::kMoveForward); - if (focus_position->IsNullPosition() || focus_position->IsNullPosition()) { + if (anchor_position->IsNullPosition() || focus_position->IsNullPosition()) { return std::nullopt; } @@ -1007,23 +983,37 @@ } SelectionRange selection_range; - BrowserAccessibilityAndroid* node = static_cast<BrowserAccessibilityAndroid*>( - GetFromAXNode(anchor_position->GetAnchor())); - selection_range.anchor_offset = anchor_position->text_offset(); // TODO(crbug.com/490266495): Remove the following when range iterator returns // platform leaf positions. - UpdateTextPositionForSelection(node, selection_range.anchor_offset); - selection_range.anchor_object = node; + MaybeUpdateTextPositionForSelection(anchor_position); + selection_range.anchor_object = static_cast<BrowserAccessibilityAndroid*>( + GetFromAXNode(anchor_position->GetAnchor())); + selection_range.anchor_offset = anchor_position->text_offset(); - node = static_cast<BrowserAccessibilityAndroid*>( + MaybeUpdateTextPositionForSelection(focus_position); + selection_range.focus_object = static_cast<BrowserAccessibilityAndroid*>( GetFromAXNode(focus_position->GetAnchor())); selection_range.focus_offset = focus_position->text_offset(); - UpdateTextPositionForSelection(node, selection_range.focus_offset); - selection_range.focus_object = node; return selection_range; } +void BrowserAccessibilityManagerAndroid::MaybeUpdateTextPositionForSelection( + ui::BrowserAccessibility::AXPosition& position) const { + BrowserAccessibilityAndroid* node = static_cast<BrowserAccessibilityAndroid*>( + GetFromAXNode(position->GetAnchor())); + ui::BrowserAccessibility* platform_ancestor = + node->PlatformGetLowestPlatformAncestor(); + if (platform_ancestor == node) { + return; + } + while (position->GetAnchor()->id() != platform_ancestor->GetId()) { + position = position->CreateParentPosition(); + } + + CHECK_EQ(ui::AXPositionKind::TEXT_POSITION, position->kind()); +} + // TODO(crbug.com/485227837): Remove experiment's methods void BrowserAccessibilityManagerAndroid:: OnAccessibilityEventsProcessedForExperiment() {
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.h b/content/browser/accessibility/browser_accessibility_manager_android.h index 8bf85a5..e7373ace 100644 --- a/content/browser/accessibility/browser_accessibility_manager_android.h +++ b/content/browser/accessibility/browser_accessibility_manager_android.h
@@ -207,6 +207,11 @@ void FireDocumentSelectionChangedEvent(WebContentsAccessibilityAndroid* wcax); + // If the anchor node of `position` does not exist on Android, update + // `position` to the highest leaf node (ancestor of node). + void MaybeUpdateTextPositionForSelection( + ui::BrowserAccessibility::AXPosition& position) const; + // A weak reference to WebContentsAccessibility for reaching Java layer. // Only the root manager has the reference. Should be accessed through // |GetWebContentsAXFromRootManager| rather than directly.
diff --git a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc index 6b308f2b..a1b18ab 100644 --- a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc +++ b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
@@ -1641,26 +1641,6 @@ testing::Optional(static_cast<int>(crdtp::DispatchCode::SERVER_ERROR))); } -IN_PROC_BROWSER_TEST_F(DevToolsProtocolTest, - NavigationToViewSourceFileUrlRequiresFileAccess) { - Attach(); - - base::DictValue params; - GURL test_url = GetTestUrl("devtools", "navigation.html"); - params.Set("url", "view-source:" + test_url.spec()); - ASSERT_TRUE(SendCommandSync("Page.navigate", params.Clone())); - - Detach(); - SetMayReadLocalFiles(false); - - Attach(); - - ASSERT_FALSE(SendCommandSync("Page.navigate", params.Clone())); - EXPECT_THAT( - error()->FindInt("code"), - testing::Optional(static_cast<int>(crdtp::DispatchCode::SERVER_ERROR))); -} - IN_PROC_BROWSER_TEST_F(DevToolsProtocolTest, CrossSiteNoDetach) { content::SetupCrossSiteRedirector(embedded_test_server()); ASSERT_TRUE(embedded_test_server()->Start());
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc index 4ea0784..9ea1935 100644 --- a/content/browser/devtools/protocol/page_handler.cc +++ b/content/browser/devtools/protocol/page_handler.cc
@@ -875,13 +875,7 @@ Response::ServerError("Cannot navigate to invalid URL")); return; } - - GURL inner_url = gurl; - if (gurl.SchemeIs(content::kViewSourceScheme)) { - inner_url = GURL(gurl.GetContent()); - } - - if (inner_url.SchemeIsFile() && !may_read_local_files_) { + if (gurl.SchemeIsFile() && !may_read_local_files_) { callback->sendFailure( Response::ServerError("Navigating to local URL is not allowed")); return; @@ -894,8 +888,8 @@ // chrome-untrusted:// WebUIs might perform high-priviledged actions on // navigation, disallow navigation to them unless the client is trusted. - if ((inner_url.SchemeIs(kChromeUIUntrustedScheme) || - inner_url.SchemeIs(kChromeDevToolsScheme)) && + if ((gurl.SchemeIs(kChromeUIUntrustedScheme) || + gurl.SchemeIs(kChromeDevToolsScheme)) && !is_trusted_) { callback->sendFailure(Response::ServerError( "Navigating to a URL with a privileged scheme is not allowed"));
diff --git a/content/browser/interest_group/interest_group_browsertest.cc b/content/browser/interest_group/interest_group_browsertest.cc index 5f63b30..455d7c29 100644 --- a/content/browser/interest_group/interest_group_browsertest.cc +++ b/content/browser/interest_group/interest_group_browsertest.cc
@@ -2111,7 +2111,7 @@ ASSERT_THAT( eval_result, - AnyOf(EvalJsResult::IsError(), + AnyOf(EvalJsResult::ErrorIs(testing::_), EvalJsResult::IsOkAndHolds(base::test::IsJson(base::Value())))) << "Expected string, but got " << eval_result; WaitForFencedFrameNavigation(expected_ad_url, *execution_target, observer);
diff --git a/content/browser/loader/connection_allowlist_origin_trial_unittest.cc b/content/browser/loader/connection_allowlist_origin_trial_unittest.cc index 22582589..0b37622 100644 --- a/content/browser/loader/connection_allowlist_origin_trial_unittest.cc +++ b/content/browser/loader/connection_allowlist_origin_trial_unittest.cc
@@ -68,8 +68,9 @@ // Only if the document has trial enabled, then it can have a connection // allowlist in its policy container. bool HasConnectionAllowlist(const RenderFrameHost* rfh) const { - return GetPolicyContainerPolicies(rfh) - .connection_allowlists.enforced.has_value(); + const PolicyContainerPolicies& policies = GetPolicyContainerPolicies(rfh); + return policies.connection_allowlists.enforced.has_value() || + policies.connection_allowlists.report_only.has_value(); } private: @@ -194,11 +195,11 @@ EXPECT_FALSE(HasConnectionAllowlist(navigation->GetFinalRenderFrameHost())); } -// Response contains a valid trial token but the "Connection-Allowlist" header -// is missing. Only the "Connection-Allowlist-Report-Only" is present. The trial -// is not enabled. +// Response contains a valid trial token. The "Connection-Allowlist" header +// is missing, but there is a "Connection-Allowlist-Report-Only" header. The +// trial is enabled. TEST_F(ConnectionAllowlistOriginTrialTest, - ValidTokenWithReportOnlyHeaderTrialDisabled) { + ValidTokenWithReportOnlyHeaderTrialEnabled) { base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeature(network::features::kConnectionAllowlists); @@ -213,7 +214,7 @@ navigation->SetResponseHeaders(response_headers); navigation->Commit(); - EXPECT_FALSE(HasConnectionAllowlist(navigation->GetFinalRenderFrameHost())); + EXPECT_TRUE(HasConnectionAllowlist(navigation->GetFinalRenderFrameHost())); } // When there is a copy of the policy container, the connection allowlist stored
diff --git a/content/browser/loader/content_security_notifier.cc b/content/browser/loader/content_security_notifier.cc index 1c30ab73..938174ec 100644 --- a/content/browser/loader/content_security_notifier.cc +++ b/content/browser/loader/content_security_notifier.cc
@@ -27,11 +27,11 @@ } void ContentSecurityNotifier::NotifyInsecureContentRan( - const GURL& origin, - const GURL& insecure_url) { + const GURL& insecure_url, + blink::mojom::ContentSecurityNotifier::InsecureContentOrigin origin_type) { auto* render_frame_host = RenderFrameHostImpl::FromID(render_frame_host_id_); if (render_frame_host) { - render_frame_host->OnDidRunInsecureContent(origin, insecure_url); + render_frame_host->OnDidRunInsecureContent(insecure_url, origin_type); } }
diff --git a/content/browser/loader/content_security_notifier.h b/content/browser/loader/content_security_notifier.h index 0417eec..a41ea0c 100644 --- a/content/browser/loader/content_security_notifier.h +++ b/content/browser/loader/content_security_notifier.h
@@ -26,8 +26,10 @@ // blink::mojom::ContentSecurityNotifier implementation. void NotifyContentWithCertificateErrorsRan() override; void NotifyContentWithCertificateErrorsDisplayed() override; - void NotifyInsecureContentRan(const GURL& origin, - const GURL& insecure_url) override; + void NotifyInsecureContentRan( + const GURL& insecure_url, + blink::mojom::ContentSecurityNotifier::InsecureContentOrigin origin_type) + override; private: const GlobalRenderFrameHostId render_frame_host_id_;
diff --git a/content/browser/renderer_host/mixed_content_checker.cc b/content/browser/renderer_host/mixed_content_checker.cc index f5f14eaa..233ddd4 100644 --- a/content/browser/renderer_host/mixed_content_checker.cc +++ b/content/browser/renderer_host/mixed_content_checker.cc
@@ -61,11 +61,6 @@ url::kHttpsScheme; } -// This mirrors `blink::MixedContentChecker::IsMixedContent()`. -bool IsMixedContent(const url::Origin& origin, const GURL& url) { - return !IsUrlPotentiallySecure(url) && - DoesOriginSchemeRestrictMixedContent(origin); -} // This mirrors `blink::MixedContentChecker::InWhichFrameIsContentMixed()` but // without reporting to renderer. @@ -88,11 +83,13 @@ // Check the main frame first. RenderFrameHostImpl* main_frame = initiator_frame->GetOutermostMainFrame(); - if (IsMixedContent(main_frame->GetLastCommittedOrigin(), url)) { + if (MixedContentChecker::IsMixedContent(main_frame->GetLastCommittedOrigin(), + url)) { return main_frame; } - if (IsMixedContent(initiator_frame->GetLastCommittedOrigin(), url)) { + if (MixedContentChecker::IsMixedContent( + initiator_frame->GetLastCommittedOrigin(), url)) { return initiator_frame; } @@ -181,6 +178,13 @@ } // namespace +// static +bool MixedContentChecker::IsMixedContent(const url::Origin& security_origin, + const GURL& target_url) { + return !IsUrlPotentiallySecure(target_url) && + DoesOriginSchemeRestrictMixedContent(security_origin); +} + MixedContentChecker::MixedContentChecker() = default; MixedContentChecker::~MixedContentChecker() = default; @@ -302,9 +306,9 @@ prefs.allow_running_insecure_content, mixed_content_frame->GetLastCommittedOrigin(), url); if (allowed) { - const GURL& origin_url = - mixed_content_frame->GetLastCommittedOrigin().GetURL(); - mixed_content_frame->OnDidRunInsecureContent(origin_url, url); + mixed_content_frame->OnDidRunInsecureContent( + url, blink::mojom::ContentSecurityNotifier::InsecureContentOrigin:: + kCurrentFrame); if (mixed_content_features) { mixed_content_features->insert( blink::mojom::WebFeature::kMixedContentBlockableAllowed); @@ -401,7 +405,7 @@ } // Note: The code below should behave the same way as the two calls to - // `MeasureStricterVersionOfIsMixedContent()` from inside + // `MeasureStricterVersionOfMixedContentChecker::IsMixedContent()` from inside // `blink::MixedContentChecker::InWhichFrameIsContentMixed()`. if (mixed_content_frame) { // We're currently only checking for mixed content in `https://*` contexts. @@ -456,7 +460,7 @@ bool MixedContentChecker::IsMixedContentForTesting(const GURL& origin_url, const GURL& url) { const url::Origin origin = url::Origin::Create(origin_url); - return IsMixedContent(origin, url); + return MixedContentChecker::IsMixedContent(origin, url); } } // namespace content
diff --git a/content/browser/renderer_host/mixed_content_checker.h b/content/browser/renderer_host/mixed_content_checker.h index bc15ef7..3d9a1783 100644 --- a/content/browser/renderer_host/mixed_content_checker.h +++ b/content/browser/renderer_host/mixed_content_checker.h
@@ -43,6 +43,9 @@ bool ShouldBlockNavigation(NavigationHandle& navigation_handle, bool for_redirect); + // Returns whether `url` is mixed content with respect to `origin`. + static bool IsMixedContent(const url::Origin& origin, const GURL& url); + // Checks if a fetch keepalive request that loads `url` should be blocked or // not due to mixed content, without reporting back to renderer. //
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc index 0a37181..046e5d15 100644 --- a/content/browser/renderer_host/navigation_request.cc +++ b/content/browser/renderer_host/navigation_request.cc
@@ -1225,13 +1225,15 @@ } // Returns true if the parsed response headers contains a valid -// "Connection-Allowlist" header. -bool ResponseEnforcesConnectionAllowlist( +// "Connection-Allowlist" or "Connection-Allowlist-Report-Only" header. +bool ResponseContainsConnectionAllowlist( const network::mojom::URLResponseHead* response_head) { return response_head && response_head->headers && response_head->parsed_headers && - response_head->parsed_headers->connection_allowlists.enforced - .has_value(); + (response_head->parsed_headers->connection_allowlists.enforced + .has_value() || + response_head->parsed_headers->connection_allowlists.report_only + .has_value()); } // The sampling rate for UKM. @@ -7468,10 +7470,8 @@ // container. If the initiator doesn't have an enforced allowlist in its // policies, it means either: // 1. the trial was not active for that context. - // 2. or the parsed allowlist is null. For example: - // - A "Connection-Allowlist" header with empty field value. - // - A response contains a "Connection-Allowlist-Report-Only" header, but - // not "Connection-Allowlist". + // 2. or the parsed enforced allowlist is null. For example, the + // "Connection-Allowlist" header has an empty field value. if (!policies || !policies->connection_allowlists.enforced) { return true; } @@ -10707,7 +10707,7 @@ true); } - if (ResponseEnforcesConnectionAllowlist(response_head_.get()) && + if (ResponseContainsConnectionAllowlist(response_head_.get()) && base::FeatureList::IsEnabled(network::features::kConnectionAllowlists)) { // Connection allowlist needs to be enforced once the allowlist response // header is received. The origin trial token for this feature is received
diff --git a/content/browser/renderer_host/network_restrictions_navigation_throttle.cc b/content/browser/renderer_host/network_restrictions_navigation_throttle.cc index dbbef2f0..9d6b15d 100644 --- a/content/browser/renderer_host/network_restrictions_navigation_throttle.cc +++ b/content/browser/renderer_host/network_restrictions_navigation_throttle.cc
@@ -59,10 +59,8 @@ // container. If there does not exist an enforced allowlist in policies, it // means either: // 1. the trial was not active for that context. - // 2. or the parsed allowlist is null. For example: - // - A "Connection-Allowlist" header with empty field value. - // - A response contains a "Connection-Allowlist-Report-Only" header, but - // not "Connection-Allowlist". + // 2. or the parsed enforced allowlist is null. For example, the + // "Connection-Allowlist" header has an empty field value. // // The network restriction id is not applied in either case. if (!policy_container_policies.connection_allowlists.enforced &&
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index 1c9f0c6..85353aa 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -139,6 +139,7 @@ #include "content/browser/renderer_host/ipc_utils.h" #include "content/browser/renderer_host/local_network_access_util.h" #include "content/browser/renderer_host/media/peer_connection_tracker_host.h" +#include "content/browser/renderer_host/mixed_content_checker.h" #include "content/browser/renderer_host/navigation_controller_impl.h" #include "content/browser/renderer_host/navigation_entry_impl.h" #include "content/browser/renderer_host/navigation_metrics_utils.h" @@ -19222,18 +19223,33 @@ SetPolicyContainerHost(std::move(policy_container_host)); } -void RenderFrameHostImpl::OnDidRunInsecureContent(const GURL& security_origin, - const GURL& target_url) { +void RenderFrameHostImpl::OnDidRunInsecureContent( + const GURL& target_url, + blink::mojom::ContentSecurityNotifier::InsecureContentOrigin origin_type) { + url::Origin security_origin = + (origin_type == + blink::mojom::ContentSecurityNotifier::InsecureContentOrigin::kTopFrame) + ? GetOutermostMainFrame()->GetLastCommittedOrigin() + : GetLastCommittedOrigin(); + + if (!MixedContentChecker::IsMixedContent(security_origin, target_url)) { + mojo::ReportBadMessage( + "NotifyInsecureContentRan called for non-mixed content."); + return; + } + + const GURL& security_origin_url = security_origin.GetURL(); OPTIONAL_TRACE_EVENT2("content", "RenderFrameHostImpl::DidRunInsecureContent", - "security_origin", security_origin, "target_url", + "security_origin", security_origin_url, "target_url", target_url); RecordAction(base::UserMetricsAction("SSL.RanInsecureContent")); - if (base::EndsWith(security_origin.spec(), kDotGoogleDotCom, + if (base::EndsWith(security_origin_url.spec(), kDotGoogleDotCom, base::CompareCase::INSENSITIVE_ASCII)) { RecordAction(base::UserMetricsAction("SSL.RanInsecureContentGoogle")); } - frame_tree_->controller().ssl_manager()->DidRunMixedContent(security_origin); + frame_tree_->controller().ssl_manager()->DidRunMixedContent( + security_origin_url); } void RenderFrameHostImpl::OnDidRunContentWithCertificateErrors() {
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h index f08b086..0eac0e40 100644 --- a/content/browser/renderer_host/render_frame_host_impl.h +++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -157,6 +157,7 @@ #include "third_party/blink/public/mojom/image_downloader/image_downloader.mojom.h" #include "third_party/blink/public/mojom/input/focus_type.mojom-forward.h" #include "third_party/blink/public/mojom/installedapp/installed_app_provider.mojom-forward.h" +#include "third_party/blink/public/mojom/loader/content_security_notifier.mojom.h" #include "third_party/blink/public/mojom/loader/fetch_later.mojom-forward.h" #include "third_party/blink/public/mojom/loader/local_resource_loader_config.mojom-forward.h" #include "third_party/blink/public/mojom/loader/resource_load_info.mojom-forward.h" @@ -2891,8 +2892,9 @@ network::mojom::ClientSecurityStatePtr BuildClientSecurityStateForWorkers() const; - void OnDidRunInsecureContent(const GURL& security_origin, - const GURL& target_url); + void OnDidRunInsecureContent( + const GURL& target_url, + blink::mojom::ContentSecurityNotifier::InsecureContentOrigin origin_type); void OnDidDisplayContentWithCertificateErrors(); void OnDidRunContentWithCertificateErrors();
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 8d4593e2..66ef984 100644 --- a/content/browser/renderer_host/render_frame_host_impl_browsertest.cc +++ b/content/browser/renderer_host/render_frame_host_impl_browsertest.cc
@@ -6125,7 +6125,7 @@ SetupRemoteObjectInvocation(shell(), url); std::string kScript = "testObject.getInnerId();"; - EXPECT_THAT(EvalJs(web_contents(), kScript), EvalJsResult::IsError()); + EXPECT_FALSE(ExecJs(web_contents(), kScript)); } // TODO(crbug.com/40236762): This test is flaky.
diff --git a/content/browser/scheduler/responsiveness/jank_monitor_impl.cc b/content/browser/scheduler/responsiveness/jank_monitor_impl.cc index d5863fba..8c7612a 100644 --- a/content/browser/scheduler/responsiveness/jank_monitor_impl.cc +++ b/content/browser/scheduler/responsiveness/jank_monitor_impl.cc
@@ -35,7 +35,7 @@ JankMonitorImpl::JankMonitorImpl() : timer_(std::make_unique<base::RepeatingTimer>()), timer_running_(false), - janky_task_id_(nullptr), + janky_task_id_(0), last_activity_time_us_(0) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DETACH_FROM_SEQUENCE(monitor_sequence_checker_); @@ -114,39 +114,43 @@ const base::PendingTask* task, bool /* was_blocked_or_low_priority */) { DCHECK(ui_thread_exec_state_); - WillRunTaskOrEvent(ui_thread_exec_state_.get(), task); + WillRunTaskOrEvent(ui_thread_exec_state_.get(), + reinterpret_cast<uintptr_t>(task)); } void JankMonitorImpl::DidRunTaskOnUIThread(const base::PendingTask* task) { DCHECK(ui_thread_exec_state_); - DidRunTaskOrEvent(ui_thread_exec_state_.get(), task); + DidRunTaskOrEvent(ui_thread_exec_state_.get(), + reinterpret_cast<uintptr_t>(task)); } void JankMonitorImpl::WillRunTaskOnIOThread( const base::PendingTask* task, bool /* was_blocked_or_low_priority */) { DCHECK(io_thread_exec_state_); - WillRunTaskOrEvent(io_thread_exec_state_.get(), task); + WillRunTaskOrEvent(io_thread_exec_state_.get(), + reinterpret_cast<uintptr_t>(task)); } void JankMonitorImpl::DidRunTaskOnIOThread(const base::PendingTask* task) { DCHECK(io_thread_exec_state_); - DidRunTaskOrEvent(io_thread_exec_state_.get(), task); + DidRunTaskOrEvent(io_thread_exec_state_.get(), + reinterpret_cast<uintptr_t>(task)); } -void JankMonitorImpl::WillRunEventOnUIThread(const void* opaque_identifier) { +void JankMonitorImpl::WillRunEventOnUIThread(uintptr_t opaque_identifier) { DCHECK(ui_thread_exec_state_); WillRunTaskOrEvent(ui_thread_exec_state_.get(), opaque_identifier); } -void JankMonitorImpl::DidRunEventOnUIThread(const void* opaque_identifier) { +void JankMonitorImpl::DidRunEventOnUIThread(uintptr_t opaque_identifier) { DCHECK(ui_thread_exec_state_); DidRunTaskOrEvent(ui_thread_exec_state_.get(), opaque_identifier); } void JankMonitorImpl::WillRunTaskOrEvent( ThreadExecutionState* thread_exec_state, - const void* opaque_identifier) { + uintptr_t opaque_identifier) { thread_exec_state->WillRunTaskOrEvent(opaque_identifier); if (!timer_running_) { monitor_task_runner_->PostTask( @@ -156,7 +160,7 @@ } void JankMonitorImpl::DidRunTaskOrEvent(ThreadExecutionState* thread_exec_state, - const void* opaque_identifier) { + uintptr_t opaque_identifier) { thread_exec_state->DidRunTaskOrEvent(opaque_identifier); NotifyJankStopIfNecessary(opaque_identifier); @@ -245,7 +249,7 @@ StopTimerIfIdle(); } -void JankMonitorImpl::OnJankStarted(const void* opaque_identifier) { +void JankMonitorImpl::OnJankStarted(uintptr_t opaque_identifier) { DCHECK_CALLED_ON_VALID_SEQUENCE(monitor_sequence_checker_); janky_task_id_ = opaque_identifier; @@ -255,34 +259,28 @@ observer.OnJankStarted(); } -void JankMonitorImpl::OnJankStopped( - MayBeDangling<const void> opaque_identifier) { +void JankMonitorImpl::OnJankStopped(uintptr_t opaque_identifier) { DCHECK_CALLED_ON_VALID_SEQUENCE(monitor_sequence_checker_); - DCHECK_NE(opaque_identifier, nullptr); + DCHECK_NE(opaque_identifier, 0u); if (janky_task_id_ != opaque_identifier) return; - janky_task_id_ = nullptr; + janky_task_id_ = 0; base::AutoLock auto_lock(observers_lock_); for (content::JankMonitor::Observer& observer : observers_) observer.OnJankStopped(); } -void JankMonitorImpl::NotifyJankStopIfNecessary(const void* opaque_identifier) { +void JankMonitorImpl::NotifyJankStopIfNecessary(uintptr_t opaque_identifier) { if (!janky_task_id_ || janky_task_id_ != opaque_identifier) [[likely]] { // Most tasks are unlikely to be janky. return; } monitor_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&JankMonitorImpl::OnJankStopped, base::RetainedRef(this), - // It is relatively safe to have `UnsafeDangling` here - // because the ptr is only used as an identifier, and since - // the events should be coming in order, it is unlikely - // that we encounter issue with memory being reused. - base::UnsafeDangling(opaque_identifier))); + FROM_HERE, base::BindOnce(&JankMonitorImpl::OnJankStopped, + base::RetainedRef(this), opaque_identifier)); } JankMonitorImpl::ThreadExecutionState::TaskMetadata::~TaskMetadata() = default; @@ -296,7 +294,7 @@ JankMonitorImpl::ThreadExecutionState::~ThreadExecutionState() = default; -std::optional<const void*> +std::optional<uintptr_t> JankMonitorImpl::ThreadExecutionState::CheckJankiness() { DCHECK_CALLED_ON_VALID_SEQUENCE(monitor_sequence_checker_); @@ -316,7 +314,7 @@ } void JankMonitorImpl::ThreadExecutionState::WillRunTaskOrEvent( - const void* opaque_identifier) { + uintptr_t opaque_identifier) { AssertOnTargetThread(); base::TimeTicks now = base::TimeTicks::Now(); @@ -326,7 +324,7 @@ } void JankMonitorImpl::ThreadExecutionState::DidRunTaskOrEvent( - const void* opaque_identifier) { + uintptr_t opaque_identifier) { AssertOnTargetThread(); base::AutoLock lock(lock_);
diff --git a/content/browser/scheduler/responsiveness/jank_monitor_impl.h b/content/browser/scheduler/responsiveness/jank_monitor_impl.h index d25d4d3a..a03e9e0 100644 --- a/content/browser/scheduler/responsiveness/jank_monitor_impl.h +++ b/content/browser/scheduler/responsiveness/jank_monitor_impl.h
@@ -5,6 +5,8 @@ #ifndef CONTENT_BROWSER_SCHEDULER_RESPONSIVENESS_JANK_MONITOR_IMPL_H_ #define CONTENT_BROWSER_SCHEDULER_RESPONSIVENESS_JANK_MONITOR_IMPL_H_ +#include <stdint.h> + #include <atomic> #include <optional> @@ -51,8 +53,8 @@ bool was_blocked_or_low_priority) override; void DidRunTaskOnIOThread(const base::PendingTask* task) override; - void WillRunEventOnUIThread(const void* opaque_identifier) override; - void DidRunEventOnUIThread(const void* opaque_identifier) override; + void WillRunEventOnUIThread(uintptr_t opaque_identifier) override; + void DidRunEventOnUIThread(uintptr_t opaque_identifier) override; // Exposed for tests virtual void DestroyOnMonitorThread(); @@ -69,12 +71,12 @@ ThreadExecutionState(); ~ThreadExecutionState(); - void WillRunTaskOrEvent(const void* opaque_identifier); - void DidRunTaskOrEvent(const void* opaque_identifier); + void WillRunTaskOrEvent(uintptr_t opaque_identifier); + void DidRunTaskOrEvent(uintptr_t opaque_identifier); // Checks the jankiness of the target thread. Returns the opaque identifier // of the janky task or std::nullopt if the current task is not janky. - std::optional<const void*> CheckJankiness(); + std::optional<uintptr_t> CheckJankiness(); void AssertOnTargetThread(); private: @@ -82,7 +84,7 @@ base::Lock lock_; struct TaskMetadata { - TaskMetadata(base::TimeTicks execution_start_time, const void* identifier) + TaskMetadata(base::TimeTicks execution_start_time, uintptr_t identifier) : execution_start_time(execution_start_time), identifier(identifier) {} ~TaskMetadata(); @@ -92,7 +94,7 @@ // profiler data (JankMonitorImpl::WillRunTaskOrEvent -> // JankMonitorImpl::ThreadExecutionState::WillRunTaskOrEvent -> emplaces // TaskMetadata in a vector). - RAW_PTR_EXCLUSION const void* identifier; + uintptr_t identifier; }; std::vector<TaskMetadata> task_execution_metadata_; @@ -106,9 +108,9 @@ void RemoveObserverOnMonitorThread(Observer* observer); void WillRunTaskOrEvent(ThreadExecutionState* thread_exec_state, - const void* opaque_identifier); + uintptr_t opaque_identifier); void DidRunTaskOrEvent(ThreadExecutionState* thread_exec_state, - const void* opaque_identifier); + uintptr_t opaque_identifier); // Called in WillRunTaskOrEvent() to start the timer to monitor janks if // the timer is not running. @@ -117,11 +119,11 @@ void StopTimerIfIdle(); // Sends out notifications. - void OnJankStarted(const void* opaque_identifier); - void OnJankStopped(MayBeDangling<const void> opaque_identifier); + void OnJankStarted(uintptr_t opaque_identifier); + void OnJankStopped(uintptr_t opaque_identifier); // Call in DidRunTaskOrEvent() to for notification of jank stops. - void NotifyJankStopIfNecessary(const void* opaque_identifier); + void NotifyJankStopIfNecessary(uintptr_t opaque_identifier); // The source that emits responsiveness events. std::unique_ptr<content::responsiveness::MetricSource> metric_source_; @@ -143,7 +145,7 @@ // a janky task is detected. Checked when a task finishes running on UI or IO // thread to notify observers (from the monitor thread) that the jank has // stopped. - std::atomic<const void*> janky_task_id_; + std::atomic<uintptr_t> janky_task_id_; // The timestamp of last activity on either UI or IO thread. Checked on the // monitor thread for stopping the timer on inactivity. Updated on UI or IO
diff --git a/content/browser/scheduler/responsiveness/jank_monitor_impl_unittest.cc b/content/browser/scheduler/responsiveness/jank_monitor_impl_unittest.cc index 7f4a301..4e3d6d58 100644 --- a/content/browser/scheduler/responsiveness/jank_monitor_impl_unittest.cc +++ b/content/browser/scheduler/responsiveness/jank_monitor_impl_unittest.cc
@@ -37,7 +37,8 @@ explicit TestMetricSource(Delegate* delegate) : MetricSource(delegate) {} ~TestMetricSource() override {} - std::unique_ptr<NativeEventObserver> CreateNativeEventObserver() override { + std::unique_ptr<BrowserUINativeEventObserver> CreateNativeEventObserver() + override { return nullptr; } };
diff --git a/content/browser/scheduler/responsiveness/metric_source.cc b/content/browser/scheduler/responsiveness/metric_source.cc index 6b18c60..98366c2 100644 --- a/content/browser/scheduler/responsiveness/metric_source.cc +++ b/content/browser/scheduler/responsiveness/metric_source.cc
@@ -47,17 +47,18 @@ std::move(on_finish_destroy))); } -std::unique_ptr<NativeEventObserver> MetricSource::CreateNativeEventObserver() { +std::unique_ptr<BrowserUINativeEventObserver> +MetricSource::CreateNativeEventObserver() { // We can use base::Unretained(delegate_) since delegate_ is retained // in the constructor, and we won't release it when it is in use. - NativeEventObserver::WillRunEventCallback will_run_callback = + BrowserUINativeEventObserver::WillRunEventCallback will_run_callback = base::BindRepeating(&Delegate::WillRunEventOnUIThread, base::Unretained(delegate_)); - NativeEventObserver::DidRunEventCallback did_run_callback = + BrowserUINativeEventObserver::DidRunEventCallback did_run_callback = base::BindRepeating(&Delegate::DidRunEventOnUIThread, base::Unretained(delegate_)); - return std::make_unique<NativeEventObserver>(std::move(will_run_callback), - std::move(did_run_callback)); + return std::make_unique<BrowserUINativeEventObserver>( + std::move(will_run_callback), std::move(did_run_callback)); } MetricSource::~MetricSource() {
diff --git a/content/browser/scheduler/responsiveness/metric_source.h b/content/browser/scheduler/responsiveness/metric_source.h index d07bac83..c3c73b4 100644 --- a/content/browser/scheduler/responsiveness/metric_source.h +++ b/content/browser/scheduler/responsiveness/metric_source.h
@@ -5,6 +5,8 @@ #ifndef CONTENT_BROWSER_SCHEDULER_RESPONSIVENESS_METRIC_SOURCE_H_ #define CONTENT_BROWSER_SCHEDULER_RESPONSIVENESS_METRIC_SOURCE_H_ +#include <stdint.h> + #include <memory> #include "base/functional/callback.h" @@ -20,7 +22,7 @@ namespace responsiveness { class MessageLoopObserver; -class NativeEventObserver; +class BrowserUINativeEventObserver; // This class represents the source of browser responsiveness metrics. // This class watches events and tasks processed on the UI and IO threads of the @@ -59,8 +61,8 @@ // These methods are called by the NativeEventObserver of the UI thread to // allow Delegate to collect metadata about the events being run. - virtual void WillRunEventOnUIThread(const void* opaque_identifier) = 0; - virtual void DidRunEventOnUIThread(const void* opaque_identifier) = 0; + virtual void WillRunEventOnUIThread(uintptr_t opaque_identifier) = 0; + virtual void DidRunEventOnUIThread(uintptr_t opaque_identifier) = 0; }; explicit MetricSource(Delegate* delegate); @@ -83,7 +85,8 @@ void Destroy(base::ScopedClosureRunner on_finish_destroy); protected: - virtual std::unique_ptr<NativeEventObserver> CreateNativeEventObserver(); + virtual std::unique_ptr<BrowserUINativeEventObserver> + CreateNativeEventObserver(); virtual void RegisterMessageLoopObserverUI(); virtual void RegisterMessageLoopObserverIO(); @@ -96,7 +99,7 @@ // The following members are all affine to the UI thread. std::unique_ptr<MessageLoopObserver> message_loop_observer_ui_; - std::unique_ptr<NativeEventObserver> native_event_observer_ui_; + std::unique_ptr<BrowserUINativeEventObserver> native_event_observer_ui_; // The following members are all affine to the IO thread. std::unique_ptr<MessageLoopObserver> message_loop_observer_io_;
diff --git a/content/browser/scheduler/responsiveness/metric_source_unittest.cc b/content/browser/scheduler/responsiveness/metric_source_unittest.cc index dbec700..ff384e7 100644 --- a/content/browser/scheduler/responsiveness/metric_source_unittest.cc +++ b/content/browser/scheduler/responsiveness/metric_source_unittest.cc
@@ -47,8 +47,8 @@ did_run_task_on_io_thread_++; } - void WillRunEventOnUIThread(const void* opaque_identifier) override {} - void DidRunEventOnUIThread(const void* opaque_identifier) override {} + void WillRunEventOnUIThread(uintptr_t opaque_identifier) override {} + void DidRunEventOnUIThread(uintptr_t opaque_identifier) override {} bool set_up_on_io_thread() { return set_up_on_io_thread_; } bool tear_down_on_ui_thread() { return tear_down_on_ui_thread_; } @@ -77,7 +77,8 @@ base::OnceClosure on_destroyed = base::DoNothing()) : MetricSource(delegate), on_destroyed_(std::move(on_destroyed)) {} - std::unique_ptr<NativeEventObserver> CreateNativeEventObserver() override { + std::unique_ptr<BrowserUINativeEventObserver> CreateNativeEventObserver() + override { return nullptr; }
diff --git a/content/browser/scheduler/responsiveness/native_event_observer.cc b/content/browser/scheduler/responsiveness/native_event_observer.cc index 6ae36431..d9aa68d 100644 --- a/content/browser/scheduler/responsiveness/native_event_observer.cc +++ b/content/browser/scheduler/responsiveness/native_event_observer.cc
@@ -26,7 +26,7 @@ namespace content { namespace responsiveness { -NativeEventObserver::NativeEventObserver( +BrowserUINativeEventObserver::BrowserUINativeEventObserver( WillRunEventCallback will_run_event_callback, DidRunEventCallback did_run_event_callback) : will_run_event_callback_(will_run_event_callback), @@ -34,60 +34,66 @@ RegisterObserver(); } -NativeEventObserver::~NativeEventObserver() { - DeregisterObserver(); +BrowserUINativeEventObserver::~BrowserUINativeEventObserver() { + UnregisterObserver(); } #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) -void NativeEventObserver::RegisterObserver() { +void BrowserUINativeEventObserver::RegisterObserver() { CHECK(ui::PlatformEventSource::GetInstance()); ui::PlatformEventSource::GetInstance()->AddPlatformEventObserver(this); } -void NativeEventObserver::DeregisterObserver() { +void BrowserUINativeEventObserver::UnregisterObserver() { if (ui::PlatformEventSource::GetInstance()) { ui::PlatformEventSource::GetInstance()->RemovePlatformEventObserver(this); } } -void NativeEventObserver::WillProcessEvent(const ui::PlatformEvent& event) { - EventInfo info{&event}; +void BrowserUINativeEventObserver::WillProcessEvent( + const ui::PlatformEvent& event) { + uintptr_t id = reinterpret_cast<uintptr_t>(&event); + EventInfo info{id}; events_being_processed_.push_back(info); - will_run_event_callback_.Run(&event); + will_run_event_callback_.Run(id); } -void NativeEventObserver::DidProcessEvent(const ui::PlatformEvent& event) { +void BrowserUINativeEventObserver::DidProcessEvent( + const ui::PlatformEvent& event) { EventInfo& info = events_being_processed_.back(); - did_run_event_callback_.Run(info.unique_id.get()); + did_run_event_callback_.Run(info.unique_id); events_being_processed_.pop_back(); } -void NativeEventObserver::PlatformEventSourceDestroying() { +void BrowserUINativeEventObserver::PlatformEventSourceDestroying() { CHECK(ui::PlatformEventSource::GetInstance()); - DeregisterObserver(); + UnregisterObserver(); } #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) #if BUILDFLAG(IS_WIN) -void NativeEventObserver::RegisterObserver() { - base::CurrentUIThread::Get()->AddMessagePumpObserver(this); +void BrowserUINativeEventObserver::RegisterObserver() { + base::CurrentUIThread::Get()->RegisterNativeEventObserver(this); } -void NativeEventObserver::DeregisterObserver() { - base::CurrentUIThread::Get()->RemoveMessagePumpObserver(this); + +void BrowserUINativeEventObserver::UnregisterObserver() { + base::CurrentUIThread::Get()->UnregisterNativeEventObserver(this); } -void NativeEventObserver::WillDispatchMSG(const MSG& msg) { - will_run_event_callback_.Run(&msg); + +void BrowserUINativeEventObserver::WillRunNativeEvent(uintptr_t identifier) { + will_run_event_callback_.Run(identifier); } -void NativeEventObserver::DidDispatchMSG(const MSG& msg) { - did_run_event_callback_.Run(&msg); + +void BrowserUINativeEventObserver::DidRunNativeEvent(uintptr_t identifier) { + did_run_event_callback_.Run(identifier); } #endif // BUILDFLAG(IS_WIN) #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_IOS) -void NativeEventObserver::RegisterObserver() {} -void NativeEventObserver::DeregisterObserver() {} -#endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA) +void BrowserUINativeEventObserver::RegisterObserver() {} +void BrowserUINativeEventObserver::UnregisterObserver() {} +#endif } // namespace responsiveness } // namespace content
diff --git a/content/browser/scheduler/responsiveness/native_event_observer.h b/content/browser/scheduler/responsiveness/native_event_observer.h index 9c0226c..e187c7d8 100644 --- a/content/browser/scheduler/responsiveness/native_event_observer.h +++ b/content/browser/scheduler/responsiveness/native_event_observer.h
@@ -5,6 +5,8 @@ #ifndef CONTENT_BROWSER_SCHEDULER_RESPONSIVENESS_NATIVE_EVENT_OBSERVER_H_ #define CONTENT_BROWSER_SCHEDULER_RESPONSIVENESS_NATIVE_EVENT_OBSERVER_H_ +#include <stdint.h> + #include <vector> #include "base/functional/callback.h" @@ -38,60 +40,57 @@ // On Linux, the hook should be in ui::PlatformEventSource::DispatchEvent. // On Windows, the hook should be in MessagePumpForUI::ProcessMessageHelper. // On Android, the hook should be in <TBD>. -class CONTENT_EXPORT NativeEventObserver +class CONTENT_EXPORT BrowserUINativeEventObserver #if BUILDFLAG(IS_MAC) : public NativeEventProcessorObserver #elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) : public ui::PlatformEventObserver #elif BUILDFLAG(IS_WIN) - : public base::MessagePumpForUI::Observer + : public base::MessagePumpForUI::NativeEventObserver #endif { public: using WillRunEventCallback = - base::RepeatingCallback<void(const void* opaque_identifier)>; + base::RepeatingCallback<void(uintptr_t opaque_identifier)>; using DidRunEventCallback = - base::RepeatingCallback<void(const void* opaque_identifier)>; + base::RepeatingCallback<void(uintptr_t opaque_identifier)>; // The constructor will register the object as an observer of the native event // processor. The destructor will unregister the object. - NativeEventObserver(WillRunEventCallback will_run_event_callback, - DidRunEventCallback did_run_event_callback); + BrowserUINativeEventObserver(WillRunEventCallback will_run_event_callback, + DidRunEventCallback did_run_event_callback); #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) - NativeEventObserver(const NativeEventObserver&) = delete; - NativeEventObserver& operator=(const NativeEventObserver&) = delete; + BrowserUINativeEventObserver(const BrowserUINativeEventObserver&) = delete; + BrowserUINativeEventObserver& operator=(const BrowserUINativeEventObserver&) = + delete; - ~NativeEventObserver() override; + ~BrowserUINativeEventObserver() override; #else - virtual ~NativeEventObserver(); + virtual ~BrowserUINativeEventObserver(); #endif protected: -#if BUILDFLAG(IS_MAC) - // NativeEventProcessorObserver overrides: - // Exposed for tests. - void WillRunNativeEvent(const void* opaque_identifier) override; - void DidRunNativeEvent(const void* opaque_identifier) override; -#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) // ui::PlatformEventObserver overrides: void WillProcessEvent(const ui::PlatformEvent& event) override; void DidProcessEvent(const ui::PlatformEvent& event) override; void PlatformEventSourceDestroying() override; -#elif BUILDFLAG(IS_WIN) - // base::MessagePumpForUI::Observer overrides: - void WillDispatchMSG(const MSG& msg) override; - void DidDispatchMSG(const MSG& msg) override; +#elif BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) + // base::MessagePumpForUI::NativeEventObserver overrides (Win) or + // NativeEventProcessorObserver overrides (Mac): + void WillRunNativeEvent(uintptr_t identifier) override; + void DidRunNativeEvent(uintptr_t identifier) override; #endif private: void RegisterObserver(); - void DeregisterObserver(); + void UnregisterObserver(); #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) struct EventInfo { - raw_ptr<const void> unique_id; + uintptr_t unique_id; }; std::vector<EventInfo> events_being_processed_; #endif
diff --git a/content/browser/scheduler/responsiveness/native_event_observer_browsertest.mm b/content/browser/scheduler/responsiveness/native_event_observer_browsertest.mm index 92abc9a..0d6d651 100644 --- a/content/browser/scheduler/responsiveness/native_event_observer_browsertest.mm +++ b/content/browser/scheduler/responsiveness/native_event_observer_browsertest.mm
@@ -16,27 +16,27 @@ namespace { -class FakeNativeEventObserver : public NativeEventObserver { +class FakeNativeEventObserver : public BrowserUINativeEventObserver { public: FakeNativeEventObserver() - : NativeEventObserver(base::DoNothing(), base::DoNothing()) {} + : BrowserUINativeEventObserver(base::DoNothing(), base::DoNothing()) {} ~FakeNativeEventObserver() override = default; - void WillRunNativeEvent(const void* opaque_identifier) override { + void WillRunNativeEvent(uintptr_t opaque_identifier) override { ASSERT_FALSE(will_run_id_); will_run_id_ = opaque_identifier; } - void DidRunNativeEvent(const void* opaque_identifier) override { + void DidRunNativeEvent(uintptr_t opaque_identifier) override { ASSERT_FALSE(did_run_id_); did_run_id_ = opaque_identifier; } - const void* will_run_id() { return will_run_id_; } - const void* did_run_id() { return did_run_id_; } + uintptr_t will_run_id() { return will_run_id_; } + uintptr_t did_run_id() { return did_run_id_; } private: - raw_ptr<const void> will_run_id_ = nullptr; - raw_ptr<const void> did_run_id_ = nullptr; + uintptr_t will_run_id_ = 0; + uintptr_t did_run_id_ = 0; }; } // namespace @@ -54,8 +54,8 @@ kVK_Return, '\r', NSEventTypeKeyDown, 0); [NSApp sendEvent:event]; - EXPECT_EQ(observer.will_run_id(), (__bridge void*)event); - EXPECT_EQ(observer.did_run_id(), (__bridge void*)event); + EXPECT_EQ(observer.will_run_id(), reinterpret_cast<uintptr_t>((__bridge void*)event)); + EXPECT_EQ(observer.did_run_id(), reinterpret_cast<uintptr_t>((__bridge void*)event)); } } // namespace content::responsiveness
diff --git a/content/browser/scheduler/responsiveness/native_event_observer_browsertest_win.cc b/content/browser/scheduler/responsiveness/native_event_observer_browsertest_win.cc index 5f9f1d6..c17e009e 100644 --- a/content/browser/scheduler/responsiveness/native_event_observer_browsertest_win.cc +++ b/content/browser/scheduler/responsiveness/native_event_observer_browsertest_win.cc
@@ -2,13 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/browser/scheduler/responsiveness/native_event_observer.h" +#include <stdint.h> #include "base/functional/bind.h" #include "base/functional/callback_helpers.h" #include "base/memory/raw_ptr.h" #include "base/run_loop.h" +#include "base/task/current_thread.h" #include "base/win/message_window.h" +#include "content/browser/scheduler/responsiveness/native_event_observer.h" #include "content/public/test/browser_test.h" #include "content/public/test/content_browser_test.h" @@ -28,19 +30,19 @@ class ResponsivenessNativeEventObserverBrowserTest : public ContentBrowserTest { public: - void WillRunEvent(const void* opaque_id) { + void WillRunEvent(uintptr_t opaque_id) { ASSERT_FALSE(will_run_id_); will_run_id_ = opaque_id; } - void DidRunEvent(const void* opaque_id) { + void DidRunEvent(uintptr_t opaque_id) { ASSERT_FALSE(did_run_id_); did_run_id_ = opaque_id; std::move(quit_closure_).Run(); } protected: - raw_ptr<const void> will_run_id_ = nullptr; - raw_ptr<const void> did_run_id_ = nullptr; + uintptr_t will_run_id_ = 0; + uintptr_t did_run_id_ = 0; base::OnceClosure quit_closure_; }; @@ -49,24 +51,36 @@ base::win::MessageWindow window; EXPECT_TRUE(window.Create(base::BindRepeating(&HandleMessage))); - NativeEventObserver observer( - base::BindRepeating( - &ResponsivenessNativeEventObserverBrowserTest::WillRunEvent, - base::Unretained(this)), - base::BindRepeating( - &ResponsivenessNativeEventObserverBrowserTest::DidRunEvent, - base::Unretained(this))); + // The production Watcher already registered a NativeEventObserver. + // Overwrite it for this test to avoid the CHECK(!native_event_observer_) in + // BrowserUINativeEventObserver's constructor. + base::MessagePumpForUI::NativeEventObserver* old_observer = + base::CurrentUIThread::Get()->ResetNativeEventObserverForTesting(nullptr); - EXPECT_FALSE(will_run_id_); - EXPECT_FALSE(did_run_id_); + { + BrowserUINativeEventObserver observer( + base::BindRepeating( + &ResponsivenessNativeEventObserverBrowserTest::WillRunEvent, + base::Unretained(this)), + base::BindRepeating( + &ResponsivenessNativeEventObserverBrowserTest::DidRunEvent, + base::Unretained(this))); - EXPECT_NE(PostMessage(window.hwnd(), WM_USER, 100, 0), 0); - base::RunLoop run_loop; - quit_closure_ = run_loop.QuitClosure(); - run_loop.Run(); + EXPECT_FALSE(will_run_id_); + EXPECT_FALSE(did_run_id_); - EXPECT_EQ(will_run_id_, did_run_id_); - EXPECT_NE(will_run_id_, nullptr); + EXPECT_NE(PostMessage(window.hwnd(), WM_USER, 100, 0), 0); + base::RunLoop run_loop; + quit_closure_ = run_loop.QuitClosure(); + run_loop.Run(); + + EXPECT_EQ(will_run_id_, did_run_id_); + EXPECT_NE(will_run_id_, 0u); + } + + // Restore the original observer. + base::CurrentUIThread::Get()->ResetNativeEventObserverForTesting( + old_observer); } } // namespace responsiveness
diff --git a/content/browser/scheduler/responsiveness/native_event_observer_mac.mm b/content/browser/scheduler/responsiveness/native_event_observer_mac.mm index d7f32cb53..c2e0d72 100644 --- a/content/browser/scheduler/responsiveness/native_event_observer_mac.mm +++ b/content/browser/scheduler/responsiveness/native_event_observer_mac.mm
@@ -10,23 +10,25 @@ namespace content::responsiveness { -void NativeEventObserver::RegisterObserver() { +void BrowserUINativeEventObserver::RegisterObserver() { DCHECK([NSApp conformsToProtocol:@protocol(NativeEventProcessor)]); id<NativeEventProcessor> processor = static_cast<id<NativeEventProcessor>>(NSApp); [processor addNativeEventProcessorObserver:this]; } -void NativeEventObserver::DeregisterObserver() { +void BrowserUINativeEventObserver::UnregisterObserver() { DCHECK([NSApp conformsToProtocol:@protocol(NativeEventProcessor)]); id<NativeEventProcessor> processor = static_cast<id<NativeEventProcessor>>(NSApp); [processor removeNativeEventProcessorObserver:this]; } -void NativeEventObserver::WillRunNativeEvent(const void* opaque_identifier) { +void BrowserUINativeEventObserver::WillRunNativeEvent( + uintptr_t opaque_identifier) { will_run_event_callback_.Run(opaque_identifier); } -void NativeEventObserver::DidRunNativeEvent(const void* opaque_identifier) { +void BrowserUINativeEventObserver::DidRunNativeEvent( + uintptr_t opaque_identifier) { did_run_event_callback_.Run(opaque_identifier); }
diff --git a/content/browser/scheduler/responsiveness/watcher.cc b/content/browser/scheduler/responsiveness/watcher.cc index b02d7cc2..aa98079f 100644 --- a/content/browser/scheduler/responsiveness/watcher.cc +++ b/content/browser/scheduler/responsiveness/watcher.cc
@@ -21,7 +21,7 @@ namespace content { namespace responsiveness { -Watcher::Metadata::Metadata(const void* identifier, +Watcher::Metadata::Metadata(uintptr_t identifier, bool was_blocked_or_low_priority, base::TimeTicks execution_start_time) : identifier(identifier), @@ -92,7 +92,8 @@ } const base::TimeTicks execution_start_time = base::TimeTicks::Now(); - currently_running_metadata->emplace_back(task, was_blocked_or_low_priority, + currently_running_metadata->emplace_back(reinterpret_cast<uintptr_t>(task), + was_blocked_or_low_priority, execution_start_time); } @@ -105,7 +106,8 @@ // TaskRunner Observers may be added while a task is being run, which means // that there was no corresponding WillRunTask. if (currently_running_metadata->empty() || - (task != currently_running_metadata->back().identifier)) [[unlikely]] { + (reinterpret_cast<uintptr_t>(task) != + currently_running_metadata->back().identifier)) [[unlikely]] { *mismatched_task_identifiers += 1; // Mismatches can happen, so just ignore them for now. See // https://crbug.com/929813 and https://crbug.com/931874 for details. @@ -148,7 +150,7 @@ callback(queue_time, metadata.execution_start_time, execution_finish_time); } -void Watcher::WillRunEventOnUIThread(const void* opaque_identifier) { +void Watcher::WillRunEventOnUIThread(uintptr_t opaque_identifier) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); // Reentrancy should be rare. if (!currently_running_metadata_ui_.empty()) [[unlikely]] { @@ -161,7 +163,7 @@ execution_start_time); } -void Watcher::DidRunEventOnUIThread(const void* opaque_identifier) { +void Watcher::DidRunEventOnUIThread(uintptr_t opaque_identifier) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); // Calls to DidRunEventOnUIThread should always be paired with
diff --git a/content/browser/scheduler/responsiveness/watcher.h b/content/browser/scheduler/responsiveness/watcher.h index ba9b057..6ea3063 100644 --- a/content/browser/scheduler/responsiveness/watcher.h +++ b/content/browser/scheduler/responsiveness/watcher.h
@@ -5,6 +5,8 @@ #ifndef CONTENT_BROWSER_SCHEDULER_RESPONSIVENESS_WATCHER_H_ #define CONTENT_BROWSER_SCHEDULER_RESPONSIVENESS_WATCHER_H_ +#include <stdint.h> + #include <variant> #include <vector> @@ -56,8 +58,8 @@ bool was_blocked_or_low_priority) override; void DidRunTaskOnIOThread(const base::PendingTask* task) override; - void WillRunEventOnUIThread(const void* opaque_identifier) override; - void DidRunEventOnUIThread(const void* opaque_identifier) override; + void WillRunEventOnUIThread(uintptr_t opaque_identifier) override; + void DidRunEventOnUIThread(uintptr_t opaque_identifier) override; private: FRIEND_TEST_ALL_PREFIXES(ResponsivenessWatcherTest, TaskForwarding); @@ -69,7 +71,7 @@ // Metadata for currently running tasks and events is needed to track whether // or not they caused reentrancy. struct Metadata { - explicit Metadata(const void* identifier, + explicit Metadata(uintptr_t identifier, bool was_blocked_or_low_priority, base::TimeTicks execution_start_time); @@ -77,7 +79,7 @@ // // `identifier` is not a raw_ptr<...> for performance reasons (based on // analysis of sampling profiler data and tab_search:top100:2020). - RAW_PTR_EXCLUSION const void* const identifier; + uintptr_t const identifier; // Whether the task was at some point in a queue that was blocked or low // priority.
diff --git a/content/browser/scheduler/responsiveness/watcher_unittest.cc b/content/browser/scheduler/responsiveness/watcher_unittest.cc index 054171e..22c7bd0 100644 --- a/content/browser/scheduler/responsiveness/watcher_unittest.cc +++ b/content/browser/scheduler/responsiveness/watcher_unittest.cc
@@ -90,7 +90,8 @@ MetricSource::RegisterMessageLoopObserverIO(); } - std::unique_ptr<NativeEventObserver> CreateNativeEventObserver() override { + std::unique_ptr<BrowserUINativeEventObserver> CreateNativeEventObserver() + override { return nullptr; } @@ -232,7 +233,7 @@ TEST_F(ResponsivenessWatcherTest, NativeEvents) { const base::TimeTicks start_time = base::TimeTicks::Now(); - void* opaque_identifier = reinterpret_cast<void*>(0x1234); + uintptr_t opaque_identifier = 0x1234; watcher_->WillRunEventOnUIThread(opaque_identifier); task_environment_.FastForwardBy(base::Milliseconds(1));
diff --git a/content/browser/screen_details/screen_details_browsertest.cc b/content/browser/screen_details/screen_details_browsertest.cc index d96aa353..fc4f48a6 100644 --- a/content/browser/screen_details/screen_details_browsertest.cc +++ b/content/browser/screen_details/screen_details_browsertest.cc
@@ -27,8 +27,7 @@ ASSERT_TRUE(NavigateToURL(shell(), GetTestUrl(nullptr, "empty.html"))); ASSERT_EQ(true, EvalJs(shell(), "'getScreenDetails' in self")); // getScreenDetails() rejects its promise without permission. - EXPECT_THAT(EvalJs(shell(), "await getScreenDetails()"), - EvalJsResult::IsError()); + EXPECT_FALSE(ExecJs(shell(), "await getScreenDetails()")); } // TODO(crbug.com/40145721): Test ScreenDetails API values with permission.
diff --git a/content/browser/web_contents/web_contents_view_android.cc b/content/browser/web_contents/web_contents_view_android.cc index 58256333..56377041 100644 --- a/content/browser/web_contents/web_contents_view_android.cc +++ b/content/browser/web_contents/web_contents_view_android.cc
@@ -558,7 +558,7 @@ // changes, we resend the entered event before sending the update or drop. bool WebContentsViewAndroid::OnDragEvent(const ui::DragEventAndroid& event) { switch (event.action()) { - case JNI_DragEvent::ACTION_DRAG_ENTERED: { + case DragEventJni::ACTION_DRAG_ENTERED: { drag_metadata_.clear(); for (const std::u16string& mime_type : event.mime_types()) { if (mime_type == ui::kMimeTypePlainText16 || @@ -581,10 +581,10 @@ OnDragEntered(event.location(), event.screen_location()); break; } - case JNI_DragEvent::ACTION_DRAG_LOCATION: + case DragEventJni::ACTION_DRAG_LOCATION: OnDragUpdated(event.location(), event.screen_location()); break; - case JNI_DragEvent::ACTION_DROP: { + case DragEventJni::ACTION_DROP: { drop_data_ = std::make_unique<DropData>(); drop_data_->did_originate_from_renderer = false; drop_data_->document_is_handling_drag = document_is_handling_drag_; @@ -611,13 +611,13 @@ OnPerformDrop(event.location(), event.screen_location()); break; } - case JNI_DragEvent::ACTION_DRAG_EXITED: + case DragEventJni::ACTION_DRAG_EXITED: OnDragExited(); break; - case JNI_DragEvent::ACTION_DRAG_ENDED: + case DragEventJni::ACTION_DRAG_ENDED: OnDragEnded(); break; - case JNI_DragEvent::ACTION_DRAG_STARTED: + case DragEventJni::ACTION_DRAG_STARTED: // Nothing meaningful to do. break; }
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/captioning/CaptioningBridge.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/captioning/CaptioningBridge.java index 91c9ff7..3295fa4 100644 --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/captioning/CaptioningBridge.java +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/captioning/CaptioningBridge.java
@@ -61,7 +61,11 @@ private void syncToDelegate() { mCaptioningChangeDelegate.onEnabledChanged(mCaptioningManager.isEnabled()); mCaptioningChangeDelegate.onFontScaleChanged(mCaptioningManager.getFontScale()); - mCaptioningChangeDelegate.onLocaleChanged(mCaptioningManager.getLocale()); + try { + mCaptioningChangeDelegate.onLocaleChanged(mCaptioningManager.getLocale()); + } catch (java.util.IllformedLocaleException e) { + mCaptioningChangeDelegate.onLocaleChanged(null); + } mCaptioningChangeDelegate.onUserStyleChanged( getCaptioningStyleFrom(mCaptioningManager.getUserStyle())); }
diff --git a/content/public/browser/native_event_processor_observer_mac.h b/content/public/browser/native_event_processor_observer_mac.h index 0d81dff..320e545 100644 --- a/content/public/browser/native_event_processor_observer_mac.h +++ b/content/public/browser/native_event_processor_observer_mac.h
@@ -5,15 +5,15 @@ #ifndef CONTENT_PUBLIC_BROWSER_NATIVE_EVENT_PROCESSOR_OBSERVER_MAC_H_ #define CONTENT_PUBLIC_BROWSER_NATIVE_EVENT_PROCESSOR_OBSERVER_MAC_H_ +#include <stdint.h> + #include "base/memory/raw_ptr.h" #include "base/memory/raw_ptr_exclusion.h" #include "base/observer_list.h" #include "content/common/content_export.h" #if __OBJC__ - @class NSEvent; - #endif // __OBJC__ namespace content { @@ -21,10 +21,10 @@ class NativeEventProcessorObserver { public: // Called right before a native event is run. - virtual void WillRunNativeEvent(const void* opaque_identifier) = 0; + virtual void WillRunNativeEvent(uintptr_t opaque_identifier) = 0; // Called right after a native event is run. - virtual void DidRunNativeEvent(const void* opaque_identifier) = 0; + virtual void DidRunNativeEvent(uintptr_t opaque_identifier) = 0; }; #if __OBJC__
diff --git a/content/public/browser/native_event_processor_observer_mac.mm b/content/public/browser/native_event_processor_observer_mac.mm index fdb85e5..1cd1c766 100644 --- a/content/public/browser/native_event_processor_observer_mac.mm +++ b/content/public/browser/native_event_processor_observer_mac.mm
@@ -15,13 +15,15 @@ NSEvent* event) : observer_list_(observer_list), event_(event) { for (auto& observer : *observer_list_) - observer.WillRunNativeEvent((__bridge const void*)event_); + observer.WillRunNativeEvent( + reinterpret_cast<uintptr_t>((__bridge const void*)event_)); } ScopedNotifyNativeEventProcessorObserver:: ~ScopedNotifyNativeEventProcessorObserver() { for (auto& obs : *observer_list_) { - obs.DidRunNativeEvent((__bridge const void*)event_); + obs.DidRunNativeEvent( + reinterpret_cast<uintptr_t>((__bridge const void*)event_)); } }
diff --git a/content/public/test/browser_test_utils.h b/content/public/test/browser_test_utils.h index 95443c0d..150f136 100644 --- a/content/public/test/browser_test_utils.h +++ b/content/public/test/browser_test_utils.h
@@ -868,13 +868,16 @@ ~EvalJsResult(); // Matchers for successful & unsuccessful runs. + // + // Note: `IsError` is intentionally not provided. If you find yourself looking + // for `IsError`, use `EXPECT_FALSE(ExecJs(...))` or `EXPECT_THAT(EvalJs(...), + // ErrorIs(...))` instead. static auto IsOk() { return testing::Property(&EvalJsResult::is_ok, true); } template <typename M> static auto IsOkAndHolds(M m) { return testing::Field("data_", &EvalJsResult::data_, testing::VariantWith<base::Value>(m)); } - static auto IsError() { return testing::Not(IsOk()); } template <typename M> static auto ErrorIs(M m) { return testing::Field("data_", &EvalJsResult::data_,
diff --git a/docs/rust/clippy.md b/docs/rust/clippy.md index 5af7311..5066bc2 100644 --- a/docs/rust/clippy.md +++ b/docs/rust/clippy.md
@@ -58,12 +58,13 @@ Clippy is enabled on a subset of CQ bots: `android-arm64-rel`, +`linux-chromeos-rel`, `linux-rel`, `mac-rel`, `win-rel`. -TODO(https://crbug.com/41484295): Add other bots and target platforms - e.g.: -`ios-simulator` (?) and `linux-chromeos-rel`. +TODO(https://crbug.com/41484295): Add other bots and target platforms +if additional code needs to be covered by Clippy (`ios-simulator`?). ## Future work
diff --git a/extensions/common/api/automation.idl b/extensions/common/api/automation.idl index e061bf1..1483a6f 100644 --- a/extensions/common/api/automation.idl +++ b/extensions/common/api/automation.idl
@@ -7,7 +7,7 @@ // tree, but only exposes the <em>semantic</em> structure of a page. It can be // used to programmatically interact with a page by examining names, roles, and // states, listening for events, and performing actions on nodes. -[nocompile] namespace automation { +namespace automation { // Keep the following enums in sync with 'ui/accessibility/ax_enums.mojom'. // They are kept here purely for extension docs generation. @@ -69,10 +69,12 @@ labeledByChanged, languageChanged, layoutComplete, - layoutInvalidated, // fired when aria-busy goes false + // fired when aria-busy goes false + layoutInvalidated, liveRegionChanged, liveRegionCreated, - liveRegionNodeChanged, // fired on a node within a live region. + // fired on a node within a live region. + liveRegionNodeChanged, liveRelevantChanged, liveStatusChanged, loadComplete, @@ -133,7 +135,8 @@ tooltipOpened, treeChanged, valueInTextFieldChanged, - valueChanged, // Deprecated. + // Deprecated. + valueChanged, windowActivated, windowDeactivated, windowVisibilityChanged @@ -265,7 +268,8 @@ list, listBox, listBoxOption, - listGrid, // Native + // Native + listGrid, listItem, listMarker, log, @@ -444,36 +448,25 @@ // nodeCreated means that this node was added to the tree and its parent is // new as well, so it's just one node in a new subtree that was added. enum TreeChangeType { - /** - * This node was added to the tree and its parent is new as well, - * so it's just one node in a new subtree that was added. - */ + // This node was added to the tree and its parent is new as well, + // so it's just one node in a new subtree that was added. nodeCreated, - /** - * This node was added to the tree but its parent was already in the - * tree, so it's possibly the root of a new subtree - it does not mean - * that it necessarily has children. - */ + // This node was added to the tree but its parent was already in the + // tree, so it's possibly the root of a new subtree - it does not mean + // that it necessarily has children. subtreeCreated, - /** - * This node changed. - */ + // This node changed. nodeChanged, - /** - * This node's text (name) changed. - */ + // This node's text (name) changed. textChanged, - /** - * This node was removed. - */ + // This node was removed. nodeRemoved, - /** - * This subtree has finished an update. - */ + + // This subtree has finished an update. subtreeUpdateEnd }; @@ -556,128 +549,128 @@ press, select, uncheck -}; + }; - // Types of markers on text. See <code>AutomationNode.markerTypes</code>. -enum MarkerType { - spelling, - grammar, - textMatch, - activeSuggestion, - suggestion, - highlight -}; + // Types of markers on text. See <code>AutomationNode.markerTypes</code>. + enum MarkerType { + spelling, + grammar, + textMatch, + activeSuggestion, + suggestion, + highlight + }; -// The following three enums are associated with an $(ref:automation.AutomationIntent). + // The following three enums are associated with an $(ref:automation.AutomationIntent). -// A command associated with an $(ref:automation.AutomationIntent). -enum IntentCommandType { - clearSelection, - delete, - dictate, - extendSelection, - format, - history, - insert, - marker, - moveSelection, - setSelection -}; + // A command associated with an $(ref:automation.AutomationIntent). + enum IntentCommandType { + clearSelection, + delete, + dictate, + extendSelection, + format, + history, + insert, + marker, + moveSelection, + setSelection + }; -// The type of an input event associated with an $(ref:automation.AutomationIntent). It describes an edit -// command, e.g. IntentCommandType.insert, in more detail. -enum IntentInputEventType { - // Insertion. - insertText, - insertLineBreak, - insertParagraph, - insertOrderedList, - insertUnorderedList, - insertHorizontalRule, - insertFromPaste, - insertFromDrop, - insertFromYank, - insertTranspose, - insertReplacementText, - insertCompositionText, - insertLink, - // Deletion. - deleteWordBackward, - deleteWordForward, - deleteSoftLineBackward, - deleteSoftLineForward, - deleteHardLineBackward, - deleteHardLineForward, - deleteContentBackward, - deleteContentForward, - deleteByCut, - deleteByDrag, - // History. - historyUndo, - historyRedo, - // Formatting. - formatBold, - formatItalic, - formatUnderline, - formatStrikeThrough, - formatSuperscript, - formatSubscript, - formatJustifyCenter, - formatJustifyFull, - formatJustifyRight, - formatJustifyLeft, - formatIndent, - formatOutdent, - formatRemove, - formatSetBlockTextDirection -}; + // The type of an input event associated with an $(ref:automation.AutomationIntent). It describes an edit + // command, e.g. IntentCommandType.insert, in more detail. + enum IntentInputEventType { + // Insertion. + insertText, + insertLineBreak, + insertParagraph, + insertOrderedList, + insertUnorderedList, + insertHorizontalRule, + insertFromPaste, + insertFromDrop, + insertFromYank, + insertTranspose, + insertReplacementText, + insertCompositionText, + insertLink, + // Deletion. + deleteWordBackward, + deleteWordForward, + deleteSoftLineBackward, + deleteSoftLineForward, + deleteHardLineBackward, + deleteHardLineForward, + deleteContentBackward, + deleteContentForward, + deleteByCut, + deleteByDrag, + // History. + historyUndo, + historyRedo, + // Formatting. + formatBold, + formatItalic, + formatUnderline, + formatStrikeThrough, + formatSuperscript, + formatSubscript, + formatJustifyCenter, + formatJustifyFull, + formatJustifyRight, + formatJustifyLeft, + formatIndent, + formatOutdent, + formatRemove, + formatSetBlockTextDirection + }; -// A text boundary associated with an $(ref:automation.AutomationIntent). -enum IntentTextBoundaryType { - character, - formatEnd, - formatStart, - formatStartOrEnd, - lineEnd, - lineStart, - lineStartOrEnd, - object, - pageEnd, - pageStart, - pageStartOrEnd, - paragraphEnd, - paragraphStart, - paragraphStartSkippingEmptyParagraphs, - paragraphStartOrEnd, - sentenceEnd, - sentenceStart, - sentenceStartOrEnd, - webPage, - wordEnd, - wordStart, - wordStartOrEnd -}; + // A text boundary associated with an $(ref:automation.AutomationIntent). + enum IntentTextBoundaryType { + character, + formatEnd, + formatStart, + formatStartOrEnd, + lineEnd, + lineStart, + lineStartOrEnd, + object, + pageEnd, + pageStart, + pageStartOrEnd, + paragraphEnd, + paragraphStart, + paragraphStartSkippingEmptyParagraphs, + paragraphStartOrEnd, + sentenceEnd, + sentenceStart, + sentenceStartOrEnd, + webPage, + wordEnd, + wordStart, + wordStartOrEnd + }; -// A move direction associated with an $(ref:automation.AutomationIntent). -enum IntentMoveDirectionType { - backward, - forward -}; + // A move direction associated with an $(ref:automation.AutomationIntent). + enum IntentMoveDirectionType { + backward, + forward + }; -// A sort applied to a table row or column header. -enum SortDirectionType { - unsorted, - ascending, - descending, - other -}; + // A sort applied to a table row or column header. + enum SortDirectionType { + unsorted, + ascending, + descending, + other + }; -// A type of AutomationPosition. -enum PositionType { - null, - text, - tree -}; + // A type of AutomationPosition. + enum PositionType { + null, + text, + tree + }; dictionary Rect { long left;
diff --git a/extensions/strings/extensions_strings_th.xtb b/extensions/strings/extensions_strings_th.xtb index 83a9db7..4a9c0383 100644 --- a/extensions/strings/extensions_strings_th.xtb +++ b/extensions/strings/extensions_strings_th.xtb
@@ -25,6 +25,7 @@ <translation id="3115238746683532089">ผลิตภัณฑ์ที่ไม่รู้จัก <ph name="PRODUCT_ID" /> จากผู้ขาย <ph name="VENDOR_ID" /> (หมายเลขซีเรียล <ph name="SERIAL_NUMBER" />)</translation> <translation id="3144135466825225871">ไม่สามารถแทนที่ไฟล์ CRX ได้ โปรดตรวจสอบดูว่าไฟล์มีการใช้งานอยู่หรือไม่</translation> <translation id="3163201441334626963">ผลิตภัณฑ์ที่ไม่รู้จัก <ph name="PRODUCT_ID" /> จากผู้ขาย <ph name="VENDOR_ID" /></translation> +<translation id="3174723475300476613">องค์กรของคุณบล็อกการเข้าถึงส่วนขยายนี้</translation> <translation id="3242289508736283383">ต้องติดตั้งแอปที่มีแอตทริบิวต์ไฟล์ Manifest ที่ชื่อ "kiosk_only" ในโหมดคีออสก์ของ Chrome OS</translation> <translation id="3393440416772303020"><ph name="PRODUCT_NAME" /> (หมายเลขซีเรียล <ph name="SERIAL_NUMBER" />)</translation> <translation id="3466070586188012397"><ph name="PRODUCT_NAME" /> จากผู้ขาย <ph name="VENDOR_ID" /> (หมายเลขซีเรียล <ph name="SERIAL_NUMBER" />)</translation> @@ -32,6 +33,7 @@ <translation id="3834775135533257713">ไม่สามารถเพิ่มแอปพลิเคชัน "<ph name="TO_INSTALL_APP_NAME" />" เนื่องจากขัดแย้งกับ "<ph name="INSTALLED_APP_NAME" />"</translation> <translation id="388442998277590542">ไม่สามารถโหลดหน้าตัวเลือก "<ph name="OPTIONS_PAGE" />"</translation> <translation id="3984413272403535372">พบข้อผิดพลาดขณะเซ็นชื่อบนส่วนขยาย</translation> +<translation id="4094452115117798451">องค์กรของคุณบล็อกการเข้าถึงหมวดหมู่ส่วนขยายนี้</translation> <translation id="4233778200880751280">ไม่สามารถโหลดหน้าเกี่ยวกับ "<ph name="ABOUT_PAGE" />"</translation> <translation id="424963718355121712">แอปต้องได้รับบริการจากโฮสต์ที่แอปนั้นมีผลกระทบ</translation> <translation id="4306119971288449206">แอปต้องได้รับบริการจากประเภทเนื้อหา "<ph name="CONTENT_TYPE" />"</translation>
diff --git a/gpu/command_buffer/service/dawn_context_provider.cc b/gpu/command_buffer/service/dawn_context_provider.cc index e2d38f8..8e358f1 100644 --- a/gpu/command_buffer/service/dawn_context_provider.cc +++ b/gpu/command_buffer/service/dawn_context_provider.cc
@@ -139,6 +139,11 @@ for (const auto& toggle : gpu_preferences.disabled_dawn_features_list) { disabled_toggles.push_back(toggle.c_str()); } + + // TODO(crbug.com/486866985): Remove this once dynamic rendering perf + // regressions are investigated. + disabled_toggles.push_back("vulkan_use_dynamic_rendering"); + return disabled_toggles; } @@ -290,9 +295,6 @@ wgpu::FeatureName::SharedBufferMemoryD3D12Resource, wgpu::FeatureName::TransientAttachments, - - wgpu::FeatureName::DawnLoadResolveTexture, - wgpu::FeatureName::DawnPartialLoadResolveTexture, wgpu::FeatureName::DawnTexelCopyBufferRowAlignment, wgpu::FeatureName::FlexibleTextureViews, }; @@ -302,12 +304,17 @@ continue; } features.push_back(feature); + } - // Enabling MSAARenderToSingleSampled causes performance regression without - // TransientAttachments support. - if (feature == wgpu::FeatureName::TransientAttachments && - adapter.HasFeature(wgpu::FeatureName::MSAARenderToSingleSampled)) { - features.push_back(wgpu::FeatureName::MSAARenderToSingleSampled); + // Both MSAARenderToSingleSampled and DawnLoadResolveTexture are used to + // unresolve a single-sampled texture for multi-sampled rendering. + // We prefer the former if it's available, + if (adapter.HasFeature(wgpu::FeatureName::MSAARenderToSingleSampled)) { + features.push_back(wgpu::FeatureName::MSAARenderToSingleSampled); + } else if (adapter.HasFeature(wgpu::FeatureName::DawnLoadResolveTexture)) { + features.push_back(wgpu::FeatureName::DawnLoadResolveTexture); + if (adapter.HasFeature(wgpu::FeatureName::DawnPartialLoadResolveTexture)) { + features.push_back(wgpu::FeatureName::DawnPartialLoadResolveTexture); } }
diff --git a/gpu/command_buffer/service/gl_utils.cc b/gpu/command_buffer/service/gl_utils.cc index b5bf555..71f362f 100644 --- a/gpu/command_buffer/service/gl_utils.cc +++ b/gpu/command_buffer/service/gl_utils.cc
@@ -244,14 +244,13 @@ base::flat_map<uint32_t, std::vector<uint64_t>>& drm_formats_and_modifiers, const FeatureInfo* feature_info) { // Populate list of supported mappable formats based on FeatureFlags. - base::flat_set<viz::SharedImageFormat> mappable_formats = - base::MakeFlatSet<viz::SharedImageFormat>(std::vector({ - viz::SinglePlaneFormat::kBGR_565, - viz::SinglePlaneFormat::kRGBA_8888, - viz::SinglePlaneFormat::kRGBX_8888, - viz::MultiPlaneFormat::kYV12, - viz::MultiPlaneFormat::kNV12, - })); + base::flat_set<viz::SharedImageFormat> mappable_formats = { + viz::SinglePlaneFormat::kBGR_565, // + viz::SinglePlaneFormat::kRGBA_8888, // + viz::SinglePlaneFormat::kRGBX_8888, // + viz::MultiPlaneFormat::kYV12, // + viz::MultiPlaneFormat::kNV12, // + }; const auto& flags = feature_info->feature_flags(); if (flags.enable_texture_half_float_linear) { mappable_formats.insert(viz::SinglePlaneFormat::kRGBA_F16);
diff --git a/infra/archive_config/linux-archive-rel.json b/infra/archive_config/linux-archive-rel.json index 9cc8c13b..0d07865 100644 --- a/infra/archive_config/linux-archive-rel.json +++ b/infra/archive_config/linux-archive-rel.json
@@ -20,9 +20,7 @@ "product_logo_48.png", "resources.pak", "v8_context_snapshot.bin", - "vk_swiftshader_icd.json", - "xdg-mime", - "xdg-settings" + "vk_swiftshader_icd.json" ], "dirs": ["locales", "resources"], "rename_dirs": [
diff --git a/infra/archive_config/linux-chromiumos-full.json b/infra/archive_config/linux-chromiumos-full.json index fba01ae..82657bc 100644 --- a/infra/archive_config/linux-chromiumos-full.json +++ b/infra/archive_config/linux-chromiumos-full.json
@@ -18,9 +18,7 @@ "PrivacySandboxAttestationsPreloaded/privacy-sandbox-attestations.dat", "product_logo_48.png", "resources.pak", - "snapshot_blob.bin", - "xdg-mime", - "xdg-settings" + "snapshot_blob.bin" ], "dirs": ["locales", "resources", "mojo_service_manager"], "rename_dirs": [
diff --git a/infra/config/generated/builders/build/linux-chromeos-build-perf-ninja/gn-args.json b/infra/config/generated/builders/build/linux-chromeos-build-perf-ninja/gn-args.json index a3c74207..083d7fa 100644 --- a/infra/config/generated/builders/build/linux-chromeos-build-perf-ninja/gn-args.json +++ b/infra/config/generated/builders/build/linux-chromeos-build-perf-ninja/gn-args.json
@@ -5,6 +5,7 @@ "enable_backup_ref_ptr_feature_flag": true, "enable_dangling_raw_ptr_checks": true, "enable_dangling_raw_ptr_feature_flag": true, + "enable_rust_clippy": true, "ffmpeg_branding": "ChromeOS", "is_component_build": false, "is_debug": false,
diff --git a/infra/config/generated/builders/build/linux-chromeos-build-perf-siso/gn-args.json b/infra/config/generated/builders/build/linux-chromeos-build-perf-siso/gn-args.json index 4522ddc..9030665 100644 --- a/infra/config/generated/builders/build/linux-chromeos-build-perf-siso/gn-args.json +++ b/infra/config/generated/builders/build/linux-chromeos-build-perf-siso/gn-args.json
@@ -7,6 +7,7 @@ "enable_backup_ref_ptr_feature_flag": true, "enable_dangling_raw_ptr_checks": true, "enable_dangling_raw_ptr_feature_flag": true, + "enable_rust_clippy": true, "ffmpeg_branding": "ChromeOS", "is_component_build": false, "is_debug": false, @@ -28,6 +29,7 @@ "enable_backup_ref_ptr_feature_flag": true, "enable_dangling_raw_ptr_checks": true, "enable_dangling_raw_ptr_feature_flag": true, + "enable_rust_clippy": true, "ffmpeg_branding": "ChromeOS", "is_component_build": false, "is_debug": false,
diff --git a/infra/config/generated/builders/ci/Linux Builder/targets/chromium.linux.json b/infra/config/generated/builders/ci/Linux Builder/targets/chromium.linux.json index 9baf9cd..f9e50405 100644 --- a/infra/config/generated/builders/ci/Linux Builder/targets/chromium.linux.json +++ b/infra/config/generated/builders/ci/Linux Builder/targets/chromium.linux.json
@@ -2229,7 +2229,6 @@ "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw" ], - "ci_only": true, "isolate_profile_data": true, "merge": { "args": [ @@ -2262,6 +2261,7 @@ "--num-retries=3", "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json" ], + "ci_only": true, "isolate_profile_data": true, "merge": { "args": [
diff --git a/infra/config/generated/builders/ci/Linux Tests/targets/chromium.linux.json b/infra/config/generated/builders/ci/Linux Tests/targets/chromium.linux.json index adbc1bd..4547779 100644 --- a/infra/config/generated/builders/ci/Linux Tests/targets/chromium.linux.json +++ b/infra/config/generated/builders/ci/Linux Tests/targets/chromium.linux.json
@@ -2186,7 +2186,6 @@ "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw" ], - "ci_only": true, "isolate_profile_data": true, "merge": { "args": [ @@ -2219,6 +2218,7 @@ "--num-retries=3", "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json" ], + "ci_only": true, "isolate_profile_data": true, "merge": { "args": [
diff --git a/infra/config/generated/builders/try/linux-chromeos-rel/gn-args.json b/infra/config/generated/builders/try/linux-chromeos-rel/gn-args.json index 346ec2e..ba91e4a 100644 --- a/infra/config/generated/builders/try/linux-chromeos-rel/gn-args.json +++ b/infra/config/generated/builders/try/linux-chromeos-rel/gn-args.json
@@ -5,6 +5,7 @@ "enable_backup_ref_ptr_feature_flag": true, "enable_dangling_raw_ptr_checks": true, "enable_dangling_raw_ptr_feature_flag": true, + "enable_rust_clippy": true, "ffmpeg_branding": "ChromeOS", "is_component_build": false, "is_debug": false,
diff --git a/infra/config/generated/builders/try/linux-dcheck-off-rel/targets/chromium.linux.json b/infra/config/generated/builders/try/linux-dcheck-off-rel/targets/chromium.linux.json index 0dcb10ba..16f6dcd3 100644 --- a/infra/config/generated/builders/try/linux-dcheck-off-rel/targets/chromium.linux.json +++ b/infra/config/generated/builders/try/linux-dcheck-off-rel/targets/chromium.linux.json
@@ -2229,7 +2229,6 @@ "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw" ], - "ci_only": true, "isolate_profile_data": true, "merge": { "args": [ @@ -2262,6 +2261,7 @@ "--num-retries=3", "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json" ], + "ci_only": true, "isolate_profile_data": true, "merge": { "args": [
diff --git a/infra/config/generated/builders/try/linux-full-remote-rel/targets/chromium.linux.json b/infra/config/generated/builders/try/linux-full-remote-rel/targets/chromium.linux.json index 0dcb10ba..16f6dcd3 100644 --- a/infra/config/generated/builders/try/linux-full-remote-rel/targets/chromium.linux.json +++ b/infra/config/generated/builders/try/linux-full-remote-rel/targets/chromium.linux.json
@@ -2229,7 +2229,6 @@ "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw" ], - "ci_only": true, "isolate_profile_data": true, "merge": { "args": [ @@ -2262,6 +2261,7 @@ "--num-retries=3", "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json" ], + "ci_only": true, "isolate_profile_data": true, "merge": { "args": [
diff --git a/infra/config/generated/builders/try/linux-rel/targets/chromium.linux.json b/infra/config/generated/builders/try/linux-rel/targets/chromium.linux.json index 0dcb10ba..16f6dcd3 100644 --- a/infra/config/generated/builders/try/linux-rel/targets/chromium.linux.json +++ b/infra/config/generated/builders/try/linux-rel/targets/chromium.linux.json
@@ -2229,7 +2229,6 @@ "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw" ], - "ci_only": true, "isolate_profile_data": true, "merge": { "args": [ @@ -2262,6 +2261,7 @@ "--num-retries=3", "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json" ], + "ci_only": true, "isolate_profile_data": true, "merge": { "args": [
diff --git a/infra/config/generated/builders/try/linux_chromium_compile_rel_ng/targets/chromium.linux.json b/infra/config/generated/builders/try/linux_chromium_compile_rel_ng/targets/chromium.linux.json index 9baf9cd..f9e50405 100644 --- a/infra/config/generated/builders/try/linux_chromium_compile_rel_ng/targets/chromium.linux.json +++ b/infra/config/generated/builders/try/linux_chromium_compile_rel_ng/targets/chromium.linux.json
@@ -2229,7 +2229,6 @@ "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw" ], - "ci_only": true, "isolate_profile_data": true, "merge": { "args": [ @@ -2262,6 +2261,7 @@ "--num-retries=3", "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json" ], + "ci_only": true, "isolate_profile_data": true, "merge": { "args": [
diff --git a/infra/config/generated/cq-usage/cq-tests.md b/infra/config/generated/cq-usage/cq-tests.md index 193b577..fbf763de 100644 --- a/infra/config/generated/cq-usage/cq-tests.md +++ b/infra/config/generated/cq-usage/cq-tests.md
@@ -1278,8 +1278,10 @@ ### net_unittests iPhone 16 26.0 * [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22)) -### not_site_per_process_blink_wpt_tests +### not_site_per_process_blink_web_tests * [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22)) + +### not_site_per_process_blink_wpt_tests * [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22)) ### not_site_per_process_headless_shell_wpt_tests
diff --git a/infra/config/subprojects/chromium/ci/chromium.linux.star b/infra/config/subprojects/chromium/ci/chromium.linux.star index 8bea48d0..97a0439 100644 --- a/infra/config/subprojects/chromium/ci/chromium.linux.star +++ b/infra/config/subprojects/chromium/ci/chromium.linux.star
@@ -586,6 +586,8 @@ args = [ "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw", ], + ), + "not_site_per_process_blink_wpt_tests": targets.mixin( ci_only = True, ), "telemetry_perf_unittests": targets.mixin(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star index e49cfd3..cbf4d1c 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star
@@ -321,6 +321,7 @@ "partial_code_coverage_instrumentation", "enable_dangling_raw_ptr_feature_flag", "enable_backup_ref_ptr_feature_flag", + "enable_rust_clippy", ], ), compilator = "linux-chromeos-rel-compilator",
diff --git a/internal b/internal index 3783a27..78245b2 160000 --- a/internal +++ b/internal
@@ -1 +1 @@ -Subproject commit 3783a27151702721726a47f6a17af7e9c437eb88 +Subproject commit 78245b2021f438403ac0f74682e9280be4228a42
diff --git a/ios/chrome/app/resources/Settings.bundle/Experimental.plist b/ios/chrome/app/resources/Settings.bundle/Experimental.plist index 38895d7b..e280698f 100644 --- a/ios/chrome/app/resources/Settings.bundle/Experimental.plist +++ b/ios/chrome/app/resources/Settings.bundle/Experimental.plist
@@ -954,6 +954,20 @@ <key>AutocorrectionType</key> <string>No</string> </dict> + <dict> + <key>Type</key> + <string>PSTextFieldSpecifier</string> + <key>Title</key> + <string>Cobrowse GWS URL</string> + <key>Key</key> + <string>CobrowseGwsURL</string> + <key>DefaultValue</key> + <string></string> + <key>KeyboardType</key> + <string>URL</string> + <key>AutocorrectionType</key> + <string>No</string> + </dict> </array> </dict> </plist>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb index a4d58b24..d8e97e32 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="th"> <translation id="1000436330784933699">คุณเปิด Lens ได้ที่นี่</translation> +<translation id="1005291068154454184">วิดีโอแบบเต็มหน้าจอแสดงวิธีการตั้งค่า Chromium เป็นเบราว์เซอร์เริ่มต้น</translation> <translation id="1042296835509784301">เปิดเครื่องมือจัดการรหัสผ่านใน Chromium</translation> <translation id="1047130070405668746">เลือก Chromium</translation> <translation id="1091252999271033193">ซึ่งหมายความว่า Chromium จะขอเว็บไซต์เวอร์ชันมือถือทุกครั้ง</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fa.xtb index d1a87b25..e4cbf43 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fa.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fa.xtb
@@ -18,7 +18,7 @@ <translation id="124228879633599436">Chrome شما قدیمی است. برای حفظ ایمنی، آن را بهروز کنید.</translation> <translation id="1258531953614971819">نکته Chrome: برنامه Chrome را به صفحه اصلی منتقل کنید</translation> <translation id="1333745675627230582">بازی کردن بازی «دایناسور Chrome»</translation> -<translation id="1343830902827845050">ورود به سیستم Chrome</translation> +<translation id="1343830902827845050">وارد سیستم Chrome شوید</translation> <translation id="1352919863522755794">«مدیر گذرواژه Google» نتوانست گذرواژههایتان را بررسی کند. اتصال اینترنت را بررسی کنید.</translation> <translation id="1394995526009609883">هروقت بخواهید میتوانید انتخابهایتان را در تنظیمات Chrome بهروز کنید.</translation> <translation id="1407843355326180937">برای دریافت نشانکها و موارد دیگر در همه دستگاهها، به سیستم این سایت و Chrome وارد شوید.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ja.xtb index 6e99051..389c58e 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ja.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ja.xtb
@@ -164,7 +164,7 @@ <translation id="484033449593719797">Chrome ベータ版ではサポートされていません</translation> <translation id="4840404732697892756">Google アカウントでログインすると、Google パスワード マネージャーでパスワードを確認できるようになります。</translation> <translation id="4903674399067644695">このカードでは、Chrome を最大限に活用するためのヒントを紹介しています。</translation> -<translation id="49200511069271369">組織(<ph name="DOMAIN" />)が、ログインしているアカウントと Chrome の使用方法を管理しています。管理者は特定の機能を設定または制限できます。</translation> +<translation id="49200511069271369">ログインしようとしているアカウントおよび Chrome の使用方法は、組織(<ph name="DOMAIN" />)によって管理されています。管理者は特定の機能を設定または制限できます。</translation> <translation id="4925322001044117929">iPad で Chrome をデフォルトで使用する</translation> <translation id="4934496192263958600">Chrome にログインして同じ設定やデータにアクセス</translation> <translation id="496747131578053942">Chrome のヒント: Google レンズで見たものをそのまま検索</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb index a6dbe3cf..70bf27f 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb
@@ -188,6 +188,7 @@ <translation id="5395376160638294582">ตรวจสอบว่าคุณใช้ข้อมูล Chrome ในบัญชี Google ได้เสมอ</translation> <translation id="5404252374083197467">ตั้งค่า Chrome เป็นค่าเริ่มต้นไหม</translation> <translation id="5439191312780166229">เตือนคุณเกี่ยวกับเว็บไซต์ที่เป็นอันตราย แม้แต่เว็บไซต์ที่ Google ไม่เคยรู้จักมาก่อนด้วยการวิเคราะห์ข้อมูลจากเว็บไซต์มากกว่าการปกป้องแบบมาตรฐาน คุณเลือกข้ามคำเตือนของ Chrome ได้</translation> +<translation id="5453077102022695084">วิดีโอแบบเต็มหน้าจอแสดงวิธีการตั้งค่า Chrome เป็นเบราว์เซอร์เริ่มต้น</translation> <translation id="5460571915754665838">4. เลือก Chrome</translation> <translation id="5492504007368565877">เครื่องมือจัดการรหัสผ่านบน Google ตรวจสอบรหัสผ่านของคุณไม่ได้</translation> <translation id="5525095647255982834">หากต้องการส่งแท็บนี้ไปยังอุปกรณ์อื่น ให้ลงชื่อเข้าใช้ Chrome ในอุปกรณ์นั้น</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb index c36382a..557769d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -42,7 +42,7 @@ <translation id="1133418583142946603">إضافة علامة التبويب الحالية</translation> <translation id="1136104150802877429">عرض مراجعات المنتجات</translation> <translation id="1142371195993008685">إيقاف إشعارات "<ph name="FEATURE_NAME" />"</translation> -<translation id="1147031633655575115">تم تسجيل الدخول بحساب <ph name="USER" />.</translation> +<translation id="1147031633655575115">تم تسجيل الدخول بحساب <ph name="USER" /></translation> <translation id="1149401351239820326">شهر انتهاء الصلاحية</translation> <translation id="1150989369772528668">تقويم</translation> <translation id="1161663161838091892">مزامنة علامات التبويب والسجلّ لمواصلة التصفّح</translation> @@ -210,7 +210,7 @@ <translation id="1740650426894359238">التبديل إلى ملف شخصي آخر</translation> <translation id="1741219894094057085">ساعة ذكيّة</translation> <translation id="1743244221910283364">تجاهل التغييرات</translation> -<translation id="1748975028205587434">اختيار الملف (Select your file)</translation> +<translation id="1748975028205587434">اختيار الملف</translation> <translation id="1749733017156547309">كلمة المرور مطلوبة.</translation> <translation id="174998178145075354">{count,plural, =1{يتوفّر خيار واحد ({count}) للعنوان أعلى لوحة المفاتيح.}zero{يتوفّر {count} خيار للعنوان أعلى لوحة المفاتيح.}two{يتوفّر خياران ({count}) للعنوان أعلى لوحة المفاتيح.}few{تتوفّر {count} خيارات للعنوان أعلى لوحة المفاتيح.}many{يتوفّر {count} خيارًا للعنوان أعلى لوحة المفاتيح.}other{يتوفّر {count} خيار للعنوان أعلى لوحة المفاتيح.}}</translation> <translation id="1750238553597293878">مواصلة استخدام كلمات المرور في حسابك على Google</translation> @@ -1224,7 +1224,7 @@ <translation id="543338862236136125">تعديل كلمة المرور</translation> <translation id="5433691172869980887">تم نسخ اسم المستخدم</translation> <translation id="5437480232219631455">يمكنك فتح Gemini هنا</translation> -<translation id="5439618055789623719">تم تسجيل الدخول بحساب <ph name="USER_EMAIL" />.</translation> +<translation id="5439618055789623719">تم تسجيل الدخول بحساب <ph name="USER_EMAIL" /></translation> <translation id="5443636120437209490">استمتِع بتجربة تصفُّح تلقائي أفضل</translation> <translation id="5444892875087332195">الإشارات المرجعية</translation> <translation id="5447973833955560753">كلمة مرور الاسترداد</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb index d0be64ca..1468a39 100644 --- a/ios/chrome/app/strings/resources/ios_strings_et.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -61,7 +61,7 @@ <translation id="1218730690561976633">Täiustatud automaattäite kasutaja kinnitamise sisselülitamine</translation> <translation id="1219674500290482172">Internetiga ei saa ühendust.</translation> <translation id="1223498995510244364">Kokkuvõte</translation> -<translation id="1227113644794103810">Inaktiivsed vahelehed</translation> +<translation id="1227113644794103810">Mitteaktiivsed vahelehed</translation> <translation id="1231733316453485619">Kas lülitada sünkroonimine sisse?</translation> <translation id="1238794841176717085">Jaga seda lehte</translation> <translation id="1253032109800629289">Peida valik „Hankige hinnajälgimise märguanded”</translation> @@ -393,7 +393,7 @@ <translation id="2359808026110333948">Jätka</translation> <translation id="2360196772093551345">Taotle mobiilisaiti</translation> <translation id="2362083820973145409">Sisse logitud kasutajana <ph name="USER_NAME" />. <ph name="USER_EMAIL" />. Avab seaded.</translation> -<translation id="2371084566192454134">Vaheleht</translation> +<translation id="2371084566192454134">Vahelehed ja vahelehegrupid</translation> <translation id="2371303771137626249">Uus</translation> <translation id="2381405137052800939">Põhiteave</translation> <translation id="2384692388811649784">Peida inkognito vahelehed</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb index 85364727..fc147b2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -209,6 +209,7 @@ <translation id="1740468249224277719">برای نصب دو ضربه سریع بزنید.</translation> <translation id="1740650426894359238">رفتن به نمایهای دیگر</translation> <translation id="1741219894094057085">ساعت هوشمند</translation> +<translation id="1742773766788162541">اسکن کردن کارت و تکمیل خودکار</translation> <translation id="1743244221910283364">صرفنظر کردن از تغییرات</translation> <translation id="1748975028205587434">انتخاب فایل</translation> <translation id="1749733017156547309">گذرواژه الزامی است</translation> @@ -708,6 +709,7 @@ <translation id="3578866308944526475"><ph name="EMAIL" />، توسط سازمانتان مدیریت میشود.</translation> <translation id="3580448612293054698"><ph name="ENTITY_TYPE" /> بهروز شود؟</translation> <translation id="3581564640715911333">پیشنهاد ترجمه صفحات نوشتهشده به زبانهای دیگر</translation> +<translation id="3583726884554296148">کارتتان را در «حساب Google» ذخیره کنید تا برای این خرید و خریدهای بعدی که در Chrome انجام میدهید بهطور خودکار تکمیل شود</translation> <translation id="3587482841069643663">همه</translation> <translation id="3587885837929752825">سازمان شما آنچه را میتوانید در «حساب Google» خود ذخیره کنید محدود میکند.</translation> <translation id="3588820906588687999">باز کردن تصویر در برگه جدید</translation> @@ -1224,7 +1226,7 @@ <translation id="543338862236136125">ویرایش گذرواژه</translation> <translation id="5433691172869980887">نام کاربری کپی شد</translation> <translation id="5437480232219631455">میتوانید Gemini را از اینجا باز کنید</translation> -<translation id="5439618055789623719">ورود به سیستم با <ph name="USER_EMAIL" /></translation> +<translation id="5439618055789623719">واردشده به سیستم با <ph name="USER_EMAIL" /></translation> <translation id="5443636120437209490">مرور بهتر بهطور پیشفرض</translation> <translation id="5444892875087332195">نشانکها</translation> <translation id="5447973833955560753">گذرواژه بازیابی</translation> @@ -1554,6 +1556,7 @@ <translation id="6532106788206463496">ذخیره تغییرات</translation> <translation id="6536759809440150308">باز کردن «<ph name="GROUP_TITLE" />»، گروه <ph name="NUMBER_OF_TABS" />، <ph name="CREATION_TEXT" /></translation> <translation id="6537746030088321027">example.com</translation> +<translation id="6543899060872618437">با تکمیل خودکار در دستگاههای خود، سریعتر تسویهحساب کنید</translation> <translation id="6550675742724504774">گزینهها</translation> <translation id="6550891580932862748">دربرابر وبسایتها، بارگیریها، و افزونههای خطرناک از شما محافظت نمیکند. تنظیمات «مرور ایمن» شما در دیگر محصولات Google تحتتأثیر قرار نخواهد گرفت.</translation> <translation id="6556501700899673703">Lexend</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb index a4a1257..1613fb3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -371,7 +371,7 @@ <translation id="2273327106802955778">Lisäasetusvalikko</translation> <translation id="2283599456633275070">Matkailu</translation> <translation id="2287614783861766820">{count,plural, =1{Osoite poistetaan tältä laitteelta.}other{Nämä osoitteet poistetaan tältä laitteelta.}}</translation> -<translation id="2295236662082735391">Muokkaa kuvaa Geminillä painamalla sitä pitkään verkossa</translation> +<translation id="2295236662082735391">Muokkaa kuvaa verkossa Geminin avulla painamalla sitä pitkään</translation> <translation id="2297989278479054870">Kun olet kirjautunut ulos, Google-tilisi kirjanmerkit, salasanat ja muut tiedot poistetaan tältä laitteelta.</translation> <translation id="2299218006564889602">Salasanat salataan laitteella ennen niiden tallentamista Googlen Salasanojen ylläpitoon.</translation> <translation id="2306265833370324042">Näytä tiedot: <ph name="SEARCH_ENGINE_NAME" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb index dc6ce963c..830adbf 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -209,6 +209,7 @@ <translation id="1740468249224277719">I-double tap upang i-install.</translation> <translation id="1740650426894359238">Lumipat sa ibang profile</translation> <translation id="1741219894094057085">Smart Watch</translation> +<translation id="1742773766788162541">I-scan ang Card at I-autofill</translation> <translation id="1743244221910283364">I-discard ang mga pagbabago</translation> <translation id="1748975028205587434">Piliin ang iyong file</translation> <translation id="1749733017156547309">Kinakailangan ng password</translation> @@ -708,6 +709,7 @@ <translation id="3578866308944526475"><ph name="EMAIL" />, pinapamahalaan ng iyong organisasyon.</translation> <translation id="3580448612293054698">I-update ang <ph name="ENTITY_TYPE" />?</translation> <translation id="3581564640715911333">Mag-alok na mag-translate ng mga page sa iba pang wika</translation> +<translation id="3583726884554296148">I-save ang iyong card sa Google Account mo para i-autofill ito para sa pagbiling ito at mga pagbili sa hinaharap na gagawin sa Chrome</translation> <translation id="3587482841069643663">Lahat</translation> <translation id="3587885837929752825">Nililimitahan ng iyong organisasyon kung ano ang puwede mong i-save sa iyong Google Account.</translation> <translation id="3588820906588687999">Buksan ang Larawan sa Bagong Tab</translation> @@ -1554,6 +1556,7 @@ <translation id="6532106788206463496">I-save ang mga pagbabago</translation> <translation id="6536759809440150308">Buksan ang <ph name="GROUP_TITLE" />, grupo ng <ph name="NUMBER_OF_TABS" />, <ph name="CREATION_TEXT" /></translation> <translation id="6537746030088321027">example.com</translation> +<translation id="6543899060872618437">Mas mabilis na mag-check out gamit ang autofill sa iyong mga device</translation> <translation id="6550675742724504774">Mga Pagpipilian</translation> <translation id="6550891580932862748">Hindi ka poprotektahan laban sa mga mapanganib na website, download, at extension. Hindi maaapektuhan ang mga setting ng Ligtas na Pag-browse mo sa iba pang produkto ng Google.</translation> <translation id="6556501700899673703">Lexend</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb index 8c16e92..85a2efd 100644 --- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -1319,7 +1319,7 @@ <translation id="5738385766833540397">Beheren hoe je meldingen over prijsdalingen krijgt voor producten die je volgt</translation> <translation id="5738887413654608789">Hiermee kun je relevante webpagina's vinden op basis van je omgeving.</translation> <translation id="573974402615125334">Als je tabbladgroepen wilt delen, eraan wilt deelnemen en eraan wilt samenwerken, synchroniseer je je geschiedenis en tabbladen</translation> -<translation id="5740123193752401435">Tabbladen doorzoeken…</translation> +<translation id="5740123193752401435">Tabbladen zoeken…</translation> <translation id="5744274077973758795">Meldingen van <ph name="FEATURE_NAME" /> staan aan</translation> <translation id="5745598824054949526">Geen tekst gevonden</translation> <translation id="5745916533876677730">Naar het vorige tabblad gaan</translation> @@ -2316,7 +2316,7 @@ <translation id="9205189991633470489">Incognitovergrendeling</translation> <translation id="9206887540681440657">Snelheid</translation> <translation id="9219103736887031265">Afbeeldingen</translation> -<translation id="9219154867334666734">Tabbladen doorzoeken…</translation> +<translation id="9219154867334666734">Tabbladen zoeken…</translation> <translation id="9223358826628549784">Crashrapport verzonden.</translation> <translation id="926455622548529175">Overschakelen en verwijderen</translation> <translation id="929748059769569925">Gemarkeerde tekst</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb index 26e75e6..c15bd77 100644 --- a/ios/chrome/app/strings/resources/ios_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -209,6 +209,7 @@ <translation id="1740468249224277719">Dobbelttrykk for å installere.</translation> <translation id="1740650426894359238">Bytt til en annen profil</translation> <translation id="1741219894094057085">Smart Watch</translation> +<translation id="1742773766788162541">Skann kortet og fyll ut automatisk</translation> <translation id="1743244221910283364">Forkast endringene</translation> <translation id="1748975028205587434">Velg den aktuelle filen</translation> <translation id="1749733017156547309">Et passord kreves</translation> @@ -708,6 +709,7 @@ <translation id="3578866308944526475"><ph name="EMAIL" />, administreres av organisasjonen din.</translation> <translation id="3580448612293054698">Vil du oppdatere <ph name="ENTITY_TYPE" />?</translation> <translation id="3581564640715911333">Tilby å oversette sider på andre språk</translation> +<translation id="3583726884554296148">Lagre kortet i Google-kontoen din for å autofylle det for dette kjøpet og fremtidige kjøp i Chrome</translation> <translation id="3587482841069643663">Alle</translation> <translation id="3587885837929752825">Organisasjonen din begrenser hva du kan lagre i Google-kontoen din.</translation> <translation id="3588820906588687999">Åpne bildet i en ny fane</translation> @@ -1554,6 +1556,7 @@ <translation id="6532106788206463496">Lagre endringene</translation> <translation id="6536759809440150308">Åpne <ph name="GROUP_TITLE" />, gruppe på <ph name="NUMBER_OF_TABS" />, <ph name="CREATION_TEXT" /></translation> <translation id="6537746030088321027">eteksempel.no</translation> +<translation id="6543899060872618437">Betal raskere med autofyll på alle enhetene dine</translation> <translation id="6550675742724504774">Alternativer</translation> <translation id="6550891580932862748">Beskytter deg ikke mot farlige nettsteder, nedlastinger eller utvidelser. Safe Browsing-innstillingene i andre Google-produkter påvirkes ikke.</translation> <translation id="6556501700899673703">Lexend</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 6a512ae..1af2073 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -393,6 +393,7 @@ <translation id="2359808026110333948">Continuar</translation> <translation id="2360196772093551345">Pedir site para dispositivos móveis</translation> <translation id="2362083820973145409">Com sessão iniciada como <ph name="USER_NAME" />. <ph name="USER_EMAIL" />. Abre as definições.</translation> +<translation id="2367025302166767427">Ocorreu um problema ao preencher as informações</translation> <translation id="2371084566192454134">Separadores e grupos de separadores</translation> <translation id="2371303771137626249">Novo</translation> <translation id="2381405137052800939">Noções básicas</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb index 50d840e..fae2e54 100644 --- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -335,7 +335,7 @@ <translation id="2175927920773552910">QR Kodu</translation> <translation id="2180338296831857171">Adresleri sil</translation> <translation id="218350106843433823">Şifreleri ve geçiş anahtarlarını otomatik doldur</translation> -<translation id="2184272387334793084">Yer işaretlerinize, şifrelerinize ve daha fazlasına tüm cihazlarınızdan ulaşmak için oturum açın.</translation> +<translation id="2184272387334793084">Yer işaretlerinize, şifrelerinize ve daha fazlasına tüm cihazlarınızdan ulaşmak için oturum açın</translation> <translation id="2186206192313702726">Google Lens</translation> <translation id="2188993354115194873"><ph name="BEGIN_BOLD" />İndirilenlere Kaydet<ph name="END_BOLD" />'e dokunun</translation> <translation id="2191406283620379491">Bir hata oluştu. Lütfen iOS sürümünüzü güncelleyin.</translation>
diff --git a/ios/chrome/browser/account_settings/model/BUILD.gn b/ios/chrome/browser/account_settings/model/BUILD.gn new file mode 100644 index 0000000..b8d8ee61 --- /dev/null +++ b/ios/chrome/browser/account_settings/model/BUILD.gn
@@ -0,0 +1,18 @@ +# Copyright 2026 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +source_set("model") { + sources = [ + "ios_account_setting_service_factory.h", + "ios_account_setting_service_factory.mm", + ] + deps = [ + "//base", + "//components/autofill/core/browser", + "//components/sync/base:features", + "//components/sync/model", + "//ios/chrome/browser/shared/model/profile:profile_keyed_service_factory", + "//ios/chrome/browser/sync/model:data_type_store_service_factory", + ] +}
diff --git a/ios/chrome/browser/account_settings/model/DEPS b/ios/chrome/browser/account_settings/model/DEPS new file mode 100644 index 0000000..7d30671 --- /dev/null +++ b/ios/chrome/browser/account_settings/model/DEPS
@@ -0,0 +1,5 @@ +include_rules = [ + # keep-sorted start + "+ios/chrome/browser/sync/model", + # keep-sorted end +]
diff --git a/ios/chrome/browser/account_settings/model/OWNERS b/ios/chrome/browser/account_settings/model/OWNERS new file mode 100644 index 0000000..af5a108 --- /dev/null +++ b/ios/chrome/browser/account_settings/model/OWNERS
@@ -0,0 +1,2 @@ +sugoi@chromium.org +tmartino@chromium.org
diff --git a/ios/chrome/browser/autofill/model/ios_account_setting_service_factory.h b/ios/chrome/browser/account_settings/model/ios_account_setting_service_factory.h similarity index 78% rename from ios/chrome/browser/autofill/model/ios_account_setting_service_factory.h rename to ios/chrome/browser/account_settings/model/ios_account_setting_service_factory.h index e585805..89e1a36 100644 --- a/ios/chrome/browser/autofill/model/ios_account_setting_service_factory.h +++ b/ios/chrome/browser/account_settings/model/ios_account_setting_service_factory.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_AUTOFILL_MODEL_IOS_ACCOUNT_SETTING_SERVICE_FACTORY_H_ -#define IOS_CHROME_BROWSER_AUTOFILL_MODEL_IOS_ACCOUNT_SETTING_SERVICE_FACTORY_H_ +#ifndef IOS_CHROME_BROWSER_ACCOUNT_SETTINGS_MODEL_IOS_ACCOUNT_SETTING_SERVICE_FACTORY_H_ +#define IOS_CHROME_BROWSER_ACCOUNT_SETTINGS_MODEL_IOS_ACCOUNT_SETTING_SERVICE_FACTORY_H_ #import "base/no_destructor.h" #import "ios/chrome/browser/shared/model/profile/profile_keyed_service_factory_ios.h" @@ -32,4 +32,4 @@ ProfileIOS* profile) const override; }; -#endif // IOS_CHROME_BROWSER_AUTOFILL_MODEL_IOS_ACCOUNT_SETTING_SERVICE_FACTORY_H_ +#endif // IOS_CHROME_BROWSER_ACCOUNT_SETTINGS_MODEL_IOS_ACCOUNT_SETTING_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/autofill/model/ios_account_setting_service_factory.mm b/ios/chrome/browser/account_settings/model/ios_account_setting_service_factory.mm similarity index 90% rename from ios/chrome/browser/autofill/model/ios_account_setting_service_factory.mm rename to ios/chrome/browser/account_settings/model/ios_account_setting_service_factory.mm index 4a52783..c7a5ae71 100644 --- a/ios/chrome/browser/autofill/model/ios_account_setting_service_factory.mm +++ b/ios/chrome/browser/account_settings/model/ios_account_setting_service_factory.mm
@@ -2,10 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/chrome/browser/autofill/model/ios_account_setting_service_factory.h" +#import "ios/chrome/browser/account_settings/model/ios_account_setting_service_factory.h" #import "base/functional/callback_helpers.h" #import "components/autofill/core/browser/webdata/account_settings/account_setting_service.h" +#import "components/autofill/core/browser/webdata/account_settings/account_setting_sync_bridge.h" #import "components/sync/base/features.h" #import "components/sync/model/client_tag_based_data_type_processor.h" #import "components/sync/model/data_type_store_service.h"
diff --git a/ios/chrome/browser/app_bar/coordinator/BUILD.gn b/ios/chrome/browser/app_bar/coordinator/BUILD.gn index 519c8942..720cb36 100644 --- a/ios/chrome/browser/app_bar/coordinator/BUILD.gn +++ b/ios/chrome/browser/app_bar/coordinator/BUILD.gn
@@ -23,6 +23,7 @@ "//ios/chrome/browser/authentication/account_menu/coordinator", "//ios/chrome/browser/authentication/account_menu/public", "//ios/chrome/browser/authentication/ui_bundled/signin:constants", + "//ios/chrome/browser/cobrowse/model", "//ios/chrome/browser/fullscreen/ui_bundled", "//ios/chrome/browser/fullscreen/ui_bundled:ui", "//ios/chrome/browser/intelligence/bwg/model:bwg_service", @@ -83,6 +84,7 @@ "//ios/chrome/browser/intelligence/bwg/model:bwg_service_factory", "//ios/chrome/browser/intelligence/bwg/utils:constants", "//ios/chrome/browser/intelligence/bwg/utils:prefs", + "//ios/chrome/browser/intelligence/features", "//ios/chrome/browser/menu/ui_bundled", "//ios/chrome/browser/optimization_guide/model", "//ios/chrome/browser/policy/model:policy_util",
diff --git a/ios/chrome/browser/app_bar/coordinator/DEPS b/ios/chrome/browser/app_bar/coordinator/DEPS index 0781a3a..2832c85 100644 --- a/ios/chrome/browser/app_bar/coordinator/DEPS +++ b/ios/chrome/browser/app_bar/coordinator/DEPS
@@ -5,6 +5,7 @@ "+ios/chrome/browser/authentication/account_menu/coordinator/account_menu_coordinator_delegate.h", "+ios/chrome/browser/authentication/account_menu/public/account_menu_constants.h", "+ios/chrome/browser/authentication/ui_bundled/signin", + "+ios/chrome/browser/cobrowse/model", "+ios/chrome/browser/fullscreen/ui_bundled", "+ios/chrome/browser/intelligence/bwg/model", "+ios/chrome/browser/intelligence/bwg/utils",
diff --git a/ios/chrome/browser/app_bar/coordinator/app_bar_mediator.mm b/ios/chrome/browser/app_bar/coordinator/app_bar_mediator.mm index a1d5791c3..82ed3a6 100644 --- a/ios/chrome/browser/app_bar/coordinator/app_bar_mediator.mm +++ b/ios/chrome/browser/app_bar/coordinator/app_bar_mediator.mm
@@ -18,6 +18,7 @@ #import "components/signin/public/identity_manager/objc/identity_manager_observer_bridge.h" #import "ios/chrome/browser/app_bar/ui/app_bar_consumer.h" #import "ios/chrome/browser/authentication/ui_bundled/signin/signin_constants.h" +#import "ios/chrome/browser/cobrowse/model/cobrowse_context.h" #import "ios/chrome/browser/fullscreen/ui_bundled/fullscreen_ui_element.h" #import "ios/chrome/browser/fullscreen/ui_bundled/fullscreen_ui_updater.h" #import "ios/chrome/browser/intelligence/bwg/model/bwg_service.h" @@ -408,6 +409,11 @@ [self.geminiHandler startGeminiFlowWithStartupState:startupState]; break; } + case AppBarAssistantButtonState::kAIM: { + [self.sceneHandler + showAssistantWithContext:[CobrowseContext defaultContext]]; + break; + } } } @@ -508,6 +514,8 @@ if (IsPageActionMenuEnabled()) { state = AppBarAssistantButtonState::kAsk; + } else if (IsAimCobrowseEnabled() && IsAssistantContainerEnabled()) { + state = AppBarAssistantButtonState::kAIM; } else if (_authenticationService->HasPrimaryIdentity( signin::ConsentLevel::kSignin)) { state = AppBarAssistantButtonState::kAccount;
diff --git a/ios/chrome/browser/app_bar/coordinator/app_bar_mediator_unittest.mm b/ios/chrome/browser/app_bar/coordinator/app_bar_mediator_unittest.mm index 1ddf715..ca9f319 100644 --- a/ios/chrome/browser/app_bar/coordinator/app_bar_mediator_unittest.mm +++ b/ios/chrome/browser/app_bar/coordinator/app_bar_mediator_unittest.mm
@@ -7,6 +7,7 @@ #import <memory> #import "base/strings/sys_string_conversions.h" +#import "base/test/scoped_feature_list.h" #import "components/application_locale_storage/application_locale_storage.h" #import "components/open_from_clipboard/fake_clipboard_recent_content.h" #import "components/policy/core/common/policy_pref_names.h" @@ -22,6 +23,7 @@ #import "ios/chrome/browser/intelligence/bwg/model/bwg_service_factory.h" #import "ios/chrome/browser/intelligence/bwg/utils/gemini_constants.h" #import "ios/chrome/browser/intelligence/bwg/utils/gemini_prefs.h" +#import "ios/chrome/browser/intelligence/features/features.h" #import "ios/chrome/browser/menu/ui_bundled/browser_action_factory.h" #import "ios/chrome/browser/optimization_guide/model/optimization_guide_service_factory.h" #import "ios/chrome/browser/policy/model/policy_util.h" @@ -622,3 +624,30 @@ [mediator_ assistantButtonTappedWithState:AppBarAssistantButtonState::kAsk]; EXPECT_OCMOCK_VERIFY(mock_gemini_handler_); } + +// Tests that the assistant button is in the kAIM state when the correct +// features are enabled. +TEST_F(AppBarMediatorTest, TestAssistantButtonStateAIM) { + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures( + {kAssistantContainer, kAimCobrowse, kGeminiKillSwitch}, + {kPageActionMenu}); + + OCMExpect([consumer_ setAssistantButtonState:AppBarAssistantButtonState::kAIM + avatar:nil]); + [mediator_ updateAssistantButton]; + EXPECT_OCMOCK_VERIFY(consumer_); +} + +// Tests that tapping the assistant button in the kAIM state dispatches the +// assistant command. +TEST_F(AppBarMediatorTest, TestAssistantButtonTappedAIM) { + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures({kAssistantContainer, kGeminiKillSwitch}, + {kPageActionMenu}); + [mediator_ updateAssistantButton]; + + OCMExpect([mock_scene_handler_ showAssistantWithContext:[OCMArg any]]); + [mediator_ assistantButtonTappedWithState:AppBarAssistantButtonState::kAIM]; + EXPECT_OCMOCK_VERIFY(mock_scene_handler_); +}
diff --git a/ios/chrome/browser/app_bar/ui/BUILD.gn b/ios/chrome/browser/app_bar/ui/BUILD.gn index 21f57c44..b3264d5 100644 --- a/ios/chrome/browser/app_bar/ui/BUILD.gn +++ b/ios/chrome/browser/app_bar/ui/BUILD.gn
@@ -18,6 +18,7 @@ ] deps = [ "//base", + "//components/strings", "//ios/chrome/app/strings", "//ios/chrome/browser/cobrowse/model", "//ios/chrome/browser/fullscreen/ui_bundled:ui",
diff --git a/ios/chrome/browser/app_bar/ui/DEPS b/ios/chrome/browser/app_bar/ui/DEPS index 76dfa77f..5d8256a 100644 --- a/ios/chrome/browser/app_bar/ui/DEPS +++ b/ios/chrome/browser/app_bar/ui/DEPS
@@ -1,6 +1,5 @@ include_rules = [ # keep-sorted start - "+ios/chrome/browser/cobrowse/model/cobrowse_context.h", "+ios/chrome/browser/fullscreen/ui_bundled/fullscreen_ui_element.h", "+ios/chrome/browser/intents/model/intents_donation_helper.h", # keep-sorted end
diff --git a/ios/chrome/browser/app_bar/ui/app_bar_consumer.h b/ios/chrome/browser/app_bar/ui/app_bar_consumer.h index 0c68ff6..c113a1c 100644 --- a/ios/chrome/browser/app_bar/ui/app_bar_consumer.h +++ b/ios/chrome/browser/app_bar/ui/app_bar_consumer.h
@@ -19,6 +19,7 @@ kSignedOut, kAccount, kAsk, + kAIM, }; // Consumer of the app bar.
diff --git a/ios/chrome/browser/app_bar/ui/app_bar_view_controller.mm b/ios/chrome/browser/app_bar/ui/app_bar_view_controller.mm index 53d6a59d..44e533c 100644 --- a/ios/chrome/browser/app_bar/ui/app_bar_view_controller.mm +++ b/ios/chrome/browser/app_bar/ui/app_bar_view_controller.mm
@@ -6,9 +6,9 @@ #import "base/metrics/user_metrics.h" #import "base/metrics/user_metrics_action.h" +#import "components/strings/grit/components_strings.h" #import "ios/chrome/browser/app_bar/ui/app_bar_constants.h" #import "ios/chrome/browser/app_bar/ui/app_bar_mutator.h" -#import "ios/chrome/browser/cobrowse/model/cobrowse_context.h" #import "ios/chrome/browser/intents/model/intents_donation_helper.h" #import "ios/chrome/browser/shared/public/commands/scene_commands.h" #import "ios/chrome/browser/shared/public/commands/tab_grid_commands.h" @@ -74,13 +74,11 @@ AppBarSymbolConfiguration()); } -#if BUILDFLAG(IOS_USE_BRANDED_ASSETS) // Returns a custom symbol with the common configuration. UIImage* CustomAppBarSymbol(NSString* symbol_name) { return CustomSymbolWithConfiguration(symbol_name, AppBarSymbolConfiguration()); } -#endif } // namespace @@ -287,6 +285,11 @@ image = DefaultAppBarSymbol(kGeminiNonBrandedLogoSymbol); #endif break; + case AppBarAssistantButtonState::kAIM: + title = + l10n_util::GetNSString(IDS_OMNIBOX_AI_MODE_SCOPE_PLACEHOLDER_TEXT); + image = CustomAppBarSymbol(kMagnifyingglassSparkSymbol); + break; } UIButtonConfiguration* configuration = _assistantButton.configuration;
diff --git a/ios/chrome/browser/assistant/ui/BUILD.gn b/ios/chrome/browser/assistant/ui/BUILD.gn index 9940f1a..a369c9f0 100644 --- a/ios/chrome/browser/assistant/ui/BUILD.gn +++ b/ios/chrome/browser/assistant/ui/BUILD.gn
@@ -23,6 +23,7 @@ "//ios/chrome/browser/fullscreen/ui_bundled:ui", "//ios/chrome/browser/shared/public/features", "//ios/chrome/browser/shared/ui/chrome_overlay_window", + "//ios/chrome/browser/shared/ui/elements", "//ios/chrome/browser/shared/ui/symbols", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/util",
diff --git a/ios/chrome/browser/assistant/ui/assistant_container_view.h b/ios/chrome/browser/assistant/ui/assistant_container_view.h index 1df3f35..1221d391 100644 --- a/ios/chrome/browser/assistant/ui/assistant_container_view.h +++ b/ios/chrome/browser/assistant/ui/assistant_container_view.h
@@ -19,6 +19,9 @@ // +----------------------------------+ @interface AssistantContainerView : UIView +// The grabber button used to minimize and expand the sheet. +@property(nonatomic, strong, readonly) UIButton* grabberButton; + // The content view where subviews should be added. @property(nonatomic, strong, readonly) UIView* contentView;
diff --git a/ios/chrome/browser/assistant/ui/assistant_container_view.mm b/ios/chrome/browser/assistant/ui/assistant_container_view.mm index c8007932..84e4b46 100644 --- a/ios/chrome/browser/assistant/ui/assistant_container_view.mm +++ b/ios/chrome/browser/assistant/ui/assistant_container_view.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/assistant/ui/assistant_container_view.h" +#import "ios/chrome/browser/shared/ui/elements/extended_touch_target_button.h" #import "ios/chrome/browser/shared/ui/symbols/symbols.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/util/constraints_ui_util.h" @@ -23,7 +24,6 @@ } // namespace @implementation AssistantContainerView { - UIView* _grabberView; UIView* _bottomRoundingView; CGFloat _topCornerRadius; CGFloat _bottomCornerRadius; @@ -128,16 +128,16 @@ _contentView = [self createContentView]; [_bottomRoundingView addSubview:_contentView]; - _grabberView = [self createGrabberView]; - [self addSubview:_grabberView]; + _grabberButton = [self createGrabberButton]; + [self addSubview:_grabberButton]; [NSLayoutConstraint activateConstraints:@[ - // Grabber view constraints. - [_grabberView.centerXAnchor constraintEqualToAnchor:self.centerXAnchor], - [_grabberView.topAnchor constraintEqualToAnchor:self.topAnchor - constant:kGrabberTopMargin], - [_grabberView.widthAnchor constraintEqualToConstant:kGrabberWidth], - [_grabberView.heightAnchor constraintEqualToConstant:kGrabberHeight], + // Grabber button constraints. + [_grabberButton.centerXAnchor constraintEqualToAnchor:self.centerXAnchor], + [_grabberButton.topAnchor constraintEqualToAnchor:self.topAnchor + constant:kGrabberTopMargin], + [_grabberButton.widthAnchor constraintEqualToConstant:kGrabberWidth], + [_grabberButton.heightAnchor constraintEqualToConstant:kGrabberHeight], ]]; AddSameConstraints(_bottomRoundingView, self); @@ -164,13 +164,14 @@ return view; } -// Creates and configures the grabber view. -- (UIView*)createGrabberView { - UIView* grabberView = [[UIView alloc] init]; - grabberView.translatesAutoresizingMaskIntoConstraints = NO; - grabberView.backgroundColor = [UIColor colorNamed:kTertiaryBackgroundColor]; - grabberView.layer.cornerRadius = kGrabberHeight / 2.0; - return grabberView; +// Creates and configures the grabber button. +- (UIButton*)createGrabberButton { + UIButton* grabberButton = + [ExtendedTouchTargetButton buttonWithType:UIButtonTypeCustom]; + grabberButton.translatesAutoresizingMaskIntoConstraints = NO; + grabberButton.backgroundColor = [UIColor colorNamed:kTertiaryBackgroundColor]; + grabberButton.layer.cornerRadius = kGrabberHeight / 2.0; + return grabberButton; } @end
diff --git a/ios/chrome/browser/assistant/ui/assistant_container_view_controller.mm b/ios/chrome/browser/assistant/ui/assistant_container_view_controller.mm index 8acf5e7..0ed9e94 100644 --- a/ios/chrome/browser/assistant/ui/assistant_container_view_controller.mm +++ b/ios/chrome/browser/assistant/ui/assistant_container_view_controller.mm
@@ -317,7 +317,7 @@ return a < b; }); [self updateDetentHeights]; - [self updatePanGestureEnabledState]; + [self updateInteractionEnabledState]; [self.view setNeedsLayout]; } @@ -341,7 +341,7 @@ return; } _isAnimating = isAnimating; - [self updatePanGestureEnabledState]; + [self updateInteractionEnabledState]; } - (UIView*)dimmingView { @@ -360,7 +360,7 @@ return YES; } CGPoint location = [touch locationInView:_assistantContainerView]; - // Restrict the pan gesture to the top area. + // Restrict the gesture to the top area. return location.y <= kGestureTopAreaHeight; } @@ -451,12 +451,19 @@ // Adds gesture recognizers to the view. - (void)setUpGestures { + // Pan gesture for resizing the container. _headerPanGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)]; _headerPanGesture.delegate = self; [_assistantContainerView addGestureRecognizer:_headerPanGesture]; - [self updatePanGestureEnabledState]; + + // Configure the grabber button action for toggling container size. + [_assistantContainerView.grabberButton + addTarget:self + action:@selector(handleGrabberButtonTapped:) + forControlEvents:UIControlEventTouchUpInside]; + [self updateInteractionEnabledState]; } // Called when the animation to a detent completes. @@ -477,15 +484,38 @@ } } -// Updates the pan gesture enabled state based on animation and detents. -- (void)updatePanGestureEnabledState { - // Prevent the gesture recognizer from interfering with the animation. +// Updates the interaction enabled state based on animation and detents. +- (void)updateInteractionEnabledState { + // Prevent interactions from interfering with the animation. if (self.isAnimating) { _headerPanGesture.enabled = NO; + _assistantContainerView.grabberButton.enabled = NO; return; } _headerPanGesture.enabled = YES; + _assistantContainerView.grabberButton.enabled = YES; +} + +// Handles the tap on the grabber button to toggle container size. +- (void)handleGrabberButtonTapped:(UIButton*)sender { + if (self.isAnimating) { + return; + } + + AssistantContainerDetent minDetent = self.detents.front(); + AssistantContainerDetent maxDetent = self.detents.back(); + + if (minDetent == maxDetent) { + return; + } + + AssistantContainerDetent targetDetent = + _activeDetent.value() == maxDetent ? minDetent : maxDetent; + + [self animateToDetent:targetDetent + duration:kSpringDuration + curve:UIViewAnimationCurveEaseInOut]; } // Handles the pan gesture on the header to resize the container.
diff --git a/ios/chrome/browser/autofill/autofill_ai/coordinator/autofill_ai_save_entity_coordinator.mm b/ios/chrome/browser/autofill/autofill_ai/coordinator/autofill_ai_save_entity_coordinator.mm index 8649f4f2..3e01b68 100644 --- a/ios/chrome/browser/autofill/autofill_ai/coordinator/autofill_ai_save_entity_coordinator.mm +++ b/ios/chrome/browser/autofill/autofill_ai/coordinator/autofill_ai_save_entity_coordinator.mm
@@ -7,12 +7,10 @@ #import "base/check.h" #import "ios/chrome/browser/autofill/autofill_ai/coordinator/autofill_ai_save_entity_mediator.h" #import "ios/chrome/browser/autofill/autofill_ai/public/save_entity_params.h" -#import "ios/chrome/browser/autofill/autofill_ai/ui/autofill_ai_save_entity_table_view_controller.h" +#import "ios/chrome/browser/autofill/autofill_ai/ui/autofill_ai_save_entity_container_view_controller.h" #import "ios/chrome/browser/shared/model/browser/browser.h" #import "ios/chrome/browser/shared/public/commands/autofill_commands.h" #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" -#import "ios/chrome/browser/shared/ui/table_view/table_view_navigation_controller.h" -#import "ios/chrome/browser/shared/ui/table_view/table_view_utils.h" @interface AutofillAISaveEntityCoordinator () < UIAdaptivePresentationControllerDelegate> @@ -23,7 +21,7 @@ __weak id<AutofillCommands> _autofillHandler; // Navigation controller that owns the save entity view controller. - TableViewNavigationController* _navigationController; + UINavigationController* _navigationController; // Mediator that handles the business logic of the save entity UI. AutofillAISaveEntityMediator* _mediator; @@ -52,15 +50,14 @@ AutofillCommands); CHECK(_autofillHandler); - AutofillAISaveEntityTableViewController* saveViewController = - [[AutofillAISaveEntityTableViewController alloc] - initWithStyle:ChromeTableViewStyle()]; + AutofillAISaveEntityContainerViewController* saveViewController = + [[AutofillAISaveEntityContainerViewController alloc] init]; saveViewController.mutator = _mediator; saveViewController.autofillHandler = _autofillHandler; _mediator.consumer = saveViewController; - _navigationController = - [[TableViewNavigationController alloc] initWithTable:saveViewController]; + _navigationController = [[UINavigationController alloc] + initWithRootViewController:saveViewController]; _navigationController.modalPresentationStyle = UIModalPresentationFormSheet; [self.baseViewController presentViewController:_navigationController
diff --git a/ios/chrome/browser/autofill/autofill_ai/public/autofill_ai_constants.h b/ios/chrome/browser/autofill/autofill_ai/public/autofill_ai_constants.h index 147f520..62d0b458 100644 --- a/ios/chrome/browser/autofill/autofill_ai/public/autofill_ai_constants.h +++ b/ios/chrome/browser/autofill/autofill_ai/public/autofill_ai_constants.h
@@ -13,4 +13,7 @@ // Accessibility identifier for the Autofill AI Save Entity close button. extern NSString* const kAutofillAISaveEntityCancelButtonId; +// Accessibility identifier for the Autofill AI Save Entity save button. +extern NSString* const kAutofillAISaveEntitySaveButtonId; + #endif // IOS_CHROME_BROWSER_AUTOFILL_AUTOFILL_AI_PUBLIC_AUTOFILL_AI_CONSTANTS_H_
diff --git a/ios/chrome/browser/autofill/autofill_ai/public/autofill_ai_constants.mm b/ios/chrome/browser/autofill/autofill_ai/public/autofill_ai_constants.mm index f180a5d..a3cf51b 100644 --- a/ios/chrome/browser/autofill/autofill_ai/public/autofill_ai_constants.mm +++ b/ios/chrome/browser/autofill/autofill_ai/public/autofill_ai_constants.mm
@@ -8,3 +8,5 @@ @"kAutofillAISaveEntityTableViewId"; NSString* const kAutofillAISaveEntityCancelButtonId = @"kAutofillAISaveEntityCancelButtonId"; +NSString* const kAutofillAISaveEntitySaveButtonId = + @"kAutofillAISaveEntitySaveButtonId";
diff --git a/ios/chrome/browser/autofill/autofill_ai/ui/BUILD.gn b/ios/chrome/browser/autofill/autofill_ai/ui/BUILD.gn index 6951317..b83c176 100644 --- a/ios/chrome/browser/autofill/autofill_ai/ui/BUILD.gn +++ b/ios/chrome/browser/autofill/autofill_ai/ui/BUILD.gn
@@ -5,6 +5,8 @@ source_set("ui") { sources = [ "autofill_ai_save_entity_consumer.h", + "autofill_ai_save_entity_container_view_controller.h", + "autofill_ai_save_entity_container_view_controller.mm", "autofill_ai_save_entity_mutator.h", "autofill_ai_save_entity_table_view_controller.h", "autofill_ai_save_entity_table_view_controller.mm", @@ -18,6 +20,7 @@ "//ios/chrome/browser/shared/ui/table_view", "//ios/chrome/browser/shared/ui/table_view:utils", "//ios/chrome/common/ui/colors", + "//ios/chrome/common/ui/util", ] frameworks = [ "UIKit.framework" ] }
diff --git a/ios/chrome/browser/autofill/autofill_ai/ui/autofill_ai_save_entity_container_view_controller.h b/ios/chrome/browser/autofill/autofill_ai/ui/autofill_ai_save_entity_container_view_controller.h new file mode 100644 index 0000000..7951880 --- /dev/null +++ b/ios/chrome/browser/autofill/autofill_ai/ui/autofill_ai_save_entity_container_view_controller.h
@@ -0,0 +1,33 @@ +// Copyright 2026 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_AUTOFILL_AUTOFILL_AI_UI_AUTOFILL_AI_SAVE_ENTITY_CONTAINER_VIEW_CONTROLLER_H_ +#define IOS_CHROME_BROWSER_AUTOFILL_AUTOFILL_AI_UI_AUTOFILL_AI_SAVE_ENTITY_CONTAINER_VIEW_CONTROLLER_H_ + +#import <UIKit/UIKit.h> + +#import "ios/chrome/browser/autofill/autofill_ai/ui/autofill_ai_save_entity_consumer.h" + +@protocol AutofillCommands; +@protocol AutofillAISaveEntityMutator; + +// Container view controller for the Autofill AI entity save and update UI. +// Hosts a table view for entity details and a sticky bottom action button. +@interface AutofillAISaveEntityContainerViewController + : UIViewController <AutofillAISaveEntityConsumer> + +// Autofill commands handler to dismiss the dialog. +@property(nonatomic, weak) id<AutofillCommands> autofillHandler; + +// Mutator for sending user actions (save/cancel) to the mediator. +@property(nonatomic, weak) id<AutofillAISaveEntityMutator> mutator; + +- (instancetype)init NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithNibName:(NSString*)nibNameOrNil + bundle:(NSBundle*)nibBundleOrNil NS_UNAVAILABLE; +- (instancetype)initWithCoder:(NSCoder*)aDecoder NS_UNAVAILABLE; + +@end + +#endif // IOS_CHROME_BROWSER_AUTOFILL_AUTOFILL_AI_UI_AUTOFILL_AI_SAVE_ENTITY_CONTAINER_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/autofill/autofill_ai/ui/autofill_ai_save_entity_container_view_controller.mm b/ios/chrome/browser/autofill/autofill_ai/ui/autofill_ai_save_entity_container_view_controller.mm new file mode 100644 index 0000000..5edb372 --- /dev/null +++ b/ios/chrome/browser/autofill/autofill_ai/ui/autofill_ai_save_entity_container_view_controller.mm
@@ -0,0 +1,149 @@ +// Copyright 2026 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/autofill/autofill_ai/ui/autofill_ai_save_entity_container_view_controller.h" + +#import "base/strings/sys_string_conversions.h" +#import "components/strings/grit/components_strings.h" +#import "ios/chrome/browser/autofill/autofill_ai/public/autofill_ai_constants.h" +#import "ios/chrome/browser/autofill/autofill_ai/ui/autofill_ai_save_entity_mutator.h" +#import "ios/chrome/browser/autofill/autofill_ai/ui/autofill_ai_save_entity_table_view_controller.h" +#import "ios/chrome/browser/shared/public/commands/autofill_commands.h" +#import "ios/chrome/browser/shared/ui/table_view/table_view_utils.h" +#import "ios/chrome/common/ui/colors/semantic_color_names.h" +#import "ios/chrome/common/ui/util/chrome_button.h" +#import "ui/base/l10n/l10n_util.h" + +namespace { +constexpr CGFloat kButtonStackSpacing = 8; +constexpr CGFloat kButtonStackHorizontalMargin = 16; +constexpr CGFloat kButtonStackVerticalMargin = 16; +} // namespace + +@implementation AutofillAISaveEntityContainerViewController { + // The table view containing the entity attributes. + AutofillAISaveEntityTableViewController* _tableViewController; + + // The sticky "Save" or "Update" button at the bottom. + ChromeButton* _saveButton; + + // The stack containing the action button. + UIStackView* _buttonStack; + + // Tracks if the button is currently enabled. + BOOL _saveButtonEnabled; + + // Button title. + NSString* _buttonTitle; +} + +- (instancetype)init { + self = [super initWithNibName:nil bundle:nil]; + if (self) { + _saveButtonEnabled = YES; + _tableViewController = [[AutofillAISaveEntityTableViewController alloc] + initWithStyle:ChromeTableViewStyle()]; + } + return self; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + self.view.backgroundColor = + [UIColor colorNamed:kGroupedPrimaryBackgroundColor]; + + // Configure the NavigationBar. + UIBarButtonItem* cancelButton = [[UIBarButtonItem alloc] + initWithBarButtonSystemItem:UIBarButtonSystemItemCancel + target:self + action:@selector(handleCancelButton)]; + cancelButton.accessibilityIdentifier = kAutofillAISaveEntityCancelButtonId; + self.navigationItem.leftBarButtonItem = cancelButton; + self.navigationController.navigationBar.prefersLargeTitles = NO; + + // Setup the Action Button and Stack View. + _buttonStack = [[UIStackView alloc] init]; + _buttonStack.axis = UILayoutConstraintAxisVertical; + _buttonStack.alignment = UIStackViewAlignmentFill; + _buttonStack.spacing = kButtonStackSpacing; + _buttonStack.translatesAutoresizingMaskIntoConstraints = NO; + + _saveButton = [[ChromeButton alloc] initWithStyle:ChromeButtonStylePrimary]; + _saveButton.enabled = _saveButtonEnabled; + if (_buttonTitle) { + [_saveButton setTitle:_buttonTitle forState:UIControlStateNormal]; + } + _saveButton.accessibilityIdentifier = kAutofillAISaveEntitySaveButtonId; + [_saveButton addTarget:self + action:@selector(saveButtonWasPressed:) + forControlEvents:UIControlEventTouchUpInside]; + [_buttonStack addArrangedSubview:_saveButton]; + + [self.view addSubview:_buttonStack]; + + UIView* tableView = _tableViewController.view; + tableView.translatesAutoresizingMaskIntoConstraints = NO; + + [self addChildViewController:_tableViewController]; + [self.view addSubview:tableView]; + [_tableViewController didMoveToParentViewController:self]; + + // Layout: Table view on top, button stack pinned to the bottom safe area. + [NSLayoutConstraint activateConstraints:@[ + [tableView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], + [tableView.topAnchor constraintEqualToAnchor:self.view.topAnchor], + [tableView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor], + + // Pin bottom of the table view to the top of the button stack. + [tableView.bottomAnchor + constraintEqualToAnchor:_buttonStack.topAnchor + constant:-kButtonStackVerticalMargin], + + [_buttonStack.leadingAnchor + constraintEqualToAnchor:self.view.leadingAnchor + constant:kButtonStackHorizontalMargin], + [_buttonStack.trailingAnchor + constraintEqualToAnchor:self.view.trailingAnchor + constant:-kButtonStackHorizontalMargin], + [_buttonStack.bottomAnchor + constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor + constant:-kButtonStackVerticalMargin], + ]]; +} + +#pragma mark - AutofillAISaveEntityConsumer + +- (void)setNewEntity:(autofill::EntityInstance)newEntity + oldEntity:(std::optional<autofill::EntityInstance>)oldEntity + userEmail:(const std::u16string&)userEmail { + // Forward the data to the table view controller for display. + [_tableViewController setNewEntity:newEntity + oldEntity:oldEntity + userEmail:userEmail]; + + self.title = base::SysUTF16ToNSString(newEntity.type().GetNameForI18n()); + + // Update the button title based on whether it's an update or save. + _buttonTitle = l10n_util::GetNSString( + oldEntity.has_value() ? IDS_AUTOFILL_UPDATE_ADDRESS_PROMPT_OK_BUTTON_LABEL + : IDS_AUTOFILL_SAVE_ADDRESS_PROMPT_OK_BUTTON_LABEL); + + if (_saveButton) { + [_saveButton setTitle:_buttonTitle forState:UIControlStateNormal]; + } +} + +#pragma mark - Actions + +- (void)handleCancelButton { + [self.mutator cancelSaving]; + [self.autofillHandler dismissSaveEntityDialog]; +} + +- (void)saveButtonWasPressed:(UIButton*)sender { + [self.mutator acceptSaving]; + [self.autofillHandler dismissSaveEntityDialog]; +} + +@end
diff --git a/ios/chrome/browser/autofill/autofill_ai/ui/autofill_ai_save_entity_table_view_controller.h b/ios/chrome/browser/autofill/autofill_ai/ui/autofill_ai_save_entity_table_view_controller.h index 2da6e78b..23fe984 100644 --- a/ios/chrome/browser/autofill/autofill_ai/ui/autofill_ai_save_entity_table_view_controller.h +++ b/ios/chrome/browser/autofill/autofill_ai/ui/autofill_ai_save_entity_table_view_controller.h
@@ -5,21 +5,20 @@ #ifndef IOS_CHROME_BROWSER_AUTOFILL_AUTOFILL_AI_UI_AUTOFILL_AI_SAVE_ENTITY_TABLE_VIEW_CONTROLLER_H_ #define IOS_CHROME_BROWSER_AUTOFILL_AUTOFILL_AI_UI_AUTOFILL_AI_SAVE_ENTITY_TABLE_VIEW_CONTROLLER_H_ -#import "ios/chrome/browser/autofill/autofill_ai/ui/autofill_ai_save_entity_consumer.h" +#import "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h" #import "ios/chrome/browser/shared/ui/table_view/chrome_table_view_controller.h" @protocol AutofillCommands; @protocol AutofillAISaveEntityMutator; // View controller for the Autofill AI entity save and update detailed UI. -@interface AutofillAISaveEntityTableViewController - : ChromeTableViewController <AutofillAISaveEntityConsumer> +@interface AutofillAISaveEntityTableViewController : ChromeTableViewController -// Autofill commands handler. -@property(nonatomic, weak) id<AutofillCommands> autofillHandler; - -// Mutator for sending user actions to the mediator. -@property(nonatomic, weak) id<AutofillAISaveEntityMutator> mutator; +// Sets the entities to be displayed. Called by the parent container view +// controller. +- (void)setNewEntity:(autofill::EntityInstance)newEntity + oldEntity:(std::optional<autofill::EntityInstance>)oldEntity + userEmail:(const std::u16string&)userEmail; @end
diff --git a/ios/chrome/browser/autofill/autofill_ai/ui/autofill_ai_save_entity_table_view_controller.mm b/ios/chrome/browser/autofill/autofill_ai/ui/autofill_ai_save_entity_table_view_controller.mm index 4d73b1a..65beb1e 100644 --- a/ios/chrome/browser/autofill/autofill_ai/ui/autofill_ai_save_entity_table_view_controller.mm +++ b/ios/chrome/browser/autofill/autofill_ai/ui/autofill_ai_save_entity_table_view_controller.mm
@@ -9,9 +9,6 @@ #import "components/strings/grit/components_strings.h" #import "ios/chrome/browser/autofill/autofill_ai/public/autofill_ai_constants.h" #import "ios/chrome/browser/autofill/autofill_ai/public/autofill_ai_ui_util.h" -#import "ios/chrome/browser/autofill/autofill_ai/ui/autofill_ai_save_entity_mutator.h" -#import "ios/chrome/browser/autofill/ui_bundled/address_editor/cells/autofill_edit_profile_button_footer_item.h" -#import "ios/chrome/browser/shared/public/commands/autofill_commands.h" #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_link_header_footer_item.h" #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_text_edit_item.h" #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_text_header_footer_item.h" @@ -26,7 +23,6 @@ SectionIdentifierNewEntity = 0, SectionIdentifierOldEntity, SectionIdentifierFooter, - SectionIdentifierActions, SectionCount, }; @@ -53,8 +49,6 @@ void RegisterCells(UITableView* table_view) { RegisterTableViewCell<TableViewTextEditCell>(table_view); RegisterTableViewHeaderFooter<TableViewTextHeaderFooterView>(table_view); - RegisterTableViewHeaderFooter<AutofillEditProfileButtonFooterCell>( - table_view); RegisterTableViewHeaderFooter<TableViewLinkHeaderFooterView>(table_view); } @@ -80,10 +74,6 @@ } // namespace -@interface AutofillAISaveEntityTableViewController () < - AutofillEditProfileButtonFooterDelegate> -@end - @implementation AutofillAISaveEntityTableViewController { // New entity to save. std::optional<autofill::EntityInstance> _newEntity; @@ -103,15 +93,6 @@ self.tableView.accessibilityIdentifier = kAutofillAISaveEntityTableViewId; - // Configure the NavigationBar. - UIBarButtonItem* cancelButton = [[UIBarButtonItem alloc] - initWithBarButtonSystemItem:UIBarButtonSystemItemCancel - target:self - action:@selector(handleCancelButton)]; - cancelButton.accessibilityIdentifier = kAutofillAISaveEntityCancelButtonId; - self.navigationItem.leftBarButtonItem = cancelButton; - self.navigationController.navigationBar.prefersLargeTitles = NO; - RegisterCells(self.tableView); [self loadModel]; @@ -153,13 +134,12 @@ [snapshot appendSectionsWithIdentifiers:@[ @(SectionIdentifierFooter), - @(SectionIdentifierActions), ]]; [_dataSource applySnapshot:snapshot animatingDifferences:NO]; } -#pragma mark - AutofillAISaveEntityConsumer +#pragma mark - Public Methods - (void)setNewEntity:(autofill::EntityInstance)newEntity oldEntity:(std::optional<autofill::EntityInstance>)oldEntity @@ -207,17 +187,6 @@ return footer; } - if (sectionIdentifier == SectionIdentifierActions) { - AutofillEditProfileButtonFooterCell* footer = - DequeueTableViewHeaderFooter<AutofillEditProfileButtonFooterCell>( - tableView); - footer.delegate = self; - [footer.button setTitle:[self acceptButtonText] - forState:UIControlStateNormal]; - footer.button.enabled = YES; - return footer; - } - return nil; } @@ -240,28 +209,13 @@ SectionIdentifier sectionIdentifier = [self sectionIdentifierForSection:section]; - if (sectionIdentifier == SectionIdentifierFooter || - sectionIdentifier == SectionIdentifierActions) { + if (sectionIdentifier == SectionIdentifierFooter) { return UITableViewAutomaticDimension; } return 0; } -#pragma mark - Actions - -- (void)handleCancelButton { - [self.mutator cancelSaving]; - [self.autofillHandler dismissSaveEntityDialog]; -} - -#pragma mark - AutofillEditProfileButtonFooterDelegate - -- (void)didTapButton { - [self.mutator acceptSaving]; - [self.autofillHandler dismissSaveEntityDialog]; -} - #pragma mark - Private - (SectionIdentifier)sectionIdentifierForSection:(NSInteger)section { @@ -284,11 +238,4 @@ } } -- (NSString*)acceptButtonText { - return l10n_util::GetNSString( - _oldEntity.has_value() - ? IDS_AUTOFILL_UPDATE_ADDRESS_PROMPT_OK_BUTTON_LABEL - : IDS_AUTOFILL_SAVE_ADDRESS_PROMPT_OK_BUTTON_LABEL); -} - @end
diff --git a/ios/chrome/browser/autofill/model/BUILD.gn b/ios/chrome/browser/autofill/model/BUILD.gn index 70875d7..3e74f77 100644 --- a/ios/chrome/browser/autofill/model/BUILD.gn +++ b/ios/chrome/browser/autofill/model/BUILD.gn
@@ -25,8 +25,6 @@ "form_suggestion_controller.mm", "form_suggestion_tab_helper.h", "form_suggestion_tab_helper.mm", - "ios_account_setting_service_factory.h", - "ios_account_setting_service_factory.mm", "ios_autofill_ai_model_cache_factory.h", "ios_autofill_ai_model_cache_factory.mm", "ios_autofill_ai_model_executor_factory.h", @@ -72,6 +70,7 @@ "//components/variations/service", "//components/wallet/core/browser", "//ios/chrome/app/strings", + "//ios/chrome/browser/account_settings/model", "//ios/chrome/browser/autofill/autofill_ai/public", "//ios/chrome/browser/autofill/resources", "//ios/chrome/browser/history/model",
diff --git a/ios/chrome/browser/autofill/model/DEPS b/ios/chrome/browser/autofill/model/DEPS index 791c2ef..fde83bac 100644 --- a/ios/chrome/browser/autofill/model/DEPS +++ b/ios/chrome/browser/autofill/model/DEPS
@@ -1,6 +1,7 @@ include_rules = [ # keep-sorted start "+components/wallet/core/browser", + "+ios/chrome/browser/account_settings/model", "+ios/chrome/browser/history/model", "+ios/chrome/browser/infobars/model", "+ios/chrome/browser/optimization_guide/model",
diff --git a/ios/chrome/browser/autofill/model/autofill_ai_util.mm b/ios/chrome/browser/autofill/model/autofill_ai_util.mm index 58a3d5ea..ad2ea827 100644 --- a/ios/chrome/browser/autofill/model/autofill_ai_util.mm +++ b/ios/chrome/browser/autofill/model/autofill_ai_util.mm
@@ -9,7 +9,7 @@ #import "components/autofill/core/browser/permissions/autofill_ai/autofill_ai_permission_utils.h" #import "components/autofill/core/browser/webdata/account_settings/account_setting_service.h" #import "components/variations/service/variations_service.h" -#import "ios/chrome/browser/autofill/model/ios_account_setting_service_factory.h" +#import "ios/chrome/browser/account_settings/model/ios_account_setting_service_factory.h" #import "ios/chrome/browser/autofill/model/ios_autofill_entity_data_manager_factory.h" #import "ios/chrome/browser/metrics/model/google_groups_manager_factory.h" #import "ios/chrome/browser/shared/model/application_context/application_context.h"
diff --git a/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller.mm b/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller.mm index 27f83d7..680d1c28 100644 --- a/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller.mm +++ b/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller.mm
@@ -2042,6 +2042,10 @@ } - (void)omniboxDidResignFirstResponder { + // NO-OP +} + +- (void)omniboxDidEndEditing { CHECK(!IsComposeboxIOSEnabled()); [_sideSwipeCoordinator setEnabled:YES];
diff --git a/ios/chrome/browser/bubble/ui_bundled/bubble_view.mm b/ios/chrome/browser/bubble/ui_bundled/bubble_view.mm index 545fa8bd..5da11b1 100644 --- a/ios/chrome/browser/bubble/ui_bundled/bubble_view.mm +++ b/ios/chrome/browser/bubble/ui_bundled/bubble_view.mm
@@ -486,6 +486,13 @@ target:self selector:@selector(snoozeButtonWasTapped:)]]; } + if (self.showsNextButton) { + [accessibilityCustomActions + addObject:[[UIAccessibilityCustomAction alloc] + initWithName:_nextButton.accessibilityLabel + target:self + selector:@selector(nextButtonWasTapped:)]]; + } if (self.showsCloseButton) { [accessibilityCustomActions addObject:[[UIAccessibilityCustomAction alloc]
diff --git a/ios/chrome/browser/cobrowse/coordinator/assistant_aim_coordinator.mm b/ios/chrome/browser/cobrowse/coordinator/assistant_aim_coordinator.mm index efc5a8a8..b0858e7 100644 --- a/ios/chrome/browser/cobrowse/coordinator/assistant_aim_coordinator.mm +++ b/ios/chrome/browser/cobrowse/coordinator/assistant_aim_coordinator.mm
@@ -140,6 +140,13 @@ setAssistantContainerDetents:{AssistantContainerDetent::kMinimized, AssistantContainerDetent::kMedium, AssistantContainerDetent::kLarge}]; + + [_inputPlateCoordinator endEditing]; +} + +- (void)assistantAIMViewControllerDidRequestEndEditing: + (AssistantAIMViewController*)viewController { + [_inputPlateCoordinator endEditing]; } #pragma mark - AssistantContainerDelegate
diff --git a/ios/chrome/browser/cobrowse/model/BUILD.gn b/ios/chrome/browser/cobrowse/model/BUILD.gn index 668257a..80bfe6f 100644 --- a/ios/chrome/browser/cobrowse/model/BUILD.gn +++ b/ios/chrome/browser/cobrowse/model/BUILD.gn
@@ -21,6 +21,7 @@ "//ios/chrome/browser/shared/model/web_state_list", "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/shared/public/features", + "//ios/chrome/browser/shared/public/features:system_flags", "//ios/chrome/browser/tabs/model:dependency_installer", "//ios/web/public", "//ios/web/public/navigation", @@ -30,7 +31,10 @@ source_set("unit_tests") { testonly = true - sources = [ "cobrowse_tab_helper_unittest.mm" ] + sources = [ + "cobrowse_context_unittest.mm", + "cobrowse_tab_helper_unittest.mm", + ] deps = [ ":model", "//base", @@ -42,6 +46,7 @@ "//ios/chrome/browser/shared/model/web_state_list", "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/shared/public/features", + "//ios/chrome/browser/shared/public/features:system_flags", "//ios/web/public/test", "//ios/web/public/test/fakes", "//testing/gtest",
diff --git a/ios/chrome/browser/cobrowse/model/cobrowse_context.h b/ios/chrome/browser/cobrowse/model/cobrowse_context.h index 80c305a8..9aafe42 100644 --- a/ios/chrome/browser/cobrowse/model/cobrowse_context.h +++ b/ios/chrome/browser/cobrowse/model/cobrowse_context.h
@@ -36,6 +36,8 @@ + (instancetype)defaultContext; // Initializes the context with `url`, adding cobrowse query parameters. +// Note: `url` may be ignored if the "CobrowseGwsURL" experimental setting is +// set. - (instancetype)initWithURL:(const GURL&)url NS_DESIGNATED_INITIALIZER; - (instancetype)init NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/cobrowse/model/cobrowse_context.mm b/ios/chrome/browser/cobrowse/model/cobrowse_context.mm index 0a087175..a55eefec4 100644 --- a/ios/chrome/browser/cobrowse/model/cobrowse_context.mm +++ b/ios/chrome/browser/cobrowse/model/cobrowse_context.mm
@@ -4,7 +4,9 @@ #import "ios/chrome/browser/cobrowse/model/cobrowse_context.h" +#import "base/logging.h" #import "base/strings/sys_string_conversions.h" +#import "ios/chrome/browser/shared/public/features/system_flags.h" #import "net/base/url_util.h" #import "url/gurl.h" @@ -23,7 +25,21 @@ - (instancetype)initWithURL:(const GURL&)url { self = [super init]; if (self) { - _url = net::AppendOrReplaceQueryParameter(url, "gsc", "2"); + NSString* overrideURL = experimental_flags::GetCobrowseGwsURL(); + if (overrideURL) { + DVLOG(1) + << "\n" + << "***********************************************************\n" + << "* *\n" + << "* COBROWSE GWS URL OVERRIDDEN VIA EXPERIMENTAL SETTINGS *\n" + << "* URL: " << base::SysNSStringToUTF8(overrideURL) << "\n" + << "* *\n" + << "***********************************************************\n"; + _url = GURL(base::SysNSStringToUTF8(overrideURL)); + } else { + _url = url; + } + _url = net::AppendOrReplaceQueryParameter(_url, "gsc", "2"); _url = net::AppendOrReplaceQueryParameter(_url, "sourceid", "chrome-mobile"); _url = net::AppendOrReplaceQueryParameter(_url, "gsas", "4");
diff --git a/ios/chrome/browser/cobrowse/model/cobrowse_context_unittest.mm b/ios/chrome/browser/cobrowse/model/cobrowse_context_unittest.mm new file mode 100644 index 0000000..6872d539 --- /dev/null +++ b/ios/chrome/browser/cobrowse/model/cobrowse_context_unittest.mm
@@ -0,0 +1,80 @@ +// Copyright 2026 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/cobrowse/model/cobrowse_context.h" + +#import <Foundation/Foundation.h> + +#import "base/strings/sys_string_conversions.h" +#import "ios/chrome/browser/shared/public/features/system_flags.h" +#import "net/base/url_util.h" +#import "testing/gtest/include/gtest/gtest.h" +#import "testing/platform_test.h" +#import "url/gurl.h" + +namespace { + +const char kDefaultURL[] = "https://www.google.com/search?q=test"; +const char kOverrideURL[] = "https://www.overridden.com/search?q=test"; +NSString* const kCobrowseGwsURLKey = @"CobrowseGwsURL"; + +class CobrowseContextTest : public PlatformTest { + protected: + void SetUp() override { + PlatformTest::SetUp(); + [[NSUserDefaults standardUserDefaults] + removeObjectForKey:kCobrowseGwsURLKey]; + [[NSUserDefaults standardUserDefaults] synchronize]; + } + + void TearDown() override { + [[NSUserDefaults standardUserDefaults] + removeObjectForKey:kCobrowseGwsURLKey]; + [[NSUserDefaults standardUserDefaults] synchronize]; + PlatformTest::TearDown(); + } +}; + +// Tests that the context is initialized with the provided URL when no override +// is present. +TEST_F(CobrowseContextTest, InitWithDefaultURL) { + GURL url(kDefaultURL); + CobrowseContext* context = [[CobrowseContext alloc] initWithURL:url]; + + EXPECT_EQ(context.url.host(), "www.google.com"); + EXPECT_EQ(context.url.path(), "/search"); + + std::string value; + EXPECT_TRUE(net::GetValueForKeyInQuery(context.url, "gsc", &value)); + EXPECT_EQ(value, "2"); + EXPECT_TRUE(net::GetValueForKeyInQuery(context.url, "sourceid", &value)); + EXPECT_EQ(value, "chrome-mobile"); + EXPECT_TRUE(net::GetValueForKeyInQuery(context.url, "gsas", &value)); + EXPECT_EQ(value, "4"); +} + +// Tests that the context is initialized with the override URL when it is +// present in NSUserDefaults. +TEST_F(CobrowseContextTest, InitWithOverrideURL) { + [[NSUserDefaults standardUserDefaults] + setObject:base::SysUTF8ToNSString(kOverrideURL) + forKey:kCobrowseGwsURLKey]; + [[NSUserDefaults standardUserDefaults] synchronize]; + + GURL url(kDefaultURL); + CobrowseContext* context = [[CobrowseContext alloc] initWithURL:url]; + + EXPECT_EQ(context.url.host(), "www.overridden.com"); + EXPECT_EQ(context.url.path(), "/search"); + + std::string value; + EXPECT_TRUE(net::GetValueForKeyInQuery(context.url, "gsc", &value)); + EXPECT_EQ(value, "2"); + EXPECT_TRUE(net::GetValueForKeyInQuery(context.url, "sourceid", &value)); + EXPECT_EQ(value, "chrome-mobile"); + EXPECT_TRUE(net::GetValueForKeyInQuery(context.url, "gsas", &value)); + EXPECT_EQ(value, "4"); +} + +} // namespace
diff --git a/ios/chrome/browser/cobrowse/ui/assistant_aim_view_controller.h b/ios/chrome/browser/cobrowse/ui/assistant_aim_view_controller.h index 76172d97..b9042ee 100644 --- a/ios/chrome/browser/cobrowse/ui/assistant_aim_view_controller.h +++ b/ios/chrome/browser/cobrowse/ui/assistant_aim_view_controller.h
@@ -28,6 +28,10 @@ - (void)assistantAIMViewControllerDidHideKeyboard: (AssistantAIMViewController*)viewController; +// Called when the UI requests ending editing. +- (void)assistantAIMViewControllerDidRequestEndEditing: + (AssistantAIMViewController*)viewController; + @end @interface AssistantAIMViewController : UIViewController <AssistantAIMConsumer>
diff --git a/ios/chrome/browser/composebox/coordinator/composebox_input_plate_coordinator.mm b/ios/chrome/browser/composebox/coordinator/composebox_input_plate_coordinator.mm index 1e57db3..c9f9570 100644 --- a/ios/chrome/browser/composebox/coordinator/composebox_input_plate_coordinator.mm +++ b/ios/chrome/browser/composebox/coordinator/composebox_input_plate_coordinator.mm
@@ -691,6 +691,9 @@ - (void)omniboxDidResignFirstResponder { } +- (void)omniboxDidEndEditing { +} + #pragma mark - Private helpers - (void)focusComposebox {
diff --git a/ios/chrome/browser/composebox/coordinator/composebox_input_plate_mediator.mm b/ios/chrome/browser/composebox/coordinator/composebox_input_plate_mediator.mm index 078a4fa..be174517 100644 --- a/ios/chrome/browser/composebox/coordinator/composebox_input_plate_mediator.mm +++ b/ios/chrome/browser/composebox/coordinator/composebox_input_plate_mediator.mm
@@ -1380,11 +1380,7 @@ if (_contextualSearchSession && _contextualSearchSession->GetMetricsRecorder()) { _contextualSearchSession->GetMetricsRecorder()->RecordModesOnSubmission( - mojo::EnumTraits<composebox_query::mojom::ToolMode, - omnibox::ToolMode>::ToMojom(_inputState.active_tool), - mojo::EnumTraits<composebox_query::mojom::ModelMode, - omnibox::ModelMode>::ToMojom(_inputState - .active_model)); + _inputState.active_tool, _inputState.active_model); } } @@ -2161,31 +2157,34 @@ BOOL eligibleToAIM = [self isEligibleToAIM]; BOOL lensAvailable = lens_availability::CheckAvailabilityForLensEntryPoint( LensEntrypoint::Composebox, [self isDSEGoogle]); - BOOL allowsMultimodalActions = dseGoogle && eligibleToAIM; + BOOL isCobrowse = _entrypoint == ComposeboxEntrypoint::kCobrowse; + BOOL compactInCobrowse = compactMode && isCobrowse; + BOOL allowsMultimodalActions = + dseGoogle && eligibleToAIM && !compactInCobrowse; BOOL canSend = hasContent && !compactMode && allowsMultimodalActions; BOOL showShortcuts = !hasContent && !canSend && !base::FeatureList::IsEnabled(kHideFuseboxVoiceLensActions); - BOOL hidePlusButton = NO; - if (IsComposeboxConditionalPlusButtonEnabled() && - _entrypoint != ComposeboxEntrypoint::kCobrowse && + + if (IsComposeboxConditionalPlusButtonEnabled() && !isCobrowse && _modeHolder.isRegularSearch && compactMode) { BOOL isPreEditURL = !_userInputInProgress && _hasText; BOOL isURLQuery = _userInputInProgress && _hasText && !_isSearchQuery; - hidePlusButton = isURLQuery; + allowsMultimodalActions = !isURLQuery; if (GetComposeboxConditionalPlusButtonVariant() == ComposeboxConditionalPlusButtonVariant::kHideInPreEdit && isPreEditURL) { - hidePlusButton = YES; + allowsMultimodalActions = YES; } } + BOOL showLeadingImage = - !compactMode || !allowsMultimodalActions || hidePlusButton; + !isCobrowse && (!compactMode || !allowsMultimodalActions); BOOL shouldPersistAIMButton = IsComposeboxAIMNudgeEnabled() && !compactMode && allowsMultimodalActions; ComposeboxInputPlateControls leadingAction = - (allowsMultimodalActions && !hidePlusButton) ? kPlus : kNone; + allowsMultimodalActions ? kPlus : kNone; ComposeboxInputPlateControls leadingImage = showLeadingImage ? kLeadingImage : kNone;
diff --git a/ios/chrome/browser/composebox/public/composebox_theme.mm b/ios/chrome/browser/composebox/public/composebox_theme.mm index 1effc17..a980196 100644 --- a/ios/chrome/browser/composebox/public/composebox_theme.mm +++ b/ios/chrome/browser/composebox/public/composebox_theme.mm
@@ -25,7 +25,8 @@ #pragma mark - Public - (BOOL)useIncognitoViewFallback { - return _isNTP && _incognito; + return _isNTP && _incognito && + _inputPlatePosition != ComposeboxInputPlatePosition::kiPad; } - (BOOL)isTopInputPlate {
diff --git a/ios/chrome/browser/content_suggestions/test/ntp_home_egtest.mm b/ios/chrome/browser/content_suggestions/test/ntp_home_egtest.mm index fcb8533..9062030 100644 --- a/ios/chrome/browser/content_suggestions/test/ntp_home_egtest.mm +++ b/ios/chrome/browser/content_suggestions/test/ntp_home_egtest.mm
@@ -218,13 +218,6 @@ "doodle_test/ddljson_android0.json")); } - if ([self isRunningTest:@selector(testLargeFakeboxFocus)]) { - config.features_enabled.push_back(kNTPMIAEntrypoint); - config.additional_args.push_back( - "--kNTPMIAEntrypointParam=" - "kNTPMIAEntrypointParamOmniboxContainedEnlargedFakebox"); - } - if ([self isRunningTest:@selector(DISABLED_testCollectionShortcuts)]) { // This ensures that the test will not fail when What's New is updated. config.additional_args.push_back(base::StringPrintf(
diff --git a/ios/chrome/browser/content_suggestions/ui/content_suggestions_collection_utils.mm b/ios/chrome/browser/content_suggestions/ui/content_suggestions_collection_utils.mm index e6d0154..94edb1d 100644 --- a/ios/chrome/browser/content_suggestions/ui/content_suggestions_collection_utils.mm +++ b/ios/chrome/browser/content_suggestions/ui/content_suggestions_collection_utils.mm
@@ -176,7 +176,7 @@ (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET)) { return kGoogleSearchDoodleShrunkHeight; } - if (ShouldEnlargeNTPFakeboxForMIA()) { + if (IsAimEnabledInNtp()) { return kLargeFakeboxGoogleSearchLogoHeight; } return kGoogleSearchLogoHeight; @@ -188,8 +188,7 @@ return kDoodleTopMarginRegularXRegular; } CGFloat top_inset = 0; - if ((logo_state == SearchEngineLogoState::kLogo) && - ShouldEnlargeNTPFakeboxForMIA()) { + if ((logo_state == SearchEngineLogoState::kLogo) && IsAimEnabledInNtp()) { // Shrink the top inset so that the enlarged logo has the same bottom // positioning as the regular logo. top_inset = kGoogleSearchLogoHeight - kLargeFakeboxGoogleSearchLogoHeight; @@ -216,8 +215,8 @@ } CGFloat SearchFieldTopMargin(SearchEngineLogoState logo_state) { - CGFloat margin = ShouldEnlargeNTPFakeboxForMIA() ? kMIASearchFieldTopMargin - : kSearchFieldTopMargin; + CGFloat margin = + IsAimEnabledInNtp() ? kMIASearchFieldTopMargin : kSearchFieldTopMargin; if (IsConsistentLogoDoodleHeightEnabled() && ui::GetDeviceFormFactor() != ui::DEVICE_FORM_FACTOR_TABLET) { if (logo_state == SearchEngineLogoState::kDoodle) { @@ -232,7 +231,7 @@ return kSearchFieldLarge; } - if (ShouldEnlargeNTPFakeboxForMIA() && !IsCompactHeight(trait_collection)) { + if (IsAimEnabledInNtp() && !IsCompactHeight(trait_collection)) { return std::max(width - kMIASearchFieldMinMargin * 2, kSearchFieldSmallMin); } @@ -242,7 +241,7 @@ } CGFloat FakeOmniboxHeight() { - if (ShouldEnlargeNTPFakeboxForMIA()) { + if (IsAimEnabledInNtp()) { CGFloat multiplier = ui_util::SystemSuggestedFontSizeMultiplier(); return AlignValueToPixel((kFakeboxHeight - kFakeboxHeightNonDynamic) * multiplier + @@ -253,7 +252,7 @@ } CGFloat PinnedFakeOmniboxHeight() { - if (ShouldEnlargeNTPFakeboxForMIA()) { + if (IsAimEnabledInNtp()) { CGFloat multiplier = ui_util::SystemSuggestedFontSizeMultiplier(); return AlignValueToPixel( (kPinnedFakeboxHeight - kPinnedFakeboxHeightNonDynamic) * multiplier + @@ -264,7 +263,7 @@ } CGFloat FakeToolbarHeight() { - if (ShouldEnlargeNTPFakeboxForMIA()) { + if (IsAimEnabledInNtp()) { return PinnedFakeOmniboxHeight() + FakeToolbarVerticalMargin(); } return ToolbarExpandedHeight( @@ -439,7 +438,7 @@ } UIColor* DefaultIconTintColorWithAIMAllowed(bool aim_allowed) { - if (aim_allowed && ShouldEnlargeNTPFakeboxForMIA()) { + if (aim_allowed && IsAimEnabledInNtp()) { return [UIColor colorNamed:kSolidBlackColor]; } return [UIColor colorNamed:kGrey700Color];
diff --git a/ios/chrome/browser/content_suggestions/ui/content_suggestions_collection_utils_unittest.mm b/ios/chrome/browser/content_suggestions/ui/content_suggestions_collection_utils_unittest.mm index 404ef3b..f2b16fb 100644 --- a/ios/chrome/browser/content_suggestions/ui/content_suggestions_collection_utils_unittest.mm +++ b/ios/chrome/browser/content_suggestions/ui/content_suggestions_collection_utils_unittest.mm
@@ -93,15 +93,6 @@ IPhonePortraitTraitCollection()); CGFloat topMarginNoLogo = DoodleTopMargin(SearchEngineLogoState::kNone, IPhonePortraitTraitCollection()); - - // Action when large logo is enabled. - base::test::ScopedFeatureList scoped_feature_list; - base::FieldTrialParams large_fakebox_params = { - {kNTPMIAEntrypointParam, - kNTPMIAEntrypointParamOmniboxContainedEnlargedFakebox}}; - scoped_feature_list.InitWithFeaturesAndParameters( - /*enabled_features=*/{{kNTPMIAEntrypoint, large_fakebox_params}}, - /*disabled_features=*/{}); CGFloat heightLargeLogo = DoodleHeight(SearchEngineLogoState::kLogo, IPhonePortraitTraitCollection()); CGFloat topMarginLargeLogo = DoodleTopMargin(SearchEngineLogoState::kLogo, @@ -110,8 +101,8 @@ // Test. EXPECT_EQ(68, heightDoodle); EXPECT_EQ(55, topMarginDoodle); - EXPECT_EQ(ShouldEnlargeNTPFakeboxForMIA() ? 50 : 36, heightLogo); - EXPECT_EQ(ShouldEnlargeNTPFakeboxForMIA() ? 41 : 55, topMarginLogo); + EXPECT_EQ(IsAimEnabledInNtp() ? 50 : 36, heightLogo); + EXPECT_EQ(IsAimEnabledInNtp() ? 41 : 55, topMarginLogo); EXPECT_EQ(kDoodleHeightNoLogo, heightNoLogo); EXPECT_EQ(55, topMarginNoLogo); EXPECT_EQ(50, heightLargeLogo); @@ -137,14 +128,6 @@ CGFloat topMarginNoLogo = DoodleTopMargin(SearchEngineLogoState::kNone, IPhoneLandscapeTraitCollection()); - // Action when large logo is enabled. - base::test::ScopedFeatureList scoped_feature_list; - base::FieldTrialParams large_fakebox_params = { - {kNTPMIAEntrypointParam, - kNTPMIAEntrypointParamOmniboxContainedEnlargedFakebox}}; - scoped_feature_list.InitWithFeaturesAndParameters( - /*enabled_features=*/{{kNTPMIAEntrypoint, large_fakebox_params}}, - /*disabled_features=*/{}); CGFloat heightLargeLogo = DoodleHeight(SearchEngineLogoState::kLogo, IPhonePortraitTraitCollection()); CGFloat topMarginLargeLogo = DoodleTopMargin(SearchEngineLogoState::kLogo, @@ -153,8 +136,8 @@ // Test. EXPECT_EQ(68, heightDoodle); EXPECT_EQ(55, topMarginDoodle); - EXPECT_EQ(ShouldEnlargeNTPFakeboxForMIA() ? 50 : 36, heightLogo); - EXPECT_EQ(ShouldEnlargeNTPFakeboxForMIA() ? 41 : 55, topMarginLogo); + EXPECT_EQ(IsAimEnabledInNtp() ? 50 : 36, heightLogo); + EXPECT_EQ(IsAimEnabledInNtp() ? 41 : 55, topMarginLogo); EXPECT_EQ(kDoodleHeightNoLogo, heightNoLogo); EXPECT_EQ(55, topMarginNoLogo); EXPECT_EQ(50, heightLargeLogo); @@ -195,8 +178,8 @@ CGFloat topMargin = SearchFieldTopMargin(SearchEngineLogoState::kLogo); // Test. - EXPECT_EQ(ShouldEnlargeNTPFakeboxForMIA() ? 29 : 22, topMargin); - EXPECT_EQ(ShouldEnlargeNTPFakeboxForMIA() ? 452 : 343, resultWidth); + EXPECT_EQ(IsAimEnabledInNtp() ? 29 : 22, topMargin); + EXPECT_EQ(IsAimEnabledInNtp() ? 452 : 343, resultWidth); } TEST_F(ContentSuggestionsCollectionUtilsTest, searchFieldFrameIPhoneLandscape) { @@ -212,7 +195,7 @@ CGFloat topMargin = SearchFieldTopMargin(SearchEngineLogoState::kLogo); // Test. - EXPECT_EQ(ShouldEnlargeNTPFakeboxForMIA() ? 29 : 22, topMargin); + EXPECT_EQ(IsAimEnabledInNtp() ? 29 : 22, topMargin); EXPECT_EQ(343, resultWidth); } @@ -237,7 +220,7 @@ } // Extra spacing when MIA is shown. - CGFloat gain_for_MIA = ShouldEnlargeNTPFakeboxForMIA() ? 21 : 0; + CGFloat gain_for_MIA = IsAimEnabledInNtp() ? 21 : 0; // Action, tests. EXPECT_EQ(200 + gain_for_MIA, HeightForLogoHeader(SearchEngineLogoState::kDoodle, @@ -267,42 +250,18 @@ } TEST_F(ContentSuggestionsCollectionUtilsTest, fakeOmniboxHeight) { - CGFloat expectedHeight = ShouldEnlargeNTPFakeboxForMIA() ? 64 : 50; + CGFloat expectedHeight = IsAimEnabledInNtp() ? 64 : 50; EXPECT_EQ(expectedHeight, FakeOmniboxHeight()); - base::test::ScopedFeatureList scoped_feature_list; - base::FieldTrialParams large_fakebox_params = { - {kNTPMIAEntrypointParam, - kNTPMIAEntrypointParamOmniboxContainedEnlargedFakebox}}; - scoped_feature_list.InitWithFeaturesAndParameters( - /*enabled_features=*/{{kNTPMIAEntrypoint, large_fakebox_params}}, - /*disabled_features=*/{}); - EXPECT_EQ(64, FakeOmniboxHeight()); } TEST_F(ContentSuggestionsCollectionUtilsTest, pinnedFakeOmniboxHeight) { - CGFloat expectedHeight = ShouldEnlargeNTPFakeboxForMIA() ? 48 : 36; + CGFloat expectedHeight = IsAimEnabledInNtp() ? 48 : 36; EXPECT_EQ(expectedHeight, PinnedFakeOmniboxHeight()); - base::test::ScopedFeatureList scoped_feature_list; - base::FieldTrialParams large_fakebox_params = { - {kNTPMIAEntrypointParam, - kNTPMIAEntrypointParamOmniboxContainedEnlargedFakebox}}; - scoped_feature_list.InitWithFeaturesAndParameters( - /*enabled_features=*/{{kNTPMIAEntrypoint, large_fakebox_params}}, - /*disabled_features=*/{}); - EXPECT_EQ(48, PinnedFakeOmniboxHeight()); } TEST_F(ContentSuggestionsCollectionUtilsTest, fakeToolbarHeighta) { - CGFloat expectedHeight = ShouldEnlargeNTPFakeboxForMIA() ? 62 : 50; + CGFloat expectedHeight = IsAimEnabledInNtp() ? 62 : 50; EXPECT_EQ(expectedHeight, FakeToolbarHeight()); - base::test::ScopedFeatureList scoped_feature_list; - base::FieldTrialParams large_fakebox_params = { - {kNTPMIAEntrypointParam, - kNTPMIAEntrypointParamOmniboxContainedEnlargedFakebox}}; - scoped_feature_list.InitWithFeaturesAndParameters( - /*enabled_features=*/{{kNTPMIAEntrypoint, large_fakebox_params}}, - /*disabled_features=*/{}); - EXPECT_EQ(62, FakeToolbarHeight()); } // Tests that the header height is the same for Logo and Doodle, when the
diff --git a/ios/chrome/browser/first_run/interactive_lens/ui/interactive_lens_overlay_promo_view_controller.mm b/ios/chrome/browser/first_run/interactive_lens/ui/interactive_lens_overlay_promo_view_controller.mm index e27e33664..76617442 100644 --- a/ios/chrome/browser/first_run/interactive_lens/ui/interactive_lens_overlay_promo_view_controller.mm +++ b/ios/chrome/browser/first_run/interactive_lens/ui/interactive_lens_overlay_promo_view_controller.mm
@@ -23,10 +23,9 @@ namespace { // Static image assets. NSString* const kLensImageName = @"mountain_webpage"; +NSString* const kFakeWebpageImageName = @"fake_webpage"; NSString* const kHUDImageName = @"lens_overlay_hud"; NSString* const kCirclingHandAnimationName = @"cursor+line"; -// Corner radius for the top two corners of the Lens view. -const CGFloat kLensViewCornerRadius = 45.0; // Multiplier for the top padding for the Lens image. const CGFloat kLensImagePaddingMultiplier = 0.14; // Margins for the Lens view. @@ -53,11 +52,6 @@ @end @implementation InteractiveLensOverlayPromoViewController { - // The container view for the static background image that sits beind the Lens - // view. - UIView* _backgroundContainerView; - // The static background image view that sits inside _backgroundContainerView. - UIImageView* _backgroundImageView; // The heads-up display view that sits on top of the Lens view. UIImageView* _hudView; // Layout guide to handle the static positioning for the bubble view. The @@ -75,6 +69,14 @@ NSLayoutConstraint* _bubbleViewBottomInnerAnimationConstraint; // View controller for the interactive Lens instance. LensOverlayPromoContainerViewController* _lensViewController; + // Constraint to make sure the lens view intially shows the entire image. + NSLayoutConstraint* _lensViewHeightConstraint; + // Container view for the entire lens section. This allows placing a view + // containing the fake webpage content below the actual lens image view. + UIView* _lensContainerView; + // Container containing the fake webpage image. This is necessary because + // UIImageView doesn't support scaling + top aligning an image. + UIView* _fakeWebpageContainerView; // Scroll view containing the screen's title and subtitle. UIScrollView* _textScrollView; // Whether the bubble is currently being hidden. @@ -137,7 +139,7 @@ [self lensImageTopPadding] * 0.7; if (!_lensSearchImage) { _lensSearchImage = [self createLensSearchImage]; - _backgroundImageView.image = _lensSearchImage; + _lensViewHeightConstraint.constant = _lensSearchImage.size.height; } } @@ -167,6 +169,10 @@ - (void)lensInteractivePromoResultsPagePresenterWillPresentResults: (LensInteractivePromoResultsPagePresenter*)presenter { [self showHUDView]; + // Shrink the fake webpage to 0 height and allow the lens view to grow. + [_fakeWebpageContainerView.heightAnchor constraintEqualToConstant:0].active = + YES; + _lensViewHeightConstraint.active = NO; } - (void)lensInteractivePromoResultsPagePresenterDidDismissResults: @@ -186,6 +192,8 @@ - (void)lensOverlayPromoContainerViewControllerDidEndInteraction: (LensOverlayPromoContainerViewController*)viewController { [self transformButtonToPrimaryAction]; + // Further interactions with the lens view can be janky and are unnecessary. + _lensViewController.view.userInteractionEnabled = NO; } #pragma mark - Private @@ -206,30 +214,18 @@ _footerContainerView = [self footerContainerView]; [self.view addSubview:_footerContainerView]; - _backgroundContainerView = [[UIView alloc] init]; - _backgroundContainerView.translatesAutoresizingMaskIntoConstraints = NO; - _backgroundContainerView.clipsToBounds = YES; - _backgroundContainerView.layer.cornerRadius = kLensViewCornerRadius; - _backgroundContainerView.layer.maskedCorners = - kCALayerMinXMinYCorner | kCALayerMaxXMinYCorner; - [self.view addSubview:_backgroundContainerView]; + _lensContainerView = [[UIView alloc] init]; + _lensContainerView.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:_lensContainerView]; - _backgroundImageView = [[UIImageView alloc] init]; - _backgroundImageView.translatesAutoresizingMaskIntoConstraints = NO; - _backgroundImageView.contentMode = UIViewContentModeScaleAspectFill; - _backgroundImageView.layer.cornerRadius = kLensViewCornerRadius; - _backgroundImageView.layer.maskedCorners = - kCALayerMinXMinYCorner | kCALayerMaxXMinYCorner; - _backgroundImageView.layer.borderWidth = 0.5; - _backgroundImageView.layer.borderColor = - [UIColor colorNamed:kGrey300Color].CGColor; - [_backgroundContainerView addSubview:_backgroundImageView]; + _fakeWebpageContainerView = [self fakeWebpageContainerView]; + [_lensContainerView addSubview:_fakeWebpageContainerView]; [_lensViewController willMoveToParentViewController:self]; [self addChildViewController:_lensViewController]; UIView* lensView = _lensViewController.view; lensView.translatesAutoresizingMaskIntoConstraints = NO; - [self.view addSubview:lensView]; + [_lensContainerView addSubview:lensView]; [_lensViewController didMoveToParentViewController:self]; _bubbleContainerView = [[UIView alloc] init]; @@ -290,38 +286,51 @@ constant:kButtonVerticalInsets], ]]; - AddSameConstraintsToSides( - _backgroundImageView, _backgroundContainerView, - LayoutSides::kLeading | LayoutSides::kTrailing | LayoutSides::kTop); - UIView* lensView = _lensViewController.view; - AddSameConstraints(_backgroundContainerView, lensView); - NSLayoutConstraint* lensViewTopAnchor = - [lensView.topAnchor constraintEqualToAnchor:_textScrollView.bottomAnchor - constant:kLensViewTopMargin]; + // The lens view is in the top portion of the container. + AddSameConstraintsToSides( + _lensContainerView, lensView, + LayoutSides::kLeading | LayoutSides::kTrailing | LayoutSides::kTop); + // The fake webpage view is in the bottom portion of the container. + AddSameConstraintsToSides( + _lensContainerView, _fakeWebpageContainerView, + LayoutSides::kLeading | LayoutSides::kTrailing | LayoutSides::kBottom); + // This will be filled with the actual image height when the image is loaded. + _lensViewHeightConstraint = + [lensView.heightAnchor constraintEqualToConstant:0]; + + [NSLayoutConstraint activateConstraints:@[ + _lensViewHeightConstraint, + [lensView.bottomAnchor + constraintEqualToAnchor:_fakeWebpageContainerView.topAnchor], + ]]; + + NSLayoutConstraint* lensViewTopAnchor = [_lensContainerView.topAnchor + constraintEqualToAnchor:_textScrollView.bottomAnchor + constant:kLensViewTopMargin]; lensViewTopAnchor.priority = UILayoutPriorityDefaultLow - 1; - NSLayoutConstraint* maximizeLensViewHeight = - [lensView.heightAnchor constraintEqualToAnchor:view.heightAnchor]; + NSLayoutConstraint* maximizeLensViewHeight = [_lensContainerView.heightAnchor + constraintEqualToAnchor:view.heightAnchor]; maximizeLensViewHeight.priority = UILayoutPriorityDefaultHigh - 1; [NSLayoutConstraint activateConstraints:@[ lensViewTopAnchor, maximizeLensViewHeight, - [lensView.heightAnchor + [_lensContainerView.heightAnchor constraintGreaterThanOrEqualToAnchor:view.heightAnchor multiplier:kLensViewMinHeightMultiplier], - [lensView.heightAnchor - constraintLessThanOrEqualToAnchor:lensView.widthAnchor + [_lensContainerView.heightAnchor + constraintLessThanOrEqualToAnchor:_lensContainerView.widthAnchor multiplier:kLensViewMaxHeightMultiplier], - [lensView.leadingAnchor + [_lensContainerView.leadingAnchor constraintEqualToAnchor:widthLayoutGuide.leadingAnchor constant:kLensViewHorizontalMargin], - [lensView.trailingAnchor + [_lensContainerView.trailingAnchor constraintEqualToAnchor:widthLayoutGuide.trailingAnchor constant:-kLensViewHorizontalMargin], - [lensView.bottomAnchor + [_lensContainerView.bottomAnchor constraintEqualToAnchor:_footerContainerView.topAnchor], - [lensView.topAnchor + [_lensContainerView.topAnchor constraintGreaterThanOrEqualToAnchor:_textScrollView.bottomAnchor constant:kLensViewTopMargin], ]]; @@ -329,7 +338,7 @@ CGSize bubbleViewPreferredHeight = [_bubbleView sizeThatFits:CGSizeMake(view.bounds.size.width, CGFLOAT_MAX)]; _bubbleContainerViewBottomConstraint = [_bubbleContainerView.bottomAnchor - constraintEqualToAnchor:lensView.topAnchor]; + constraintEqualToAnchor:_lensContainerView.topAnchor]; [NSLayoutConstraint activateConstraints:@[ [_bubbleContainerView.centerXAnchor constraintEqualToAnchor:view.centerXAnchor], @@ -357,7 +366,7 @@ constraintEqualToConstant:bubbleViewPreferredHeight.height], ]]; - AddSameConstraints(lensView, _circlingHandAnimation.animationView); + AddSameConstraints(_lensContainerView, _circlingHandAnimation.animationView); } // Returns a new image with the Lens search image padded at the top with white @@ -472,6 +481,39 @@ return bubbleView; } +// Creates and returns the container view holding the fake webpage image. +- (UIView*)fakeWebpageContainerView { + UIView* containerView = [[UIView alloc] init]; + containerView.translatesAutoresizingMaskIntoConstraints = NO; + containerView.clipsToBounds = YES; + + UIImageView* fakeWebpageImageView = [[UIImageView alloc] init]; + fakeWebpageImageView.translatesAutoresizingMaskIntoConstraints = NO; + fakeWebpageImageView.contentMode = UIViewContentModeScaleAspectFill; + [containerView addSubview:fakeWebpageImageView]; + + UIImage* fakeWebpageImage = [UIImage imageNamed:kFakeWebpageImageName]; + fakeWebpageImageView.image = fakeWebpageImage; + + // The image should scale to fill the entire width, but also be top aligned, + // with any extra content on the bottom cropped. Unfortunately, UIKit does not + // have a content mode of "UIViewContentModeScaleAspectFill + + // UIViewContentModeTop." Instead, the image view has a constrained aspect + // ratio, so it can grow in height, and a content mode of ScaleAspectFill, so + // the image takes up the full space. And then, it's aligned to the top of the + // container, which clips the excess at the bottom. + AddSameConstraintsToSides( + containerView, fakeWebpageImageView, + LayoutSides::kLeading | LayoutSides::kTrailing | LayoutSides::kTop); + [fakeWebpageImageView.widthAnchor + constraintEqualToAnchor:fakeWebpageImageView.heightAnchor + multiplier:fakeWebpageImage.size.width / + fakeWebpageImage.size.height] + .active = YES; + + return containerView; +} + // Starts the animation for the tip bubble view. - (void)startBubbleAnimation { _bubbleAnimationCyclesRemaining = 3;
diff --git a/ios/chrome/browser/first_run/interactive_lens/ui/lens_interactive_promo_results_page_presenter.mm b/ios/chrome/browser/first_run/interactive_lens/ui/lens_interactive_promo_results_page_presenter.mm index 9ae2725..97c5056 100644 --- a/ios/chrome/browser/first_run/interactive_lens/ui/lens_interactive_promo_results_page_presenter.mm +++ b/ios/chrome/browser/first_run/interactive_lens/ui/lens_interactive_promo_results_page_presenter.mm
@@ -287,6 +287,10 @@ CGFloat offsetNeeded = sheetHeight + kSelectionOffsetPadding; [_delegate lensOverlayResultsPagePresenter:self updateVerticalOcclusionOffset:offsetNeeded]; + // Recenter the image. + UIEdgeInsets edgeInsets = UIEdgeInsetsMake(-offsetNeeded, 0, 0, 0); + [_delegate lensOverlayResultsPagePresenter:self + shouldZoomImageToCenter:edgeInsets]; } // Performs setup tasks immediately before the results page is presented.
diff --git a/ios/chrome/browser/first_run/interactive_lens/ui/resources/Assets.xcassets/fake_webpage.imageset/Contents.json b/ios/chrome/browser/first_run/interactive_lens/ui/resources/Assets.xcassets/fake_webpage.imageset/Contents.json new file mode 100644 index 0000000..b177cfb --- /dev/null +++ b/ios/chrome/browser/first_run/interactive_lens/ui/resources/Assets.xcassets/fake_webpage.imageset/Contents.json
@@ -0,0 +1,13 @@ +{ + "images" : [ + { + "filename" : "fake_webpage@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +}
diff --git a/ios/chrome/browser/first_run/interactive_lens/ui/resources/Assets.xcassets/fake_webpage.imageset/fake_webpage@3x.png b/ios/chrome/browser/first_run/interactive_lens/ui/resources/Assets.xcassets/fake_webpage.imageset/fake_webpage@3x.png new file mode 100644 index 0000000..1a6fd1c9 --- /dev/null +++ b/ios/chrome/browser/first_run/interactive_lens/ui/resources/Assets.xcassets/fake_webpage.imageset/fake_webpage@3x.png Binary files differ
diff --git a/ios/chrome/browser/first_run/interactive_lens/ui/resources/Assets.xcassets/mountain_webpage.imageset/mountain_webpage@3x.png b/ios/chrome/browser/first_run/interactive_lens/ui/resources/Assets.xcassets/mountain_webpage.imageset/mountain_webpage@3x.png index dbb9d7c..4724ddf 100644 --- a/ios/chrome/browser/first_run/interactive_lens/ui/resources/Assets.xcassets/mountain_webpage.imageset/mountain_webpage@3x.png +++ b/ios/chrome/browser/first_run/interactive_lens/ui/resources/Assets.xcassets/mountain_webpage.imageset/mountain_webpage@3x.png Binary files differ
diff --git a/ios/chrome/browser/first_run/interactive_lens/ui/resources/BUILD.gn b/ios/chrome/browser/first_run/interactive_lens/ui/resources/BUILD.gn index b6e26f1..1ba4b53a 100644 --- a/ios/chrome/browser/first_run/interactive_lens/ui/resources/BUILD.gn +++ b/ios/chrome/browser/first_run/interactive_lens/ui/resources/BUILD.gn
@@ -8,6 +8,8 @@ catalog = "Assets.xcassets" sources = [ "Assets.xcassets/Contents.json", + "Assets.xcassets/fake_webpage.imageset/Contents.json", + "Assets.xcassets/fake_webpage.imageset/fake_webpage@3x.png", "Assets.xcassets/lens_overlay_hud.imageset/Contents.json", "Assets.xcassets/lens_overlay_hud.imageset/lens_overlay_hud@3x.png", "Assets.xcassets/mountain_webpage.imageset/Contents.json",
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index 79e454468..09e2866 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -152,35 +152,6 @@ {"5000", signin::kWaitThresholdMillisecondsForCapabilitiesApi, "5000"}, }; -const FeatureEntry::FeatureParam - kNTPMIAEntrypointOmniboxContainedSingleButton[] = { - {kNTPMIAEntrypointParam, - kNTPMIAEntrypointParamOmniboxContainedSingleButton}}; -const FeatureEntry::FeatureParam kNTPMIAEntrypointOmniboxContainedInline[] = { - {kNTPMIAEntrypointParam, kNTPMIAEntrypointParamOmniboxContainedInline}}; -const FeatureEntry::FeatureParam - kNTPMIAEntrypointOmniboxContainedEnlargedFakebox[] = { - {kNTPMIAEntrypointParam, - kNTPMIAEntrypointParamOmniboxContainedEnlargedFakebox}}; -const FeatureEntry::FeatureParam kNTPMIAEntrypointEnlargedFakeboxNoIncognito[] = - {{kNTPMIAEntrypointParam, - kNTPMIAEntrypointParamEnlargedFakeboxNoIncognito}}; -const FeatureEntry::FeatureParam kNTPMIAEntrypointAIMInQuickActions[] = { - {kNTPMIAEntrypointParam, kNTPMIAEntrypointParamAIMInQuickActions}}; - -const FeatureEntry::FeatureVariation kNTPMIAEntrypointVariations[] = { - {"A: Contained in Omnibox, single button", - kNTPMIAEntrypointOmniboxContainedSingleButton, nullptr}, - {"B: Contained in Omnibox, inline with Voice and Lens", - kNTPMIAEntrypointOmniboxContainedInline, nullptr}, - {"C: Contained in Omnibox, enlarged fakebox", - kNTPMIAEntrypointOmniboxContainedEnlargedFakebox, nullptr}, - {"D: Contained in enlarged fakebox, without incognito shortcut", - kNTPMIAEntrypointEnlargedFakeboxNoIncognito, nullptr}, - {"E: AIM entry point in quick actions, enlarged fakebox", - kNTPMIAEntrypointAIMInQuickActions, nullptr}, -}; - const FeatureEntry::FeatureParam kDisableKeyboardAccessoryOnlySymbolsParam[] = { {kDisableKeyboardAccessoryParam, kDisableKeyboardAccessoryOnlySymbols}}; @@ -2043,12 +2014,6 @@ flag_descriptions::kNotificationCollisionManagementName, flag_descriptions::kNotificationCollisionManagementDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(kNotificationCollisionManagement)}, - {"ntp-mia-entrypoint", flag_descriptions::kNTPMIAEntrypointName, - flag_descriptions::kNTPMIAEntrypointDescription, flags_ui::kOsIos, - FEATURE_WITH_PARAMS_VALUE_TYPE(kNTPMIAEntrypoint, - kNTPMIAEntrypointVariations, - "kNTPMIAEntrypoint")}, - {"autofill-enable-support-for-home-and-work", flag_descriptions::kAutofillEnableSupportForHomeAndWorkName, flag_descriptions::kAutofillEnableSupportForHomeAndWorkDescription, @@ -2720,6 +2685,9 @@ flag_descriptions::kAutofillEnableWalletBrandingV2Description, flags_ui::kOsIos, FEATURE_VALUE_TYPE(autofill::features::kAutofillEnableWalletBrandingV2)}, + {"assistant-side-panel", flag_descriptions::kAssistantSidePanelName, + flag_descriptions::kAssistantSidePanelDescription, flags_ui::kOsIos, + FEATURE_VALUE_TYPE(kAssistantSidePanel)}, }); 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 606f586..bac6c76 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -71,6 +71,10 @@ const char kAssistantContainerDescription[] = "Enables the Assistant Container feature."; +const char kAssistantSidePanelName[] = "AssistantSidePanel"; +const char kAssistantSidePanelDescription[] = + "Enables the AssistantSidePanel feature."; + const char kAutofillAcrossIframesName[] = "Enables Autofill across iframes"; const char kAutofillAcrossIframesDescription[] = "When enabled, Autofill will fill and save information on forms that " @@ -1101,10 +1105,6 @@ const char kNTPBackgroundCustomizationDescription[] = "When enabled, the background customization menu is available on the NTP."; -const char kNTPMIAEntrypointName[] = "Entrypoint for MIA in the new tab page"; -const char kNTPMIAEntrypointDescription[] = - "Selects which variant of the MIA entrypoint is used in the new tab page"; - const char kNativeFindInPageName[] = "Native Find in Page"; const char kNativeFindInPageDescription[] = "When enabled, the JavaScript implementation of the Find in Page feature "
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index bbf30460..8bde619c 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -62,6 +62,9 @@ extern const char kAssistantContainerName[]; extern const char kAssistantContainerDescription[]; +extern const char kAssistantSidePanelName[]; +extern const char kAssistantSidePanelDescription[]; + extern const char kAutofillAcrossIframesName[]; extern const char kAutofillAcrossIframesDescription[]; @@ -682,9 +685,6 @@ extern const char kNTPBackgroundCustomizationName[]; extern const char kNTPBackgroundCustomizationDescription[]; -extern const char kNTPMIAEntrypointName[]; -extern const char kNTPMIAEntrypointDescription[]; - extern const char kNativeFindInPageName[]; extern const char kNativeFindInPageDescription[];
diff --git a/ios/chrome/browser/home_customization/test/home_background_customization_egtest.mm b/ios/chrome/browser/home_customization/test/home_background_customization_egtest.mm index efe0d0ef..6a836a2 100644 --- a/ios/chrome/browser/home_customization/test/home_background_customization_egtest.mm +++ b/ios/chrome/browser/home_customization/test/home_background_customization_egtest.mm
@@ -5,6 +5,7 @@ #import <XCTest/XCTest.h> #import "base/strings/sys_string_conversions.h" +#import "base/test/ios/wait_util.h" #import "components/themes/ntp_background.pb.h" #import "ios/chrome/browser/content_suggestions/test/new_tab_page_app_interface.h" #import "ios/chrome/browser/home_customization/model/home_customization_seed_colors.h" @@ -128,13 +129,6 @@ // Tests that a custom color can be set. - (void)testCustomizeColor { -#if !TARGET_IPHONE_SIMULATOR - // TODO(crbug.com/474141910): Re-enable when fixed. - if (![ChromeEarlGrey isIPadIdiom]) { - EARL_GREY_TEST_DISABLED(@"Test is flaky on iPhone device."); - } -#endif - [[EarlGrey selectElementWithMatcher:grey_accessibilityID( kNTPCustomizationMenuButtonIdentifier)] @@ -157,10 +151,12 @@ chosenColor.accessibilityNameId))] performAction:grey_tap()]; - NewTabPageColorPalette* palette = - [NewTabPageAppInterface currentBackgroundColor]; - SkColor paletteSeedColor = skia::UIColorToSkColor(palette.seedColor); - EXPECT_EQ(chosenColor.color, paletteSeedColor); + EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout( + base::test::ios::kWaitForUIElementTimeout, ^bool() { + NewTabPageColorPalette* palette = + [NewTabPageAppInterface currentBackgroundColor]; + return skia::UIColorToSkColor(palette.seedColor) == chosenColor.color; + })); // Tapping Done should dismiss the entire menu and keep the background color. [[EarlGrey @@ -173,9 +169,12 @@ kHomeCustomizationMainViewAccessibilityIdentifier)] assertWithMatcher:grey_nil()]; - palette = [NewTabPageAppInterface currentBackgroundColor]; - paletteSeedColor = skia::UIColorToSkColor(palette.seedColor); - EXPECT_EQ(chosenColor.color, paletteSeedColor); + EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout( + base::test::ios::kWaitForUIElementTimeout, ^bool() { + NewTabPageColorPalette* palette = + [NewTabPageAppInterface currentBackgroundColor]; + return skia::UIColorToSkColor(palette.seedColor) == chosenColor.color; + })); } // Tests that a custom gallery background can be set.
diff --git a/ios/chrome/browser/intelligence/proto_wrappers/BUILD.gn b/ios/chrome/browser/intelligence/proto_wrappers/BUILD.gn index ac48bb0f..2f40f6b 100644 --- a/ios/chrome/browser/intelligence/proto_wrappers/BUILD.gn +++ b/ios/chrome/browser/intelligence/proto_wrappers/BUILD.gn
@@ -115,10 +115,13 @@ ":page_context_metrics", ":utils", "//base", + "//components/autofill/core/browser", "//components/autofill/core/common", + "//components/autofill/ios/browser", "//components/autofill/ios/browser:util", "//components/autofill/ios/form_util:child_frame_registrar", "//components/optimization_guide:optimization_guide_buildflags", + "//components/optimization_guide/core:features", "//components/optimization_guide/core:page_content", "//components/optimization_guide/proto:optimization_guide_proto", "//ios/chrome/browser/intelligence/features", @@ -208,7 +211,9 @@ ":proto_wrappers", ":utils", "//base/test:test_support", + "//components/autofill/core/browser:test_support", "//components/autofill/core/common", + "//components/autofill/ios/browser:test_support", "//components/autofill/ios/browser:util", "//components/autofill/ios/common", "//components/autofill/ios/form_util:child_frame_registrar",
diff --git a/ios/chrome/browser/intelligence/proto_wrappers/annotated_page_content_extraction_utils.h b/ios/chrome/browser/intelligence/proto_wrappers/annotated_page_content_extraction_utils.h index a22d5fb4..bba15cc7 100644 --- a/ios/chrome/browser/intelligence/proto_wrappers/annotated_page_content_extraction_utils.h +++ b/ios/chrome/browser/intelligence/proto_wrappers/annotated_page_content_extraction_utils.h
@@ -15,6 +15,10 @@ #import "components/optimization_guide/proto/features/common_quality_data.pb.h" #import "url/origin.h" +namespace web { +class WebState; +} + class FrameGrafter; // Util functions to populate the APC proto nodes out of the annotated page @@ -54,4 +58,9 @@ optimization_guide::proto::BoundingRect* destination_viewport_geometry_node); +// Populate Autofill Address and Credit Card information from the profile. +void PopulateAutofillInformation( + web::WebState* web_state, + optimization_guide::proto::AutofillInformation* autofill_information); + #endif // IOS_CHROME_BROWSER_INTELLIGENCE_PROTO_WRAPPERS_ANNOTATED_PAGE_CONTENT_EXTRACTION_UTILS_H_
diff --git a/ios/chrome/browser/intelligence/proto_wrappers/annotated_page_content_extraction_utils.mm b/ios/chrome/browser/intelligence/proto_wrappers/annotated_page_content_extraction_utils.mm index 806cd15..3d630f3 100644 --- a/ios/chrome/browser/intelligence/proto_wrappers/annotated_page_content_extraction_utils.mm +++ b/ios/chrome/browser/intelligence/proto_wrappers/annotated_page_content_extraction_utils.mm
@@ -6,7 +6,10 @@ #import "base/check.h" #import "base/functional/callback.h" +#import "components/autofill/core/browser/data_manager/personal_data_manager.h" +#import "components/autofill/core/browser/payments/payments_autofill_client.h" #import "components/autofill/core/common/unique_ids.h" +#import "components/autofill/ios/browser/autofill_client_ios.h" #import "components/optimization_guide/core/page_content_proto_serializer.h" #import "components/optimization_guide/proto/features/common_quality_data.pb.h" #import "ios/chrome/browser/intelligence/features/features.h" @@ -774,3 +777,35 @@ destination_viewport_geometry_node->set_height(*height); } } + +void PopulateAutofillInformation( + web::WebState* web_state, + optimization_guide::proto::AutofillInformation* autofill_information) { + autofill::AutofillClientIOS* client = + autofill::AutofillClientIOS::FromWebState(web_state); + if (!client || !client->HasPersonalDataManager()) { + return; + } + + const autofill::PersonalDataManager& pdm = client->GetPersonalDataManager(); + + bool address_autofill_enabled = client->IsAutofillProfileEnabled(); + bool has_address_profiles = !pdm.address_data_manager().GetProfiles().empty(); + if (address_autofill_enabled && has_address_profiles) { + autofill_information->add_fillable_data( + optimization_guide::proto::AutofillInformation_FillableData_ADDRESS); + } + + bool payment_autofill_enabled = false; + bool has_credit_cards = false; + if (auto* payments_client = client->GetPaymentsAutofillClient()) { + payment_autofill_enabled = + payments_client->IsAutofillPaymentMethodsEnabled(); + has_credit_cards = !pdm.payments_data_manager().GetCreditCards().empty(); + } + if (payment_autofill_enabled && has_credit_cards) { + autofill_information->add_fillable_data( + optimization_guide::proto:: + AutofillInformation_FillableData_CREDIT_CARD); + } +}
diff --git a/ios/chrome/browser/intelligence/proto_wrappers/page_context_wrapper.mm b/ios/chrome/browser/intelligence/proto_wrappers/page_context_wrapper.mm index 0186a3ef..4547643 100644 --- a/ios/chrome/browser/intelligence/proto_wrappers/page_context_wrapper.mm +++ b/ios/chrome/browser/intelligence/proto_wrappers/page_context_wrapper.mm
@@ -583,6 +583,17 @@ if (_config->use_refactored_extractor()) { // Use the new way for extracting context. + // Autofill information is only needed when extracting detailed annotated + // page content. It is not needed when extracting inner text. + // TODO(crbug.com/493904351): Add kill switch by using autofill config bit. + if (_shouldGetAnnotatedPageContent) { + optimization_guide::proto::AutofillInformation* autofillInformation = + _rootAPCNode->mutable_profile_information() + ->mutable_autofill_information(); + CHECK(_webState); + PopulateAutofillInformation(_webState.get(), autofillInformation); + } + // Callback to aggregate values from the JS execution. auto callback = [](PageContextWrapper* weakWrapper, base::RepeatingClosure barrier, BOOL isMainFrame,
diff --git a/ios/chrome/browser/intelligence/proto_wrappers/page_context_wrapper_unittest.mm b/ios/chrome/browser/intelligence/proto_wrappers/page_context_wrapper_unittest.mm index 5a6b4cd..96ecc60 100644 --- a/ios/chrome/browser/intelligence/proto_wrappers/page_context_wrapper_unittest.mm +++ b/ios/chrome/browser/intelligence/proto_wrappers/page_context_wrapper_unittest.mm
@@ -29,8 +29,10 @@ #import "base/test/scoped_feature_list.h" #import "base/test/values_test_util.h" #import "base/time/time.h" +#import "components/autofill/core/browser/test_utils/autofill_test_utils.h" #import "components/autofill/core/common/autofill_features.h" #import "components/autofill/core/common/unique_ids.h" +#import "components/autofill/ios/browser/test_autofill_client_ios.h" #import "components/autofill/ios/common/features.h" #import "components/autofill/ios/form_util/child_frame_registrar.h" #import "components/autofill/ios/form_util/remote_frame_registration_java_script_feature.h" @@ -4279,6 +4281,118 @@ EXPECT_TRUE(media_data.is_playing()); } +// Tests that Autofill profile and payment data presence maps to the root node's +// AutofillInformation proto correctly. +TEST_P(PageContextWrapperTest, PopulatePageContext_AutofillInformation) { + // Only applicable in V2 where Autofill info is extracted unconditionally. + if (!IsRefactored()) { + return; + } + + // Define a simple page structure. + auto page_structure = HtmlPage("Autofill Page", RawHtml("<p>Hello</p>")); + std::string main_html = page_helper_->Build(page_structure); + web::test::LoadHtml(base::SysUTF8ToNSString(main_html), + test_server_.GetURL(kMainPagePath), web_state()); + + // Setup the TestAutofillClientIOS. + autofill::TestAutofillClientIOS autofill_client(web_state(), /*bridge=*/nil); + + autofill::TestPersonalDataManager& pdm = + static_cast<autofill::TestPersonalDataManager&>( + autofill_client.GetPersonalDataManager()); + + // Add an address profile to the AddressDataManager. + autofill::AutofillProfile profile = autofill::test::GetFullProfile(); + pdm.address_data_manager().AddProfile(profile); + + // Add a credit card to the PaymentsDataManager. + autofill::CreditCard card = autofill::test::GetCreditCard(); + pdm.payments_data_manager().AddCreditCard(card); + + PageContextWrapperConfigBuilder builder; + builder.SetUseRefactoredExtractor(true); + builder.SetUseRichExtraction(false); + + PageContextWrapperCallbackResponse response = RunPageContextWrapperWithConfig( + web_state(), builder.Build(), ^(PageContextWrapper* wrapper) { + wrapper.shouldGetAnnotatedPageContent = YES; + }); + + ASSERT_TRUE(response.has_value()); + std::unique_ptr<optimization_guide::proto::PageContext> page_context = + std::move(response.value()); + + ASSERT_TRUE(page_context); + ASSERT_TRUE(page_context->has_annotated_page_content()); + + const auto& annotated_page_content = page_context->annotated_page_content(); + ASSERT_TRUE(annotated_page_content.has_profile_information()); + ASSERT_TRUE( + annotated_page_content.profile_information().has_autofill_information()); + + const auto& autofill_info = + annotated_page_content.profile_information().autofill_information(); + + // Verify both address and credit card are present. + EXPECT_EQ(autofill_info.fillable_data_size(), 2); + EXPECT_THAT( + autofill_info.fillable_data(), + testing::UnorderedElementsAre( + optimization_guide::proto::AutofillInformation_FillableData_ADDRESS, + optimization_guide::proto:: + AutofillInformation_FillableData_CREDIT_CARD)); +} + +// Tests that when Autofill profile and payment data are unavailable, the +// autofill information is empty. +TEST_P(PageContextWrapperTest, PopulatePageContext_AutofillInformation_Empty) { + // Only applicable in V2 where Autofill info is extracted unconditionally. + if (!IsRefactored()) { + return; + } + + // Define a simple page structure. + auto page_structure = HtmlPage("Autofill Page", RawHtml("<p>Hello</p>")); + std::string main_html = page_helper_->Build(page_structure); + web::test::LoadHtml(base::SysUTF8ToNSString(main_html), + test_server_.GetURL(kMainPagePath), web_state()); + + // Setup the TestAutofillClientIOS. + autofill::TestAutofillClientIOS autofill_client(web_state(), /*bridge=*/nil); + + // Note: We deliberately do NOT add any profiles or credit cards to the + // PersonalDataManager. + + PageContextWrapperConfigBuilder builder; + builder.SetUseRefactoredExtractor(true); + builder.SetUseRichExtraction(false); + + PageContextWrapperCallbackResponse response = RunPageContextWrapperWithConfig( + web_state(), builder.Build(), ^(PageContextWrapper* wrapper) { + wrapper.shouldGetAnnotatedPageContent = YES; + }); + + ASSERT_TRUE(response.has_value()); + std::unique_ptr<optimization_guide::proto::PageContext> page_context = + std::move(response.value()); + + ASSERT_TRUE(page_context); + ASSERT_TRUE(page_context->has_annotated_page_content()); + + const auto& annotated_page_content = page_context->annotated_page_content(); + + ASSERT_TRUE(annotated_page_content.has_profile_information()); + ASSERT_TRUE( + annotated_page_content.profile_information().has_autofill_information()); + + const auto& autofill_info = + annotated_page_content.profile_information().autofill_information(); + + // Verify that the fillable data is empty. + EXPECT_EQ(autofill_info.fillable_data_size(), 0); +} + // Tests that attempting to trigger two extractions on one wrapper fails. TEST_P(PageContextWrapperTest, EnforcesOneTimeUse_Populate) { PageContextWrapper* wrapper =
diff --git a/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_coordinator.mm b/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_coordinator.mm index 422294c..1302c11 100644 --- a/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_coordinator.mm +++ b/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_coordinator.mm
@@ -917,6 +917,12 @@ _selectionViewController.visibleAreaLayoutGuide = visibleAreaLayoutGuide; } +- (void)lensOverlayResultsPagePresenter: + (id<LensOverlayResultsPagePresenting>)presenter + shouldZoomImageToCenter:(UIEdgeInsets)edgeInsets { + [_selectionViewController zoomImageToCenter:edgeInsets]; +} + #pragma mark - LensOverlayMediatorDelegate - (void)lensOverlayMediatorDidOpenOverlayMenu:(LensOverlayMediator*)mediator {
diff --git a/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_mediator.mm b/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_mediator.mm index 0aeb2fd6..7cefc82d0 100644 --- a/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_mediator.mm +++ b/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_mediator.mm
@@ -216,6 +216,10 @@ } - (void)omniboxDidResignFirstResponder { + // NO-OP +} + +- (void)omniboxDidEndEditing { [self defocusOmnibox]; }
diff --git a/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_mediator_unittest.mm b/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_mediator_unittest.mm index 093e9b6..3acb9bc5 100644 --- a/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_mediator_unittest.mm +++ b/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_mediator_unittest.mm
@@ -314,7 +314,7 @@ // Defocus from OmniboxFocusDelegate. ExpectOmniboxDefocus(); - [mediator_ omniboxDidResignFirstResponder]; + [mediator_ omniboxDidEndEditing]; EXPECT_OCMOCK_VERIFY(mock_omnibox_coordinator_); EXPECT_OCMOCK_VERIFY(mock_toolbar_consumer_); }
diff --git a/ios/chrome/browser/lens_overlay/ui/lens_overlay_results_page_presenter_delegate.h b/ios/chrome/browser/lens_overlay/ui/lens_overlay_results_page_presenter_delegate.h index 59a5838..04050860 100644 --- a/ios/chrome/browser/lens_overlay/ui/lens_overlay_results_page_presenter_delegate.h +++ b/ios/chrome/browser/lens_overlay/ui/lens_overlay_results_page_presenter_delegate.h
@@ -42,6 +42,11 @@ (id<LensOverlayResultsPagePresenting>)presenter didAdjustVisibleAreaLayoutGuide:(UILayoutGuide*)visibleAreaLayoutGuide; +// Asks the delegate to recenter the image, with the given edge insets. +- (void)lensOverlayResultsPagePresenter: + (id<LensOverlayResultsPagePresenting>)presenter + shouldZoomImageToCenter:(UIEdgeInsets)edgeInsets; + // Offers the dependent UI a chance to gracefully exit before the bottom sheet // dismisses completely. - (void)lensOverlayResultsPagePresenter:
diff --git a/ios/chrome/browser/location_bar/ui_bundled/location_bar_coordinator_unittest.mm b/ios/chrome/browser/location_bar/ui_bundled/location_bar_coordinator_unittest.mm index 951e9d9..a0d7f19 100644 --- a/ios/chrome/browser/location_bar/ui_bundled/location_bar_coordinator_unittest.mm +++ b/ios/chrome/browser/location_bar/ui_bundled/location_bar_coordinator_unittest.mm
@@ -62,6 +62,8 @@ } - (void)omniboxDidResignFirstResponder { } +- (void)omniboxDidEndEditing { +} - (LocationBarModel*)locationBarModel { if (!_model) {
diff --git a/ios/chrome/browser/metrics/model/ios_chrome_metrics_service_client.mm b/ios/chrome/browser/metrics/model/ios_chrome_metrics_service_client.mm index 7a91a84..8573c22 100644 --- a/ios/chrome/browser/metrics/model/ios_chrome_metrics_service_client.mm +++ b/ios/chrome/browser/metrics/model/ios_chrome_metrics_service_client.mm
@@ -386,7 +386,8 @@ std::make_unique<metrics::ScreenInfoMetricsProvider>()); metrics_service_->RegisterMetricsProvider( - std::make_unique<metrics::DriveMetricsProvider>(ios::FILE_LOCAL_STATE)); + std::make_unique<metrics::DriveMetricsProvider>(ios::FILE_LOCAL_STATE, + local_state)); metrics_service_->RegisterMetricsProvider( std::make_unique<metrics::CallStackProfileMetricsProvider>());
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_constants.h b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_constants.h index 1eaee206..07b517c 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_constants.h +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_constants.h
@@ -37,12 +37,6 @@ // Represents the MIA entry point. extern NSString* const kNTPMIAIdentifier; -// Represents the Lens quick action. -extern NSString* const kNTPLensQuickActionIdentifier; - -// Represents the Voice Search quick action. -extern NSString* const kNTPVoiceSearchQuickActionIdentifier; - // Represents the incognito quick action. extern NSString* const kNTPIncognitoQuickActionIdentifier;
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_constants.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_constants.mm index d2c0944..ea05846e 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_constants.mm +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_constants.mm
@@ -31,12 +31,6 @@ NSString* const kNTPMIAIdentifier = @"kNTPMIAIdentifier"; -NSString* const kNTPLensQuickActionIdentifier = - @"kNTPLensQuickActionIdentifier"; - -NSString* const kNTPVoiceSearchQuickActionIdentifier = - @"kNTPVoiceSearchQuickActionIdentifier"; - NSString* const kNTPIncognitoQuickActionIdentifier = @"kNTPIncognitoQuickActionIdentifier";
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_consumer.h b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_consumer.h index e7c88112..f1a248a 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_consumer.h +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_consumer.h
@@ -37,7 +37,7 @@ - (void)omniboxWillResignFirstResponder; // Indicates that the omnibox stopped being the first responder to the keyboard. -- (void)omniboxDidResignFirstResponder; +- (void)omniboxDidEndEditing; // Restores a given scroll position if applicable. - (void)restoreScrollPosition:(CGFloat)scrollPosition;
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator.mm index a808149..0dc8894 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator.mm +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator.mm
@@ -553,7 +553,7 @@ } - (void)locationBarDidResignFirstResponder { - [self.NTPViewController omniboxDidResignFirstResponder]; + [self.NTPViewController omniboxDidEndEditing]; } - (void)constrainNamedGuideForFeedIPH {
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator_unittest.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator_unittest.mm index a195855..eaf3d5ce 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator_unittest.mm +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator_unittest.mm
@@ -589,7 +589,7 @@ ExpectMethodToProxyToVC(@selector(focusFakebox), @selector(focusOmnibox)); } ExpectMethodToProxyToVC(@selector(locationBarDidResignFirstResponder), - @selector(omniboxDidResignFirstResponder)); + @selector(omniboxDidEndEditing)); [coordinator_ stop]; }
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_egtest.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_egtest.mm index 85b65c48..1826907d 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_egtest.mm +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_egtest.mm
@@ -90,43 +90,6 @@ kNotVisible = 2, }; -// Verifies whether the quick action row respects the expected visibility. -void VerifyQuickActionVisibility(QuickActionsVisibility expected_visibility) { - auto incognitoElement = [EarlGrey - selectElementWithMatcher:grey_accessibilityID( - kNTPIncognitoQuickActionIdentifier)]; - auto lensElement = - [EarlGrey selectElementWithMatcher:grey_accessibilityID( - kNTPLensQuickActionIdentifier)]; - auto voiceSearchElement = [EarlGrey - selectElementWithMatcher:grey_accessibilityID( - kNTPVoiceSearchQuickActionIdentifier)]; - - switch (expected_visibility) { - case QuickActionsVisibility::kVisible: - [incognitoElement assertWithMatcher:grey_sufficientlyVisible()]; - [lensElement assertWithMatcher:grey_sufficientlyVisible()]; - [voiceSearchElement assertWithMatcher:grey_sufficientlyVisible()]; - break; - case QuickActionsVisibility::kVisibleWithoutIncognito: - [incognitoElement assertWithMatcher:grey_notVisible()]; - [lensElement assertWithMatcher:grey_sufficientlyVisible()]; - [voiceSearchElement assertWithMatcher:grey_sufficientlyVisible()]; - break; - case QuickActionsVisibility::kNotVisible: - [incognitoElement assertWithMatcher:grey_notVisible()]; - [lensElement assertWithMatcher:grey_notVisible()]; - [voiceSearchElement assertWithMatcher:grey_notVisible()]; - break; - } -} - -void VerifyMIAButtonVisible(bool mia_button_visible) { - [[EarlGrey selectElementWithMatcher:grey_accessibilityID(kNTPMIAIdentifier)] - assertWithMatcher:mia_button_visible ? grey_sufficientlyVisible() - : grey_notVisible()]; -} - } // namespace @interface NewTabPageTestCase : ChromeTestCase @@ -135,44 +98,6 @@ @implementation NewTabPageTestCase -- (AppLaunchConfiguration)appConfigurationForTestCase { - AppLaunchConfiguration config = [super appConfigurationForTestCase]; - - if ([self isRunningTest:@selector(testNewTabShowsMIAEntryPointInline)]) { - config.features_enabled_and_params.push_back( - {kNTPMIAEntrypoint, - {{{kNTPMIAEntrypointParam, - kNTPMIAEntrypointParamOmniboxContainedInline}}}}); - config.features_disabled.push_back(omnibox::kAimServerEligibilityEnabled); - } - - if ([self isRunningTest:@selector(testNewTabShowsMIAEntryPointInOmnibox)]) { - config.features_enabled_and_params.push_back( - {kNTPMIAEntrypoint, - {{{kNTPMIAEntrypointParam, - kNTPMIAEntrypointParamOmniboxContainedSingleButton}}}}); - config.features_disabled.push_back(omnibox::kAimServerEligibilityEnabled); - } - if ([self isRunningTest:@selector - (testNewTabShowsMIAEntryPointInEnlargedFakebox)]) { - config.features_enabled_and_params.push_back( - {kNTPMIAEntrypoint, - {{{kNTPMIAEntrypointParam, - kNTPMIAEntrypointParamOmniboxContainedEnlargedFakebox}}}}); - config.features_disabled.push_back(omnibox::kAimServerEligibilityEnabled); - } - if ([self - isRunningTest:@selector(testIncognitoButtonNotShownInQuickActions)]) { - config.features_enabled_and_params.push_back( - {kNTPMIAEntrypoint, - {{{kNTPMIAEntrypointParam, - kNTPMIAEntrypointParamEnlargedFakeboxNoIncognito}}}}); - config.features_disabled.push_back(omnibox::kAimServerEligibilityEnabled); - } - - return config; -} - - (void)tearDownHelper { [self releaseHistogramTester]; policy_test_utils::ClearPolicies(); @@ -547,61 +472,4 @@ assertWithMatcher:grey_notVisible()]; } -#pragma mark - MIA Variations - -// Verifies the MIA entry point visiblity for the inline variation. -- (void)testNewTabShowsMIAEntryPointInline { - if ([ChromeEarlGrey isIPadIdiom]) { - EARL_GREY_TEST_SKIPPED(@"Skipped for iPad."); - } - // Open a new tab page. - [ChromeEarlGrey openNewTab]; - // Verify the MIA button is shown. - VerifyMIAButtonVisible(true); - // Quick actions should not be visible when MIA is displayed inline. - VerifyQuickActionVisibility(QuickActionsVisibility::kNotVisible); -} - -// Verifies the MIA entry point visiblity for the omnibox contained variation. -- (void)testNewTabShowsMIAEntryPointInOmnibox { - if ([ChromeEarlGrey isIPadIdiom]) { - EARL_GREY_TEST_SKIPPED(@"Skipped for iPad."); - } - // Open a new tab page. - [ChromeEarlGrey openNewTab]; - // Verify the MIA button is shown. - VerifyMIAButtonVisible(true); - // Quick actions should not be visible. - VerifyQuickActionVisibility(QuickActionsVisibility::kVisible); -} - -// Verifies the MIA entry point visiblity for the enlarged fakebox variation. -- (void)testNewTabShowsMIAEntryPointInEnlargedFakebox { - if ([ChromeEarlGrey isIPadIdiom]) { - EARL_GREY_TEST_SKIPPED(@"Skipped for iPad."); - } - - // Open a new tab page. - [ChromeEarlGrey openNewTab]; - // Verify the MIA button is shown. - VerifyMIAButtonVisible(true); - // Quick actions should be visible. - VerifyQuickActionVisibility(QuickActionsVisibility::kVisible); -} - -// Verifies that the quick actions menu doesn't show incognito for one specific -// MIA entry point variation. -- (void)testIncognitoButtonNotShownInQuickActions { - if ([ChromeEarlGrey isIPadIdiom]) { - EARL_GREY_TEST_SKIPPED(@"Skipped for iPad."); - } - - // Open a new tab page. - [ChromeEarlGrey openNewTab]; - // Verify the MIA button is shown. - VerifyMIAButtonVisible(true); - // QUick actions should not be visible. - VerifyQuickActionVisibility(QuickActionsVisibility::kVisibleWithoutIncognito); -} - @end
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_feature.h b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_feature.h index 48f4f0c4..d0e97e3 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_feature.h +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_feature.h
@@ -17,26 +17,6 @@ kAnimated, }; -// Represents the possible onboarding treatments of Lens Overlay. -enum class NTPMIAEntrypointVariation { - // The default experience. - kDisabled = 0, - // The entrypoint is shown in the omnibox as a single button. - kOmniboxContainedSingleButton = 1, - // The entrypoint is shown in the omnibox as a button inline with Lens and - // Voice. - kOmniboxContainedInline = 2, - // The entrypoint is shown inside the enlarged fake omnibox. - kOmniboxContainedEnlargedFakebox = 3, - // The entrypoint is shown inside the enlarged fake omnibox without incognito - // shortcut. - kEnlargedFakeboxNoIncognito = 4, - // The entrypoint is shown as a quick actions button, with enlarged fake - // omnibox - kAIMInQuickAction = 5, - kMaxValue = kAIMInQuickAction, -}; - #pragma mark - Feature declarations // Flag to modify the feed header through the server. Enabling this feature on @@ -102,17 +82,8 @@ // the new tab page mediator. bool UseFeedEligibilityService(); -// Returns the enabled variation of feature kNTPMIAEntrypoint; -NTPMIAEntrypointVariation GetNTPMIAEntrypointVariation(); - -// Whether to show only the MIA button in the fakebox. -bool ShowOnlyMIAEntrypointInNTPFakebox(); - -// Whether the quick actions row should be displayed. -bool ShouldShowQuickActionsRow(); - -// Whether a MIA variation should increase the size of the fakebox. -bool ShouldEnlargeNTPFakeboxForMIA(); +// Whether the AIM button is allowed in NTP. +bool IsAimEnabledInNtp(); // Whether customized most visited tiles is enabled on Chrome on iOS. bool IsContentSuggestionsCustomizable();
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_feature.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_feature.mm index 0d7982c5..cbf67ab 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_feature.mm +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_feature.mm
@@ -79,53 +79,13 @@ return base::FeatureList::IsEnabled(kUseFeedEligibilityService); } -NTPMIAEntrypointVariation GetNTPMIAEntrypointVariation() { - std::string feature_param = base::GetFieldTrialParamValueByFeature( - kNTPMIAEntrypoint, kNTPMIAEntrypointParam); - if (feature_param == kNTPMIAEntrypointParamOmniboxContainedSingleButton) { - return NTPMIAEntrypointVariation::kOmniboxContainedSingleButton; - } else if (feature_param == kNTPMIAEntrypointParamOmniboxContainedInline) { - return NTPMIAEntrypointVariation::kOmniboxContainedInline; - } else if (feature_param == - kNTPMIAEntrypointParamOmniboxContainedEnlargedFakebox) { - return NTPMIAEntrypointVariation::kOmniboxContainedEnlargedFakebox; - } else if (feature_param == - kNTPMIAEntrypointParamEnlargedFakeboxNoIncognito) { - return NTPMIAEntrypointVariation::kEnlargedFakeboxNoIncognito; - } else if (feature_param == kNTPMIAEntrypointParamAIMInQuickActions) { - return NTPMIAEntrypointVariation::kAIMInQuickAction; - } else { - // Disabled on iPad. - if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET && - !base::FeatureList::IsEnabled(kAIMNTPEntrypointTablet)) { - return NTPMIAEntrypointVariation::kDisabled; - } - // Default value. - return NTPMIAEntrypointVariation::kAIMInQuickAction; +bool IsAimEnabledInNtp() { + if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET && + !base::FeatureList::IsEnabled(kAIMNTPEntrypointTablet)) { + return NO; } -} -bool ShowOnlyMIAEntrypointInNTPFakebox() { - NTPMIAEntrypointVariation variation = GetNTPMIAEntrypointVariation(); - return variation == - NTPMIAEntrypointVariation::kOmniboxContainedSingleButton || - variation == - NTPMIAEntrypointVariation::kOmniboxContainedEnlargedFakebox || - variation == NTPMIAEntrypointVariation::kEnlargedFakeboxNoIncognito; -} - -bool ShouldShowQuickActionsRow() { - NTPMIAEntrypointVariation variation = GetNTPMIAEntrypointVariation(); - return ShowOnlyMIAEntrypointInNTPFakebox() || - variation == NTPMIAEntrypointVariation::kAIMInQuickAction; -} - -bool ShouldEnlargeNTPFakeboxForMIA() { - NTPMIAEntrypointVariation variation = GetNTPMIAEntrypointVariation(); - return variation == - NTPMIAEntrypointVariation::kOmniboxContainedEnlargedFakebox || - variation == NTPMIAEntrypointVariation::kEnlargedFakeboxNoIncognito || - variation == NTPMIAEntrypointVariation::kAIMInQuickAction; + return YES; } bool IsContentSuggestionsCustomizable() {
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view.mm index c65d4d5..ce10e86 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view.mm +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view.mm
@@ -78,7 +78,6 @@ // Voice Search, depending on if Lens is enabled. const CGFloat kEndButtonFakeboxTrailingSpace = 13.0; const CGFloat kEndButtonNormalSizeFakeboxWithBadgeTrailingSpace = 7.0; -const CGFloat kEndButtonMIAEnlargedFakebox = 20.0; const CGFloat kEndButtonOmniboxTrailingSpace = 7.0; // Distance between the trailing fakebox icon and the placeholder text. @@ -95,10 +94,6 @@ const CGFloat kOmniboxImageLeadingSpace = 22.0; const CGFloat kFakeboxImageSize = 20.0; -// The amount to inset the Fakebox from the rest of the modules on Home, when -// Large Fakebox is enabled. -const CGFloat kLargeFakeboxHorizontalMargin = 8.0; - // The spacing between the items in the button stack. const CGFloat kButtonSpacing = 9.0; @@ -123,10 +118,6 @@ // fakebox. const CGFloat kMIACircleAnimationSizeNormal = 40.0; -// The value of the sides of the MIA circle animation for the enlarged size of -// the fakebox. -const CGFloat kMIACircleAnimationSizeEnlarged = 48.0; - // Returns the top color of the Fakebox's gradient background. UIColor* FakeboxTopColor() { return UIAccessibilityIsReduceTransparencyEnabled() @@ -242,17 +233,6 @@ // the NTP. @property(nonatomic, strong) UIView* fakeToolbar; -// Whether to use MIA inline with other action buttons. -@property(nonatomic, readonly) BOOL useInlineMIA; -// Whether to only display the MIA button. -@property(nonatomic, readonly) BOOL useSingleButtonMIA; -// Whether the MIA entry point is being shown. -@property(nonatomic, readonly) BOOL shouldShowMIAEntrypoint; -// Whether the fakebox is enlarged due to a MIA entry point variation. -@property(nonatomic, readonly) BOOL useMIAEnlargedFakebox; -// The amount to inset the Fakebox from the rest of the modules on Home. -@property(nonatomic, readonly) CGFloat fakeboxHorizontalMargin; - @end @implementation NewTabPageHeaderView { @@ -473,11 +453,9 @@ self.fakeLocationBarTopConstraint = [self.fakeLocationBar.topAnchor constraintEqualToAnchor:searchField.topAnchor]; self.fakeLocationBarLeadingConstraint = [self.fakeLocationBar.leadingAnchor - constraintEqualToAnchor:searchField.leadingAnchor - constant:self.fakeboxHorizontalMargin]; + constraintEqualToAnchor:searchField.leadingAnchor]; self.fakeLocationBarTrailingConstraint = [self.fakeLocationBar.trailingAnchor - constraintEqualToAnchor:searchField.trailingAnchor - constant:self.fakeboxHorizontalMargin]; + constraintEqualToAnchor:searchField.trailingAnchor]; self.fakeLocationBarHeightConstraint = [self.fakeLocationBar.heightAnchor constraintEqualToConstant:content_suggestions::FakeOmniboxHeight()]; [NSLayoutConstraint activateConstraints:@[ @@ -522,10 +500,7 @@ // Updates button styling for the current trait collection. - (void)updateButtonsForCurrentTraitCollection { // Variations containing MIA entry point force disable colors in the icons. - const BOOL aimInQuickActions = GetNTPMIAEntrypointVariation() == - NTPMIAEntrypointVariation::kAIMInQuickAction; - const BOOL forceDisableColors = - self.shouldShowMIAEntrypoint || aimInQuickActions; + const BOOL forceDisableColors = IsAimEnabledInNtp(); const BOOL darkUIStyle = self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark; const BOOL ntpHasCustomBackground = @@ -636,7 +611,6 @@ // If MIA animation view is shown then add an aditional spacing to avoid any // overlap with the label. self.hintLabelTrailingConstraint.constant = -hintLabelScalingExtraOffset - - [self miaButtonHintLabelOffset] - kHintLabelFakeboxTrailingSpace; // Animate the leading image from its fakebox position to its scrolled omnibox @@ -702,13 +676,10 @@ // Calculate the amount to shrink the width and height of background so that // it's where the focused adapative toolbar focuses. - CGFloat horizontalMargin = self.fakeboxHorizontalMargin; self.fakeLocationBarLeadingConstraint.constant = Interpolate( - horizontalMargin, - safeAreaInsets.left + kExpandedLocationBarHorizontalMargin, percent); + 0, safeAreaInsets.left + kExpandedLocationBarHorizontalMargin, percent); self.fakeLocationBarTrailingConstraint.constant = -Interpolate( - horizontalMargin, - safeAreaInsets.right + kExpandedLocationBarHorizontalMargin, percent); + 0, safeAreaInsets.right + kExpandedLocationBarHorizontalMargin, percent); self.fakeLocationBarTopConstraint.constant = ntp_header::kFakeLocationBarTopConstraint * percent; @@ -1019,40 +990,16 @@ // Adds the necessary buttons to the fakebox stack. - (void)addFakeboxButtonsToStack { - if (self.shouldShowMIAEntrypoint) { - ExtendedTouchTargetButton* miaButton = - [ExtendedTouchTargetButton buttonWithType:UIButtonTypeSystem]; - if (self.useSingleButtonMIA) { - miaButton.minimumDiameter = sqrt(2) * [self miaAnimationSize].width; - } - self.miaButton = miaButton; - - [self.miaButton - setAccessibilityLabel:l10n_util::GetNSString(IDS_IOS_ACCNAME_MIA)]; - [self.miaButton setAccessibilityIdentifier:kNTPMIAIdentifier]; - - [_buttonStack addArrangedSubview:self.miaButton]; - if (self.useInlineMIA) { - [self addMIAAndVoiceDivider]; - } else if (self.useSingleButtonMIA) { - [self updateAnimationOnMIAButton]; - } - } - - BOOL displayOtherActions = !self.useSingleButtonMIA; - - if (displayOtherActions) { - // Voice search. - self.voiceSearchButton = - [ExtendedTouchTargetButton buttonWithType:UIButtonTypeSystem]; - [_buttonStack addArrangedSubview:self.voiceSearchButton]; - } + // Voice search. + self.voiceSearchButton = + [ExtendedTouchTargetButton buttonWithType:UIButtonTypeSystem]; + [_buttonStack addArrangedSubview:self.voiceSearchButton]; // Lens. const BOOL useLens = lens_availability::CheckAndLogAvailabilityForLensEntryPoint( LensEntrypoint::NewTabPage, self.isGoogleDefaultSearchEngine); - if (useLens && displayOtherActions) { + if (useLens) { [self addVoiceAndLensDivider]; self.lensButton = [ExtendedTouchTargetButton buttonWithType:UIButtonTypeSystem]; @@ -1096,8 +1043,7 @@ self.hintLabelTrailingConstraint = [self.searchHintLabel.trailingAnchor constraintLessThanOrEqualToAnchor:referenceView.leadingAnchor - constant:-[self miaButtonHintLabelOffset] - - kHintLabelFakeboxTrailingSpace]; + constant:-kHintLabelFakeboxTrailingSpace]; self.hintLabelTrailingConstraint.priority = UILayoutPriorityDefaultHigh; [NSLayoutConstraint activateConstraints:@[ [referenceView.centerYAnchor @@ -1266,13 +1212,8 @@ // Returns end button fakebox trailing space depending on fakebox size and // whether the new badge is displayed. - (CGFloat)endButtonFakeboxTrailingSpace { - // If the MIA entry point is shown add a bigger space to the trailing edge to - // accomodate the animation view. - if (self.useMIAEnlargedFakebox) { - return kEndButtonMIAEnlargedFakebox; - } // If normal sized fakebox and new bade is showing, reduce trailing space. - if (_useNewBadgeForLensButton && !ShouldEnlargeNTPFakeboxForMIA()) { + if (_useNewBadgeForLensButton && !IsAimEnabledInNtp()) { return kEndButtonNormalSizeFakeboxWithBadgeTrailingSpace; } // Common trailing space. @@ -1298,31 +1239,11 @@ AccountParticleDiscBadgeBackgroundColor( self.traitCollection.userInterfaceStyle); } - - if (self.useSingleButtonMIA) { - [_miaAnimationView removeFromSuperview]; - _miaAnimation = nil; - [self updateAnimationOnMIAButton]; - } } } #pragma mark - MIA -- (BOOL)useInlineMIA { - return _isAIMAllowed && - GetNTPMIAEntrypointVariation() == - NTPMIAEntrypointVariation::kOmniboxContainedInline; -} - -- (BOOL)useSingleButtonMIA { - return _isAIMAllowed && ShowOnlyMIAEntrypointInNTPFakebox(); -} - -- (BOOL)shouldShowMIAEntrypoint { - return self.useInlineMIA || self.useSingleButtonMIA; -} - // Creates an animation view for the MIA entry point. - (UIView*)createMIAAnimationView { if (!_miaAnimation) { @@ -1371,40 +1292,14 @@ AddSizeConstraints(_miaAnimationView, [self miaAnimationSize]); } -- (CGFloat)miaButtonHintLabelOffset { - if (self.useSingleButtonMIA && _miaAnimationView) { - return ([self miaAnimationSize].width / 2); - } - - return 0; -} - // The size for the animation view dependant on the fakebox size. - (CGSize)miaAnimationSize { - if (self.useMIAEnlargedFakebox) { - return CGSizeMake(kMIACircleAnimationSizeEnlarged, - kMIACircleAnimationSizeEnlarged); - } else { - return CGSizeMake(kMIACircleAnimationSizeNormal, - kMIACircleAnimationSizeNormal); - } -} - -- (BOOL)useMIAEnlargedFakebox { - return self.isGoogleDefaultSearchEngine && ShouldEnlargeNTPFakeboxForMIA() && - self.shouldShowMIAEntrypoint; + return CGSizeMake(kMIACircleAnimationSizeNormal, + kMIACircleAnimationSizeNormal); } #pragma mark - helpers -- (CGFloat)fakeboxHorizontalMargin { - if (IsSplitToolbarMode(self) && ShouldEnlargeNTPFakeboxForMIA() && - !ShouldEnlargeNTPFakeboxForMIA()) { - return kLargeFakeboxHorizontalMargin; - } - return 0.0; -} - - (CGFloat)hintLabelFakeboxLeadingSpace { if (base::FeatureList::IsEnabled(omnibox::kOmniboxMobileParityUpdateV2)) { return kHintLabelFakeboxLeadingSpaceWithIcon;
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.h b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.h index 215515e5..b04720e 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.h +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.h
@@ -123,7 +123,7 @@ - (CGFloat)headerHeight; // Shows the fakebox. -- (void)omniboxDidResignFirstResponder; +- (void)omniboxDidEndEditing; // Hides the new feature badge on the Home customization menu's entrypoint. - (void)hideBadgeOnCustomizationMenu;
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.mm index a8d95682..2ec196f 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.mm +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.mm
@@ -396,7 +396,7 @@ self.headerView.allowFontScaleAnimation = allowFontScaleAnimation; } -- (void)omniboxDidResignFirstResponder { +- (void)omniboxDidEndEditing { // Return early if the view is already showing. if (self.view.alpha == 1) { return;
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_quick_actions_view_controller.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_quick_actions_view_controller.mm index 299fde12..5dbbfef9 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_quick_actions_view_controller.mm +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_quick_actions_view_controller.mm
@@ -43,12 +43,6 @@ // Returns the color needed for the background of the button. UIColor* ButtonBackgroundColor(NewTabPageColorPalette* colorPalette) { - if (GetNTPMIAEntrypointVariation() == - NTPMIAEntrypointVariation::kOmniboxContainedSingleButton) { - return colorPalette ? colorPalette.secondaryCellColor - : [UIColor colorNamed:kBackgroundColor]; - } - // All other treatments use the same color as the fakebox. return colorPalette ? colorPalette.omniboxColor : [UIColor colorNamed:kFakeboxMatchingBackgroundColor]; @@ -70,9 +64,7 @@ [NSLayoutConstraint activateConstraints:@[ [_buttonStackView.heightAnchor constraintEqualToConstant:kQuickActionsHeight] ]]; - BOOL showAIMEntrypoint = GetNTPMIAEntrypointVariation() == - NTPMIAEntrypointVariation::kAIMInQuickAction; - if (showAIMEntrypoint) { + if (IsAimEnabledInNtp()) { _aimButton = [self createButtonWithSymbolName:kMagnifyingglassSparkSymbol title:l10n_util::GetNSString( @@ -80,42 +72,14 @@ [_buttonStackView addArrangedSubview:_aimButton]; } - BOOL showIncognito = GetNTPMIAEntrypointVariation() != - NTPMIAEntrypointVariation::kEnlargedFakeboxNoIncognito; - if (showIncognito) { - if (showAIMEntrypoint) { - _incognitoButton = [self - createButtonWithSymbolName:kIncognitoSymbol - title:l10n_util::GetNSString( - IDS_IOS_NTP_QUICK_ACTIONS_INCOGNITO)]; - } else { - _incognitoButton = [self createButtonWithSymbolName:kIncognitoSymbol]; - } - [_buttonStackView addArrangedSubview:_incognitoButton]; - } - - BOOL showVoiceLens = GetNTPMIAEntrypointVariation() != - NTPMIAEntrypointVariation::kAIMInQuickAction; - - if (showVoiceLens) { - _voiceSearchButton = [self createButtonWithSymbolName:kVoiceSymbol]; - _lensButton = [self createButtonWithSymbolName:kCameraLensSymbol]; - - [_buttonStackView addArrangedSubview:_voiceSearchButton]; - [_buttonStackView addArrangedSubview:_lensButton]; - } + _incognitoButton = [self + createButtonWithSymbolName:kIncognitoSymbol + title:l10n_util::GetNSString( + IDS_IOS_NTP_QUICK_ACTIONS_INCOGNITO)]; + [_buttonStackView addArrangedSubview:_incognitoButton]; [self setupQuickActionsButtonsAccessibility]; - [_lensButton addTarget:self - action:@selector(openLensViewFinder) - forControlEvents:UIControlEventTouchUpInside]; - [_voiceSearchButton addTarget:self - action:@selector(loadVoiceSearch) - forControlEvents:UIControlEventTouchUpInside]; - [_voiceSearchButton addTarget:self - action:@selector(preloadVoiceSearch:) - forControlEvents:UIControlEventTouchDown]; [_incognitoButton addTarget:self action:@selector(openIncognitoSearch) forControlEvents:UIControlEventTouchUpInside]; @@ -134,12 +98,6 @@ _incognitoButton.accessibilityLabel = l10n_util::GetNSString(IDS_IOS_ACCNAME_NEW_INCOGNITO_TAB); _incognitoButton.accessibilityIdentifier = kNTPIncognitoQuickActionIdentifier; - _lensButton.accessibilityLabel = l10n_util::GetNSString(IDS_IOS_ACCNAME_LENS); - _lensButton.accessibilityIdentifier = kNTPLensQuickActionIdentifier; - _voiceSearchButton.accessibilityLabel = - l10n_util::GetNSString(IDS_IOS_ACCNAME_VOICE_SEARCH); - _voiceSearchButton.accessibilityIdentifier = - kNTPVoiceSearchQuickActionIdentifier; } // Creates a new horizontal button stack view. @@ -184,23 +142,13 @@ UIButton* button = [[UIButton alloc] init]; UIColor* baseTintColor = content_suggestions::DefaultIconTintColorWithAIMAllowed(YES); - if (GetNTPMIAEntrypointVariation() == - NTPMIAEntrypointVariation::kOmniboxContainedSingleButton) { - button.configurationUpdateHandler = - CreateThemedButtonConfigurationUpdateHandler( - baseTintColor, ^(NewTabPageColorPalette* palette) { - return ButtonBackgroundColor(palette); - }); - } else { - // Other variations change the blur background to match the omnibox. - button.configurationUpdateHandler = - CreateThemedButtonConfigurationUpdateHandler( - baseTintColor, - ^(NewTabPageColorPalette* palette) { - return ButtonBackgroundColor(palette); - }, - UIBlurEffectStyleSystemThickMaterial); - } + button.configurationUpdateHandler = + CreateThemedButtonConfigurationUpdateHandler( + baseTintColor, + ^(NewTabPageColorPalette* palette) { + return ButtonBackgroundColor(palette); + }, + UIBlurEffectStyleSystemThickMaterial); button.translatesAutoresizingMaskIntoConstraints = NO; button.configuration = configuration; @@ -209,21 +157,6 @@ #pragma mark - Button actions -- (void)openLensViewFinder { - [self.NTPShortcutsHandler openLensViewFinder]; -} - -- (void)loadVoiceSearch { - [self.NTPShortcutsHandler loadVoiceSearchFromView:_voiceSearchButton]; -} - -- (void)preloadVoiceSearch:(id)sender { - [sender removeTarget:self - action:@selector(preloadVoiceSearch:) - forControlEvents:UIControlEventTouchDown]; - [self.NTPShortcutsHandler preloadVoiceSearch]; -} - - (void)openIncognitoSearch { [self.NTPShortcutsHandler openIncognitoSearch]; }
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_view_controller.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_view_controller.mm index 74dace32..a36e9b2 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_view_controller.mm +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_view_controller.mm
@@ -820,10 +820,10 @@ return; } - [self omniboxDidResignFirstResponder]; + [self omniboxDidEndEditing]; } -- (void)omniboxDidResignFirstResponder { +- (void)omniboxDidEndEditing { if (![self.headerViewController isShowing] && !self.scrolledToMinimumHeight) { return; } @@ -831,7 +831,7 @@ // Do not trigger defocus animation if the user is already navigating away // from the NTP. if (self.NTPVisible) { - [self.headerViewController omniboxDidResignFirstResponder]; + [self.headerViewController omniboxDidEndEditing]; [self shiftTilesDownForOmniboxDefocus]; } } @@ -1161,8 +1161,7 @@ // Whether the quick actions button row is visible. - (BOOL)quickActionsVisible { - return _isAIMAllowed && ShouldShowQuickActionsRow() && - !self.incognitoDisabled; + return _isAIMAllowed && IsAimEnabledInNtp(); } // Returns YES if scroll should be skipped when focusing the omnibox. @@ -1224,7 +1223,7 @@ if (self.omniboxFocused) { [self.NTPContentDelegate cancelOmniboxEdit]; } else { - [self omniboxDidResignFirstResponder]; + [self omniboxDidEndEditing]; } }
diff --git a/ios/chrome/browser/omnibox/coordinator/omnibox_mediator.mm b/ios/chrome/browser/omnibox/coordinator/omnibox_mediator.mm index 0c5d413..484d489 100644 --- a/ios/chrome/browser/omnibox/coordinator/omnibox_mediator.mm +++ b/ios/chrome/browser/omnibox/coordinator/omnibox_mediator.mm
@@ -245,6 +245,10 @@ [self.delegate omniboxMediatorDidBeginEditing:self]; } +- (void)onDidEndEditing { + [self.omniboxTextController onDidEndEditing]; +} + - (BOOL)shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)newText { return [self.omniboxTextController shouldChangeCharactersInRange:range
diff --git a/ios/chrome/browser/omnibox/model/omnibox_text_controller.h b/ios/chrome/browser/omnibox/model/omnibox_text_controller.h index 24db0f8..908aed10 100644 --- a/ios/chrome/browser/omnibox/model/omnibox_text_controller.h +++ b/ios/chrome/browser/omnibox/model/omnibox_text_controller.h
@@ -159,6 +159,9 @@ /// Called when the omnibox text field starts editing. - (void)onDidBeginEditing; +/// Called when the omnibox text field ends editing. +- (void)onDidEndEditing; + /// Called before the omnibox text field changes. `newText` will replace the /// text currently in `range`. - (BOOL)shouldChangeCharactersInRange:(NSRange)range
diff --git a/ios/chrome/browser/omnibox/model/omnibox_text_controller.mm b/ios/chrome/browser/omnibox/model/omnibox_text_controller.mm index d2070ad1..976091f 100644 --- a/ios/chrome/browser/omnibox/model/omnibox_text_controller.mm +++ b/ios/chrome/browser/omnibox/model/omnibox_text_controller.mm
@@ -166,7 +166,7 @@ // The controller looks at the current pre-edit state, so the call to // OnKillFocus() must come after exiting pre-edit. - [self.focusDelegate omniboxDidResignFirstResponder]; + [self.focusDelegate omniboxDidEndEditing]; // Composebox is destroyed on endEditing, skip revert to avoid resizing on // revert. @@ -578,6 +578,10 @@ } } +- (void)onDidEndEditing { + [self.focusDelegate omniboxDidResignFirstResponder]; +} + - (BOOL)shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)newText { BOOL shouldChange = YES;
diff --git a/ios/chrome/browser/omnibox/ui/omnibox_focus_delegate.h b/ios/chrome/browser/omnibox/ui/omnibox_focus_delegate.h index 1830a84..960f9753 100644 --- a/ios/chrome/browser/omnibox/ui/omnibox_focus_delegate.h +++ b/ios/chrome/browser/omnibox/ui/omnibox_focus_delegate.h
@@ -12,9 +12,13 @@ // Called when the omnibox gains keyboard focus. - (void)omniboxDidBecomeFirstResponder; + // Called when the omnibox loses keyboard focus. - (void)omniboxDidResignFirstResponder; +// Called when the omnibox ends editing. +- (void)omniboxDidEndEditing; + @end #endif // IOS_CHROME_BROWSER_OMNIBOX_UI_OMNIBOX_FOCUS_DELEGATE_H_
diff --git a/ios/chrome/browser/omnibox/ui/omnibox_mutator.h b/ios/chrome/browser/omnibox/ui/omnibox_mutator.h index 73a5ee91..ac492cf 100644 --- a/ios/chrome/browser/omnibox/ui/omnibox_mutator.h +++ b/ios/chrome/browser/omnibox/ui/omnibox_mutator.h
@@ -36,6 +36,9 @@ /// Called when the omnibox text field starts editing. - (void)onDidBeginEditing; +/// Called when the omnibox text field ends editing. +- (void)onDidEndEditing; + /// Called before the omnibox text field changes. `newText` will replace the /// text currently in `range`. - (BOOL)shouldChangeCharactersInRange:(NSRange)range
diff --git a/ios/chrome/browser/omnibox/ui/omnibox_view_controller.mm b/ios/chrome/browser/omnibox/ui/omnibox_view_controller.mm index 32d5637..e65e1ffd 100644 --- a/ios/chrome/browser/omnibox/ui/omnibox_view_controller.mm +++ b/ios/chrome/browser/omnibox/ui/omnibox_view_controller.mm
@@ -315,6 +315,8 @@ RecordAction( UserMetricsAction("Mobile_FocusedDefocusedOmnibox_WithNoAction")); } + + [self.mutator onDidEndEditing]; } - (UIMenu*)textInput:(id<OmniboxTextInput>)textInput
diff --git a/ios/chrome/browser/orchestrator/ui_bundled/omnibox_focus_orchestrator.mm b/ios/chrome/browser/orchestrator/ui_bundled/omnibox_focus_orchestrator.mm index 884651ce..4fc19ac 100644 --- a/ios/chrome/browser/orchestrator/ui_bundled/omnibox_focus_orchestrator.mm +++ b/ios/chrome/browser/orchestrator/ui_bundled/omnibox_focus_orchestrator.mm
@@ -309,14 +309,14 @@ // Use UIView animateWithDuration instead of UIViewPropertyAnimator to // avoid UIKit bug. See https://crbug.com/856155. self.inProgressAnimationCount += 1; - if (ShouldEnlargeNTPFakeboxForMIA()) { + if (IsAimEnabledInNtp()) { // Set the location bar height to the default. [self.toolbarAnimatee setLocationBarHeightExpanded]; } [self.toolbarAnimatee setToolbarFaded:NO]; switch (_trigger) { case OmniboxFocusTrigger::kPinnedFakebox: - if (ShouldEnlargeNTPFakeboxForMIA()) { + if (IsAimEnabledInNtp()) { [self.toolbarAnimatee setLocationBarHeightToMatchFakeOmnibox]; } break; @@ -438,7 +438,7 @@ } else if (_completion) { _completion(); _completion = nil; - if (ShouldEnlargeNTPFakeboxForMIA()) { + if (IsAimEnabledInNtp()) { // Reset the location bar height back to the default. [self.toolbarAnimatee setLocationBarHeightExpanded]; } @@ -455,7 +455,7 @@ [self.toolbarAnimatee showCancelButton]; switch (_trigger) { case OmniboxFocusTrigger::kPinnedFakebox: - if (ShouldEnlargeNTPFakeboxForMIA()) { + if (IsAimEnabledInNtp()) { [self.toolbarAnimatee setLocationBarHeightExpanded]; } break; @@ -470,8 +470,7 @@ // Visually contracts the location bar for defocus. - (void)contraction { [self.toolbarAnimatee contractLocationBar]; - if (_trigger == OmniboxFocusTrigger::kPinnedFakebox && - ShouldEnlargeNTPFakeboxForMIA()) { + if (_trigger == OmniboxFocusTrigger::kPinnedFakebox && IsAimEnabledInNtp()) { [self.toolbarAnimatee setLocationBarHeightToMatchFakeOmnibox]; } }
diff --git a/ios/chrome/browser/orchestrator/ui_bundled/omnibox_focus_orchestrator_parity.mm b/ios/chrome/browser/orchestrator/ui_bundled/omnibox_focus_orchestrator_parity.mm index 8bec15f99..b5980246 100644 --- a/ios/chrome/browser/orchestrator/ui_bundled/omnibox_focus_orchestrator_parity.mm +++ b/ios/chrome/browser/orchestrator/ui_bundled/omnibox_focus_orchestrator_parity.mm
@@ -320,14 +320,14 @@ // Use UIView animateWithDuration instead of UIViewPropertyAnimator to // avoid UIKit bug. See https://crbug.com/856155. self.inProgressAnimationCount += 1; - if (ShouldEnlargeNTPFakeboxForMIA()) { + if (IsAimEnabledInNtp()) { // Set the location bar height to the default. [self.toolbarAnimatee setLocationBarHeightExpanded]; } [self.toolbarAnimatee setToolbarFaded:NO]; switch (_trigger) { case OmniboxFocusTrigger::kPinnedFakebox: - if (ShouldEnlargeNTPFakeboxForMIA()) { + if (IsAimEnabledInNtp()) { [self.toolbarAnimatee setLocationBarHeightToMatchFakeOmnibox]; } break; @@ -449,7 +449,7 @@ } else if (_completion) { _completion(); _completion = nil; - if (ShouldEnlargeNTPFakeboxForMIA()) { + if (IsAimEnabledInNtp()) { // Reset the location bar height back to the default. [self.toolbarAnimatee setLocationBarHeightExpanded]; } @@ -466,7 +466,7 @@ [self.toolbarAnimatee showCancelButton]; switch (_trigger) { case OmniboxFocusTrigger::kPinnedFakebox: - if (ShouldEnlargeNTPFakeboxForMIA()) { + if (IsAimEnabledInNtp()) { [self.toolbarAnimatee setLocationBarHeightExpanded]; } break; @@ -481,8 +481,7 @@ // Visually contracts the location bar for defocus. - (void)contraction { [self.toolbarAnimatee contractLocationBar]; - if (_trigger == OmniboxFocusTrigger::kPinnedFakebox && - ShouldEnlargeNTPFakeboxForMIA()) { + if (_trigger == OmniboxFocusTrigger::kPinnedFakebox && IsAimEnabledInNtp()) { [self.toolbarAnimatee setLocationBarHeightToMatchFakeOmnibox]; } }
diff --git a/ios/chrome/browser/policy/model/configuration_policy_handler_list_factory.mm b/ios/chrome/browser/policy/model/configuration_policy_handler_list_factory.mm index 0f93c39..cff056f 100644 --- a/ios/chrome/browser/policy/model/configuration_policy_handler_list_factory.mm +++ b/ios/chrome/browser/policy/model/configuration_policy_handler_list_factory.mm
@@ -156,6 +156,9 @@ { policy::key::kTabCompareSettings, optimization_guide::prefs::kProductSpecificationsEnterprisePolicyAllowed, base::Value::Type::INTEGER}, + { policy::key::kAutofillPredictionSettings, + optimization_guide::prefs::kAutofillPredictionImprovementsEnterprisePolicyAllowed, + base::Value::Type::INTEGER }, { policy::key::kDownloadRestrictions, policy::policy_prefs::kDownloadRestrictions, base::Value::Type::INTEGER }, @@ -281,6 +284,10 @@ contextual_search::kSearchContentSharingSettings, policy::GenAiDefaultSettingsPolicyHandler::PolicyValueToPrefMap( {{0, 0}, {1, 0}, {2, 1}})); + gen_ai_default_policies.emplace_back( + policy::key::kAutofillPredictionSettings, + optimization_guide::prefs:: + kAutofillPredictionImprovementsEnterprisePolicyAllowed); handlers->AddHandler( std::make_unique<policy::GenAiDefaultSettingsPolicyHandler>( std::move(gen_ai_default_policies)));
diff --git a/ios/chrome/browser/profile/model/BUILD.gn b/ios/chrome/browser/profile/model/BUILD.gn index d9392c95..a33beda 100644 --- a/ios/chrome/browser/profile/model/BUILD.gn +++ b/ios/chrome/browser/profile/model/BUILD.gn
@@ -134,6 +134,7 @@ deps = [ "//components/optimization_guide:machine_learning_tflite_buildflags", + "//ios/chrome/browser/account_settings/model", "//ios/chrome/browser/affiliations/model", "//ios/chrome/browser/aim/model:aim_availability", "//ios/chrome/browser/app_store_bundle/model:app_store_bundle_service_factory",
diff --git a/ios/chrome/browser/profile/model/DEPS b/ios/chrome/browser/profile/model/DEPS index dbc7fb97..2f324f7 100644 --- a/ios/chrome/browser/profile/model/DEPS +++ b/ios/chrome/browser/profile/model/DEPS
@@ -14,6 +14,7 @@ specific_include_rules = { 'keyed_service_factories.mm': [ + "+ios/chrome/browser/account_settings/model", "+ios/chrome/browser/affiliations/model", "+ios/chrome/browser/app_store_bundle/model", "+ios/chrome/browser/autocomplete/model",
diff --git a/ios/chrome/browser/profile/model/keyed_service_factories.mm b/ios/chrome/browser/profile/model/keyed_service_factories.mm index fff9a64..d9f68b8 100644 --- a/ios/chrome/browser/profile/model/keyed_service_factories.mm +++ b/ios/chrome/browser/profile/model/keyed_service_factories.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/profile/model/keyed_service_factories.h" #import "components/optimization_guide/machine_learning_tflite_buildflags.h" +#import "ios/chrome/browser/account_settings/model/ios_account_setting_service_factory.h" #import "ios/chrome/browser/affiliations/model/ios_chrome_affiliation_service_factory.h" #import "ios/chrome/browser/aim/model/ios_chrome_aim_eligibility_service_factory.h" #import "ios/chrome/browser/app_store_bundle/model/app_store_bundle_service_factory.h" @@ -20,7 +21,6 @@ #import "ios/chrome/browser/autofill/model/autocomplete_history_manager_factory.h" #import "ios/chrome/browser/autofill/model/autofill_image_fetcher_factory.h" #import "ios/chrome/browser/autofill/model/autofill_log_router_factory.h" -#import "ios/chrome/browser/autofill/model/ios_account_setting_service_factory.h" #import "ios/chrome/browser/autofill/model/ios_autofill_ai_model_cache_factory.h" #import "ios/chrome/browser/autofill/model/ios_autofill_ai_model_executor_factory.h" #import "ios/chrome/browser/autofill/model/ios_autofill_entity_data_manager_factory.h"
diff --git a/ios/chrome/browser/settings/clear_browsing_data/quick_delete_other_data/ui/quick_delete_other_data_view_controller.mm b/ios/chrome/browser/settings/clear_browsing_data/quick_delete_other_data/ui/quick_delete_other_data_view_controller.mm index b61070f..a035285 100644 --- a/ios/chrome/browser/settings/clear_browsing_data/quick_delete_other_data/ui/quick_delete_other_data_view_controller.mm +++ b/ios/chrome/browser/settings/clear_browsing_data/quick_delete_other_data/ui/quick_delete_other_data_view_controller.mm
@@ -152,7 +152,6 @@ [[NSDiffableDataSourceSnapshot alloc] init]; [snapshot appendSectionsWithIdentifiers:@[ @(kPasswordsAndPasskeysSection), @(kGoogleAccountDataSection), - @(kFooterSection) ]]; [snapshot appendItemsWithIdentifiers:@[ @(kPasswordsAndPasskeysIdentifier) ] intoSectionWithIdentifier:@(kPasswordsAndPasskeysSection)]; @@ -208,30 +207,25 @@ viewForFooterInSection:(NSInteger)section { SectionIdentifier sectionIdentifier = static_cast<SectionIdentifier>( [_dataSource sectionIdentifierForIndex:section].integerValue); - switch (sectionIdentifier) { - case kFooterSection: { - TableViewTextHeaderFooterView* footer = - DequeueTableViewHeaderFooter<TableViewTextHeaderFooterView>( - tableView); - footer.accessibilityIdentifier = kQuickDeleteOtherDataFooterIdentifier; - [footer setSubtitle:l10n_util::GetNSString( - IDS_SETTINGS_OTHER_DATA_DESCRIPTION) - withColor:[UIColor colorNamed:kTextSecondaryColor]]; - return footer; - } - case kPasswordsAndPasskeysSection: - case kGoogleAccountDataSection: - // These sections don't have a footer. - return nil; + + if (![self shouldShowFooterInSection:sectionIdentifier]) { + return nil; } - NOTREACHED(); + + TableViewTextHeaderFooterView* footer = + DequeueTableViewHeaderFooter<TableViewTextHeaderFooterView>(tableView); + footer.accessibilityIdentifier = kQuickDeleteOtherDataFooterIdentifier; + [footer + setSubtitle:l10n_util::GetNSString(IDS_SETTINGS_OTHER_DATA_DESCRIPTION) + withColor:[UIColor colorNamed:kTextSecondaryColor]]; + return footer; } - (CGFloat)tableView:(UITableView*)tableView heightForFooterInSection:(NSInteger)section { SectionIdentifier sectionIdentifier = static_cast<SectionIdentifier>( [_dataSource sectionIdentifierForIndex:section].integerValue); - if (sectionIdentifier == kFooterSection) { + if ([self shouldShowFooterInSection:sectionIdentifier]) { return UITableViewAutomaticDimension; } return kSectionFooterHeight; @@ -287,6 +281,11 @@ [self.sceneHandler closePresentedViewsAndOpenURL:command]; } +// Returns if the Google account data section has visible items. +- (BOOL)googleAccountDataSectionHasItems { + return _shouldShowSearchHistoryCell || _shouldShowMyActivityCell; +} + // Sets the accessory type of the cell. - (void)setAccessoryTypeForCell:(UITableViewCell*)cell itemIdentifier:(ItemIdentifier)itemIdentifier { @@ -313,6 +312,21 @@ NOTREACHED(); } +// Tells if the current section should show a footer. +- (BOOL)shouldShowFooterInSection:(SectionIdentifier)sectionIdentifier { + BOOL googleAccountDataSectionHasItems = + [self googleAccountDataSectionHasItems]; + switch (sectionIdentifier) { + case kPasswordsAndPasskeysSection: + return !googleAccountDataSectionHasItems; + case kGoogleAccountDataSection: + return googleAccountDataSectionHasItems; + case kFooterSection: + return NO; + } + NOTREACHED(); +} + // Creates a cell for the table view. - (UITableViewCell*)createCellWithTitle:(NSString*)title subtitle:(NSString*)subtitle
diff --git a/ios/chrome/browser/settings/clear_browsing_data/ui/quick_delete_view_controller.mm b/ios/chrome/browser/settings/clear_browsing_data/ui/quick_delete_view_controller.mm index fd2c738..a980472 100644 --- a/ios/chrome/browser/settings/clear_browsing_data/ui/quick_delete_view_controller.mm +++ b/ios/chrome/browser/settings/clear_browsing_data/ui/quick_delete_view_controller.mm
@@ -50,11 +50,7 @@ constexpr CGFloat kTrashIconContainerViewCornerRadius = 15; // Trash icon size that sits inside the entire view. -constexpr CGFloat kOldTrashIconSize = 32; - -// New trash icon size that sits inside the entire view when the feature flag -// `kPasswordRemovalFromDeleteBrowsingData` is enabled. -constexpr CGFloat kTrashIconSize = 24; +constexpr CGFloat kTrashIconSize = 32; // Top padding for the trash icon view. constexpr CGFloat kTrashIconContainerViewTopPadding = 33; @@ -84,12 +80,6 @@ ItemIdentifierBrowsingData, }; -// Returns the Trash icon size. -CGFloat TrashIconSize() { - return IsPasswordRemovalFromDeleteBrowsingDataEnabled() ? kTrashIconSize - : kOldTrashIconSize; -} - } // namespace @interface QuickDeleteViewController () < @@ -675,7 +665,7 @@ // Trash icon that inside the container with the red background. UIImageView* icon = [[UIImageView alloc] initWithImage:DefaultSymbolTemplateWithPointSize( - kTrashSymbol, TrashIconSize())]; + kTrashSymbol, kTrashIconSize)]; icon.clipsToBounds = YES; icon.translatesAutoresizingMaskIntoConstraints = NO; icon.tintColor = [UIColor colorNamed:kRedColor];
diff --git a/ios/chrome/browser/shared/public/features/features.h b/ios/chrome/browser/shared/public/features/features.h index 8ccde09..e9a7d6d6 100644 --- a/ios/chrome/browser/shared/public/features/features.h +++ b/ios/chrome/browser/shared/public/features/features.h
@@ -159,20 +159,6 @@ // Feature flag to check headers for lens searches. BASE_DECLARE_FEATURE(kLensSearchHeadersCheckEnabled); -// Variations of MIA NTP entrypoint. -extern const char kNTPMIAEntrypointParam[]; -extern const char kNTPMIAEntrypointParamOmniboxContainedSingleButton[]; -extern const char kNTPMIAEntrypointParamOmniboxContainedInline[]; -extern const char kNTPMIAEntrypointParamOmniboxContainedEnlargedFakebox[]; -extern const char kNTPMIAEntrypointParamEnlargedFakeboxNoIncognito[]; -extern const char kNTPMIAEntrypointParamAIMInQuickActions[]; - -// Feature flag to change the MIA entrypoint in NTP. Applies to en-US locales -// only. -BASE_DECLARE_FEATURE(kNTPMIAEntrypoint); -// Like above, but applies regardless of client's locale. -BASE_DECLARE_FEATURE(kNTPMIAEntrypointAllLocales); - // Used to gate the immersive SRP in the Composebox. BASE_DECLARE_FEATURE(kComposeboxImmersiveSRP); @@ -996,4 +982,10 @@ // Whether the grid mediator snapshot update batch guard is enabled. bool IsGridMediatorSnapshotUpdateBatchGuardEnabled(); +// Enables the AssistantSidePanel feature. +BASE_DECLARE_FEATURE(kAssistantSidePanel); + +// Returns true if the AssistantSidePanel feature is enabled. +bool IsAssistantSidePanelEnabled(); + #endif // IOS_CHROME_BROWSER_SHARED_PUBLIC_FEATURES_FEATURES_H_
diff --git a/ios/chrome/browser/shared/public/features/features.mm b/ios/chrome/browser/shared/public/features/features.mm index a87d9f9b..a77f6dcd 100644 --- a/ios/chrome/browser/shared/public/features/features.mm +++ b/ios/chrome/browser/shared/public/features/features.mm
@@ -91,27 +91,6 @@ BASE_FEATURE(kLensSearchHeadersCheckEnabled, base::FEATURE_ENABLED_BY_DEFAULT); -// Variations of MIA NTP entrypoint. -const char kNTPMIAEntrypointParam[] = "kNTPMIAEntrypointParam"; -const char kNTPMIAEntrypointParamOmniboxContainedSingleButton[] = - "kNTPMIAEntrypointParamOmniboxContainedSingleButton"; -const char kNTPMIAEntrypointParamOmniboxContainedInline[] = - "kNTPMIAEntrypointParamOmniboxContainedInline"; -const char kNTPMIAEntrypointParamOmniboxContainedEnlargedFakebox[] = - "kNTPMIAEntrypointParamOmniboxContainedEnlargedFakebox"; -const char kNTPMIAEntrypointParamEnlargedFakeboxNoIncognito[] = - "kNTPMIAEntrypointParamEnlargedFakeboxNoIncognito"; -const char kNTPMIAEntrypointParamAIMInQuickActions[] = - "kNTPMIAEntrypointParamAIMInQuickActions"; - -// Feature flag to change the MIA entrypoint in NTP. -BASE_FEATURE(kNTPMIAEntrypoint, - "kNTPMIAEntrypoint", - base::FEATURE_ENABLED_BY_DEFAULT); -BASE_FEATURE(kNTPMIAEntrypointAllLocales, - "kNTPMIAEntrypointAllLocales", - base::FEATURE_DISABLED_BY_DEFAULT); - // Used to gate the immersive SRP in the Composebox. BASE_FEATURE(kComposeboxImmersiveSRP, base::FEATURE_DISABLED_BY_DEFAULT); @@ -1189,3 +1168,9 @@ bool IsGridMediatorSnapshotUpdateBatchGuardEnabled() { return base::FeatureList::IsEnabled(kGridMediatorSnapshotUpdateBatchGuard); } + +BASE_FEATURE(kAssistantSidePanel, base::FEATURE_DISABLED_BY_DEFAULT); + +bool IsAssistantSidePanelEnabled() { + return base::FeatureList::IsEnabled(kAssistantSidePanel); +}
diff --git a/ios/chrome/browser/shared/public/features/system_flags.h b/ios/chrome/browser/shared/public/features/system_flags.h index 217dbbd..6e6f1d5 100644 --- a/ios/chrome/browser/shared/public/features/system_flags.h +++ b/ios/chrome/browser/shared/public/features/system_flags.h
@@ -176,6 +176,10 @@ // there is no alternative URL specified. NSString* GetLensResultPanelGwsURL(); +// Gets GWS URL base used to generate Cobrowse URLs. Returns nil if there is no +// alternative URL specified. +NSString* GetCobrowseGwsURL(); + // Returns true if Composebox AIM eligibility should be disabled. bool ShouldForceDisableComposeboxAIM();
diff --git a/ios/chrome/browser/shared/public/features/system_flags.mm b/ios/chrome/browser/shared/public/features/system_flags.mm index eb4404c..cfa547f0 100644 --- a/ios/chrome/browser/shared/public/features/system_flags.mm +++ b/ios/chrome/browser/shared/public/features/system_flags.mm
@@ -67,6 +67,7 @@ NSString* const kInactiveTabsTestMode = @"InactiveTabsTestMode"; NSString* const kAsyncStartupOverrideResponse = @"AsyncStartupOverrideResponse"; NSString* const kLensResultPanelGwsURL = @"LensResultPanelGwsURL"; +NSString* const kCobrowseGwsURL = @"CobrowseGwsURL"; NSString* const kForceDisableAIMEligibility = @"ForceDisableAIMEligibility"; NSString* const kForceDisableCreateImagesEligibility = @"ForceDisableCreateImagesEligibility"; @@ -368,6 +369,10 @@ stringForKey:kLensResultPanelGwsURL]; } +NSString* GetCobrowseGwsURL() { + return [[NSUserDefaults standardUserDefaults] stringForKey:kCobrowseGwsURL]; +} + bool ShouldForceDisableComposeboxAIM() { return [[NSUserDefaults standardUserDefaults] boolForKey:kForceDisableAIMEligibility];
diff --git a/ios/chrome/browser/signin/model/signin_profile_info_updater_unittest.mm b/ios/chrome/browser/signin/model/signin_profile_info_updater_unittest.mm index 91b14101..f587a9d1 100644 --- a/ios/chrome/browser/signin/model/signin_profile_info_updater_unittest.mm +++ b/ios/chrome/browser/signin/model/signin_profile_info_updater_unittest.mm
@@ -104,7 +104,8 @@ // Set auth error. identity_test_env()->UpdatePersistentErrorOfRefreshTokenForAccount( account_info.account_id, - GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS)); + GoogleServiceAuthError::FromInvalidGaiaCredentialsReason( + GoogleServiceAuthError::InvalidGaiaCredentialsReason::UNKNOWN)); EXPECT_TRUE(GetAttributesForProfile().HasAuthenticationError());
diff --git a/ios/chrome/test/data/policy/policy_test_bundle_data.filelist b/ios/chrome/test/data/policy/policy_test_bundle_data.filelist index 163d3038..f7a3510 100644 --- a/ios/chrome/test/data/policy/policy_test_bundle_data.filelist +++ b/ios/chrome/test/data/policy/policy_test_bundle_data.filelist
@@ -10,6 +10,7 @@ //ios/chrome/test/data/policy/pref_mapping/AutoSelectCertificateForUrls.json //ios/chrome/test/data/policy/pref_mapping/AutofillAddressEnabled.json //ios/chrome/test/data/policy/pref_mapping/AutofillCreditCardEnabled.json +//ios/chrome/test/data/policy/pref_mapping/AutofillPredictionSettings.json //ios/chrome/test/data/policy/pref_mapping/BrowserSignin.json //ios/chrome/test/data/policy/pref_mapping/BrowserThemeColor.json //ios/chrome/test/data/policy/pref_mapping/ChromeDataRegionSetting.json
diff --git a/ios/chrome/test/data/policy/pref_mapping/AutofillPredictionSettings.json b/ios/chrome/test/data/policy/pref_mapping/AutofillPredictionSettings.json new file mode 100644 index 0000000..ff15593 --- /dev/null +++ b/ios/chrome/test/data/policy/pref_mapping/AutofillPredictionSettings.json
@@ -0,0 +1,17 @@ +[ + { + "os": [ + "ios" + ], + "simple_policy_pref_mapping_test": { + "pref_name": "optimization_guide.model_execution.autofill_prediction_improvements_enterprise_policy_allowed", + "default_value": 0, + "default_for_enterprise_users": 1, + "values_to_test": [ + 0, + 1, + 2 + ] + } + } +]
diff --git a/ios/web/js_messaging/web_frame_impl.mm b/ios/web/js_messaging/web_frame_impl.mm index 177c507..2f33b18a 100644 --- a/ios/web/js_messaging/web_frame_impl.mm +++ b/ios/web/js_messaging/web_frame_impl.mm
@@ -99,6 +99,17 @@ << "JavaScript error occurred with kAssertOnJavaScriptErrors enabled."; } + // Ignore WKErrorJavaScriptResultTypeIsUnsupported error due to the WebView + // being released while a JavaScript function is executing. + bool isTypeUnsupportedResultError = + [error.domain isEqualToString:WKErrorDomain] && + error.code == WKErrorJavaScriptResultTypeIsUnsupported; + + if (!web_state && isTypeUnsupportedResultError) { + UMA_HISTOGRAM_BOOLEAN("IOS.JavaScript.InterestingScriptError", false); + return; + } + // Do not log invalid target frame errors. This error means that the frame is // no longer valid. This is an expected failure state as native code only has // an outdated view of the web frames (updated asyncronously via JS messages @@ -168,12 +179,11 @@ bool is_main_frame, id value, NSError* error) { - if (error) { - LogScriptResultError(web_state, api, script, security_origin, is_main_frame, - error); - } - if (web_frame) { + if (error) { + LogScriptResultError(web_state, api, script, security_origin, + is_main_frame, error); + } web_frame->OnJSResultReceivedForMessageWithId(message_id, value); } }
diff --git a/ios_internal b/ios_internal index 312ccd4..ef823a5 160000 --- a/ios_internal +++ b/ios_internal
@@ -1 +1 @@ -Subproject commit 312ccd459040e4a89d019f85830d1d2528245fd8 +Subproject commit ef823a51a66f69c08e10e7d793e0463a694c23a2
diff --git a/media/audio/android/aaudio_stream_wrapper.cc b/media/audio/android/aaudio_stream_wrapper.cc index bd32940..f10bc63 100644 --- a/media/audio/android/aaudio_stream_wrapper.cc +++ b/media/audio/android/aaudio_stream_wrapper.cc
@@ -204,6 +204,10 @@ AAUDIO_CHANNEL_BACK_CENTER, AAUDIO_CHANNEL_SIDE_LEFT, AAUDIO_CHANNEL_SIDE_RIGHT, + AAUDIO_CHANNEL_TOP_FRONT_LEFT, + AAUDIO_CHANNEL_TOP_FRONT_RIGHT, + AAUDIO_CHANNEL_TOP_BACK_LEFT, + AAUDIO_CHANNEL_TOP_BACK_RIGHT, }); REQUIRES_ANDROID_API(AAUDIO_CHANNEL_MASK_MIN_API) @@ -243,6 +247,17 @@ return AAUDIO_CHANNEL_5POINT1; } + if (layout == CHANNEL_LAYOUT_5_1_4) { + return AAUDIO_CHANNEL_5POINT1POINT4; + } + + if (layout == CHANNEL_LAYOUT_7_1_4) { + return AAUDIO_CHANNEL_7POINT1POINT4; + } + + // TODO(crbug.com/474106765): We are in the process of natively + // supporting 5.1.4 and 7.1.4. Leave these for now as edge cases, but + // eventually this should be removed in favor of the native enums. if (layout == CHANNEL_LAYOUT_DISCRETE) { switch (channels) { case 10:
diff --git a/media/audio/cras/cras_input.cc b/media/audio/cras/cras_input.cc index 500ccf8d..b7d27ae 100644 --- a/media/audio/cras/cras_input.cc +++ b/media/audio/cras/cras_input.cc
@@ -268,9 +268,14 @@ // Channel map to CRAS_CHANNEL, values in the same order of // corresponding source in Chromium defined Channels. + static constexpr int kUnsupportedChannel = -4; static const int kChannelMap[] = { - CRAS_CH_FL, CRAS_CH_FR, CRAS_CH_FC, CRAS_CH_LFE, CRAS_CH_RL, CRAS_CH_RR, - CRAS_CH_FLC, CRAS_CH_FRC, CRAS_CH_RC, CRAS_CH_SL, CRAS_CH_SR}; + CRAS_CH_FL, CRAS_CH_FR, CRAS_CH_FC, CRAS_CH_LFE, CRAS_CH_RL, CRAS_CH_RR, + CRAS_CH_FLC, CRAS_CH_FRC, CRAS_CH_RC, CRAS_CH_SL, CRAS_CH_SR, + // CRAS doesn't currently define explicit mappings for x.y.4 height + // channels. + kUnsupportedChannel, kUnsupportedChannel, kUnsupportedChannel, + kUnsupportedChannel}; static_assert(std::size(kChannelMap) == CHANNELS_MAX + 1, "kChannelMap array size should match"); @@ -327,8 +332,10 @@ // Converts to CRAS defined channels. ChannelOrder will return -1 // for channels that are not present in params_.channel_layout(). for (size_t i = 0; i < std::size(kChannelMap); ++i) { - UNSAFE_TODO(layout[kChannelMap[i]]) = - ChannelOrder(params_.channel_layout(), static_cast<Channels>(i)); + if (kChannelMap[i] != kUnsupportedChannel) { + UNSAFE_TODO(layout[kChannelMap[i]]) = + ChannelOrder(params_.channel_layout(), static_cast<Channels>(i)); + } } rc = libcras_stream_params_set_channel_layout(stream_params, CRAS_CH_MAX,
diff --git a/media/audio/cras/cras_unified.cc b/media/audio/cras/cras_unified.cc index 26c8595..f6fc27e 100644 --- a/media/audio/cras/cras_unified.cc +++ b/media/audio/cras/cras_unified.cc
@@ -193,9 +193,16 @@ // Channel map to CRAS_CHANNEL, values in the same order of // corresponding source in Chromium defined Channels. + static constexpr int kUnsupportedChannel = -4; static const int kChannelMap[] = { - CRAS_CH_FL, CRAS_CH_FR, CRAS_CH_FC, CRAS_CH_LFE, CRAS_CH_RL, CRAS_CH_RR, - CRAS_CH_FLC, CRAS_CH_FRC, CRAS_CH_RC, CRAS_CH_SL, CRAS_CH_SR}; + CRAS_CH_FL, CRAS_CH_FR, CRAS_CH_FC, CRAS_CH_LFE, CRAS_CH_RL, CRAS_CH_RR, + CRAS_CH_FLC, CRAS_CH_FRC, CRAS_CH_RC, CRAS_CH_SL, CRAS_CH_SR, + // CRAS doesn't currently define explicit mappings for x.y.4 height + // channels. + kUnsupportedChannel, kUnsupportedChannel, kUnsupportedChannel, + kUnsupportedChannel}; + static_assert(std::size(kChannelMap) == CHANNELS_MAX + 1, + "kChannelMap array size should match"); source_callback_ = callback; @@ -237,8 +244,10 @@ // Converts to CRAS defined channels. ChannelOrder will return -1 // for channels that does not present in params_.channel_layout(). for (size_t i = 0; i < std::size(kChannelMap); ++i) { - layout.at(kChannelMap[i]) = - ChannelOrder(params_.channel_layout(), static_cast<Channels>(i)); + if (kChannelMap[i] != kUnsupportedChannel) { + layout.at(kChannelMap[i]) = + ChannelOrder(params_.channel_layout(), static_cast<Channels>(i)); + } } rc = libcras_stream_params_set_channel_layout(stream_params, CRAS_CH_MAX,
diff --git a/media/base/channel_layout.cc b/media/base/channel_layout.cc index e77d2c3..e6aea4c 100644 --- a/media/base/channel_layout.cc +++ b/media/base/channel_layout.cc
@@ -26,121 +26,131 @@ // kChannelOrderings[CHANNEL_LAYOUT_5_1][SIDE_LEFT] = 4; constexpr std::array<std::array<int, CHANNELS_MAX + 1>, CHANNEL_LAYOUT_MAX + 1> kChannelOrderings = {{ - // FL | FR | FC | LFE | BL | BR | FLofC | FRofC | BC | SL | SR + // FL | FR | FC | LFE | BL | BR | FLofC | FRofC | BC | SL | SR | TFL | + // TFR | TBL | TBR // CHANNEL_LAYOUT_NONE - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // CHANNEL_LAYOUT_UNSUPPORTED - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // CHANNEL_LAYOUT_MONO - {-1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1}, + {-1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // CHANNEL_LAYOUT_STEREO - {0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // CHANNEL_LAYOUT_2_1 - {0, 1, -1, -1, -1, -1, -1, -1, 2, -1, -1}, + {0, 1, -1, -1, -1, -1, -1, -1, 2, -1, -1, -1, -1, -1, -1}, // CHANNEL_LAYOUT_SURROUND - {0, 1, 2, -1, -1, -1, -1, -1, -1, -1, -1}, + {0, 1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // CHANNEL_LAYOUT_4_0 - {0, 1, 2, -1, -1, -1, -1, -1, 3, -1, -1}, + {0, 1, 2, -1, -1, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1}, // CHANNEL_LAYOUT_2_2 - {0, 1, -1, -1, -1, -1, -1, -1, -1, 2, 3}, + {0, 1, -1, -1, -1, -1, -1, -1, -1, 2, 3, -1, -1, -1, -1}, // CHANNEL_LAYOUT_QUAD - {0, 1, -1, -1, 2, 3, -1, -1, -1, -1, -1}, + {0, 1, -1, -1, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // CHANNEL_LAYOUT_5_0 - {0, 1, 2, -1, -1, -1, -1, -1, -1, 3, 4}, + {0, 1, 2, -1, -1, -1, -1, -1, -1, 3, 4, -1, -1, -1, -1}, // CHANNEL_LAYOUT_5_1 - {0, 1, 2, 3, -1, -1, -1, -1, -1, 4, 5}, + {0, 1, 2, 3, -1, -1, -1, -1, -1, 4, 5, -1, -1, -1, -1}, - // FL | FR | FC | LFE | BL | BR | FLofC | FRofC | BC | SL | SR + // FL | FR | FC | LFE | BL | BR | FLofC | FRofC | BC | SL | SR | TFL | + // TFR | TBL | TBR // CHANNEL_LAYOUT_5_0_BACK - {0, 1, 2, -1, 3, 4, -1, -1, -1, -1, -1}, + {0, 1, 2, -1, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // CHANNEL_LAYOUT_5_1_BACK - {0, 1, 2, 3, 4, 5, -1, -1, -1, -1, -1}, + {0, 1, 2, 3, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // CHANNEL_LAYOUT_7_0 - {0, 1, 2, -1, 3, 4, -1, -1, -1, 5, 6}, + {0, 1, 2, -1, 3, 4, -1, -1, -1, 5, 6, -1, -1, -1, -1}, // CHANNEL_LAYOUT_7_1 - {0, 1, 2, 3, 4, 5, -1, -1, -1, 6, 7}, + {0, 1, 2, 3, 4, 5, -1, -1, -1, 6, 7, -1, -1, -1, -1}, // CHANNEL_LAYOUT_7_1_WIDE - {0, 1, 2, 3, -1, -1, 4, 5, -1, 6, 7}, + {0, 1, 2, 3, -1, -1, 4, 5, -1, 6, 7, -1, -1, -1, -1}, // CHANNEL_LAYOUT_STEREO_DOWNMIX - {0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // CHANNEL_LAYOUT_2POINT1 - {0, 1, -1, 2, -1, -1, -1, -1, -1, -1, -1}, + {0, 1, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // CHANNEL_LAYOUT_3_1 - {0, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1}, + {0, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // CHANNEL_LAYOUT_4_1 - {0, 1, 2, 3, -1, -1, -1, -1, 4, -1, -1}, + {0, 1, 2, 3, -1, -1, -1, -1, 4, -1, -1, -1, -1, -1, -1}, // CHANNEL_LAYOUT_6_0 - {0, 1, 2, -1, -1, -1, -1, -1, 3, 4, 5}, + {0, 1, 2, -1, -1, -1, -1, -1, 3, 4, 5, -1, -1, -1, -1}, // CHANNEL_LAYOUT_6_0_FRONT - {0, 1, -1, -1, -1, -1, 2, 3, -1, 4, 5}, + {0, 1, -1, -1, -1, -1, 2, 3, -1, 4, 5, -1, -1, -1, -1}, - // FL | FR | FC | LFE | BL | BR | FLofC | FRofC | BC | SL | SR + // FL | FR | FC | LFE | BL | BR | FLofC | FRofC | BC | SL | SR | TFL | + // TFR | TBL | TBR // CHANNEL_LAYOUT_HEXAGONAL - {0, 1, 2, -1, 3, 4, -1, -1, 5, -1, -1}, + {0, 1, 2, -1, 3, 4, -1, -1, 5, -1, -1, -1, -1, -1, -1}, // CHANNEL_LAYOUT_6_1 - {0, 1, 2, 3, -1, -1, -1, -1, 4, 5, 6}, + {0, 1, 2, 3, -1, -1, -1, -1, 4, 5, 6, -1, -1, -1, -1}, // CHANNEL_LAYOUT_6_1_BACK - {0, 1, 2, 3, 4, 5, -1, -1, 6, -1, -1}, + {0, 1, 2, 3, 4, 5, -1, -1, 6, -1, -1, -1, -1, -1, -1}, // CHANNEL_LAYOUT_6_1_FRONT - {0, 1, -1, 2, -1, -1, 3, 4, -1, 5, 6}, + {0, 1, -1, 2, -1, -1, 3, 4, -1, 5, 6, -1, -1, -1, -1}, // CHANNEL_LAYOUT_7_0_FRONT - {0, 1, 2, -1, -1, -1, 3, 4, -1, 5, 6}, + {0, 1, 2, -1, -1, -1, 3, 4, -1, 5, 6, -1, -1, -1, -1}, // CHANNEL_LAYOUT_7_1_WIDE_BACK - {0, 1, 2, 3, 4, 5, 6, 7, -1, -1, -1}, + {0, 1, 2, 3, 4, 5, 6, 7, -1, -1, -1, -1, -1, -1, -1}, // CHANNEL_LAYOUT_OCTAGONAL - {0, 1, 2, -1, 3, 4, -1, -1, 5, 6, 7}, + {0, 1, 2, -1, 3, 4, -1, -1, 5, 6, 7, -1, -1, -1, -1}, // CHANNEL_LAYOUT_DISCRETE - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC, deprecated - {0, 1, 2, -1, -1, -1, -1, -1, -1, -1, -1}, + {0, 1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // CHANNEL_LAYOUT_4_1_QUAD_SIDE - {0, 1, -1, 2, -1, -1, -1, -1, -1, 3, 4}, + {0, 1, -1, 2, -1, -1, -1, -1, -1, 3, 4, -1, -1, -1, -1}, // CHANNEL_LAYOUT_BITSTREAM - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, - // FL | FR | FC | LFE | BL | BR | FLofC | FRofC | BC | SL | SR + // FL | FR | FC | LFE | BL | BR | FLofC | FRofC | BC | SL | SR | TFL | + // TFR | TBL | TBR // CHANNEL_LAYOUT_5_1_4, downmixed to six channels (5.1) - {0, 1, 2, 3, -1, -1, -1, -1, -1, 4, 5}, + {0, 1, 2, 3, -1, -1, -1, -1, -1, 4, 5, -1, -1, -1, -1}, // CHANNEL_LAYOUT_1_1 - {-1, -1, 0, 1, -1, -1, -1, -1, -1, -1, -1}, + {-1, -1, 0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // CHANNEL_LAYOUT_3_1_BACK - {0, 1, -1, 2, -1, -1, -1, -1, 3, -1, -1}, + {0, 1, -1, 2, -1, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1}, + + // CHANNEL_LAYOUT_5_1_4 + {0, 1, 2, 3, -1, -1, -1, -1, -1, 4, 5, 6, 7, 8, 9}, + + // CHANNEL_LAYOUT_7_1_4 + {0, 1, 2, 3, 4, 5, -1, -1, -1, 6, 7, 8, 9, 10, 11}, }}; constexpr auto kLayoutToChannels = []() { @@ -331,6 +341,10 @@ return "1.1"; case CHANNEL_LAYOUT_3_1_BACK: return "3.1_BACK"; + case CHANNEL_LAYOUT_5_1_4: + return "5.1.4"; + case CHANNEL_LAYOUT_7_1_4: + return "7.1.4"; } NOTREACHED() << "Invalid channel layout provided: " << layout; }
diff --git a/media/base/channel_layout.h b/media/base/channel_layout.h index 0394039..ed972f4 100644 --- a/media/base/channel_layout.h +++ b/media/base/channel_layout.h
@@ -131,8 +131,16 @@ // Front L, Front R, LFE, Back C CHANNEL_LAYOUT_3_1_BACK = 35, + // Front L, Front R, Front C, LFE, Side L, Side R, + // Top Front L, Top Front R, Top Back L, Top Back R + CHANNEL_LAYOUT_5_1_4 = 36, + + // Front L, Front R, Front C, LFE, Back L, Back R, Side L, Side R, + // Top Front L, Top Front R, Top Back L, Top Back R + CHANNEL_LAYOUT_7_1_4 = 37, + // Max value, must always equal the largest entry ever logged. - CHANNEL_LAYOUT_MAX = CHANNEL_LAYOUT_3_1_BACK + CHANNEL_LAYOUT_MAX = CHANNEL_LAYOUT_7_1_4 }; // The channel order matches the order of the bitmask in the Windows @@ -157,8 +165,12 @@ BACK_CENTER = 8, SIDE_LEFT = 9, SIDE_RIGHT = 10, + TOP_FRONT_LEFT = 11, + TOP_FRONT_RIGHT = 12, + TOP_BACK_LEFT = 13, + TOP_BACK_RIGHT = 14, CHANNELS_MAX = - SIDE_RIGHT, // Must always equal the largest value ever logged. + TOP_BACK_RIGHT, // Must always equal the largest value ever logged. }; // The maximum number of concurrently active channels for all possible layouts.
diff --git a/media/base/channel_mixer_unittest.cc b/media/base/channel_mixer_unittest.cc index fa0587dc..19a4e5f 100644 --- a/media/base/channel_mixer_unittest.cc +++ b/media/base/channel_mixer_unittest.cc
@@ -31,13 +31,20 @@ // DISCRETE, BITSTREAM can't be tested here based on the current approach. // CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC is deprecated. // Stereo down mix should never be the output layout. + // TODO(crbug.com/474106765): 5.1.4 and 7.1.4 are not supported yet. Once + // `kMaxConcurrentChannels` is upgraded to 12, then we can include these + // test cases. if (input_layout == CHANNEL_LAYOUT_BITSTREAM || input_layout == CHANNEL_LAYOUT_DISCRETE || input_layout == CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC || + input_layout == CHANNEL_LAYOUT_5_1_4 || + input_layout == CHANNEL_LAYOUT_7_1_4 || output_layout == CHANNEL_LAYOUT_BITSTREAM || output_layout == CHANNEL_LAYOUT_DISCRETE || output_layout == CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC || - output_layout == CHANNEL_LAYOUT_STEREO_DOWNMIX) { + output_layout == CHANNEL_LAYOUT_STEREO_DOWNMIX || + output_layout == CHANNEL_LAYOUT_5_1_4 || + output_layout == CHANNEL_LAYOUT_7_1_4) { continue; }
diff --git a/media/base/channel_mixing_matrix_unittest.cc b/media/base/channel_mixing_matrix_unittest.cc index 2d2226d..f271fa8 100644 --- a/media/base/channel_mixing_matrix_unittest.cc +++ b/media/base/channel_mixing_matrix_unittest.cc
@@ -25,13 +25,20 @@ // DISCRETE, BITSTREAM can't be tested here based on the current approach. // CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC is deprecated. // Stereo down mix should never be the output layout. + // TODO(crbug.com/474106765): 5.1.4 and 7.1.4 are not supported yet. Once + // `kMaxConcurrentChannels` is upgraded to 12, then we can include these + // test cases. if (input_layout == CHANNEL_LAYOUT_BITSTREAM || input_layout == CHANNEL_LAYOUT_DISCRETE || input_layout == CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC || + input_layout == CHANNEL_LAYOUT_5_1_4 || + input_layout == CHANNEL_LAYOUT_7_1_4 || output_layout == CHANNEL_LAYOUT_BITSTREAM || output_layout == CHANNEL_LAYOUT_DISCRETE || output_layout == CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC || - output_layout == CHANNEL_LAYOUT_STEREO_DOWNMIX) { + output_layout == CHANNEL_LAYOUT_STEREO_DOWNMIX || + output_layout == CHANNEL_LAYOUT_5_1_4 || + output_layout == CHANNEL_LAYOUT_7_1_4) { continue; }
diff --git a/media/base/mac/channel_layout_util_mac.cc b/media/base/mac/channel_layout_util_mac.cc index 63f55bff..473d339e 100644 --- a/media/base/mac/channel_layout_util_mac.cc +++ b/media/base/mac/channel_layout_util_mac.cc
@@ -58,6 +58,18 @@ case kAudioChannelLabel_RightSurround: *output_channel = Channels::SIDE_RIGHT; break; + case kAudioChannelLabel_LeftTopFront: + *output_channel = Channels::TOP_FRONT_LEFT; + break; + case kAudioChannelLabel_RightTopFront: + *output_channel = Channels::TOP_FRONT_RIGHT; + break; + case kAudioChannelLabel_LeftTopRear: + *output_channel = Channels::TOP_BACK_LEFT; + break; + case kAudioChannelLabel_RightTopRear: + *output_channel = Channels::TOP_BACK_RIGHT; + break; default: return false; } @@ -88,6 +100,14 @@ return kAudioChannelLabel_LeftSurround; case Channels::SIDE_RIGHT: return kAudioChannelLabel_RightSurround; + case Channels::TOP_FRONT_LEFT: + return kAudioChannelLabel_LeftTopFront; + case Channels::TOP_FRONT_RIGHT: + return kAudioChannelLabel_RightTopFront; + case Channels::TOP_BACK_LEFT: + return kAudioChannelLabel_LeftTopRear; + case Channels::TOP_BACK_RIGHT: + return kAudioChannelLabel_RightTopRear; } }
diff --git a/media/base/mac/channel_layout_util_mac_unittest.cc b/media/base/mac/channel_layout_util_mac_unittest.cc index 54ee1373..490c925 100644 --- a/media/base/mac/channel_layout_util_mac_unittest.cc +++ b/media/base/mac/channel_layout_util_mac_unittest.cc
@@ -365,6 +365,14 @@ TEST(ChannelLayoutUtilMac, ChannelLayoutConvertBackToChannelLayout) { for (int i = 0; i <= CHANNEL_LAYOUT_MAX; i++) { ChannelLayout input_layout = static_cast<ChannelLayout>(i); + // TODO(crbug.com/474106765): 5.1.4 and 7.1.4 are not supported yet. Once + // `kMaxConcurrentChannels` is upgraded to 12, then we can include these + // test cases. + if (input_layout == CHANNEL_LAYOUT_5_1_4 || + input_layout == CHANNEL_LAYOUT_7_1_4) { + continue; + } + // Skip invalid channel layout. int input_channels = ChannelLayoutToChannelCount(input_layout); if (input_channels == 0) {
diff --git a/media/base/video_frame.cc b/media/base/video_frame.cc index ceca859..f8bb871 100644 --- a/media/base/video_frame.cc +++ b/media/base/video_frame.cc
@@ -383,7 +383,9 @@ << "coded_size (" << coded_size.ToString() << ") does not match shared_image size (" << shared_image->size().ToString() << ")"; - frame->shared_image_release_cb_ = std::move(shared_image_release_cb); + if (shared_image_release_cb) { + frame->SetReleaseMailboxCB(std::move(shared_image_release_cb)); + } return frame; } @@ -463,7 +465,9 @@ DLOG(ERROR) << __func__ << " Couldn't create VideoFrame instance"; return nullptr; } - frame->shared_image_release_cb_ = std::move(shared_image_release_cb); + if (shared_image_release_cb) { + frame->SetReleaseMailboxCB(std::move(shared_image_release_cb)); + } frame->acquire_sync_token_ = sync_token; // Note that we cannot use |shared_image|->MakeUnowned() here since MappableSI @@ -715,7 +719,7 @@ return nullptr; } - frame->shared_image_release_cb_ = ReleaseMailboxCB(); + frame->shared_image_release_cb_ = ReleaseMailboxCBWithLostResource(); frame->dmabuf_fds_ = std::move(dmabuf_fds); DCHECK(frame->HasDmaBufs()); @@ -1428,6 +1432,23 @@ // is not thread safe. This method should only be called by the owner of // |wrapped_frame_| directly. DCHECK(!wrapped_frame_); + // Binds `release_mailbox_cb` and runs it with SyncToken ignoring the bool. + // Returns a OnceCallback<void (const gpu::SyncToken &, bool)> which is then + // stored. + SetReleaseMailboxCB( + base::BindOnce([](ReleaseMailboxCB cb, const gpu::SyncToken& sync_token, + bool lost_resource) { std::move(cb).Run(sync_token); }, + std::move(release_mailbox_cb))); +} + +void VideoFrame::SetReleaseMailboxCB( + ReleaseMailboxCBWithLostResource release_mailbox_cb) { + DCHECK(release_mailbox_cb); + DCHECK(!shared_image_release_cb_); + // We don't relay SetReleaseMailboxCB to |wrapped_frame_| because the method + // is not thread safe. This method should only be called by the owner of + // |wrapped_frame_| directly. + DCHECK(!wrapped_frame_); shared_image_release_cb_ = std::move(release_mailbox_cb); } @@ -1436,6 +1457,14 @@ : !!shared_image_release_cb_; } +void VideoFrame::SetLostSharedImageResource(bool lost_si_resource) { + if (wrapped_frame_) { + wrapped_frame_->SetLostSharedImageResource(lost_si_resource); + return; + } + lost_shared_image_resource_ = lost_si_resource; +} + void VideoFrame::AddDestructionObserver(base::OnceClosure callback) { DCHECK(!callback.is_null()); base::AutoLock lock(done_callbacks_lock_); @@ -1519,9 +1548,9 @@ base::AutoLock locker(release_sync_token_lock_); release_sync_token = release_sync_token_; } - std::move(shared_image_release_cb_).Run(release_sync_token); + std::move(shared_image_release_cb_) + .Run(release_sync_token, lost_shared_image_resource_); } - // Prevents dangling raw ptr, see https://docs.google.com/document/d/156O7kBZqIhe1dUcqTMcN5T-6YEAcg0yNnj5QlnZu9xU/edit?usp=sharing. shm_region_ = nullptr;
diff --git a/media/base/video_frame.h b/media/base/video_frame.h index fa909101..ec0b6c6 100644 --- a/media/base/video_frame.h +++ b/media/base/video_frame.h
@@ -101,6 +101,8 @@ // CB to be called on the mailbox backing this frame when the frame is // destroyed. using ReleaseMailboxCB = base::OnceCallback<void(const gpu::SyncToken&)>; + using ReleaseMailboxCBWithLostResource = + base::OnceCallback<void(const gpu::SyncToken&, bool)>; // Interface representing client operations on a SyncToken, i.e. insert one in // the GPU Command Buffer and wait for it. @@ -652,6 +654,11 @@ // are still the only owner of this VideoFrame. void SetReleaseMailboxCB(ReleaseMailboxCB release_mailbox_cb); + // Overrides the above with ReleaseMailboxCBWithLostResource. The above method + // calls into this one by binding its `release_mailbox_cb` ignoring the lost + // resource bool. + void SetReleaseMailboxCB(ReleaseMailboxCBWithLostResource release_mailbox_cb); + // Tests whether a mailbox release callback is configured. bool HasReleaseMailboxCB() const; @@ -707,6 +714,8 @@ // Returns the number of bits per channel. size_t BitDepth() const; + void SetLostSharedImageResource(bool lost_si_resource); + protected: friend class base::RefCountedThreadSafe<VideoFrame>; virtual ~VideoFrame(); @@ -803,7 +812,12 @@ // Sync token associated with the `shared_image_`. gpu::SyncToken acquire_sync_token_; - ReleaseMailboxCB shared_image_release_cb_; + ReleaseMailboxCBWithLostResource shared_image_release_cb_; + + // Tracks whether the SharedImage within VideoFrame which is transported over + // a TransferableResource to the Display Compositor is lost, and if such a + // VideoFrame can be reused. + bool lost_shared_image_resource_ = false; // Native texture shared image that is only set when the VideoFrame is // created via VideoFrame::WrapSharedImage().
diff --git a/media/base/video_util.cc b/media/base/video_util.cc index 6b3de96..74df5128 100644 --- a/media/base/video_util.cc +++ b/media/base/video_util.cc
@@ -699,6 +699,11 @@ : VideoFrame::CreateFrame( format, txt_frame.coded_size(), txt_frame.visible_rect(), txt_frame.natural_size(), txt_frame.timestamp()); + if (!result) { + DLOG(ERROR) << "Failed to create VideoFrame, coded_size=" + << txt_frame.coded_size().ToString(); + return nullptr; + } result->set_color_space(txt_frame.ColorSpace()); result->metadata().MergeMetadataFrom(txt_frame.metadata()); result->metadata().ClearTextureFrameMetadata();
diff --git a/media/renderers/video_resource_updater.cc b/media/renderers/video_resource_updater.cc index a5330a7..bbe64a0 100644 --- a/media/renderers/video_resource_updater.cc +++ b/media/renderers/video_resource_updater.cc
@@ -345,6 +345,28 @@ gpu::SyncToken sync_token_; }; +void ReturnTexture( + scoped_refptr<VideoFrame> video_frame, + scoped_refptr<viz::RasterContextProvider> raster_context_provider, + const gpu::SyncToken& original_release_token, + const gpu::SyncToken& new_release_token, + bool lost_resource) { + // Note: This method is called for each plane texture in the frame! Which + // means it may end up receiving the same `new_release_token` multiple times. + if (lost_resource) { + video_frame->SetLostSharedImageResource(/*lost_si_resource=*/true); + return; + } + + if (!new_release_token.HasData()) { + return; + } + + ResourceSyncTokenClient client(raster_context_provider->RasterInterface(), + original_release_token, new_release_token); + video_frame->UpdateReleaseSyncToken(&client); +} + } // namespace VideoFrameExternalResource::VideoFrameExternalResource() = default; @@ -844,8 +866,8 @@ external_resource.resource = std::move(transfer_resource); external_resource.release_callback = base::BindOnce( - &VideoResourceUpdater::ReturnTexture, weak_ptr_factory_.GetWeakPtr(), - video_frame, original_release_token); + &ReturnTexture, video_frame, base::WrapRefCounted(context_provider_), + original_release_token); return external_resource; } @@ -1290,27 +1312,6 @@ return ri; } -void VideoResourceUpdater::ReturnTexture( - scoped_refptr<VideoFrame> video_frame, - const gpu::SyncToken& original_release_token, - const gpu::SyncToken& new_release_token, - bool lost_resource) { - // Note: This method is called for each plane texture in the frame! Which - // means it may end up receiving the same `new_release_token` multiple times. - - if (lost_resource) { - return; - } - - if (!new_release_token.HasData()) { - return; - } - - ResourceSyncTokenClient client(RasterInterface(), original_release_token, - new_release_token); - video_frame->UpdateReleaseSyncToken(&client); -} - void VideoResourceUpdater::RecycleResource(uint32_t resource_id, const gpu::SyncToken& sync_token, bool lost_resource) {
diff --git a/media/renderers/video_resource_updater.h b/media/renderers/video_resource_updater.h index 44aae54..d07409fb 100644 --- a/media/renderers/video_resource_updater.h +++ b/media/renderers/video_resource_updater.h
@@ -198,10 +198,6 @@ void RecycleResource(uint32_t resource_id, const gpu::SyncToken& sync_token, bool lost_resource); - void ReturnTexture(scoped_refptr<VideoFrame> video_frame, - const gpu::SyncToken& original_release_token, - const gpu::SyncToken& new_release_token, - bool lost_resource); // base::trace_event::MemoryDumpProvider implementation. bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
diff --git a/media/video/renderable_mappable_shared_image_video_frame_pool.cc b/media/video/renderable_mappable_shared_image_video_frame_pool.cc index 36ed797..6b1abdeb 100644 --- a/media/video/renderable_mappable_shared_image_video_frame_pool.cc +++ b/media/video/renderable_mappable_shared_image_video_frame_pool.cc
@@ -117,7 +117,8 @@ // Callback made when the VideoFrame is destroyed. This callback then either // returns |frame_resources| to |available_frame_resources_| or destroys it. void OnVideoFrameDestroyed(std::unique_ptr<FrameResources> frame_resources, - const gpu::SyncToken& sync_token); + const gpu::SyncToken& sync_token, + bool lost_shared_image_resource); const VideoPixelFormat format_; const std::unique_ptr<RenderableMappableSharedImageVideoFramePool::Context> @@ -345,9 +346,15 @@ void InternalRefCountedPool::OnVideoFrameDestroyed( std::unique_ptr<FrameResources> frame_resources, - const gpu::SyncToken& sync_token) { + const gpu::SyncToken& sync_token, + bool lost_shared_image_resource) { frame_resources->SetSharedImageReleaseSyncToken(sync_token); + // If the SharedImage within FrameResource is lost, we should not reuse it. + if (lost_shared_image_resource) { + return; + } + if (shutting_down_) { return; }
diff --git a/net/base/isolation_info.cc b/net/base/isolation_info.cc index 8e4d624..7a9fc592 100644 --- a/net/base/isolation_info.cc +++ b/net/base/isolation_info.cc
@@ -175,6 +175,14 @@ /*frame_ancestor_relation=*/std::nullopt); } +IsolationInfo IsolationInfo::CreateEmptyWithPartition( + NetworkIsolationPartition network_isolation_partition) { + return IsolationInfo(RequestType::kOther, /*top_frame_origin=*/std::nullopt, + /*frame_origin=*/std::nullopt, SiteForCookies(), + /*nonce=*/std::nullopt, network_isolation_partition, + /*frame_ancestor_relation=*/std::nullopt); +} + std::optional<IsolationInfo> IsolationInfo::Deserialize( const std::string& serialized) { proto::IsolationInfo proto; @@ -500,7 +508,8 @@ site_for_cookies_(std::move(site_for_cookies)), network_isolation_key_( !this->top_frame_origin() - ? NetworkIsolationKey() + ? NetworkIsolationKey::CreateEmptyWithPartition( + network_isolation_partition) : NetworkIsolationKey(SchemefulSite(*this->top_frame_origin()), SchemefulSite(*this->frame_origin()), std::move(nonce),
diff --git a/net/base/isolation_info.h b/net/base/isolation_info.h index 84787824..d0f143f 100644 --- a/net/base/isolation_info.h +++ b/net/base/isolation_info.h
@@ -190,6 +190,10 @@ static IsolationInfo CreateTransient( std::optional<base::UnguessableToken> nonce); + // Creates an empty IsolationInfo with the provided NetworkIsolationPartition. + static IsolationInfo CreateEmptyWithPartition( + NetworkIsolationPartition network_isolation_partition); + // Creates an IsolationInfo from the serialized contents. Returns a nullopt // if deserialization fails or if data is inconsistent. static std::optional<IsolationInfo> Deserialize(
diff --git a/net/base/isolation_info_unittest.cc b/net/base/isolation_info_unittest.cc index c403ab8..42293d15 100644 --- a/net/base/isolation_info_unittest.cc +++ b/net/base/isolation_info_unittest.cc
@@ -6,6 +6,7 @@ #include <iostream> #include <optional> +#include <set> #include <string_view> #include "base/strings/strcat.h" @@ -560,15 +561,6 @@ const IsolationInfo kPositiveTestCases[] = { IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1, kOrigin2, SiteForCookies::FromOrigin(kOrigin1)), - // Null party context - IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1, - kOrigin2, SiteForCookies::FromOrigin(kOrigin1)), - // Empty party context - IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1, - kOrigin2, SiteForCookies::FromOrigin(kOrigin1)), - // Multiple party context entries. - IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1, - kOrigin2, SiteForCookies::FromOrigin(kOrigin1)), // Without SiteForCookies IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1, kOrigin2, SiteForCookies()), @@ -587,36 +579,86 @@ SiteForCookies::FromOrigin(kOrigin1), /*nonce=*/std::nullopt, NetworkIsolationPartition::kProtectedAudienceSellerWorklet, IsolationInfo::FrameAncestorRelation::kSameOrigin), + // Second non-general NetworkIsolationPartition + IsolationInfo::Create( + IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin1, + SiteForCookies::FromOrigin(kOrigin1), /*nonce=*/std::nullopt, + NetworkIsolationPartition::kFedCmUncredentialedRequests, + IsolationInfo::FrameAncestorRelation::kSameOrigin), // Non-none IsolationInfo::FrameAncestorRelation IsolationInfo::Create(IsolationInfo::RequestType::kOther, kOrigin1, kOrigin1, SiteForCookies::FromOrigin(kOrigin1), /*nonce=*/std::nullopt, NetworkIsolationPartition::kGeneral, IsolationInfo::FrameAncestorRelation::kSameOrigin), + // Second Non-none IsolationInfo::FrameAncestorRelation + IsolationInfo::Create(IsolationInfo::RequestType::kOther, kOrigin1, + kOrigin1, SiteForCookies::FromOrigin(kOrigin1), + /*nonce=*/std::nullopt, + NetworkIsolationPartition::kGeneral, + IsolationInfo::FrameAncestorRelation::kCrossSite), }; + + std::set<std::string> serialized_values; for (const auto& info : kPositiveTestCases) { - auto rt = IsolationInfo::Deserialize(info.Serialize()); + std::string serialized = info.Serialize(); + // Ensure this serialization is unique. + EXPECT_TRUE(serialized_values.insert(serialized).second); + auto rt = IsolationInfo::Deserialize(serialized); ASSERT_TRUE(rt); EXPECT_TRUE(rt->IsEqualForTesting(info)); } - const IsolationInfo kNegativeTestCases[] = { + const IsolationInfo kTransientTestCases[] = { + // Empty with general NetworkIsolationPartition + IsolationInfo(), + // Empty with non-general NetworkIsolationPartition + IsolationInfo::CreateEmptyWithPartition( + NetworkIsolationPartition::kDnsOverHttps), + // Using CreateTransient (no nonce) IsolationInfo::CreateTransient(/*nonce=*/std::nullopt), // With nonce (i.e transient). IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1, kOrigin2, SiteForCookies::FromOrigin(kOrigin1), kNonce1), - // With an opaque frame origin. The opaque frame site will cause it to be - // considered transient and fail to serialize. + // With an opaque frame origin. IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1, url::Origin(), SiteForCookies::FromOrigin(kOrigin1)), }; - for (const auto& info : kNegativeTestCases) { + for (const auto& info : kTransientTestCases) { EXPECT_TRUE(info.Serialize().empty()); } } +TEST_F(IsolationInfoTest, CreateEmptyWithPartition) { + IsolationInfo isolation_info = IsolationInfo::CreateEmptyWithPartition( + NetworkIsolationPartition::kDnsOverHttps); + + EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type()); + EXPECT_FALSE(isolation_info.top_frame_origin().has_value()); + EXPECT_FALSE(isolation_info.frame_origin().has_value()); + EXPECT_TRUE(isolation_info.site_for_cookies().IsNull()); + EXPECT_EQ(NetworkIsolationPartition::kDnsOverHttps, + isolation_info.GetNetworkIsolationPartition()); + EXPECT_FALSE(isolation_info.nonce().has_value()); + EXPECT_FALSE(isolation_info.frame_ancestor_relation().has_value()); + + // Check the NetworkIsolationKey. + EXPECT_TRUE(isolation_info.network_isolation_key().IsEmpty()); + EXPECT_TRUE(isolation_info.network_isolation_key().IsTransient()); + EXPECT_EQ( + NetworkIsolationPartition::kDnsOverHttps, + isolation_info.network_isolation_key().GetNetworkIsolationPartition()); + + // Check the NetworkAnonymizationKey. + EXPECT_TRUE(isolation_info.network_anonymization_key().IsEmpty()); + EXPECT_TRUE(isolation_info.network_anonymization_key().IsTransient()); + EXPECT_EQ( + NetworkIsolationPartition::kDnsOverHttps, + isolation_info.network_anonymization_key().network_isolation_partition()); +} + TEST_F(IsolationInfoTest, DeserializationAcceptsValidNetworkIsolationPartitionOnly) { proto::IsolationInfo info;
diff --git a/net/base/network_anonymization_key.cc b/net/base/network_anonymization_key.cc index 076ef3c..813b69ec 100644 --- a/net/base/network_anonymization_key.cc +++ b/net/base/network_anonymization_key.cc
@@ -10,6 +10,7 @@ #include "base/feature_list.h" #include "base/no_destructor.h" #include "base/numerics/safe_conversions.h" +#include "base/strings/strcat.h" #include "base/types/pass_key.h" #include "base/unguessable_token.h" #include "base/values.h" @@ -32,11 +33,35 @@ // `g_partition_by_default` cannot be changed. constinit std::atomic<bool> g_partition_by_default_locked = false; +std::optional<NetworkIsolationPartition> ValueToNetworkIsolationPartition( + const base::Value& value) { + if (!value.is_int()) { + return std::nullopt; + } + + int partition_int = value.GetInt(); + if (partition_int < 0 || + partition_int > + base::strict_cast<int32_t>(NetworkIsolationPartition::kMaxValue)) { + return std::nullopt; + } + + return static_cast<NetworkIsolationPartition>(partition_int); +} + } // namespace NetworkAnonymizationKey::NetworkAnonymizationKey() : data_(Data::GetEmptyData()) {} +// static +NetworkAnonymizationKey NetworkAnonymizationKey::CreateEmptyWithPartition( + NetworkIsolationPartition network_isolation_partition) { + return NetworkAnonymizationKey( + /*top_frame_site=*/std::nullopt, /*is_cross_site=*/false, + /*nonce=*/std::nullopt, network_isolation_partition); +} + NetworkAnonymizationKey::NetworkAnonymizationKey( const NetworkAnonymizationKey& network_anonymization_key) = default; @@ -89,28 +114,30 @@ } std::string NetworkAnonymizationKey::ToDebugString() const { + std::string partition = + network_isolation_partition() == NetworkIsolationPartition::kGeneral + ? "" + : base::StrCat({" (", + NetworkIsolationPartitionToDebugString( + network_isolation_partition()), + ")"}); + if (IsEmpty()) { - return "null"; + return base::StrCat({"null", partition}); } - std::string str = GetSiteDebugString(GetTopFrameSite()); - str += IsCrossSite() ? " cross_site" : " same_site"; + std::string top_frame_site = GetSiteDebugString(GetTopFrameSite()); + std::string_view is_cross_site = IsCrossSite() ? " cross_site" : " same_site"; // Currently, if the NAK has a nonce it will be marked transient. For debug // purposes we will print the value but if called via // `NetworkAnonymizationKey::ToString` we will have already returned "". - if (GetNonce().has_value()) { - str += " (with nonce " + GetNonce()->ToString() + ")"; - } + std::string nonce = + GetNonce().has_value() + ? base::StrCat({" (with nonce ", GetNonce()->ToString(), ")"}) + : ""; - if (network_isolation_partition() != NetworkIsolationPartition::kGeneral) { - str += - " (" + - NetworkIsolationPartitionToDebugString(network_isolation_partition()) + - ")"; - } - - return str; + return base::StrCat({top_frame_site, is_cross_site, nonce, partition}); } bool NetworkAnonymizationKey::IsEmpty() const { @@ -127,17 +154,25 @@ bool NetworkAnonymizationKey::ToValue(base::Value* out_value) const { if (IsEmpty()) { - *out_value = base::Value(base::Value::Type::LIST); + // Empty kGeneral partition NAKs just use an empty list, while empty NAKs + // for other partitions are represented as single-element lists. + base::ListValue list; + if (network_isolation_partition() != NetworkIsolationPartition::kGeneral) { + list.Append(base::strict_cast<int32_t>(network_isolation_partition())); + } + *out_value = base::Value(std::move(list)); return true; } - if (IsTransient()) + if (IsTransient()) { return false; + } std::optional<std::string> top_frame_value = SerializeSiteWithNonce(*GetTopFrameSite()); - if (!top_frame_value) + if (!top_frame_value) { return false; + } base::ListValue list; list.Append(std::move(top_frame_value).value()); @@ -162,13 +197,25 @@ return true; } + if (list.size() == 1) { + std::optional<NetworkIsolationPartition> network_isolation_partition = + ValueToNetworkIsolationPartition(list[0]); + if (!network_isolation_partition) { + return false; + } + *network_anonymization_key = + NetworkAnonymizationKey::CreateEmptyWithPartition( + *network_isolation_partition); + return true; + } + // Check the format. // While migrating to using NetworkIsolationPartition, continue supporting // values of length 2 for a few months. // TODO(abigailkatcoff): Stop support for lists of length 2 after a few // months. - if (list.size() < 2 || list.size() > 3 || !list[0].is_string() || - !list[1].is_bool()) { + CHECK_GE(list.size(), 2u); + if (list.size() > 3 || !list[0].is_string() || !list[1].is_bool()) { return false; } @@ -185,14 +232,12 @@ NetworkIsolationPartition network_isolation_partition = NetworkIsolationPartition::kGeneral; if (list.size() == 3) { - if (!list[2].is_int() || - list[2].GetInt() > - base::strict_cast<int32_t>(NetworkIsolationPartition::kMaxValue) || - list[2].GetInt() < 0) { + std::optional<NetworkIsolationPartition> parsed_partition = + ValueToNetworkIsolationPartition(list[2]); + if (!parsed_partition) { return false; } - network_isolation_partition = - static_cast<NetworkIsolationPartition>(list[2].GetInt()); + network_isolation_partition = *parsed_partition; } *network_anonymization_key = NetworkAnonymizationKey(
diff --git a/net/base/network_anonymization_key.h b/net/base/network_anonymization_key.h index 03e1c2d..092d62a 100644 --- a/net/base/network_anonymization_key.h +++ b/net/base/network_anonymization_key.h
@@ -66,12 +66,17 @@ // An empty NetworkAnonymizationKey (one where the `top_frame_site` and `nonce` // are both empty) should be used when network state partitioning is disabled // (see `IsPartitioningEnabled()`), or for non-web requests where storage -// partitioning should not apply. +// partitioning should not apply. Note that empty NetworkAnonymizationKeys can +// still have different NetworkIsolationPartition values. class NET_EXPORT NetworkAnonymizationKey { public: // Construct an empty key. NetworkAnonymizationKey(); + // Create an empty NetworkAnonymizationKey with a partition. + static NetworkAnonymizationKey CreateEmptyWithPartition( + NetworkIsolationPartition network_isolation_partition); + NetworkAnonymizationKey( const NetworkAnonymizationKey& network_anonymization_key); NetworkAnonymizationKey(NetworkAnonymizationKey&& network_anonymization_key);
diff --git a/net/base/network_anonymization_key_unittest.cc b/net/base/network_anonymization_key_unittest.cc index 41840a2..c73e1d30 100644 --- a/net/base/network_anonymization_key_unittest.cc +++ b/net/base/network_anonymization_key_unittest.cc
@@ -11,6 +11,7 @@ #include "base/unguessable_token.h" #include "base/values.h" #include "net/base/features.h" +#include "net/base/isolation_info.h" #include "net/base/network_isolation_key.h" #include "net/base/network_isolation_partition.h" #include "net/base/schemeful_site.h" @@ -30,6 +31,18 @@ const base::UnguessableToken kNonce = base::UnguessableToken::Create(); }; +TEST_F(NetworkAnonymizationKeyTest, EmptyKeyProperties) { + NetworkAnonymizationKey empty_key; + EXPECT_TRUE(empty_key.IsEmpty()); + EXPECT_FALSE(empty_key.GetTopFrameSite().has_value()); + EXPECT_FALSE(empty_key.IsCrossSite()); + EXPECT_FALSE(empty_key.GetNonce().has_value()); + EXPECT_EQ(empty_key.network_isolation_partition(), + NetworkIsolationPartition::kGeneral); + EXPECT_EQ(empty_key, NetworkAnonymizationKey::CreateEmptyWithPartition( + NetworkIsolationPartition::kGeneral)); +} + TEST_F(NetworkAnonymizationKeyTest, CreateFromNetworkIsolationKey) { SchemefulSite site_a = SchemefulSite(GURL("http://a.test/")); SchemefulSite site_b = SchemefulSite(GURL("http://b.test/")); @@ -42,6 +55,10 @@ NetworkIsolationKey populated_same_site_nik_network_partition( site_a, site_a, /*nonce=*/std::nullopt, NetworkIsolationPartition::kProtectedAudienceSellerWorklet); + NetworkIsolationKey empty_nik_with_partition = + IsolationInfo::CreateEmptyWithPartition( + NetworkIsolationPartition::kDnsOverHttps) + .network_isolation_key(); NetworkIsolationKey empty_nik; NetworkAnonymizationKey nak_from_same_site_nik = @@ -56,12 +73,20 @@ NetworkAnonymizationKey nak_from_same_site_nik_network_partition = NetworkAnonymizationKey::CreateFromNetworkIsolationKey( populated_same_site_nik_network_partition); + NetworkAnonymizationKey nak_from_empty_nik_with_partition = + NetworkAnonymizationKey::CreateFromNetworkIsolationKey( + empty_nik_with_partition); NetworkAnonymizationKey nak_from_empty_nik = NetworkAnonymizationKey::CreateFromNetworkIsolationKey(empty_nik); // NAKs created when there is no top frame site on the NIK should create an // empty NAK. EXPECT_TRUE(nak_from_empty_nik.IsEmpty()); + EXPECT_FALSE(nak_from_empty_nik.IsCrossSite()); + EXPECT_TRUE(nak_from_empty_nik_with_partition.IsEmpty()); + EXPECT_FALSE(nak_from_empty_nik_with_partition.IsCrossSite()); + EXPECT_EQ(nak_from_empty_nik_with_partition.network_isolation_partition(), + NetworkIsolationPartition::kDnsOverHttps); // Top site should be populated correctly. EXPECT_EQ(nak_from_same_site_nik.GetTopFrameSite(), site_a); @@ -235,6 +260,10 @@ NetworkAnonymizationKey::CreateTransient(); EXPECT_TRUE(empty_key.IsTransient()); + EXPECT_TRUE(IsolationInfo::CreateEmptyWithPartition( + NetworkIsolationPartition::kDnsOverHttps) + .network_anonymization_key() + .IsTransient()); EXPECT_FALSE(populated_key.IsTransient()); EXPECT_TRUE(data_top_frame_key.IsTransient()); EXPECT_TRUE(populated_key_with_nonce.IsTransient()); @@ -261,6 +290,50 @@ EXPECT_TRUE(key.IsCrossSite()); } +TEST_F(NetworkAnonymizationKeyTest, CreateEmptyWithPartition) { + NetworkAnonymizationKey key = + NetworkAnonymizationKey::CreateEmptyWithPartition( + NetworkIsolationPartition::kDnsOverHttps); + base::Value key_value; + ASSERT_TRUE(key.ToValue(&key_value)); + + EXPECT_TRUE(key.IsEmpty()); + EXPECT_TRUE(key.IsTransient()); + EXPECT_EQ(NetworkIsolationPartition::kDnsOverHttps, + key.network_isolation_partition()); + + // Create another NetworkAnonymizationKey with the same partition, and check + // that they're equal. + NetworkAnonymizationKey same_key = + NetworkAnonymizationKey::CreateEmptyWithPartition( + NetworkIsolationPartition::kDnsOverHttps); + base::Value same_key_value; + ASSERT_TRUE(same_key.ToValue(&same_key_value)); + + EXPECT_EQ(key, same_key); + EXPECT_EQ(key_value, same_key_value); + + // Create another NetworkAnonymizationKey with a different partition, and + // check that they're different. + NetworkAnonymizationKey other_key = + NetworkAnonymizationKey::CreateEmptyWithPartition( + NetworkIsolationPartition::kFedCmUncredentialedRequests); + base::Value other_key_value; + ASSERT_TRUE(other_key.ToValue(&other_key_value)); + + EXPECT_NE(key, other_key); + EXPECT_NE(key_value, other_key_value); + + // Check that it's also different from the general case empty + // NetworkAnonymizationKey. + NetworkAnonymizationKey empty_key; + base::Value empty_key_value; + ASSERT_TRUE(empty_key.ToValue(&empty_key_value)); + + EXPECT_NE(key, empty_key); + EXPECT_NE(key_value, empty_key_value); +} + TEST_F(NetworkAnonymizationKeyTest, ToDebugString) { NetworkAnonymizationKey key = NetworkAnonymizationKey::CreateFromParts( /*top_frame_site=*/kTestSiteA, @@ -431,6 +504,27 @@ } TEST_F(NetworkAnonymizationKeyTest, + EmptyValueSerializationWithNonGeneralNetworkPartition) { + NetworkAnonymizationKey original_key = + NetworkAnonymizationKey::CreateEmptyWithPartition( + NetworkIsolationPartition::kDnsOverHttps); + base::Value value; + ASSERT_TRUE(original_key.ToValue(&value)); + + // Verify it's a one-valued list. + ASSERT_TRUE(value.is_list()); + EXPECT_EQ(value.GetList().size(), 1u); + EXPECT_TRUE(value.GetList()[0].is_int()); + EXPECT_EQ(value.GetList()[0].GetInt(), + static_cast<int>(NetworkIsolationPartition::kDnsOverHttps)); + + // Verify it round-trips. + NetworkAnonymizationKey from_value_key; + EXPECT_TRUE(NetworkAnonymizationKey::FromValue(value, &from_value_key)); + EXPECT_EQ(original_key, from_value_key); +} + +TEST_F(NetworkAnonymizationKeyTest, FromValueOnlyAcceptsValidNetworkIsolationPartitionValues) { base::Value value; ASSERT_TRUE(NetworkAnonymizationKey::CreateFromParts(
diff --git a/net/base/network_isolation_key.cc b/net/base/network_isolation_key.cc index 66a56fa..c3421fd5 100644 --- a/net/base/network_isolation_key.cc +++ b/net/base/network_isolation_key.cc
@@ -11,6 +11,7 @@ #include "base/check.h" #include "base/no_destructor.h" #include "base/numerics/safe_conversions.h" +#include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" #include "base/unguessable_token.h" #include "net/base/features.h" @@ -57,6 +58,14 @@ NetworkIsolationKey::NetworkIsolationKey() : NetworkIsolationKey(Data::GetEmptyData()) {} +// static +NetworkIsolationKey NetworkIsolationKey::CreateEmptyWithPartition( + NetworkIsolationPartition network_isolation_partition) { + return NetworkIsolationKey(base::MakeRefCounted<Data>( + /*top_frame_site=*/std::nullopt, /*frame_site=*/std::nullopt, + /*nonce=*/std::nullopt, network_isolation_partition)); +} + NetworkIsolationKey::NetworkIsolationKey( const NetworkIsolationKey& network_isolation_key) = default; @@ -106,26 +115,26 @@ } std::string NetworkIsolationKey::ToDebugString() const { + std::string partition = + GetNetworkIsolationPartition() == NetworkIsolationPartition::kGeneral + ? "" + : base::StrCat({" (", + NetworkIsolationPartitionToDebugString( + GetNetworkIsolationPartition()), + ")"}); + if (data_->is_empty()) { - return "null null"; - } - // The space-separated serialization of |top_frame_site_| and - // |frame_site_|. - std::string return_string = GetTopFrameSite()->GetDebugString(); - return_string += " " + GetFrameSite()->GetDebugString(); - - if (GetNonce().has_value()) { - return_string += " (with nonce " + GetNonce()->ToString() + ")"; + return base::StrCat({"null null", partition}); } - if (GetNetworkIsolationPartition() != NetworkIsolationPartition::kGeneral) { - return_string += - " (" + - NetworkIsolationPartitionToDebugString(GetNetworkIsolationPartition()) + - ")"; - } + std::string top_frame_site = GetTopFrameSite()->GetDebugString(); + std::string frame_site = GetFrameSite()->GetDebugString(); + std::string nonce = + GetNonce().has_value() + ? base::StrCat({" (with nonce ", GetNonce()->ToString(), ")"}) + : ""; - return return_string; + return base::StrCat({top_frame_site, " ", frame_site, nonce, partition}); } bool NetworkIsolationKey::IsTransient() const { @@ -172,17 +181,20 @@ } NetworkIsolationKey::Data::Data( - SchemefulSite&& top_frame_site, - SchemefulSite&& frame_site, + std::optional<SchemefulSite>&& top_frame_site, + std::optional<SchemefulSite>&& frame_site, std::optional<base::UnguessableToken>&& nonce, NetworkIsolationPartition network_isolation_partition) : top_frame_site_(std::move(top_frame_site)), frame_site_(std::move(frame_site)), nonce_(std::move(nonce)), network_isolation_partition_(network_isolation_partition) { - CHECK(top_frame_site_.has_value()); - CHECK(frame_site_.has_value()); - CHECK(!is_empty()); + if (is_empty()) { + CHECK(!frame_site_.has_value()); + CHECK(!nonce_.has_value()); + } else { + CHECK(frame_site_.has_value()); + } } NetworkIsolationKey::Data::~Data() = default;
diff --git a/net/base/network_isolation_key.h b/net/base/network_isolation_key.h index fd90a0a..1cdbb51 100644 --- a/net/base/network_isolation_key.h +++ b/net/base/network_isolation_key.h
@@ -41,9 +41,11 @@ // // An empty NetworkIsolationKey (one where the `top_frame_site` is empty) can be // used for transient network requests where the responses should not be written -// to disk. Note that although a given NetworkIsolationKey may be empty, the -// corresponding NetworkAnonymizationKey (also empty) may still result in -// metadata such as HttpServerProperties being written to disk. +// to disk. Note that empty NetworkAnonymizationKeys can still have different +// NetworkIsolationPartition values. Also note that although a given +// NetworkIsolationKey may be empty, the corresponding NetworkAnonymizationKey +// (also empty) may still result in metadata such as HttpServerProperties being +// written to disk. class NET_EXPORT NetworkIsolationKey { public: // Full constructor. When a request is initiated by the top frame, it must @@ -66,6 +68,10 @@ // Construct an empty key. NetworkIsolationKey(); + // Create an empty NetworkIsolationKey with a partition. + static NetworkIsolationKey CreateEmptyWithPartition( + NetworkIsolationPartition network_isolation_partition); + NetworkIsolationKey(const NetworkIsolationKey& network_isolation_key); NetworkIsolationKey(NetworkIsolationKey&& network_isolation_key); @@ -163,11 +169,11 @@ public: static scoped_refptr<Data> GetEmptyData(); - // Conctruct an empty data. + // Construct an empty data. explicit Data(base::PassKey<Data>); - Data(SchemefulSite&& top_frame_site, - SchemefulSite&& frame_site, + Data(std::optional<SchemefulSite>&& top_frame_site, + std::optional<SchemefulSite>&& frame_site, std::optional<base::UnguessableToken>&& nonce, NetworkIsolationPartition network_isolation_partition);
diff --git a/net/base/network_isolation_key_unittest.cc b/net/base/network_isolation_key_unittest.cc index 1e90d08..89131568 100644 --- a/net/base/network_isolation_key_unittest.cc +++ b/net/base/network_isolation_key_unittest.cc
@@ -133,6 +133,34 @@ EXPECT_TRUE(key4.IsTransient()); } +TEST(NetworkIsolationKeyTest, CreateEmptyWithPartition) { + NetworkIsolationKey key = NetworkIsolationKey::CreateEmptyWithPartition( + NetworkIsolationPartition::kDnsOverHttps); + EXPECT_TRUE(key.IsEmpty()); + EXPECT_TRUE(key.IsTransient()); + EXPECT_EQ(NetworkIsolationPartition::kDnsOverHttps, + key.GetNetworkIsolationPartition()); + EXPECT_EQ(std::nullopt, key.ToCacheKeyString()); + EXPECT_EQ("null null (dns over https)", key.ToDebugString()); + + // Create another NetworkIsolationKey with the same partition, and check that + // they're equal. + NetworkIsolationKey same_key = NetworkIsolationKey::CreateEmptyWithPartition( + NetworkIsolationPartition::kDnsOverHttps); + EXPECT_EQ(key, same_key); + + // Create another NetworkIsolationKey with a different partition, and check + // that they're different. + NetworkIsolationKey other_key = NetworkIsolationKey::CreateEmptyWithPartition( + NetworkIsolationPartition::kFedCmUncredentialedRequests); + EXPECT_NE(key, other_key); + + // Check that it's also different from the general case empty + // NetworkIsolationKey. + NetworkIsolationKey empty_key; + EXPECT_NE(key, empty_key); +} + TEST(NetworkIsolationKeyTest, OpaqueOriginKey) { SchemefulSite site_data = SchemefulSite(GURL(kDataUrl)); NetworkIsolationKey key(site_data, site_data);
diff --git a/net/base/network_isolation_partition.cc b/net/base/network_isolation_partition.cc index 733ef61..062fb49d2 100644 --- a/net/base/network_isolation_partition.cc +++ b/net/base/network_isolation_partition.cc
@@ -17,7 +17,15 @@ return "protected audience seller worklet partition"; case NetworkIsolationPartition::kFedCmUncredentialedRequests: return "fedcm uncredentialed requests"; + case NetworkIsolationPartition::kDnsOverHttps: + return "dns over https"; } } +bool NetworkIsolationPartitionAlwaysAllowEmptyPartition( + NetworkIsolationPartition network_isolation_partition) { + return network_isolation_partition == + NetworkIsolationPartition::kDnsOverHttps; +} + } // namespace net
diff --git a/net/base/network_isolation_partition.h b/net/base/network_isolation_partition.h index d4c2105..599ce382 100644 --- a/net/base/network_isolation_partition.h +++ b/net/base/network_isolation_partition.h
@@ -9,6 +9,8 @@ #include <string> +#include "net/base/net_export.h" + namespace net { // Specifies the use case for IsolationInfo, NetworkIsolationKey, and @@ -28,13 +30,21 @@ kProtectedAudienceSellerWorklet = 1, // This use case isolates network state for FedCM-related requests. kFedCmUncredentialedRequests = 2, + // This use case isolates network state for DNS over HTTPS requests. + kDnsOverHttps = 3, - kMaxValue = kFedCmUncredentialedRequests + kMaxValue = kDnsOverHttps, }; std::string NetworkIsolationPartitionToDebugString( NetworkIsolationPartition network_isolation_partition); +// Returns true if requests in this partition are allowed to have an empty +// IsolationInfo, even when +// `URLRequestContext::require_network_anonymization_key()` is true. +NET_EXPORT_PRIVATE bool NetworkIsolationPartitionAlwaysAllowEmptyPartition( + NetworkIsolationPartition network_isolation_partition); + } // namespace net #endif // NET_BASE_NETWORK_ISOLATION_PARTITION_H_
diff --git a/net/dns/BUILD.gn b/net/dns/BUILD.gn index 012632a4..5be47a39 100644 --- a/net/dns/BUILD.gn +++ b/net/dns/BUILD.gn
@@ -450,6 +450,7 @@ "dns_alias_utility_unittest.cc", "dns_config_service_unittest.cc", "dns_hosts_unittest.cc", + "dns_http_attempt_unittest.cc", "dns_names_util_unittest.cc", "dns_query_unittest.cc", "dns_response_result_extractor_unittest.cc",
diff --git a/net/dns/dns_http_attempt.cc b/net/dns/dns_http_attempt.cc index 0627d113..6f574a1 100644 --- a/net/dns/dns_http_attempt.cc +++ b/net/dns/dns_http_attempt.cc
@@ -11,6 +11,7 @@ #include "base/base64url.h" #include "base/memory/weak_ptr.h" +#include "base/no_destructor.h" #include "base/task/sequenced_task_runner.h" #include "base/time/time.h" #include "base/values.h" @@ -19,6 +20,7 @@ #include "net/base/io_buffer.h" #include "net/base/isolation_info.h" #include "net/base/net_errors.h" +#include "net/base/network_isolation_partition.h" #include "net/base/request_priority.h" #include "net/base/upload_bytes_element_reader.h" #include "net/dns/dns_names_util.h" @@ -48,6 +50,14 @@ } // namespace +// static +const IsolationInfo& DnsHTTPAttempt::GetDohIsolationInfo() { + static const base::NoDestructor<IsolationInfo> kIsolationInfo( + IsolationInfo::CreateEmptyWithPartition( + NetworkIsolationPartition::kDnsOverHttps)); + return *kIsolationInfo; +} + DnsHTTPAttempt::DnsHTTPAttempt(base::WeakPtr<ResolveContext> resolve_context, DnsSession* session, size_t doh_server_index, @@ -56,7 +66,6 @@ const GURL& gurl_without_parameters, bool use_post, URLRequestContext* url_request_context, - const IsolationInfo& isolation_info, RequestPriority request_priority_, bool is_probe) : DnsAttempt(doh_server_index), @@ -162,7 +171,7 @@ request_->SetLoadFlags(request_->load_flags() | LOAD_DISABLE_CACHE | LOAD_BYPASS_PROXY); request_->set_disallow_credentials(); - request_->set_isolation_info(isolation_info); + request_->set_isolation_info(GetDohIsolationInfo()); } DnsHTTPAttempt::~DnsHTTPAttempt() = default;
diff --git a/net/dns/dns_http_attempt.h b/net/dns/dns_http_attempt.h index ce41edd..99a1ef8b 100644 --- a/net/dns/dns_http_attempt.h +++ b/net/dns/dns_http_attempt.h
@@ -37,7 +37,8 @@ class ResolveContext; // An implementation of DnsAttempt over an HTTP transport. -class DnsHTTPAttempt : public DnsAttempt, public URLRequest::Delegate { +class NET_EXPORT_PRIVATE DnsHTTPAttempt : public DnsAttempt, + public URLRequest::Delegate { public: // Information about an HTTP attempt. struct DnsHttpAttemptInfo { @@ -55,7 +56,6 @@ const GURL& gurl_without_parameters, bool use_post, URLRequestContext* url_request_context, - const IsolationInfo& isolation_info, RequestPriority request_priority_, bool is_probe); ~DnsHTTPAttempt() override; @@ -63,6 +63,16 @@ DnsHTTPAttempt(const DnsHTTPAttempt&) = delete; DnsHTTPAttempt& operator=(const DnsHTTPAttempt&) = delete; + // Returns `IsolationInfo` that should be used for DoH requests. Using the + // same `IsolationInfo` with a DoH-specific `NetworkIsolationPartition` + // ensures that DNS requests aren't pooled with normal web requests, but still + // allows them to be pooled with each other, to allow reusing connections to + // the DoH server across different third party contexts. This `IsolationInfo` + // also allows metadata such as AltSvc info to be written to disk and reused + // across restarts, which enables remembering which servers supports QUIC so + // that it can be used immediately for subsequent DoH requests. + static const IsolationInfo& GetDohIsolationInfo(); + // DnsAttempt overrides. int Start(CompletionOnceCallback callback) override; const DnsQuery* GetQuery() const override;
diff --git a/net/dns/dns_http_attempt_unittest.cc b/net/dns/dns_http_attempt_unittest.cc new file mode 100644 index 0000000..6ec3c8892 --- /dev/null +++ b/net/dns/dns_http_attempt_unittest.cc
@@ -0,0 +1,27 @@ +// Copyright 2026 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/dns/dns_http_attempt.h" + +#include "base/values.h" +#include "net/base/isolation_info.h" +#include "net/base/network_isolation_partition.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace net { + +TEST(DnsHTTPAttemptTest, DohIsolationInfo) { + // Our requirements for the IsolationInfo are that the NAK is serializable + // (so AltSvc information can be stored across restarts) and that it be + // isolated from web requests. + const IsolationInfo& isolation_info = DnsHTTPAttempt::GetDohIsolationInfo(); + base::Value out; + EXPECT_TRUE(isolation_info.network_anonymization_key().ToValue(&out)); + EXPECT_EQ(isolation_info.GetNetworkIsolationPartition(), + NetworkIsolationPartition::kDnsOverHttps); + EXPECT_TRUE(NetworkIsolationPartitionAlwaysAllowEmptyPartition( + NetworkIsolationPartition::kDnsOverHttps)); +} + +} // namespace net
diff --git a/net/dns/dns_transaction.cc b/net/dns/dns_transaction.cc index 35d80e18..19c5870e 100644 --- a/net/dns/dns_transaction.cc +++ b/net/dns/dns_transaction.cc
@@ -123,7 +123,6 @@ const OptRecordRdata* opt_rdata, std::vector<std::unique_ptr<DnsAttempt>>* attempts, URLRequestContext* url_request_context, - const IsolationInfo& isolation_info, RequestPriority request_priority, bool is_probe) { DCHECK(url_request_context); @@ -145,8 +144,7 @@ attempts->push_back(std::make_unique<DnsHTTPAttempt>( std::move(resolve_context), session, doh_server_index, std::move(query), doh_server.server_template(), gurl_without_parameters, - doh_server.use_post(), url_request_context, isolation_info, - request_priority, is_probe)); + doh_server.use_post(), url_request_context, request_priority, is_probe)); } // ---------------------------------------------------------------------------- @@ -277,8 +275,7 @@ context_->GetWeakPtr(), session_.get(), doh_server_index, formatted_probe_qname_, dns_protocol::kTypeA, /*opt_rdata=*/nullptr, &probe_stats->probe_attempts, context_->url_request_context(), - context_->isolation_info(), RequestPriority::DEFAULT_PRIORITY, - /*is_probe=*/true); + RequestPriority::DEFAULT_PRIORITY, /*is_probe=*/true); DnsAttempt* probe_attempt = probe_stats->probe_attempts.back().get(); probe_attempt->Start(base::BindOnce( @@ -652,7 +649,6 @@ doh_server_index, qnames_.front(), qtype_, opt_rdata_, &attempts_, resolve_context_->url_request_context(), - resolve_context_->isolation_info(), request_priority_, /*is_probe=*/false); ++attempts_count_; DnsAttempt* attempt = attempts_.back().get();
diff --git a/net/dns/dns_transaction_unittest.cc b/net/dns/dns_transaction_unittest.cc index 1f29b97..464ef20 100644 --- a/net/dns/dns_transaction_unittest.cc +++ b/net/dns/dns_transaction_unittest.cc
@@ -36,6 +36,7 @@ #include "base/values.h" #include "net/base/idempotency.h" #include "net/base/ip_address.h" +#include "net/base/isolation_info.h" #include "net/base/port_util.h" #include "net/base/upload_bytes_element_reader.h" #include "net/base/url_util.h" @@ -898,21 +899,10 @@ } EXPECT_TRUE(server_found); - EXPECT_TRUE( - request->isolation_info().network_isolation_key().IsTransient()); - - // All DoH requests for the same ResolveContext should use the same - // IsolationInfo, so network objects like sockets can be reused between - // requests. - if (!expect_multiple_isolation_infos_) { - if (!isolation_info_) { - isolation_info_ = - std::make_unique<IsolationInfo>(request->isolation_info()); - } else { - EXPECT_TRUE( - isolation_info_->IsEqualForTesting(request->isolation_info())); - } - } + // All DoH requests should use the same IsolationInfo, so network objects + // like sockets can be reused between requests. + EXPECT_TRUE(DnsHTTPAttempt::GetDohIsolationInfo().IsEqualForTesting( + request->isolation_info())); EXPECT_FALSE(request->allow_credentials()); EXPECT_EQ(SecureDnsPolicy::kBootstrap, request->secure_dns_policy()); @@ -999,11 +989,6 @@ filter->ClearHandlers(); } - void set_expect_multiple_isolation_infos( - bool expect_multiple_isolation_infos) { - expect_multiple_isolation_infos_ = expect_multiple_isolation_infos; - } - protected: int GetNextId(int min, int max) { EXPECT_FALSE(transaction_ids_.empty()); @@ -1031,15 +1016,6 @@ ResponseModifierCallback response_modifier_; UrlRequestStartedCallback on_start_; DohJobMakerCallback doh_job_maker_; - - // Whether multiple IsolationInfos should be expected (due to there being - // multiple RequestContexts in use). - bool expect_multiple_isolation_infos_ = false; - - // IsolationInfo used by DoH requests. Populated on first DoH request, and - // compared to IsolationInfo used by all subsequent requests, unless - // |expect_multiple_isolation_infos_| is true. - std::unique_ptr<IsolationInfo> isolation_info_; }; class DnsTransactionTest : public DnsTransactionTestBase, @@ -3761,11 +3737,6 @@ } TEST_F(DnsTransactionTestWithMockTime, MultipleProbeRunners_SeparateContexts) { - // Each RequestContext uses its own transient IsolationInfo. Since there's - // typically only one RequestContext per URLRequestContext, there's no - // advantage in using the same IsolationInfo across RequestContexts. - set_expect_multiple_isolation_infos(true); - ConfigureDohServers(true /* use_post */, 1 /* num_doh_servers */, false /* make_available */); AddQueryAndResponse(0 /* id */, kT4HostName, kT4Qtype, kT4ResponseDatagram,
diff --git a/net/dns/resolve_context.cc b/net/dns/resolve_context.cc index 4344e8c..ec029ee 100644 --- a/net/dns/resolve_context.cc +++ b/net/dns/resolve_context.cc
@@ -143,8 +143,7 @@ : url_request_context_(url_request_context), host_cache_(CreateHostCache(enable_caching)), host_resolver_cache_( - CreateHostResolverCache(enable_caching, clock, tick_clock)), - isolation_info_(IsolationInfo::CreateTransient(/*nonce=*/std::nullopt)) { + CreateHostResolverCache(enable_caching, clock, tick_clock)) { max_fallback_period_ = GetMaxFallbackPeriod(); }
diff --git a/net/dns/resolve_context.h b/net/dns/resolve_context.h index 178563a..4c309341 100644 --- a/net/dns/resolve_context.h +++ b/net/dns/resolve_context.h
@@ -19,7 +19,6 @@ #include "base/time/default_tick_clock.h" #include "base/time/time.h" #include "base/timer/timer.h" -#include "net/base/isolation_info.h" #include "net/base/net_export.h" #include "net/base/network_handle.h" #include "net/dns/dns_attempt.h" @@ -235,15 +234,6 @@ return doh_autoupgrade_success_metric_timer_.IsRunning(); } - // Returns IsolationInfo that should be used for DoH requests. Using a single - // transient IsolationInfo ensures that DNS requests aren't pooled with normal - // web requests, but still allows them to be pooled with each other, to allow - // reusing connections to the DoH server across different third party - // contexts. One downside of a transient IsolationInfo is that it means - // metadata about the DoH server itself will not be cached across restarts - // (alternative service info if it supports QUIC, for instance). - const IsolationInfo& isolation_info() const { return isolation_info_; } - // Network to perform the DNS lookups for. When equal to // handles::kInvalidNetworkHandle the decision of which one to target is left // to the resolver. Virtual for testing. @@ -379,8 +369,6 @@ // Track runtime statistics of each DoH server. std::vector<ServerStats> doh_server_stats_; - const IsolationInfo isolation_info_; - base::OneShotTimer doh_autoupgrade_success_metric_timer_; // Status of a canary domain check to allow DoH fallback for Secure DNS.
diff --git a/net/url_request/http_with_dns_over_https_unittest.cc b/net/url_request/http_with_dns_over_https_unittest.cc index 600ba2c..94d93e47 100644 --- a/net/url_request/http_with_dns_over_https_unittest.cc +++ b/net/url_request/http_with_dns_over_https_unittest.cc
@@ -13,9 +13,11 @@ #include "base/strings/string_number_conversions.h" #include "base/test/scoped_feature_list.h" #include "net/base/features.h" +#include "net/base/isolation_info.h" #include "net/base/network_change_notifier.h" #include "net/base/privacy_mode.h" #include "net/base/proxy_server.h" +#include "net/cookies/site_for_cookies.h" #include "net/dns/context_host_resolver.h" #include "net/dns/dns_client.h" #include "net/dns/dns_config.h" @@ -53,6 +55,8 @@ #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h" #include "third_party/boringssl/src/include/openssl/ssl.h" +#include "url/gurl.h" +#include "url/origin.h" #include "url/scheme_host_port.h" #include "url/url_constants.h" @@ -141,7 +145,8 @@ URLRequestContext* context() { return request_context_.get(); } - void ResetContext(SecureDnsMode mode = SecureDnsMode::kSecure) { + void ResetContext(SecureDnsMode mode = SecureDnsMode::kSecure, + bool require_network_anonymization_key = false) { // TODO(crbug.com/40198637): Simplify this. HostResolver::ManagerOptions manager_options; // Without a DnsConfig, HostResolverManager will not use DoH, even in @@ -167,6 +172,8 @@ HostResolverSystemTask::Params(host_resolver_proc_, 1)); auto context_builder = CreateTestURLRequestContextBuilder(); + context_builder->set_require_network_anonymization_key( + require_network_anonymization_key); context_builder->set_host_resolver(std::move(resolver)); auto ssl_config_service = std::make_unique<TestSSLConfigService>(SSLContextConfig()); @@ -350,6 +357,36 @@ EXPECT_EQ(d.data_received(), kTestBody); } +TEST_F(HttpsWithDnsOverHttpsTest, EndToEndWithIsolationInfo) { + // Reset context with require_network_anonymization_key = true. + ResetContext(SecureDnsMode::kSecure, + /*require_network_anonymization_key=*/true); + + // Make a request with a valid IsolationInfo. + TestDelegate d; + GURL main_url = https_server_.GetURL(kHostname, "/test"); + std::unique_ptr<URLRequest> req(context()->CreateRequest( + main_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS)); + + url::Origin origin = url::Origin::Create(main_url); + req->set_isolation_info( + IsolationInfo::Create(IsolationInfo::RequestType::kMainFrame, origin, + origin, SiteForCookies::FromOrigin(origin))); + + req->Start(); + d.RunUntilComplete(); + EXPECT_TRUE(https_server_.ShutdownAndWaitUntilComplete()); + EXPECT_TRUE(doh_server_.ShutdownAndWaitUntilComplete()); + + // There should be three DoH lookups for kHostname (A, AAAA, and HTTPS). + EXPECT_EQ(doh_server_.QueriesServed(), 3); + + // We are also implicitly checking that the DoH requests bypassed the + // IsolationInfo-is-not-empty check in `URLRequest::Start` that occurs when + // `require_network_anonymization_key` is set since DoH requests use an empty + // IsolationInfo with a custom partition (which we exempt from the check). +} + TEST_F(HttpsWithDnsOverHttpsTest, EndToEndFail) { // Fail all DoH requests. doh_server_.SetFailRequests(true);
diff --git a/net/url_request/url_request.cc b/net/url_request/url_request.cc index f83485d..b26326e 100644 --- a/net/url_request/url_request.cc +++ b/net/url_request/url_request.cc
@@ -596,7 +596,9 @@ return; if (context_->require_network_anonymization_key()) { - DCHECK(!isolation_info_.IsEmpty()); + DCHECK(!isolation_info_.IsEmpty() || + NetworkIsolationPartitionAlwaysAllowEmptyPartition( + isolation_info_.GetNetworkIsolationPartition())); } // Some values can be NULL, but the job factory must not be.
diff --git a/remoting/host/daemon_process.cc b/remoting/host/daemon_process.cc index 7ef7979f..99fdcab 100644 --- a/remoting/host/daemon_process.cc +++ b/remoting/host/daemon_process.cc
@@ -58,7 +58,7 @@ void DaemonProcess::OnConfigWatcherError() { DCHECK(caller_task_runner()->BelongsToCurrentThread()); - Stop(); + Stop(kInvalidHostConfigurationExitCode); } void DaemonProcess::OnChannelConnected(int32_t peer_pid) { @@ -80,7 +80,7 @@ DCHECK(kMinPermanentErrorExitCode <= exit_code && exit_code <= kMaxPermanentErrorExitCode); - Stop(); + Stop(exit_code); } void DaemonProcess::OnWorkerProcessStopped() { @@ -166,7 +166,7 @@ DaemonProcess::DaemonProcess( scoped_refptr<AutoThreadTaskRunner> caller_task_runner, scoped_refptr<AutoThreadTaskRunner> io_task_runner, - base::OnceClosure stopped_callback) + StoppedCallback stopped_callback) : caller_task_runner_(caller_task_runner), io_task_runner_(io_task_runner), next_terminal_id_(0), @@ -291,13 +291,13 @@ LaunchNetworkProcess(); } -void DaemonProcess::Stop() { +void DaemonProcess::Stop(int exit_code) { DCHECK(caller_task_runner()->BelongsToCurrentThread()); OnWorkerProcessStopped(); if (stopped_callback_) { - std::move(stopped_callback_).Run(); + std::move(stopped_callback_).Run(exit_code); } } @@ -370,6 +370,7 @@ } } +// static base::FilePath DaemonProcess::GetConfigPath() { base::FilePath config_path; const base::CommandLine* command_line =
diff --git a/remoting/host/daemon_process.h b/remoting/host/daemon_process.h index b8384599..0f42587 100644 --- a/remoting/host/daemon_process.h +++ b/remoting/host/daemon_process.h
@@ -44,6 +44,7 @@ public HostStatusObserver, public mojom::DesktopSessionManager { public: + using StoppedCallback = base::OnceCallback<void(int /*exit_code*/)>; using DesktopSessionList = base::circular_deque<raw_ptr<DesktopSession, CtnExperimental>>; @@ -59,7 +60,10 @@ static std::unique_ptr<DaemonProcess> Create( scoped_refptr<AutoThreadTaskRunner> caller_task_runner, scoped_refptr<AutoThreadTaskRunner> io_task_runner, - const base::OnceClosure stopped_callback); + StoppedCallback stopped_callback); + + // Gets the location of the config file. + static base::FilePath GetConfigPath(); // ConfigWatcher::Delegate void OnConfigUpdated(const std::string& serialized_config) override; @@ -100,13 +104,13 @@ protected: DaemonProcess(scoped_refptr<AutoThreadTaskRunner> caller_task_runner, scoped_refptr<AutoThreadTaskRunner> io_task_runner, - base::OnceClosure stopped_callback); + StoppedCallback stopped_callback); // Reads the host configuration and launches the network process. void Initialize(); // Invokes |stopped_callback_| to ask the owner to delete |this|. - void Stop(); + void Stop(int exit_code); // Returns true if |terminal_id| is in the range of allocated IDs. I.e. it is // less or equal to the highest ID we have seen so far. @@ -165,9 +169,6 @@ // Deletes all desktop sessions. void DeleteAllDesktopSessions(); - // Gets the location of the config file. - base::FilePath GetConfigPath(); - // Task runner on which public methods of this class must be called. scoped_refptr<AutoThreadTaskRunner> caller_task_runner_; @@ -186,7 +187,7 @@ int next_terminal_id_; // Invoked to ask the owner to delete |this|. - base::OnceClosure stopped_callback_; + StoppedCallback stopped_callback_; // Writes host status updates to the system event log. std::unique_ptr<HostEventLogger> host_event_logger_;
diff --git a/remoting/host/daemon_process_linux.cc b/remoting/host/daemon_process_linux.cc index 8e72590..261f9d7 100644 --- a/remoting/host/daemon_process_linux.cc +++ b/remoting/host/daemon_process_linux.cc
@@ -59,7 +59,7 @@ public: DaemonProcessLinux(scoped_refptr<AutoThreadTaskRunner> caller_task_runner, scoped_refptr<AutoThreadTaskRunner> io_task_runner, - base::OnceClosure stopped_callback); + StoppedCallback stopped_callback); DaemonProcessLinux(const DaemonProcessLinux&) = delete; DaemonProcessLinux& operator=(const DaemonProcessLinux&) = delete; @@ -116,7 +116,7 @@ DaemonProcessLinux::DaemonProcessLinux( scoped_refptr<AutoThreadTaskRunner> caller_task_runner, scoped_refptr<AutoThreadTaskRunner> io_task_runner, - base::OnceClosure stopped_callback) + StoppedCallback stopped_callback) : DaemonProcess(caller_task_runner, io_task_runner, std::move(stopped_callback)), @@ -193,14 +193,14 @@ base::FilePath this_exe; if (!base::PathService::Get(base::BasePathKey::FILE_EXE, &this_exe)) { LOG(ERROR) << "Failed to get the current executable path."; - Stop(); + Stop(kInitializationFailed); return; } auto user_info = GetPasswdUserInfo(GetNetworkProcessUsername()); if (!user_info.has_value()) { LOG(ERROR) << user_info.error(); - Stop(); + Stop(kInitializationFailed); return; } @@ -216,7 +216,7 @@ base::FilePath temp_dir; if (!base::PathService::Get(base::DIR_TEMP, &temp_dir)) { LOG(ERROR) << "Failed to get the temporary directory path."; - Stop(); + Stop(kInitializationFailed); return; } options.working_dir = temp_dir; @@ -272,14 +272,14 @@ if (!result.has_value()) { LOG(ERROR) << result.error(); - Stop(); + Stop(kInitializationFailed); } } std::unique_ptr<DaemonProcess> DaemonProcess::Create( scoped_refptr<AutoThreadTaskRunner> caller_task_runner, scoped_refptr<AutoThreadTaskRunner> io_task_runner, - base::OnceClosure stopped_callback) { + StoppedCallback stopped_callback) { auto daemon_process = std::make_unique<DaemonProcessLinux>( caller_task_runner, io_task_runner, std::move(stopped_callback));
diff --git a/remoting/host/daemon_process_unittest.cc b/remoting/host/daemon_process_unittest.cc index 6a56bf7..51c0837 100644 --- a/remoting/host/daemon_process_unittest.cc +++ b/remoting/host/daemon_process_unittest.cc
@@ -19,6 +19,7 @@ #include "base/test/task_environment.h" #include "mojo/public/cpp/system/message_pipe.h" #include "remoting/base/auto_thread_task_runner.h" +#include "remoting/host/base/host_exit_codes.h" #include "remoting/host/desktop_session.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -52,7 +53,7 @@ public: MockDaemonProcess(scoped_refptr<AutoThreadTaskRunner> caller_task_runner, scoped_refptr<AutoThreadTaskRunner> io_task_runner, - base::OnceClosure stopped_callback); + StoppedCallback stopped_callback); MockDaemonProcess(const MockDaemonProcess&) = delete; MockDaemonProcess& operator=(const MockDaemonProcess&) = delete; @@ -87,7 +88,7 @@ MockDaemonProcess::MockDaemonProcess( scoped_refptr<AutoThreadTaskRunner> caller_task_runner, scoped_refptr<AutoThreadTaskRunner> io_task_runner, - base::OnceClosure stopped_callback) + StoppedCallback stopped_callback) : DaemonProcess(caller_task_runner, io_task_runner, std::move(stopped_callback)) {} @@ -122,7 +123,7 @@ void LaunchNetworkProcess(); // Deletes |daemon_process_|. - void DeleteDaemonProcess(); + void DeleteDaemonProcess(int exit_code); // Quits |message_loop_|. void QuitMessageLoop(); @@ -169,7 +170,7 @@ } void DaemonProcessTest::TearDown() { - daemon_process_->Stop(); + daemon_process_->Stop(kSuccessExitCode); run_loop_.Run(); } @@ -182,7 +183,7 @@ daemon_process_->OnChannelConnected(0); } -void DaemonProcessTest::DeleteDaemonProcess() { +void DaemonProcessTest::DeleteDaemonProcess(int exit_code) { daemon_process_.reset(); }
diff --git a/remoting/host/daemon_process_win.cc b/remoting/host/daemon_process_win.cc index edab598f..9c9869ab 100644 --- a/remoting/host/daemon_process_win.cc +++ b/remoting/host/daemon_process_win.cc
@@ -102,7 +102,7 @@ public: DaemonProcessWin(scoped_refptr<AutoThreadTaskRunner> caller_task_runner, scoped_refptr<AutoThreadTaskRunner> io_task_runner, - base::OnceClosure stopped_callback); + StoppedCallback stopped_callback); DaemonProcessWin(const DaemonProcessWin&) = delete; DaemonProcessWin& operator=(const DaemonProcessWin&) = delete; @@ -111,7 +111,6 @@ // WorkerProcessIpcDelegate implementation. void OnChannelConnected(int32_t peer_pid) override; - void OnPermanentError(int exit_code) override; void OnWorkerProcessStopped() override; // DaemonProcess overrides. @@ -142,9 +141,6 @@ void SendTerminalDisconnected(int terminal_id) override; void StartChromotingHostServices() override; - // Changes the service start type to 'manual'. - void DisableAutoStart(); - // Initializes the pairing registry on the host side. bool InitializePairingRegistry(); @@ -183,7 +179,7 @@ DaemonProcessWin::DaemonProcessWin( scoped_refptr<AutoThreadTaskRunner> caller_task_runner, scoped_refptr<AutoThreadTaskRunner> io_task_runner, - base::OnceClosure stopped_callback) + StoppedCallback stopped_callback) : DaemonProcess(caller_task_runner, io_task_runner, std::move(stopped_callback)), @@ -219,22 +215,6 @@ DaemonProcess::OnChannelConnected(peer_pid); } -void DaemonProcessWin::OnPermanentError(int exit_code) { - DCHECK(kMinPermanentErrorExitCode <= exit_code && - exit_code <= kMaxPermanentErrorExitCode); - - // Both kInvalidHostIdExitCode and kInvalidOAuthCredentialsExitCode are - // errors that will never go away with the current config. - // Disabling automatic service start until the host is re-enabled and config - // updated. - if (exit_code == kInvalidHostIdExitCode || - exit_code == kInvalidOAuthCredentialsExitCode) { - DisableAutoStart(); - } - - DaemonProcess::OnPermanentError(exit_code); -} - void DaemonProcessWin::OnWorkerProcessStopped() { // Reset our IPC remote so it's ready to re-init if the network process is // re-launched. @@ -283,7 +263,7 @@ // Construct the host binary name. base::FilePath host_binary; if (!GetInstalledBinaryPath(kHostBinaryName, &host_binary)) { - Stop(); + Stop(kInitializationFailed); return; } @@ -337,7 +317,7 @@ std::unique_ptr<DaemonProcess> DaemonProcess::Create( scoped_refptr<AutoThreadTaskRunner> caller_task_runner, scoped_refptr<AutoThreadTaskRunner> io_task_runner, - base::OnceClosure stopped_callback) { + StoppedCallback stopped_callback) { auto daemon_process = std::make_unique<DaemonProcessWin>( caller_task_runner, io_task_runner, std::move(stopped_callback)); @@ -353,42 +333,6 @@ return std::move(daemon_process); } -void DaemonProcessWin::DisableAutoStart() { - ScopedScHandle scmanager( - OpenSCManager(nullptr, SERVICES_ACTIVE_DATABASE, - SC_MANAGER_CONNECT | SC_MANAGER_ENUMERATE_SERVICE)); - if (!scmanager.is_valid()) { - PLOG(INFO) << "Failed to connect to the service control manager"; - return; - } - - DWORD desired_access = SERVICE_CHANGE_CONFIG | SERVICE_QUERY_STATUS; - ScopedScHandle service( - OpenService(scmanager.Get(), kWindowsServiceName, desired_access)); - if (!service.is_valid()) { - PLOG(INFO) << "Failed to open to the '" << kWindowsServiceName - << "' service"; - return; - } - - // Change the service start type to 'manual'. All |nullptr| parameters below - // mean that there is no change to the corresponding service parameter. - if (!ChangeServiceConfig(service.Get(), - SERVICE_NO_CHANGE, - SERVICE_DEMAND_START, - SERVICE_NO_CHANGE, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr)) { - PLOG(INFO) << "Failed to change the '" << kWindowsServiceName - << "'service start type to 'manual'"; - } -} - bool DaemonProcessWin::InitializePairingRegistry() { if (!pairing_registry_privileged_key_.Valid()) { if (!OpenPairingRegistry()) {
diff --git a/remoting/host/installer/linux/debian/control b/remoting/host/installer/linux/debian/control index 2bd95d14..d8d10ae4 100644 --- a/remoting/host/installer/linux/debian/control +++ b/remoting/host/installer/linux/debian/control
@@ -12,7 +12,7 @@ Package: chrome-remote-desktop Architecture: any -Depends: adduser, libsystemd0, xvfb, xserver-xorg-video-dummy (>= 1:0.3.8-1), pkexec | policykit-1, xbase-clients, psmisc, python3 (>= 3.5), python3-dbus, python3-packaging, python3-psutil, python3-xdg (>= 0.25), gsettings-desktop-schemas, ${shlibs:Depends}, ${misc:Depends}, ${python3:Depends} +Depends: adduser, gsettings-desktop-schemas, libsystemd0, pkexec | policykit-1, psmisc, python3 (>= 3.5), python3-dbus, python3-packaging, python3-psutil, python3-xdg (>= 0.25), xbase-clients, xdg-utils (>= 1.0.2), xserver-xorg-video-dummy (>= 1:0.3.8-1), xvfb, ${shlibs:Depends}, ${misc:Depends}, ${python3:Depends} Recommends: xserver-xorg-video-dummy (>= 1:0.4.0), pipewire (>= 0.3.53) Suggests: google-chrome-stable | google-chrome-beta | google-chrome-unstable Description: Chrome Remote Desktop Beta
diff --git a/remoting/host/installer/linux/installer.include b/remoting/host/installer/linux/installer.include index 6c74d86..0f7b165 100644 --- a/remoting/host/installer/linux/installer.include +++ b/remoting/host/installer/linux/installer.include
@@ -320,10 +320,6 @@ "${STAGEDIR}/${INSTALLDIR}" done - # desktop integration - install -m 755 "${OUTPUTDIR}/xdg-mime" "${STAGEDIR}${INSTALLDIR}/" - install -m 755 "${OUTPUTDIR}/xdg-settings" "${STAGEDIR}${INSTALLDIR}/" - process_template "${OUTPUTDIR}/installer/common/appdata.xml.template" \ "${STAGEDIR}/usr/share/appdata/${PACKAGE}.appdata.xml" chmod 644 "${STAGEDIR}/usr/share/appdata/${PACKAGE}.appdata.xml"
diff --git a/remoting/host/linux/daemon_process_main.cc b/remoting/host/linux/daemon_process_main.cc index 9b8d257..ebfdab6 100644 --- a/remoting/host/linux/daemon_process_main.cc +++ b/remoting/host/linux/daemon_process_main.cc
@@ -3,36 +3,135 @@ // found in the LICENSE file. #include <functional> +#include <memory> +#include <utility> +#include "base/files/file_util.h" #include "base/functional/bind.h" +#include "base/logging.h" #include "base/memory/scoped_refptr.h" #include "base/run_loop.h" +#include "base/strings/stringprintf.h" #include "base/task/single_thread_task_executor.h" #include "base/task/thread_pool/thread_pool_instance.h" +#include "base/threading/platform_thread.h" +#include "base/time/time.h" +#include "net/base/backoff_entry.h" #include "remoting/base/auto_thread.h" #include "remoting/base/auto_thread_task_runner.h" +#include "remoting/base/logging.h" #include "remoting/host/base/host_exit_codes.h" #include "remoting/host/daemon_process.h" namespace remoting { +namespace { + +const net::BackoffEntry::Policy kBackoffPolicy = { + // Do not ignore initial errors before applying exponential back-off rules. + 0, + + // Initial delay. + 5000, + + // Factor by which the waiting time will be multiplied. + 1.5, + + // Fuzzing percentage. + 0.2, + + // Maximum amount of time (in ms) we are willing to delay our request. + 60000, + + // Never discard an entry. + -1, + + // Always use the initial delay, even before we've seen num_errors_to_ignore + // errors. + true, +}; + +// How long a process must run in order to reset the backoff and failure count. +constexpr base::TimeDelta kMinProcessLifetime = base::Seconds(60); + +// How many transient failures are allowed before the daemon process exits +// permanently. +constexpr int kMaxTransientFailures = 15; + +std::string ExitCodeToString(int exit_code) { + const char* exit_code_string_ptr = ExitCodeToStringUnchecked(exit_code); + return exit_code_string_ptr + ? base::StringPrintf("%s (%d)", exit_code_string_ptr, exit_code) + : base::NumberToString(exit_code); +} + +} // namespace + int DaemonProcessMain() { base::ThreadPoolInstance::CreateAndStartWithDefaultParams("Me2Me daemon"); base::SingleThreadTaskExecutor main_task_executor(base::MessagePumpType::UI); - base::RunLoop run_loop; - auto main_auto_thread_task_runner = - base::MakeRefCounted<AutoThreadTaskRunner>( - main_task_executor.task_runner(), run_loop.QuitClosure()); - auto io_task_runner = AutoThread::CreateWithType( - "I/O thread", main_auto_thread_task_runner, base::MessagePumpType::IO); - std::unique_ptr<DaemonProcess> daemon_process; - daemon_process = DaemonProcess::Create( - main_auto_thread_task_runner, io_task_runner, - base::BindOnce( - [](std::unique_ptr<DaemonProcess>& process) { process.reset(); }, - std::ref(daemon_process))); - run_loop.Run(); - return kSuccessExitCode; + + net::BackoffEntry backoff_entry(&kBackoffPolicy); + + while (true) { + base::RunLoop run_loop; + auto main_auto_thread_task_runner = + base::MakeRefCounted<AutoThreadTaskRunner>( + main_task_executor.task_runner(), run_loop.QuitClosure()); + auto io_task_runner = AutoThread::CreateWithType( + "I/O thread", main_auto_thread_task_runner, base::MessagePumpType::IO); + std::unique_ptr<DaemonProcess> daemon_process; + int daemon_exit_code = kSuccessExitCode; + + base::TimeTicks launch_time = base::TimeTicks::Now(); + + daemon_process = DaemonProcess::Create( + // Move task runners so that we don't hold a strong reference to + // `main_auto_thread_task_runner`, which would prevent `run_loop` from + // quitting. + std::move(main_auto_thread_task_runner), std::move(io_task_runner), + base::BindOnce( + [](std::unique_ptr<DaemonProcess>& process, int* exit_code_ptr, + int exit_code) { + *exit_code_ptr = exit_code; + process.reset(); + }, + std::ref(daemon_process), &daemon_exit_code)); + run_loop.Run(); + + std::string exit_code_string = ExitCodeToString(daemon_exit_code); + + if (daemon_exit_code == kInvalidHostIdExitCode || + daemon_exit_code == kHostDeletedExitCode) { + HOST_LOG << "Host no longer exists. Exit code: " << exit_code_string + << ". Deleting host config file."; + base::DeleteFile(DaemonProcess::GetConfigPath()); + return daemon_exit_code; + } + if (daemon_exit_code >= kMinPermanentErrorExitCode && + daemon_exit_code <= kMaxPermanentErrorExitCode) { + LOG(ERROR) << "Host reported permanent error: " << exit_code_string + << ". Exiting."; + return daemon_exit_code; + } + LOG(WARNING) << "Host reported error: " << exit_code_string; + + if (base::TimeTicks::Now() - launch_time >= kMinProcessLifetime) { + backoff_entry.Reset(); + } + + backoff_entry.InformOfRequest(false); + + if (backoff_entry.failure_count() > kMaxTransientFailures) { + LOG(ERROR) << "Too many launch failures (" + << backoff_entry.failure_count() << "), exiting."; + return daemon_exit_code; + } + + base::TimeDelta backoff = backoff_entry.GetTimeUntilRelease(); + HOST_LOG << "Waiting " << backoff << " before relaunching."; + base::PlatformThread::Sleep(backoff); + } } } // namespace remoting
diff --git a/remoting/host/win/host_service.cc b/remoting/host/win/host_service.cc index af144fdc..8d382da 100644 --- a/remoting/host/win/host_service.cc +++ b/remoting/host/win/host_service.cc
@@ -63,6 +63,36 @@ SDDL_SACL L":" SDDL_ACE(SDDL_MANDATORY_LABEL, SDDL_NO_EXECUTE_UP, SDDL_ML_MEDIUM); +// Changes the service start type to 'manual'. +void DisableAutoStart() { + ScopedScHandle scmanager( + OpenSCManager(nullptr, SERVICES_ACTIVE_DATABASE, + SC_MANAGER_CONNECT | SC_MANAGER_ENUMERATE_SERVICE)); + if (!scmanager.is_valid()) { + PLOG(INFO) << "Failed to connect to the service control manager"; + return; + } + + DWORD desired_access = SERVICE_CHANGE_CONFIG | SERVICE_QUERY_STATUS; + ScopedScHandle service( + OpenService(scmanager.Get(), kWindowsServiceName, desired_access)); + if (!service.is_valid()) { + PLOG(INFO) << "Failed to open to the '" << kWindowsServiceName + << "' service"; + return; + } + + // Change the service start type to 'manual'. All |nullptr| parameters below + // mean that there is no change to the corresponding service parameter. + if (!ChangeServiceConfig(service.Get(), SERVICE_NO_CHANGE, + SERVICE_DEMAND_START, SERVICE_NO_CHANGE, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr)) { + PLOG(INFO) << "Failed to change the '" << kWindowsServiceName + << "'service start type to 'manual'"; + } +} + } // namespace HostService* HostService::GetInstance() { @@ -373,9 +403,18 @@ return result; } -void HostService::StopDaemonProcess() { +void HostService::StopDaemonProcess(int exit_code) { DCHECK(main_task_runner_->BelongsToCurrentThread()); + // Both kInvalidHostIdExitCode and kInvalidOAuthCredentialsExitCode are + // errors that will never go away with the current config. + // Disabling automatic service start until the host is re-enabled and config + // updated. + if (exit_code == kInvalidHostIdExitCode || + exit_code == kInvalidOAuthCredentialsExitCode) { + DisableAutoStart(); + } + daemon_process_.reset(); } @@ -402,8 +441,8 @@ case CTRL_LOGOFF_EVENT: case CTRL_SHUTDOWN_EVENT: self->main_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&HostService::StopDaemonProcess, self->weak_ptr_)); + FROM_HERE, base::BindOnce(&HostService::StopDaemonProcess, + self->weak_ptr_, kSuccessExitCode)); return TRUE; default: @@ -424,8 +463,8 @@ case SERVICE_CONTROL_SHUTDOWN: case SERVICE_CONTROL_STOP: self->main_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&HostService::StopDaemonProcess, self->weak_ptr_)); + FROM_HERE, base::BindOnce(&HostService::StopDaemonProcess, + self->weak_ptr_, kSuccessExitCode)); return NO_ERROR; case SERVICE_CONTROL_SESSIONCHANGE:
diff --git a/remoting/host/win/host_service.h b/remoting/host/win/host_service.h index 5fb698b..287d1488 100644 --- a/remoting/host/win/host_service.h +++ b/remoting/host/win/host_service.h
@@ -72,7 +72,7 @@ int RunInConsole(); // Stops and deletes |daemon_process_|. - void StopDaemonProcess(); + void StopDaemonProcess(int exit_code); // Handles WM_WTSSESSION_CHANGE messages. bool HandleMessage(UINT message,
diff --git a/services/network/network_context_unittest.cc b/services/network/network_context_unittest.cc index 8a77bcd..e6f532b 100644 --- a/services/network/network_context_unittest.cc +++ b/services/network/network_context_unittest.cc
@@ -9688,11 +9688,11 @@ { base::RunLoop run_loop; const std::string test_origin = test_server.GetOrigin("a.test").Serialize(); - const std::string key_commitment = - base::ReplaceStringPlaceholders(R"( {"$1": { "PrivateStateTokenV3PMB": { - "protocol_version": "PrivateStateTokenV3PMB", "id": 1, + const std::string key_commitment = base::ReplaceStringPlaceholders( + R"( {"$1": { "PrivateStateTokenV1VOPRF": { + "protocol_version": "PrivateStateTokenV1VOPRF", "id": 1, "batchsize": 5 } } } )", - {test_origin}, /*offsets=*/nullptr); + {test_origin}, /*offsets=*/nullptr); network_service_->SetTrustTokenKeyCommitments( key_commitment, base::BindLambdaForTesting([&run_loop]() { run_loop.Quit(); })); @@ -9764,11 +9764,11 @@ { base::RunLoop run_loop; const std::string test_origin = test_server.GetOrigin("a.test").Serialize(); - const std::string key_commitment = - base::ReplaceStringPlaceholders(R"( {"$1": { "PrivateStateTokenV3PMB": { - "protocol_version": "PrivateStateTokenV3PMB", "id": 1, + const std::string key_commitment = base::ReplaceStringPlaceholders( + R"( {"$1": { "PrivateStateTokenV1VOPRF": { + "protocol_version": "PrivateStateTokenV1VOPRF", "id": 1, "batchsize": 5 } } } )", - {test_origin}, /*offsets=*/nullptr); + {test_origin}, /*offsets=*/nullptr); network_service_->SetTrustTokenKeyCommitments( key_commitment, base::BindLambdaForTesting([&run_loop]() { run_loop.Quit(); }));
diff --git a/services/network/network_service_unittest.cc b/services/network/network_service_unittest.cc index dab4c0f..ee8be6c 100644 --- a/services/network/network_service_unittest.cc +++ b/services/network/network_service_unittest.cc
@@ -1634,14 +1634,14 @@ auto expectation = mojom::TrustTokenKeyCommitmentResult::New(); expectation->protocol_version = - mojom::TrustTokenProtocolVersion::kTrustTokenV3Pmb; + mojom::TrustTokenProtocolVersion::kPrivateStateTokenV1Voprf; expectation->id = 1; expectation->batch_size = 5; base::RunLoop run_loop; network_service_->SetTrustTokenKeyCommitments( - R"( { "https://issuer.example": { "PrivateStateTokenV3PMB": { - "protocol_version": "PrivateStateTokenV3PMB", "id": 1, + R"( { "https://issuer.example": { "PrivateStateTokenV1VOPRF": { + "protocol_version": "PrivateStateTokenV1VOPRF", "id": 1, "batchsize": 5 } } } )", run_loop.QuitClosure()); run_loop.Run();
diff --git a/services/network/public/cpp/network_isolation_partition_mojom_traits.cc b/services/network/public/cpp/network_isolation_partition_mojom_traits.cc index 985d5bd2..a477e49 100644 --- a/services/network/public/cpp/network_isolation_partition_mojom_traits.cc +++ b/services/network/public/cpp/network_isolation_partition_mojom_traits.cc
@@ -27,6 +27,9 @@ case NetworkIsolationPartition::kFedCmUncredentialedRequests: *out = net::NetworkIsolationPartition::kFedCmUncredentialedRequests; return true; + case NetworkIsolationPartition::kDnsOverHttps: + *out = net::NetworkIsolationPartition::kDnsOverHttps; + return true; } return false; } @@ -44,6 +47,8 @@ return NetworkIsolationPartition::kProtectedAudienceSellerWorklet; case net::NetworkIsolationPartition::kFedCmUncredentialedRequests: return NetworkIsolationPartition::kFedCmUncredentialedRequests; + case net::NetworkIsolationPartition::kDnsOverHttps: + return NetworkIsolationPartition::kDnsOverHttps; } NOTREACHED(); }
diff --git a/services/network/public/mojom/network_isolation_partition.mojom b/services/network/public/mojom/network_isolation_partition.mojom index 301b42c..815fd33f 100644 --- a/services/network/public/mojom/network_isolation_partition.mojom +++ b/services/network/public/mojom/network_isolation_partition.mojom
@@ -10,4 +10,5 @@ kGeneral, kProtectedAudienceSellerWorklet, kFedCmUncredentialedRequests, + kDnsOverHttps, };
diff --git a/services/on_device_model/ml/on_device_model_executor.cc b/services/on_device_model/ml/on_device_model_executor.cc index 1be5a70d..e60587f5 100644 --- a/services/on_device_model/ml/on_device_model_executor.cc +++ b/services/on_device_model/ml/on_device_model_executor.cc
@@ -148,6 +148,8 @@ } ~Responder() { Cancel(); } + const perfetto::Track& perfetto_id() { return perfetto_id_; } + ChromeMLCancelFn* GetCancelFn() { return &cancel_; } // Converts tool calls from the ChromeML C API output to Mojo and posts @@ -248,6 +250,8 @@ num_output_tokens_++; output_so_far_ += *text; if (first_token_time_ == base::TimeTicks()) { + // Ends the `TTFT` trace. + TRACE_EVENT_END("optimization_guide", perfetto_id()); first_token_time_ = base::TimeTicks::Now(); } @@ -255,6 +259,9 @@ chunk->text = *text; responder_->OnResponse(std::move(chunk)); } else if (session_) { + // Ends the `Decode` trace. + TRACE_EVENT_END("optimization_guide", perfetto_id()); + // Empty text means the output is finished. Delete the session immediately // to free up any resources. session_ = nullptr; @@ -291,6 +298,7 @@ } } + perfetto::Track perfetto_id_{reinterpret_cast<uintptr_t>(this)}; base::ElapsedTimer timer_; base::TimeTicks first_token_time_; int num_output_tokens_ = 0; @@ -370,6 +378,8 @@ } } + const perfetto::Track& perfetto_id() { return perfetto_id_; } + ChromeMLCancelFn* GetCancelFn() { return &cancel_; } ChromeMLContextSavedFn CreateContextSavedFn() { @@ -382,6 +392,8 @@ private: void OnComplete(int tokens_processed) { + // Ends the `Prefill` trace. + TRACE_EVENT_END("optimization_guide", perfetto_id()); TRACE_EVENT("optimization_guide", "ContextHolder::OnComplete"); if (tokens_processed > 0) { base::UmaHistogramCounts10000("OnDeviceModel.TokenCount.Context", @@ -407,6 +419,7 @@ // this may be deleted. } + perfetto::Track perfetto_id_{reinterpret_cast<uintptr_t>(this)}; base::ElapsedTimer timer_; mojo::Remote<on_device_model::mojom::ContextClient> client_; base::OnceCallback<void(ContextHolder*)> on_disconnect_; @@ -525,10 +538,15 @@ if (options->max_tokens == 0 || options->max_tokens > max_tokens_) { options->max_tokens = max_tokens_; } + ChromeMLContextSavedFn context_saved_fn = context_holder->CreateContextSavedFn(); - *context_holder->GetCancelFn() = - session_->Append(std::move(options), context_saved_fn); + + TRACE_EVENT_BEGIN("optimization_guide", "Prefill", + context_holder->perfetto_id()); + *context_holder->GetCancelFn() = session_->Append( + context_holder->perfetto_id(), std::move(options), context_saved_fn); + context_holders_.insert(std::move(context_holder)); } @@ -555,14 +573,18 @@ on_tool_calls_emitted = base::BindRepeating( [](bool* flag) { *flag = true; }, &awaiting_tool_responses_); } + responder_ = std::make_unique<Responder>( std::move(response), std::move(on_complete), std::move(cloned), std::move(on_tool_calls_emitted)); + + TRACE_EVENT_BEGIN("optimization_guide", "Decode", responder_->perfetto_id()); + TRACE_EVENT_BEGIN("optimization_guide", "TTFT", responder_->perfetto_id()); ChromeMLExecutionOutputFn output_fn = responder_->CreateOutputFn(); *responder_->GetCancelFn() = cloned_raw->Generate( - std::move(options), executor_->GetConstraintFactory(), - model_response_prefix_, output_fn); + responder_->perfetto_id(), std::move(options), + executor_->GetConstraintFactory(), model_response_prefix_, output_fn); } DISABLE_CFI_DLSYM
diff --git a/services/on_device_model/ml/session_accessor.cc b/services/on_device_model/ml/session_accessor.cc index bb166b76..cd71ec9 100644 --- a/services/on_device_model/ml/session_accessor.cc +++ b/services/on_device_model/ml/session_accessor.cc
@@ -132,20 +132,25 @@ } ChromeMLCancelFn SessionAccessor::Append( + const perfetto::Track& perfetto_id, on_device_model::mojom::AppendOptionsPtr options, ChromeMLContextSavedFn context_saved_fn) { TRACE_EVENT("optimization_guide", "SessionAccessor::Append"); DCHECK(context_saved_fn); auto canceler = base::MakeRefCounted<Canceler>(chrome_ml_.get(), task_runner_); + + TRACE_EVENT_BEGIN("optimization_guide", "Queued", perfetto_id); task_runner_->PostTask( - FROM_HERE, base::BindOnce(&SessionAccessor::AppendInternal, - base::Unretained(this), std::move(options), - std::move(context_saved_fn), canceler)); + FROM_HERE, + base::BindOnce(&SessionAccessor::AppendInternal, base::Unretained(this), + perfetto_id, std::move(options), + std::move(context_saved_fn), canceler)); return [canceler] { canceler->Cancel(); }; } ChromeMLCancelFn SessionAccessor::Generate( + const perfetto::Track& perfetto_id, on_device_model::mojom::GenerateOptionsPtr options, ConstraintFactory* constraint_factory, const std::optional<std::string>& model_response_prefix, @@ -154,12 +159,15 @@ DCHECK(output_fn); auto canceler = base::MakeRefCounted<Canceler>(chrome_ml_.get(), task_runner_); + + TRACE_EVENT_BEGIN("optimization_guide", "Queued", perfetto_id); task_runner_->PostTask( FROM_HERE, base::BindOnce(&SessionAccessor::GenerateInternal, base::Unretained(this), + perfetto_id, std::move(options), // Unretained safe since `constrained_factory` is deleted // on the sequence. - std::move(options), base::Unretained(constraint_factory), + base::Unretained(constraint_factory), model_response_prefix, std::move(output_fn), canceler)); return [canceler] { canceler->Cancel(); }; } @@ -265,9 +273,12 @@ DISABLE_CFI_DLSYM void SessionAccessor::AppendInternal( + perfetto::Track perfetto_id, on_device_model::mojom::AppendOptionsPtr append_options, ChromeMLContextSavedFn context_saved_fn, scoped_refptr<Canceler> canceler) { + // Ends the `Queued` trace. + TRACE_EVENT_END("optimization_guide", perfetto_id); TRACE_EVENT("optimization_guide", "SessionAccessor::AppendInternal"); DCHECK(task_runner_->RunsTasksInCurrentSequence()); @@ -297,11 +308,14 @@ DISABLE_CFI_DLSYM void SessionAccessor::GenerateInternal( + perfetto::Track perfetto_id, on_device_model::mojom::GenerateOptionsPtr generate_options, ConstraintFactory* constraint_factory, std::optional<std::string> model_response_prefix, ChromeMLExecutionOutputFn output_fn, scoped_refptr<Canceler> canceler) { + // Ends the `Queued` trace. + TRACE_EVENT_END("optimization_guide", perfetto_id); TRACE_EVENT("optimization_guide", "SessionAccessor::GenerateInternal"); DCHECK(task_runner_->RunsTasksInCurrentSequence()); ChromeMLConstraint constraint = 0;
diff --git a/services/on_device_model/ml/session_accessor.h b/services/on_device_model/ml/session_accessor.h index d02533f..e92c2475 100644 --- a/services/on_device_model/ml/session_accessor.h +++ b/services/on_device_model/ml/session_accessor.h
@@ -12,6 +12,7 @@ #include "base/files/file.h" #include "base/memory/scoped_refptr.h" #include "base/task/sequenced_task_runner.h" +#include "base/trace_event/trace_event.h" #include "services/on_device_model/ml/chrome_ml.h" #include "services/on_device_model/ml/constraint_factory.h" #include "services/on_device_model/public/mojom/on_device_model.mojom.h" @@ -37,9 +38,11 @@ // These methods forward to the relevant ChromeMLSession methods on the task // runner. Ptr Clone(); - ChromeMLCancelFn Append(on_device_model::mojom::AppendOptionsPtr options, + ChromeMLCancelFn Append(const perfetto::Track& perfetto_id, + on_device_model::mojom::AppendOptionsPtr options, ChromeMLContextSavedFn context_saved_fn); ChromeMLCancelFn Generate( + const perfetto::Track& perfetto_id, on_device_model::mojom::GenerateOptionsPtr options, ConstraintFactory* constraint_factory, const std::optional<std::string>& model_response_prefix, @@ -65,10 +68,12 @@ on_device_model::mojom::SessionParamsPtr params, on_device_model::mojom::LoadAdaptationParamsPtr adaptation_params, std::optional<uint32_t> adaptation_id); - void AppendInternal(on_device_model::mojom::AppendOptionsPtr append_options, + void AppendInternal(perfetto::Track perfetto_id, + on_device_model::mojom::AppendOptionsPtr append_options, ChromeMLContextSavedFn context_saved_fn, scoped_refptr<Canceler> canceler); void GenerateInternal( + perfetto::Track perfetto_id, on_device_model::mojom::GenerateOptionsPtr generate_options, ConstraintFactory* constraint_factory, std::optional<std::string> model_response_prefix,
diff --git a/services/webnn/tflite/context_impl_litert.cc b/services/webnn/tflite/context_impl_litert.cc index b9ff2168..652d01cd 100644 --- a/services/webnn/tflite/context_impl_litert.cc +++ b/services/webnn/tflite/context_impl_litert.cc
@@ -155,5 +155,6 @@ std::string_view ContextImplLiteRt::GetBackendName() const { return "LiteRT"; +} } // namespace webnn::litert
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 5d082fb4..01a22ada 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -183,12 +183,32 @@ "name": "ContentAnnotatorEnabledFullAnnotationDisabled", "params": { "content_annotator_classifier_relevance_values": "{\"ShoppingCart\":2}", + "content_annotator_classifier_semantic_match_rules": "{\"ShoppingCart\":[\"Shopping Cart\", \"Cart\", \"Shopping Bag\"]}", "content_annotator_classifier_title_keyword_rules": "{\"ShoppingCart\":[\"\\\\\\\\bcart\\\\\\\\b\",\"\\\\\\\\bbag\\\\\\\\b\",\"\\\\\\\\bbasket\\\\\\\\b\",\"\\\\\\\\bpac\\\\\\\\b\"]}", "content_annotator_classifier_url_match_rules": "{\"ShoppingCart\":[\".*/cart(?:[/?#].*|$)\",\".*/bag(?:[/?#].*|$)\",\".*/basket(?:[/?#].*|$)\",\".*/pac(?:[/?#].*|$)\"]}" }, "enable_features": [ "ContentAnnotator" ] + }, + { + "name": "ContentAnnotatorEnabledFullInnerTextAnnotation", + "params": { + "content_annotator_classifier_relevance_values": "{\"ShoppingCart\":2}", + "content_annotator_classifier_semantic_match_rules": "{\"ShoppingCart\":[\"Shopping Cart\", \"Cart\", \"Shopping Bag\"]}", + "content_annotator_classifier_title_keyword_rules": "{\"ShoppingCart\":[\"\\\\\\\\bcart\\\\\\\\b\",\"\\\\\\\\bbag\\\\\\\\b\",\"\\\\\\\\bbasket\\\\\\\\b\",\"\\\\\\\\bpac\\\\\\\\b\"]}", + "content_annotator_classifier_url_match_rules": "{\"ShoppingCart\":[\".*/cart(?:[/?#].*|$)\",\".*/bag(?:[/?#].*|$)\",\".*/basket(?:[/?#].*|$)\",\".*/pac(?:[/?#].*|$)\"]}", + "content_annotator_enable_full_annotation": "true" + }, + "enable_features": [ + "ContentAnnotator" + ] + }, + { + "name": "Control", + "disable_features": [ + "ContentAnnotator" + ] } ] } @@ -10619,6 +10639,23 @@ ] } ], + "GlicClientZoomControl": [ + { + "platforms": [ + "chromeos", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "GlicClientZoomControl" + ] + } + ] + } + ], "GlicConfirmNavigationToNewOrigins": [ { "platforms": [ @@ -12968,8 +13005,6 @@ { "name": "Enabled", "enable_features": [ - "TabGroupInOverflowMenu", - "TabGroupInTabIconContextMenu", "TabRecallNewTabGroupButton", "TabSwitcherOverflowMenu" ]
diff --git a/third_party/androidx/BUILD.gn b/third_party/androidx/BUILD.gn index 7043bf5..7366a9cc 100644 --- a/third_party/androidx/BUILD.gn +++ b/third_party/androidx/BUILD.gn
@@ -2403,6 +2403,7 @@ ":androidx_lifecycle_lifecycle_common_java", ":androidx_lifecycle_lifecycle_runtime_java", ":androidx_test_core_java", + ":androidx_test_espresso_espresso_core_java", ":androidx_test_ext_junit_java", ":androidx_test_monitor_java", "//third_party/android_deps:org_jetbrains_kotlinx_kotlinx_coroutines_core_java",
diff --git a/third_party/androidx/build.gradle b/third_party/androidx/build.gradle index 5163d676..d922987 100644 --- a/third_party/androidx/build.gradle +++ b/third_party/androidx/build.gradle
@@ -341,7 +341,7 @@ google() maven { // This URL is generated by the fetch_all_androidx.py script. - url 'https://androidx.dev/snapshots/builds/15059470/artifacts/repository' + url 'https://androidx.dev/snapshots/builds/15060837/artifacts/repository' } mavenCentral() }
diff --git a/third_party/androidx/committed/libs/androidx_activity_activity/README.chromium b/third_party/androidx/committed/libs/androidx_activity_activity/README.chromium index c3f277b..567e067 100644 --- a/third_party/androidx/committed/libs/androidx_activity_activity/README.chromium +++ b/third_party/androidx/committed/libs/androidx_activity_activity/README.chromium
@@ -1,6 +1,6 @@ Name: Activity Short Name: activity -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/activity/activity/1.14.0-SNAPSHOT/activity-1.14.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/activity/activity/1.14.0-SNAPSHOT/activity-1.14.0-20260320.125622-1.aar Version: 1.14.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_activity_activity_compose/README.chromium b/third_party/androidx/committed/libs/androidx_activity_activity_compose/README.chromium index e9f1706..f91c87f 100644 --- a/third_party/androidx/committed/libs/androidx_activity_activity_compose/README.chromium +++ b/third_party/androidx/committed/libs/androidx_activity_activity_compose/README.chromium
@@ -1,6 +1,6 @@ Name: Activity Compose Short Name: activity-compose -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/activity/activity-compose/1.14.0-SNAPSHOT/activity-compose-1.14.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/activity/activity-compose/1.14.0-SNAPSHOT/activity-compose-1.14.0-20260320.125622-1.aar Version: 1.14.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_activity_activity_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_activity_activity_ktx/README.chromium index ff433af1..b04c8984a1 100644 --- a/third_party/androidx/committed/libs/androidx_activity_activity_ktx/README.chromium +++ b/third_party/androidx/committed/libs/androidx_activity_activity_ktx/README.chromium
@@ -1,6 +1,6 @@ Name: Activity Kotlin Extensions Short Name: activity-ktx -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/activity/activity-ktx/1.14.0-SNAPSHOT/activity-ktx-1.14.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/activity/activity-ktx/1.14.0-SNAPSHOT/activity-ktx-1.14.0-20260320.125622-1.aar Version: 1.14.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_annotation_annotation_experimental/README.chromium b/third_party/androidx/committed/libs/androidx_annotation_annotation_experimental/README.chromium index d8b7e47..2b29cf6 100644 --- a/third_party/androidx/committed/libs/androidx_annotation_annotation_experimental/README.chromium +++ b/third_party/androidx/committed/libs/androidx_annotation_annotation_experimental/README.chromium
@@ -1,6 +1,6 @@ Name: Experimental annotation Short Name: annotation-experimental -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/annotation/annotation-experimental/1.6.0-SNAPSHOT/annotation-experimental-1.6.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/annotation/annotation-experimental/1.6.0-SNAPSHOT/annotation-experimental-1.6.0-20260320.125622-1.aar Version: 1.6.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_annotation_annotation_jvm/README.chromium b/third_party/androidx/committed/libs/androidx_annotation_annotation_jvm/README.chromium index 3d44cf6..a9fa1c6 100644 --- a/third_party/androidx/committed/libs/androidx_annotation_annotation_jvm/README.chromium +++ b/third_party/androidx/committed/libs/androidx_annotation_annotation_jvm/README.chromium
@@ -1,6 +1,6 @@ Name: Annotation Short Name: annotation-jvm -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/annotation/annotation-jvm/1.10.0-SNAPSHOT/annotation-jvm-1.10.0-20260320.055805-1.jar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/annotation/annotation-jvm/1.10.0-SNAPSHOT/annotation-jvm-1.10.0-20260320.125622-1.jar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_appcompat_appcompat/README.chromium b/third_party/androidx/committed/libs/androidx_appcompat_appcompat/README.chromium index 9df3d5e..a35a5c4b 100644 --- a/third_party/androidx/committed/libs/androidx_appcompat_appcompat/README.chromium +++ b/third_party/androidx/committed/libs/androidx_appcompat_appcompat/README.chromium
@@ -1,6 +1,6 @@ Name: AppCompat Short Name: appcompat -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/appcompat/appcompat/1.8.0-SNAPSHOT/appcompat-1.8.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/appcompat/appcompat/1.8.0-SNAPSHOT/appcompat-1.8.0-20260320.125622-1.aar Version: 1.8.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_appcompat_appcompat_resources/README.chromium b/third_party/androidx/committed/libs/androidx_appcompat_appcompat_resources/README.chromium index 65029dfe..ad1c131 100644 --- a/third_party/androidx/committed/libs/androidx_appcompat_appcompat_resources/README.chromium +++ b/third_party/androidx/committed/libs/androidx_appcompat_appcompat_resources/README.chromium
@@ -1,6 +1,6 @@ Name: AppCompat Resources Short Name: appcompat-resources -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/appcompat/appcompat-resources/1.8.0-SNAPSHOT/appcompat-resources-1.8.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/appcompat/appcompat-resources/1.8.0-SNAPSHOT/appcompat-resources-1.8.0-20260320.125622-1.aar Version: 1.8.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_appsearch_appsearch/README.chromium b/third_party/androidx/committed/libs/androidx_appsearch_appsearch/README.chromium index ccb79521..6135006d 100644 --- a/third_party/androidx/committed/libs/androidx_appsearch_appsearch/README.chromium +++ b/third_party/androidx/committed/libs/androidx_appsearch_appsearch/README.chromium
@@ -1,6 +1,6 @@ Name: AppSearch Short Name: appsearch -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/appsearch/appsearch/1.2.0-SNAPSHOT/appsearch-1.2.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/appsearch/appsearch/1.2.0-SNAPSHOT/appsearch-1.2.0-20260320.125622-1.aar Version: 1.2.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_appsearch_appsearch_builtin_types/README.chromium b/third_party/androidx/committed/libs/androidx_appsearch_appsearch_builtin_types/README.chromium index 51d1668..ae3b9c5 100644 --- a/third_party/androidx/committed/libs/androidx_appsearch_appsearch_builtin_types/README.chromium +++ b/third_party/androidx/committed/libs/androidx_appsearch_appsearch_builtin_types/README.chromium
@@ -1,6 +1,6 @@ Name: AppSearch Builtin Types Short Name: appsearch-builtin-types -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/appsearch/appsearch-builtin-types/1.2.0-SNAPSHOT/appsearch-builtin-types-1.2.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/appsearch/appsearch-builtin-types/1.2.0-SNAPSHOT/appsearch-builtin-types-1.2.0-20260320.125622-1.aar Version: 1.2.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_appsearch_appsearch_platform_storage/README.chromium b/third_party/androidx/committed/libs/androidx_appsearch_appsearch_platform_storage/README.chromium index 2e001ac97..72f5ac32d 100644 --- a/third_party/androidx/committed/libs/androidx_appsearch_appsearch_platform_storage/README.chromium +++ b/third_party/androidx/committed/libs/androidx_appsearch_appsearch_platform_storage/README.chromium
@@ -1,6 +1,6 @@ Name: AppSearch Platform Storage Short Name: appsearch-platform-storage -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/appsearch/appsearch-platform-storage/1.2.0-SNAPSHOT/appsearch-platform-storage-1.2.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/appsearch/appsearch-platform-storage/1.2.0-SNAPSHOT/appsearch-platform-storage-1.2.0-20260320.125622-1.aar Version: 1.2.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_arch_core_core_common/README.chromium b/third_party/androidx/committed/libs/androidx_arch_core_core_common/README.chromium index b3414cc..d4bb172b 100644 --- a/third_party/androidx/committed/libs/androidx_arch_core_core_common/README.chromium +++ b/third_party/androidx/committed/libs/androidx_arch_core_core_common/README.chromium
@@ -1,6 +1,6 @@ Name: Arch-Common Short Name: core-common -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/arch/core/core-common/2.3.0-SNAPSHOT/core-common-2.3.0-20260320.055805-1.jar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/arch/core/core-common/2.3.0-SNAPSHOT/core-common-2.3.0-20260320.125622-1.jar Version: 2.3.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_arch_core_core_runtime/README.chromium b/third_party/androidx/committed/libs/androidx_arch_core_core_runtime/README.chromium index 37729fe..4075436 100644 --- a/third_party/androidx/committed/libs/androidx_arch_core_core_runtime/README.chromium +++ b/third_party/androidx/committed/libs/androidx_arch_core_core_runtime/README.chromium
@@ -1,6 +1,6 @@ Name: Arch-Runtime Short Name: core-runtime -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/arch/core/core-runtime/2.3.0-SNAPSHOT/core-runtime-2.3.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/arch/core/core-runtime/2.3.0-SNAPSHOT/core-runtime-2.3.0-20260320.125622-1.aar Version: 2.3.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_autofill_autofill/README.chromium b/third_party/androidx/committed/libs/androidx_autofill_autofill/README.chromium index 3badab6..3988a52 100644 --- a/third_party/androidx/committed/libs/androidx_autofill_autofill/README.chromium +++ b/third_party/androidx/committed/libs/androidx_autofill_autofill/README.chromium
@@ -1,6 +1,6 @@ Name: Autofill Short Name: autofill -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/autofill/autofill/1.4.0-SNAPSHOT/autofill-1.4.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/autofill/autofill/1.4.0-SNAPSHOT/autofill-1.4.0-20260320.125622-1.aar Version: 1.4.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_common/README.chromium b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_common/README.chromium index 06e4506d6..56d84b86 100644 --- a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_common/README.chromium +++ b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_common/README.chromium
@@ -1,6 +1,6 @@ Name: Benchmark - Common Short Name: benchmark-common -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/benchmark/benchmark-common/1.5.0-SNAPSHOT/benchmark-common-1.5.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/benchmark/benchmark-common/1.5.0-SNAPSHOT/benchmark-common-1.5.0-20260320.125622-1.aar Version: 1.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_junit4/README.chromium b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_junit4/README.chromium index 2a1c0bc..8b2d4d4b 100644 --- a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_junit4/README.chromium +++ b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_junit4/README.chromium
@@ -1,6 +1,6 @@ Name: Benchmark - JUnit4 Short Name: benchmark-junit4 -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/benchmark/benchmark-junit4/1.5.0-SNAPSHOT/benchmark-junit4-1.5.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/benchmark/benchmark-junit4/1.5.0-SNAPSHOT/benchmark-junit4-1.5.0-20260320.125622-1.aar Version: 1.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro/README.chromium b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro/README.chromium index 1feebcb..d927de62 100644 --- a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro/README.chromium +++ b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro/README.chromium
@@ -1,6 +1,6 @@ Name: Benchmark - Macrobenchmark Short Name: benchmark-macro -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/benchmark/benchmark-macro/1.5.0-SNAPSHOT/benchmark-macro-1.5.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/benchmark/benchmark-macro/1.5.0-SNAPSHOT/benchmark-macro-1.5.0-20260320.125622-1.aar Version: 1.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro_junit4/README.chromium b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro_junit4/README.chromium index d6d8203c..214b487 100644 --- a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro_junit4/README.chromium +++ b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro_junit4/README.chromium
@@ -1,6 +1,6 @@ Name: Benchmark - Macrobenchmark JUnit4 Short Name: benchmark-macro-junit4 -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/benchmark/benchmark-macro-junit4/1.5.0-SNAPSHOT/benchmark-macro-junit4-1.5.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/benchmark/benchmark-macro-junit4/1.5.0-SNAPSHOT/benchmark-macro-junit4-1.5.0-20260320.125622-1.aar Version: 1.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_traceprocessor_android/README.chromium b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_traceprocessor_android/README.chromium index 32291bbd..fb988b3 100644 --- a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_traceprocessor_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_traceprocessor_android/README.chromium
@@ -1,6 +1,6 @@ Name: Benchmark TraceProcessor Short Name: benchmark-traceprocessor-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/benchmark/benchmark-traceprocessor-android/1.5.0-SNAPSHOT/benchmark-traceprocessor-android-1.5.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/benchmark/benchmark-traceprocessor-android/1.5.0-SNAPSHOT/benchmark-traceprocessor-android-1.5.0-20260320.125622-1.aar Version: 1.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_biometric_biometric/README.chromium b/third_party/androidx/committed/libs/androidx_biometric_biometric/README.chromium index d5b002d..b4c8984b 100644 --- a/third_party/androidx/committed/libs/androidx_biometric_biometric/README.chromium +++ b/third_party/androidx/committed/libs/androidx_biometric_biometric/README.chromium
@@ -1,6 +1,6 @@ Name: Biometric Short Name: biometric -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/biometric/biometric/1.4.0-SNAPSHOT/biometric-1.4.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/biometric/biometric/1.4.0-SNAPSHOT/biometric-1.4.0-20260320.125622-1.aar Version: 1.4.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_browser_browser/README.chromium b/third_party/androidx/committed/libs/androidx_browser_browser/README.chromium index 5cd1d3d8..62d2baa6 100644 --- a/third_party/androidx/committed/libs/androidx_browser_browser/README.chromium +++ b/third_party/androidx/committed/libs/androidx_browser_browser/README.chromium
@@ -1,6 +1,6 @@ Name: Browser Short Name: browser -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/browser/browser/1.10.0-SNAPSHOT/browser-1.10.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/browser/browser/1.10.0-SNAPSHOT/browser-1.10.0-20260320.125622-1.aar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_cardview_cardview/README.chromium b/third_party/androidx/committed/libs/androidx_cardview_cardview/README.chromium index 9146da1..f463007 100644 --- a/third_party/androidx/committed/libs/androidx_cardview_cardview/README.chromium +++ b/third_party/androidx/committed/libs/androidx_cardview_cardview/README.chromium
@@ -1,6 +1,6 @@ Name: CardView Short Name: cardview -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/cardview/cardview/1.1.0-SNAPSHOT/cardview-1.1.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/cardview/cardview/1.1.0-SNAPSHOT/cardview-1.1.0-20260320.125622-1.aar Version: 1.1.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_collection_collection_jvm/README.chromium b/third_party/androidx/committed/libs/androidx_collection_collection_jvm/README.chromium index 1ea1b51..b0d51d0 100644 --- a/third_party/androidx/committed/libs/androidx_collection_collection_jvm/README.chromium +++ b/third_party/androidx/committed/libs/androidx_collection_collection_jvm/README.chromium
@@ -1,6 +1,6 @@ Name: collections Short Name: collection-jvm -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/collection/collection-jvm/1.7.0-SNAPSHOT/collection-jvm-1.7.0-20260320.055805-1.jar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/collection/collection-jvm/1.7.0-SNAPSHOT/collection-jvm-1.7.0-20260320.125622-1.jar Version: 1.7.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_collection_collection_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_collection_collection_ktx/README.chromium index 220c9aaa..9bfb300 100644 --- a/third_party/androidx/committed/libs/androidx_collection_collection_ktx/README.chromium +++ b/third_party/androidx/committed/libs/androidx_collection_collection_ktx/README.chromium
@@ -1,6 +1,6 @@ Name: Collections Kotlin Extensions Short Name: collection-ktx -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/collection/collection-ktx/1.7.0-SNAPSHOT/collection-ktx-1.7.0-20260320.055805-1.jar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/collection/collection-ktx/1.7.0-SNAPSHOT/collection-ktx-1.7.0-20260320.125622-1.jar Version: 1.7.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_animation_animation_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_animation_animation_android/README.chromium index eb5b27f..5433d50 100644 --- a/third_party/androidx/committed/libs/androidx_compose_animation_animation_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_animation_animation_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Animation Short Name: animation-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/compose/animation/animation-android/1.12.0-SNAPSHOT/animation-android-1.12.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/compose/animation/animation-android/1.12.0-SNAPSHOT/animation-android-1.12.0-20260320.125622-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_animation_animation_core_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_animation_animation_core_android/README.chromium index e66e2af..b1ded3a9 100644 --- a/third_party/androidx/committed/libs/androidx_compose_animation_animation_core_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_animation_animation_core_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Animation Core Short Name: animation-core-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/compose/animation/animation-core-android/1.12.0-SNAPSHOT/animation-core-android-1.12.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/compose/animation/animation-core-android/1.12.0-SNAPSHOT/animation-core-android-1.12.0-20260320.125622-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_android/README.chromium index 151f369..93e32bb 100644 --- a/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Foundation Short Name: foundation-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/compose/foundation/foundation-android/1.12.0-SNAPSHOT/foundation-android-1.12.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/compose/foundation/foundation-android/1.12.0-SNAPSHOT/foundation-android-1.12.0-20260320.125622-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_layout_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_layout_android/README.chromium index c84959d4..b29bb43 100644 --- a/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_layout_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_layout_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Layouts Short Name: foundation-layout-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/compose/foundation/foundation-layout-android/1.12.0-SNAPSHOT/foundation-layout-android-1.12.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/compose/foundation/foundation-layout-android/1.12.0-SNAPSHOT/foundation-layout-android-1.12.0-20260320.125622-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_material3_material3_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_material3_material3_android/README.chromium index 92a1523..48b2202 100644 --- a/third_party/androidx/committed/libs/androidx_compose_material3_material3_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_material3_material3_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Material3 Components Short Name: material3-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/compose/material3/material3-android/1.5.0-SNAPSHOT/material3-android-1.5.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/compose/material3/material3-android/1.5.0-SNAPSHOT/material3-android-1.5.0-20260320.125622-1.aar Version: 1.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_material_material_ripple_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_material_material_ripple_android/README.chromium index 10e6dc9..3dac7583 100644 --- a/third_party/androidx/committed/libs/androidx_compose_material_material_ripple_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_material_material_ripple_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Material Ripple Short Name: material-ripple-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/compose/material/material-ripple-android/1.12.0-SNAPSHOT/material-ripple-android-1.12.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/compose/material/material-ripple-android/1.12.0-SNAPSHOT/material-ripple-android-1.12.0-20260320.125622-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_android/README.chromium index 001d454..eb6c0cf1 100644 --- a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Runtime Short Name: runtime-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/compose/runtime/runtime-android/1.12.0-SNAPSHOT/runtime-android-1.12.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/compose/runtime/runtime-android/1.12.0-SNAPSHOT/runtime-android-1.12.0-20260320.125622-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_annotation_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_annotation_android/README.chromium index 4dada634..996d308 100644 --- a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_annotation_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_annotation_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Runtime Annotation Short Name: runtime-annotation-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/compose/runtime/runtime-annotation-android/1.12.0-SNAPSHOT/runtime-annotation-android-1.12.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/compose/runtime/runtime-annotation-android/1.12.0-SNAPSHOT/runtime-annotation-android-1.12.0-20260320.125622-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_retain_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_retain_android/README.chromium index b4c1fc1..237b3e84 100644 --- a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_retain_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_retain_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Runtime Retain Short Name: runtime-retain-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/compose/runtime/runtime-retain-android/1.12.0-SNAPSHOT/runtime-retain-android-1.12.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/compose/runtime/runtime-retain-android/1.12.0-SNAPSHOT/runtime-retain-android-1.12.0-20260320.125622-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_saveable_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_saveable_android/README.chromium index 8936ad31..e1d93fe 100644 --- a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_saveable_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_saveable_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Saveable Short Name: runtime-saveable-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/compose/runtime/runtime-saveable-android/1.12.0-SNAPSHOT/runtime-saveable-android-1.12.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/compose/runtime/runtime-saveable-android/1.12.0-SNAPSHOT/runtime-saveable-android-1.12.0-20260320.125622-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_android/README.chromium index e8f18e0..8c11de28 100644 --- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose UI Short Name: ui-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/compose/ui/ui-android/1.12.0-SNAPSHOT/ui-android-1.12.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/compose/ui/ui-android/1.12.0-SNAPSHOT/ui-android-1.12.0-20260320.125622-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_geometry_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_geometry_android/README.chromium index 86a38ff2..953756cd 100644 --- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_geometry_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_geometry_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Geometry Short Name: ui-geometry-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/compose/ui/ui-geometry-android/1.12.0-SNAPSHOT/ui-geometry-android-1.12.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/compose/ui/ui-geometry-android/1.12.0-SNAPSHOT/ui-geometry-android-1.12.0-20260320.125622-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_graphics_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_graphics_android/README.chromium index 68d4aa53..dc0be24 100644 --- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_graphics_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_graphics_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Graphics Short Name: ui-graphics-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/compose/ui/ui-graphics-android/1.12.0-SNAPSHOT/ui-graphics-android-1.12.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/compose/ui/ui-graphics-android/1.12.0-SNAPSHOT/ui-graphics-android-1.12.0-20260320.125622-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_android/README.chromium index ac19edcc..90e291d6 100644 --- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Testing Short Name: ui-test-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/compose/ui/ui-test-android/1.12.0-SNAPSHOT/ui-test-android-1.12.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/compose/ui/ui-test-android/1.12.0-SNAPSHOT/ui-test-android-1.12.0-20260320.125622-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_junit4_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_junit4_android/README.chromium index 88970a6..57c34e0 100644 --- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_junit4_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_junit4_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Testing for JUnit4 Short Name: ui-test-junit4-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/compose/ui/ui-test-junit4-android/1.12.0-SNAPSHOT/ui-test-junit4-android-1.12.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/compose/ui/ui-test-junit4-android/1.12.0-SNAPSHOT/ui-test-junit4-android-1.12.0-20260320.125622-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_manifest/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_manifest/README.chromium index fbcbb7d..9166c9a 100644 --- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_manifest/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_manifest/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Testing manifest dependency Short Name: ui-test-manifest -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/compose/ui/ui-test-manifest/1.12.0-SNAPSHOT/ui-test-manifest-1.12.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/compose/ui/ui-test-manifest/1.12.0-SNAPSHOT/ui-test-manifest-1.12.0-20260320.125622-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_android/README.chromium index 10af092..0b4e26eb 100644 --- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose UI Text Short Name: ui-text-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/compose/ui/ui-text-android/1.12.0-SNAPSHOT/ui-text-android-1.12.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/compose/ui/ui-text-android/1.12.0-SNAPSHOT/ui-text-android-1.12.0-20260320.125622-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_google_fonts/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_google_fonts/README.chromium index c141be9..ef7549e 100644 --- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_google_fonts/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_google_fonts/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Google Fonts integration Short Name: ui-text-google-fonts -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/compose/ui/ui-text-google-fonts/1.12.0-SNAPSHOT/ui-text-google-fonts-1.12.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/compose/ui/ui-text-google-fonts/1.12.0-SNAPSHOT/ui-text-google-fonts-1.12.0-20260320.125622-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_unit_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_unit_android/README.chromium index 083d54a18..1969be72 100644 --- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_unit_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_unit_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Unit Short Name: ui-unit-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/compose/ui/ui-unit-android/1.12.0-SNAPSHOT/ui-unit-android-1.12.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/compose/ui/ui-unit-android/1.12.0-SNAPSHOT/ui-unit-android-1.12.0-20260320.125622-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_util_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_util_android/README.chromium index ad0b1a57..1fe7d54 100644 --- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_util_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_util_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Util Short Name: ui-util-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/compose/ui/ui-util-android/1.12.0-SNAPSHOT/ui-util-android-1.12.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/compose/ui/ui-util-android/1.12.0-SNAPSHOT/ui-util-android-1.12.0-20260320.125622-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout/README.chromium b/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout/README.chromium index 3c36184..37aec22 100644 --- a/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout/README.chromium +++ b/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout/README.chromium
@@ -1,6 +1,6 @@ Name: ConstraintLayout Short Name: constraintlayout -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/constraintlayout/constraintlayout/2.3.0-SNAPSHOT/constraintlayout-2.3.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/constraintlayout/constraintlayout/2.3.0-SNAPSHOT/constraintlayout-2.3.0-20260320.125622-1.aar Version: 2.3.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout_core/README.chromium b/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout_core/README.chromium index ad966a7..28673e2 100644 --- a/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout_core/README.chromium +++ b/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout_core/README.chromium
@@ -1,6 +1,6 @@ Name: ConstraintLayout Core Short Name: constraintlayout-core -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/constraintlayout/constraintlayout-core/1.2.0-SNAPSHOT/constraintlayout-core-1.2.0-20260320.055805-1.jar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/constraintlayout/constraintlayout-core/1.2.0-SNAPSHOT/constraintlayout-core-1.2.0-20260320.125622-1.jar Version: 1.2.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_core_core/README.chromium b/third_party/androidx/committed/libs/androidx_core_core/README.chromium index f7d24bd4..6304de2b 100644 --- a/third_party/androidx/committed/libs/androidx_core_core/README.chromium +++ b/third_party/androidx/committed/libs/androidx_core_core/README.chromium
@@ -1,6 +1,6 @@ Name: Core Short Name: core -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/core/core/1.19.0-SNAPSHOT/core-1.19.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/core/core/1.19.0-SNAPSHOT/core-1.19.0-20260320.125622-1.aar Version: 1.19.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_core_core_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_core_core_ktx/README.chromium index 5e49cce8..31460ba 100644 --- a/third_party/androidx/committed/libs/androidx_core_core_ktx/README.chromium +++ b/third_party/androidx/committed/libs/androidx_core_core_ktx/README.chromium
@@ -1,6 +1,6 @@ Name: Core Kotlin Extensions Short Name: core-ktx -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/core/core-ktx/1.19.0-SNAPSHOT/core-ktx-1.19.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/core/core-ktx/1.19.0-SNAPSHOT/core-ktx-1.19.0-20260320.125622-1.aar Version: 1.19.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_core_core_pip/README.chromium b/third_party/androidx/committed/libs/androidx_core_core_pip/README.chromium index 495e052d..cc848aa 100644 --- a/third_party/androidx/committed/libs/androidx_core_core_pip/README.chromium +++ b/third_party/androidx/committed/libs/androidx_core_core_pip/README.chromium
@@ -1,6 +1,6 @@ Name: androidx.core:core-pip Short Name: core-pip -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/core/core-pip/1.0.0-SNAPSHOT/core-pip-1.0.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/core/core-pip/1.0.0-SNAPSHOT/core-pip-1.0.0-20260320.125622-1.aar Version: 1.0.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_core_core_viewtree/README.chromium b/third_party/androidx/committed/libs/androidx_core_core_viewtree/README.chromium index 674de07..111be93 100644 --- a/third_party/androidx/committed/libs/androidx_core_core_viewtree/README.chromium +++ b/third_party/androidx/committed/libs/androidx_core_core_viewtree/README.chromium
@@ -1,6 +1,6 @@ Name: androidx.core:core-viewtree Short Name: core-viewtree -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/core/core-viewtree/1.1.0-SNAPSHOT/core-viewtree-1.1.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/core/core-viewtree/1.1.0-SNAPSHOT/core-viewtree-1.1.0-20260320.125622-1.aar Version: 1.1.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_credentials_credentials/README.chromium b/third_party/androidx/committed/libs/androidx_credentials_credentials/README.chromium index 3079c4d..f8ff056 100644 --- a/third_party/androidx/committed/libs/androidx_credentials_credentials/README.chromium +++ b/third_party/androidx/committed/libs/androidx_credentials_credentials/README.chromium
@@ -1,6 +1,6 @@ Name: Credentials Short Name: credentials -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/credentials/credentials/1.6.0-SNAPSHOT/credentials-1.6.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/credentials/credentials/1.6.0-SNAPSHOT/credentials-1.6.0-20260320.125622-1.aar Version: 1.6.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_credentials_credentials_play_services_auth/README.chromium b/third_party/androidx/committed/libs/androidx_credentials_credentials_play_services_auth/README.chromium index b7d7675f..28b38ac 100644 --- a/third_party/androidx/committed/libs/androidx_credentials_credentials_play_services_auth/README.chromium +++ b/third_party/androidx/committed/libs/androidx_credentials_credentials_play_services_auth/README.chromium
@@ -1,6 +1,6 @@ Name: Credentials Play Services Auth Short Name: credentials-play-services-auth -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/credentials/credentials-play-services-auth/1.6.0-SNAPSHOT/credentials-play-services-auth-1.6.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/credentials/credentials-play-services-auth/1.6.0-SNAPSHOT/credentials-play-services-auth-1.6.0-20260320.125622-1.aar Version: 1.6.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider/README.chromium b/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider/README.chromium index a01f6e7..3b7a1288 100644 --- a/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider/README.chromium +++ b/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider/README.chromium
@@ -1,6 +1,6 @@ Name: androidx.credentials.registry:registry-provider Short Name: registry-provider -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/credentials/registry/registry-provider/1.0.0-SNAPSHOT/registry-provider-1.0.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/credentials/registry/registry-provider/1.0.0-SNAPSHOT/registry-provider-1.0.0-20260320.125622-1.aar Version: 1.0.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider_play_services/README.chromium b/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider_play_services/README.chromium index 120e09b..bd2408e3 100644 --- a/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider_play_services/README.chromium +++ b/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider_play_services/README.chromium
@@ -1,6 +1,6 @@ Name: androidx.credentials.registry:registry-provider-play-services Short Name: registry-provider-play-services -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/credentials/registry/registry-provider-play-services/1.0.0-SNAPSHOT/registry-provider-play-services-1.0.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/credentials/registry/registry-provider-play-services/1.0.0-SNAPSHOT/registry-provider-play-services-1.0.0-20260320.125622-1.aar Version: 1.0.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_cursoradapter_cursoradapter/README.chromium b/third_party/androidx/committed/libs/androidx_cursoradapter_cursoradapter/README.chromium index 7664c44..d9ddd45 100644 --- a/third_party/androidx/committed/libs/androidx_cursoradapter_cursoradapter/README.chromium +++ b/third_party/androidx/committed/libs/androidx_cursoradapter_cursoradapter/README.chromium
@@ -1,6 +1,6 @@ Name: Cursor Adapter Short Name: cursoradapter -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/cursoradapter/cursoradapter/1.1.0-SNAPSHOT/cursoradapter-1.1.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/cursoradapter/cursoradapter/1.1.0-SNAPSHOT/cursoradapter-1.1.0-20260320.125622-1.aar Version: 1.1.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_datastore_datastore_android/README.chromium b/third_party/androidx/committed/libs/androidx_datastore_datastore_android/README.chromium index 00ade8da..6ae07d2 100644 --- a/third_party/androidx/committed/libs/androidx_datastore_datastore_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_datastore_datastore_android/README.chromium
@@ -1,6 +1,6 @@ Name: DataStore Short Name: datastore-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/datastore/datastore-android/1.3.0-SNAPSHOT/datastore-android-1.3.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/datastore/datastore-android/1.3.0-SNAPSHOT/datastore-android-1.3.0-20260320.125622-1.aar Version: 1.3.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_datastore_datastore_core_android/README.chromium b/third_party/androidx/committed/libs/androidx_datastore_datastore_core_android/README.chromium index 74b4d3d0..16e8d34c 100644 --- a/third_party/androidx/committed/libs/androidx_datastore_datastore_core_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_datastore_datastore_core_android/README.chromium
@@ -1,6 +1,6 @@ Name: DataStore Core Short Name: datastore-core-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/datastore/datastore-core-android/1.3.0-SNAPSHOT/datastore-core-android-1.3.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/datastore/datastore-core-android/1.3.0-SNAPSHOT/datastore-core-android-1.3.0-20260320.125622-1.aar Version: 1.3.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_datastore_datastore_core_okio_jvm/README.chromium b/third_party/androidx/committed/libs/androidx_datastore_datastore_core_okio_jvm/README.chromium index ffb2a62..93db214 100644 --- a/third_party/androidx/committed/libs/androidx_datastore_datastore_core_okio_jvm/README.chromium +++ b/third_party/androidx/committed/libs/androidx_datastore_datastore_core_okio_jvm/README.chromium
@@ -1,6 +1,6 @@ Name: DataStore Core Okio Short Name: datastore-core-okio-jvm -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/datastore/datastore-core-okio-jvm/1.3.0-SNAPSHOT/datastore-core-okio-jvm-1.3.0-20260320.055805-1.jar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/datastore/datastore-core-okio-jvm/1.3.0-SNAPSHOT/datastore-core-okio-jvm-1.3.0-20260320.125622-1.jar Version: 1.3.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_android/README.chromium b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_android/README.chromium index f185f27b..c30746fe 100644 --- a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_android/README.chromium
@@ -1,6 +1,6 @@ Name: Preferences DataStore Short Name: datastore-preferences-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/datastore/datastore-preferences-android/1.3.0-SNAPSHOT/datastore-preferences-android-1.3.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/datastore/datastore-preferences-android/1.3.0-SNAPSHOT/datastore-preferences-android-1.3.0-20260320.125622-1.aar Version: 1.3.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_core_android/README.chromium b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_core_android/README.chromium index a3dbfeba..6b0b075b 100644 --- a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_core_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_core_android/README.chromium
@@ -1,6 +1,6 @@ Name: Preferences DataStore Core Short Name: datastore-preferences-core-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/datastore/datastore-preferences-core-android/1.3.0-SNAPSHOT/datastore-preferences-core-android-1.3.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/datastore/datastore-preferences-core-android/1.3.0-SNAPSHOT/datastore-preferences-core-android-1.3.0-20260320.125622-1.aar Version: 1.3.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_external_protobuf/README.chromium b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_external_protobuf/README.chromium index b290f463..d811c68 100644 --- a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_external_protobuf/README.chromium +++ b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_external_protobuf/README.chromium
@@ -1,6 +1,6 @@ Name: Preferences External Protobuf Short Name: datastore-preferences-external-protobuf -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/datastore/datastore-preferences-external-protobuf/1.3.0-SNAPSHOT/datastore-preferences-external-protobuf-1.3.0-20260320.055805-1.jar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/datastore/datastore-preferences-external-protobuf/1.3.0-SNAPSHOT/datastore-preferences-external-protobuf-1.3.0-20260320.125622-1.jar Version: 1.3.0-SNAPSHOT Update Mechanism: Autoroll License: BSD-3-Clause
diff --git a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_proto/README.chromium b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_proto/README.chromium index eaad365..5f5e4fc 100644 --- a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_proto/README.chromium +++ b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_proto/README.chromium
@@ -1,6 +1,6 @@ Name: Preferences DataStore Proto Short Name: datastore-preferences-proto -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/datastore/datastore-preferences-proto/1.3.0-SNAPSHOT/datastore-preferences-proto-1.3.0-20260320.055805-1.jar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/datastore/datastore-preferences-proto/1.3.0-SNAPSHOT/datastore-preferences-proto-1.3.0-20260320.125622-1.jar Version: 1.3.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_drawerlayout_drawerlayout/README.chromium b/third_party/androidx/committed/libs/androidx_drawerlayout_drawerlayout/README.chromium index da37ce8..4cf3423 100644 --- a/third_party/androidx/committed/libs/androidx_drawerlayout_drawerlayout/README.chromium +++ b/third_party/androidx/committed/libs/androidx_drawerlayout_drawerlayout/README.chromium
@@ -1,6 +1,6 @@ Name: Drawer Layout Short Name: drawerlayout -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/drawerlayout/drawerlayout/1.3.0-SNAPSHOT/drawerlayout-1.3.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/drawerlayout/drawerlayout/1.3.0-SNAPSHOT/drawerlayout-1.3.0-20260320.125622-1.aar Version: 1.3.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_fragment_fragment/README.chromium b/third_party/androidx/committed/libs/androidx_fragment_fragment/README.chromium index c6fdd7ef..95b9fc17 100644 --- a/third_party/androidx/committed/libs/androidx_fragment_fragment/README.chromium +++ b/third_party/androidx/committed/libs/androidx_fragment_fragment/README.chromium
@@ -1,6 +1,6 @@ Name: fragment Short Name: fragment -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/fragment/fragment/1.9.0-SNAPSHOT/fragment-1.9.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/fragment/fragment/1.9.0-SNAPSHOT/fragment-1.9.0-20260320.125622-1.aar Version: 1.9.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_fragment_fragment_compose/README.chromium b/third_party/androidx/committed/libs/androidx_fragment_fragment_compose/README.chromium index a7efee0..27a34ac 100644 --- a/third_party/androidx/committed/libs/androidx_fragment_fragment_compose/README.chromium +++ b/third_party/androidx/committed/libs/androidx_fragment_fragment_compose/README.chromium
@@ -1,6 +1,6 @@ Name: Fragment Compose Short Name: fragment-compose -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/fragment/fragment-compose/1.9.0-SNAPSHOT/fragment-compose-1.9.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/fragment/fragment-compose/1.9.0-SNAPSHOT/fragment-compose-1.9.0-20260320.125622-1.aar Version: 1.9.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_fragment_fragment_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_fragment_fragment_ktx/README.chromium index 5f5a5ed..4ab30a0 100644 --- a/third_party/androidx/committed/libs/androidx_fragment_fragment_ktx/README.chromium +++ b/third_party/androidx/committed/libs/androidx_fragment_fragment_ktx/README.chromium
@@ -1,6 +1,6 @@ Name: Fragment Kotlin Extensions Short Name: fragment-ktx -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/fragment/fragment-ktx/1.9.0-SNAPSHOT/fragment-ktx-1.9.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/fragment/fragment-ktx/1.9.0-SNAPSHOT/fragment-ktx-1.9.0-20260320.125622-1.aar Version: 1.9.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_fragment_fragment_testing/README.chromium b/third_party/androidx/committed/libs/androidx_fragment_fragment_testing/README.chromium index 43caa19..bbc76f9c 100644 --- a/third_party/androidx/committed/libs/androidx_fragment_fragment_testing/README.chromium +++ b/third_party/androidx/committed/libs/androidx_fragment_fragment_testing/README.chromium
@@ -1,6 +1,6 @@ Name: Fragment Testing Extensions Short Name: fragment-testing -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/fragment/fragment-testing/1.9.0-SNAPSHOT/fragment-testing-1.9.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/fragment/fragment-testing/1.9.0-SNAPSHOT/fragment-testing-1.9.0-20260320.125622-1.aar Version: 1.9.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_fragment_fragment_testing_manifest/README.chromium b/third_party/androidx/committed/libs/androidx_fragment_fragment_testing_manifest/README.chromium index 96f9adc..bcaba93e 100644 --- a/third_party/androidx/committed/libs/androidx_fragment_fragment_testing_manifest/README.chromium +++ b/third_party/androidx/committed/libs/androidx_fragment_fragment_testing_manifest/README.chromium
@@ -1,6 +1,6 @@ Name: Fragment Testing Manifest dependency Short Name: fragment-testing-manifest -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/fragment/fragment-testing-manifest/1.9.0-SNAPSHOT/fragment-testing-manifest-1.9.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/fragment/fragment-testing-manifest/1.9.0-SNAPSHOT/fragment-testing-manifest-1.9.0-20260320.125622-1.aar Version: 1.9.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_graphics_graphics_path/README.chromium b/third_party/androidx/committed/libs/androidx_graphics_graphics_path/README.chromium index 0e63fcc..f38e198 100644 --- a/third_party/androidx/committed/libs/androidx_graphics_graphics_path/README.chromium +++ b/third_party/androidx/committed/libs/androidx_graphics_graphics_path/README.chromium
@@ -1,6 +1,6 @@ Name: Android Graphics Path Short Name: graphics-path -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/graphics/graphics-path/1.1.0-SNAPSHOT/graphics-path-1.1.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/graphics/graphics-path/1.1.0-SNAPSHOT/graphics-path-1.1.0-20260320.125622-1.aar Version: 1.1.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_interpolator_interpolator/README.chromium b/third_party/androidx/committed/libs/androidx_interpolator_interpolator/README.chromium index 01c7d039..f74d9c5 100644 --- a/third_party/androidx/committed/libs/androidx_interpolator_interpolator/README.chromium +++ b/third_party/androidx/committed/libs/androidx_interpolator_interpolator/README.chromium
@@ -1,6 +1,6 @@ Name: Interpolators Short Name: interpolator -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/interpolator/interpolator/1.1.0-SNAPSHOT/interpolator-1.1.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/interpolator/interpolator/1.1.0-SNAPSHOT/interpolator-1.1.0-20260320.125622-1.aar Version: 1.1.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_leanback_leanback/README.chromium b/third_party/androidx/committed/libs/androidx_leanback_leanback/README.chromium index 60b6def..0c9ed94d 100644 --- a/third_party/androidx/committed/libs/androidx_leanback_leanback/README.chromium +++ b/third_party/androidx/committed/libs/androidx_leanback_leanback/README.chromium
@@ -1,6 +1,6 @@ Name: Leanback Short Name: leanback -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/leanback/leanback/1.3.0-SNAPSHOT/leanback-1.3.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/leanback/leanback/1.3.0-SNAPSHOT/leanback-1.3.0-20260320.125622-1.aar Version: 1.3.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_leanback_leanback_grid/README.chromium b/third_party/androidx/committed/libs/androidx_leanback_leanback_grid/README.chromium index 297b89f8..ab646cb 100644 --- a/third_party/androidx/committed/libs/androidx_leanback_leanback_grid/README.chromium +++ b/third_party/androidx/committed/libs/androidx_leanback_leanback_grid/README.chromium
@@ -1,6 +1,6 @@ Name: Leanback Grid Short Name: leanback-grid -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/leanback/leanback-grid/1.1.0-SNAPSHOT/leanback-grid-1.1.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/leanback/leanback-grid/1.1.0-SNAPSHOT/leanback-grid-1.1.0-20260320.125622-1.aar Version: 1.1.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_java8/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_java8/README.chromium index 1072ce6b..3cd782f8 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_java8/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_java8/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle-Common for Java 8 Short Name: lifecycle-common-java8 -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/lifecycle/lifecycle-common-java8/2.11.0-SNAPSHOT/lifecycle-common-java8-2.11.0-20260320.055805-1.jar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/lifecycle/lifecycle-common-java8/2.11.0-SNAPSHOT/lifecycle-common-java8-2.11.0-20260320.125622-1.jar Version: 2.11.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_jvm/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_jvm/README.chromium index b936c3f..f8aac39 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_jvm/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_jvm/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle-Common Short Name: lifecycle-common-jvm -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/lifecycle/lifecycle-common-jvm/2.11.0-SNAPSHOT/lifecycle-common-jvm-2.11.0-20260320.055805-1.jar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/lifecycle/lifecycle-common-jvm/2.11.0-SNAPSHOT/lifecycle-common-jvm-2.11.0-20260320.125622-1.jar Version: 2.11.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata/README.chromium index 9aa39c1..74abc1e 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle LiveData Short Name: lifecycle-livedata -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/lifecycle/lifecycle-livedata/2.11.0-SNAPSHOT/lifecycle-livedata-2.11.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/lifecycle/lifecycle-livedata/2.11.0-SNAPSHOT/lifecycle-livedata-2.11.0-20260320.125622-1.aar Version: 2.11.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core/README.chromium index ad5b3b1..55efc4d2 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle LiveData Core Short Name: lifecycle-livedata-core -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/lifecycle/lifecycle-livedata-core/2.11.0-SNAPSHOT/lifecycle-livedata-core-2.11.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/lifecycle/lifecycle-livedata-core/2.11.0-SNAPSHOT/lifecycle-livedata-core-2.11.0-20260320.125622-1.aar Version: 2.11.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core_ktx/README.chromium index 58fdd0e..64e59c336 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core_ktx/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core_ktx/README.chromium
@@ -1,6 +1,6 @@ Name: LiveData Core Kotlin Extensions Short Name: lifecycle-livedata-core-ktx -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/lifecycle/lifecycle-livedata-core-ktx/2.11.0-SNAPSHOT/lifecycle-livedata-core-ktx-2.11.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/lifecycle/lifecycle-livedata-core-ktx/2.11.0-SNAPSHOT/lifecycle-livedata-core-ktx-2.11.0-20260320.125622-1.aar Version: 2.11.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_ktx/README.chromium index 9b51e7906..d914c45 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_ktx/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_ktx/README.chromium
@@ -1,6 +1,6 @@ Name: LiveData Kotlin Extensions Short Name: lifecycle-livedata-ktx -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/lifecycle/lifecycle-livedata-ktx/2.11.0-SNAPSHOT/lifecycle-livedata-ktx-2.11.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/lifecycle/lifecycle-livedata-ktx/2.11.0-SNAPSHOT/lifecycle-livedata-ktx-2.11.0-20260320.125622-1.aar Version: 2.11.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_process/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_process/README.chromium index 1da5d9cc..be0cfec2 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_process/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_process/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle Process Short Name: lifecycle-process -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/lifecycle/lifecycle-process/2.11.0-SNAPSHOT/lifecycle-process-2.11.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/lifecycle/lifecycle-process/2.11.0-SNAPSHOT/lifecycle-process-2.11.0-20260320.125622-1.aar Version: 2.11.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_android/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_android/README.chromium index fdeef012..162400d 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_android/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle Runtime Short Name: lifecycle-runtime-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/lifecycle/lifecycle-runtime-android/2.11.0-SNAPSHOT/lifecycle-runtime-android-2.11.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/lifecycle/lifecycle-runtime-android/2.11.0-SNAPSHOT/lifecycle-runtime-android-2.11.0-20260320.125622-1.aar Version: 2.11.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_compose_android/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_compose_android/README.chromium index 8b40a51..840fba1 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_compose_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_compose_android/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle Runtime Compose Short Name: lifecycle-runtime-compose-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/lifecycle/lifecycle-runtime-compose-android/2.11.0-SNAPSHOT/lifecycle-runtime-compose-android-2.11.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/lifecycle/lifecycle-runtime-compose-android/2.11.0-SNAPSHOT/lifecycle-runtime-compose-android-2.11.0-20260320.125622-1.aar Version: 2.11.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_ktx_android/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_ktx_android/README.chromium index a790143..56bd1ff 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_ktx_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_ktx_android/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle Kotlin Extensions Short Name: lifecycle-runtime-ktx-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/lifecycle/lifecycle-runtime-ktx-android/2.11.0-SNAPSHOT/lifecycle-runtime-ktx-android-2.11.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/lifecycle/lifecycle-runtime-ktx-android/2.11.0-SNAPSHOT/lifecycle-runtime-ktx-android-2.11.0-20260320.125622-1.aar Version: 2.11.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_service/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_service/README.chromium index 013a2fb..f877034 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_service/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_service/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle Service Short Name: lifecycle-service -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/lifecycle/lifecycle-service/2.11.0-SNAPSHOT/lifecycle-service-2.11.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/lifecycle/lifecycle-service/2.11.0-SNAPSHOT/lifecycle-service-2.11.0-20260320.125622-1.aar Version: 2.11.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_android/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_android/README.chromium index a2b70bb..a74adec1 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_android/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle ViewModel Short Name: lifecycle-viewmodel-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-android/2.11.0-SNAPSHOT/lifecycle-viewmodel-android-2.11.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-android/2.11.0-SNAPSHOT/lifecycle-viewmodel-android-2.11.0-20260320.125622-1.aar Version: 2.11.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_compose_android/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_compose_android/README.chromium index a1d098a..25e73d0 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_compose_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_compose_android/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle ViewModel Compose Short Name: lifecycle-viewmodel-compose-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-compose-android/2.11.0-SNAPSHOT/lifecycle-viewmodel-compose-android-2.11.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-compose-android/2.11.0-SNAPSHOT/lifecycle-viewmodel-compose-android-2.11.0-20260320.125622-1.aar Version: 2.11.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_ktx/README.chromium index 6e10655..c0a124f2 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_ktx/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_ktx/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle ViewModel Kotlin Extensions Short Name: lifecycle-viewmodel-ktx -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-ktx/2.11.0-SNAPSHOT/lifecycle-viewmodel-ktx-2.11.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-ktx/2.11.0-SNAPSHOT/lifecycle-viewmodel-ktx-2.11.0-20260320.125622-1.aar Version: 2.11.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_savedstate_android/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_savedstate_android/README.chromium index 19266f2..0da254d2a 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_savedstate_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_savedstate_android/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle ViewModel with SavedState Short Name: lifecycle-viewmodel-savedstate-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-savedstate-android/2.11.0-SNAPSHOT/lifecycle-viewmodel-savedstate-android-2.11.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-savedstate-android/2.11.0-SNAPSHOT/lifecycle-viewmodel-savedstate-android-2.11.0-20260320.125622-1.aar Version: 2.11.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_loader_loader/README.chromium b/third_party/androidx/committed/libs/androidx_loader_loader/README.chromium index 8963dd7..96a1fd81 100644 --- a/third_party/androidx/committed/libs/androidx_loader_loader/README.chromium +++ b/third_party/androidx/committed/libs/androidx_loader_loader/README.chromium
@@ -1,6 +1,6 @@ Name: loader Short Name: loader -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/loader/loader/1.2.0-SNAPSHOT/loader-1.2.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/loader/loader/1.2.0-SNAPSHOT/loader-1.2.0-20260320.125622-1.aar Version: 1.2.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_media_media/README.chromium b/third_party/androidx/committed/libs/androidx_media_media/README.chromium index e2b6191..94560a8 100644 --- a/third_party/androidx/committed/libs/androidx_media_media/README.chromium +++ b/third_party/androidx/committed/libs/androidx_media_media/README.chromium
@@ -1,6 +1,6 @@ Name: Media Short Name: media -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/media/media/1.8.0-SNAPSHOT/media-1.8.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/media/media/1.8.0-SNAPSHOT/media-1.8.0-20260320.125622-1.aar Version: 1.8.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_mediarouter_mediarouter/README.chromium b/third_party/androidx/committed/libs/androidx_mediarouter_mediarouter/README.chromium index 04d1870..0f3daad 100644 --- a/third_party/androidx/committed/libs/androidx_mediarouter_mediarouter/README.chromium +++ b/third_party/androidx/committed/libs/androidx_mediarouter_mediarouter/README.chromium
@@ -1,6 +1,6 @@ Name: MediaRouter Short Name: mediarouter -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/mediarouter/mediarouter/1.9.0-SNAPSHOT/mediarouter-1.9.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/mediarouter/mediarouter/1.9.0-SNAPSHOT/mediarouter-1.9.0-20260320.125622-1.aar Version: 1.9.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_navigation_navigation_common_android/README.chromium b/third_party/androidx/committed/libs/androidx_navigation_navigation_common_android/README.chromium index a01601c..367084aa 100644 --- a/third_party/androidx/committed/libs/androidx_navigation_navigation_common_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_navigation_navigation_common_android/README.chromium
@@ -1,6 +1,6 @@ Name: Navigation Common Short Name: navigation-common-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/navigation/navigation-common-android/2.10.0-SNAPSHOT/navigation-common-android-2.10.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/navigation/navigation-common-android/2.10.0-SNAPSHOT/navigation-common-android-2.10.0-20260320.125622-1.aar Version: 2.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_navigation_navigation_compose_android/README.chromium b/third_party/androidx/committed/libs/androidx_navigation_navigation_compose_android/README.chromium index ac5aa91..caa912a8 100644 --- a/third_party/androidx/committed/libs/androidx_navigation_navigation_compose_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_navigation_navigation_compose_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Navigation Short Name: navigation-compose-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/navigation/navigation-compose-android/2.10.0-SNAPSHOT/navigation-compose-android-2.10.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/navigation/navigation-compose-android/2.10.0-SNAPSHOT/navigation-compose-android-2.10.0-20260320.125622-1.aar Version: 2.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_navigation_navigation_runtime_android/README.chromium b/third_party/androidx/committed/libs/androidx_navigation_navigation_runtime_android/README.chromium index fc8cbdb..77daae6 100644 --- a/third_party/androidx/committed/libs/androidx_navigation_navigation_runtime_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_navigation_navigation_runtime_android/README.chromium
@@ -1,6 +1,6 @@ Name: Navigation Runtime Short Name: navigation-runtime-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/navigation/navigation-runtime-android/2.10.0-SNAPSHOT/navigation-runtime-android-2.10.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/navigation/navigation-runtime-android/2.10.0-SNAPSHOT/navigation-runtime-android-2.10.0-20260320.125622-1.aar Version: 2.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_android/README.chromium b/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_android/README.chromium index 445f50c..043b32ab 100644 --- a/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_android/README.chromium
@@ -1,6 +1,6 @@ Name: Navigation Event Short Name: navigationevent-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/navigationevent/navigationevent-android/1.1.0-SNAPSHOT/navigationevent-android-1.1.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/navigationevent/navigationevent-android/1.1.0-SNAPSHOT/navigationevent-android-1.1.0-20260320.125622-1.aar Version: 1.1.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_compose_android/README.chromium b/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_compose_android/README.chromium index 1dc8770..cea2faf 100644 --- a/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_compose_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_compose_android/README.chromium
@@ -1,6 +1,6 @@ Name: NavigationEvent Compose Short Name: navigationevent-compose-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/navigationevent/navigationevent-compose-android/1.1.0-SNAPSHOT/navigationevent-compose-android-1.1.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/navigationevent/navigationevent-compose-android/1.1.0-SNAPSHOT/navigationevent-compose-android-1.1.0-20260320.125622-1.aar Version: 1.1.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_paging_paging_common_android/README.chromium b/third_party/androidx/committed/libs/androidx_paging_paging_common_android/README.chromium index 6faa5b2dd..d0fec1ae 100644 --- a/third_party/androidx/committed/libs/androidx_paging_paging_common_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_paging_paging_common_android/README.chromium
@@ -1,6 +1,6 @@ Name: Paging-Common Short Name: paging-common-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/paging/paging-common-android/3.5.0-SNAPSHOT/paging-common-android-3.5.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/paging/paging-common-android/3.5.0-SNAPSHOT/paging-common-android-3.5.0-20260320.125622-1.aar Version: 3.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_paging_paging_common_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_paging_paging_common_ktx/README.chromium index ecfffc53..1f462a91 100644 --- a/third_party/androidx/committed/libs/androidx_paging_paging_common_ktx/README.chromium +++ b/third_party/androidx/committed/libs/androidx_paging_paging_common_ktx/README.chromium
@@ -1,6 +1,6 @@ Name: Paging-Common Kotlin Extensions Short Name: paging-common-ktx -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/paging/paging-common-ktx/3.5.0-SNAPSHOT/paging-common-ktx-3.5.0-20260320.055805-1.jar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/paging/paging-common-ktx/3.5.0-SNAPSHOT/paging-common-ktx-3.5.0-20260320.125622-1.jar Version: 3.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_paging_paging_compose_android/README.chromium b/third_party/androidx/committed/libs/androidx_paging_paging_compose_android/README.chromium index 8da7334..6e32191 100644 --- a/third_party/androidx/committed/libs/androidx_paging_paging_compose_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_paging_paging_compose_android/README.chromium
@@ -1,6 +1,6 @@ Name: Paging-Compose Short Name: paging-compose-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/paging/paging-compose-android/3.5.0-SNAPSHOT/paging-compose-android-3.5.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/paging/paging-compose-android/3.5.0-SNAPSHOT/paging-compose-android-3.5.0-20260320.125622-1.aar Version: 3.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_paging_paging_runtime/README.chromium b/third_party/androidx/committed/libs/androidx_paging_paging_runtime/README.chromium index f79d93c7..ed0b7347 100644 --- a/third_party/androidx/committed/libs/androidx_paging_paging_runtime/README.chromium +++ b/third_party/androidx/committed/libs/androidx_paging_paging_runtime/README.chromium
@@ -1,6 +1,6 @@ Name: Paging-Runtime Short Name: paging-runtime -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/paging/paging-runtime/3.5.0-SNAPSHOT/paging-runtime-3.5.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/paging/paging-runtime/3.5.0-SNAPSHOT/paging-runtime-3.5.0-20260320.125622-1.aar Version: 3.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_palette_palette/README.chromium b/third_party/androidx/committed/libs/androidx_palette_palette/README.chromium index c1fc66f..20db4f8 100644 --- a/third_party/androidx/committed/libs/androidx_palette_palette/README.chromium +++ b/third_party/androidx/committed/libs/androidx_palette_palette/README.chromium
@@ -1,6 +1,6 @@ Name: Palette Short Name: palette -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/palette/palette/1.1.0-SNAPSHOT/palette-1.1.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/palette/palette/1.1.0-SNAPSHOT/palette-1.1.0-20260320.125622-1.aar Version: 1.1.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_preference_preference/README.chromium b/third_party/androidx/committed/libs/androidx_preference_preference/README.chromium index 4b140007..545d918d 100644 --- a/third_party/androidx/committed/libs/androidx_preference_preference/README.chromium +++ b/third_party/androidx/committed/libs/androidx_preference_preference/README.chromium
@@ -1,6 +1,6 @@ Name: Preference Short Name: preference -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/preference/preference/1.3.0-SNAPSHOT/preference-1.3.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/preference/preference/1.3.0-SNAPSHOT/preference-1.3.0-20260320.125622-1.aar Version: 1.3.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_profileinstaller_profileinstaller/README.chromium b/third_party/androidx/committed/libs/androidx_profileinstaller_profileinstaller/README.chromium index 7566717..7ea49c67 100644 --- a/third_party/androidx/committed/libs/androidx_profileinstaller_profileinstaller/README.chromium +++ b/third_party/androidx/committed/libs/androidx_profileinstaller_profileinstaller/README.chromium
@@ -1,6 +1,6 @@ Name: Profile Installer Short Name: profileinstaller -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/profileinstaller/profileinstaller/1.5.0-SNAPSHOT/profileinstaller-1.5.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/profileinstaller/profileinstaller/1.5.0-SNAPSHOT/profileinstaller-1.5.0-20260320.125622-1.aar Version: 1.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_recyclerview_recyclerview/README.chromium b/third_party/androidx/committed/libs/androidx_recyclerview_recyclerview/README.chromium index f22e2953..5ce908d 100644 --- a/third_party/androidx/committed/libs/androidx_recyclerview_recyclerview/README.chromium +++ b/third_party/androidx/committed/libs/androidx_recyclerview_recyclerview/README.chromium
@@ -1,6 +1,6 @@ Name: RecyclerView Short Name: recyclerview -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/recyclerview/recyclerview/1.5.0-SNAPSHOT/recyclerview-1.5.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/recyclerview/recyclerview/1.5.0-SNAPSHOT/recyclerview-1.5.0-20260320.125622-1.aar Version: 1.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_resourceinspection_resourceinspection_annotation/README.chromium b/third_party/androidx/committed/libs/androidx_resourceinspection_resourceinspection_annotation/README.chromium index a9dddcdd6..292882c5 100644 --- a/third_party/androidx/committed/libs/androidx_resourceinspection_resourceinspection_annotation/README.chromium +++ b/third_party/androidx/committed/libs/androidx_resourceinspection_resourceinspection_annotation/README.chromium
@@ -1,6 +1,6 @@ Name: Resource Inspection - Annotations Short Name: resourceinspection-annotation -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/resourceinspection/resourceinspection-annotation/1.1.0-SNAPSHOT/resourceinspection-annotation-1.1.0-20260320.055805-1.jar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/resourceinspection/resourceinspection-annotation/1.1.0-SNAPSHOT/resourceinspection-annotation-1.1.0-20260320.125622-1.jar Version: 1.1.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_savedstate_savedstate_android/README.chromium b/third_party/androidx/committed/libs/androidx_savedstate_savedstate_android/README.chromium index 1dc251b..3174cb8 100644 --- a/third_party/androidx/committed/libs/androidx_savedstate_savedstate_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_savedstate_savedstate_android/README.chromium
@@ -1,6 +1,6 @@ Name: Saved State Short Name: savedstate-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/savedstate/savedstate-android/1.5.0-SNAPSHOT/savedstate-android-1.5.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/savedstate/savedstate-android/1.5.0-SNAPSHOT/savedstate-android-1.5.0-20260320.125622-1.aar Version: 1.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_savedstate_savedstate_compose_android/README.chromium b/third_party/androidx/committed/libs/androidx_savedstate_savedstate_compose_android/README.chromium index 017fe2c..4fbe6be 100644 --- a/third_party/androidx/committed/libs/androidx_savedstate_savedstate_compose_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_savedstate_savedstate_compose_android/README.chromium
@@ -1,6 +1,6 @@ Name: Saved State Compose Short Name: savedstate-compose-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/savedstate/savedstate-compose-android/1.5.0-SNAPSHOT/savedstate-compose-android-1.5.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/savedstate/savedstate-compose-android/1.5.0-SNAPSHOT/savedstate-compose-android-1.5.0-20260320.125622-1.aar Version: 1.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_savedstate_savedstate_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_savedstate_savedstate_ktx/README.chromium index 067a7a45..78a477a 100644 --- a/third_party/androidx/committed/libs/androidx_savedstate_savedstate_ktx/README.chromium +++ b/third_party/androidx/committed/libs/androidx_savedstate_savedstate_ktx/README.chromium
@@ -1,6 +1,6 @@ Name: SavedState Kotlin Extensions Short Name: savedstate-ktx -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/savedstate/savedstate-ktx/1.5.0-SNAPSHOT/savedstate-ktx-1.5.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/savedstate/savedstate-ktx/1.5.0-SNAPSHOT/savedstate-ktx-1.5.0-20260320.125622-1.aar Version: 1.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_slidingpanelayout_slidingpanelayout/README.chromium b/third_party/androidx/committed/libs/androidx_slidingpanelayout_slidingpanelayout/README.chromium index b83dc611a..f9ba1ce9 100644 --- a/third_party/androidx/committed/libs/androidx_slidingpanelayout_slidingpanelayout/README.chromium +++ b/third_party/androidx/committed/libs/androidx_slidingpanelayout_slidingpanelayout/README.chromium
@@ -1,6 +1,6 @@ Name: Sliding Pane Layout Short Name: slidingpanelayout -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/slidingpanelayout/slidingpanelayout/1.3.0-SNAPSHOT/slidingpanelayout-1.3.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/slidingpanelayout/slidingpanelayout/1.3.0-SNAPSHOT/slidingpanelayout-1.3.0-20260320.125622-1.aar Version: 1.3.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_sqlite_sqlite_android/README.chromium b/third_party/androidx/committed/libs/androidx_sqlite_sqlite_android/README.chromium index b34f1278..95c41d73 100644 --- a/third_party/androidx/committed/libs/androidx_sqlite_sqlite_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_sqlite_sqlite_android/README.chromium
@@ -1,6 +1,6 @@ Name: SQLite Short Name: sqlite-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/sqlite/sqlite-android/2.7.0-SNAPSHOT/sqlite-android-2.7.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/sqlite/sqlite-android/2.7.0-SNAPSHOT/sqlite-android-2.7.0-20260320.125622-1.aar Version: 2.7.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_sqlite_sqlite_framework_android/README.chromium b/third_party/androidx/committed/libs/androidx_sqlite_sqlite_framework_android/README.chromium index fe11312..19193f4 100644 --- a/third_party/androidx/committed/libs/androidx_sqlite_sqlite_framework_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_sqlite_sqlite_framework_android/README.chromium
@@ -1,6 +1,6 @@ Name: SQLite Framework Integration Short Name: sqlite-framework-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/sqlite/sqlite-framework-android/2.7.0-SNAPSHOT/sqlite-framework-android-2.7.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/sqlite/sqlite-framework-android/2.7.0-SNAPSHOT/sqlite-framework-android-2.7.0-20260320.125622-1.aar Version: 2.7.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_test_uiautomator_uiautomator/README.chromium b/third_party/androidx/committed/libs/androidx_test_uiautomator_uiautomator/README.chromium index 7bef1ce..9f9c1c8f8 100644 --- a/third_party/androidx/committed/libs/androidx_test_uiautomator_uiautomator/README.chromium +++ b/third_party/androidx/committed/libs/androidx_test_uiautomator_uiautomator/README.chromium
@@ -1,6 +1,6 @@ Name: UIAutomator Short Name: uiautomator -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/test/uiautomator/uiautomator/2.4.0-SNAPSHOT/uiautomator-2.4.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/test/uiautomator/uiautomator/2.4.0-SNAPSHOT/uiautomator-2.4.0-20260320.125622-1.aar Version: 2.4.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_test_uiautomator_uiautomator_shell_android/README.chromium b/third_party/androidx/committed/libs/androidx_test_uiautomator_uiautomator_shell_android/README.chromium index 86280cc..9dbfea65 100644 --- a/third_party/androidx/committed/libs/androidx_test_uiautomator_uiautomator_shell_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_test_uiautomator_uiautomator_shell_android/README.chromium
@@ -1,6 +1,6 @@ Name: Shell Short Name: uiautomator-shell-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/test/uiautomator/uiautomator-shell-android/2.4.0-SNAPSHOT/uiautomator-shell-android-2.4.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/test/uiautomator/uiautomator-shell-android/2.4.0-SNAPSHOT/uiautomator-shell-android-2.4.0-20260320.125622-1.aar Version: 2.4.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_tracing_tracing_android/README.chromium b/third_party/androidx/committed/libs/androidx_tracing_tracing_android/README.chromium index 3266000..09d3d22 100644 --- a/third_party/androidx/committed/libs/androidx_tracing_tracing_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_tracing_tracing_android/README.chromium
@@ -1,6 +1,6 @@ Name: Tracing Short Name: tracing-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/tracing/tracing-android/2.0.0-SNAPSHOT/tracing-android-2.0.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/tracing/tracing-android/2.0.0-SNAPSHOT/tracing-android-2.0.0-20260320.125622-1.aar Version: 2.0.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_tracing_tracing_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_tracing_tracing_ktx/README.chromium index e87b1d6..4f14ecc 100644 --- a/third_party/androidx/committed/libs/androidx_tracing_tracing_ktx/README.chromium +++ b/third_party/androidx/committed/libs/androidx_tracing_tracing_ktx/README.chromium
@@ -1,6 +1,6 @@ Name: Tracing Kotlin Extensions Short Name: tracing-ktx -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/tracing/tracing-ktx/2.0.0-SNAPSHOT/tracing-ktx-2.0.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/tracing/tracing-ktx/2.0.0-SNAPSHOT/tracing-ktx-2.0.0-20260320.125622-1.aar Version: 2.0.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_viewpager2_viewpager2/README.chromium b/third_party/androidx/committed/libs/androidx_viewpager2_viewpager2/README.chromium index b92eaf7..02a590d 100644 --- a/third_party/androidx/committed/libs/androidx_viewpager2_viewpager2/README.chromium +++ b/third_party/androidx/committed/libs/androidx_viewpager2_viewpager2/README.chromium
@@ -1,6 +1,6 @@ Name: ViewPager2 Short Name: viewpager2 -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/viewpager2/viewpager2/1.2.0-SNAPSHOT/viewpager2-1.2.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/viewpager2/viewpager2/1.2.0-SNAPSHOT/viewpager2-1.2.0-20260320.125622-1.aar Version: 1.2.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_webkit_webkit/README.chromium b/third_party/androidx/committed/libs/androidx_webkit_webkit/README.chromium index cba601c8e..d04dd1a 100644 --- a/third_party/androidx/committed/libs/androidx_webkit_webkit/README.chromium +++ b/third_party/androidx/committed/libs/androidx_webkit_webkit/README.chromium
@@ -1,6 +1,6 @@ Name: Webkit Short Name: webkit -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/webkit/webkit/1.16.0-SNAPSHOT/webkit-1.16.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/webkit/webkit/1.16.0-SNAPSHOT/webkit-1.16.0-20260320.125622-1.aar Version: 1.16.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_window_sidecar_sidecar/README.chromium b/third_party/androidx/committed/libs/androidx_window_sidecar_sidecar/README.chromium index 0a2d5ec..41ce65a 100644 --- a/third_party/androidx/committed/libs/androidx_window_sidecar_sidecar/README.chromium +++ b/third_party/androidx/committed/libs/androidx_window_sidecar_sidecar/README.chromium
@@ -1,6 +1,6 @@ Name: WindowManager Sidecar Short Name: sidecar -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/window/sidecar/sidecar/1.0.0-SNAPSHOT/sidecar-1.0.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/window/sidecar/sidecar/1.0.0-SNAPSHOT/sidecar-1.0.0-20260320.125622-1.aar Version: 1.0.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_window_window/README.chromium b/third_party/androidx/committed/libs/androidx_window_window/README.chromium index ead6083..580e41f 100644 --- a/third_party/androidx/committed/libs/androidx_window_window/README.chromium +++ b/third_party/androidx/committed/libs/androidx_window_window/README.chromium
@@ -1,6 +1,6 @@ Name: WindowManager Short Name: window -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/window/window/1.6.0-SNAPSHOT/window-1.6.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/window/window/1.6.0-SNAPSHOT/window-1.6.0-20260320.125622-1.aar Version: 1.6.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_window_window_core_android/README.chromium b/third_party/androidx/committed/libs/androidx_window_window_core_android/README.chromium index 73d54154..d4630d03 100644 --- a/third_party/androidx/committed/libs/androidx_window_window_core_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_window_window_core_android/README.chromium
@@ -1,6 +1,6 @@ Name: WindowManager Core Short Name: window-core-android -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/window/window-core-android/1.6.0-SNAPSHOT/window-core-android-1.6.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/window/window-core-android/1.6.0-SNAPSHOT/window-core-android-1.6.0-20260320.125622-1.aar Version: 1.6.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_work_work_multiprocess/README.chromium b/third_party/androidx/committed/libs/androidx_work_work_multiprocess/README.chromium index a2de317..aeb18ec 100644 --- a/third_party/androidx/committed/libs/androidx_work_work_multiprocess/README.chromium +++ b/third_party/androidx/committed/libs/androidx_work_work_multiprocess/README.chromium
@@ -1,6 +1,6 @@ Name: WorkManager Multiprocess Short Name: work-multiprocess -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/work/work-multiprocess/2.12.0-SNAPSHOT/work-multiprocess-2.12.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/work/work-multiprocess/2.12.0-SNAPSHOT/work-multiprocess-2.12.0-20260320.125622-1.aar Version: 2.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_work_work_runtime/README.chromium b/third_party/androidx/committed/libs/androidx_work_work_runtime/README.chromium index 2505498..6bde435 100644 --- a/third_party/androidx/committed/libs/androidx_work_work_runtime/README.chromium +++ b/third_party/androidx/committed/libs/androidx_work_work_runtime/README.chromium
@@ -1,6 +1,6 @@ Name: WorkManager Runtime Short Name: work-runtime -URL: https://androidx.dev/snapshots/builds/15059470/artifacts/repository/androidx/work/work-runtime/2.12.0-SNAPSHOT/work-runtime-2.12.0-20260320.055805-1.aar +URL: https://androidx.dev/snapshots/builds/15060837/artifacts/repository/androidx/work/work-runtime/2.12.0-SNAPSHOT/work-runtime-2.12.0-20260320.125622-1.aar Version: 2.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/blink/public/mojom/loader/content_security_notifier.mojom b/third_party/blink/public/mojom/loader/content_security_notifier.mojom index bc1e5c2d..6fa1885 100644 --- a/third_party/blink/public/mojom/loader/content_security_notifier.mojom +++ b/third_party/blink/public/mojom/loader/content_security_notifier.mojom
@@ -21,10 +21,24 @@ // connection with certificate errors was displayed. NotifyContentWithCertificateErrorsDisplayed(); - // Notifies that an embedded execution context with |origin| ran active + // Indicates which execution context's security rules triggered the mixed + // content violation. Note that in both cases, this IPC is emitted by the + // document or worker that actually loaded the insecure resource. This enum + // tells the browser which context's strictness caused the load to be flagged: + // + // - kTopFrame: The violation occurred because the top-level document is + // secure, protecting the user's expectation of security (the URL bar + // padlock). + // - kCurrentFrame: The violation occurred because the current document + // (or worker) itself is a secure context protecting its own integrity, + // even if it is embedded within an insecure top-level page. + enum InsecureContentOrigin { + kTopFrame, + kCurrentFrame, + }; + + // Notifies that an embedded execution context ran active // content (such as a script) from an insecure source. - // TODO(nhiroki): Stop passing the origin, and instead take it from the - // execution context host. - NotifyInsecureContentRan(url.mojom.Url origin, - url.mojom.Url insecure_url); + NotifyInsecureContentRan(url.mojom.Url insecure_url, + InsecureContentOrigin origin_type); };
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 b9d45ef..10b7fb7c 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
@@ -5156,6 +5156,8 @@ kXRMeshDetection = 5839, kXRFrameDetectedMeshes = 5840, kCSSLightDarkImage = 5841, + kCSSTimelineLookupFoundNothing = 5842, + kCSSTimelineScopeAttachedMultiple = 5843, // Add new features immediately above this line. Don't change the existing // numbers of any item, and don't reuse removed slots. Also don't add extra
diff --git a/third_party/blink/renderer/bindings/core/v8/js_event_handler_for_content_attribute.cc b/third_party/blink/renderer/bindings/core/v8/js_event_handler_for_content_attribute.cc index b4b2502..dea1f9d 100644 --- a/third_party/blink/renderer/bindings/core/v8/js_event_handler_for_content_attribute.cc +++ b/third_party/blink/renderer/bindings/core/v8/js_event_handler_for_content_attribute.cc
@@ -7,6 +7,7 @@ #include "third_party/blink/renderer/bindings/core/v8/script_controller.h" #include "third_party/blink/renderer/bindings/core/v8/to_v8_traits.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" +#include "third_party/blink/renderer/core/ad_tracker/ad_tracker.h" #include "third_party/blink/renderer/core/dom/events/event_target.h" #include "third_party/blink/renderer/core/events/error_event.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" @@ -25,8 +26,21 @@ if (value.IsNull()) return nullptr; DCHECK(IsA<LocalDOMWindow>(context)); - return MakeGarbageCollected<JSEventHandlerForContentAttribute>(context, name, - value, type); + auto* handler = MakeGarbageCollected<JSEventHandlerForContentAttribute>( + context, name, value, type); + + if (AdTracker* ad_tracker = AdTracker::FromExecutionContext(context)) { + AdTracker::AdScriptAncestry ancestry; + if (ad_tracker->IsAdScriptInStack(AdTracker::StackType::kTopOnly, + AdTracker::MonkeyPatchableApi::kNone, + &ancestry)) { + handler->SetAdRelated(!ancestry.ancestry_chain.empty() + ? std::make_optional(ancestry.ancestry_chain[0]) + : std::nullopt); + } + } + + return handler; } JSEventHandlerForContentAttribute::JSEventHandlerForContentAttribute( @@ -231,6 +245,15 @@ return v8::Null(isolate); } + if (is_ad_related_) { + if (AdTracker* ad_tracker = AdTracker::FromExecutionContext( + execution_context_of_event_target)) { + ad_tracker->RegisterAdScript(v8_context_of_event_target, + V8ScriptId(compiled_function->ScriptId()), + parent_ad_script_); + } + } + // Step 12. Set eventHandler's value to the result of creating a Web IDL // EventHandler callback function object whose object reference is function // and whose callback context is settings object.
diff --git a/third_party/blink/renderer/bindings/core/v8/js_event_handler_for_content_attribute.h b/third_party/blink/renderer/bindings/core/v8/js_event_handler_for_content_attribute.h index 275dfc2..092c727 100644 --- a/third_party/blink/renderer/bindings/core/v8/js_event_handler_for_content_attribute.h +++ b/third_party/blink/renderer/bindings/core/v8/js_event_handler_for_content_attribute.h
@@ -6,6 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_JS_EVENT_HANDLER_FOR_CONTENT_ATTRIBUTE_H_ #include "third_party/blink/renderer/bindings/core/v8/js_event_handler.h" +#include "third_party/blink/renderer/core/ad_tracker/ad_script_identifier.h" #include "third_party/blink/renderer/platform/bindings/dom_wrapper_world.h" #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" #include "third_party/blink/renderer/platform/wtf/text/text_position.h" @@ -38,6 +39,11 @@ const String& ScriptBody() const override { return script_body_; } + void SetAdRelated(const std::optional<AdScriptIdentifier>& ad_script) { + is_ad_related_ = true; + parent_ad_script_ = ad_script; + } + protected: // blink::JSBasedEventListener override: v8::Isolate* GetIsolate() const override { return isolate_; } @@ -73,6 +79,8 @@ String source_url_; TextPosition position_; v8::Isolate* isolate_; + bool is_ad_related_ = false; + std::optional<AdScriptIdentifier> parent_ad_script_; }; } // namespace blink
diff --git a/third_party/blink/renderer/bindings/generated_in_core.gni b/third_party/blink/renderer/bindings/generated_in_core.gni index 920f970..4a2a82a3 100644 --- a/third_party/blink/renderer/bindings/generated_in_core.gni +++ b/third_party/blink/renderer/bindings/generated_in_core.gni
@@ -140,6 +140,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_aria_notification_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_assigned_nodes_options.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_assigned_nodes_options.h", + "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_attach_internals_options.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_attach_internals_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_attribution_reporting_request_options.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_attribution_reporting_request_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_base_keyframe.cc", @@ -1022,6 +1024,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_edit_context.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_element.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_element.h", + "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_element_behavior.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_element_behavior.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_element_internals.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_element_internals.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_error_event.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_core.gni b/third_party/blink/renderer/bindings/idl_in_core.gni index 4ee039a..0c56c97ed 100644 --- a/third_party/blink/renderer/bindings/idl_in_core.gni +++ b/third_party/blink/renderer/bindings/idl_in_core.gni
@@ -393,6 +393,7 @@ "//third_party/blink/renderer/core/html/canvas/text_metrics.idl", "//third_party/blink/renderer/core/html/closewatcher/close_watcher.idl", "//third_party/blink/renderer/core/html/closewatcher/close_watcher_options.idl", + "//third_party/blink/renderer/core/html/custom/attach_internals_options.idl", "//third_party/blink/renderer/core/html/custom/custom_element_registry.idl", "//third_party/blink/renderer/core/html/custom/custom_state_set.idl", "//third_party/blink/renderer/core/html/custom/element_internals.idl", @@ -406,6 +407,7 @@ "//third_party/blink/renderer/core/html/forms/autofill_event.idl", "//third_party/blink/renderer/core/html/forms/autofill_field_data.idl", "//third_party/blink/renderer/core/html/forms/autofill_refill_callback.idl", + "//third_party/blink/renderer/core/html/forms/element_behavior.idl", "//third_party/blink/renderer/core/html/forms/form_data.idl", "//third_party/blink/renderer/core/html/forms/form_data_event.idl", "//third_party/blink/renderer/core/html/forms/form_data_event_init.idl",
diff --git a/third_party/blink/renderer/core/ad_tracker/ad_tracker.cc b/third_party/blink/renderer/core/ad_tracker/ad_tracker.cc index 6ea82ee..9996b07a 100644 --- a/third_party/blink/renderer/core/ad_tracker/ad_tracker.cc +++ b/third_party/blink/renderer/core/ad_tracker/ad_tracker.cc
@@ -382,6 +382,28 @@ async_script_stack_.pop_back(); } +void AdTracker::RegisterAdScript( + v8::Local<v8::Context> v8_context, + V8ScriptId script_id, + const std::optional<AdScriptIdentifier>& parent_ad_script) { + DCHECK_NE(v8::Message::kNoScriptIdInfo, script_id.value()); + String script_name = GenerateFakeUrlFromScriptId(script_id); + + AdProvenance provenance; + if (parent_ad_script.has_value() && + parent_ad_script->id != AdScriptIdentifier::kEmptyId) { + provenance = parent_ad_script->id; + } else { + provenance = NoProvenance{}; + } + + ad_script_data_.insert( + script_id, + AdScriptData(AdScriptIdentifier(GetDebuggerIdForContext(v8_context), + script_id, script_name), + std::move(provenance))); +} + bool AdTracker::IsAdScriptInStack(StackType stack_type, MonkeyPatchableApi ignore_monkey_patch, AdScriptAncestry* out_ad_script_ancestry) {
diff --git a/third_party/blink/renderer/core/ad_tracker/ad_tracker.h b/third_party/blink/renderer/core/ad_tracker/ad_tracker.h index 919f24a..3a50c05 100644 --- a/third_party/blink/renderer/core/ad_tracker/ad_tracker.h +++ b/third_party/blink/renderer/core/ad_tracker/ad_tracker.h
@@ -123,6 +123,14 @@ // Called when the ad-related task has finished running. void DidFinishAsyncTask(probe::AsyncTaskContext* task_context); + // Registers a script as an ad script with the given provenance. This is used + // for scripts that are not loaded via a resource request but are instead + // created dynamically (e.g., from a DOM attribute). + void RegisterAdScript( + v8::Local<v8::Context> v8_context, + V8ScriptId script_id, + const std::optional<AdScriptIdentifier>& parent_ad_script); + // Returns true if any script in the pseudo call stack has previously been // identified as an ad resource, if the current ExecutionContext is a known ad // execution context, or if the script at the top of isolate's
diff --git a/third_party/blink/renderer/core/ad_tracker/ad_tracker_test.cc b/third_party/blink/renderer/core/ad_tracker/ad_tracker_test.cc index 0e330efe..4de0df97 100644 --- a/third_party/blink/renderer/core/ad_tracker/ad_tracker_test.cc +++ b/third_party/blink/renderer/core/ad_tracker/ad_tracker_test.cc
@@ -4060,4 +4060,231 @@ EXPECT_TRUE(ad_tracker_->RequestWithUrlTaggedAsAd(image_url)); } +// Tests that an event handler added as an attribute by an ad script is +// correctly attributed to that ad script. +TEST_F(AdTrackerSimTest, AdScriptAncestry_AttributeScript) { + String ad_script_url = "https://example.com/ad_script.js?ad=true"; + String image_url = "https://example.com/pixel.png"; + + SimSubresourceRequest ad_script(ad_script_url, "text/javascript"); + SimSubresourceRequest image(image_url, "image/png"); + + main_resource_->Complete(R"HTML( + <body> + <div id='test_div'>Click me</div> + <script src="ad_script.js?ad=true"></script> + </body> + )HTML"); + + // The ad script adds an onclick attribute to the div. + ad_script.Complete(R"SCRIPT( + const div = document.getElementById('test_div'); + div.setAttribute('onclick', "const img = document.createElement('img'); img.src = 'pixel.png';"); + )SCRIPT"); + base::RunLoop().RunUntilIdle(); + + // Click the div to trigger the event handler. + Element* div = GetDocument().getElementById(AtomicString("test_div")); + div->DispatchSimulatedClick(nullptr); + base::RunLoop().RunUntilIdle(); + + ad_tracker_->WaitForSubresource(image_url); + image.Complete(); + + // The image request should be tagged as an ad because it was initiated by the + // attribute script, which was created by the ad script. + EXPECT_TRUE(ad_tracker_->RequestWithUrlTaggedAsAd(image_url)); + + // Verify that the ad script itself is known. + EXPECT_TRUE( + IsKnownAdScript(GetDocument().GetExecutionContext(), ad_script_url)); +} + +// Tests that an event handler added via document.write by an ad script is +// correctly attributed. +TEST_F(AdTrackerSimTest, AdScriptAncestry_DocumentWriteAttributeScript) { + String ad_script_url = "https://example.com/ad_script.js?ad=true"; + String image_url = "https://example.com/pixel.png"; + + SimSubresourceRequest ad_script(ad_script_url, "text/javascript"); + SimSubresourceRequest image(image_url, "image/png"); + + main_resource_->Complete(R"HTML( + <body> + <script src="ad_script.js?ad=true"></script> + </body> + )HTML"); + + // The ad script uses document.write to add a div with an onclick attribute. + ad_script.Complete(R"SCRIPT( + document.write("<div id='test_div' onclick='const img = document.createElement(\"img\"); img.src = \"pixel.png\";'>Click me</div>"); + )SCRIPT"); + base::RunLoop().RunUntilIdle(); + + // Click the div to trigger the event handler. + Element* div = GetDocument().getElementById(AtomicString("test_div")); + ASSERT_TRUE(div); + div->DispatchSimulatedClick(nullptr); + base::RunLoop().RunUntilIdle(); + + ad_tracker_->WaitForSubresource(image_url); + image.Complete(); + + // The image request should be tagged as an ad. + EXPECT_TRUE(ad_tracker_->RequestWithUrlTaggedAsAd(image_url)); +} + +// Tests that an event handler added via innerHTML by an ad script is +// correctly attributed. +TEST_F(AdTrackerSimTest, AdScriptAncestry_InnerHTMLAttributeScript) { + String ad_script_url = "https://example.com/ad_script.js?ad=true"; + String image_url = "https://example.com/pixel.png"; + + SimSubresourceRequest ad_script(ad_script_url, "text/javascript"); + SimSubresourceRequest image(image_url, "image/png"); + + main_resource_->Complete(R"HTML( + <body> + <div id='container'></div> + <script src="ad_script.js?ad=true"></script> + </body> + )HTML"); + + // The ad script uses innerHTML to add a div with an onclick attribute. + ad_script.Complete(R"SCRIPT( + document.getElementById('container').innerHTML = + "<div id='test_div' onclick='const img = document.createElement(\"img\"); img.src = \"pixel.png\";'>Click me</div>"; + )SCRIPT"); + base::RunLoop().RunUntilIdle(); + + // Click the div to trigger the event handler. + Element* div = GetDocument().getElementById(AtomicString("test_div")); + ASSERT_TRUE(div); + div->DispatchSimulatedClick(nullptr); + base::RunLoop().RunUntilIdle(); + + ad_tracker_->WaitForSubresource(image_url); + image.Complete(); + + // The image request should be tagged as an ad. + EXPECT_TRUE(ad_tracker_->RequestWithUrlTaggedAsAd(image_url)); +} + +// Tests that an event handler added via document.write into a subframe by an ad +// script is correctly attributed. +TEST_F(AdTrackerSimTest, + AdScriptAncestry_SubframeDocumentWriteAttributeScript) { + String ad_script_url = "https://example.com/ad_script.js?ad=true"; + String image_url = "https://example.com/pixel.png"; + + SimSubresourceRequest ad_script(ad_script_url, "text/javascript"); + SimSubresourceRequest image(image_url, "image/png"); + + main_resource_->Complete(R"HTML( + <body> + <iframe id='subframe'></iframe> + <script src="ad_script.js?ad=true"></script> + </body> + )HTML"); + + // The ad script uses document.write to add a div with an onclick attribute to + // the subframe. + ad_script.Complete(R"SCRIPT( + const subframe = document.getElementById('subframe'); + const doc = subframe.contentWindow.document; + doc.open(); + doc.write("<div id='test_div' onclick='const img = document.createElement(\"img\"); img.src = \"https://example.com/pixel.png\";'>Click me</div>"); + doc.close(); + )SCRIPT"); + base::RunLoop().RunUntilIdle(); + + // Click the div to trigger the event handler. + LocalFrame* subframe = + To<LocalFrame>(GetDocument().GetFrame()->Tree().FirstChild()); + Element* div = + subframe->GetDocument()->getElementById(AtomicString("test_div")); + ASSERT_TRUE(div); + div->DispatchSimulatedClick(nullptr); + base::RunLoop().RunUntilIdle(); + + ad_tracker_->WaitForSubresource(image_url); + image.Complete(); + + // The image request should be tagged as an ad. + EXPECT_TRUE(ad_tracker_->RequestWithUrlTaggedAsAd(image_url)); +} + +// Tests that an event handler added via setAttributeNode by an ad script is +// correctly attributed. +TEST_F(AdTrackerSimTest, AdScriptAncestry_SetAttributeNodeAttributeScript) { + String ad_script_url = "https://example.com/ad_script.js?ad=true"; + String image_url = "https://example.com/pixel.png"; + + SimSubresourceRequest ad_script(ad_script_url, "text/javascript"); + SimSubresourceRequest image(image_url, "image/png"); + + main_resource_->Complete(R"HTML( + <body> + <div id='test_div'>Click me</div> + <script src="ad_script.js?ad=true"></script> + </body> + )HTML"); + + // The ad script adds an onclick attribute to the div using setAttributeNode. + ad_script.Complete(R"SCRIPT( + const div = document.getElementById('test_div'); + const attr = document.createAttribute('onclick'); + attr.value = "const img = document.createElement('img'); img.src = 'pixel.png';"; + div.setAttributeNode(attr); + )SCRIPT"); + base::RunLoop().RunUntilIdle(); + + // Click the div to trigger the event handler. + Element* div = GetDocument().getElementById(AtomicString("test_div")); + ASSERT_TRUE(div); + div->DispatchSimulatedClick(nullptr); + base::RunLoop().RunUntilIdle(); + + ad_tracker_->WaitForSubresource(image_url); + image.Complete(); + + // The image request should be tagged as an ad. + EXPECT_TRUE(ad_tracker_->RequestWithUrlTaggedAsAd(image_url)); +} + +// Tests that an event handler in the initial HTML of an ad frame is correctly +// attributed. +TEST_F(AdTrackerSimTest, AdScriptAncestry_InitialHTMLAttributeScriptInAdFrame) { + String image_url = "https://example.com/pixel.png"; + SimRequest ad_frame("https://example.com/ad_frame.html", "text/html"); + SimSubresourceRequest image(image_url, "image/png"); + + // Create an iframe that's considered an ad. + main_resource_->Complete( + "<body><iframe src='ad_frame.html'></iframe></body>"); + auto* child_frame = + To<LocalFrame>(GetDocument().GetFrame()->Tree().FirstChild()); + SetIsAdFrame(child_frame); + + // The ad frame has an onclick attribute in its initial HTML. + ad_frame.Complete(R"HTML( + <div id='test_div' onclick='const img = document.createElement("img"); img.src = "pixel.png";'>Click me</div> + )HTML"); + base::RunLoop().RunUntilIdle(); + + // Click the div to trigger the event handler. + Element* div = + child_frame->GetDocument()->getElementById(AtomicString("test_div")); + ASSERT_TRUE(div); + div->DispatchSimulatedClick(nullptr); + base::RunLoop().RunUntilIdle(); + + ad_tracker_->WaitForSubresource(image_url); + image.Complete(); + + // The image request should be tagged as an ad because it was initiated from + // an ad frame. + EXPECT_TRUE(ad_tracker_->RequestWithUrlTaggedAsAd(image_url)); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/animation/css/css_animations.cc b/third_party/blink/renderer/core/animation/css/css_animations.cc index eefbb0a7c..25e6dc0 100644 --- a/third_party/blink/renderer/core/animation/css/css_animations.cc +++ b/third_party/blink/renderer/core/animation/css/css_animations.cc
@@ -1428,6 +1428,8 @@ Element* parent_element = ParentElementForTimelineTraversal(*node); if (!parent_element) { + UseCounter::Count(node->GetDocument(), + WebFeature::kCSSTimelineLookupFoundNothing); if (RuntimeEnabledFeatures::CSSTimelineScopeGlobalEnabled()) { return &node->GetDocument() .GetDocumentAnimations()
diff --git a/third_party/blink/renderer/core/animation/css/css_animations_test.cc b/third_party/blink/renderer/core/animation/css/css_animations_test.cc index ac0bd4b..06d0318 100644 --- a/third_party/blink/renderer/core/animation/css/css_animations_test.cc +++ b/third_party/blink/renderer/core/animation/css/css_animations_test.cc
@@ -1853,6 +1853,42 @@ auto_offset, auto_offset); } +TEST_P(CSSAnimationsTriggerTest, TimelineTriggerAbsolutePositioned) { + SetBodyInnerHTML(R"HTML( + <style> + @keyframes expand { + from { transform: scaleX(2); } + to { transform: scaleX(5); } + } + .trigger { + position: absolute; + timeline-trigger: --trigger view(); + height: 100px; + width: 100px; + } + .triggered { + height: 50px; + width: 50px; + animation: expand 1s; + animation-trigger: --trigger play-forwards play-backwards; + } + </style> + <div id="trigger" class="trigger"></div> + <div id="triggered" class="triggered"></div> + )HTML"); + UpdateAllLifecyclePhasesForTest(); + + Element* target = GetDocument().getElementById(AtomicString("triggered")); + ASSERT_TRUE(target); + + ElementAnimations* animations = target->GetElementAnimations(); + CSSAnimation* animation = + DynamicTo<CSSAnimation>((*animations->Animations().begin()).key.Get()); + + EXPECT_EQ(animation->GetTriggers().size(), 1); + EXPECT_TRUE(animation->GetTriggers().begin()->Get()->IsTimelineTrigger()); +} + TEST_P(CSSAnimationsTriggerTest, TimelineTriggerViewOnly) { SetBodyInnerHTML(R"HTML( <style> @@ -2877,4 +2913,115 @@ /*is_scroll=*/true, /*is_document=*/false); } +// The lookup of --t on #target does not find anything here +// because there is no timeline defined in the ancestor chain. +TEST_P(CSSAnimationsTest, CSSTimelineFoundNothing_Count) { + ScopedCSSTimelineScopeGlobalForTest scoped_feature(false); + + SetBodyInnerHTML(R"HTML( + <style> + @keyframes --anim { to { opacity: 1; } } + #scroller { scroll-timeline: --t; } + #target { + animation: --anim 1s; + animation-timeline: --t; + } + </style> + <div id="scroller"></div> + <div id="target"></div> + )HTML"); + + UpdateAllLifecyclePhasesForTest(); + EXPECT_TRUE(IsUseCounted(WebFeature::kCSSTimelineLookupFoundNothing)); +} + +TEST_P(CSSAnimationsTest, CSSTimelineFoundNothing_NoCount) { + ScopedCSSTimelineScopeGlobalForTest scoped_feature(false); + + SetBodyInnerHTML(R"HTML( + <style> + @keyframes --anim { to { opacity: 1; } } + #scroller { scroll-timeline: --t; } + #target { + animation: --anim 1s; + animation-timeline: --t; + } + </style> + <div id="scroller"> + <div id="target"></div> + </div> + )HTML"); + + UpdateAllLifecyclePhasesForTest(); + EXPECT_FALSE(IsUseCounted(WebFeature::kCSSTimelineLookupFoundNothing)); +} + +TEST_P(CSSAnimationsTest, CSSTimelineScopeAttachedMultiple_Count) { + ScopedCSSTimelineScopeGlobalForTest scoped_feature(false); + + SetBodyInnerHTML(R"HTML( + <style> + @keyframes --anim { to { opacity: 1; } } + #scope { timeline-scope: --t; } + #scroll1, #scroll2 { scroll-timeline: --t; } + #target { + animation: --anim, 1s; + animation-timeline: --t; + } + </style> + <div id="scope"> + <div id="scroll1"></div> + <div id="scroll2"></div> + <div id="target"></div> + </div> + )HTML"); + + UpdateAllLifecyclePhasesForTest(); + EXPECT_TRUE(IsUseCounted(WebFeature::kCSSTimelineScopeAttachedMultiple)); +} + +TEST_P(CSSAnimationsTest, CSSTimelineScopeAttachedMultiple_NoCount_Zero) { + ScopedCSSTimelineScopeGlobalForTest scoped_feature(false); + + SetBodyInnerHTML(R"HTML( + <style> + @keyframes --anim { to { opacity: 1; } } + #scope { timeline-scope: --t; } + #target { + animation: --anim, 1s; + animation-timeline: --t; + } + </style> + <div id="scope"> + <div id="target"></div> + </div> + )HTML"); + + UpdateAllLifecyclePhasesForTest(); + EXPECT_FALSE(IsUseCounted(WebFeature::kCSSTimelineScopeAttachedMultiple)); +} + +TEST_P(CSSAnimationsTest, CSSTimelineScopeAttachedMultiple_NoCount_One) { + ScopedCSSTimelineScopeGlobalForTest scoped_feature(false); + + SetBodyInnerHTML(R"HTML( + <style> + @keyframes --anim { to { opacity: 1; } } + #scope { timeline-scope: --t; } + #scroll1 { scroll-timeline: --t; } + #target { + animation: --anim, 1s; + animation-timeline: --t; + } + </style> + <div id="scope"> + <div id="scroll1"></div> + <div id="target"></div> + </div> + )HTML"); + + UpdateAllLifecyclePhasesForTest(); + EXPECT_FALSE(IsUseCounted(WebFeature::kCSSTimelineScopeAttachedMultiple)); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/animation/css_color_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_color_interpolation_type.cc index ff40d829..bcd00a9 100644 --- a/third_party/blink/renderer/core/animation/css_color_interpolation_type.cc +++ b/third_party/blink/renderer/core/animation/css_color_interpolation_type.cc
@@ -165,8 +165,9 @@ color_provider); } - if (state && (value.IsLightDarkValuePair() || value.IsColorMixValue() || - value.IsRelativeColorValue() || value.IsContrastColorValue())) { + if (state && (value.IsLightDarkValuePair() || value.IsAlphaColorValue() || + value.IsColorMixValue() || value.IsRelativeColorValue() || + value.IsContrastColorValue())) { ResolveColorValueContext context{ .length_resolver = state->CssToLengthConversionData(), .text_link_colors = state->GetDocument().GetTextLinkColors(),
diff --git a/third_party/blink/renderer/core/animation/deferred_timeline.cc b/third_party/blink/renderer/core/animation/deferred_timeline.cc index da16feb..27d6399 100644 --- a/third_party/blink/renderer/core/animation/deferred_timeline.cc +++ b/third_party/blink/renderer/core/animation/deferred_timeline.cc
@@ -7,6 +7,8 @@ #include "third_party/blink/renderer/core/animation/scroll_timeline.h" #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/dom/layout_tree_builder_traversal.h" +#include "third_party/blink/renderer/core/frame/web_feature.h" +#include "third_party/blink/renderer/platform/instrumentation/use_counter.h" #include "third_party/blink/renderer/platform/wtf/wtf_size_t.h" namespace blink { @@ -45,6 +47,11 @@ attached_timelines_.insert(insertion_point, timeline); + if (attached_timelines_.size() > 1) { + UseCounter::Count(GetDocument(), + WebFeature::kCSSTimelineScopeAttachedMultiple); + } + if (original_timeline != EffectiveScrollTimeline()) { OnAttachedTimelineChange(); }
diff --git a/third_party/blink/renderer/core/animation/document_animations.cc b/third_party/blink/renderer/core/animation/document_animations.cc index 88218451..8d07faf 100644 --- a/third_party/blink/renderer/core/animation/document_animations.cc +++ b/third_party/blink/renderer/core/animation/document_animations.cc
@@ -51,6 +51,7 @@ #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/frame/settings.h" #include "third_party/blink/renderer/core/layout/layout_box.h" +#include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/layout/physical_box_fragment.h" #include "third_party/blink/renderer/core/page/chrome_client.h" #include "third_party/blink/renderer/core/page/page.h" @@ -76,6 +77,7 @@ // static void DocumentAnimations::FindRelevantTriggerAttachments( CSSAnimation& animation, + TriggerScopedNameMap& global_trigger_map, TriggerAttachmentMap& relevant_attachments_out) { const Member<const StyleTriggerAttachmentVector>& animation_trigger_attachments = animation.GetTriggerAttachments(); @@ -88,12 +90,6 @@ return; } - // Map to accumulate all scoped triggers known to ancestors (who might be - // aware of triggers that are outside the owning_element's ancestry but in the - // same trigger-scope - such a trigger might come later in tree-order and - // therefore be the correct candidate). - TriggerScopedNameMap* global_trigger_map = - MakeGarbageCollected<TriggerScopedNameMap>(); // Map to accumulate triggers defined on elements in the ancestry of the // owning element. These are to be checked first before looking at the global // list. @@ -102,12 +98,6 @@ const Element* element = owning_element; while (element) { - const LayoutBox* element_box = element->GetLayoutBox(); - if (!element_box) { - element = element->parentElement(); - continue; - } - if (NamedAnimationTriggerMap* element_named_triggers = element->NamedTriggers()) { for (const auto& named_trigger : element_named_triggers->Keys()) { @@ -122,17 +112,6 @@ } } - for (const auto& fragment : element_box->PhysicalFragments()) { - const TriggerScopedNameMap* named_triggers = fragment.NamedTriggers(); - if (!named_triggers) { - continue; - } - - for (const auto& entry : *named_triggers) { - global_trigger_map->Set(entry.key, entry.value); - } - } - element = element->parentElement(); } @@ -157,8 +136,8 @@ } // If we didn't find a name in the ancestry, search the global map. - it = global_trigger_map->find(trigger_scoped_name); - if (it != global_trigger_map->end()) { + it = global_trigger_map.find(trigger_scoped_name); + if (it != global_trigger_map.end()) { add_relevant_trigger(it->value, trigger_scoped_name, attachment); } } @@ -456,17 +435,34 @@ } void DocumentAnimations::UpdateAnimationTriggerAttachments() { + if (!document_->GetLayoutView()) { + return; + } + HeapHashSet<WeakMember<CSSAnimation>> triggered_animations; triggered_animations.swap(triggered_animations_); + TriggerScopedNameMap* global_trigger_map = + MakeGarbageCollected<TriggerScopedNameMap>(); + + for (const auto& fragment : document_->GetLayoutView()->PhysicalFragments()) { + if (const TriggerScopedNameMap* named_triggers = fragment.NamedTriggers()) { + for (const auto& entry : *named_triggers) { + global_trigger_map->Set(entry.key, entry.value); + } + } + } + for (CSSAnimation* animation : triggered_animations) { const Member<const StyleTriggerAttachmentVector>& animation_trigger_attachments = animation->GetTriggerAttachments(); TriggerAttachmentMap relevant_attachments; if (animation_trigger_attachments) { AddTriggeredAnimation(animation); - FindRelevantTriggerAttachments(*animation, relevant_attachments); + FindRelevantTriggerAttachments(*animation, *global_trigger_map, + relevant_attachments); } + // Add new triggers, remove obsolete ones. UpdateTriggerAttachments(*animation, relevant_attachments); }
diff --git a/third_party/blink/renderer/core/animation/document_animations.h b/third_party/blink/renderer/core/animation/document_animations.h index 2f81859..b7ebe9d3 100644 --- a/third_party/blink/renderer/core/animation/document_animations.h +++ b/third_party/blink/renderer/core/animation/document_animations.h
@@ -100,6 +100,7 @@ Member<const StyleTriggerAttachment>>>; static void FindRelevantTriggerAttachments( CSSAnimation& animation, + TriggerScopedNameMap& global_trigger_map, TriggerAttachmentMap& relevant_attachments_out); static void UpdateTriggerAttachments( CSSAnimation& animation,
diff --git a/third_party/blink/renderer/core/css/build.gni b/third_party/blink/renderer/core/css/build.gni index 7ed7d0c..a0eee3b 100644 --- a/third_party/blink/renderer/core/css/build.gni +++ b/third_party/blink/renderer/core/css/build.gni
@@ -104,6 +104,8 @@ "css_content_distribution_value.h", "css_contents_mixin_rule.cc", "css_contents_mixin_rule.h", + "css_alpha_color_value.cc", + "css_alpha_color_value.h", "css_contrast_color_value.cc", "css_contrast_color_value.h", "css_counter_content_value.cc", @@ -858,6 +860,7 @@ "container_selector_test.cc", "counter_style_map_test.cc", "counter_style_test.cc", + "css_alpha_color_value_test.cc", "css_attr_type_test.cc", "css_basic_shape_values_test.cc", "css_computed_style_declaration_test.cc",
diff --git a/third_party/blink/renderer/core/css/css_alpha_color_value.cc b/third_party/blink/renderer/core/css/css_alpha_color_value.cc new file mode 100644 index 0000000..e3becdbc --- /dev/null +++ b/third_party/blink/renderer/core/css/css_alpha_color_value.cc
@@ -0,0 +1,34 @@ +// Copyright 2026 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/css/css_alpha_color_value.h" + +#include "third_party/blink/renderer/platform/wtf/text/string_builder.h" + +namespace blink::cssvalue { + +bool CSSAlphaColorValue::Equals(const CSSAlphaColorValue& other) const { + return base::ValuesEquivalent(origin_color_, other.origin_color_) && + base::ValuesEquivalent(alpha_, other.alpha_); +} + +String CSSAlphaColorValue::CustomCSSText() const { + StringBuilder result; + result.Append("alpha(from "); + result.Append(origin_color_->CssText()); + if (alpha_ != nullptr) { + result.Append(" / "); + result.Append(alpha_->CssText()); + } + result.Append(')'); + return result.ReleaseString(); +} + +void CSSAlphaColorValue::TraceAfterDispatch(blink::Visitor* visitor) const { + visitor->Trace(origin_color_); + visitor->Trace(alpha_); + CSSValue::TraceAfterDispatch(visitor); +} + +} // namespace blink::cssvalue
diff --git a/third_party/blink/renderer/core/css/css_alpha_color_value.h b/third_party/blink/renderer/core/css/css_alpha_color_value.h new file mode 100644 index 0000000..e499b14 --- /dev/null +++ b/third_party/blink/renderer/core/css/css_alpha_color_value.h
@@ -0,0 +1,57 @@ +// Copyright 2026 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_CSS_CSS_ALPHA_COLOR_VALUE_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_ALPHA_COLOR_VALUE_H_ + +#include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/css/css_value.h" +#include "third_party/blink/renderer/platform/wtf/casting.h" + +namespace blink { + +namespace cssvalue { + +// Stores the result of parsing the alpha() function before resolving it into a +// blink::Color. See https://drafts.csswg.org/css-color-5/#relative-alpha +class CORE_EXPORT CSSAlphaColorValue : public CSSValue { + public: + CSSAlphaColorValue(const CSSValue* origin_color, const CSSValue* alpha) + : CSSValue(kAlphaColorClass), + origin_color_(origin_color), + alpha_(alpha) {} + + String CustomCSSText() const; + + void TraceAfterDispatch(blink::Visitor* visitor) const; + + bool Equals(const CSSAlphaColorValue& other) const; + + const CSSValue& OriginColor() const { return *origin_color_; } + + // Alpha will be nullptr if it was not specified. + const CSSValue* Alpha() const { return alpha_.Get(); } + + bool HasRandomFunctions() const { + return origin_color_->HasRandomFunctions() || + (alpha_ && alpha_->HasRandomFunctions()); + } + + private: + Member<const CSSValue> origin_color_; + Member<const CSSValue> alpha_; +}; + +} // namespace cssvalue + +template <> +struct DowncastTraits<cssvalue::CSSAlphaColorValue> { + static bool AllowFrom(const CSSValue& value) { + return value.IsAlphaColorValue(); + } +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_ALPHA_COLOR_VALUE_H_
diff --git a/third_party/blink/renderer/core/css/css_alpha_color_value_test.cc b/third_party/blink/renderer/core/css/css_alpha_color_value_test.cc new file mode 100644 index 0000000..99ed750 --- /dev/null +++ b/third_party/blink/renderer/core/css/css_alpha_color_value_test.cc
@@ -0,0 +1,145 @@ +// Copyright 2026 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/css/css_alpha_color_value.h" + +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/core/css/css_color.h" +#include "third_party/blink/renderer/core/css/parser/css_parser.h" +#include "third_party/blink/renderer/core/css/parser/css_parser_context.h" +#include "third_party/blink/renderer/core/execution_context/security_context.h" +#include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" + +namespace blink { + +class CSSAlphaColorValueTest : public testing::Test { + protected: + CSSAlphaColorValueTest() + : context_(MakeGarbageCollected<CSSParserContext>( + kHTMLStandardMode, + SecureContextMode::kInsecureContext)) {} + + const CSSValue* Parse(const String& input) { + return CSSParser::ParseSingleValue(CSSPropertyID::kColor, input, context_); + } + + ScopedCSSAlphaColorFunctionForTest feature_{true}; + Persistent<const CSSParserContext> context_; +}; + +TEST_F(CSSAlphaColorValueTest, ParseBasic) { + const CSSValue* value = Parse("alpha(from red / 0.5)"); + ASSERT_TRUE(value); + EXPECT_TRUE(value->IsAlphaColorValue()); +} + +TEST_F(CSSAlphaColorValueTest, ParseWithCurrentColor) { + const CSSValue* value = Parse("alpha(from currentcolor / 0.5)"); + ASSERT_TRUE(value); + EXPECT_TRUE(value->IsAlphaColorValue()); +} + +TEST_F(CSSAlphaColorValueTest, ParseNoAlpha) { + const CSSValue* value = Parse("alpha(from currentcolor)"); + ASSERT_TRUE(value); + EXPECT_TRUE(value->IsAlphaColorValue()); +} + +TEST_F(CSSAlphaColorValueTest, ParseAlphaKeyword) { + const CSSValue* value = Parse("alpha(from currentcolor / alpha)"); + ASSERT_TRUE(value); + EXPECT_TRUE(value->IsAlphaColorValue()); +} + +TEST_F(CSSAlphaColorValueTest, ParseAlphaCalc) { + const CSSValue* value = Parse("alpha(from currentcolor / calc(alpha * 0.5))"); + ASSERT_TRUE(value); + EXPECT_TRUE(value->IsAlphaColorValue()); +} + +TEST_F(CSSAlphaColorValueTest, ParseAlphaNone) { + const CSSValue* value = Parse("alpha(from currentcolor / none)"); + ASSERT_TRUE(value); + EXPECT_TRUE(value->IsAlphaColorValue()); +} + +TEST_F(CSSAlphaColorValueTest, ParseAlphaPercentage) { + const CSSValue* value = Parse("alpha(from currentcolor / 50%)"); + ASSERT_TRUE(value); + EXPECT_TRUE(value->IsAlphaColorValue()); +} + +TEST_F(CSSAlphaColorValueTest, ParseInvalid_NoFrom) { + EXPECT_EQ(nullptr, Parse("alpha(red / 0.5)")); +} + +TEST_F(CSSAlphaColorValueTest, ParseInvalid_NoOriginColor) { + EXPECT_EQ(nullptr, Parse("alpha(from / 0.5)")); +} + +TEST_F(CSSAlphaColorValueTest, ParseInvalid_ExtraTokens) { + EXPECT_EQ(nullptr, Parse("alpha(from red / 0.5 0.5)")); +} + +TEST_F(CSSAlphaColorValueTest, CustomCSSText) { + const CSSValue* value1 = Parse("alpha(from currentcolor / 0.5)"); + ASSERT_TRUE(value1); + EXPECT_EQ(value1->CssText(), "alpha(from currentcolor / 0.5)"); + + const CSSValue* value2 = Parse("alpha(from currentcolor)"); + ASSERT_TRUE(value2); + EXPECT_EQ(value2->CssText(), "alpha(from currentcolor)"); + + const CSSValue* value3 = Parse("alpha(from currentcolor / alpha)"); + ASSERT_TRUE(value3); + EXPECT_EQ(value3->CssText(), "alpha(from currentcolor / alpha)"); +} + +TEST_F(CSSAlphaColorValueTest, Equals) { + const CSSValue* value1 = Parse("alpha(from currentcolor / 0.5)"); + const CSSValue* value2 = Parse("alpha(from currentcolor / 0.5)"); + const CSSValue* value3 = Parse("alpha(from currentcolor / 0.8)"); + + ASSERT_TRUE(value1); + ASSERT_TRUE(value2); + ASSERT_TRUE(value3); + EXPECT_EQ(*value1, *value2); + EXPECT_NE(*value1, *value3); +} + +TEST_F(CSSAlphaColorValueTest, HasRandomFunctions) { + // Basic alpha color values should not have random functions. + const CSSValue* value = Parse("alpha(from red / 0.5)"); + ASSERT_TRUE(value); + EXPECT_FALSE(value->HasRandomFunctions()); +} + +TEST_F(CSSAlphaColorValueTest, OriginColorAccessor) { + const CSSValue* value = Parse("alpha(from red / 0.5)"); + ASSERT_TRUE(value); + const auto* alpha_value = To<cssvalue::CSSAlphaColorValue>(value); + // "red" is parsed as a color keyword, check the origin color is present. + EXPECT_EQ(alpha_value->OriginColor().CssText(), "red"); +} + +TEST_F(CSSAlphaColorValueTest, AlphaAccessor) { + const CSSValue* with_alpha = Parse("alpha(from red / 0.5)"); + ASSERT_TRUE(with_alpha); + const auto* alpha_value = To<cssvalue::CSSAlphaColorValue>(with_alpha); + EXPECT_NE(nullptr, alpha_value->Alpha()); + + const CSSValue* without_alpha = Parse("alpha(from red)"); + ASSERT_TRUE(without_alpha); + const auto* no_alpha_value = To<cssvalue::CSSAlphaColorValue>(without_alpha); + EXPECT_EQ(nullptr, no_alpha_value->Alpha()); +} + +TEST_F(CSSAlphaColorValueTest, DisabledByDefault) { + ScopedCSSAlphaColorFunctionForTest disable(false); + // When the feature is disabled, alpha() should not parse as a color. + const CSSValue* value = Parse("alpha(from red / 0.5)"); + EXPECT_EQ(nullptr, value); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/css/css_gradient_value.cc b/third_party/blink/renderer/core/css/css_gradient_value.cc index b174fcd..a539048 100644 --- a/third_party/blink/renderer/core/css/css_gradient_value.cc +++ b/third_party/blink/renderer/core/css/css_gradient_value.cc
@@ -32,6 +32,7 @@ #include "base/memory/values_equivalent.h" #include "base/notreached.h" #include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h" +#include "third_party/blink/renderer/core/css/css_alpha_color_value.h" #include "third_party/blink/renderer/core/css/css_color.h" #include "third_party/blink/renderer/core/css/css_color_mix_value.h" #include "third_party/blink/renderer/core/css/css_contrast_color_value.h" @@ -1557,6 +1558,9 @@ return IsUsingCurrentColor(mix_value->Color1()) || IsUsingCurrentColor(mix_value->Color2()); } + if (const auto* alpha_color_value = DynamicTo<CSSAlphaColorValue>(value)) { + return IsUsingCurrentColor(alpha_color_value->OriginColor()); + } if (const auto* contrast_value = DynamicTo<CSSContrastColorValue>(value)) { return IsUsingCurrentColor(contrast_value->Color()); }
diff --git a/third_party/blink/renderer/core/css/css_value.cc b/third_party/blink/renderer/core/css/css_value.cc index 7cf314f..e2606f64 100644 --- a/third_party/blink/renderer/core/css/css_value.cc +++ b/third_party/blink/renderer/core/css/css_value.cc
@@ -26,6 +26,7 @@ #include "third_party/blink/renderer/core/css/css_value.h" +#include "third_party/blink/renderer/core/css/css_alpha_color_value.h" #include "third_party/blink/renderer/core/css/css_alternate_value.h" #include "third_party/blink/renderer/core/css/css_axis_value.h" #include "third_party/blink/renderer/core/css/css_basic_shape_values.h" @@ -208,6 +209,8 @@ case kBorderImageSliceClass: return CompareCSSValues<cssvalue::CSSBorderImageSliceValue>(*this, other); + case kAlphaColorClass: + return CompareCSSValues<cssvalue::CSSAlphaColorValue>(*this, other); case kColorClass: return CompareCSSValues<cssvalue::CSSColor>(*this, other); case kColorMixClass: @@ -396,6 +399,8 @@ return To<cssvalue::CSSBasicShapeXYWHValue>(this)->CustomCSSText(); case kBorderImageSliceClass: return To<cssvalue::CSSBorderImageSliceValue>(this)->CustomCSSText(); + case kAlphaColorClass: + return To<cssvalue::CSSAlphaColorValue>(this)->CustomCSSText(); case kColorClass: return To<cssvalue::CSSColor>(this)->CustomCSSText(); case kColorMixClass: @@ -596,6 +601,7 @@ return HashInt(GetClassType()); case kMathFunctionClass: case kScopedKeywordClass: + case kAlphaColorClass: case kColorMixClass: case kContrastColorClass: case kCounterClass: @@ -720,6 +726,9 @@ case kBorderImageSliceClass: To<cssvalue::CSSBorderImageSliceValue>(this)->TraceAfterDispatch(visitor); return; + case kAlphaColorClass: + To<cssvalue::CSSAlphaColorValue>(this)->TraceAfterDispatch(visitor); + return; case kColorClass: To<cssvalue::CSSColor>(this)->TraceAfterDispatch(visitor); return; @@ -973,6 +982,8 @@ return "IdentifierClass"; case kScopedKeywordClass: return "ScopedKeywordClass"; + case kAlphaColorClass: + return "AlphaColorClass"; case kColorClass: return "ColorClass"; case kColorMixClass: @@ -1148,6 +1159,8 @@ return To<cssvalue::CSSColorMixValue>(this)->HasRandomFunctions(); case kRelativeColorClass: return To<cssvalue::CSSRelativeColorValue>(this)->HasRandomFunctions(); + case kAlphaColorClass: + return To<cssvalue::CSSAlphaColorValue>(this)->HasRandomFunctions(); case kContrastColorClass: return To<cssvalue::CSSContrastColorValue>(this)->HasRandomFunctions(); case kPaletteMixClass:
diff --git a/third_party/blink/renderer/core/css/css_value.h b/third_party/blink/renderer/core/css/css_value.h index 7750c6d4..3f3bd2bd 100644 --- a/third_party/blink/renderer/core/css/css_value.h +++ b/third_party/blink/renderer/core/css/css_value.h
@@ -86,6 +86,7 @@ bool IsBorderImageSliceValue() const { return class_type_ == kBorderImageSliceClass; } + bool IsAlphaColorValue() const { return class_type_ == kAlphaColorClass; } bool IsColorValue() const { return class_type_ == kColorClass; } bool IsColorMixValue() const { return class_type_ == kColorMixClass; } bool IsContrastColorValue() const { @@ -283,6 +284,7 @@ kColorClass, kUnresolvedColorClass, kColorMixClass, + kAlphaColorClass, kContrastColorClass, kCounterClass, kCounterContentClass,
diff --git a/third_party/blink/renderer/core/css/element_rule_collector.cc b/third_party/blink/renderer/core/css/element_rule_collector.cc index 901a258..64198a33 100644 --- a/third_party/blink/renderer/core/css/element_rule_collector.cc +++ b/third_party/blink/renderer/core/css/element_rule_collector.cc
@@ -957,11 +957,14 @@ if (const AtomicString& input_type = element.getAttribute(html_names::kTypeAttr); !input_type.IsNull()) { + // Do not use input_type in the loop; the reference + // may be dangling if CollectMatchingRulesForList() + // adds lazy attributes. + AtomicString input_type_lower = input_type.ToAsciiLower(); for (const auto bundle : match_request.RuleSetsWithInputRules()) { if (CollectMatchingRulesForList<stop_at_first_match>( - bundle.rule_set->InputRules(input_type.ToAsciiLower()), - match_request, bundle.rule_set, bundle.style_sheet_index, - checker, context) && + bundle.rule_set->InputRules(input_type_lower), match_request, + bundle.rule_set, bundle.style_sheet_index, checker, context) && stop_at_first_match) { return true; }
diff --git a/third_party/blink/renderer/core/css/media_query_evaluator.cc b/third_party/blink/renderer/core/css/media_query_evaluator.cc index bfa5d977..844c86fd 100644 --- a/third_party/blink/renderer/core/css/media_query_evaluator.cc +++ b/third_party/blink/renderer/core/css/media_query_evaluator.cc
@@ -88,6 +88,14 @@ (a.IsTime() && b.IsTime()) || (a.IsResolution() && b.IsResolution()); } +KleeneValue ApplyRestrictor(MediaQuery::RestrictorType r, KleeneValue value) { + if (r == MediaQuery::RestrictorType::kNot && value != KleeneValue::kUnknown) { + return value == KleeneValue::kFalse ? KleeneValue::kTrue + : KleeneValue::kFalse; + } + return value; +} + } // namespace using mojom::blink::DevicePostureType; @@ -141,22 +149,20 @@ EqualIgnoringAsciiCase(media_type_to_match, MediaType()); } -static bool ApplyRestrictor(MediaQuery::RestrictorType r, KleeneValue value) { - if (value == KleeneValue::kUnknown) { - return false; - } - if (r == MediaQuery::RestrictorType::kNot) { - return value == KleeneValue::kFalse; - } - return value == KleeneValue::kTrue; +KleeneValue MediaQueryEvaluator::Eval(const MediaQuery& query) const { + return Eval(query, nullptr /* result_flags */, nullptr /* custom_medias */); } -bool MediaQueryEvaluator::Eval(const MediaQuery& query) const { - return Eval(query, nullptr /* result_flags */); +KleeneValue MediaQueryEvaluator::Eval( + const MediaQuery& query, + MediaQueryResultFlags* result_flags) const { + return Eval(query, result_flags, nullptr /* custom_medias */); } -bool MediaQueryEvaluator::Eval(const MediaQuery& query, - MediaQueryResultFlags* result_flags) const { +KleeneValue MediaQueryEvaluator::Eval( + const MediaQuery& query, + MediaQueryResultFlags* result_flags, + const CustomMediaRulesMap* custom_medias) const { if (!MediaTypeMatch(query.MediaType())) { return ApplyRestrictor(query.Restrictor(), KleeneValue::kFalse); } @@ -164,36 +170,40 @@ return ApplyRestrictor(query.Restrictor(), KleeneValue::kTrue); } return ApplyRestrictor(query.Restrictor(), - Eval(*query.ExpNode(), result_flags)); + Eval(*query.ExpNode(), result_flags, custom_medias)); } bool MediaQueryEvaluator::Eval(const MediaQuerySet& query_set) const { - return Eval(query_set, nullptr /* result_flags */); + return Eval(query_set, nullptr /* result_flags */, + nullptr /* custom_medias */); } bool MediaQueryEvaluator::Eval(const MediaQuerySet& query_set, - MediaQueryResultFlags* result_flags) const { + MediaQueryResultFlags* result_flags, + const CustomMediaRulesMap* custom_medias) const { const HeapVector<Member<const MediaQuery>>& queries = query_set.QueryVector(); - if (!queries.size()) { - return true; // Empty query list evaluates to true. + if (queries.empty()) { + return true; // An empty query list evaluates to true. } // Iterate over queries, stop if any of them eval to true (OR semantics). - bool result = false; - for (wtf_size_t i = 0; i < queries.size() && !result; ++i) { - result = Eval(*queries[i], result_flags); + KleeneValue result = KleeneValue::kFalse; + for (wtf_size_t i = 0; i < queries.size() && result != KleeneValue::kTrue; + ++i) { + result = Eval(*queries[i], result_flags, custom_medias); } - return result; + return result == KleeneValue::kTrue; } KleeneValue MediaQueryEvaluator::Eval(const ConditionalExpNode& node) const { - return Eval(node, nullptr /* result_flags */); + return Eval(node, nullptr /* result_flags */, nullptr /* custom_medias */); } KleeneValue MediaQueryEvaluator::Eval( const ConditionalExpNode& node, - MediaQueryResultFlags* result_flags) const { + MediaQueryResultFlags* result_flags, + const CustomMediaRulesMap* custom_medias) const { class Handler : public ConditionalExpNodeVisitor { public: using EvaluateMediaFunc = @@ -212,7 +222,7 @@ }; auto callback = [&](const MediaQueryFeatureExpNode& feature) { - return EvalFeature(feature, result_flags); + return EvalFeature(feature, result_flags, custom_medias); }; Handler evaluation_context(callback); @@ -1638,7 +1648,8 @@ KleeneValue MediaQueryEvaluator::EvalFeature( const MediaQueryFeatureExpNode& feature, - MediaQueryResultFlags* result_flags) const { + MediaQueryResultFlags* result_flags, + const CustomMediaRulesMap* custom_medias) const { if (!media_values_ || !media_values_->HasValues()) { // media_values_ should only be nullptr when parsing UA stylesheets. The // only media queries we support in UA stylesheets are media type queries. @@ -1664,8 +1675,15 @@ if (RuntimeEnabledFeatures::CSSCustomMediaEnabled() && feature.IsCustomMedia() && CSSVariableParser::IsValidVariableName(feature.Name())) { - // TODO(crbug.com/40781325): Support evaluation of custom-media queries. - return KleeneValue::kUnknown; + if (!custom_medias) { + return KleeneValue::kUnknown; + } + auto it = custom_medias->find(AtomicString(feature.Name())); + if (it == custom_medias->end()) { + return KleeneValue::kUnknown; + } else { + return EvalCustomMedia(it->value, result_flags, custom_medias); + } } if (feature.HasStyleRange() || @@ -1709,6 +1727,32 @@ return result ? KleeneValue::kTrue : KleeneValue::kFalse; } +KleeneValue MediaQueryEvaluator::EvalCustomMedia( + const StyleRuleCustomMedia* custom_media_rule, + MediaQueryResultFlags* result_flags, + const CustomMediaRulesMap* custom_medias) const { + if (custom_media_rule->IsBooleanValue()) { + return custom_media_rule->GetBooleanValue() ? KleeneValue::kTrue + : KleeneValue::kFalse; + } + CHECK(custom_media_rule->IsMediaQueryValue()); + const MediaQuerySet* query_set = custom_media_rule->GetMediaQueryValue(); + + const HeapVector<Member<const MediaQuery>>& queries = + query_set->QueryVector(); + if (queries.empty()) { + return KleeneValue::kTrue; // An empty query list evaluates to true. + } + + KleeneValue result = KleeneValue::kFalse; + for (wtf_size_t i = 0; i < queries.size() && result != KleeneValue::kTrue; + ++i) { + result = KleeneOr(result, Eval(*queries[i], result_flags, custom_medias)); + } + + return result; +} + namespace { unsigned ConversionFlagsToUnitFlags(
diff --git a/third_party/blink/renderer/core/css/media_query_evaluator.h b/third_party/blink/renderer/core/css/media_query_evaluator.h index 754e0442..1ac6cdb0 100644 --- a/third_party/blink/renderer/core/css/media_query_evaluator.h +++ b/third_party/blink/renderer/core/css/media_query_evaluator.h
@@ -49,6 +49,10 @@ class MediaQuerySetResult; class MediaValues; struct MediaQueryResultFlags; +class StyleRuleCustomMedia; + +using CustomMediaRulesMap = + HeapHashMap<AtomicString, Member<StyleRuleCustomMedia>>; // Class that evaluates css media queries as defined in // CSS3 Module "Media Queries" (http://www.w3.org/TR/css3-mediaqueries/) @@ -92,15 +96,28 @@ // Evaluates a list of media queries. bool Eval(const MediaQuerySet&) const; - bool Eval(const MediaQuerySet&, MediaQueryResultFlags*) const; + // Custom media cycles must be filtered out before calling Eval; + // `CustomMediaRulesMap` should not contain cycles. + bool Eval(const MediaQuerySet&, + MediaQueryResultFlags*, + const CustomMediaRulesMap* = nullptr) const; // Evaluates media query. - bool Eval(const MediaQuery&) const; - bool Eval(const MediaQuery&, MediaQueryResultFlags*) const; + KleeneValue Eval(const MediaQuery&) const; + KleeneValue Eval(const MediaQuery&, MediaQueryResultFlags*) const; + // Custom media cycles must be filtered out before calling Eval; + // `CustomMediaRulesMap` should not contain cycles. + KleeneValue Eval(const MediaQuery&, + MediaQueryResultFlags*, + const CustomMediaRulesMap*) const; // https://drafts.csswg.org/mediaqueries-4/#evaluating KleeneValue Eval(const ConditionalExpNode&) const; - KleeneValue Eval(const ConditionalExpNode&, MediaQueryResultFlags*) const; + // Custom media cycles must be filtered out before calling Eval; + // `CustomMediaRulesMap` should not contain cycles. + KleeneValue Eval(const ConditionalExpNode&, + MediaQueryResultFlags*, + const CustomMediaRulesMap* = nullptr) const; static KleeneValue EvalStyleRange(const CSSValue& reference_value, const CSSValue& query_value, @@ -117,9 +134,15 @@ private: KleeneValue EvalFeature(const MediaQueryFeatureExpNode&, - MediaQueryResultFlags*) const; + MediaQueryResultFlags*, + const CustomMediaRulesMap*) const; KleeneValue EvalStyleFeature(const MediaQueryFeatureExpNode&, MediaQueryResultFlags*) const; + // Evaluates a custom media query. + // https://drafts.csswg.org/mediaqueries-5/#custom-mq + KleeneValue EvalCustomMedia(const StyleRuleCustomMedia*, + MediaQueryResultFlags*, + const CustomMediaRulesMap*) const; const String MediaType() const;
diff --git a/third_party/blink/renderer/core/css/media_query_evaluator_test.cc b/third_party/blink/renderer/core/css/media_query_evaluator_test.cc index c11d814..6f0c6413 100644 --- a/third_party/blink/renderer/core/css/media_query_evaluator_test.cc +++ b/third_party/blink/renderer/core/css/media_query_evaluator_test.cc
@@ -17,6 +17,7 @@ #include "third_party/blink/renderer/core/css/parser/css_tokenizer.h" #include "third_party/blink/renderer/core/css/parser/media_query_parser.h" #include "third_party/blink/renderer/core/css/resolver/media_query_result.h" +#include "third_party/blink/renderer/core/css/style_rule.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" @@ -460,7 +461,8 @@ }; void TestMQEvaluator(base::span<MediaQueryEvaluatorTestCase> test_cases, - const MediaQueryEvaluator* media_query_evaluator) { + const MediaQueryEvaluator* media_query_evaluator, + const CustomMediaRulesMap* custom_medias) { MediaQuerySet* query_set = nullptr; for (const MediaQueryEvaluatorTestCase& test_case : test_cases) { if (String(test_case.input).empty()) { @@ -470,11 +472,17 @@ CSSParserTokenStream stream(str); query_set = MediaQueryParser::ParseMediaQuerySet(stream, nullptr); } - EXPECT_EQ(test_case.output, media_query_evaluator->Eval(*query_set)) + EXPECT_EQ(test_case.output, + media_query_evaluator->Eval(*query_set, nullptr, custom_medias)) << "Query: " << test_case.input; } } +void TestMQEvaluator(base::span<MediaQueryEvaluatorTestCase> test_cases, + const MediaQueryEvaluator* media_query_evaluator) { + TestMQEvaluator(test_cases, media_query_evaluator, {}); +} + TEST(MediaQueryEvaluatorTest, Cached) { MediaValuesCached::MediaValuesCachedData data; data.viewport_width = 500; @@ -1440,8 +1448,68 @@ MediaQueryEvaluatorTestCase test_cases[] = { {"(--undefined)", false}, }; + CustomMediaRulesMap custom_medias; - TestMQEvaluator(test_cases, media_query_evaluator); + TestMQEvaluator(test_cases, media_query_evaluator, &custom_medias); +} + +struct CustomMediaQueryTestData { + const char* name; + std::variant<const char*, bool> value; +}; + +TEST(MediaQueryEvaluatorTest, TestEvalCustomMedias) { + MediaValuesCached::MediaValuesCachedData data; + data.viewport_width = 500; + data.viewport_height = 500; + data.media_type = media_type_names::kScreen; + auto* media_values = MakeGarbageCollected<MediaValuesCached>(data); + MediaQueryEvaluator* media_query_evaluator = + MakeGarbageCollected<MediaQueryEvaluator>(media_values); + + CustomMediaQueryTestData custom_medias_data[] = { + {"--true-val", true}, + {"--false-val", false}, + {"--true-query", "screen and (height: 500px)"}, + {"--false-query", "print"}, + {"--unknown-query", "(--undefined)"}, + {"--nested-query", "(--true-val)"}, + {"--cyclic", "--cyclic"}}; + + CustomMediaRulesMap custom_medias; + for (auto custom_media : custom_medias_data) { + StyleRuleCustomMedia* style_rule_custom_media = nullptr; + if (std::holds_alternative<const char*>(custom_media.value)) { + style_rule_custom_media = MakeGarbageCollected<StyleRuleCustomMedia>( + AtomicString(custom_media.name), + MediaQueryParser::ParseMediaQuerySet( + std::get<const char*>(custom_media.value), nullptr)); + } else { + style_rule_custom_media = MakeGarbageCollected<StyleRuleCustomMedia>( + AtomicString(custom_media.name), std::get<bool>(custom_media.value)); + } + custom_medias.insert(AtomicString(custom_media.name), + style_rule_custom_media); + } + + MediaQueryEvaluatorTestCase test_cases[] = { + {"(width: 500px) or (--false-val)", true}, + {"(width: 5px) or (--true-val)", true}, + {"(--true-val) and (height: 500px)", true}, + {"(--true-val) and (--false-val)", false}, + {"(--true-val) and (not (--false-val))", true}, + {"(--true-val) and (--undefined)", false}, + {"(--true-val) and (not (--undefined))", false}, + {"(--true-val) and (--unknown-query)", false}, + {"(--true-val) and (not (--unknown-query))", false}, + {"(--true-val) and (--nested-query)", true}, + {"(--true-val) and (not (--nested-query))", false}, + // Should not evaluate the second part below due to short-circuiting. + {"(--true-val) or (--cyclic)", true}, + {"(--false-val) and (--cyclic)", false}, + }; + + TestMQEvaluator(test_cases, media_query_evaluator, &custom_medias); } } // namespace blink
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_local_context.cc b/third_party/blink/renderer/core/css/parser/css_parser_local_context.cc index 640ac32c6..e48e2da 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_local_context.cc +++ b/third_party/blink/renderer/core/css/parser/css_parser_local_context.cc
@@ -41,6 +41,7 @@ case CSSValueID::kRay: case CSSValueID::kView: return true; + case CSSValueID::kAlpha: case CSSValueID::kBlur: case CSSValueID::kBrightness: case CSSValueID::kColor:
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc index a0d45e4..9a178a7 100644 --- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc +++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
@@ -14,6 +14,7 @@ #include "base/notreached.h" #include "third_party/blink/renderer/core/css/counter_style_map.h" +#include "third_party/blink/renderer/core/css/css_alpha_color_value.h" #include "third_party/blink/renderer/core/css/css_axis_value.h" #include "third_party/blink/renderer/core/css/css_basic_shape_values.h" #include "third_party/blink/renderer/core/css/css_border_image.h" @@ -2108,6 +2109,95 @@ return result; } +// https://drafts.csswg.org/css-color-5/#relative-alpha +CSSValue* ConsumeAlphaColorFunction( + CSSParserTokenStream& stream, + const CSSParserContext& context, + CSSParserLocalContext& local_context, + const ColorParserContext& color_parser_context) { + CHECK(RuntimeEnabledFeatures::CSSAlphaColorFunctionEnabled()); + DCHECK_EQ(stream.Peek().FunctionId(), CSSValueID::kAlpha); + + CSSParserLocalContext::FunctionLocalContext function_context( + CSSValueID::kAlpha, local_context); + + CSSParserTokenStream::RestoringBlockGuard guard(stream); + stream.ConsumeWhitespace(); + + // "from" keyword is required. + if (!ConsumeIdent<CSSValueID::kFrom>(stream)) { + return nullptr; + } + + CSSValue* origin_color = ConsumeColorInternal(stream, context, local_context, + /*accept_quirky_colors=*/false, + color_parser_context); + if (!origin_color) { + return nullptr; + } + + // Optional: / <alpha-value> + CSSValue* alpha = nullptr; + if (ConsumeSlashIncludingWhitespace(stream)) { + // The alpha value can be a number, percentage, none, or the `alpha` + // channel keyword (or a calc() expression using `alpha`). + if (ConsumeIdent<CSSValueID::kNone>(stream)) { + alpha = CSSIdentifierValue::Create(CSSValueID::kNone); + } else if (CSSValue* number = + ConsumeNumber(stream, context, local_context, + CSSPrimitiveValue::ValueRange::kAll)) { + alpha = number; + } else if (CSSValue* percent = + ConsumePercent(stream, context, local_context, + CSSPrimitiveValue::ValueRange::kAll)) { + alpha = percent; + } else { + // Try to parse as the `alpha` channel keyword or a calc() expression + // referencing the `alpha` keyword. + CSSColorChannelMap color_channel_map = { + {CSSValueID::kAlpha, std::nullopt}, + }; + const CSSParserToken token = stream.Peek(); + if (token.GetType() == kFunctionToken) { + using enum CSSMathExpressionNode::Flag; + using Flags = CSSMathExpressionNode::Flags; + CSSParserTokenStream::RestoringBlockGuard calc_guard(stream); + stream.ConsumeWhitespace(); + CSSMathFunctionValue* calc_value = CSSMathFunctionValue::Create( + CSSMathExpressionNode::ParseMathFunction( + token.FunctionId(), stream, context, local_context, + Flags({AllowPercent}), kCSSAnchorQueryTypesNone, + color_channel_map), + CSSPrimitiveValue::ValueRange::kAll); + if (calc_value) { + const CalculationResultCategory category = calc_value->Category(); + if (category != kCalcNumber && category != kCalcPercent) { + return nullptr; + } + calc_guard.Release(); + stream.ConsumeWhitespace(); + alpha = calc_value; + } + } else if (color_channel_map.Contains(token.Id())) { + alpha = ConsumeIdent(stream); + } + } + if (!alpha) { + return nullptr; + } + } + + if (!stream.AtEnd()) { + return nullptr; + } + + guard.Release(); + stream.ConsumeWhitespace(); + + return MakeGarbageCollected<cssvalue::CSSAlphaColorValue>(origin_color, + alpha); +} + // https://www.w3.org/TR/css-color-5/#contrast-color CSSValue* ConsumeContrastColorFunction( CSSParserTokenStream& stream, @@ -2207,6 +2297,12 @@ return color; } + if (RuntimeEnabledFeatures::CSSAlphaColorFunctionEnabled() && + stream.Peek().FunctionId() == CSSValueID::kAlpha) { + return ConsumeAlphaColorFunction(stream, context, local_context, + color_parser_context); + } + if (RuntimeEnabledFeatures::CSSContrastColorEnabled() && stream.Peek().FunctionId() == CSSValueID::kContrastColor) { return ConsumeContrastColorFunction(stream, context, local_context,
diff --git a/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc b/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc index 7e435bb..4220d792 100644 --- a/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc +++ b/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
@@ -34,6 +34,7 @@ #include "base/notreached.h" #include "build/build_config.h" #include "third_party/blink/renderer/core/css/basic_shape_functions.h" +#include "third_party/blink/renderer/core/css/css_alpha_color_value.h" #include "third_party/blink/renderer/core/css/css_alternate_value.h" #include "third_party/blink/renderer/core/css/css_axis_value.h" #include "third_party/blink/renderer/core/css/css_color.h" @@ -2980,6 +2981,20 @@ } } + if (auto* alpha_color_value = + DynamicTo<cssvalue::CSSAlphaColorValue>(value)) { + const StyleColor origin_color = + ResolveColorValueImpl(alpha_color_value->OriginColor(), context); + const StyleColor::UnresolvedAlphaColor* unresolved_alpha_color = + MakeGarbageCollected<StyleColor::UnresolvedAlphaColor>( + origin_color, alpha_color_value->Alpha(), context.length_resolver); + if (origin_color.IsAbsoluteColor()) { + return StyleColor(unresolved_alpha_color->Resolve(Color())); + } else { + return StyleColor(unresolved_alpha_color); + } + } + if (auto* unresolved_color_value = DynamicTo<cssvalue::CSSUnresolvedColorValue>(value)) { return StyleColor(unresolved_color_value->Resolve(context.length_resolver)); @@ -3584,8 +3599,9 @@ selected_value, context); } - if (value.IsColorMixValue() || value.IsRelativeColorValue() || - value.IsContrastColorValue() || value.IsUnresolvedColorValue()) { + if (value.IsAlphaColorValue() || value.IsColorMixValue() || + value.IsRelativeColorValue() || value.IsContrastColorValue() || + value.IsUnresolvedColorValue()) { return ComputeColorValue(css_to_length_conversion_data, value, document, color_scheme); }
diff --git a/third_party/blink/renderer/core/css/resolver/style_builder_converter_test.cc b/third_party/blink/renderer/core/css/resolver/style_builder_converter_test.cc index 631ce49..46013b5 100644 --- a/third_party/blink/renderer/core/css/resolver/style_builder_converter_test.cc +++ b/third_party/blink/renderer/core/css/resolver/style_builder_converter_test.cc
@@ -5,6 +5,8 @@ #include "third_party/blink/renderer/core/css/resolver/style_builder_converter.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/mojom/frame/color_scheme.mojom-blink.h" +#include "third_party/blink/renderer/core/css/css_alpha_color_value.h" #include "third_party/blink/renderer/core/css/css_color_mix_value.h" #include "third_party/blink/renderer/core/css/css_numeric_literal_value.h" #include "third_party/blink/renderer/core/css/css_relative_color_value.h" @@ -76,4 +78,78 @@ EXPECT_EQ(ResolveColorValue(*color_mix_value, context), expected); } +TEST(StyleBuilderConverterTest, ResolveColorValue_ResolveAlphaColor) { + const CSSIdentifierValue* red = CSSIdentifierValue::Create(CSSValueID::kRed); + const CSSNumericLiteralValue* alpha = + CSSNumericLiteralValue::Create(0.5, CSSPrimitiveValue::UnitType::kNumber); + + const auto* alpha_color_value = + MakeGarbageCollected<cssvalue::CSSAlphaColorValue>(red, alpha); + + const ResolveColorValueContext context{ + .length_resolver = CSSToLengthConversionData(/*element=*/nullptr), + .text_link_colors = TextLinkColors()}; + + const StyleColor result = ResolveColorValue(*alpha_color_value, context); + ASSERT_TRUE(result.IsAbsoluteColor()); + EXPECT_EQ(result.GetColor().SerializeAsCSSColor(), + Color::FromColorSpace(Color::ColorSpace::kSRGBLegacy, 255.0f, 0.0f, + 0.0f, 0.5f) + .SerializeAsCSSColor()); +} + +TEST(StyleBuilderConverterTest, + ResolveColorValue_CurrentColorAlphaRemainsUnresolved) { + const CSSIdentifierValue* currentcolor = + CSSIdentifierValue::Create(CSSValueID::kCurrentcolor); + const CSSNumericLiteralValue* alpha = + CSSNumericLiteralValue::Create(0.5, CSSPrimitiveValue::UnitType::kNumber); + + const auto* alpha_color_value = + MakeGarbageCollected<cssvalue::CSSAlphaColorValue>(currentcolor, alpha); + + const ResolveColorValueContext context{ + .length_resolver = CSSToLengthConversionData(/*element=*/nullptr), + .text_link_colors = TextLinkColors()}; + + const StyleColor result = ResolveColorValue(*alpha_color_value, context); + ASSERT_TRUE(result.IsUnresolvedColorFunction()); + + const Color current = Color(10, 20, 30, 204); + Color expected = current; + expected.ConvertToColorSpace(Color::ColorSpace::kSRGB); + expected.SetAlpha(0.5f); + EXPECT_EQ(result + .Resolve(current, mojom::blink::ColorScheme::kLight, + /*is_current_color=*/nullptr) + .SerializeAsCSSColor(), + expected.SerializeAsCSSColor()); +} + +TEST(StyleBuilderConverterTest, + ResolveColorValue_CurrentColorAlphaDefaultsToOriginAlpha) { + const CSSIdentifierValue* currentcolor = + CSSIdentifierValue::Create(CSSValueID::kCurrentcolor); + + const auto* alpha_color_value = + MakeGarbageCollected<cssvalue::CSSAlphaColorValue>(currentcolor, + /*alpha=*/nullptr); + + const ResolveColorValueContext context{ + .length_resolver = CSSToLengthConversionData(/*element=*/nullptr), + .text_link_colors = TextLinkColors()}; + + const StyleColor result = ResolveColorValue(*alpha_color_value, context); + ASSERT_TRUE(result.IsUnresolvedColorFunction()); + + const Color current = Color(10, 20, 30, 204); + Color expected = current; + expected.ConvertToColorSpace(Color::ColorSpace::kSRGB); + EXPECT_EQ(result + .Resolve(current, mojom::blink::ColorScheme::kLight, + /*is_current_color=*/nullptr) + .SerializeAsCSSColor(), + expected.SerializeAsCSSColor()); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/css/style_color.cc b/third_party/blink/renderer/core/css/style_color.cc index 92d590d..cc40edc 100644 --- a/third_party/blink/renderer/core/css/style_color.cc +++ b/third_party/blink/renderer/core/css/style_color.cc
@@ -7,6 +7,7 @@ #include <memory> #include "third_party/blink/renderer/core/css/color_function.h" +#include "third_party/blink/renderer/core/css/css_alpha_color_value.h" #include "third_party/blink/renderer/core/css/css_color.h" #include "third_party/blink/renderer/core/css/css_color_channel_keywords.h" #include "third_party/blink/renderer/core/css/css_color_mix_value.h" @@ -67,6 +68,28 @@ } } +const CSSValue* CalculationValueToCSSValue( + const Member<const CalculationValue>& channel) { + if (channel == nullptr) { + return CSSIdentifierValue::Create(CSSValueID::kNone); + } + if (!channel->IsExpression()) { + if (channel->HasExplicitPercent()) { + return CSSNumericLiteralValue::Create( + channel->Percent(), CSSPrimitiveValue::UnitType::kPercentage); + } + return CSSNumericLiteralValue::Create(channel->Pixels(), + CSSPrimitiveValue::UnitType::kNumber); + } + const CalculationExpressionNode* expression = + channel->GetOrCreateExpression(); + if (expression->IsColorChannelKeyword()) { + return CSSIdentifierValue::Create(ColorChannelKeywordToCSSValueID( + To<CalculationExpressionColorChannelKeywordNode>(expression)->Value())); + } + return CSSMathFunctionValue::Create(CSSMathExpressionNode::Create(*channel)); +} + } // namespace CORE_EXPORT bool StyleColor::UnresolvedColorFunction::operator==( @@ -84,6 +107,8 @@ case StyleColor::UnresolvedColorFunction::Type::kContrastColor: return *To<UnresolvedContrastColor>(this) == To<UnresolvedContrastColor>(other); + case StyleColor::UnresolvedColorFunction::Type::kAlphaColor: + return *To<UnresolvedAlphaColor>(this) == To<UnresolvedAlphaColor>(other); } NOTREACHED(); @@ -131,6 +156,111 @@ visitor->Trace(param_color_); } +StyleColor::UnresolvedAlphaColor::UnresolvedAlphaColor( + const StyleColor& origin_color, + const CSSValue* alpha, + const CSSLengthResolver& length_resolver) + : UnresolvedColorFunction(UnresolvedColorFunction::Type::kAlphaColor), + origin_color_(origin_color.color_or_unresolved_color_function_), + origin_color_type_(ResolveColorOperandType(origin_color)) { + auto to_channel = + [&length_resolver](const CSSValue& value) -> const CalculationValue* { + if (const CSSNumericLiteralValue* numeric = + DynamicTo<CSSNumericLiteralValue>(value)) { + if (numeric->IsPercentage()) { + return MakeGarbageCollected<CalculationValue>( + PixelsAndPercent(0., numeric->DoubleValue(), false, true), + Length::ValueRange::kAll); + } else { + return MakeGarbageCollected<CalculationValue>( + PixelsAndPercent(numeric->DoubleValue()), Length::ValueRange::kAll); + } + } else if (const CSSIdentifierValue* identifier = + DynamicTo<CSSIdentifierValue>(value)) { + if (identifier->GetValueID() == CSSValueID::kNone) { + return nullptr; + } + const CalculationExpressionNode* expression = + MakeGarbageCollected<CalculationExpressionColorChannelKeywordNode>( + CSSValueIDToColorChannelKeyword(identifier->GetValueID())); + return CalculationValue::CreateSimplified(expression, + Length::ValueRange::kAll); + } else if (const CSSMathFunctionValue* function = + DynamicTo<CSSMathFunctionValue>(value)) { + float saved_zoom = length_resolver.Zoom(); + const_cast<CSSLengthResolver&>(length_resolver).SetZoom(1.0f); + auto* result = function->ToCalcValue(length_resolver); + const_cast<CSSLengthResolver&>(length_resolver).SetZoom(saved_zoom); + return result; + } else { + NOTREACHED(); + } + }; + + if (alpha != nullptr) { + alpha_was_specified_ = true; + alpha_ = to_channel(*alpha); + } else { + // https://drafts.csswg.org/css-color-5/#relative-alpha + // If the alpha value is omitted, it defaults to that of the origin color. + alpha_was_specified_ = false; + const CalculationExpressionNode* expression = + MakeGarbageCollected<CalculationExpressionColorChannelKeywordNode>( + ColorChannelKeyword::kAlpha); + alpha_ = CalculationValue::CreateSimplified(std::move(expression), + Length::ValueRange::kAll); + } +} + +Color StyleColor::UnresolvedAlphaColor::Resolve( + const Color& current_color) const { + Color resolved_origin = + ResolveColorOperand(origin_color_, origin_color_type_, current_color); + + // The alpha() function preserves the origin color's color space. + // Set up evaluation context with the origin's alpha value. + std::vector<std::pair<ColorChannelKeyword, float>> keyword_values = { + {ColorChannelKeyword::kAlpha, resolved_origin.Alpha()}}; + + EvaluationInput evaluation_input; + evaluation_input.color_channel_keyword_values = + base::flat_map(std::move(keyword_values)); + + std::optional<double> new_alpha; + if (alpha_ != nullptr) { + new_alpha = alpha_->Evaluate(1.f, evaluation_input); + // Alpha is clamped to [0, 1]. + new_alpha = ClampTo<double>(*new_alpha, 0.0, 1.0); + } + // else: new_alpha stays nullopt (none keyword) + + return Color::FromColorSpace( + resolved_origin.GetColorSpace(), resolved_origin.Param0(), + resolved_origin.Param1(), resolved_origin.Param2(), new_alpha); +} + +CSSValue* StyleColor::UnresolvedAlphaColor::ToCSSValue() const { + const CSSValue* alpha = + alpha_was_specified_ ? CalculationValueToCSSValue(alpha_) : nullptr; + return MakeGarbageCollected<cssvalue::CSSAlphaColorValue>( + ConvertColorOperandToCSSValue(origin_color_, origin_color_type_), alpha); +} + +bool StyleColor::UnresolvedAlphaColor::operator==( + const UnresolvedAlphaColor& other) const { + return origin_color_type_ == other.origin_color_type_ && + alpha_was_specified_ == other.alpha_was_specified_ && + ColorOrUnresolvedColorFunction::Equals( + origin_color_, other.origin_color_, origin_color_type_) && + base::ValuesEquivalent(alpha_, other.alpha_); +} + +void StyleColor::UnresolvedAlphaColor::Trace(Visitor* visitor) const { + UnresolvedColorFunction::Trace(visitor); + visitor->Trace(origin_color_); + visitor->Trace(alpha_); +} + StyleColor::UnresolvedColorMix::UnresolvedColorMix( Color::ColorSpace color_interpolation_space, Color::HueInterpolationMethod hue_interpolation_method, @@ -256,36 +386,11 @@ } CSSValue* StyleColor::UnresolvedRelativeColor::ToCSSValue() const { - auto to_css_value = - [](const Member<const CalculationValue>& channel) -> const CSSValue* { - if (channel == nullptr) { - return CSSIdentifierValue::Create(CSSValueID::kNone); - } - if (!channel->IsExpression()) { - if (channel->HasExplicitPercent()) { - return CSSNumericLiteralValue::Create( - channel->Percent(), CSSPrimitiveValue::UnitType::kPercentage); - } else { - return CSSNumericLiteralValue::Create( - channel->Pixels(), CSSPrimitiveValue::UnitType::kNumber); - } - } - const CalculationExpressionNode* expression = - channel->GetOrCreateExpression(); - if (expression->IsColorChannelKeyword()) { - return CSSIdentifierValue::Create(ColorChannelKeywordToCSSValueID( - To<CalculationExpressionColorChannelKeywordNode>(expression) - ->Value())); - } else { - return CSSMathFunctionValue::Create( - CSSMathExpressionNode::Create(*channel)); - } - }; - - const CSSValue* channel0 = to_css_value(channel0_); - const CSSValue* channel1 = to_css_value(channel1_); - const CSSValue* channel2 = to_css_value(channel2_); - const CSSValue* alpha = alpha_was_specified_ ? to_css_value(alpha_) : nullptr; + const CSSValue* channel0 = CalculationValueToCSSValue(channel0_); + const CSSValue* channel1 = CalculationValueToCSSValue(channel1_); + const CSSValue* channel2 = CalculationValueToCSSValue(channel2_); + const CSSValue* alpha = + alpha_was_specified_ ? CalculationValueToCSSValue(alpha_) : nullptr; return MakeGarbageCollected<cssvalue::CSSRelativeColorValue>( *ConvertColorOperandToCSSValue(origin_color_, origin_color_type_),
diff --git a/third_party/blink/renderer/core/css/style_color.h b/third_party/blink/renderer/core/css/style_color.h index 07753839..b32bc9d 100644 --- a/third_party/blink/renderer/core/css/style_color.h +++ b/third_party/blink/renderer/core/css/style_color.h
@@ -112,7 +112,7 @@ // function. virtual Color Resolve(const Color& current_color) const = 0; - enum class Type { kColorMix, kRelativeColor, kContrastColor }; + enum class Type { kColorMix, kRelativeColor, kContrastColor, kAlphaColor }; Type GetType() const { return type_; } bool operator==(const UnresolvedColorFunction& other) const; @@ -212,6 +212,24 @@ UnderlyingColorType param_color_type_ = UnderlyingColorType::kColor; }; + class CORE_EXPORT UnresolvedAlphaColor : public UnresolvedColorFunction { + public: + UnresolvedAlphaColor(const StyleColor& origin_color, + const CSSValue* alpha, + const CSSLengthResolver& length_resolver); + virtual ~UnresolvedAlphaColor() = default; + CSSValue* ToCSSValue() const override; + Color Resolve(const Color& current_color) const override; + bool operator==(const UnresolvedAlphaColor& other) const; + void Trace(Visitor* visitor) const override; + + private: + ColorOrUnresolvedColorFunction origin_color_; + UnderlyingColorType origin_color_type_ = UnderlyingColorType::kColor; + bool alpha_was_specified_ = false; + Member<const CalculationValue> alpha_; + }; + StyleColor() = default; explicit StyleColor(Color color) : color_keyword_(CSSValueID::kInvalid), @@ -348,6 +366,14 @@ } }; +template <> +struct DowncastTraits<StyleColor::UnresolvedAlphaColor> { + static bool AllowFrom(const StyleColor::UnresolvedColorFunction& value) { + return value.GetType() == + StyleColor::UnresolvedColorFunction::Type::kAlphaColor; + } +}; + // For debugging only. CORE_EXPORT std::ostream& operator<<(std::ostream& stream, const StyleColor& color);
diff --git a/third_party/blink/renderer/core/css/style_color_test.cc b/third_party/blink/renderer/core/css/style_color_test.cc index 9326178..8b02008f 100644 --- a/third_party/blink/renderer/core/css/style_color_test.cc +++ b/third_party/blink/renderer/core/css/style_color_test.cc
@@ -5,13 +5,16 @@ #include "third_party/blink/renderer/core/css/style_color.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/core/css/css_alpha_color_value.h" #include "third_party/blink/renderer/core/css/css_identifier_value.h" +#include "third_party/blink/renderer/core/css/css_math_expression_node.h" #include "third_party/blink/renderer/core/css/css_math_function_value.h" #include "third_party/blink/renderer/core/css/css_numeric_literal_value.h" #include "third_party/blink/renderer/core/css/css_to_length_conversion_data.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/testing/page_test_base.h" #include "third_party/blink/renderer/platform/geometry/calculation_value.h" +#include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" namespace blink { @@ -371,4 +374,234 @@ EXPECT_EQ(contrast_dark->Resolve(Color::kBlack), Color::kWhite); } +TEST_F(StyleColorTest, UnresolvedAlphaColor_Equality) { + ScopedCSSAlphaColorFunctionForTest feature(true); + + StyleColor currentcolor; + StyleColor red_rgb(Color(255, 0, 0)); + + CSSValue* number_half = + CSSNumericLiteralValue::Create(0.5, CSSPrimitiveValue::UnitType::kNumber); + CSSValue* number_one = + CSSNumericLiteralValue::Create(1.0, CSSPrimitiveValue::UnitType::kNumber); + CSSValue* percent_50 = CSSNumericLiteralValue::Create( + 50, CSSPrimitiveValue::UnitType::kPercentage); + + UpdateAllLifecyclePhasesForTest(); + Element* element = GetDocument().documentElement(); + CSSToLengthConversionData::Flags ignored_flags = 0; + CSSToLengthConversionData length_resolver( + element->ComputedStyleRef(), element->GetComputedStyle(), + element->GetComputedStyle(), + CSSToLengthConversionData::ViewportSize(GetDocument().GetLayoutView()), + CSSToLengthConversionData::ContainerSizes(element), + CSSToLengthConversionData::AnchorData(), 1., ignored_flags, element); + + using UnresolvedAlphaColor = StyleColor::UnresolvedAlphaColor; + + // Same origin, same alpha => equal. + UnresolvedAlphaColor* alpha_1 = MakeGarbageCollected<UnresolvedAlphaColor>( + currentcolor, number_half, length_resolver); + UnresolvedAlphaColor* alpha_2 = MakeGarbageCollected<UnresolvedAlphaColor>( + currentcolor, number_half, length_resolver); + EXPECT_EQ(*alpha_1, *alpha_2); + + // Different origin color => not equal. + UnresolvedAlphaColor* alpha_3 = MakeGarbageCollected<UnresolvedAlphaColor>( + red_rgb, number_half, length_resolver); + EXPECT_NE(*alpha_1, *alpha_3); + + // Different alpha value => not equal. + UnresolvedAlphaColor* alpha_4 = MakeGarbageCollected<UnresolvedAlphaColor>( + currentcolor, number_one, length_resolver); + EXPECT_NE(*alpha_1, *alpha_4); + + // Percentage alpha vs number alpha => not equal. + UnresolvedAlphaColor* alpha_5 = MakeGarbageCollected<UnresolvedAlphaColor>( + currentcolor, percent_50, length_resolver); + EXPECT_NE(*alpha_1, *alpha_5); + + // Alpha specified vs not specified => not equal. + UnresolvedAlphaColor* alpha_6 = MakeGarbageCollected<UnresolvedAlphaColor>( + currentcolor, nullptr, length_resolver); + EXPECT_NE(*alpha_1, *alpha_6); + + // Both with no alpha specified => equal. + UnresolvedAlphaColor* alpha_7 = MakeGarbageCollected<UnresolvedAlphaColor>( + currentcolor, nullptr, length_resolver); + EXPECT_EQ(*alpha_6, *alpha_7); +} + +TEST_F(StyleColorTest, UnresolvedAlphaColor_ToCSSValue) { + ScopedCSSAlphaColorFunctionForTest feature(true); + + StyleColor currentcolor; + + CSSValue* number_half = + CSSNumericLiteralValue::Create(0.5, CSSPrimitiveValue::UnitType::kNumber); + + UpdateAllLifecyclePhasesForTest(); + Element* element = GetDocument().documentElement(); + CSSToLengthConversionData::Flags ignored_flags = 0; + CSSToLengthConversionData length_resolver( + element->ComputedStyleRef(), element->GetComputedStyle(), + element->GetComputedStyle(), + CSSToLengthConversionData::ViewportSize(GetDocument().GetLayoutView()), + CSSToLengthConversionData::ContainerSizes(element), + CSSToLengthConversionData::AnchorData(), 1., ignored_flags, element); + + using UnresolvedAlphaColor = StyleColor::UnresolvedAlphaColor; + UnresolvedAlphaColor* alpha = MakeGarbageCollected<UnresolvedAlphaColor>( + currentcolor, number_half, length_resolver); + CSSValue* value = alpha->ToCSSValue(); + ASSERT_TRUE(value); + EXPECT_TRUE(value->IsAlphaColorValue()); + EXPECT_EQ(value->CssText(), "alpha(from currentcolor / 0.5)"); +} + +TEST_F(StyleColorTest, UnresolvedAlphaColor_Resolve) { + ScopedCSSAlphaColorFunctionForTest feature(true); + + StyleColor currentcolor; + Color red = Color::FromRGB(255, 0, 0); + Color semi_transparent_blue = + Color::FromColorSpace(Color::ColorSpace::kSRGB, 0, 0, 1.0, 0.5); + + UpdateAllLifecyclePhasesForTest(); + Element* element = GetDocument().documentElement(); + CSSToLengthConversionData::Flags ignored_flags = 0; + CSSToLengthConversionData length_resolver( + element->ComputedStyleRef(), element->GetComputedStyle(), + element->GetComputedStyle(), + CSSToLengthConversionData::ViewportSize(GetDocument().GetLayoutView()), + CSSToLengthConversionData::ContainerSizes(element), + CSSToLengthConversionData::AnchorData(), 1., ignored_flags, element); + + using UnresolvedAlphaColor = StyleColor::UnresolvedAlphaColor; + + // alpha(from red / 0.5) => red with alpha 0.5 + CSSValue* half = + CSSNumericLiteralValue::Create(0.5, CSSPrimitiveValue::UnitType::kNumber); + UnresolvedAlphaColor* alpha_half = MakeGarbageCollected<UnresolvedAlphaColor>( + StyleColor(red), half, length_resolver); + Color resolved_half = alpha_half->Resolve(Color::kBlack); + EXPECT_FLOAT_EQ(resolved_half.Alpha(), 0.5f); + // Color components should be preserved (legacy sRGB uses 0-255 range). + EXPECT_EQ(resolved_half.Param0(), red.Param0()); + EXPECT_EQ(resolved_half.Param1(), red.Param1()); + EXPECT_EQ(resolved_half.Param2(), red.Param2()); + + // alpha(from red / 50%) => red with alpha 0.5 + CSSValue* percent_50 = CSSNumericLiteralValue::Create( + 50, CSSPrimitiveValue::UnitType::kPercentage); + UnresolvedAlphaColor* alpha_percent = + MakeGarbageCollected<UnresolvedAlphaColor>(StyleColor(red), percent_50, + length_resolver); + Color resolved_percent = alpha_percent->Resolve(Color::kBlack); + EXPECT_FLOAT_EQ(resolved_percent.Alpha(), 0.5f); + + // alpha(from red / none) => red with no alpha (nullopt) + CSSValue* none = CSSIdentifierValue::Create(CSSValueID::kNone); + UnresolvedAlphaColor* alpha_none = MakeGarbageCollected<UnresolvedAlphaColor>( + StyleColor(red), none, length_resolver); + Color resolved_none = alpha_none->Resolve(Color::kBlack); + // "none" alpha results in a missing alpha component, which serializes + // differently. + EXPECT_EQ(resolved_none.GetColorSpace(), red.GetColorSpace()); + + // alpha(from semiTransparentBlue / alpha) => preserves alpha from origin + CSSValue* alpha_keyword = CSSIdentifierValue::Create(CSSValueID::kAlpha); + UnresolvedAlphaColor* alpha_kw = MakeGarbageCollected<UnresolvedAlphaColor>( + StyleColor(semi_transparent_blue), alpha_keyword, length_resolver); + Color resolved_kw = alpha_kw->Resolve(Color::kBlack); + EXPECT_FLOAT_EQ(resolved_kw.Alpha(), 0.5f); + + // alpha(from semiTransparentBlue / calc(alpha * 0.5)) => alpha becomes 0.25 + CSSValue* calc_alpha = CSSMathFunctionValue::Create( + CSSMathExpressionOperation::CreateArithmeticOperation( + CSSMathExpressionKeywordLiteral::Create( + CSSValueID::kAlpha, + CSSMathExpressionKeywordLiteral::Context::kColorChannel), + CSSMathExpressionNumericLiteral::Create( + CSSNumericLiteralValue::Create( + 0.5, CSSPrimitiveValue::UnitType::kNumber)), + CSSMathOperator::kMultiply)); + UnresolvedAlphaColor* alpha_calc = MakeGarbageCollected<UnresolvedAlphaColor>( + StyleColor(semi_transparent_blue), calc_alpha, length_resolver); + Color resolved_calc = alpha_calc->Resolve(Color::kBlack); + EXPECT_FLOAT_EQ(resolved_calc.Alpha(), 0.25f); + + // alpha(from red) with no alpha specified => defaults to origin alpha (1.0) + UnresolvedAlphaColor* alpha_default = + MakeGarbageCollected<UnresolvedAlphaColor>(StyleColor(red), nullptr, + length_resolver); + Color resolved_default = alpha_default->Resolve(Color::kBlack); + EXPECT_FLOAT_EQ(resolved_default.Alpha(), 1.0f); + + // Test alpha clamping: values > 1.0 clamp to 1.0 + CSSValue* two = + CSSNumericLiteralValue::Create(2.0, CSSPrimitiveValue::UnitType::kNumber); + UnresolvedAlphaColor* alpha_clamp_high = + MakeGarbageCollected<UnresolvedAlphaColor>(StyleColor(red), two, + length_resolver); + Color resolved_clamp_high = alpha_clamp_high->Resolve(Color::kBlack); + EXPECT_FLOAT_EQ(resolved_clamp_high.Alpha(), 1.0f); + + // Test alpha clamping: values < 0 clamp to 0 + CSSValue* negative = CSSNumericLiteralValue::Create( + -0.5, CSSPrimitiveValue::UnitType::kNumber); + UnresolvedAlphaColor* alpha_clamp_low = + MakeGarbageCollected<UnresolvedAlphaColor>(StyleColor(red), negative, + length_resolver); + Color resolved_clamp_low = alpha_clamp_low->Resolve(Color::kBlack); + EXPECT_FLOAT_EQ(resolved_clamp_low.Alpha(), 0.0f); + + // alpha(from currentcolor / 0.5) resolves currentcolor to provided color + UnresolvedAlphaColor* alpha_current = + MakeGarbageCollected<UnresolvedAlphaColor>(currentcolor, half, + length_resolver); + Color resolved_current = alpha_current->Resolve(red); + EXPECT_FLOAT_EQ(resolved_current.Alpha(), 0.5f); + EXPECT_EQ(resolved_current.Param0(), red.Param0()); +} + +TEST_F(StyleColorTest, UnresolvedAlphaColor_EqualityInStyleColor) { + ScopedCSSAlphaColorFunctionForTest feature(true); + + StyleColor currentcolor; + StyleColor red_rgb(Color(255, 0, 0)); + + CSSValue* number_half = + CSSNumericLiteralValue::Create(0.5, CSSPrimitiveValue::UnitType::kNumber); + + UpdateAllLifecyclePhasesForTest(); + Element* element = GetDocument().documentElement(); + CSSToLengthConversionData::Flags ignored_flags = 0; + CSSToLengthConversionData length_resolver( + element->ComputedStyleRef(), element->GetComputedStyle(), + element->GetComputedStyle(), + CSSToLengthConversionData::ViewportSize(GetDocument().GetLayoutView()), + CSSToLengthConversionData::ContainerSizes(element), + CSSToLengthConversionData::AnchorData(), 1., ignored_flags, element); + + using UnresolvedAlphaColor = StyleColor::UnresolvedAlphaColor; + + // Test that UnresolvedAlphaColor works correctly inside StyleColor equality. + StyleColor alpha_style_1(MakeGarbageCollected<UnresolvedAlphaColor>( + currentcolor, number_half, length_resolver)); + StyleColor alpha_style_2(MakeGarbageCollected<UnresolvedAlphaColor>( + currentcolor, number_half, length_resolver)); + EXPECT_EQ(alpha_style_1, alpha_style_2); + + // Different from a non-alpha StyleColor. + EXPECT_NE(alpha_style_1, red_rgb); + EXPECT_NE(alpha_style_1, currentcolor); + + // Different from a color mix. + StyleColor mix(MakeGarbageCollected<StyleColor::UnresolvedColorMix>( + Color::ColorSpace::kSRGB, Color::HueInterpolationMethod::kShorter, + currentcolor, red_rgb, 0.5, 1.0)); + EXPECT_NE(alpha_style_1, mix); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h index 04b8ec28..2849f0d1 100644 --- a/third_party/blink/renderer/core/dom/element.h +++ b/third_party/blink/renderer/core/dom/element.h
@@ -28,7 +28,6 @@ #include "base/check_op.h" #include "base/dcheck_is_on.h" #include "base/types/pass_key.h" -#include "cc/trees/tracked_element_rects.h" #include "third_party/blink/public/common/input/pointer_id.h" #include "third_party/blink/public/common/metrics/document_update_reason.h" #include "third_party/blink/public/mojom/input/focus_type.mojom-blink.h" @@ -76,6 +75,10 @@ #include "third_party/blink/renderer/platform/wtf/text/atomic_string_table.h" #include "third_party/blink/renderer/platform/wtf/wtf_size_t.h" +namespace cc { +enum class TrackedElementFeature; +} // namespace cc + namespace gfx { class QuadF; class RectF;
diff --git a/third_party/blink/renderer/core/dom/element_rare_data_vector.h b/third_party/blink/renderer/core/dom/element_rare_data_vector.h index b60bd05b..973aae7 100644 --- a/third_party/blink/renderer/core/dom/element_rare_data_vector.h +++ b/third_party/blink/renderer/core/dom/element_rare_data_vector.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_DOM_ELEMENT_RARE_DATA_VECTOR_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_DOM_ELEMENT_RARE_DATA_VECTOR_H_ -#include "cc/trees/tracked_element_rects.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/css_pseudo_element.h" #include "third_party/blink/renderer/core/dom/element_animation_trigger_data.h" @@ -21,6 +20,10 @@ #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" #include "third_party/blink/renderer/platform/wtf/type_traits.h" +namespace cc { +enum class TrackedElementFeature; +} // namespace cc + namespace blink { class CSSStyleDeclaration;
diff --git a/third_party/blink/renderer/core/html/build.gni b/third_party/blink/renderer/core/html/build.gni index d92ff45..be98f12 100644 --- a/third_party/blink/renderer/core/html/build.gni +++ b/third_party/blink/renderer/core/html/build.gni
@@ -147,6 +147,8 @@ "forms/date_time_numeric_field_element.h", "forms/date_time_symbolic_field_element.cc", "forms/date_time_symbolic_field_element.h", + "forms/element_behavior.cc", + "forms/element_behavior.h", "forms/email_input_type.cc", "forms/email_input_type.h", "forms/external_date_time_chooser.cc",
diff --git a/third_party/blink/renderer/core/html/custom/attach_internals_options.idl b/third_party/blink/renderer/core/html/custom/attach_internals_options.idl new file mode 100644 index 0000000..68beea1 --- /dev/null +++ b/third_party/blink/renderer/core/html/custom/attach_internals_options.idl
@@ -0,0 +1,9 @@ +// Copyright 2026 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Options for HTMLElement.attachInternals(). + +dictionary AttachInternalsOptions { + [RuntimeEnabled=ElementInternalsBehaviors] sequence<ElementBehavior> behaviors; +};
diff --git a/third_party/blink/renderer/core/html/custom/element_internals.cc b/third_party/blink/renderer/core/html/custom/element_internals.cc index f376ea3b..4ba6e37 100644 --- a/third_party/blink/renderer/core/html/custom/element_internals.cc +++ b/third_party/blink/renderer/core/html/custom/element_internals.cc
@@ -14,6 +14,7 @@ #include "third_party/blink/renderer/core/html/custom/custom_element.h" #include "third_party/blink/renderer/core/html/custom/custom_element_registry.h" #include "third_party/blink/renderer/core/html/custom/custom_state_set.h" +#include "third_party/blink/renderer/core/html/forms/element_behavior.h" #include "third_party/blink/renderer/core/html/forms/form_controller.h" #include "third_party/blink/renderer/core/html/forms/form_data.h" #include "third_party/blink/renderer/core/html/forms/html_field_set_element.h" @@ -101,6 +102,7 @@ visitor->Trace(validity_flags_); visitor->Trace(validation_anchor_); visitor->Trace(custom_states_); + visitor->Trace(behaviors_); visitor->Trace(explicitly_set_attr_elements_map_); ListedElement::Trace(visitor); ScriptWrappable::Trace(visitor); @@ -406,6 +408,19 @@ return it->value.Get(); } +const FrozenArray<ElementBehavior>& ElementInternals::behaviors() const { + DCHECK(RuntimeEnabledFeatures::ElementInternalsBehaviorsEnabled()); + DCHECK(behaviors_); + return *behaviors_; +} + +void ElementInternals::SetBehaviors( + HeapVector<Member<ElementBehavior>> behaviors) { + DCHECK(RuntimeEnabledFeatures::ElementInternalsBehaviorsEnabled()); + behaviors_ = + MakeGarbageCollected<FrozenArray<ElementBehavior>>(std::move(behaviors)); +} + const FrozenArray<Element>* ElementInternals::ariaControlsElements() const { return GetElementArrayAttribute(html_names::kAriaControlsAttr); }
diff --git a/third_party/blink/renderer/core/html/custom/element_internals.h b/third_party/blink/renderer/core/html/custom/element_internals.h index cedb4fe..dce2d77b 100644 --- a/third_party/blink/renderer/core/html/custom/element_internals.h +++ b/third_party/blink/renderer/core/html/custom/element_internals.h
@@ -13,12 +13,12 @@ #include "third_party/blink/renderer/core/html/forms/listed_element.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_map.h" -#include "third_party/blink/renderer/platform/heap/collection_support/heap_linked_hash_set.h" #include "third_party/blink/renderer/platform/wtf/casting.h" namespace blink { class CustomStateSet; +class ElementBehavior; class HTMLElement; class ValidityStateFlags; @@ -83,6 +83,10 @@ const FrozenArray<Element>* GetElementArrayAttribute( const QualifiedName& attribute) const; + // Platform-provided behaviors + const FrozenArray<ElementBehavior>& behaviors() const; + void SetBehaviors(HeapVector<Member<ElementBehavior>> behaviors); + const FrozenArray<Element>* ariaControlsElements() const; void setAriaControlsElements(GCedHeapVector<Member<Element>>* given_elements); const FrozenArray<Element>* ariaDescribedByElements() const; @@ -150,6 +154,10 @@ // https://whatpr.org/html/3917/common-dom-interfaces.html#reflecting-content-attributes-in-idl-attributes:element HeapHashMap<QualifiedName, Member<FrozenArray<Element>>> explicitly_set_attr_elements_map_; + + // Platform-provided behaviors attached via attachInternals(). + // Behaviors cannot be added or removed after attachment. + Member<FrozenArray<ElementBehavior>> behaviors_; }; template <>
diff --git a/third_party/blink/renderer/core/html/custom/element_internals.idl b/third_party/blink/renderer/core/html/custom/element_internals.idl index 7bf59760..0862cc0 100644 --- a/third_party/blink/renderer/core/html/custom/element_internals.idl +++ b/third_party/blink/renderer/core/html/custom/element_internals.idl
@@ -36,5 +36,9 @@ // Access to shadowRoot from custom elements. See crbug.com/1042130 and // https://github.com/w3c/webcomponents/issues/871#issuecomment-672082936 [MeasureAs=ElementInternalsShadowRoot] readonly attribute ShadowRoot? shadowRoot; + + // Platform-provided behaviors. + // https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/main/PlatformProvidedBehaviors/explainer.md + [RuntimeEnabled=ElementInternalsBehaviors] readonly attribute FrozenArray<ElementBehavior> behaviors; };
diff --git a/third_party/blink/renderer/core/html/forms/element_behavior.cc b/third_party/blink/renderer/core/html/forms/element_behavior.cc new file mode 100644 index 0000000..f771e8d --- /dev/null +++ b/third_party/blink/renderer/core/html/forms/element_behavior.cc
@@ -0,0 +1,27 @@ +// Copyright 2026 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/html/forms/element_behavior.h" + +#include "third_party/blink/renderer/core/html/custom/element_internals.h" +#include "third_party/blink/renderer/platform/runtime_enabled_features.h" + +namespace blink { + +ElementBehavior::ElementBehavior() { + DCHECK(RuntimeEnabledFeatures::ElementInternalsBehaviorsEnabled()); +} + +ElementBehavior::~ElementBehavior() = default; + +bool ElementBehavior::HandleActivation(Event&) { + return false; +} + +void ElementBehavior::Trace(Visitor* visitor) const { + visitor->Trace(internals_); + ScriptWrappable::Trace(visitor); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/html/forms/element_behavior.h b/third_party/blink/renderer/core/html/forms/element_behavior.h new file mode 100644 index 0000000..bb795920 --- /dev/null +++ b/third_party/blink/renderer/core/html/forms/element_behavior.h
@@ -0,0 +1,46 @@ +// Copyright 2026 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_HTML_FORMS_ELEMENT_BEHAVIOR_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_FORMS_ELEMENT_BEHAVIOR_H_ + +#include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/platform/bindings/script_wrappable.h" +#include "third_party/blink/renderer/platform/heap/member.h" +#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" + +namespace blink { + +class ElementInternals; +class Event; + +// ElementBehavior is the base class for platform-provided behaviors +// that can be attached to custom elements via ElementInternals. +// Each subclass represents a specific set of native behaviors. +class CORE_EXPORT ElementBehavior : public ScriptWrappable { + DEFINE_WRAPPERTYPEINFO(); + + public: + ~ElementBehavior() override; + + // Called when the custom element is activated. Returns true if the activation + // was handled. + virtual bool HandleActivation(Event& event); + + // Returns the default ARIA role for accessibility. Subclasses must + // override this to provide appropriate roles (e.g., "button"). + virtual const AtomicString& DefaultAriaRole() const = 0; + + void Trace(Visitor* visitor) const override; + + protected: + ElementBehavior(); + + private: + Member<ElementInternals> internals_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_HTML_FORMS_ELEMENT_BEHAVIOR_H_
diff --git a/third_party/blink/renderer/core/html/forms/element_behavior.idl b/third_party/blink/renderer/core/html/forms/element_behavior.idl new file mode 100644 index 0000000..1d8fcc6f --- /dev/null +++ b/third_party/blink/renderer/core/html/forms/element_behavior.idl
@@ -0,0 +1,13 @@ +// Copyright 2026 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Platform-provided behavior base interface. +// Behaviors can be attached to custom elements via +// attachInternals({ behaviors: [...] }). +[ + Exposed=Window, + RuntimeEnabled=ElementInternalsBehaviors +] +interface ElementBehavior { +};
diff --git a/third_party/blink/renderer/core/html/html_element.cc b/third_party/blink/renderer/core/html/html_element.cc index da4bdc4..e1bf65d02 100644 --- a/third_party/blink/renderer/core/html/html_element.cc +++ b/third_party/blink/renderer/core/html/html_element.cc
@@ -32,6 +32,7 @@ #include "third_party/blink/public/common/features.h" #include "third_party/blink/public/mojom/forms/form_control_type.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/js_event_handler_for_content_attribute.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_attach_internals_options.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/bindings/core/v8/v8_show_popover_options.h" #include "third_party/blink/renderer/bindings/core/v8/v8_toggle_popover_options.h" @@ -86,6 +87,7 @@ #include "third_party/blink/renderer/core/html/custom/custom_element.h" #include "third_party/blink/renderer/core/html/custom/custom_element_registry.h" #include "third_party/blink/renderer/core/html/custom/element_internals.h" +#include "third_party/blink/renderer/core/html/forms/element_behavior.h" #include "third_party/blink/renderer/core/html/forms/html_button_element.h" #include "third_party/blink/renderer/core/html/forms/html_data_list_element.h" #include "third_party/blink/renderer/core/html/forms/html_form_control_element.h" @@ -3812,6 +3814,15 @@ ElementInternals* HTMLElement::attachInternals( ExceptionState& exception_state) { + return attachInternals(nullptr, exception_state); +} + +ElementInternals* HTMLElement::attachInternals( + const AttachInternalsOptions* options, + ExceptionState& exception_state) { + DCHECK(RuntimeEnabledFeatures::ElementInternalsBehaviorsEnabled() || + !options); + // 1. If this's is value is not null, then throw a "NotSupportedError" // DOMException. if (IsValue()) { @@ -3867,9 +3878,21 @@ // 7. Set this's attached internals to true. SetDidAttachInternals(); + // 8. Return a new ElementInternals instance whose target element is this. UseCounter::Count(GetDocument(), WebFeature::kElementAttachInternals); - return &EnsureElementInternals(); + ElementInternals& internals = EnsureElementInternals(); + + // Handle behaviors option if provided. + if (RuntimeEnabledFeatures::ElementInternalsBehaviorsEnabled()) { + HeapVector<Member<ElementBehavior>> behaviors; + if (options && options->hasBehaviors()) { + behaviors = options->behaviors(); + } + internals.SetBehaviors(std::move(behaviors)); + } + + return &internals; } bool HTMLElement::IsFormAssociatedCustomElement() const {
diff --git a/third_party/blink/renderer/core/html/html_element.h b/third_party/blink/renderer/core/html/html_element.h index fb5965b4..ce97050 100644 --- a/third_party/blink/renderer/core/html/html_element.h +++ b/third_party/blink/renderer/core/html/html_element.h
@@ -38,6 +38,7 @@ namespace blink { struct AttributeTriggers; +class AttachInternalsOptions; class Color; class DocumentFragment; class ElementInternals; @@ -247,6 +248,8 @@ int offsetHeightForBinding(); ElementInternals* attachInternals(ExceptionState& exception_state); + ElementInternals* attachInternals(const AttachInternalsOptions* options, + ExceptionState& exception_state); virtual FormAssociated* ToFormAssociatedOrNull() { return nullptr; } bool IsFormAssociatedCustomElement() const;
diff --git a/third_party/blink/renderer/core/html/html_element.idl b/third_party/blink/renderer/core/html/html_element.idl index cae17682..23159a4 100644 --- a/third_party/blink/renderer/core/html/html_element.idl +++ b/third_party/blink/renderer/core/html/html_element.idl
@@ -40,7 +40,7 @@ [CEReactions] attribute boolean spellcheck; [Measure] attribute DOMString autocapitalize; - [RaisesException] ElementInternals attachInternals(); + [RaisesException] ElementInternals attachInternals(optional AttachInternalsOptions options); // EditContext // https://w3c.github.io/edit-context/
diff --git a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc index 3c2dbfbb..41af410 100644 --- a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
@@ -3482,7 +3482,7 @@ continue; std::unique_ptr<protocol::CSS::MediaQuery> media_query = protocol::CSS::MediaQuery::create() - .setActive(media_evaluator->Eval(query)) + .setActive(media_evaluator->Eval(query) == KleeneValue::kTrue) .setExpressions(std::move(expression_array)) .build(); media_list_array->emplace_back(std::move(media_query));
diff --git a/third_party/blink/renderer/core/loader/mixed_content_checker.cc b/third_party/blink/renderer/core/loader/mixed_content_checker.cc index 64e9f74..90b04be 100644 --- a/third_party/blink/renderer/core/loader/mixed_content_checker.cc +++ b/third_party/blink/renderer/core/loader/mixed_content_checker.cc
@@ -499,8 +499,6 @@ auto& local_frame_host = frame->GetLocalFrameHostRemote(); WebContentSettingsClient* content_settings_client = frame->GetContentSettingsClient(); - const SecurityOrigin* security_origin = - mixed_frame->GetSecurityContext()->GetSecurityOrigin(); bool allowed = false; // If we're in strict mode, we'll automagically fail everything, and @@ -570,8 +568,13 @@ // Only notify embedder about loads that would create CSP reports (i.e. // filter out preloads). if (reporting_disposition == ReportingDisposition::kReport) { - notifier.NotifyInsecureContentRan(KURL(security_origin->ToString()), - url); + auto origin_type = (mixed_frame == &frame->Tree().Top()) + ? mojom::blink::ContentSecurityNotifier:: + InsecureContentOrigin::kTopFrame + : mojom::blink::ContentSecurityNotifier:: + InsecureContentOrigin::kCurrentFrame; + + notifier.NotifyInsecureContentRan(url, origin_type); } UseCounter::Count(frame->GetDocument(), WebFeature::kMixedContentBlockableAllowed); @@ -688,10 +691,9 @@ settings->GetAllowRunningOfInsecureContent(), url); if (allowed) { worker_fetch_context.GetContentSecurityNotifier() - .NotifyInsecureContentRan( - KURL( - fetch_client_settings_object.GetSecurityOrigin()->ToString()), - url); + .NotifyInsecureContentRan(url, + mojom::blink::ContentSecurityNotifier:: + InsecureContentOrigin::kCurrentFrame); worker_fetch_context.CountUsage( WebFeature::kMixedContentBlockableAllowed); } @@ -742,7 +744,6 @@ WebContentSettingsClient* content_settings_client = frame->GetContentSettingsClient(); const SecurityContext* security_context = mixed_frame->GetSecurityContext(); - const SecurityOrigin* security_origin = security_context->GetSecurityOrigin(); if (ContentSecurityPolicy* policy = frame->DomWindow()->GetContentSecurityPolicy()) { @@ -775,7 +776,11 @@ if (allowed) { frame_fetch_context.GetContentSecurityNotifier().NotifyInsecureContentRan( - KURL(security_origin->ToString()), url); + url, (mixed_frame == &frame->Tree().Top()) + ? mojom::blink::ContentSecurityNotifier:: + InsecureContentOrigin::kTopFrame + : mojom::blink::ContentSecurityNotifier:: + InsecureContentOrigin::kCurrentFrame); } frame->GetDocument()->AddConsoleMessage(CreateConsoleMessageAboutWebSocket( @@ -802,8 +807,6 @@ } WorkerSettings* settings = worker_fetch_context.GetWorkerSettings(); - const SecurityOrigin* security_origin = - fetch_client_settings_object.GetSecurityOrigin(); bool allowed = IsWebSocketAllowedInWorker(worker_fetch_context, settings, url); @@ -828,7 +831,8 @@ if (allowed) { worker_fetch_context.GetContentSecurityNotifier().NotifyInsecureContentRan( - KURL(security_origin->ToString()), url); + url, mojom::blink::ContentSecurityNotifier::InsecureContentOrigin:: + kCurrentFrame); } worker_fetch_context.GetDetachableConsoleLogger().AddConsoleMessage(
diff --git a/third_party/blink/renderer/core/loader/mock_content_security_notifier.h b/third_party/blink/renderer/core/loader/mock_content_security_notifier.h index 701c4473..c203fb27 100644 --- a/third_party/blink/renderer/core/loader/mock_content_security_notifier.h +++ b/third_party/blink/renderer/core/loader/mock_content_security_notifier.h
@@ -35,7 +35,9 @@ MOCK_METHOD0(NotifyContentWithCertificateErrorsRan, void()); MOCK_METHOD0(NotifyContentWithCertificateErrorsDisplayed, void()); MOCK_METHOD2(NotifyInsecureContentRan, - void(const KURL& origin, const KURL& insecure_url)); + void(const KURL& insecure_url, + mojom::blink::ContentSecurityNotifier::InsecureContentOrigin + origin_type)); private: mojo::Receiver<mojom::blink::ContentSecurityNotifier> receiver_{this};
diff --git a/third_party/blink/renderer/core/paint/timing/image_paint_timing_detector_test.cc b/third_party/blink/renderer/core/paint/timing/image_paint_timing_detector_test.cc index a407711..b73dc53 100644 --- a/third_party/blink/renderer/core/paint/timing/image_paint_timing_detector_test.cc +++ b/third_party/blink/renderer/core/paint/timing/image_paint_timing_detector_test.cc
@@ -177,15 +177,13 @@ base::TimeTicks LargestPaintTime() { return GetPaintTimingDetector() - .GetLargestContentfulPaintCalculator() - ->LatestLcpDetails() + .LatestLcpDetailsForTest() .largest_image_paint_time; } uint64_t LargestPaintSize() { return GetPaintTimingDetector() - .GetLargestContentfulPaintCalculator() - ->LatestLcpDetails() + .LatestLcpDetailsForTest() .largest_image_paint_size; }
diff --git a/third_party/blink/renderer/core/paint/timing/paint_timing_detector.cc b/third_party/blink/renderer/core/paint/timing/paint_timing_detector.cc index 5e59bdb..e3a97a9 100644 --- a/third_party/blink/renderer/core/paint/timing/paint_timing_detector.cc +++ b/third_party/blink/renderer/core/paint/timing/paint_timing_detector.cc
@@ -30,7 +30,6 @@ #include "third_party/blink/renderer/core/style/style_fetched_image.h" #include "third_party/blink/renderer/core/svg/graphics/svg_image.h" #include "third_party/blink/renderer/core/timing/dom_window_performance.h" -#include "third_party/blink/renderer/core/timing/performance_timing_for_reporting.h" #include "third_party/blink/renderer/core/timing/soft_navigation_heuristics.h" #include "third_party/blink/renderer/core/timing/window_performance.h" #include "third_party/blink/renderer/platform/graphics/bitmap_image.h" @@ -300,16 +299,17 @@ } void PaintTimingDetector::OnInputOrScroll() { - LocalDOMWindow* window = DomWindow(); - if (SoftNavigationHeuristics* heuristics = - window ? window->GetSoftNavigationHeuristics() : nullptr) { - heuristics->OnInputOrScroll(); + if (LocalDOMWindow* window = DomWindow()) { + if (auto* heuristics = window->GetSoftNavigationHeuristics()) { + heuristics->OnInputOrScroll(); + } } - if (did_notify_first_input_or_scroll_) { + // Set first_input_or_scroll_notified_timestamp_ only once. + if (!first_input_or_scroll_notified_timestamp_.is_null()) { return; } - did_notify_first_input_or_scroll_ = true; + first_input_or_scroll_notified_timestamp_ = base::TimeTicks::Now(); // TextPaintTimingDetector is used for both Largest Contentful Paint and for // Element Timing. Therefore, here we only want to stop recording Largest @@ -321,13 +321,6 @@ image_paint_timing_detector_->StopRecordingLargestImagePaint(); largest_contentful_paint_calculator_ = nullptr; - if (!window) { - return; - } - - DOMWindowPerformance::performance(*window) - ->timingForReporting() - ->SetFirstInputOrScrollNotifiedTimestamp(base::TimeTicks::Now()); DidChangePerformanceTiming(); } @@ -359,7 +352,7 @@ LargestContentfulPaintCalculator* PaintTimingDetector::GetLargestContentfulPaintCalculator() { // Do not create an LCP calculator once we stop measuring hard LCP. - if (did_notify_first_input_or_scroll_) { + if (!first_input_or_scroll_notified_timestamp_.is_null()) { return nullptr; } if (largest_contentful_paint_calculator_) { @@ -380,14 +373,13 @@ void PaintTimingDetector::OnLcpMetricsForReportingChanged() { // The DidChangePerformanceTiming method which triggers the reporting of // metrics LCP would not be called when we are not recording metrics LCP. - if (did_notify_first_input_or_scroll_) { + if (!first_input_or_scroll_notified_timestamp_.is_null()) { return; } - DOMWindowPerformance::performance(CHECK_DEREF(DomWindow())) - ->timingForReporting() - ->SetLargestContentfulPaintDetailsForMetrics( - GetLargestContentfulPaintCalculator()->LatestLcpDetails()); + lcp_details_for_metrics_ = + GetLargestContentfulPaintCalculator()->LatestLcpDetails(); + DidChangePerformanceTiming(); } @@ -457,6 +449,10 @@ if (!lcp_calculator) { return; } + CHECK_EQ(first_input_or_scroll_notified_timestamp_.is_null(), + image_paint_timing_detector_->IsRecordingLargestImagePaint()); + CHECK_EQ(first_input_or_scroll_notified_timestamp_.is_null(), + text_paint_timing_detector_->IsRecordingLargestTextPaint()); lcp_calculator->MaybeFlushCandidates(); } @@ -465,6 +461,11 @@ image_paint_timing_detector_->ReportLargestIgnoredImage(); } +const LargestContentfulPaintDetails& +PaintTimingDetector::LatestLcpDetailsForTest() { + return GetLargestContentfulPaintCalculator()->LatestLcpDetails(); +} + void PaintTimingDetector::EmitLcpPerformanceEntry( const DOMPaintTimingInfo& paint_timing_info, uint64_t paint_size,
diff --git a/third_party/blink/renderer/core/paint/timing/paint_timing_detector.h b/third_party/blink/renderer/core/paint/timing/paint_timing_detector.h index 80450c49..41a3f6e 100644 --- a/third_party/blink/renderer/core/paint/timing/paint_timing_detector.h +++ b/third_party/blink/renderer/core/paint/timing/paint_timing_detector.h
@@ -120,6 +120,17 @@ } LargestContentfulPaintCalculator* GetLargestContentfulPaintCalculator(); + const LargestContentfulPaintDetails& LargestContentfulPaintDetailsForMetrics() + const { + return lcp_details_for_metrics_; + } + + const LargestContentfulPaintDetails& LatestLcpDetailsForTest(); + + base::TimeTicks FirstInputOrScrollNotifiedTimestamp() const { + return first_input_or_scroll_notified_timestamp_; + } + void UpdateLcpCandidate(); // Reports the largest image and text candidates painted under non-nested 0 @@ -148,14 +159,19 @@ // computed. However, it is initialized lazily, so it may be nullptr because // it has not yet been initialized or because we have stopped computing LCP. Member<LargestContentfulPaintCalculator> largest_contentful_paint_calculator_; - - // Set when first notified about an input or scroll event. - bool did_notify_first_input_or_scroll_ = false; + // Time at which the first input or scroll is notified to + // PaintTimingDetector, hence causing LCP to stop being recorded. This is + // the same time at which |largest_contentful_paint_calculator_| is set to + // nullptr. + base::TimeTicks first_input_or_scroll_notified_timestamp_; // Because PaintTimingVisualizer is a TraceSessionObserver, unique_ptr is // needed to avoid having a reference back into GCed memory, which is // forbidden by oilpan. std::unique_ptr<PaintTimingVisualizer> visualizer_; + + // The LCP details reported to metrics (UKM). + LargestContentfulPaintDetails lcp_details_for_metrics_; }; // Largest Text Paint and Text Element Timing aggregate text nodes by these
diff --git a/third_party/blink/renderer/core/paint/timing/text_paint_timing_detector_test.cc b/third_party/blink/renderer/core/paint/timing/text_paint_timing_detector_test.cc index 234c32da6..67aa2c9 100644 --- a/third_party/blink/renderer/core/paint/timing/text_paint_timing_detector_test.cc +++ b/third_party/blink/renderer/core/paint/timing/text_paint_timing_detector_test.cc
@@ -145,15 +145,13 @@ base::TimeTicks LargestPaintTime() { return GetPaintTimingDetector() - .GetLargestContentfulPaintCalculator() - ->LatestLcpDetails() + .LatestLcpDetailsForTest() .largest_text_paint_time; } uint64_t LargestPaintSize() { return GetPaintTimingDetector() - .GetLargestContentfulPaintCalculator() - ->LatestLcpDetails() + .LatestLcpDetailsForTest() .largest_text_paint_size; }
diff --git a/third_party/blink/renderer/core/timing/performance_timing_for_reporting.cc b/third_party/blink/renderer/core/timing/performance_timing_for_reporting.cc index ab5a071df..4007b47 100644 --- a/third_party/blink/renderer/core/timing/performance_timing_for_reporting.cc +++ b/third_party/blink/renderer/core/timing/performance_timing_for_reporting.cc
@@ -17,6 +17,7 @@ #include "third_party/blink/renderer/core/loader/interactive_detector.h" #include "third_party/blink/renderer/core/paint/timing/lcp_objects.h" #include "third_party/blink/renderer/core/paint/timing/paint_timing.h" +#include "third_party/blink/renderer/core/paint/timing/paint_timing_detector.h" #include "third_party/blink/renderer/core/timing/performance.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_load_timing.h" @@ -227,6 +228,19 @@ timing->FirstMeaningfulPaintCandidate()); } +LargestContentfulPaintDetailsForReporting +PerformanceTimingForReporting::LargestContentfulPaintDetailsForMetrics() const { + PaintTimingDetector* paint_timing_detector = GetPaintTimingDetector(); + if (!paint_timing_detector) { + return {}; + } + + auto timing = + paint_timing_detector->LargestContentfulPaintDetailsForMetrics(); + + return PopulateLargestContentfulPaintDetailsForReporting(timing); +} + uint64_t PerformanceTimingForReporting::FirstEligibleToPaint() const { const PaintTiming* timing = GetPaintTiming(); if (!timing) { @@ -236,6 +250,16 @@ return MonotonicTimeToIntegerMilliseconds(timing->FirstEligibleToPaint()); } +uint64_t PerformanceTimingForReporting::FirstInputOrScrollNotifiedTimestamp() + const { + PaintTimingDetector* paint_timing_detector = GetPaintTimingDetector(); + if (!paint_timing_detector) + return 0; + + return MonotonicTimeToIntegerMilliseconds( + paint_timing_detector->FirstInputOrScrollNotifiedTimestamp()); +} + std::optional<base::TimeDelta> PerformanceTimingForReporting::FirstInputDelay() const { const InteractiveDetector* interactive_detector = GetInteractiveDetector(); @@ -458,6 +482,13 @@ return InteractiveDetector::From(*DomWindow()->document()); } +PaintTimingDetector* PerformanceTimingForReporting::GetPaintTimingDetector() + const { + if (!DomWindow()) + return nullptr; + return &DomWindow()->GetFrame()->View()->GetPaintTimingDetector(); +} + std::optional<base::TimeDelta> PerformanceTimingForReporting::MonotonicTimeToPseudoWallTime( const std::optional<base::TimeTicks>& time) const { @@ -493,11 +524,4 @@ ExecutionContextClient::Trace(visitor); } -void PerformanceTimingForReporting::SetFirstInputOrScrollNotifiedTimestamp( - base::TimeTicks timestamp) { - CHECK_EQ(first_input_or_scroll_notified_timestamp_, 0u); - first_input_or_scroll_notified_timestamp_ = - MonotonicTimeToIntegerMilliseconds(timestamp); -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/timing/performance_timing_for_reporting.h b/third_party/blink/renderer/core/timing/performance_timing_for_reporting.h index 7c5a018..63bd98b 100644 --- a/third_party/blink/renderer/core/timing/performance_timing_for_reporting.h +++ b/third_party/blink/renderer/core/timing/performance_timing_for_reporting.h
@@ -26,12 +26,7 @@ class PaintTiming; struct LargestContentfulPaintDetails; -// This class serves as a bridge between blink and non-blink code for reading -// performance data for non-web-exposed reporting purposes (e.g. UKM). This -// class typically proxies reads to various parts of blink, e.g. getting data -// from `PaintTiming` or `InteractiveDetector`, but some values are pushed and -// cached here. See WebPerformanceMetricsForReporting for usage outside of -// blink. +// This class is only used for non-web-exposed reporting purposes (e.g. UKM). class CORE_EXPORT PerformanceTimingForReporting final : public GarbageCollected<PerformanceTimingForReporting>, public ExecutionContextClient { @@ -102,14 +97,7 @@ uint64_t FirstMeaningfulPaintCandidate() const; LargestContentfulPaintDetailsForReporting - LargestContentfulPaintDetailsForMetrics() const { - return largest_contentful_paint_details_for_metrics_; - } - void SetLargestContentfulPaintDetailsForMetrics( - const LargestContentfulPaintDetails& details) { - largest_contentful_paint_details_for_metrics_ = - PopulateLargestContentfulPaintDetailsForReporting(details); - } + LargestContentfulPaintDetailsForMetrics() const; // The time at which the frame is first eligible for painting due to not // being throttled. A zero value indicates throttling. @@ -117,10 +105,7 @@ // The time at which we are notified of the first input or scroll event which // causes the largest contentful paint algorithm to stop. - uint64_t FirstInputOrScrollNotifiedTimestamp() const { - return first_input_or_scroll_notified_timestamp_; - } - void SetFirstInputOrScrollNotifiedTimestamp(base::TimeTicks); + uint64_t FirstInputOrScrollNotifiedTimestamp() const; // The duration between the hardware timestamp and being queued on the main // thread for the first click, tap, key press, cancellable touchstart, or @@ -198,6 +183,7 @@ const DocumentTiming* GetDocumentTiming() const; const DocumentParserTiming* GetDocumentParserTiming() const; const PaintTiming* GetPaintTiming() const; + PaintTimingDetector* GetPaintTimingDetector() const; DocumentLoader* GetDocumentLoader() const; DocumentLoadTiming* GetDocumentLoadTiming() const; InteractiveDetector* GetInteractiveDetector() const; @@ -205,9 +191,6 @@ const std::optional<base::TimeTicks>&) const; bool cross_origin_isolated_capability_; - LargestContentfulPaintDetailsForReporting - largest_contentful_paint_details_for_metrics_; - uint64_t first_input_or_scroll_notified_timestamp_ = 0; }; } // namespace blink
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_style.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_style.cc index 69bd04e..714d04b 100644 --- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_style.cc +++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_style.cc
@@ -80,9 +80,10 @@ css_parsing_utils::ConsumeColorWithoutElementAndPropertyContext( stream, *StrictCSSParserContext(SecureContextMode::kInsecureContext), local_context); - if (parsed_value && (parsed_value->IsColorMixValue() || - parsed_value->IsRelativeColorValue() || - parsed_value->IsUnresolvedColorValue())) { + if (parsed_value && + (parsed_value->IsAlphaColorValue() || parsed_value->IsColorMixValue() || + parsed_value->IsRelativeColorValue() || + parsed_value->IsUnresolvedColorValue())) { static const TextLinkColors kDefaultTextLinkColors{}; // TODO(40946458): Don't use default length resolver here! const ResolveColorValueContext context{
diff --git a/third_party/blink/renderer/modules/xr/xr_frame_provider.cc b/third_party/blink/renderer/modules/xr/xr_frame_provider.cc index 0b2324b..c8c9c756 100644 --- a/third_party/blink/renderer/modules/xr/xr_frame_provider.cc +++ b/third_party/blink/renderer/modules/xr/xr_frame_provider.cc
@@ -30,7 +30,6 @@ #include "third_party/blink/renderer/modules/xr/xr_viewport.h" #include "third_party/blink/renderer/modules/xr/xr_webgl_drawing_context.h" #include "third_party/blink/renderer/modules/xr/xr_webgl_layer.h" -#include "third_party/blink/renderer/platform/graphics/gpu/xr_frame_transport.h" #include "third_party/blink/renderer/platform/graphics/gpu/xr_frame_transport_delegate.h" #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" #include "ui/display/display.h" @@ -860,17 +859,6 @@ frame_transport_->FramePreImage(transport_delegate); - size_t n_layers = layers_.size(); - Vector<device::LayerId> layer_ids; - Vector<std::unique_ptr<SharedImageHolder>> image_refs; - layer_ids.reserve(n_layers); - image_refs.reserve(n_layers); - - for (auto& layer : layers_) { - layer_ids.push_back(layer.layer_id); - image_refs.push_back(std::move(layer.current_frame_image)); - } - // The backend expects layer ID list to contain a single element (i.e. the // base layer) if the 'layers' feature is not enabled. if (!layer_manager_.is_bound()) { @@ -881,7 +869,7 @@ bool succeeded = frame_transport_->FrameSubmit( immersive_presentation_provider_.get(), transport_delegate, - std::move(layer_ids), std::move(image_refs), this_frame_id); + std::move(layers_), this_frame_id); succeeded ? num_frames_++ : dropped_frames_++; if (succeeded) {
diff --git a/third_party/blink/renderer/modules/xr/xr_frame_provider.h b/third_party/blink/renderer/modules/xr/xr_frame_provider.h index 6d68892..e698898 100644 --- a/third_party/blink/renderer/modules/xr/xr_frame_provider.h +++ b/third_party/blink/renderer/modules/xr/xr_frame_provider.h
@@ -14,6 +14,7 @@ #include "third_party/blink/renderer/modules/xr/xr_id_hash_traits.h" #include "third_party/blink/renderer/modules/xr/xr_layer_shared_image_manager.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" +#include "third_party/blink/renderer/platform/graphics/gpu/xr_frame_transport.h" #include "third_party/blink/renderer/platform/graphics/gpu/xr_frame_transport_delegate.h" #include "third_party/blink/renderer/platform/graphics/gpu/xr_webgl_drawing_buffer.h" #include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_map.h" @@ -35,11 +36,6 @@ class XrLayerClient; class XRFrameTransportDelegate; -struct XRLayerUpdate { - device::LayerId layer_id; - std::unique_ptr<SharedImageHolder> current_frame_image; -}; - // This class manages requesting and dispatching frame updates, which includes // pose information for a given XRDevice. class XRFrameProvider final : public GarbageCollected<XRFrameProvider> {
diff --git a/third_party/blink/renderer/platform/audio/mac/fft_frame_mac.cc b/third_party/blink/renderer/platform/audio/mac/fft_frame_mac.cc index ec08cb7b..d131aef9 100644 --- a/third_party/blink/renderer/platform/audio/mac/fft_frame_mac.cc +++ b/third_party/blink/renderer/platform/audio/mac/fft_frame_mac.cc
@@ -133,9 +133,8 @@ frame_.imagp = imag_data_.Data(); // Copy/setup frame data - unsigned nbytes = sizeof(float) * fft_size_; - UNSAFE_TODO(memcpy(RealData().Data(), frame.frame_.realp, nbytes)); - UNSAFE_TODO(memcpy(ImagData().Data(), frame.frame_.imagp, nbytes)); + real_data_.as_span().copy_from(frame.real_data_.as_span()); + imag_data_.as_span().copy_from(frame.imag_data_.as_span()); } FFTFrame::~FFTFrame() {}
diff --git a/third_party/blink/renderer/platform/audio/pffft/fft_frame_pffft.cc b/third_party/blink/renderer/platform/audio/pffft/fft_frame_pffft.cc index 8295887..38cb3d8 100644 --- a/third_party/blink/renderer/platform/audio/pffft/fft_frame_pffft.cc +++ b/third_party/blink/renderer/platform/audio/pffft/fft_frame_pffft.cc
@@ -147,9 +147,8 @@ InitializeFFTSetupForSize(fft_size_); // Copy/setup frame data. - unsigned nbytes = sizeof(float) * (fft_size_ / 2); - UNSAFE_TODO(memcpy(RealData().Data(), frame.RealData().Data(), nbytes)); - UNSAFE_TODO(memcpy(ImagData().Data(), frame.ImagData().Data(), nbytes)); + real_data_.as_span().copy_from(frame.real_data_.as_span()); + imag_data_.as_span().copy_from(frame.imag_data_.as_span()); } unsigned FFTFrame::MinFFTSize() { @@ -204,13 +203,10 @@ // Split FFT data into real and imaginary arrays. PFFFT transform already // uses the desired format; we just need to split out the real and imaginary // parts. - const float* c = complex_data_.Data(); - float* real = real_data_.Data(); - float* imag = imag_data_.Data(); for (unsigned k = 0; k < len; ++k) { int index = 2 * k; - UNSAFE_TODO(real[k]) = UNSAFE_TODO(c[index]); - UNSAFE_TODO(imag[k]) = UNSAFE_TODO(c[index + 1]); + real_data_[k] = complex_data_[index]; + imag_data_[k] = complex_data_[index + 1]; } } @@ -221,19 +217,16 @@ // Pack the real and imaginary data into the complex array format. PFFFT // already uses the desired format; we just need to pack the parts together. - float* fft_data = complex_data_.Data(); - const float* real = real_data_.Data(); - const float* imag = imag_data_.Data(); for (unsigned k = 0; k < len; ++k) { int index = 2 * k; - UNSAFE_TODO(fft_data[index]) = UNSAFE_TODO(real[k]); - UNSAFE_TODO(fft_data[index + 1]) = UNSAFE_TODO(imag[k]); + complex_data_[index] = real_data_[k]; + complex_data_[index + 1] = imag_data_[k]; } PFFFT_Setup* setup = FFTSetupForSize(fft_size_); DCHECK(setup); - pffft_transform_ordered(setup, fft_data, data, pffft_work_.Data(), + pffft_transform_ordered(setup, complex_data_.Data(), data, pffft_work_.Data(), PFFFT_BACKWARD); // The inverse transform needs to be scaled because PFFFT doesn't.
diff --git a/third_party/blink/renderer/platform/audio/reverb_accumulation_buffer.cc b/third_party/blink/renderer/platform/audio/reverb_accumulation_buffer.cc index 6b965bc8..cdb174b 100644 --- a/third_party/blink/renderer/platform/audio/reverb_accumulation_buffer.cc +++ b/third_party/blink/renderer/platform/audio/reverb_accumulation_buffer.cc
@@ -36,34 +36,32 @@ namespace blink { ReverbAccumulationBuffer::ReverbAccumulationBuffer(uint32_t length) - : buffer_(length), read_index_(0), read_time_frame_(0) {} + : buffer_(length), read_index_(0) {} -void ReverbAccumulationBuffer::ReadAndClear(float* destination, - uint32_t number_of_frames) { - uint32_t buffer_length = buffer_.size(); +void ReverbAccumulationBuffer::ReadAndClear(base::span<float> destination) { + const size_t buffer_length = buffer_.size(); + const size_t number_of_frames = destination.size(); DCHECK_LE(read_index_, buffer_length); DCHECK_LE(number_of_frames, buffer_length); - uint32_t frames_available = buffer_length - read_index_; - uint32_t number_of_frames1 = std::min(number_of_frames, frames_available); - uint32_t number_of_frames2 = number_of_frames - number_of_frames1; + const size_t frames_available = buffer_length - read_index_; + const size_t number_of_frames1 = std::min(number_of_frames, frames_available); + const size_t number_of_frames2 = number_of_frames - number_of_frames1; - float* source = buffer_.Data(); - UNSAFE_TODO(memcpy(destination, source + read_index_, - sizeof(float) * number_of_frames1)); - UNSAFE_TODO( - memset(source + read_index_, 0, sizeof(float) * number_of_frames1)); + base::span<float> source = buffer_.as_span(); + destination.first(number_of_frames1) + .copy_from(source.subspan(read_index_, number_of_frames1)); + std::ranges::fill(source.subspan(read_index_, number_of_frames1), 0.0f); // Handle wrap-around if necessary if (number_of_frames2 > 0) { - UNSAFE_TODO(memcpy(destination + number_of_frames1, source, - sizeof(float) * number_of_frames2)); - UNSAFE_TODO(memset(source, 0, sizeof(float) * number_of_frames2)); + destination.subspan(number_of_frames1, number_of_frames2) + .copy_from(source.first(number_of_frames2)); + std::ranges::fill(source.first(number_of_frames2), 0.0f); } read_index_ = (read_index_ + number_of_frames) % buffer_length; - read_time_frame_ += number_of_frames; } void ReverbAccumulationBuffer::UpdateReadIndex( @@ -73,35 +71,39 @@ *read_index = (*read_index + number_of_frames) % buffer_.size(); } -uint32_t ReverbAccumulationBuffer::Accumulate(float* source, - uint32_t number_of_frames, +uint32_t ReverbAccumulationBuffer::Accumulate(base::span<const float> source, uint32_t* read_index, size_t delay_frames) { - uint32_t buffer_length = buffer_.size(); + const size_t number_of_frames = source.size(); + const size_t buffer_length = buffer_.size(); - uint32_t write_index = (*read_index + delay_frames) % buffer_length; + const size_t write_index = (*read_index + delay_frames) % buffer_length; // Update caller's readIndex *read_index = (*read_index + number_of_frames) % buffer_length; - uint32_t frames_available = buffer_length - write_index; - uint32_t number_of_frames1 = std::min(number_of_frames, frames_available); - uint32_t number_of_frames2 = number_of_frames - number_of_frames1; + const size_t frames_available = buffer_length - write_index; + const size_t number_of_frames1 = std::min(number_of_frames, frames_available); + const size_t number_of_frames2 = number_of_frames - number_of_frames1; - float* destination = buffer_.Data(); + base::span<float> destination = buffer_.as_span(); DCHECK_LE(write_index, buffer_length); DCHECK_LE(number_of_frames1 + write_index, buffer_length); DCHECK_LE(number_of_frames2, buffer_length); - vector_math::Vadd(source, 1, UNSAFE_TODO(destination + write_index), 1, - UNSAFE_TODO(destination + write_index), 1, - number_of_frames1); + vector_math::Vadd(source.first(number_of_frames1).data(), 1, + destination.subspan(write_index, number_of_frames1).data(), + 1, + destination.subspan(write_index, number_of_frames1).data(), + 1, number_of_frames1); // Handle wrap-around if necessary if (number_of_frames2 > 0) { - vector_math::Vadd(UNSAFE_TODO(source + number_of_frames1), 1, destination, - 1, destination, 1, number_of_frames2); + vector_math::Vadd( + source.subspan(number_of_frames1, number_of_frames2).data(), 1, + destination.first(number_of_frames2).data(), 1, + destination.first(number_of_frames2).data(), 1, number_of_frames2); } return write_index; @@ -110,7 +112,6 @@ void ReverbAccumulationBuffer::Reset() { buffer_.Zero(); read_index_ = 0; - read_time_frame_ = 0; } } // namespace blink
diff --git a/third_party/blink/renderer/platform/audio/reverb_accumulation_buffer.h b/third_party/blink/renderer/platform/audio/reverb_accumulation_buffer.h index fcff4da..5052216f 100644 --- a/third_party/blink/renderer/platform/audio/reverb_accumulation_buffer.h +++ b/third_party/blink/renderer/platform/audio/reverb_accumulation_buffer.h
@@ -29,6 +29,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_AUDIO_REVERB_ACCUMULATION_BUFFER_H_ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_AUDIO_REVERB_ACCUMULATION_BUFFER_H_ +#include "base/containers/span.h" #include "third_party/blink/renderer/platform/audio/audio_array.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" @@ -48,7 +49,7 @@ ReverbAccumulationBuffer& operator=(const ReverbAccumulationBuffer&) = delete; // This will read from, then clear-out numberOfFrames - void ReadAndClear(float* destination, uint32_t number_of_frames); + void ReadAndClear(base::span<float> destination); // Each ReverbConvolverStage will accumulate its output at the appropriate // delay from the read position. We need to pass in and update readIndex @@ -56,22 +57,17 @@ // than the realtime thread calling ReadAndClear() and maintaining // m_readIndex // Returns the writeIndex where the accumulation took place - uint32_t Accumulate(float* source, - uint32_t number_of_frames, + uint32_t Accumulate(base::span<const float> source, uint32_t* read_index, size_t delay_frames); - uint32_t ReadIndex() const { return read_index_; } void UpdateReadIndex(uint32_t* read_index, uint32_t number_of_frames) const; - uint32_t ReadTimeFrame() const { return read_time_frame_; } - void Reset(); private: AudioFloatArray buffer_; uint32_t read_index_; - uint32_t read_time_frame_; // for debugging (frame on continuous timeline) }; } // namespace blink
diff --git a/third_party/blink/renderer/platform/audio/reverb_convolver.cc b/third_party/blink/renderer/platform/audio/reverb_convolver.cc index c0a9e3a..9ea83270f 100644 --- a/third_party/blink/renderer/platform/audio/reverb_convolver.cc +++ b/third_party/blink/renderer/platform/audio/reverb_convolver.cc
@@ -178,9 +178,7 @@ DCHECK_GE(destination_channel->length(), frames_to_process); const float* source = source_channel->Data(); - float* destination = destination_channel->MutableData(); DCHECK(source); - DCHECK(destination); // Feed input buffer (read by all threads) input_buffer_.Write(source, frames_to_process); @@ -191,7 +189,8 @@ } // Finally read from accumulation buffer - accumulation_buffer_.ReadAndClear(destination, frames_to_process); + accumulation_buffer_.ReadAndClear( + destination_channel->MutableSpan().first(frames_to_process)); // Now that we've buffered more input, post another task to the background // thread.
diff --git a/third_party/blink/renderer/platform/audio/reverb_convolver_stage.cc b/third_party/blink/renderer/platform/audio/reverb_convolver_stage.cc index d2e0d90e..4b0a5d6 100644 --- a/third_party/blink/renderer/platform/audio/reverb_convolver_stage.cc +++ b/third_party/blink/renderer/platform/audio/reverb_convolver_stage.cc
@@ -189,7 +189,7 @@ } // Now accumulate into reverb's accumulation buffer. - accumulation_buffer_->Accumulate(temporary_buffer.data(), frames_to_process, + accumulation_buffer_->Accumulate(temporary_buffer.first(frames_to_process), &accumulation_read_index_, post_delay_length_); }
diff --git a/third_party/blink/renderer/platform/graphics/gpu/xr_frame_transport.cc b/third_party/blink/renderer/platform/graphics/gpu/xr_frame_transport.cc index 054373b..a2efebf 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/xr_frame_transport.cc +++ b/third_party/blink/renderer/platform/graphics/gpu/xr_frame_transport.cc
@@ -91,8 +91,7 @@ bool XRFrameTransport::FrameSubmit( device::mojom::blink::XRPresentationProvider* vr_presentation_provider, XRFrameTransportDelegate* delegate, - Vector<device::LayerId> layer_ids, - Vector<std::unique_ptr<SharedImageHolder>> image_refs, + Vector<XRLayerUpdate> layers, int16_t vr_frame_id) { DCHECK(transport_options_); CHECK(delegate); @@ -109,9 +108,9 @@ } // TODO(crbug.com/359418629): This only works because we're restricted to a // single layer at the moment. - CHECK_EQ(image_refs.size(), 1UL); + CHECK_EQ(layers.size(), 1UL); auto [gpu_memory_buffer_handle, sync_token] = delegate->CopyImage( - image_refs.begin()->get(), last_transfer_succeeded_); + layers[0].current_frame_image.get(), last_transfer_succeeded_); // We can fail to obtain a GMB handle if we don't have GPU support, or // for some out-of-memory situations. @@ -139,7 +138,7 @@ } else if (transport_options_->transport_method == device::mojom::blink::XRPresentationTransportMethod:: SUBMIT_AS_TEST) { - CHECK_EQ(image_refs.size(), 1UL); + CHECK_EQ(layers.size(), 1UL); // Conditionally wait for the previous render to finish. A late wait here // attempts to overlap work in parallel with the previous frame's @@ -156,7 +155,10 @@ if (transport_options_->wait_for_transfer_notification) { WaitForPreviousTransfer(); } - previous_images_ = std::move(image_refs); + previous_images_.clear(); + for (auto& layer : layers) { + previous_images_.push_back(std::move(layer.current_frame_image)); + } TRACE_EVENT_BEGIN0("gpu", "XRFrameTransport::SubmitFrame"); vr_presentation_provider->SubmitFrame(vr_frame_id, frame_wait_time_); @@ -172,6 +174,11 @@ if (waiting_for_previous_frame_render_) { frame_wait_time_ += WaitForPreviousRenderToFinish(); } + Vector<device::LayerId> layer_ids; + layer_ids.reserve(layers.size()); + for (auto& layer : layers) { + layer_ids.push_back(layer.layer_id); + } vr_presentation_provider->SubmitFrameDrawnIntoTexture( vr_frame_id, std::move(layer_ids), sync_token, frame_wait_time_); } else {
diff --git a/third_party/blink/renderer/platform/graphics/gpu/xr_frame_transport.h b/third_party/blink/renderer/platform/graphics/gpu/xr_frame_transport.h index bceaa18..e4aed0d 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/xr_frame_transport.h +++ b/third_party/blink/renderer/platform/graphics/gpu/xr_frame_transport.h
@@ -28,6 +28,11 @@ class ImageToBufferCopier; struct SharedImageHolder; +struct XRLayerUpdate { + device::LayerId layer_id; + std::unique_ptr<SharedImageHolder> current_frame_image; +}; + class PLATFORM_EXPORT XRFrameTransport final : public GarbageCollected<XRFrameTransport>, public device::mojom::blink::XRPresentationClient { @@ -53,8 +58,7 @@ bool FrameSubmit(device::mojom::blink::XRPresentationProvider*, XRFrameTransportDelegate* delegate, - Vector<device::LayerId> layer_ids, - Vector<std::unique_ptr<SharedImageHolder>> image_refs, + Vector<XRLayerUpdate> layers, int16_t vr_frame_id); void FrameSubmitMissing(device::mojom::blink::XRPresentationProvider*,
diff --git a/third_party/blink/renderer/platform/graphics/paint/paint_chunker.h b/third_party/blink/renderer/platform/graphics/paint/paint_chunker.h index efb3821..cce3f88 100644 --- a/third_party/blink/renderer/platform/graphics/paint/paint_chunker.h +++ b/third_party/blink/renderer/platform/graphics/paint/paint_chunker.h
@@ -10,8 +10,6 @@ #include "base/dcheck_is_on.h" #include "base/memory/stack_allocated.h" #include "cc/input/hit_test_opaqueness.h" -#include "cc/input/layer_selection_bound.h" -#include "cc/trees/tracked_element_rects.h" #include "third_party/blink/renderer/platform/graphics/paint/display_item.h" #include "third_party/blink/renderer/platform/graphics/paint/paint_artifact.h" #include "third_party/blink/renderer/platform/graphics/paint/paint_chunk.h" @@ -19,6 +17,10 @@ #include "third_party/blink/renderer/platform/heap/collection_support/heap_vector.h" #include "third_party/blink/renderer/platform/platform_export.h" +namespace gfx { +class Rect; +} // namespace gfx + namespace blink { // Accepts information about changes to chunk properties as drawings are
diff --git a/third_party/blink/renderer/platform/graphics/paint/paint_controller.h b/third_party/blink/renderer/platform/graphics/paint/paint_controller.h index a06ff35..a4f0741 100644 --- a/third_party/blink/renderer/platform/graphics/paint/paint_controller.h +++ b/third_party/blink/renderer/platform/graphics/paint/paint_controller.h
@@ -14,9 +14,6 @@ #include "base/dcheck_is_on.h" #include "base/memory/ptr_util.h" #include "cc/input/hit_test_opaqueness.h" -#include "cc/input/layer_selection_bound.h" -#include "cc/paint/element_id.h" -#include "cc/trees/tracked_element_rects.h" #include "third_party/blink/renderer/platform/geometry/infinite_int_rect.h" #include "third_party/blink/renderer/platform/graphics/paint/display_item.h" #include "third_party/blink/renderer/platform/graphics/paint/display_item_list.h"
diff --git a/third_party/blink/renderer/platform/graphics/paint/tracked_element_data.h b/third_party/blink/renderer/platform/graphics/paint/tracked_element_data.h index 90e2812..66f097ee 100644 --- a/third_party/blink/renderer/platform/graphics/paint/tracked_element_data.h +++ b/third_party/blink/renderer/platform/graphics/paint/tracked_element_data.h
@@ -7,13 +7,16 @@ #include "base/containers/flat_map.h" #include "base/token.h" -#include "cc/trees/tracked_element_rects.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/platform_export.h" #include "third_party/blink/renderer/platform/tracked_element_id.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" #include "ui/gfx/geometry/rect.h" +namespace cc { +enum class TrackedElementFeature; +} // namespace cc + namespace blink { // Represents a single tracked element, either tracking a full element
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index ccb099f..72befc1 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1422,6 +1422,12 @@ status: "stable", }, { + // https://drafts.csswg.org/css-color-5/#relative-alpha + // https://chromestatus.com/feature/5070160203481088 + name: "CSSAlphaColorFunction", + status: "experimental", + }, + { // Allows using counter() and counters() in alt text (after / in content property). name: "CSSAltCounter", status: "stable", @@ -2349,6 +2355,16 @@ status: "stable", }, { + // ElementInternals.behaviors allows web authors to attach + // platform-provided behaviors to custom elements, enabling + // them to adopt native behaviors without extending native + // elements. + // crbug.com/486928684 + // https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/main/PlatformProvidedBehaviors/explainer.md + name: "ElementInternalsBehaviors", + status: "experimental", + }, + { // When enabled, the readonly attribute will prevent constraint validation // only in some cases, depending on the element. // This was added in M147 and can be removed after M149. @@ -5363,6 +5379,7 @@ // https://chromestatus.com/feature/6185007701557248 name: "SpellCheckCustomDictionaryAPI", status: "test", + public: true, }, { name: "SplitTextNotCleanupDummySpans",
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 fff5d12..f70d5e73 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
@@ -586,8 +586,10 @@ performance_scenarios::ScenarioScope scope, performance_scenarios::InputScenario old_scenario, performance_scenarios::InputScenario new_scenario) { - DCHECK( - base::FeatureList::IsEnabled(kInputHandlingModeFromPerformanceScenario)); + if (!base::FeatureList::IsEnabled( + kInputHandlingModeFromPerformanceScenario)) { + return; + } if (isolate()) { isolate()->SetIsInputHandling( ComputeIsInputHandlingFromPerformanceScenario(new_scenario)); @@ -598,7 +600,9 @@ performance_scenarios::ScenarioScope scope, performance_scenarios::LoadingScenario old_scenario, performance_scenarios::LoadingScenario new_scenario) { - DCHECK(base::FeatureList::IsEnabled(kLoadingModeFromPerformanceScenario)); + if (!base::FeatureList::IsEnabled(kLoadingModeFromPerformanceScenario)) { + return; + } if (isolate()) { isolate()->SetIsLoading( ComputeIsLoadingFromPerformanceScenario(new_scenario));
diff --git a/third_party/blink/renderer/platform/widget/compositing/layer_tree_settings.cc b/third_party/blink/renderer/platform/widget/compositing/layer_tree_settings.cc index 48c0fd5..062719e 100644 --- a/third_party/blink/renderer/platform/widget/compositing/layer_tree_settings.cc +++ b/third_party/blink/renderer/platform/widget/compositing/layer_tree_settings.cc
@@ -225,8 +225,6 @@ const base::CommandLine& cmd = *base::CommandLine::ForCurrentProcess(); cc::LayerTreeSettings settings; - settings.enable_synchronized_scrolling = - base::FeatureList::IsEnabled(::features::kSynchronizedScrolling); Platform* platform = Platform::Current(); settings.commit_to_active_tree = !is_threaded;
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials b/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials index 43fa912..cb5c0a1 100644 --- a/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials +++ b/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials
@@ -93,7 +93,8 @@ crbug.com/398894517 external/wpt/html/cross-origin-opener-policy/iframe-popup-same-origin-to-unsafe-none.https.html?5-6 [ Crash Failure ] crbug.com/396460424 external/wpt/html/semantics/the-button-element/command-and-commandfor/button-event-dispatch.tentative.html [ Crash Failure ] crbug.com/395462245 external/wpt/wasm/core/simd/simd_f32x4_pmin_pmax.wast.js.html [ Timeout ] -crbug.com/388345823 external/wpt/fetch/api/credentials/cookies.any.sharedworker.html [ Crash ] +crbug.com/388345823 crbug.com/494522724 external/wpt/fetch/api/credentials/cookies.any.sharedworker.html [ Crash Failure ] +crbug.com/494522724 virtual/produce-compile-hints/external/wpt/fetch/api/credentials/cookies.any.sharedworker.html [ Failure ] crbug.com/386547453 external/wpt/html/cross-origin-opener-policy/iframe-popup-unsafe-none-to-unsafe-none.https.html?3-4 [ Crash ] crbug.com/384972937 external/wpt/fedcm/fedcm-multi-idp/fedcm-multi-idp-mediation-silent.https.html [ Timeout ] crbug.com/383814062 virtual/disable-raster-inducing-scroll/external/wpt/acid/acid2/reftest.html [ Failure ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 0b79b4f..91784989 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -3735,8 +3735,6 @@ crbug.com/395482243 external/wpt/webdriver/tests/bidi/browsing_context/context_created/context_created.py [ Failure Timeout ] crbug.com/395482243 external/wpt/webdriver/tests/bidi/browsing_context/context_destroyed/original_opener.py [ Timeout ] crbug.com/395482243 external/wpt/webdriver/tests/bidi/browsing_context/get_tree/original_opener.py [ Timeout ] -crbug.com/395482243 external/wpt/webdriver/tests/bidi/browsing_context/navigation_committed/navigation_committed.py [ Timeout ] -crbug.com/395482243 external/wpt/webdriver/tests/interop/shared_id_window.py [ Timeout ] crbug.com/395482235 external/wpt/css/css-fonts/italic-oblique-fallback.html [ Failure ] crbug.com/395207102 [ Mac12 ] external/wpt/css/css-flexbox/overflow-auto-005.html [ Crash Failure ] crbug.com/395207102 [ Mac13 ] external/wpt/css/css-flexbox/overflow-auto-005.html [ Failure ] @@ -9791,3 +9789,7 @@ # Gardener 2026-03-19 crbug.com/436884031 [ Mac ] http/tests/devtools/console/console-xpath.js [ Pass Timeout ] + +# Gardener 2026-03-20 +crbug.com/395482243 external/wpt/webdriver/tests/bidi/browsing_context/navigation_committed/navigation_committed.py [ Failure Pass Timeout ] +crbug.com/395482243 external/wpt/webdriver/tests/interop/shared_id_window.py [ Failure Pass Timeout ]
diff --git a/third_party/blink/web_tests/external/wpt/connection-allowlist/tentative/fetch-wildcard.sub.window.js b/third_party/blink/web_tests/external/wpt/connection-allowlist/tentative/fetch-wildcard.sub.window.js index e51045b1..c2e30805 100644 --- a/third_party/blink/web_tests/external/wpt/connection-allowlist/tentative/fetch-wildcard.sub.window.js +++ b/third_party/blink/web_tests/external/wpt/connection-allowlist/tentative/fetch-wildcard.sub.window.js
@@ -1,46 +1,35 @@ // META: script=/common/get-host-info.sub.js +// META: script=resources/test-cases.sub.js // // The following tests assume the policy `Connection-Allowlist: (response-origin "*://*.hosts[alt]:*")` has been set. const port = get_host_info().HTTP_PORT_ELIDED; -const SUCCESS = true; -const FAILURE = false; -function fetch_test(origin, expectation) { +function fetch_test(origin, expectation, mode, credentials) { + const settings = { mode, credentials }; if (expectation === FAILURE) { return promise_test(async t => { - const fetcher = fetch(`${origin}/common/blank-with-cors.html`, { mode: "cors", credential: "omit" }); + const fetcher = fetch(`${origin}/common/blank-with-cors.html`, settings); return promise_rejects_js(t, TypeError, fetcher); - }, `Fetch to ${origin} fails.`); + }, `Fetch ${mode}/${credentials} to ${origin} fails.`); } promise_test(async t => { - const r = await fetch(`${origin}/common/blank-with-cors.html`, { mode: "cors", credential: "omit" }); - assert_equals(r.status, 200); - }, `Fetch to ${origin} succeeds.`); + const r = await fetch(`${origin}/common/blank-with-cors.html`, settings); + if (mode === 'cors' || origin.startsWith(get_host_info().HTTP_ORIGIN)) { + assert_equals(r.status, 200); + } else { + assert_equals(r.status, 0); + assert_equals(r.type, 'opaque'); + } + }, `Fetch ${mode}/${credentials} to ${origin} succeeds.`); } -const test_cases = [ - // We're loading this page from `http://hosts[][]`, so that origin should - // succeed, while its subdomains should fail. - { origin: "http://{{hosts[][]}}" + port, expectation: SUCCESS }, - { origin: "http://{{hosts[][www]}}" + port, expectation: FAILURE }, - { origin: "http://{{hosts[][www1]}}" + port, expectation: FAILURE }, - { origin: "http://{{hosts[][www2]}}" + port, expectation: FAILURE }, - { origin: "http://{{hosts[][天気の良い日]}}" + port, expectation: FAILURE }, - { origin: "http://{{hosts[][élève]}}" + port, expectation: FAILURE }, - - // The pattern we've specified in the header ("*://*.hosts[alt]:*/") will - // match any subdomain of `hosts[alt]` (though not, as it turns out, - // `hosts[alt]` itself. - { origin: "http://{{hosts[alt][]}}" + port, expectation: FAILURE }, - { origin: "http://{{hosts[alt][www]}}" + port, expectation: SUCCESS }, - { origin: "http://{{hosts[alt][www1]}}" + port, expectation: SUCCESS }, - { origin: "http://{{hosts[alt][www2]}}" + port, expectation: SUCCESS }, - { origin: "http://{{hosts[alt][天気の良い日]}}" + port, expectation: SUCCESS }, - { origin: "http://{{hosts[alt][élève]}}" + port, expectation: SUCCESS }, -]; +const test_cases = get_test_cases(port); +const expectations = get_wildcard_expectations(); for (let i = 0; i < test_cases.length; i++) { - fetch_test(test_cases[i].origin, test_cases[i].expectation); + // Test both CORS and No-CORS modes. + fetch_test(test_cases[i].origin, expectations[i], "cors", "omit"); + fetch_test(test_cases[i].origin, expectations[i], "no-cors", "omit"); }
diff --git a/third_party/blink/web_tests/external/wpt/connection-allowlist/tentative/fetch.sub.window.js b/third_party/blink/web_tests/external/wpt/connection-allowlist/tentative/fetch.sub.window.js index c822353..9ba3cd96a 100644 --- a/third_party/blink/web_tests/external/wpt/connection-allowlist/tentative/fetch.sub.window.js +++ b/third_party/blink/web_tests/external/wpt/connection-allowlist/tentative/fetch.sub.window.js
@@ -1,44 +1,35 @@ // META: script=/common/get-host-info.sub.js +// META: script=resources/test-cases.sub.js // // The following tests assume the policy `Connection-Allowlist: (response-origin)` has been set. const port = get_host_info().HTTP_PORT_ELIDED; -const SUCCESS = true; -const FAILURE = false; -function fetch_test(origin, expectation) { +function fetch_test(origin, expectation, mode, credentials) { + const settings = { mode, credentials }; if (expectation === FAILURE) { return promise_test(async t => { - const fetcher = fetch(`${origin}/common/blank-with-cors.html`, { mode: "cors", credential: "omit" }); + const fetcher = fetch(`${origin}/common/blank-with-cors.html`, settings); return promise_rejects_js(t, TypeError, fetcher); - }, `Fetch to ${origin} fails.`); + }, `Fetch ${mode}/${credentials} to ${origin} fails.`); } promise_test(async t => { - const r = await fetch(`${origin}/common/blank-with-cors.html`, { mode: "cors", credential: "omit" }); - assert_equals(r.status, 200); - }, `Fetch to ${origin} succeeds.`); + const r = await fetch(`${origin}/common/blank-with-cors.html`, settings); + if (mode === 'cors' || origin.startsWith(get_host_info().HTTP_ORIGIN)) { + assert_equals(r.status, 200); + } else { + assert_equals(r.status, 0); + assert_equals(r.type, 'opaque'); + } + }, `Fetch ${mode}/${credentials} to ${origin} succeeds.`); } -const test_cases = [ - // We're loading this page from `http://hosts[][]`, so that origin should - // succeed, while its subdomains should fail: - { origin: "http://{{hosts[][]}}" + port, expectation: SUCCESS }, - { origin: "http://{{hosts[][www]}}" + port, expectation: FAILURE }, - { origin: "http://{{hosts[][www1]}}" + port, expectation: FAILURE }, - { origin: "http://{{hosts[][www2]}}" + port, expectation: FAILURE }, - { origin: "http://{{hosts[][天気の良い日]}}" + port, expectation: FAILURE }, - { origin: "http://{{hosts[][élève]}}" + port, expectation: FAILURE }, - - // Cross-site origins should fail as well: - { origin: "http://{{hosts[alt][]}}" + port, expectation: FAILURE }, - { origin: "http://{{hosts[alt][www]}}" + port, expectation: FAILURE }, - { origin: "http://{{hosts[alt][www1]}}" + port, expectation: FAILURE }, - { origin: "http://{{hosts[alt][www2]}}" + port, expectation: FAILURE }, - { origin: "http://{{hosts[alt][天気の良い日]}}" + port, expectation: FAILURE }, - { origin: "http://{{hosts[alt][élève]}}" + port, expectation: FAILURE }, -]; +const test_cases = get_test_cases(port); +const expectations = get_default_expectations(); for (let i = 0; i < test_cases.length; i++) { - fetch_test(test_cases[i].origin, test_cases[i].expectation); + // Test both CORS and No-CORS modes. + fetch_test(test_cases[i].origin, expectations[i], "cors", "omit"); + fetch_test(test_cases[i].origin, expectations[i], "no-cors", "omit"); }
diff --git a/third_party/blink/web_tests/external/wpt/connection-allowlist/tentative/resources/test-cases.sub.js b/third_party/blink/web_tests/external/wpt/connection-allowlist/tentative/resources/test-cases.sub.js new file mode 100644 index 0000000..31480788 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/connection-allowlist/tentative/resources/test-cases.sub.js
@@ -0,0 +1,53 @@ +const SUCCESS = true; +const FAILURE = false; + +function get_test_cases(port) { + return [ + { origin: "http://{{hosts[][]}}" + port }, + { origin: "http://{{hosts[][www]}}" + port }, + { origin: "http://{{hosts[][www1]}}" + port }, + { origin: "http://{{hosts[][www2]}}" + port }, + { origin: "http://{{hosts[][天気の良い日]}}" + port }, + { origin: "http://{{hosts[][élève]}}" + port }, + { origin: "http://{{hosts[alt][]}}" + port }, + { origin: "http://{{hosts[alt][www]}}" + port }, + { origin: "http://{{hosts[alt][www1]}}" + port }, + { origin: "http://{{hosts[alt][www2]}}" + port }, + { origin: "http://{{hosts[alt][天気の良い日]}}" + port }, + { origin: "http://{{hosts[alt][élève]}}" + port }, + ]; +} + +function get_default_expectations() { + return [ + SUCCESS, // hosts[][] + FAILURE, // hosts[][www] + FAILURE, // hosts[][www1] + FAILURE, // hosts[][www2] + FAILURE, // hosts[][天気の良い日] + FAILURE, // hosts[][élève] + FAILURE, // hosts[alt][] + FAILURE, // hosts[alt][www] + FAILURE, // hosts[alt][www1] + FAILURE, // hosts[alt][www2] + FAILURE, // hosts[alt][天気の良い日] + FAILURE, // hosts[alt][élève] + ]; +} + +function get_wildcard_expectations() { + return [ + SUCCESS, // hosts[][] + FAILURE, // hosts[][www] + FAILURE, // hosts[][www1] + FAILURE, // hosts[][www2] + FAILURE, // hosts[][天気の良い日] + FAILURE, // hosts[][élève] + FAILURE, // hosts[alt][] + SUCCESS, // hosts[alt][www] + SUCCESS, // hosts[alt][www1] + SUCCESS, // hosts[alt][www2] + SUCCESS, // hosts[alt][天気の良い日] + SUCCESS, // hosts[alt][élève] + ]; +}
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/alpha-color-computed.html b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/alpha-color-computed.html new file mode 100644 index 0000000..38e9b37 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/alpha-color-computed.html
@@ -0,0 +1,62 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Color 5: alpha() function - computed values</title> +<link rel="author" title="CGQAQ" href="mailto:cgqaq@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-color-5/#relative-alpha"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/computed-testcommon.js"></script> +<script src="/css/support/color-testcommon.js"></script> +<div id="target"></div> +<script> + +const target = document.getElementById('target'); + +// Basic: replace alpha on a named color. +test_computed_value("color", "alpha(from red / 0.5)", "rgba(255, 0, 0, 0.5)"); +test_computed_value("color", "alpha(from blue / 0)", "rgba(0, 0, 255, 0)"); +test_computed_value("color", "alpha(from green / 1)", "rgb(0, 128, 0)"); + +// Percentage alpha. +test_computed_value("color", "alpha(from red / 50%)", "rgba(255, 0, 0, 0.5)"); +test_computed_value("color", "alpha(from red / 0%)", "rgba(255, 0, 0, 0)"); + +// Omitted alpha defaults to origin's alpha. +test_computed_value("color", "alpha(from red)", "rgb(255, 0, 0)"); +test_computed_value("color", "alpha(from rgba(255, 0, 0, 0.3))", "rgba(255, 0, 0, 0.3)"); + +// None alpha. +test_computed_value("color", "alpha(from red / none)", "rgba(255, 0, 0, 0)"); + +// Alpha clamped to [0, 1]. +test_computed_value("color", "alpha(from red / 2)", "rgb(255, 0, 0)"); +test_computed_value("color", "alpha(from red / -1)", "rgba(255, 0, 0, 0)"); + +// Origin color with existing alpha. +test_computed_value("color", "alpha(from rgba(255, 0, 0, 0.3) / 0.8)", "rgba(255, 0, 0, 0.8)"); + +// Preserves non-legacy color spaces. +test_computed_value("color", "alpha(from color(display-p3 1 0 0) / 0.5)", "color(display-p3 1 0 0 / 0.5)"); +test_computed_value("color", "alpha(from color(srgb 1 0 0) / 0.5)", "color(srgb 1 0 0 / 0.5)"); + +// currentcolor: resolves against the element's color property. +// Set color on target, then test background-color with currentcolor origin. +function test_currentcolor_alpha(specified, expected, current) { + target.style["color"] = current; + fuzzy_test_computed_color_property("background-color", specified, expected); +} + +// Explicit alpha replaces origin alpha. +test_currentcolor_alpha("alpha(from currentcolor / 0.5)", "color(srgb 1 0 0 / 0.5)", "red"); +// Omitted alpha defaults to origin's alpha. +test_currentcolor_alpha("alpha(from currentcolor)", "color(srgb 0 0 1)", "blue"); +// Alpha keyword references origin's alpha. +test_currentcolor_alpha("alpha(from currentcolor / alpha)", "color(srgb 1 0 0 / 0.8)", "rgba(255, 0, 0, 0.8)"); +// None alpha. +test_currentcolor_alpha("alpha(from currentcolor / none)", "color(srgb 0 0.50196 0 / none)", "green"); +// Percentage alpha. +test_currentcolor_alpha("alpha(from currentcolor / 50%)", "color(srgb 1 0 0 / 0.5)", "red"); +// Calc with alpha keyword. +test_currentcolor_alpha("alpha(from currentcolor / calc(alpha * 0.5))", "color(srgb 1 0 0 / 0.4)", "rgba(255, 0, 0, 0.8)"); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/alpha-color-parsing-invalid.html b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/alpha-color-parsing-invalid.html new file mode 100644 index 0000000..54ba54d3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/alpha-color-parsing-invalid.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Color 5: alpha() function - invalid parsing</title> +<link rel="author" title="CGQAQ" href="mailto:cgqaq@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-color-5/#relative-alpha"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +<div id="target"></div> +<script> + +// Missing "from" keyword. +test_invalid_value("color", "alpha(red / 0.5)"); + +// Empty function. +test_invalid_value("color", "alpha()"); + +// Missing origin color. +test_invalid_value("color", "alpha(from / 0.5)"); +test_invalid_value("color", "alpha(from)"); + +// Extra tokens. +test_invalid_value("color", "alpha(from red / 0.5 0.5)"); +test_invalid_value("color", "alpha(from red 0.5)"); + +// Color channels not allowed (only alpha). +test_invalid_value("color", "alpha(from red r g b / 0.5)"); + +// Non-color value as origin. +test_invalid_value("color", "alpha(from 42 / 0.5)"); +test_invalid_value("color", "alpha(from none / 0.5)"); + +// Slash without alpha value. +test_invalid_value("color", "alpha(from red /)"); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/alpha-color-parsing-valid.html b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/alpha-color-parsing-valid.html new file mode 100644 index 0000000..219dc2e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/alpha-color-parsing-valid.html
@@ -0,0 +1,56 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Color 5: alpha() function - valid parsing</title> +<link rel="author" title="CGQAQ" href="mailto:cgqaq@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-color-5/#relative-alpha"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +<div id="target"></div> +<script> + +// Basic usage with literal alpha. +test_valid_value("color", "alpha(from red / 0.5)"); +test_valid_value("color", "alpha(from blue / 1)"); +test_valid_value("color", "alpha(from green / 0)"); + +// Percentage alpha. +test_valid_value("color", "alpha(from red / 50%)"); +test_valid_value("color", "alpha(from red / 0%)"); +test_valid_value("color", "alpha(from red / 100%)"); + +// None alpha. +test_valid_value("color", "alpha(from red / none)"); + +// Omitted alpha (defaults to origin's alpha). +test_valid_value("color", "alpha(from red)"); +test_valid_value("color", "alpha(from currentcolor)"); + +// Alpha keyword referencing origin's alpha. +test_valid_value("color", "alpha(from currentcolor / alpha)"); + +// Calc with alpha keyword. +test_valid_value("color", "alpha(from currentcolor / calc(alpha * 0.5))", "alpha(from currentcolor / calc(0.5 * alpha))"); +test_valid_value("color", "alpha(from currentcolor / calc(alpha + 0.1))", "alpha(from currentcolor / calc(0.1 + alpha))"); + +// Nested in other color functions. +test_valid_value("color", "color-mix(in srgb, alpha(from red / 0.5), blue)"); +test_valid_value("color", "rgb(from alpha(from currentcolor / 0.5) r g b)"); + +// Other color functions as origin. +test_valid_value("color", "alpha(from color-mix(in srgb, red, blue) / 0.5)"); +test_valid_value("color", "alpha(from rgb(from red r g b) / 0.8)"); + +// Non-sRGB color spaces preserved. +test_valid_value("color", "alpha(from color(display-p3 1 0 0) / 0.5)"); +test_valid_value("color", "alpha(from lab(50 20 -30) / 0.5)"); +test_valid_value("color", "alpha(from oklch(0.5 0.2 120) / 0.5)"); + +// System and named colors. +test_valid_value("color", "alpha(from currentcolor / 0.5)"); + +// Out-of-range alpha values. +test_valid_value("color", "alpha(from red / 2)"); +test_valid_value("color", "alpha(from red / -1)"); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/crashtests/chrome-bug-493952652.html b/third_party/blink/web_tests/external/wpt/css/css-values/crashtests/chrome-bug-493952652.html new file mode 100644 index 0000000..a9c96ec5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-values/crashtests/chrome-bug-493952652.html
@@ -0,0 +1,26 @@ +<!DOCTYPE html> +<head> + <link rel="help" href="https://crbug.com/493952652"> + <style> + /* + Evaluation of [style] will add a new attribute to the element, + as lazy style gets synchronized. However, the bucketing will be + on input type, so we do not synchronize the attributes _before_ + iteration. + */ + input[style][type="text"] {} + </style> + <style> + /* + For the second stylesheet, when checking the type="" value string, + we must not use a reference into the old attributes. + */ + input[style][type="text"] {} + </style> +</head> +<body> + <input id="target" type="text"></input> + <script> + document.getElementById('target').style.color = 'red'; + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/element-internals-behaviors.tentative.html b/third_party/blink/web_tests/external/wpt/custom-elements/element-internals-behaviors.tentative.html new file mode 100644 index 0000000..34602707 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/custom-elements/element-internals-behaviors.tentative.html
@@ -0,0 +1,26 @@ + +<!DOCTYPE html> +<meta charset="utf-8"> +<title>ElementInternals behaviors API</title> +<link rel="author" href="mailto:ansollan@microsoft.com"> +<link rel="help" href="https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/main/PlatformProvidedBehaviors/explainer.md"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<script> +customElements.define('test-element', class extends HTMLElement {}); + +test(() => { + const element = document.createElement('test-element'); + const ei = element.attachInternals({ behaviors: [] }); + assert_not_equals(ei, null); +}, 'attachInternals({ behaviors: [] }) accepts empty behaviors array'); + +test(() => { + const element = document.createElement('test-element'); + const ei = element.attachInternals(); + assert_not_equals(ei.behaviors, undefined); + assert_equals(ei.behaviors.length, 0); +}, 'behaviors returns empty array when no behaviors configured'); + +</script>
diff --git a/third_party/blink/web_tests/fast/viewport/viewport-container-size-zero-min-scale.html b/third_party/blink/web_tests/fast/viewport/viewport-container-size-zero-min-scale.html new file mode 100644 index 0000000..610e282a --- /dev/null +++ b/third_party/blink/web_tests/fast/viewport/viewport-container-size-zero-min-scale.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<title>Tests that updating viewport container sizes with a 0 min page scale factor does not crash</title> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script> +// Turn on the viewport and other necessary settings for a mobile-like environment. +if (window.internals) { + internals.settings.setViewportEnabled(true); +} + +promise_test(async () => { + if (!window.internals) + return; + + internals.setPageScaleFactorLimits(0, 10); + internals.setBrowserControlsShownRatio(1, 1); + internals.setBrowserControlsState(100, 0, true); + + // This causes UpdateViewportContainerSizes on the compositor thread + // to be triggered. If min_page_scale_factor is 0, this used to crash + // due to a divide by zero error. + internals.setBrowserControlsShownRatio(0.5, 0.5); + + // Wait a couple of frames to ensure the compositor processes the change. + await new Promise(resolve => requestAnimationFrame(resolve)); + await new Promise(resolve => requestAnimationFrame(resolve)); +}, "Changing browser controls shown ratio with min_page_scale_factor=0 does not crash."); +</script>
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt index 0861381a..912010b 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -2749,6 +2749,9 @@ setter scrollLeft setter scrollTop setter slot +interface ElementBehavior + attribute @@toStringTag + method constructor interface ElementInternals attribute @@toStringTag getter ariaActiveDescendantElement @@ -2803,6 +2806,7 @@ getter ariaValueNow getter ariaValueText getter ariaVirtualContent + getter behaviors getter form getter labels getter role
diff --git a/third_party/boringssl/src b/third_party/boringssl/src index 6453bd8..ba3de4d 160000 --- a/third_party/boringssl/src +++ b/third_party/boringssl/src
@@ -1 +1 @@ -Subproject commit 6453bd80a9fe293c0adb8ae67d5d9c233100a7b9 +Subproject commit ba3de4d9b41906eb7e50d69edca140ef3cec053a
diff --git a/third_party/compiler-rt/src b/third_party/compiler-rt/src index 59066a6..84bfdcd 160000 --- a/third_party/compiler-rt/src +++ b/third_party/compiler-rt/src
@@ -1 +1 @@ -Subproject commit 59066a662511e1f9959b07a32c88906d7212b6a7 +Subproject commit 84bfdcd752cb00ccc8087aeb584d3c08e9da96ba
diff --git a/third_party/crossbench b/third_party/crossbench index 10384c7..d9c5ce6 160000 --- a/third_party/crossbench +++ b/third_party/crossbench
@@ -1 +1 @@ -Subproject commit 10384c766b97a26cba7e377782d8dddfc09ea2a0 +Subproject commit d9c5ce65781b65ea6146e212dc4b261bdb758b4c
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src index c46eb27..0130091 160000 --- a/third_party/devtools-frontend/src +++ b/third_party/devtools-frontend/src
@@ -1 +1 @@ -Subproject commit c46eb27afb0da6a000fb250480ca2882f96b591f +Subproject commit 0130091731a000f009b98996620bb91c3dc304d8
diff --git a/third_party/eigen3/src b/third_party/eigen3/src index 3578883..821ab7d 160000 --- a/third_party/eigen3/src +++ b/third_party/eigen3/src
@@ -1 +1 @@ -Subproject commit 3578883bb3616208b8f9bb6fa03dc1fda0a16a78 +Subproject commit 821ab7d3e656e6928d342e289efaf208017d4274
diff --git a/third_party/harfbuzz-ng/BUILD.gn b/third_party/harfbuzz-ng/BUILD.gn index d79cf4b..8e05c144 100644 --- a/third_party/harfbuzz-ng/BUILD.gn +++ b/third_party/harfbuzz-ng/BUILD.gn
@@ -398,6 +398,7 @@ "src/src/hb-vector-svg-subset.hh", "src/src/hb-vector-svg-utils.cc", "src/src/hb-vector-svg-utils.hh", + "src/src/hb-vector-svg.hh", "src/src/hb-vector.cc", "src/src/hb-wasm-api-blob.hh", "src/src/hb-wasm-api-buffer.hh",
diff --git a/third_party/harfbuzz-ng/README.chromium b/third_party/harfbuzz-ng/README.chromium index dbb1049..b1b4c66 100644 --- a/third_party/harfbuzz-ng/README.chromium +++ b/third_party/harfbuzz-ng/README.chromium
@@ -1,10 +1,10 @@ Name: harfbuzz-ng Short Name: harfbuzz-ng URL: http://harfbuzz.org -Version: 13.1.0-26 -CPEPrefix: cpe:/a:harfbuzz_project:harfbuzz:13.1.0 -Date: 2026-03-12 -Revision: 5d4e96ad8d00fc871ffa17707b2ca08fa850e7d6 +Version: 13.2.1-0 +CPEPrefix: cpe:/a:harfbuzz_project:harfbuzz:13.2.1 +Date: 2026-03-19 +Revision: 6f4c5cec306d31e6822303f5ba248a14293d588e Update Mechanism: Manual Security Critical: yes Shipped: yes
diff --git a/third_party/harfbuzz-ng/src b/third_party/harfbuzz-ng/src index 5d4e96a..6f4c5ce 160000 --- a/third_party/harfbuzz-ng/src +++ b/third_party/harfbuzz-ng/src
@@ -1 +1 @@ -Subproject commit 5d4e96ad8d00fc871ffa17707b2ca08fa850e7d6 +Subproject commit 6f4c5cec306d31e6822303f5ba248a14293d588e
diff --git a/third_party/jni_zero/codegen/called_by_native_header.py b/third_party/jni_zero/codegen/called_by_native_header.py index 5ae2b17..09b7943d 100644 --- a/third_party/jni_zero/codegen/called_by_native_header.py +++ b/third_party/jni_zero/codegen/called_by_native_header.py
@@ -3,6 +3,8 @@ # found in the LICENSE file. """Codegen for calling Java methods from C++.""" +import json + from codegen import convert_type from codegen import header_common import common @@ -45,6 +47,8 @@ def _const_value(field): value = field.const_value + if field.java_type.is_string(): + return json.dumps(value) if field.java_type == java_types.LONG: # C++ parser can't parse MIN_VALUE :P. if value == '-9223372036854775808': @@ -159,14 +163,6 @@ f'field_id, {param_rvalue})') -def constants_enums(sb, java_class, constant_fields): - sb(f'enum Java_{java_class.name}_constant_fields {{\n') - with sb.indent(2): - for f in constant_fields: - sb(f'{f.name} = {f.const_value},\n') - sb('};\n\n') - - def _return_type_cpp_non_mirror(return_type): if ret := return_type.converted_type: return ret @@ -337,33 +333,131 @@ namespace = java_classes[0].mirror_namespace with sb.namespace(namespace, skip_newline=True): for java_class in java_classes: + name = f'{java_class.name_with_underscores}Jni' qualified = java_class.to_mirror_cpp() - sb(f'using {java_class.jobject_name}Jni = ' + sb(f'using {name} = ' f'::jni_zero_internal::_CalledByNatives<{qualified}>;\n') sb('\n') for java_class in java_classes: - jobject_name = java_class.jobject_name - macro_name = f'_JNI_ZERO_{jobject_name}Jni_DEFINED' + name = f'{java_class.name_with_underscores}Jni' + macro_name = f'_JNI_ZERO_{name}_DEFINED' sb(f"""\ #ifndef {macro_name} -using {java_class.mirror_namespace}::{jobject_name}Jni; +using {java_class.mirror_namespace}::{name}; #define {macro_name} #endif """) -def called_by_natives_specialization(sb, java_class, called_by_natives): +def called_by_natives_specialization(sb, java_class, fields, called_by_natives): sb('template<>\n') sb(f'class _CalledByNatives<{java_class.to_mirror_cpp()}>') with sb.block(after=';'): sb('public:\n') + for f in fields: + if f.const_value is not None: + if f.java_type.is_string(): + sb(f'static inline constexpr char {f.name}[] = {_const_value(f)};\n') + else: + sb(f'static inline constexpr {f.java_type.to_cpp()} ' + f'{f.name} = {_const_value(f)};\n') + for f in fields: + _mirrored_field_getter(sb, java_class, f) + if not f.final: + _mirrored_field_setter(sb, java_class, f) for cbn in called_by_natives: _mirrored_cpp_function(sb, cbn) sb('\n') sb('\n') +def _mirrored_field_getter(sb, java_class, field): + jobject_type = java_class.to_mirror_cpp() + if field.java_type.enable_mirror(): + return_jobject_type = field.java_type.java_class.to_mirror_cpp() + return_type_cpp = f'::jni_zero::ScopedJavaLocalRef<{return_jobject_type}>' + else: + return_jobject_type = field.java_type.to_cpp() + return_type_cpp = _return_type_cpp_non_mirror(field.java_type) + + if field.static: + sb('static ') + + sb(f'{return_type_cpp} Get_{field.name}(JNIEnv* env)') + if not field.static: + sb(' const') + + with sb.block(): + if field.const_value is not None and field.java_type.is_primitive(): + sb(f'return {_const_value(field)};\n') + return + + if field.static: + class_accessor = header_common.class_accessor_expression(java_class) + sb(f'jclass clazz = {class_accessor};\n') + sb('JNI_ZERO_DCHECK(clazz);\n') + receiver = 'clazz' + else: + sb('auto this_obj = reinterpret_cast') + sb(f'<const ::jni_zero::JavaRef<{jobject_type}>*>(this);\n') + receiver = 'this_obj->obj()' + + field_id_accessor = _field_id_accessor_name(java_class, field) + sb(f'jfieldID field_id = {field_id_accessor}(env);\n') + jni_func_name = _jni_field_function_name(field, False) + getter_part = f'env->{jni_func_name}({receiver}, field_id)' + + with sb.statement(): + sb('return ') + if field.java_type.is_primitive(): + sb(getter_part) + return + + sb(f'::jni_zero::ScopedJavaLocalRef<>::Adopt(env, {getter_part})') + if return_jobject_type != 'jobject': + sb(f'\n .As<{return_jobject_type}>()') + + +def _mirrored_field_setter(sb, java_class, field): + jobject_type = java_class.to_mirror_cpp() + param_type = _param_type_cpp_mirror(field.java_type) + if field.static: + sb('static ') + + sb(f'void Set_{field.name}(JNIEnv* env, {param_type} value)') + if not field.static: + sb(' const') + + with sb.block(): + if field.static: + class_accessor = header_common.class_accessor_expression(java_class) + sb(f'jclass clazz = {class_accessor};\n') + sb('JNI_ZERO_DCHECK(clazz);\n') + receiver_arg = 'clazz' + else: + sb('auto this_obj = reinterpret_cast') + sb(f'<const ::jni_zero::JavaRef<{jobject_type}>*>(this);\n') + receiver_arg = 'this_obj->obj()' + + param_rvalue = 'value' + if field.java_type.converted_type: + convert_type.to_jni_assignment(sb, 'converted_value', 'value', + field.java_type) + param_rvalue = 'converted_value' + + if not field.java_type.is_primitive(): + param_rvalue = f'{param_rvalue}.obj()' + elif field.java_type.primitive_name == 'int' and not field.java_type.converted_type: + param_rvalue = f'as_jint({param_rvalue})' + + field_id_accessor = _field_id_accessor_name(java_class, field) + sb(f'jfieldID field_id = {field_id_accessor}(env);\n') + with sb.statement(): + sb(f'env->{_jni_field_function_name(field, True)}({receiver_arg}, ' + f'field_id, {param_rvalue})') + + def _mirrored_cpp_function(sb, cbn): java_class = cbn.java_class jobject_name = java_class.jobject_name
diff --git a/third_party/jni_zero/java_types.py b/third_party/jni_zero/java_types.py index 3ef96949..b0c3a85 100644 --- a/third_party/jni_zero/java_types.py +++ b/third_party/jni_zero/java_types.py
@@ -95,6 +95,10 @@ return self.name.replace('$', '.') @property + def name_with_underscores(self): + return self.name.replace('$', '_') + + @property def nested_name(self): return self.name.rsplit('$', 1)[-1] @@ -250,6 +254,9 @@ def is_void(self): return self.primitive_name == 'void' + def is_string(self): + return self == STRING + def to_array_element_type(self): assert self.is_array() return JavaType(array_dimensions=self.array_dimensions - 1, @@ -507,6 +514,7 @@ DOUBLE = JavaType(primitive_name='double', nullable=False) FLOAT = JavaType(primitive_name='float', nullable=False) LONG = JavaType(primitive_name='long', nullable=False) +STRING = JavaType(java_class=STRING_CLASS) VOID = JavaType(primitive_name='void', nullable=False) _EMPTY_TYPE_RESOLVER = TypeResolver(OBJECT_CLASS)
diff --git a/third_party/jni_zero/jni_generator.py b/third_party/jni_zero/jni_generator.py index dc42302..de5c04e1 100644 --- a/third_party/jni_zero/jni_generator.py +++ b/third_party/jni_zero/jni_generator.py
@@ -5,7 +5,6 @@ import collections import dataclasses -import itertools import os import pickle import shutil @@ -185,6 +184,7 @@ @dataclasses.dataclass class Field: + java_class: java_types.JavaClass # Containing class (might be a nested class). name: str java_type: java_types.JavaType static: bool @@ -256,12 +256,13 @@ self.proxy_interface = parsed_file.proxy_interface self.proxy_visibility = parsed_file.proxy_visibility self.fields = [ - Field(name=f.name, + Field(java_class=f.java_class, + name=f.name, java_type=f.java_type, static=f.static, final=f.final, is_system_class=from_javap, - const_value=f.const_value if f.java_type.is_primitive() else None) + const_value=f.const_value) for f in parsed_file.fields ] @@ -309,7 +310,7 @@ return [n for n in self.natives if not n.is_proxy] def GetClassesToBeImported(self): - classes = set() + ret = set() for n in self.proxy_natives: for t in list(n.signature.param_types) + [n.return_type]: class_obj = t.java_class @@ -319,27 +320,30 @@ if class_obj.full_name_with_slashes.startswith('java/lang/'): # java.lang** are never imported. continue - classes.add(class_obj) + ret.add(class_obj) - return sorted(classes) + return sorted(ret) def GetClassesToBeLazilyDefined(self): - classes = set() + ret = {f.java_class for f in self.fields if f.java_type.enable_mirror()} + ret.update(f.java_type.java_class for f in self.fields + if f.java_type.enable_mirror()) for n in self.called_by_natives + self.natives: if n.java_class.enable_mirror(): - classes.add(n.java_class) - classes.update(t.java_class for t in n.signature.param_types - if t.enable_mirror()) + ret.add(n.java_class) + ret.update(t.java_class for t in n.signature.param_types + if t.enable_mirror()) if n.return_type.enable_mirror(): - classes.add(n.return_type.java_class) - return sorted(classes) + ret.add(n.return_type.java_class) + return sorted(ret) def RemoveTestOnlyNatives(self): self.natives = [n for n in self.natives if not n.is_test_only] def _CollectReferencedClasses(jni_obj): - ret = set() + ret = {f.java_class for f in jni_obj.fields} + # @CalledByNatives can appear on nested classes, so check each one. for called_by_native in jni_obj.called_by_natives: ret.add(called_by_native.java_class) @@ -420,25 +424,19 @@ header_common.class_accessors(sb, java_classes, jni_obj.module_name) if jni_obj.fields: - non_const_fields = [f for f in jni_obj.fields if f.const_value is None] - if non_const_fields: + fields_needing_accessors = [ + f for f in jni_obj.fields + if f.const_value is None or f.java_type.is_string() + ] + if fields_needing_accessors: with sb.section('FieldId Accessors'): sb('#pragma clang diagnostic push\n') sb('#pragma clang diagnostic ignored "-Wunique-object-duplication"\n') called_by_native_header.field_accessors(sb, jni_obj.java_class, - non_const_fields) + fields_needing_accessors) sb('#pragma clang diagnostic pop\n') with sb.namespace(jni_obj.jni_namespace): - constant_fields = [ - f for f in jni_obj.fields - if f.const_value and f.java_type == java_types.INT - ] - if constant_fields: - with sb.section('Constants'): - called_by_native_header.constants_enums(sb, jni_obj.java_class, - constant_fields) - if jni_obj.natives and not enable_definition_macros: with sb.section('Java to native functions'): for native in jni_obj.natives: @@ -450,17 +448,15 @@ unshared_header_file, include_forward_declaration=True) - if jni_obj.called_by_natives or jni_obj.fields: + if jni_obj.called_by_natives: with sb.section('Native to Java functions'): for called_by_native in jni_obj.called_by_natives: called_by_native_header.method_definition(sb, called_by_native) - if jni_obj.fields: - with sb.section('Field Accessors'): - for field in jni_obj.fields: - called_by_native_header.field_definition(sb, jni_obj.java_class, - field) - if jni_obj.called_by_natives: + if jni_obj.called_by_natives or jni_obj.fields: + all_classes = {f.java_class for f in jni_obj.fields} + all_classes.update(c.java_class for c in jni_obj.called_by_natives) + all_classes = sorted(all_classes) with sb.section('jobject-subclass-aware definitions:'): if jni_obj.jni_namespace: sb('// Ensure namespace exists for "using namespace"\n') @@ -470,15 +466,17 @@ with sb.namespace('jni_zero_internal'): if jni_obj.jni_namespace: sb(f'using namespace ::{jni_obj.jni_namespace};\n\n') - grouped = itertools.groupby(jni_obj.called_by_natives, - key=lambda cbn: cbn.java_class) - for java_class, cbns in grouped: + + for java_class in all_classes: + fields = [f for f in jni_obj.fields if f.java_class == java_class] + cbns = [ + c for c in jni_obj.called_by_natives if c.java_class == java_class + ] called_by_native_header.called_by_natives_specialization( - sb, java_class, list(cbns)) + sb, java_class, fields, cbns) sb('\n') - cbn_classes = sorted({x.java_class for x in jni_obj.called_by_natives}) - called_by_native_header.called_by_natives_aliases(sb, cbn_classes) + called_by_native_header.called_by_natives_aliases(sb, all_classes) sb(epilogue) unshared_header_content = sb.to_string()
diff --git a/third_party/jni_zero/parse.py b/third_party/jni_zero/parse.py index a3ce11d..c479bb9 100644 --- a/third_party/jni_zero/parse.py +++ b/third_party/jni_zero/parse.py
@@ -49,6 +49,7 @@ @dataclasses.dataclass(order=True) class ParsedField: + java_class: java_types.JavaClass name: str java_type: java_types.JavaType static: bool @@ -520,7 +521,8 @@ if value: value = value.rstrip('LlDdFf') fields.append( - ParsedField(name=name, + ParsedField(java_class=java_class, + name=name, java_type=java_types.JavaType.from_descriptor(descriptor), static='static' in modifiers, final='final' in modifiers,
diff --git a/third_party/jni_zero/test/golden/testBidirectionalClass-SampleForTests_jni.h.golden b/third_party/jni_zero/test/golden/testBidirectionalClass-SampleForTests_jni.h.golden index e8ffe76..d5eb203 100644 --- a/third_party/jni_zero/test/golden/testBidirectionalClass-SampleForTests_jni.h.golden +++ b/third_party/jni_zero/test/golden/testBidirectionalClass-SampleForTests_jni.h.golden
@@ -1329,22 +1329,22 @@ } // namespace jni_zero_internal namespace org::jni_zero { -using JSampleForTestsJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleForTests>; -using JSampleForTests_InnerStructAJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleForTests_InnerStructA>; -using JSampleForTests_InnerStructBJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleForTests_InnerStructB>; +using SampleForTestsJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleForTests>; +using SampleForTests_InnerStructAJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleForTests_InnerStructA>; +using SampleForTests_InnerStructBJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleForTests_InnerStructB>; } -#ifndef _JNI_ZERO_JSampleForTestsJni_DEFINED -using org::jni_zero::JSampleForTestsJni; -#define _JNI_ZERO_JSampleForTestsJni_DEFINED +#ifndef _JNI_ZERO_SampleForTestsJni_DEFINED +using org::jni_zero::SampleForTestsJni; +#define _JNI_ZERO_SampleForTestsJni_DEFINED #endif -#ifndef _JNI_ZERO_JSampleForTests_InnerStructAJni_DEFINED -using org::jni_zero::JSampleForTests_InnerStructAJni; -#define _JNI_ZERO_JSampleForTests_InnerStructAJni_DEFINED +#ifndef _JNI_ZERO_SampleForTests_InnerStructAJni_DEFINED +using org::jni_zero::SampleForTests_InnerStructAJni; +#define _JNI_ZERO_SampleForTests_InnerStructAJni_DEFINED #endif -#ifndef _JNI_ZERO_JSampleForTests_InnerStructBJni_DEFINED -using org::jni_zero::JSampleForTests_InnerStructBJni; -#define _JNI_ZERO_JSampleForTests_InnerStructBJni_DEFINED +#ifndef _JNI_ZERO_SampleForTests_InnerStructBJni_DEFINED +using org::jni_zero::SampleForTests_InnerStructBJni; +#define _JNI_ZERO_SampleForTests_InnerStructBJni_DEFINED #endif
diff --git a/third_party/jni_zero/test/golden/testBirectionalNonProxy-SampleBidirectionalNonProxy_jni.h.golden b/third_party/jni_zero/test/golden/testBirectionalNonProxy-SampleBidirectionalNonProxy_jni.h.golden index 799badbf..c25a37e 100644 --- a/third_party/jni_zero/test/golden/testBirectionalNonProxy-SampleBidirectionalNonProxy_jni.h.golden +++ b/third_party/jni_zero/test/golden/testBirectionalNonProxy-SampleBidirectionalNonProxy_jni.h.golden
@@ -358,12 +358,12 @@ } // namespace jni_zero_internal namespace org::jni_zero { -using JSampleBidirectionalNonProxyJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleBidirectionalNonProxy>; +using SampleBidirectionalNonProxyJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleBidirectionalNonProxy>; } -#ifndef _JNI_ZERO_JSampleBidirectionalNonProxyJni_DEFINED -using org::jni_zero::JSampleBidirectionalNonProxyJni; -#define _JNI_ZERO_JSampleBidirectionalNonProxyJni_DEFINED +#ifndef _JNI_ZERO_SampleBidirectionalNonProxyJni_DEFINED +using org::jni_zero::SampleBidirectionalNonProxyJni; +#define _JNI_ZERO_SampleBidirectionalNonProxyJni_DEFINED #endif
diff --git a/third_party/jni_zero/test/golden/testFromClassFile-JavapClass_jni.h.golden b/third_party/jni_zero/test/golden/testFromClassFile-JavapClass_jni.h.golden index 8d90489..d43fb76 100644 --- a/third_party/jni_zero/test/golden/testFromClassFile-JavapClass_jni.h.golden +++ b/third_party/jni_zero/test/golden/testFromClassFile-JavapClass_jni.h.golden
@@ -57,13 +57,6 @@ namespace JNI_JavapClass { -// Constants -enum Java_JavapClass_constant_fields { - CONST_INT = 3, - mFinalInt = 7, -}; - - // Native to Java functions [[maybe_unused]] static ::jni_zero::ScopedJavaLocalRef<jobject> Java_JavapClass_Constructor( JNIEnv* env) { @@ -236,59 +229,6 @@ } -// Field Accessors -[[maybe_unused]] static jint Java_JavapClass_GetField_CONST_INT(JNIEnv* env) { - return 3; -} - -[[maybe_unused]] static ::jni_zero::ScopedJavaLocalRef<jstring> Java_JavapClass_GetField_CONST_STR( - JNIEnv* env) { - jclass clazz = org_jni_1zero_JavapClass_clazz(env); - JNI_ZERO_DCHECK(clazz); - jfieldID field_id = org_jni_1zero_JavapClass_fieldId_CONST_1STR(env); - return ::jni_zero::ScopedJavaLocalRef<jstring>::Adopt(env, static_cast<jstring>(env->GetStaticObjectField(clazz, field_id))); -} - -[[maybe_unused]] static jint Java_JavapClass_GetField_mFinalInt( - JNIEnv* env, - const ::jni_zero::JavaRef<jobject>& obj) { - return 7; -} - -[[maybe_unused]] static ::jni_zero::ScopedJavaLocalRef<jstring> Java_JavapClass_GetField_mMutableString( - JNIEnv* env, - const ::jni_zero::JavaRef<jobject>& obj) { - jfieldID field_id = org_jni_1zero_JavapClass_fieldId_mMutableString(env); - return ::jni_zero::ScopedJavaLocalRef<jstring>::Adopt(env, static_cast<jstring>(env->GetObjectField(obj.obj(), field_id))); -} - -[[maybe_unused]] static void Java_JavapClass_SetField_mMutableString( - JNIEnv* env, - const ::jni_zero::JavaRef<jobject>& obj, - const ::jni_zero::JavaRef<jstring>& value) { - jfieldID field_id = org_jni_1zero_JavapClass_fieldId_mMutableString(env); - env->SetObjectField(obj.obj(), field_id, value.obj()); -} - -[[maybe_unused]] static jboolean Java_JavapClass_GetField_sBoolValue(JNIEnv* env) { - return true; -} - -[[maybe_unused]] static jboolean Java_JavapClass_GetField_sMutableInt(JNIEnv* env) { - jclass clazz = org_jni_1zero_JavapClass_clazz(env); - JNI_ZERO_DCHECK(clazz); - jfieldID field_id = org_jni_1zero_JavapClass_fieldId_sMutableInt(env); - return env->GetStaticBooleanField(clazz, field_id); -} - -[[maybe_unused]] static void Java_JavapClass_SetField_sMutableInt(JNIEnv* env, jboolean value) { - jclass clazz = org_jni_1zero_JavapClass_clazz(env); - JNI_ZERO_DCHECK(clazz); - jfieldID field_id = org_jni_1zero_JavapClass_fieldId_sMutableInt(env); - env->SetStaticBooleanField(clazz, field_id, value); -} - - } // namespace JNI_JavapClass @@ -303,6 +243,49 @@ template<> class _CalledByNatives<::org::jni_zero::JJavapClass> { public: + static inline constexpr jint CONST_INT = 3; + static inline constexpr char CONST_STR[] = "\"VaLuE\""; + static inline constexpr jint mFinalInt = 7; + static inline constexpr jboolean sBoolValue = true; + static jint Get_CONST_INT(JNIEnv* env) { + return 3; + } + static ::jni_zero::ScopedJavaLocalRef<jstring> Get_CONST_STR(JNIEnv* env) { + jclass clazz = org_jni_1zero_JavapClass_clazz(env); + JNI_ZERO_DCHECK(clazz); + jfieldID field_id = org_jni_1zero_JavapClass_fieldId_CONST_1STR(env); + return ::jni_zero::ScopedJavaLocalRef<>::Adopt(env, env->GetStaticObjectField(clazz, field_id)) + .As<jstring>(); + } + jint Get_mFinalInt(JNIEnv* env) const { + return 7; + } + ::jni_zero::ScopedJavaLocalRef<jstring> Get_mMutableString(JNIEnv* env) const { + auto this_obj = reinterpret_cast<const ::jni_zero::JavaRef<::org::jni_zero::JJavapClass>*>(this); + jfieldID field_id = org_jni_1zero_JavapClass_fieldId_mMutableString(env); + return ::jni_zero::ScopedJavaLocalRef<>::Adopt(env, env->GetObjectField(this_obj->obj(), field_id)) + .As<jstring>(); + } + void Set_mMutableString(JNIEnv* env, const ::jni_zero::JavaRef<jstring>& value) const { + auto this_obj = reinterpret_cast<const ::jni_zero::JavaRef<::org::jni_zero::JJavapClass>*>(this); + jfieldID field_id = org_jni_1zero_JavapClass_fieldId_mMutableString(env); + env->SetObjectField(this_obj->obj(), field_id, value.obj()); + } + static jboolean Get_sBoolValue(JNIEnv* env) { + return true; + } + static jboolean Get_sMutableInt(JNIEnv* env) { + jclass clazz = org_jni_1zero_JavapClass_clazz(env); + JNI_ZERO_DCHECK(clazz); + jfieldID field_id = org_jni_1zero_JavapClass_fieldId_sMutableInt(env); + return env->GetStaticBooleanField(clazz, field_id); + } + static void Set_sMutableInt(JNIEnv* env, jboolean value) { + jclass clazz = org_jni_1zero_JavapClass_clazz(env); + JNI_ZERO_DCHECK(clazz); + jfieldID field_id = org_jni_1zero_JavapClass_fieldId_sMutableInt(env); + env->SetStaticBooleanField(clazz, field_id, value); + } static ::jni_zero::ScopedJavaLocalRef<::org::jni_zero::JJavapClass> New(JNIEnv* env) { return Java_JavapClass_Constructor(env) .As<::org::jni_zero::JJavapClass>(); @@ -368,12 +351,12 @@ } // namespace jni_zero_internal namespace org::jni_zero { -using JJavapClassJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JJavapClass>; +using JavapClassJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JJavapClass>; } -#ifndef _JNI_ZERO_JJavapClassJni_DEFINED -using org::jni_zero::JJavapClassJni; -#define _JNI_ZERO_JJavapClassJni_DEFINED +#ifndef _JNI_ZERO_JavapClassJni_DEFINED +using org::jni_zero::JavapClassJni; +#define _JNI_ZERO_JavapClassJni_DEFINED #endif
diff --git a/third_party/jni_zero/test/golden/testPackagePrefixGenerator-SampleForTests_jni.h.golden b/third_party/jni_zero/test/golden/testPackagePrefixGenerator-SampleForTests_jni.h.golden index 3aeaaa4..29660cd9 100644 --- a/third_party/jni_zero/test/golden/testPackagePrefixGenerator-SampleForTests_jni.h.golden +++ b/third_party/jni_zero/test/golden/testPackagePrefixGenerator-SampleForTests_jni.h.golden
@@ -1329,22 +1329,22 @@ } // namespace jni_zero_internal namespace org::jni_zero { -using JSampleForTestsJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleForTests>; -using JSampleForTests_InnerStructAJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleForTests_InnerStructA>; -using JSampleForTests_InnerStructBJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleForTests_InnerStructB>; +using SampleForTestsJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleForTests>; +using SampleForTests_InnerStructAJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleForTests_InnerStructA>; +using SampleForTests_InnerStructBJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleForTests_InnerStructB>; } -#ifndef _JNI_ZERO_JSampleForTestsJni_DEFINED -using org::jni_zero::JSampleForTestsJni; -#define _JNI_ZERO_JSampleForTestsJni_DEFINED +#ifndef _JNI_ZERO_SampleForTestsJni_DEFINED +using org::jni_zero::SampleForTestsJni; +#define _JNI_ZERO_SampleForTestsJni_DEFINED #endif -#ifndef _JNI_ZERO_JSampleForTests_InnerStructAJni_DEFINED -using org::jni_zero::JSampleForTests_InnerStructAJni; -#define _JNI_ZERO_JSampleForTests_InnerStructAJni_DEFINED +#ifndef _JNI_ZERO_SampleForTests_InnerStructAJni_DEFINED +using org::jni_zero::SampleForTests_InnerStructAJni; +#define _JNI_ZERO_SampleForTests_InnerStructAJni_DEFINED #endif -#ifndef _JNI_ZERO_JSampleForTests_InnerStructBJni_DEFINED -using org::jni_zero::JSampleForTests_InnerStructBJni; -#define _JNI_ZERO_JSampleForTests_InnerStructBJni_DEFINED +#ifndef _JNI_ZERO_SampleForTests_InnerStructBJni_DEFINED +using org::jni_zero::SampleForTests_InnerStructBJni; +#define _JNI_ZERO_SampleForTests_InnerStructBJni_DEFINED #endif
diff --git a/third_party/jni_zero/test/golden/testPackagePrefixWithFilter-SampleForTests_jni.h.golden b/third_party/jni_zero/test/golden/testPackagePrefixWithFilter-SampleForTests_jni.h.golden index 3aeaaa4..29660cd9 100644 --- a/third_party/jni_zero/test/golden/testPackagePrefixWithFilter-SampleForTests_jni.h.golden +++ b/third_party/jni_zero/test/golden/testPackagePrefixWithFilter-SampleForTests_jni.h.golden
@@ -1329,22 +1329,22 @@ } // namespace jni_zero_internal namespace org::jni_zero { -using JSampleForTestsJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleForTests>; -using JSampleForTests_InnerStructAJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleForTests_InnerStructA>; -using JSampleForTests_InnerStructBJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleForTests_InnerStructB>; +using SampleForTestsJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleForTests>; +using SampleForTests_InnerStructAJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleForTests_InnerStructA>; +using SampleForTests_InnerStructBJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleForTests_InnerStructB>; } -#ifndef _JNI_ZERO_JSampleForTestsJni_DEFINED -using org::jni_zero::JSampleForTestsJni; -#define _JNI_ZERO_JSampleForTestsJni_DEFINED +#ifndef _JNI_ZERO_SampleForTestsJni_DEFINED +using org::jni_zero::SampleForTestsJni; +#define _JNI_ZERO_SampleForTestsJni_DEFINED #endif -#ifndef _JNI_ZERO_JSampleForTests_InnerStructAJni_DEFINED -using org::jni_zero::JSampleForTests_InnerStructAJni; -#define _JNI_ZERO_JSampleForTests_InnerStructAJni_DEFINED +#ifndef _JNI_ZERO_SampleForTests_InnerStructAJni_DEFINED +using org::jni_zero::SampleForTests_InnerStructAJni; +#define _JNI_ZERO_SampleForTests_InnerStructAJni_DEFINED #endif -#ifndef _JNI_ZERO_JSampleForTests_InnerStructBJni_DEFINED -using org::jni_zero::JSampleForTests_InnerStructBJni; -#define _JNI_ZERO_JSampleForTests_InnerStructBJni_DEFINED +#ifndef _JNI_ZERO_SampleForTests_InnerStructBJni_DEFINED +using org::jni_zero::SampleForTests_InnerStructBJni; +#define _JNI_ZERO_SampleForTests_InnerStructBJni_DEFINED #endif
diff --git a/third_party/jni_zero/test/golden/testUniqueAnnotations-SampleUniqueAnnotations_jni.h.golden b/third_party/jni_zero/test/golden/testUniqueAnnotations-SampleUniqueAnnotations_jni.h.golden index dbfbde5..af2d3b8e 100644 --- a/third_party/jni_zero/test/golden/testUniqueAnnotations-SampleUniqueAnnotations_jni.h.golden +++ b/third_party/jni_zero/test/golden/testUniqueAnnotations-SampleUniqueAnnotations_jni.h.golden
@@ -172,12 +172,12 @@ } // namespace jni_zero_internal namespace org::jni_zero { -using JSampleUniqueAnnotationsJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleUniqueAnnotations>; +using SampleUniqueAnnotationsJni = ::jni_zero_internal::_CalledByNatives<::org::jni_zero::JSampleUniqueAnnotations>; } -#ifndef _JNI_ZERO_JSampleUniqueAnnotationsJni_DEFINED -using org::jni_zero::JSampleUniqueAnnotationsJni; -#define _JNI_ZERO_JSampleUniqueAnnotationsJni_DEFINED +#ifndef _JNI_ZERO_SampleUniqueAnnotationsJni_DEFINED +using org::jni_zero::SampleUniqueAnnotationsJni; +#define _JNI_ZERO_SampleUniqueAnnotationsJni_DEFINED #endif
diff --git a/third_party/leveldatabase/env_chromium.cc b/third_party/leveldatabase/env_chromium.cc index d8c644a..f161e5f 100644 --- a/third_party/leveldatabase/env_chromium.cc +++ b/third_party/leveldatabase/env_chromium.cc
@@ -1462,6 +1462,11 @@ } std::string_view MakeStringView(const leveldb::Slice& s) { + // Workaround for crbug.com/493304613. May be possible to remove this after + // LevelDB is patched. + if (s.data() == nullptr) { + return std::string_view(); + } return std::string_view(s.data(), s.size()); }
diff --git a/third_party/litert/BUILD.gn b/third_party/litert/BUILD.gn index 295b11e..af5798b7 100644 --- a/third_party/litert/BUILD.gn +++ b/third_party/litert/BUILD.gn
@@ -27,6 +27,7 @@ # TODO(crbug.com/1147556): Try to clean/remove no-sign-compare if possible. "-Wno-sign-compare", + "-Wno-unused-function", ] if (is_win) { # Override warnings in litert_shared_library.cc. @@ -83,7 +84,9 @@ "src/litert/c/internal/litert_accelerator.h", "src/litert/c/internal/litert_accelerator_registration.h", "src/litert/c/internal/litert_delegate_wrapper.h", + "src/litert/c/internal/litert_external_litert_buffer_context.h", "src/litert/c/internal/litert_logging.h", + "src/litert/c/internal/litert_runtime_context.h", "src/litert/c/internal/litert_tensor_buffer_registry.h", "src/litert/c/litert_builder.h", "src/litert/c/litert_common.h", @@ -116,6 +119,7 @@ "src/litert/cc/internal/litert_shared_library.h", "src/litert/cc/internal/litert_tensor_buffer_utils.h", "src/litert/cc/internal/scoped_file.h", + "src/litert/cc/internal/scoped_weight_source.h", "src/litert/cc/litert_buffer_ref.h", "src/litert/cc/litert_compiled_model.h", "src/litert/cc/litert_element_type.h", @@ -172,6 +176,7 @@ "src/litert/runtime/tensor_buffer_registry.h", "src/litert/runtime/tensor_buffer_requirements.h", "src/litert/runtime/tfl_utils.h", + "src/weight_loader/external_weight_loader_litert.h", ] public_deps = [ ":mutable_tflite_schema", @@ -210,7 +215,9 @@ "src/litert/c/internal/litert_accelerator.cc", "src/litert/c/internal/litert_accelerator_registration.cc", "src/litert/c/internal/litert_delegate_wrapper.cc", + "src/litert/c/internal/litert_external_litert_buffer_context.cc", "src/litert/c/internal/litert_logging.cc", + "src/litert/c/internal/litert_runtime_context.cc", "src/litert/c/internal/litert_tensor_buffer_registry.cc", "src/litert/c/litert_builder.cc", "src/litert/c/litert_common.cc", @@ -357,6 +364,7 @@ "src/litert/runtime/tensor_buffer_registry.cc", "src/litert/runtime/tensor_buffer_requirements.cc", "src/litert/runtime/tfl_utils.cc", + "src/weight_loader/external_weight_loader_litert.cc", ] if (is_android) { sources += [
diff --git a/third_party/litert/README.chromium b/third_party/litert/README.chromium index 641774a..f8316bf7 100644 --- a/third_party/litert/README.chromium +++ b/third_party/litert/README.chromium
@@ -2,8 +2,8 @@ Short Name: litert URL: https://github.com/google-ai-edge/LiteRT Version: N/A -Revision: 6933ef7f5d338fb7c75f542443af104b09e0849f -Date: 2026-03-18 +Revision: 2fe783de2df129accc5c3cc551722318ed2b1f65 +Date: 2026-03-19 Update Mechanism: Manual License: Apache-2.0 License File: LICENSE
diff --git a/third_party/litert/src b/third_party/litert/src index 6933ef7..2fe783d 160000 --- a/third_party/litert/src +++ b/third_party/litert/src
@@ -1 +1 @@ -Subproject commit 6933ef7f5d338fb7c75f542443af104b09e0849f +Subproject commit 2fe783de2df129accc5c3cc551722318ed2b1f65
diff --git a/third_party/llvm-libc/src b/third_party/llvm-libc/src index a96728b..9b08b4a 160000 --- a/third_party/llvm-libc/src +++ b/third_party/llvm-libc/src
@@ -1 +1 @@ -Subproject commit a96728b9a94a732ec71650710949851ddf114845 +Subproject commit 9b08b4a339fce4aaa79c30ec303eb8edeb198290
diff --git a/third_party/perfetto b/third_party/perfetto index d2aaedf..b041e45 160000 --- a/third_party/perfetto +++ b/third_party/perfetto
@@ -1 +1 @@ -Subproject commit d2aaedff4b9e6fdb90edfdb57f02d79c87d23a73 +Subproject commit b041e451767026d64f688b3767938c0222652b31
diff --git a/third_party/rust/chromium_crates_io/patches/image-v0_25/0001-bmp-decoder-Add-streaming-resumable-BMP-decoding-sup.patch b/third_party/rust/chromium_crates_io/patches/image-v0_25/0001-bmp-decoder-Add-streaming-resumable-BMP-decoding-sup.patch index 6e68f32..7ee5d95 100644 --- a/third_party/rust/chromium_crates_io/patches/image-v0_25/0001-bmp-decoder-Add-streaming-resumable-BMP-decoding-sup.patch +++ b/third_party/rust/chromium_crates_io/patches/image-v0_25/0001-bmp-decoder-Add-streaming-resumable-BMP-decoding-sup.patch
@@ -24,10 +24,10 @@ Upstream: https://github.com/image-rs/image -diff --git a/src/codecs/bmp/decoder.rs b/src/codecs/bmp/decoder.rs +diff --git a/third_party/rust/chromium_crates_io/vendor/image-v0_25/src/codecs/bmp/decoder.rs b/third_party/rust/chromium_crates_io/vendor/image-v0_25/src/codecs/bmp/decoder.rs index 5771665..00799e3 100644 ---- a/src/codecs/bmp/decoder.rs -+++ b/src/codecs/bmp/decoder.rs +--- a/third_party/rust/chromium_crates_io/vendor/image-v0_25/src/codecs/bmp/decoder.rs ++++ b/third_party/rust/chromium_crates_io/vendor/image-v0_25/src/codecs/bmp/decoder.rs @@ -5,15 +5,23 @@ use std::iter::{repeat, Rev}; use std::slice::ChunksExactMut; use std::{error, fmt};
diff --git a/third_party/tflite/BUILD.gn b/third_party/tflite/BUILD.gn index 2f7d9114..99a7960f 100644 --- a/third_party/tflite/BUILD.gn +++ b/third_party/tflite/BUILD.gn
@@ -232,6 +232,7 @@ "src/tensorflow/lite/kernels/multinomial.cc", "src/tensorflow/lite/kernels/random_standard_normal_custom.cc", "src/tensorflow/lite/kernels/random_uniform_custom.cc", + "src/tensorflow/lite/kernels/register_ref.cc", "src/tensorflow/lite/kernels/right_shift.cc", "src/tensorflow/lite/kernels/sign.cc", "src/tensorflow/lite/kernels/sign_custom.cc", @@ -366,6 +367,7 @@ "src/tensorflow/lite/kernels/internal/tensor_ctypes.h", "src/tensorflow/lite/kernels/kernel_util.h", "src/tensorflow/lite/kernels/op_macros.h", + "src/tensorflow/lite/kernels/register_ref.h", "src/tensorflow/lite/kernels/stablehlo_elementwise.h", "src/tensorflow/lite/type_to_tflitetype.h", ]
diff --git a/third_party/tflite/README.chromium b/third_party/tflite/README.chromium index 1b63a9e7..ffab3f9f 100644 --- a/third_party/tflite/README.chromium +++ b/third_party/tflite/README.chromium
@@ -1,9 +1,9 @@ Name: TensorFlow Lite Short Name: tflite URL: https://github.com/tensorflow/tensorflow -Version: 67d816626bf264e3b142187768601a200cbe810d -Revision: 67d816626bf264e3b142187768601a200cbe810d -Date: 2026-03-18 +Version: 8cb40fbe19ed5eb65da26078b8667e31e52211e9 +Revision: 8cb40fbe19ed5eb65da26078b8667e31e52211e9 +Date: 2026-03-19 Update Mechanism: Manual License: Caffe, Apache-2.0 License File: LICENSE
diff --git a/third_party/tflite/src b/third_party/tflite/src index 67d8166..8cb40fb 160000 --- a/third_party/tflite/src +++ b/third_party/tflite/src
@@ -1 +1 @@ -Subproject commit 67d816626bf264e3b142187768601a200cbe810d +Subproject commit 8cb40fbe19ed5eb65da26078b8667e31e52211e9
diff --git a/third_party/vulkan-deps b/third_party/vulkan-deps index 0d2e0ef..ac3b76d 160000 --- a/third_party/vulkan-deps +++ b/third_party/vulkan-deps
@@ -1 +1 @@ -Subproject commit 0d2e0efef5f244c9816fb2ef5cd1bcdbb4b69899 +Subproject commit ac3b76d7237245c9c12e82e6d480de09dbd0428a
diff --git a/third_party/vulkan-loader/src b/third_party/vulkan-loader/src index 9e84f0b..7d65e28 160000 --- a/third_party/vulkan-loader/src +++ b/third_party/vulkan-loader/src
@@ -1 +1 @@ -Subproject commit 9e84f0b6a16647e99b190674db1916d9e9da41a6 +Subproject commit 7d65e28ca4401b0c2ecc25dae5537bfe40fd39d4
diff --git a/third_party/vulkan-validation-layers/src b/third_party/vulkan-validation-layers/src index d7f9d91..15693db 160000 --- a/third_party/vulkan-validation-layers/src +++ b/third_party/vulkan-validation-layers/src
@@ -1 +1 @@ -Subproject commit d7f9d91e8480e859bc981dd9f41f43ade56e10a4 +Subproject commit 15693db0dfc37a4e843f6208c67f52655613c03f
diff --git a/third_party/webview2/3pp/3pp.pb b/third_party/webview2/3pp/3pp.pb new file mode 100644 index 0000000..6419fca --- /dev/null +++ b/third_party/webview2/3pp/3pp.pb
@@ -0,0 +1,17 @@ +create { + source { + script { + name: "fetch.py" + } + unpack_archive: true + } + + build { + install: "install.sh" + } +} + +upload { + universal: true + pkg_prefix: "chromium/third_party" +}
diff --git a/third_party/webview2/3pp/fetch.py b/third_party/webview2/3pp/fetch.py new file mode 100755 index 0000000..57d46ea --- /dev/null +++ b/third_party/webview2/3pp/fetch.py
@@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +# Copyright 2026 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import argparse +import json +import os +import urllib.request + +PACKAGE_NAME = "Microsoft.Web.WebView2" + +def get_latest_stable_version(): + url = (f"https://api.nuget.org/v3-flatcontainer/" + f"{PACKAGE_NAME.lower()}/index.json") + with urllib.request.urlopen(url) as response: + data = json.loads(response.read().decode()) + versions = data['versions'] + + # Filter out any pre-release versions. + stable_versions = [v for v in versions if '-' not in v] + + if not stable_versions: + raise Exception("No stable versions found for " + PACKAGE_NAME) + + return stable_versions[-1] + +def get_download_url(version): + download_url = (f"https://www.nuget.org/api/v2/package/" + f"{PACKAGE_NAME}/{version}") + + partial_manifest = { + 'url': [download_url], + 'ext': '.zip', + } + print(json.dumps(partial_manifest)) + +def main(): + ap = argparse.ArgumentParser() + sub = ap.add_subparsers() + + latest = sub.add_parser("latest") + latest.set_defaults(func=lambda _opts: print(get_latest_stable_version())) + + download = sub.add_parser("get_url") + download.set_defaults( + func=lambda _opts: get_download_url(os.environ['_3PP_VERSION'])) + + opts = ap.parse_args() + opts.func(opts) + +if __name__ == '__main__': + main()
diff --git a/third_party/webview2/3pp/install.sh b/third_party/webview2/3pp/install.sh new file mode 100755 index 0000000..526cc3e --- /dev/null +++ b/third_party/webview2/3pp/install.sh
@@ -0,0 +1,51 @@ +#!/bin/bash +# Copyright 2026 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +set -e +set -x + +# `PREFIX` is the destination directory for the CIPD package content. +PREFIX="$1" + +# NuGet structure is: +# build/native/include/WebView2.h +# build/native/{x86,x64,arm64}/... +mkdir -p "$PREFIX/include" +if [ -f "build/native/include/WebView2.h" ]; then + cp "build/native/include/WebView2.h" "$PREFIX/include/" +else + echo "Error: WebView2.h not found in expected location." + exit 1 +fi + +# Copy Architecture-specific Binaries. +for arch in x86 x64 arm64 +do + SRC_DIR="build/native/$arch" + DST_DIR="$PREFIX/$arch" + + if [ -d "$SRC_DIR" ]; then + mkdir -p "$DST_DIR" + + # Copy the DLL. + if [ -f "$SRC_DIR/WebView2Loader.dll" ]; then + cp "$SRC_DIR/WebView2Loader.dll" "$DST_DIR/" + else + echo "Error: WebView2Loader.dll not found in expected location." + exit 1 + fi + + # Copy the Import Library (.dll.lib). + if [ -f "$SRC_DIR/WebView2Loader.dll.lib" ]; then + cp "$SRC_DIR/WebView2Loader.dll.lib" "$DST_DIR/" + else + echo "Error: WebView2Loader.dll.lib not found in expected location." + exit 1 + fi + else + echo "Error: Directory for $arch not found." + exit 1 + fi +done
diff --git a/third_party/webview2/BUILD.gn b/third_party/webview2/BUILD.gn new file mode 100644 index 0000000..a3e249e2 --- /dev/null +++ b/third_party/webview2/BUILD.gn
@@ -0,0 +1,21 @@ +# Copyright 2026 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +config("webview2_config") { + include_dirs = [ "include" ] +} + +# This target copies the DLL to the root build directory. `WebView2Loader.dll` +# needs to be bundled with the distribution of your binary using `WebView2`. +copy("webview2_loader_dll") { + sources = [ "$target_cpu/WebView2Loader.dll" ] + outputs = [ "$root_out_dir/WebView2Loader.dll" ] +} + +source_set("webview2") { + sources = [ "include/WebView2.h" ] + public_configs = [ ":webview2_config" ] + libs = [ rebase_path("$target_cpu/WebView2Loader.dll.lib", root_build_dir) ] + data_deps = [ ":webview2_loader_dll" ] +}
diff --git a/third_party/webview2/LICENSE b/third_party/webview2/LICENSE new file mode 100644 index 0000000..fa56d1df --- /dev/null +++ b/third_party/webview2/LICENSE
@@ -0,0 +1,31 @@ +MICROSOFT SOFTWARE LICENSE TERMS +MICROSOFT EDGE WEBVIEW2 SDK + +Copyright (C) Microsoft Corporation. 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. + * The name of Microsoft Corporation, or the names of its contributors +may not 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. +
diff --git a/third_party/webview2/OWNERS b/third_party/webview2/OWNERS new file mode 100644 index 0000000..7d7c0d2c --- /dev/null +++ b/third_party/webview2/OWNERS
@@ -0,0 +1,3 @@ +ganesh@chromium.org +sorin@chromium.org +
diff --git a/third_party/webview2/README.chromium b/third_party/webview2/README.chromium new file mode 100644 index 0000000..0a12a90 --- /dev/null +++ b/third_party/webview2/README.chromium
@@ -0,0 +1,24 @@ +Name: Microsoft Edge WebView2 SDK +Short Name: webview2 +URL: https://www.nuget.org/packages/Microsoft.Web.WebView2 +Version: 1.0.3856.49 +Date: 2026-03-16 +License: BSD-3-Clause +License File: LICENSE +License Android Compatible: no +Shipped: yes +Security Critical: yes +Update Mechanism: Manual +CPEPrefix: cpe:/a:microsoft:edge_webview2 +Description: +The Microsoft Edge WebView2 control allows you to embed web technologies +(HTML, CSS, and JavaScript) in your native apps. This directory contains +the Win32 SDK headers and loader binaries required to instantiate the +WebView2 runtime. + +Local Modifications: +Only includes the following headers and libraries required for the build: +- include/WebView2.h +- {x86/x64/arm64}/WebView2Loader.dll +- {x86/x64/arm64}/WebView2Loader.dll.lib +
diff --git a/third_party/xdg-utils b/third_party/xdg-utils deleted file mode 160000 index cb54d9d..0000000 --- a/third_party/xdg-utils +++ /dev/null
@@ -1 +0,0 @@ -Subproject commit cb54d9db2e535ee4ef13cc91b65a1e2741a94a44
diff --git a/third_party/xnnpack/README.chromium b/third_party/xnnpack/README.chromium index d0d6ff1..93a360fe 100644 --- a/third_party/xnnpack/README.chromium +++ b/third_party/xnnpack/README.chromium
@@ -2,7 +2,7 @@ Short Name: xnnpack URL: https://github.com/google/xnnpack Version: N/A -Revision: 811d0bd388ba8f4853c5560b6e16a5af3e8b895a +Revision: 4334fa7cbdf8e276db976792cd21d8614910d569 Update Mechanism: Manual License: BSD-3-Clause License File: src/LICENSE
diff --git a/third_party/xnnpack/build_identifier.c b/third_party/xnnpack/build_identifier.c index 4ea19b9..e63a0b3 100644 --- a/third_party/xnnpack/build_identifier.c +++ b/third_party/xnnpack/build_identifier.c
@@ -1026,10 +1026,10 @@ #include <string.h> static const uint8_t xnn_build_identifier[] = { - 100, 69, 53, 192, 128, 8, 21, 80, - 12, 40, 103, 30, 178, 240, 138, 22, - 150, 108, 242, 251, 118, 132, 252, 43, - 246, 56, 252, 37, 26, 68, 39, 68 + 6, 53, 126, 138, 122, 139, 119, 3, + 0, 196, 172, 66, 65, 192, 110, 104, + 207, 161, 243, 248, 31, 90, 21, 143, + 121, 143, 234, 162, 90, 140, 46, 236 }; size_t xnn_experimental_get_build_identifier_size() {
diff --git a/third_party/xnnpack/src b/third_party/xnnpack/src index 811d0bd..4334fa7 160000 --- a/third_party/xnnpack/src +++ b/third_party/xnnpack/src
@@ -1 +1 @@ -Subproject commit 811d0bd388ba8f4853c5560b6e16a5af3e8b895a +Subproject commit 4334fa7cbdf8e276db976792cd21d8614910d569
diff --git a/tools/bisect_repackage/bisect_repackage.py b/tools/bisect_repackage/bisect_repackage.py index c311800..1e822f8 100644 --- a/tools/bisect_repackage/bisect_repackage.py +++ b/tools/bisect_repackage/bisect_repackage.py
@@ -60,8 +60,6 @@ 'resources/', 'resources.pak', 'v8_context_snapshot.bin', - 'xdg-mime', - 'xdg-settings' ], 'win64': [ 'chrome.dll',
diff --git a/tools/clang/spanify/README.md b/tools/clang/spanify/README.md index 5d03de7..d464bac 100644 --- a/tools/clang/spanify/README.md +++ b/tools/clang/spanify/README.md
@@ -1,8 +1,10 @@ # Clang Spanification tool -This tool generates cross-translation unit rewrites converting pointer type expressions (T*/raw_ptr<T>) to base::span<T>/base::raw_span<T> expressions. +This tool generates cross-translation unit rewrites converting pointer type +expressions (T\*/raw_ptr<T>) to base::span<T>/base::raw_span<T> expressions. For instance: + ```cpp std::vector<int> ctn = {1,2,3, 4}; ... @@ -10,6 +12,7 @@ ... ptr[index] = value; ``` + ptr here becomes a span, and the code becomes: ```cpp @@ -23,6 +26,7 @@ ## Build Clang is built using CMake. To run cmake, this script can be used: + ```bash ./tools/clang/scripts/build.py \ --without-android \ @@ -32,11 +36,11 @@ The build directory is created into: `third_party/llvm-build/Release+Asserts/` and you can build it again incrementally using: + ```bash ninja -C third_party/llvm-build/Release+Asserts/ spanify ``` - ## Run the tests ```bash @@ -54,6 +58,7 @@ Finally you need to have a version of libstdc++ installed. If you see errors like: + ```bash Failed to process deref-expr-actual.cc tools/clang/spanify/tests/chrome/deref-expr-actual.cc:4:10: fatal error: 'vector' file not found @@ -63,66 +68,58 @@ ``` You can install libstdc++ as follows: + ```bash sudo apt install libstdc++-14-dev ``` ## Using the tool -The `rewrite-multiple-platforms.sh` scripts first builds the tool, runs tests -and then runs the tool over every configuration in the list of platforms. +The `rewrite_multiple_platforms.py` script first builds the tool, runs tests and +then runs the tool over every configuration in the list of platforms. ```bash - ./tools/clang/spanify/rewrite-multiple-platforms.sh + ./tools/clang/spanify/rewrite_multiple_platforms.py ``` ### Hints #### Flags -1. `--platforms=<comma,separated,list,of,platforms>` -2. `--skip-building-clang` or `-b` for short, only use if you have already built - clang and know nothing has changed, this implicitly adds `--keep-build` flag, - see the flag definition below for more details on its behaviour. -3. `--skip-rewrite` or `-r` for short, if you've already ran on the platform and - have the associated `~/scratch` directory you can just skip generating this. -4. `--skip-extract-edits` or `-e` for short, don't attempt to run +1. `--platforms` or `-p` for short: A space-separated list of platforms to run + the rewrite on. Defaults to `linux`. Valid choices are `android`, `win`, + `linux`, `cros`, `chromeos`, `mac`. +2. `--skip-rewrite` or `-r` for short: If you've already ran on the platform and + have the associated `~/scratch` directory, you can just skip generating this. +3. `--skip-extract-edits` or `-e` for short: Don't attempt to run `extract_edits.py` on the results of the rewrite. -5. `--keep-build` when you plan to run again (and want to use - `--skip-building-clang`), you first need a run that completed the build part - with `--keep-build`. IMPORTANT: this will mean `third_party/llvm-build` will - not be the normal optimized build and will slow down your regular chromium. - You should restore it by running - `mv third_party/llvm-build-upstream third_party/llvm-build` or running the - script without `--keep-build` -6. `--incremental-clang-build` or `-i` for short, will use the already built - clang and attempt to only incrementally include changes to the clang plugin, - this implicitly adds `--keep-build` flag, see the flag definition above for - more details on its behaviour. +4. `--project`: The project to spanify. Valid choices are `chrome` (default) and + `partition_alloc`. + +The script automatically handles the build step. If it detects a custom spanify +build, it will do an incremental build and keep the build intact. Otherwise, it +will build spanify from scratch and restore the original `llvm-build` directory +when finished. The flags are useful to cut down iteration time when working on particular -parts. If you are modifying the plugin you can't skip the build part, but if you -just want to do a new platform this flag is useful. If you've already done the -platform, skipping both the build and the rewrite allows you to work on -`extract_edits.py`'s logic. Skipping edits is only really useful if you are -testing early steps and you aren't interested in the script even attempting the -edits (so it ends earlier). +parts. If you've already done the platform, skipping the rewrite allows you to +work on `extract_edits.py`'s logic. Skipping edits is only really useful if you +are testing early steps and you aren't interested in the script even attempting +the edits (so it ends earlier). Example commands: ```bash - ./tools/clang/spanify/rewrite-multiple-platforms.sh --platforms=linux - ./tools/clang/spanify/rewrite-multiple-platforms.sh -p=linux --keep-build - ./tools/clang/spanify/rewrite-multiple-platforms.sh --skip-building-clang - ./tools/clang/spanify/rewrite-multiple-platforms.sh --b - ./tools/clang/spanify/rewrite-multiple-platforms.sh \ - --platforms=linux --skip-building-clang --skip-rewrite + ./tools/clang/spanify/rewrite_multiple_platforms.py + ./tools/clang/spanify/rewrite_multiple_platforms.py --platforms linux mac + ./tools/clang/spanify/rewrite_multiple_platforms.py --project partition_alloc + ./tools/clang/spanify/rewrite_multiple_platforms.py -p linux --skip-rewrite ``` ### Troubleshooting -If for some reason your `rewrite-multiple-platforms.sh` command fails, it is +If for some reason your `rewrite_multiple_platforms.py` command fails, it is important to restore the "normal" state of your clang directory before running again. As the script starts to run, if you are building clang it does a `mv third_party/llvm-build third_party/llvm-build-upstream` and will (if it runs @@ -137,10 +134,3 @@ ```bash mv third_party/llvm-build-upstream third_party/llvm-build ``` - -Another possible issue is during the `extract_edits.py` step it might complain -that `~/scratch/rewriter.main.out` doesn't exist. This can happen sometimes -because the script writes out files to `~/scratch/rewriter-$PLATFORM.main.out` -and then later uses `cat platform_file >> ~/scratch/rewriter.main.out` and it -can be unreliable due to the large file size. You can simply create it yourself -either by appending each platform together or symlinking it together.
diff --git a/tools/clang/spanify/apply-successful-rewrites.py b/tools/clang/spanify/apply-successful-rewrites.py index 54b26ac..beb75fd 100755 --- a/tools/clang/spanify/apply-successful-rewrites.py +++ b/tools/clang/spanify/apply-successful-rewrites.py
@@ -5,7 +5,7 @@ # found in the LICENSE file. # # This script is used to apply patches that successfully compile from the -# 'rewrite-multiple-platforms.sh` script in the Chromium codebase, and then +# 'rewrite_multiple_platforms.py` script in the Chromium codebase, and then # test on various gn configurations until a merged patch that is likely to # compile successfully on the bots is generated. #
diff --git a/tools/clang/spanify/evaluate_patches.py b/tools/clang/spanify/evaluate_patches.py index 3862729..ee4b429f9 100755 --- a/tools/clang/spanify/evaluate_patches.py +++ b/tools/clang/spanify/evaluate_patches.py
@@ -251,7 +251,7 @@ run(f"gn gen out/{platform}", f"Failed to generate out/{platform}.") # Produce a full rewrite, and store individual patches below ~/scratch/patch_* -rewrite_script = "./tools/clang/spanify/rewrite-multiple-platforms.sh" +rewrite_script = "./tools/clang/spanify/rewrite_multiple_platforms.py" print(f"{rewrite_script} --platform={platform}") run(f"{rewrite_script} --platform={platform}")
diff --git a/tools/clang/spanify/rewrite-multiple-platforms.sh b/tools/clang/spanify/rewrite-multiple-platforms.sh deleted file mode 100755 index a3313e8..0000000 --- a/tools/clang/spanify/rewrite-multiple-platforms.sh +++ /dev/null
@@ -1,365 +0,0 @@ -#!/bin/bash -# Copyright 2024 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# For more fine-grained instructions, see: -# https://docs.google.com/document/d/1chTvr3fSofQNV_PDPEHRyUgcJCQBgTDOOBriW9gIm9M/edit?ts=5e9549a2#heading=h.fjdnrdg1gcty - -set -u # unset variables are quit-worthy errors - -# Possible flag values and their default settings. -PLATFORMS="linux" -BUILD_CLANG=true -REWRITE=true -EXTRACT_EDITS=true -KEEP_BUILD=false -INCREMENTAL_CLANG_BUILD=false -TOOL_ARG="" -# The command line string to parse them. -LONG_FLAGS="platforms::,skip-building-clang,skip-rewrite,skip-extract-edits,\ - keep-build,incremental-clang-build,project:,help" -options=$(getopt -l "$LONG_FLAGS" -o "p:brekih" -- "$@") - -COMPILE_DIRS=. -EDIT_DIRS=. -BUILD_TARGETS=all - -# Important not to access $1 if there is no passed values (due to set -u above -# will trigger an error). -# This ensures that '--' is the last value and will break the loop below. -eval set -- "$options" -while true; do - case "$1" in - -p|--platforms) - shift - PLATFORMS="$1" - ;; - -b|--skip-building-clang) - BUILD_CLANG=false - KEEP_BUILD=true - ;; - -r|--skip-rewrite) - REWRITE=false - ;; - -e|--skip-extract-edits) - EXTRACT_EDITS=false - ;; - -k|--keep-build) - KEEP_BUILD=true - ;; - -i|--incremental-clang-build) - INCREMENTAL_CLANG_BUILD=true - KEEP_BUILD=true - ;; - --project | --project=*) - val=$1 - if [[ "$val" == *'='* ]]; then - val="${val#*=}" - else - shift - val=$1 - fi - if [ "$val" = "partition_alloc" ] - then - COMPILE_DIRS="base/allocator/partition_allocator/src" - TOOL_ARG="--project=partition_alloc" - BUILD_TARGETS="base/allocator/partition_allocator:partition_alloc" - fi - ;; - -h|--help) - echo "Usage: rewrite-multiple-platforms.sh [OPTIONS]..." - echo "Runs the clang plugin spanify over selected chromium platforms and"\ - " spanifies unsafe buffers usage." - echo "" - echo "Options:" - echo " [-p|--platforms]=<comma,separated,list,of,platforms>, defaults"\ - "to 'linux'" - echo " [-b|--skip-building-clang], when set we won't attempt to build"\ - "third_party's clang, requires a previous run with --keep-build,"\ - "but this flag also sets --keep-build for convenience." - echo " [-r|--skip-rewrite], when set we won't create/destroy the"\ - "scratch directory and won't run the clang plugin." - echo " [-e|--skip-extract-edits], when set we won't run"\ - "extract_edits.py to generate the patches." - echo " [-k|--keep-build], when set we won't restore third_party/llvm."\ - "this should be set when you are going to run this script again,"\ - "but note you need to restore the directory to prevent slow down of"\ - "your regular chromium builds." - echo " [-i|--incremental-clang-build], when set we attempt to build"\ - "incrementally. This only works if you previously completed a run"\ - "with --keep-build and you haven't rebased, or gclient sync'd."\ - "This also sets --keep-build for convenience." - echo " [--project], when set to 'partition_alloc' it will only run on"\ - "that directory." - echo "" - echo "Check the README for more info." - exit 0 - ;; - --) - shift - break;; - esac - shift -done - -# Create the scratch directory that we need and ensure it is empty. -if [ $REWRITE = true ] -then - if [ -d ~/scratch ] - then - echo "*** Clearing ~/scratch ***" - rm -r ~/scratch - fi - mkdir ~/scratch -fi - -# Build and test the rewriter. -if [ $BUILD_CLANG = true ] -then - # Save llvm-build as it is about to be overwritten (if it hasn't already been - # saved). - if [ ${INCREMENTAL_CLANG_BUILD} = false ] && \ - [ ! -d third_party/llvm-build-upstream/ ] - then - echo "*** Saving current build ***" - - mv third_party/llvm-build third_party/llvm-build-upstream - else - echo "*** Build is already saved ***" - echo "*** If you don't expect this you might need to delete and resync ***" - fi - if [ $INCREMENTAL_CLANG_BUILD = true ] - then - echo "*** Building the rewriter incrementally ***" - time ninja -C third_party/llvm-build/Release+Asserts/ || exit 1 - else - echo "*** Building the rewriter completely ***" - time tools/clang/scripts/build.py \ - --with-android \ - --without-fuchsia \ - --with-ml-inliner-model="" \ - --extra-tools spanify || exit 1 - - fi -else - echo "*** Skipping building clang ***" -fi - -echo "*** Testing the rewriter ***" -tools/clang/spanify/run_all_tests.py || exit 1 - -args_for_platform() { - case "$1" in - - android) - cat <<EOF -target_os = "android" -clang_use_chrome_plugins = false -is_chrome_branded = true -is_debug = false -dcheck_always_on = true -is_official_build = true -symbol_level = 1 -use_remoteexec = false -enable_remoting = true -enable_webview_bundles = true -ffmpeg_branding = "Chrome" -proprietary_codecs = true -force_enable_raw_ptr_exclusion = true -EOF - ;; - - win) - cat <<EOF -target_os = "win" -clang_use_chrome_plugins = false -enable_precompiled_headers = false -is_chrome_branded = true -is_debug = false -dcheck_always_on = true -is_official_build = true -symbol_level = 1 -use_remoteexec = false -chrome_pgo_phase = 0 -force_enable_raw_ptr_exclusion = true -EOF - ;; - - linux) - cat <<EOF -target_os = "linux" -clang_use_chrome_plugins = false -dcheck_always_on = true -is_chrome_branded = true -is_debug = false -is_official_build = true -use_remoteexec = false -chrome_pgo_phase = 0 -force_enable_raw_ptr_exclusion = true -EOF - ;; - - cros) - cat <<EOF -target_os = "chromeos" -chromeos_is_browser_only = true -dcheck_always_on = true -is_chrome_branded = true -is_debug = false -is_official_build = true -use_remoteexec = false -chrome_pgo_phase = 0 -force_enable_raw_ptr_exclusion = true -EOF - ;; - - chromeos) - cat <<EOF -target_os = "chromeos" -dcheck_always_on = true -is_debug = false -is_official_build = true -use_remoteexec = false -chrome_pgo_phase = 0 -force_enable_raw_ptr_exclusion = true -EOF - ;; - - mac) - cat <<EOF -target_os = "mac" -dcheck_always_on = true -is_chrome_branded = true -is_debug = false -is_official_build = true -use_remoteexec = false -chrome_pgo_phase = 0 -symbol_level = 1 -force_enable_raw_ptr_exclusion = true -EOF - ;; - - *) - echo "unknown platform" - exit 1 - ;; - esac -} - -# The latest rewrite directory. -OUT_DIR="" - -pre_process() { - PLATFORM="$1" - OUT_DIR="out/rewrite-$PLATFORM" - - mkdir -p "$OUT_DIR" - args_for_platform "$PLATFORM" > "$OUT_DIR/args.gn" - - if [ $PLATFORM = "mac" ]; then - # You can not build libclang_re.osx.a without mac, luckily we don't need - # to change it for the rewrite so just "restore" the version from the - # saved build regardless of platform. - LIBCLANG="Release+Asserts/lib/clang" - DARWIN_RT="lib/darwin" - for path in $(ls -d third_party/llvm-build-upstream/${LIBCLANG}/*); do - # the basename is the clang version (like "22") - DIR=`basename ${path}` - mkdir -p "third_party/llvm-build/${LIBCLANG}/${DIR}/${DARWIN_RT}" - cp third_party/llvm-build-upstream/${LIBCLANG}/${DIR}/${DARWIN_RT}/* \ - third_party/llvm-build/${LIBCLANG}/${DIR}/${DARWIN_RT}/ - done - fi - - # Build generated files that a successful compilation depends on. - echo "*** Preparing targets for $PLATFORM ***" - gn gen $OUT_DIR - time ninja -C $OUT_DIR -t targets $BUILD_TARGETS \ - | grep '^gen/.*\(\.h\|inc\|css_tokenizer_codepoints.cc\)' \ - | cut -d : -f 1 \ - | xargs -s $(expr $(getconf ARG_MAX) - 256) ninja -C $OUT_DIR \ - || exit 1 - - - TARGET_OS_OPTION="" - if [ $PLATFORM = "win" ]; then - TARGET_OS_OPTION="--target_os=win" - fi -} - -main_rewrite() { - PLATFORM=$1 - OUT_DIR="out/rewrite-${PLATFORM}" - - TARGET_OS_OPTION="" - if [ $PLATFORM = "win" ]; then - TARGET_OS_OPTION="--target_os=win" - fi - - # Main rewrite. - # - # To avoid spending too much time writing to disk, we use `awk '!x[$0]++'` - # to removes duplicate lines. This reduces the output by a 62 factor: from - # 20GB to 300MB. It is faster than `sort -u`. This consumes RAM, but - # cloudtops have plenty of it. - echo "*** Running the main rewrite phase for $PLATFORM ***" - time ( - tools/clang/scripts/run_tool.py \ - $TARGET_OS_OPTION \ - --tool spanify \ - --generate-compdb \ - -p $OUT_DIR \ - $COMPILE_DIRS \ - path-filter="${COMPILE_DIRS}" \ - --tool-arg="$TOOL_ARG" \ - 2> ~/scratch/rewriter-${PLATFORM}.main.err \ - | awk '!x[$0]++' 1>~/scratch/rewriter-${PLATFORM}.main.out - ) -} - -if [ $REWRITE = true ] -then - for PLATFORM in ${PLATFORMS//,/ } - do - pre_process "$PLATFORM" - done - - for PLATFORM in ${PLATFORMS//,/ } - do - main_rewrite "$PLATFORM" - done -else - echo "*** Skipping rewrite ***" -fi - -# Apply edits generated by the main rewrite. -if [ $EXTRACT_EDITS = true ] -then - echo "*** Clearing test patches ***" - rm ~/scratch/patch* - - echo "*** Applying edits ***" - cat ~/scratch/rewriter-*.main.out \ - | tools/clang/spanify/extract_edits.py \ - | tools/clang/scripts/apply_edits.py -p $OUT_DIR $EDIT_DIRS -else - echo "*** Skipping edits ***" - # For the rewriter to properly know where the files are OUT_DIR has to be - # set, to replicate the behaviour we set it to the last platform. - OUT_DIR=`echo ${PLATFORMS//,/ } | awk '{print $NF;}'` -fi - -# Format sources, as many lines are likely over 80 chars now. -echo "*** Formatting ***" -time git cl format - -# Restore llvm-build. Without this, your future builds will be painfully slow. -if [ $KEEP_BUILD = false ] -then - echo "*** Restoring llvm-build you will need to build the plugin again ***" - rm -r -f third_party/llvm-build - mv third_party/llvm-build-upstream third_party/llvm-build -else - echo "*** Not restoring llvm-build, chromium wide builds will be slower ***" -fi
diff --git a/tools/clang/spanify/rewrite_multiple_platforms.py b/tools/clang/spanify/rewrite_multiple_platforms.py new file mode 100755 index 0000000..c133180 --- /dev/null +++ b/tools/clang/spanify/rewrite_multiple_platforms.py
@@ -0,0 +1,402 @@ +#!/usr/bin/env python3 +# Copyright 2026 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""Rewrites Chromium across multiple platforms using the spanify tool.""" + +import argparse +import contextlib +import logging +import os +import pathlib +import re +import shlex +import shutil +import subprocess +import time + +PROJECTS = { + 'chrome': { + 'compile_dirs': '.', + 'tool_arg': '', + 'build_targets': ['//:gn_all'], + }, + 'partition_alloc': { + 'compile_dirs': + 'base/allocator/partition_allocator/src', + 'tool_arg': + '--project=partition_alloc', + 'build_targets': [ + '//base/allocator/partition_allocator/src/partition_alloc:partition_alloc' + ], + }, +} + +# Standard GN arguments common to most platforms. +COMMON_GN_ARGS = [ + 'clang_use_chrome_plugins = false', + 'is_debug = false', + 'dcheck_always_on = true', + 'is_official_build = true', + 'use_remoteexec = false', + 'force_enable_raw_ptr_exclusion = true', +] + +# Platform-specific GN arguments. +PLATFORM_SPECIFIC_GN_ARGS = { + 'android': [ + 'target_os = "android"', + 'is_chrome_branded = true', + 'symbol_level = 1', + 'enable_remoting = true', + 'enable_webview_bundles = true', + 'ffmpeg_branding = "Chrome"', + 'proprietary_codecs = true', + ], + 'win': [ + 'target_os = "win"', + 'enable_precompiled_headers = false', + 'is_chrome_branded = true', + 'symbol_level = 1', + 'chrome_pgo_phase = 0', + ], + 'linux': [ + 'target_os = "linux"', + 'is_chrome_branded = true', + 'chrome_pgo_phase = 0', + ], + 'cros': [ + 'target_os = "chromeos"', + 'chromeos_is_browser_only = true', + 'is_chrome_branded = true', + 'chrome_pgo_phase = 0', + ], + 'chromeos': [ + 'target_os = "chromeos"', + 'chrome_pgo_phase = 0', + ], + 'mac': [ + 'target_os = "mac"', + 'is_chrome_branded = true', + 'chrome_pgo_phase = 0', + 'symbol_level = 1', + 'enable_dsyms = false', + 'enable_stripping = false', + ], +} + +LLVM_BUILD_DIR = pathlib.Path('third_party/llvm-build') +LLVM_UPSTREAM_DIR = pathlib.Path('third_party/llvm-build-upstream') +REWRITER_BINARY_PATH = LLVM_BUILD_DIR / 'Release+Asserts/bin/spanify' +CLANG_LIB_REL_PATH = pathlib.Path('Release+Asserts/lib/clang') + +SCRATCH_DIR = pathlib.Path('~/scratch').expanduser() + + +def get_out_dir(platform): + """ + Standardizes the output directory path for a given platform. + """ + return pathlib.Path(f'out/rewrite-{platform}') + + +def get_platform_args(platform): + """ + Returns the GN arguments for the given platform. + """ + return '\n'.join(COMMON_GN_ARGS + + PLATFORM_SPECIFIC_GN_ARGS[platform]) + '\n' + + +@contextlib.contextmanager +def build_and_manage_llvm(): + """ + Manages the llvm-build directory state and builds the rewriter. + + There are two main workflows: + 1. Workflow A (Temporary): The user does NOT have a custom spanify build. + This script backs up the current llvm-build, builds spanify from scratch, + yields to run the rewrite, and then restores the original llvm-build. + 2. Workflow B (Custom): The user ALREADY has a custom spanify build. + The script does an incremental build via ninja and leaves the + llvm-build directory as is. + + To build the spanify tool separately and keep it persistently, run: + $ tools/clang/scripts/build.py --with-android --without-fuchsia \ + --with-ml-inliner-model= --extra-tools spanify + """ + is_incremental = REWRITER_BINARY_PATH.exists() + backed_up = False + + # Backup logic: only backup if we have an llvm-build and it's not already + # a custom one (i.e., it doesn't have the rewriter tool). + if not LLVM_UPSTREAM_DIR.exists() and LLVM_BUILD_DIR.exists(): + if not is_incremental: + logging.info('Saving current llvm-build to %s', LLVM_UPSTREAM_DIR) + shutil.move(LLVM_BUILD_DIR, LLVM_UPSTREAM_DIR) + backed_up = True + else: + logging.info( + 'llvm-build already contains rewriter, skipping backup.') + + if is_incremental: + logging.info('Building the rewriter incrementally...') + run_command(['ninja', '-C', str(LLVM_BUILD_DIR / 'Release+Asserts')]) + else: + logging.info('Building the rewriter completely...') + run_command([ + 'tools/clang/scripts/build.py', + '--with-android', + '--without-fuchsia', + '--with-ml-inliner-model=', + '--extra-tools', + 'spanify', + ]) + + try: + yield + finally: + if backed_up: + logging.info('Restoring llvm-build from %s', LLVM_UPSTREAM_DIR) + shutil.rmtree(LLVM_BUILD_DIR, ignore_errors=True) + if LLVM_UPSTREAM_DIR.exists(): + shutil.move(LLVM_UPSTREAM_DIR, LLVM_BUILD_DIR) + elif is_incremental: + logging.warning('Keeping customized llvm-build. ' + 'Regular builds will be slower until restored.') + + +def run_command(cmd, **kwargs): + """ + Logs and runs a command. + """ + logging.info('Running: %s', shlex.join(cmd)) + start = time.time() + subprocess.check_call(cmd, **kwargs) + logging.info('Done in %.2fs', time.time() - start) + + +def prepare_platform(platform, out_dir, project): + """ + Generates args.gn and builds necessary generated files for the given + platform. + """ + compile_dirs = PROJECTS[project]['compile_dirs'] + + out_dir.mkdir(parents=True, exist_ok=True) + (out_dir / 'args.gn').write_text(get_platform_args(platform)) + + # Mac requires specific runtime libraries from the upstream build. + if platform == 'mac' and LLVM_UPSTREAM_DIR.exists(): + for v_dir in (LLVM_UPSTREAM_DIR / CLANG_LIB_REL_PATH).iterdir(): + if not v_dir.is_dir(): + continue + src = v_dir / 'lib/darwin' + if src.exists(): + dst = LLVM_BUILD_DIR / CLANG_LIB_REL_PATH / v_dir.name / 'lib/darwin' + shutil.copytree(src, dst, dirs_exist_ok=True) + + logging.info('Generating build files for %s...', platform) + run_command(['gn', 'gen', str(out_dir)]) + + # Build generated files that a successful compilation depends on. + logging.info('Building generated targets for %s...', platform) + + targets_proc = subprocess.Popen( + ['ninja', '-C', str(out_dir), '-t', 'targets', 'all'], + stdout=subprocess.PIPE, + text=True) + assert targets_proc.stdout is not None + + targets = [] + # If compile_dirs is '.', we want to match anything in gen/ + # Otherwise, we want to match anything in gen/compile_dirs/ + if compile_dirs == '.': + pattern = re.compile(r'^gen/.*(\.h|inc|css_tokenizer_codepoints\.cc)$') + else: + escaped_path = re.escape(compile_dirs.strip('/')) + pattern = re.compile( + rf'^gen/{escaped_path}/.*(\.h|inc|css_tokenizer_codepoints\.cc)$') + + for line in targets_proc.stdout: + # Ninja targets output format is "target: rule" + target = line.split(':')[0].strip() + if pattern.match(target): + targets.append(target) + + targets_proc.wait() + + if not targets: + logging.info('No generated targets to build for %s.', platform) + return + + logging.info('Total generated targets to build for %s: %d', platform, + len(targets)) + for t in targets: + logging.info('- %s', t) + + # Generate them in batches to avoid hitting command line length limits. The + # xargs -s option allows us to specify the maximum command line length. + # We use a fraction of the system's ARG_MAX limit, capped at 1MB, to be safe + # against environment variable size fluctuations. + arg_max = min(os.sysconf('SC_ARG_MAX') // 2, 1000000) + subprocess.run(['xargs', '-s', + str(arg_max), 'ninja', '-C', + str(out_dir)], + input='\n'.join(targets), + text=True, + check=True) + + +def run_rewrite_tool(platform, out_dir, project, scratch_dir): + """ + Runs the spanify tool and filters output for uniqueness using awk. + """ + compile_dirs = PROJECTS[project]['compile_dirs'] + tool_arg = PROJECTS[project]['tool_arg'] + + logging.info('Starting rewrite for %s...', platform) + + cmd = [ + 'tools/clang/scripts/run_tool.py', + '--tool', + 'spanify', + '--generate-compdb', + '-p', + str(out_dir), + ] + # Optional flags MUST be inserted before positional arguments + if platform == 'win': + cmd.append('--target_os=win') + if tool_arg: + cmd.append(f'--tool-arg={tool_arg}') + + cmd.extend([compile_dirs, f'path-filter={compile_dirs}']) + + out_path = scratch_dir / f'rewriter-{platform}.main.out' + err_path = scratch_dir / f'rewriter-{platform}.main.err' + + logging.info("Running: %s | awk '!x[$0]++' > %s", shlex.join(cmd), + out_path) + + with out_path.open('w') as out_f, err_path.open('w') as err_f: + # Run run_tool.py and pipe it to awk + proc1 = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stderr=err_f, + text=True) + proc2 = subprocess.Popen(['awk', '!x[$0]++'], + stdin=proc1.stdout, + stdout=out_f, + text=True) + + # Allow proc1 to receive SIGPIPE if awk exits early + assert proc1.stdout is not None + proc1.stdout.close() + + proc2.wait() + proc1.wait() + + if proc1.returncode != 0: + logging.warning( + 'Rewrite tool failed for %s with exit code %d. ' + 'Continuing with partial results.', platform, proc1.returncode) + + +def run_rewrite_phase(platforms, project): + """ + Prepares and runs the rewrite tool for all specified platforms. + """ + shutil.rmtree(SCRATCH_DIR, ignore_errors=True) + SCRATCH_DIR.mkdir(parents=True) + + for platform in platforms: + out_dir = get_out_dir(platform) + prepare_platform(platform, out_dir, project) + run_rewrite_tool(platform, out_dir, project, SCRATCH_DIR) + + +def apply_edits_phase(last_platform): + """ + Extracts edits from the rewrite tool output and applies them. + """ + SCRATCH_DIR.mkdir(parents=True, exist_ok=True) + logging.info('Applying edits...') + # Clear out stale patches from previous runs or tests. They will be + # recreated by apply_edits.py, but we want to make sure we don't have any + # leftover patches lying around from previous runs that could cause + # confusion. + for f in SCRATCH_DIR.glob('patch*'): + f.unlink() + + logging.info('Running: extract_edits.py | apply_edits.py') + + # Combine all rewrite outputs into one file first + all_edits = SCRATCH_DIR / 'all.main.out' + with all_edits.open('wb') as wfd: + # Use sorted to guarantee reproducible ordering across environments + for f in sorted(SCRATCH_DIR.glob('*.main.out')): + if f != all_edits: + with f.open('rb') as rfd: + shutil.copyfileobj(rfd, wfd) + + # Let the OS pipe them naturally + with all_edits.open('rb') as rfd: + extract_proc = subprocess.Popen( + ['tools/clang/spanify/extract_edits.py'], + stdin=rfd, + stdout=subprocess.PIPE) + + assert extract_proc.stdout is not None + apply_proc = subprocess.Popen([ + 'tools/clang/scripts/apply_edits.py', '-p', + str(get_out_dir(last_platform)), '.' + ], + stdin=extract_proc.stdout) + + # Allow extract to receive SIGPIPE if apply exits early + extract_proc.stdout.close() + apply_proc.communicate() + + if extract_proc.wait() != 0: + logging.warning('extract_edits.py failed with exit code %d.', + extract_proc.returncode) + if apply_proc.returncode != 0: + logging.warning('apply_edits.py failed with exit code %d.', + apply_proc.returncode) + + +def main(): + parser = argparse.ArgumentParser( + description='Multi-platform spanify tool.') + parser.add_argument('-p', + '--platforms', + nargs='+', + choices=PLATFORM_SPECIFIC_GN_ARGS.keys(), + default=['linux']) + parser.add_argument('-r', '--skip-rewrite', action='store_true') + parser.add_argument('-e', '--skip-extract-edits', action='store_true') + parser.add_argument('--project', choices=PROJECTS.keys(), default='chrome') + args = parser.parse_args() + + # Configure logging. + logging.basicConfig(level=logging.DEBUG, + format='[%(asctime)s %(levelname)s] %(message)s', + datefmt='%H:%M:%S') + + with build_and_manage_llvm(): + logging.info('Testing rewriter...') + run_command(['tools/clang/spanify/run_all_tests.py']) + + if not args.skip_rewrite: + run_rewrite_phase(args.platforms, args.project) + + if not args.skip_extract_edits: + apply_edits_phase(args.platforms[-1]) + + logging.info('Formatting...') + run_command(['git', 'cl', 'format']) + + +if __name__ == '__main__': + main()
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 45aedb0..7d0e33f 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -902,7 +902,7 @@ <variant name=".iOSLensSWYS" summary="iOS Lens Search What You See"/> <variant name=".LensOverlayTranslateButton" summary="Lens Overlay Translate Button"/> - <variant name=".PdfInk2" summary="PDF Ink Signatures"/> + <variant name=".PdfInk2" summary="PDF Ink Signatures (obsolete)"/> <variant name=".PdfSaveToDrive" summary="PDF Save to Drive"/> <variant name=".PerformanceInterventionUI" summary="Performance Intervention"/>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index dd3b927..220deca 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -9747,6 +9747,7 @@ <int value="-1594067749" label="TabStripIncognitoMigration:disabled"/> <int value="-1593946814" label="AccountReauthenticationRecentTimeWindow:enabled"/> + <int value="-1593218491" label="WebCryptoPQC:enabled"/> <int value="-1591974904" label="SafeBrowsingSeparateNetworkContexts:disabled"/> <int value="-1591450227" label="enable-microphone-mute-switch-device"/> @@ -11744,7 +11745,6 @@ <int value="-929944930" label="AutofillRationalizeRepeatedServerPredictions:disabled"/> <int value="-929290033" label="CrosSodaConchLanguages:disabled"/> - <int value="-928560908" label="EnableClickjackingProtection:enabled"/> <int value="-928138978" label="IPH_DemoMode:disabled"/> <int value="-926780551" label="AndroidZoomIndicator:enabled"/> <int value="-926422468" label="disable-embedded-shared-worker"/> @@ -14173,6 +14173,7 @@ <int value="-106039323" label="XplatSyncedSetup:disabled"/> <int value="-105400607" label="Glic:enabled"/> <int value="-104106119" label="WebViewJavaJsBridgeMojo:disabled"/> + <int value="-103592169" label="EnableInputProtection:enabled"/> <int value="-103131043" label="NtpOutlookCalendarModule:disabled"/> <int value="-102537270" label="extension-content-verification"/> <int value="-102387656" label="FillingAcrossAffiliatedWebsites:disabled"/> @@ -14381,6 +14382,7 @@ <int value="-34898620" label="RendererSideContentDecoding:disabled"/> <int value="-33771076" label="MemoryPurgeOnFreezeLimit:disabled"/> <int value="-33240310" label="AppShimNotificationAttribution:enabled"/> + <int value="-33052443" label="EnableInputProtection:disabled"/> <int value="-32712825" label="CrOSEnforceSystemAec:disabled"/> <int value="-32583212" label="AlwaysDrawCompositedToolbarHairline:disabled"/> <int value="-31484570" @@ -17041,6 +17043,7 @@ <int value="859913799" label="EnableDesksTrackpadSwipeImprovements:disabled"/> <int value="860336036" label="ChromeModernDesign:enabled"/> <int value="861351290" label="FontManagerEarlyInit:enabled"/> + <int value="861596248" label="BrowserLaunchMetadataReporting:enabled"/> <int value="861968979" label="EnableEncryptedAV1:enabled"/> <int value="862453793" label="TranslateUI2016Q2:enabled"/> <int value="863493664" label="LacrosMoveProfileMigration:disabled"/> @@ -19280,7 +19283,6 @@ <int value="1616938915" label="OmniboxUIExperimentWhiteBackgroundOnBlur:disabled"/> <int value="1617187093" label="enable-improved-a2hs"/> - <int value="1618142151" label="EnableClickjackingProtection:disabled"/> <int value="1618337673" label="IdbSqliteBackingStore:disabled"/> <int value="1618538021" label="FallbackToSWIfGLES3NotSupported:disabled"/> <int value="1618633341" label="MashOopViz:enabled"/> @@ -20213,6 +20215,7 @@ <int value="1920780354" label="CCTPageInsightsHubPeek:enabled"/> <int value="1920894670" label="OmniboxPreserveDefaultMatchAgainstAsyncUpdate:enabled"/> + <int value="1921387145" label="WebCryptoPQC:disabled"/> <int value="1921543515" label="ExoLockNotification:enabled"/> <int value="1921615454" label="DataSharingAndroidV2:disabled"/> <int value="1922609313" @@ -20741,6 +20744,7 @@ <int value="2098907258" label="UseSurfaceLayerForVideo:disabled"/> <int value="2099583779" label="DefaultLinkCapturingInBrowser:enabled"/> <int value="2099676690" label="CastStreamingPerformanceOverlay:disabled"/> + <int value="2099837693" label="BrowserLaunchMetadataReporting:disabled"/> <int value="2099866799" label="TrackByDefaultOnMobile:disabled"/> <int value="2100128918" label="LibAssistantV2:enabled"/> <int value="2100299982"
diff --git a/tools/metrics/histograms/histogram_paths.py b/tools/metrics/histograms/histogram_paths.py index 14ee985..aca2623 100755 --- a/tools/metrics/histograms/histogram_paths.py +++ b/tools/metrics/histograms/histogram_paths.py
@@ -40,8 +40,12 @@ _ENUMS_XML_RELATIVE = ([ 'tools/metrics/histograms/enums.xml', ] + _FindXmlFiles(_ENUMS_XML_FILE_NAMES)) +_VARIANTS_XML_RELATIVE = [ + 'tools/metrics/histograms/variants.xml', +] _HISTOGRAMS_XMLS_RELATIVE = _FindXmlFiles(_HISTOGRAM_XML_FILE_NAMES) -ALL_XMLS_RELATIVE = _ENUMS_XML_RELATIVE + _HISTOGRAMS_XMLS_RELATIVE +ALL_XMLS_RELATIVE = (_ENUMS_XML_RELATIVE + _VARIANTS_XML_RELATIVE + + _HISTOGRAMS_XMLS_RELATIVE) HISTOGRAMS_PREFIX_LIST = [ os.path.basename(os.path.dirname(f)) for f in _HISTOGRAMS_XMLS_RELATIVE
diff --git a/tools/metrics/histograms/histograms_xml_files.gni b/tools/metrics/histograms/histograms_xml_files.gni index e79f50c..762072f 100644 --- a/tools/metrics/histograms/histograms_xml_files.gni +++ b/tools/metrics/histograms/histograms_xml_files.gni
@@ -333,4 +333,5 @@ "//tools/metrics/histograms/metadata/windows/histograms.xml", "//tools/metrics/histograms/metadata/xr/enums.xml", "//tools/metrics/histograms/metadata/xr/histograms.xml", + "//tools/metrics/histograms/variants.xml", ]
diff --git a/tools/metrics/histograms/metadata/accessibility/enums.xml b/tools/metrics/histograms/metadata/accessibility/enums.xml index 51bf3fd..fc2f70e 100644 --- a/tools/metrics/histograms/metadata/accessibility/enums.xml +++ b/tools/metrics/histograms/metadata/accessibility/enums.xml
@@ -2304,6 +2304,23 @@ <!-- LINT.ThenChange(//chrome/browser/resources/side_panel/read_anything/shared/metrics_browser_proxy.ts:ReadAnythingNewPage) --> +<!-- LINT.IfChange(ReadAnythingOmniboxChipDecision) --> + +<enum name="ReadAnythingOmniboxChipDecision"> + <int value="0" label="Shown on an article"/> + <int value="1" label="Shown on a PDF"/> + <int value="2" label="Not shown on app window"/> + <int value="3" label="Not shown on non-http(s)"/> + <int value="4" label="Not shown on block-listed site"/> + <int value="5" label="Not shown because of optimization guide"/> + <int value="6" label="Not shown because of Readability signal"/> + <int value="7" label="Not shown on a short PDF"/> + <int value="8" + label="Not shown on a PDF with too many non-alphabetic characters"/> +</enum> + +<!-- LINT.ThenChange(//chrome/browser/ui/read_anything/read_anything_enums.h:ReadAnythingOmniboxChipDecision) --> + <!-- LINT.IfChange(ReadAnythingReadAloudSettingsChange) --> <enum name="ReadAnythingReadAloudSettingsChange">
diff --git a/tools/metrics/histograms/metadata/accessibility/histograms.xml b/tools/metrics/histograms/metadata/accessibility/histograms.xml index a59eaa67..e3f4b3f3 100644 --- a/tools/metrics/histograms/metadata/accessibility/histograms.xml +++ b/tools/metrics/histograms/metadata/accessibility/histograms.xml
@@ -3242,6 +3242,15 @@ </summary> </histogram> +<histogram name="Accessibility.ReadAnything.OmniboxChipDecision" + enum="ReadAnythingOmniboxChipDecision" expires_after="2026-12-01"> + <owner>kristislee@google.com</owner> + <owner>komo-eng@google.com</owner> + <summary> + Records the decision to show or hide the Reading mode omnibox chip and why. + </summary> +</histogram> + <histogram name="Accessibility.ReadAnything.OmniboxIconShown" enum="BooleanShown" expires_after="2026-06-01"> <owner>abigailbklein@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/autofill/enums.xml b/tools/metrics/histograms/metadata/autofill/enums.xml index 53fe32e0..13a41ad 100644 --- a/tools/metrics/histograms/metadata/autofill/enums.xml +++ b/tools/metrics/histograms/metadata/autofill/enums.xml
@@ -2841,6 +2841,14 @@ <int value="6" label="Client-side timeout"/> </enum> +<enum name="AutofillIbanFormEvent"> + <int value="0" label="Suggestions shown (once)"/> + <int value="1" label="Local IBAN suggestion filled (once)"/> + <int value="2" label="Server IBAN suggestion selected (once)"/> + <int value="3" label="Server IBAN suggestion filled (once)"/> + <int value="4" label="IBAN form submitted after filling a suggestion (once)"/> +</enum> + <enum name="AutofillInDevtoolsAvailableTestAddressesCountries"> <int value="0" label="United States test address selected"/> <int value="1" label="Brazil test address selected"/>
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml index 6241a7c..f5204a57 100644 --- a/tools/metrics/histograms/metadata/autofill/histograms.xml +++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -4242,6 +4242,20 @@ <token key="CardBenefitSource" variants="Autofill.CreditCardBenefitSource"/> </histogram> +<histogram name="Autofill.FormEvents.Iban" enum="AutofillIbanFormEvent" + expires_after="2026-08-02"> + <owner>qihuizhao@google.com</owner> + <owner>payments-autofill-team@google.com</owner> + <summary> + This histogram logs form events related to IBAN suggestions being shown, + selected, filled, and submitted on IBAN forms. Note that logging is + happening to the initial occurrence per page load. Specifically, if a user + interacts with multiple IBAN forms or triggers multiple suggestions (e.g., + switching from a local to a server-based IBAN), only the first sequence of + events is recorded. + </summary> +</histogram> + <histogram name="Autofill.FormEvents.{AddressFormType}" enum="AutofillFormEvent" expires_after="2026-12-12"> <owner>battre@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/blink/enums.xml b/tools/metrics/histograms/metadata/blink/enums.xml index 13f1f31..9c0d91f 100644 --- a/tools/metrics/histograms/metadata/blink/enums.xml +++ b/tools/metrics/histograms/metadata/blink/enums.xml
@@ -6480,6 +6480,8 @@ <int value="5839" label="XRMeshDetection"/> <int value="5840" label="XRFrameDetectedMeshes"/> <int value="5841" label="CSSLightDarkImage"/> + <int value="5842" label="CSSTimelineLookupFoundNothing"/> + <int value="5843" label="CSSTimelineScopeAttachedMultiple"/> </enum> <!-- LINT.ThenChange(//third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom:WebFeature) -->
diff --git a/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml b/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml index 4dbf99b..4deb69b9 100644 --- a/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml +++ b/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
@@ -489,7 +489,7 @@ </histogram> <histogram name="ChromeOS.Settings.Keyboard.Modifiers.Hash" units="hash" - expires_after="2026-03-22"> + expires_after="2026-09-22"> <owner>jimmyxgong@chromium.org</owner> <owner>cros-device-enablement@google.com</owner> <summary> @@ -502,7 +502,7 @@ <histogram name="ChromeOS.Settings.Keyboard.Modifiers.{Modifier}RemappedTo.Changed" - enum="KeyboardModifierRemappingKeys" expires_after="2026-03-22"> + enum="KeyboardModifierRemappingKeys" expires_after="2026-09-22"> <owner>jimmyxgong@chromium.org</owner> <owner>cros-device-enablement@google.com</owner> <summary> @@ -524,7 +524,7 @@ <histogram name="ChromeOS.Settings.Keyboard.Modifiers.{Modifier}RemappedTo.Started" - enum="KeyboardModifierRemappingKeys" expires_after="2026-03-22"> + enum="KeyboardModifierRemappingKeys" expires_after="2026-09-22"> <owner>jimmyxgong@chromium.org</owner> <owner>cros-device-enablement@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/critical_user_journeys/enums.xml b/tools/metrics/histograms/metadata/critical_user_journeys/enums.xml index 2b83e20..d95a173 100644 --- a/tools/metrics/histograms/metadata/critical_user_journeys/enums.xml +++ b/tools/metrics/histograms/metadata/critical_user_journeys/enums.xml
@@ -10,14 +10,6 @@ <histogram-configuration> -<enums> - -<enum name="CriticalUserJourneyTestJourneySteps"> - <int value="1" label="Step 1 Reached"/> - <int value="2" label="Step 2 Reached"/> - <int value="3" label="Alternative Step Reached"/> -</enum> - -</enums> +<enums/> </histogram-configuration>
diff --git a/tools/metrics/histograms/metadata/critical_user_journeys/histograms.xml b/tools/metrics/histograms/metadata/critical_user_journeys/histograms.xml index 64115aa..d216a745 100644 --- a/tools/metrics/histograms/metadata/critical_user_journeys/histograms.xml +++ b/tools/metrics/histograms/metadata/critical_user_journeys/histograms.xml
@@ -23,7 +23,7 @@ <histograms> <histogram name="CriticalUserJourney.{JourneyName}.AbortedAtStep" - enum="CriticalUserJourneyTestJourneySteps" expires_after="2027-01-01"> + units="Step ID" expires_after="2027-01-01"> <owner>dljames@chromium.org</owner> <owner>top-chrome-desktop-ui@google.com</owner> <summary> @@ -48,8 +48,8 @@ </token> </histogram> -<histogram name="CriticalUserJourney.{JourneyName}.StepReached" - enum="CriticalUserJourneyTestJourneySteps" expires_after="2027-01-01"> +<histogram name="CriticalUserJourney.{JourneyName}.StepReached" units="Step ID" + expires_after="2027-01-01"> <owner>dljames@chromium.org</owner> <owner>top-chrome-desktop-ui@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/enterprise/histograms.xml b/tools/metrics/histograms/metadata/enterprise/histograms.xml index ccb002bdc..92621bfe 100644 --- a/tools/metrics/histograms/metadata/enterprise/histograms.xml +++ b/tools/metrics/histograms/metadata/enterprise/histograms.xml
@@ -191,6 +191,7 @@ <variant name="PasswordBreach" summary="Password breach events"/> <variant name="PasswordChanged" summary="Password changed events"/> <variant name="PasswordReuse" summary="Password reuse events"/> + <variant name="SaasUsage" summary="Saas usage report events"/> <variant name="SensitiveData" summary="Sensitive data events"/> <variant name="Unknown" summary="Unknown/uncategorized events"/> <variant name="UnscannedFile" summary="Unscanned file events"/>
diff --git a/tools/metrics/histograms/metadata/glic/enums.xml b/tools/metrics/histograms/metadata/glic/enums.xml index 67f950d..ce578e5e 100644 --- a/tools/metrics/histograms/metadata/glic/enums.xml +++ b/tools/metrics/histograms/metadata/glic/enums.xml
@@ -412,6 +412,7 @@ <int value="90" label="OnMicrophoneStatusChange"/> <int value="91" label="RecordSkillsWebClientEvent"/> <int value="92" label="DeleteCapturedRegion"/> + <int value="93" label="OnActionSubmitted"/> </enum> <!-- LINT.ThenChange(//chrome/browser/resources/glic/glic_api_impl/request_types.ts:ApiRequestType) -->
diff --git a/tools/metrics/histograms/metadata/glic/histograms.xml b/tools/metrics/histograms/metadata/glic/histograms.xml index 2478c30c..12b64b3 100644 --- a/tools/metrics/histograms/metadata/glic/histograms.xml +++ b/tools/metrics/histograms/metadata/glic/histograms.xml
@@ -218,6 +218,7 @@ <variant name="LogEndAsyncEvent"/> <variant name="LogInstantEvent"/> <variant name="MaybeRefreshUserStatus"/> + <variant name="OnActionSubmitted"/> <variant name="OnClosedCaptionsShown"/> <variant name="OnContextUploadCompleted"/> <variant name="OnContextUploadStarted"/> @@ -2508,6 +2509,56 @@ </summary> </histogram> +<histogram name="Glic.Turn.Actuation.IsRetry" enum="Boolean" + expires_after="2026-10-16"> + <owner>qinmin@google.com</owner> + <owner>perrier@google.com</owner> + <summary> + Records whether a browser actuation result submitted by the web client is a + retry of a previous actuation in the same turn. Recorded for each actuation + result submitted. + </summary> +</histogram> + +<histogram name="Glic.Turn.Actuation.ResponseStartTime" units="ms" + expires_after="2026-10-16"> + <owner>birnie@google.com</owner> + <owner>perrier@google.com</owner> + <summary> + Records the time from when the web client sends a browser actuation result + over the network until a response starts being presented to the user. + Recorded for each turn in a Glic instance where an actuation result was + submitted. + </summary> +</histogram> + +<histogram name="Glic.Turn.Actuation.ResponseStopTime" units="ms" + expires_after="2026-10-16"> + <owner>qinmin@google.com</owner> + <owner>perrier@google.com</owner> + <summary> + Measures the time from when the web client sends a browser actuation result + until a response stops. Recorded for each turn where an actuation result was + submitted. + </summary> +</histogram> + +<histogram name="Glic.Turn.Actuation.ResponseStopTime.{Cause}" units="ms" + expires_after="2026-10-16"> + <owner>qinmin@google.com</owner> + <owner>perrier@google.com</owner> + <summary> + Measures the time from when the web client sends a browser actuation result + until a response stops for the specific cause: {Cause}. Recorded for each + turn where an actuation result was submitted. + </summary> + <token key="Cause"> + <variant name="ByUser"/> + <variant name="Other"/> + <variant name="UnknownCause"/> + </token> +</histogram> + <histogram name="Glic.Turn.Duration.{Model}" units="ms" expires_after="2026-10-16"> <owner>birnie@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml index 2a10124..381412857 100644 --- a/tools/metrics/histograms/metadata/ios/histograms.xml +++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -1314,7 +1314,7 @@ </histogram> <histogram name="IOS.DefaultBrowserPromo.GenericPromoDisplayCount" - units="count" expires_after="2026-08-16"> + units="count" expires_after="2026-10-16"> <owner>gayane@google.com</owner> <owner>bling-mony-pod@google.com</owner> <summary> @@ -1325,7 +1325,7 @@ </histogram> <histogram name="IOS.DefaultBrowserPromo.NonModal.OnScreenTime" units="ms" - expires_after="2026-08-23"> + expires_after="2026-10-16"> <owner>rkgibson@google.com</owner> <owner>bling-mony-pod@google.com</owner> <summary> @@ -1334,8 +1334,8 @@ </histogram> <histogram name="IOS.DefaultBrowserPromo.NonModal.{Impression}" - enum="IOSDefaultBrowserPromoNonModalAction" expires_after="2026-08-23"> - <owner>sebsg@chromium.org</owner> + enum="IOSDefaultBrowserPromoNonModalAction" expires_after="2026-10-16"> + <owner>pabouchard@google.com</owner> <owner>bling-mony-pod@google.com</owner> <summary> Logged when an action happens on the {Impression} impression of a non modal @@ -1356,7 +1356,7 @@ </histogram> <histogram name="IOS.DefaultBrowserPromo.NonModal.{PromoType}" - enum="IOSDefaultBrowserPromoNonModalAction" expires_after="2026-08-23"> + enum="IOSDefaultBrowserPromoNonModalAction" expires_after="2026-10-16"> <owner>sebsg@chromium.org</owner> <owner>bling-mony-pod@google.com</owner> <summary> @@ -1371,8 +1371,8 @@ </histogram> <histogram name="IOS.DefaultBrowserPromo.SetUpList.Action" - enum="IOSDefaultBrowserFullscreenPromoAction" expires_after="2026-07-26"> - <owner>sebsg@chromium.org</owner> + enum="IOSDefaultBrowserFullscreenPromoAction" expires_after="2026-10-16"> + <owner>pabouchard@google.com</owner> <owner>scottyoder@google.com</owner> <owner>bling-pandamonium@google.com</owner> <owner>bling-mony-pod@google.com</owner> @@ -1383,15 +1383,17 @@ </histogram> <histogram name="IOS.DefaultBrowserPromo.Shown" - enum="IOSDefaultBrowserPromoType" expires_after="2026-08-23"> - <owner>gayane@chromium.org</owner> + enum="IOSDefaultBrowserPromoType" expires_after="2026-10-16"> + <owner>gujen@google.com</owner> + <owner>rkgibson@google.com</owner> <owner>bling-mony-pod@google.com</owner> <summary>The default browser promo type shown to the user.</summary> </histogram> <histogram name="IOS.DefaultBrowserPromo.TailoredPromoDisplayCount" - units="count" expires_after="2026-08-23"> + units="count" expires_after="2026-10-16"> <owner>gayane@google.com</owner> + <owner>gujen@google.com</owner> <owner>bling-mony-pod@google.com</owner> <summary> Represents number of tailored default browser promos displayed to the user.
diff --git a/tools/metrics/histograms/metadata/oobe/histograms.xml b/tools/metrics/histograms/metadata/oobe/histograms.xml index d3c19e2..f2bb221 100644 --- a/tools/metrics/histograms/metadata/oobe/histograms.xml +++ b/tools/metrics/histograms/metadata/oobe/histograms.xml
@@ -80,7 +80,6 @@ <variant name="Quick-start"/> <variant name="Recommend-apps"/> <variant name="Recovery-check"/> - <variant name="Remove-local-auth-factors"/> <variant name="Reset"/> <variant name="Saml-confirm-password"/> <variant name="Signin-fatal-error"/> @@ -428,8 +427,6 @@ <variant name="Recommend-apps.Selected"/> <variant name="Recommend-apps.Skipped"/> <variant name="Recovery-check.Proceed"/> - <variant name="Remove-local-auth-factors.Error"/> - <variant name="Remove-local-auth-factors.Success"/> <variant name="Reset.Cancel"/> <variant name="Saml-confirm-password.Cancel"/> <variant name="Saml-confirm-password.NotApplicable"/>
diff --git a/tools/metrics/histograms/metadata/profile/histograms.xml b/tools/metrics/histograms/metadata/profile/histograms.xml index 69032dd9..3ca8a1bb 100644 --- a/tools/metrics/histograms/metadata/profile/histograms.xml +++ b/tools/metrics/histograms/metadata/profile/histograms.xml
@@ -32,37 +32,6 @@ <!-- LINT.ThenChange(//components/profile_metrics/counts.cc:ProfileActivityThreshold) --> -<!-- LINT.IfChange(ProfileIndexProfile) --> - -<variants name="ProfileIndexProfile"> - <variant name="" summary="Metric aggregated across all Profiles"/> - <variant name=".Profile0" summary="Metric recorded for Profile 0"/> - <variant name=".Profile1" summary="Metric recorded for Profile 1"/> - <variant name=".Profile2" summary="Metric recorded for Profile 2"/> - <variant name=".Profile3" summary="Metric recorded for Profile 3"/> - <variant name=".Profile4" summary="Metric recorded for Profile 4"/> - <variant name=".Profile5" summary="Metric recorded for Profile 5"/> - <variant name=".Profile6" summary="Metric recorded for Profile 6"/> - <variant name=".Profile7" summary="Metric recorded for Profile 7"/> - <variant name=".Profile8" summary="Metric recorded for Profile 8"/> - <variant name=".Profile9" summary="Metric recorded for Profile 9"/> - <variant name=".Profile10" summary="Metric recorded for Profile 10"/> - <variant name=".Profile11" summary="Metric recorded for Profile 11"/> - <variant name=".Profile12" summary="Metric recorded for Profile 12"/> - <variant name=".Profile13" summary="Metric recorded for Profile 13"/> - <variant name=".Profile14" summary="Metric recorded for Profile 14"/> - <variant name=".Profile15" summary="Metric recorded for Profile 15"/> - <variant name=".Profile16" summary="Metric recorded for Profile 16"/> - <variant name=".Profile17" summary="Metric recorded for Profile 17"/> - <variant name=".Profile18" summary="Metric recorded for Profile 18"/> - <variant name=".Profile19" summary="Metric recorded for Profile 19"/> - <variant name=".Profile20Plus" - summary="Combined metric recorded for all Profiles with an index above - 20"/> -</variants> - -<!-- LINT.ThenChange(//components/metrics/profile_metrics_service.cc:histogram_suffix) --> - <variants name="ProfilePickerFlowType"> <variant name="FREFlow" summary="Recorded for the FRE flow."/> <variant name="GlicFlow" summary="Recorded for the Glic flow."/>
diff --git a/tools/metrics/histograms/metadata/search/histograms.xml b/tools/metrics/histograms/metadata/search/histograms.xml index c46db87..ac541a1f 100644 --- a/tools/metrics/histograms/metadata/search/histograms.xml +++ b/tools/metrics/histograms/metadata/search/histograms.xml
@@ -64,37 +64,6 @@ <variant name="ThirdPartyLauncher" summary="Third party launcher app"/> </variants> -<!-- LINT.IfChange(ProfileIndexSearch) --> - -<variants name="ProfileIndexSearch"> - <variant name="" summary="Metric aggregated across all Profiles"/> - <variant name=".Profile0" summary="Metric recorded for Profile 0"/> - <variant name=".Profile1" summary="Metric recorded for Profile 1"/> - <variant name=".Profile2" summary="Metric recorded for Profile 2"/> - <variant name=".Profile3" summary="Metric recorded for Profile 3"/> - <variant name=".Profile4" summary="Metric recorded for Profile 4"/> - <variant name=".Profile5" summary="Metric recorded for Profile 5"/> - <variant name=".Profile6" summary="Metric recorded for Profile 6"/> - <variant name=".Profile7" summary="Metric recorded for Profile 7"/> - <variant name=".Profile8" summary="Metric recorded for Profile 8"/> - <variant name=".Profile9" summary="Metric recorded for Profile 9"/> - <variant name=".Profile10" summary="Metric recorded for Profile 10"/> - <variant name=".Profile11" summary="Metric recorded for Profile 11"/> - <variant name=".Profile12" summary="Metric recorded for Profile 12"/> - <variant name=".Profile13" summary="Metric recorded for Profile 13"/> - <variant name=".Profile14" summary="Metric recorded for Profile 14"/> - <variant name=".Profile15" summary="Metric recorded for Profile 15"/> - <variant name=".Profile16" summary="Metric recorded for Profile 16"/> - <variant name=".Profile17" summary="Metric recorded for Profile 17"/> - <variant name=".Profile18" summary="Metric recorded for Profile 18"/> - <variant name=".Profile19" summary="Metric recorded for Profile 19"/> - <variant name=".Profile20Plus" - summary="Combined metric recorded for all Profiles with an index above - 20"/> -</variants> - -<!-- LINT.ThenChange(//components/metrics/profile_metrics_service.cc:histogram_suffix) --> - <variants name="SearchEnginePromoDeviceAndOrdering"> <variant name=""/> <variant name=".First.ExistingDevice"/> @@ -554,7 +523,7 @@ {Profile} </summary> <token key="Context" variants="ChoiceScreenContext"/> - <token key="Profile" variants="ProfileIndexSearch"/> + <token key="Profile" variants="ProfileIndex"/> </histogram> <histogram name="Search.ChoiceScreenNavigationConditions{Context}"
diff --git a/tools/metrics/histograms/metadata/signin/histograms.xml b/tools/metrics/histograms/metadata/signin/histograms.xml index 967a6b0..b4d1e23 100644 --- a/tools/metrics/histograms/metadata/signin/histograms.xml +++ b/tools/metrics/histograms/metadata/signin/histograms.xml
@@ -96,37 +96,6 @@ <!-- LINT.ThenChange(//chrome/browser/signin/bound_session_credentials/bound_session_refresh_cookie_fetcher_impl.cc:GetRotationHistogramTriggerSuffix) --> -<!-- LINT.IfChange(ProfileIndexSignin) --> - -<variants name="ProfileIndexSignin"> - <variant name="" summary="Metric aggregated across all Profiles"/> - <variant name=".Profile0" summary="Metric recorded for Profile 0"/> - <variant name=".Profile1" summary="Metric recorded for Profile 1"/> - <variant name=".Profile2" summary="Metric recorded for Profile 2"/> - <variant name=".Profile3" summary="Metric recorded for Profile 3"/> - <variant name=".Profile4" summary="Metric recorded for Profile 4"/> - <variant name=".Profile5" summary="Metric recorded for Profile 5"/> - <variant name=".Profile6" summary="Metric recorded for Profile 6"/> - <variant name=".Profile7" summary="Metric recorded for Profile 7"/> - <variant name=".Profile8" summary="Metric recorded for Profile 8"/> - <variant name=".Profile9" summary="Metric recorded for Profile 9"/> - <variant name=".Profile10" summary="Metric recorded for Profile 10"/> - <variant name=".Profile11" summary="Metric recorded for Profile 11"/> - <variant name=".Profile12" summary="Metric recorded for Profile 12"/> - <variant name=".Profile13" summary="Metric recorded for Profile 13"/> - <variant name=".Profile14" summary="Metric recorded for Profile 14"/> - <variant name=".Profile15" summary="Metric recorded for Profile 15"/> - <variant name=".Profile16" summary="Metric recorded for Profile 16"/> - <variant name=".Profile17" summary="Metric recorded for Profile 17"/> - <variant name=".Profile18" summary="Metric recorded for Profile 18"/> - <variant name=".Profile19" summary="Metric recorded for Profile 19"/> - <variant name=".Profile20Plus" - summary="Combined metric recorded for all Profiles with an index above - 20"/> -</variants> - -<!-- LINT.ThenChange(//components/metrics/profile_metrics_service.cc:histogram_suffix) --> - <!-- LINT.IfChange(ReauthFlowEvent) --> <variants name="ReauthFlowEvent"> @@ -3092,7 +3061,7 @@ {Profile} </summary> - <token key="Profile" variants="ProfileIndexSignin"/> + <token key="Profile" variants="ProfileIndex"/> </histogram> <histogram name="Signin.SignIn.Offered{AccountState}" enum="SigninAccessPoint" @@ -3374,7 +3343,7 @@ {Profile} </summary> - <token key="Profile" variants="ProfileIndexSignin"/> + <token key="Profile" variants="ProfileIndex"/> </histogram> <histogram name="Signin.SignInPromo.{UserAction}" enum="SigninAccessPoint" @@ -3435,7 +3404,7 @@ {Profile} </summary> - <token key="Profile" variants="ProfileIndexSignin"/> + <token key="Profile" variants="ProfileIndex"/> </histogram> <histogram name="Signin.SignoutAndClearDataFromManagedAccount" @@ -3623,7 +3592,7 @@ {Profile} </summary> - <token key="Profile" variants="ProfileIndexSignin"/> + <token key="Profile" variants="ProfileIndex"/> </histogram> <histogram name="Signin.SyncOptIn.IdentityPill.SyncAtShowCount" @@ -3716,7 +3685,7 @@ {Profile} </summary> - <token key="Profile" variants="ProfileIndexSignin"/> + <token key="Profile" variants="ProfileIndex"/> </histogram> <histogram name="Signin.Timestamps.Android.Fullscreen.{Event}" units="ms"
diff --git a/tools/metrics/histograms/metadata/user_education/histograms.xml b/tools/metrics/histograms/metadata/user_education/histograms.xml index c79cb4a..b23d0039 100644 --- a/tools/metrics/histograms/metadata/user_education/histograms.xml +++ b/tools/metrics/histograms/metadata/user_education/histograms.xml
@@ -132,7 +132,8 @@ summary="the module for Lens Overlay Full Page Translate"/> <variant name="Mobilepasswords" summary="the module for getting passwords on mobile"/> - <variant name="PdfInk2" summary="the module for PDF Ink Signatures"/> + <variant name="PdfInk2" + summary="the module for PDF Ink Signatures (obsolete)"/> <variant name="PdfSaveToDrive" summary="the module for PDF Save to Drive"/> <variant name="PerformanceInterventionUI" summary="the module for Performance Intervention"/>
diff --git a/tools/metrics/histograms/metadata/windows/histograms.xml b/tools/metrics/histograms/metadata/windows/histograms.xml index 515f035..c30f4092 100644 --- a/tools/metrics/histograms/metadata/windows/histograms.xml +++ b/tools/metrics/histograms/metadata/windows/histograms.xml
@@ -167,17 +167,6 @@ </summary> </histogram> -<histogram name="Windows.HighResolutionTimerUsage" units="%" - expires_after="2026-02-22"> - <owner>olivierli@chromium.org</owner> - <owner>catan-team@chromium.org</owner> - <summary> - Percentage of elapsed time the high resolution timer is activated. The usage - is reported by each of Chrome processes individually (without aggregation) - and logged every 10 minutes. - </summary> -</histogram> - <histogram name="Windows.HypervPresent" enum="BooleanEnabled" expires_after="2025-06-01"> <owner>rkc@chromium.org</owner>
diff --git a/tools/metrics/histograms/validate_format.py b/tools/metrics/histograms/validate_format.py index 568f913b..706d2912 100755 --- a/tools/metrics/histograms/validate_format.py +++ b/tools/metrics/histograms/validate_format.py
@@ -69,29 +69,52 @@ return has_errors +def _IsGlobalVariantFile(path: str) -> bool: + return path.endswith( + os.path.join('tools', 'metrics', 'histograms', 'variants.xml')) + + def _CheckVariantsRegistered(xml_paths: List[str]) -> bool: """Checks that all tokens within histograms are registered. - All tokens within histograms should be registered as tokens in the same file - either inline (as a <token> node) or out of line (as a <variants> node). + Tokens within histograms should be registered as tokens either inline + (as a <token> node) or out of line (as a <variants> node) in the file where + it is used, or in the global `variants.xml` file. Args: xml_paths: A list of paths to the xml files to validate. """ has_errors = False + + global_variants = {} for path in xml_paths: + if _IsGlobalVariantFile(path): + tree = xml.dom.minidom.parse(path) + variants, variants_errors = extract_histograms.ExtractVariantsFromXmlTree( + tree) + has_errors = has_errors or bool(variants_errors) + global_variants.update(variants) + break + + for path in xml_paths: + if _IsGlobalVariantFile(path): + continue + tree = xml.dom.minidom.parse(path) variants, variants_errors = extract_histograms.ExtractVariantsFromXmlTree( tree) has_errors = has_errors or bool(variants_errors) + merged_variants = dict(variants) + merged_variants.update(global_variants) + for histogram in xml_utils.IterElementsWithTag(tree, 'histogram', depth=3): tokens, tokens_errors = extract_histograms.ExtractTokens( - histogram, variants) + histogram, merged_variants) has_errors = has_errors or bool(tokens_errors) token_keys = [token['key'] for token in tokens] - token_keys.extend(variants.keys()) + token_keys.extend(merged_variants.keys()) histogram_name = histogram.getAttribute('name')
diff --git a/tools/metrics/histograms/validate_token.py b/tools/metrics/histograms/validate_token.py index e5380d4..3ebc17d 100755 --- a/tools/metrics/histograms/validate_token.py +++ b/tools/metrics/histograms/validate_token.py
@@ -14,6 +14,19 @@ import chromium_src.tools.metrics.common.xml_utils as xml_utils +def _LoadGlobalVariants() -> list[str]: + """Loads the global variants from `variants.xml`, if it exists.""" + global_variants_list: list[str] = [] + global_variants_path: str = os.path.join( + os.path.dirname(os.path.abspath(__file__)), 'variants.xml') + if os.path.exists(global_variants_path): + global_tree: xml.dom.minidom.Document = xml.dom.minidom.parse( + global_variants_path) + for node in xml_utils.IterElementsWithTag(global_tree, 'variants', 3): + global_variants_name: str = node.getAttribute('name') + global_variants_list.append(global_variants_name) + return global_variants_list + def ValidateTokenInFile(xml_path: str) -> bool: """Validates that all <token> uses <variants> defined in the file. @@ -22,7 +35,7 @@ Returns: A boolean that is True if at least a histogram uses a <variants> not - defined in the file, False otherwise. + defined in the file or in the global variants.xml file, False otherwise. """ has_token_error: bool = False tree: xml.dom.minidom.Document = xml.dom.minidom.parse(xml_path) @@ -32,12 +45,19 @@ variants_name: str = node.getAttribute('name') variants.append(variants_name) + # `global_variants` is loaded lazily when needed - if variant tokens are not + # found in the histogram file where they are being used. + global_variants: list[str] | None = None for histogram in xml_utils.IterElementsWithTag(tree, 'histogram', 3): erroneous_tokens: list[str] = [] for node in xml_utils.IterElementsWithTag(histogram, 'token', 1): if node.hasAttribute('variants'): - if node.getAttribute('variants') not in variants: - erroneous_tokens.append(node.getAttribute('key')) + node_variant: str = node.getAttribute('variants') + if node_variant not in variants: + if global_variants is None: + global_variants = _LoadGlobalVariants() + if node_variant not in global_variants: + erroneous_tokens.append(node.getAttribute('key')) if erroneous_tokens: histogram_name: str = histogram.getAttribute('name') logging.error(
diff --git a/tools/metrics/histograms/variants.xml b/tools/metrics/histograms/variants.xml new file mode 100644 index 0000000..014475f --- /dev/null +++ b/tools/metrics/histograms/variants.xml
@@ -0,0 +1,40 @@ +<!-- +Copyright 2026 The Chromium Authors +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. +--> + +<histogram-configuration> + +<!-- LINT.IfChange(ProfileIndex) --> + +<variants name="ProfileIndex"> + <variant name="" summary="Metric aggregated across all Profiles"/> + <variant name=".Profile0" summary="Metric recorded for Profile 0"/> + <variant name=".Profile1" summary="Metric recorded for Profile 1"/> + <variant name=".Profile2" summary="Metric recorded for Profile 2"/> + <variant name=".Profile3" summary="Metric recorded for Profile 3"/> + <variant name=".Profile4" summary="Metric recorded for Profile 4"/> + <variant name=".Profile5" summary="Metric recorded for Profile 5"/> + <variant name=".Profile6" summary="Metric recorded for Profile 6"/> + <variant name=".Profile7" summary="Metric recorded for Profile 7"/> + <variant name=".Profile8" summary="Metric recorded for Profile 8"/> + <variant name=".Profile9" summary="Metric recorded for Profile 9"/> + <variant name=".Profile10" summary="Metric recorded for Profile 10"/> + <variant name=".Profile11" summary="Metric recorded for Profile 11"/> + <variant name=".Profile12" summary="Metric recorded for Profile 12"/> + <variant name=".Profile13" summary="Metric recorded for Profile 13"/> + <variant name=".Profile14" summary="Metric recorded for Profile 14"/> + <variant name=".Profile15" summary="Metric recorded for Profile 15"/> + <variant name=".Profile16" summary="Metric recorded for Profile 16"/> + <variant name=".Profile17" summary="Metric recorded for Profile 17"/> + <variant name=".Profile18" summary="Metric recorded for Profile 18"/> + <variant name=".Profile19" summary="Metric recorded for Profile 19"/> + <variant name=".Profile20Plus" + summary="Combined metric recorded for all Profiles with an index above + 20"/> +</variants> + +<!-- LINT.ThenChange(//components/metrics/profile_metrics_service.cc:histogram_suffix) --> + +</histogram-configuration>
diff --git a/tools/traffic_annotation/safe_list.txt b/tools/traffic_annotation/safe_list.txt index ce23207..e4e2161 100644 --- a/tools/traffic_annotation/safe_list.txt +++ b/tools/traffic_annotation/safe_list.txt
@@ -56,6 +56,9 @@ # annotation or by removing the code). b/485217840 missing,components/gapis/token_downloader.cc +# TODO(crbug.com/494582740): Remove this once the traffic annotation is added. +missing,components/accessibility_annotator/core/annotation_reducer/one_p_resolver_impl.cc + # Android annotations missing fields internal::contact:email, user_data::type, last_reviewed missing_new_fields,missing,android_webview/browser/network_service/aw_proxy_config_monitor.cc missing_new_fields,missing,chrome/android/java/src/org/chromium/chrome/browser/download/OMADownloadHandler.java
diff --git a/ui/android/window_android.cc b/ui/android/window_android.cc index d13a578d..93eaf52 100644 --- a/ui/android/window_android.cc +++ b/ui/android/window_android.cc
@@ -122,7 +122,7 @@ std::unique_ptr<WindowAndroid::ScopedWindowAndroidForTesting> WindowAndroid::CreateForTesting() { JNIEnv* env = AttachCurrentThread(); - long native_pointer = JWindowAndroidJni::createForTesting(env); + long native_pointer = WindowAndroidJni::createForTesting(env); return std::make_unique<ScopedWindowAndroidForTesting>( reinterpret_cast<WindowAndroid*>(native_pointer)); }
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb b/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb index 9729802..87bfef6 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb
@@ -471,6 +471,7 @@ <translation id="4788401404269709922"><ph name="NUMBER_OF_KB" /> KB</translation> <translation id="4789067489790477934">Conceda autorização ao Parallels Desktop para aceder a ficheiros no seu Google Drive. As alterações serão sincronizadas com os seus outros dispositivos.</translation> <translation id="4790766916287588578">Hindi com teclado InScript</translation> +<translation id="4798645114741131062">O seu dispositivo com ChromeOS Flex vai deixar de receber atualizações em breve. Pondere mudar para um dispositivo com ChromeOS.</translation> <translation id="4801956050125744859">Manter ambas</translation> <translation id="4802185962157240723">Húngaro</translation> <translation id="4804827417948292437">Abacate</translation> @@ -620,6 +621,7 @@ <translation id="5819442873484330149">Hangul 3 Set (final)</translation> <translation id="5832976493438355584">Bloqueado</translation> <translation id="5833610766403489739">Este ficheiro está perdido algures. Verifique a definição da sua localização de transferências e tente novamente.</translation> +<translation id="5833859326857395309">Atualização final</translation> <translation id="5838451609423551646">Removeu todas as entradas da seleção.</translation> <translation id="5845721951356578987">Enfermeiro</translation> <translation id="5858478190805449225">Modo de Poupança de bateria ativado. Tente novamente quando o modo de Poupança de bateria estiver desativado.</translation>
diff --git a/ui/display/mac/ca_display_link_mac.mm b/ui/display/mac/ca_display_link_mac.mm index 51b1130c..96d8524a 100644 --- a/ui/display/mac/ca_display_link_mac.mm +++ b/ui/display/mac/ca_display_link_mac.mm
@@ -77,7 +77,7 @@ }; void CADisplayLinkMac::Step() { - TRACE_EVENT0("ui", "CADisplayLinkCallback"); + TRACE_EVENT0("gpu", "CADisplayLinkCallback"); if (@available(macos 14.0, *)) { if (!vsync_callback_) {
diff --git a/ui/display/mac/cv_display_link_mac.mm b/ui/display/mac/cv_display_link_mac.mm index b5186621..3ab5d04 100644 --- a/ui/display/mac/cv_display_link_mac.mm +++ b/ui/display/mac/cv_display_link_mac.mm
@@ -95,7 +95,7 @@ CVOptionFlags* flags_out, void* context) { // This function is called on the system display link thread. - TRACE_EVENT0("ui", "DisplayLinkCallback"); + TRACE_EVENT0("gpu", "CVDisplayLinkCallback"); // Convert the time parameters to our VSync parameters. VSyncParamsMac params;
diff --git a/ui/display/mac/vsync_provider_mac.cc b/ui/display/mac/vsync_provider_mac.cc index 6da8185f..4ec862c 100644 --- a/ui/display/mac/vsync_provider_mac.cc +++ b/ui/display/mac/vsync_provider_mac.cc
@@ -6,6 +6,7 @@ #include "base/logging.h" #include "base/task/bind_post_task.h" +#include "base/trace_event/trace_event.h" namespace ui { @@ -109,6 +110,7 @@ void VSyncProviderMac::OnVSync(const VSyncParamsMac& params, int64_t display_id) { DCHECK_CALLED_ON_VALID_SEQUENCE(vsync_sequence_checker_); + TRACE_EVENT0("gpu", "VSyncProviderMac::OnVSync"); // DisplayLink entry might no longer exist. auto found = callback_lists_.find(display_id);
diff --git a/ui/events/android/event_flags_android.cc b/ui/events/android/event_flags_android.cc index 9e6abb417..df25547 100644 --- a/ui/events/android/event_flags_android.cc +++ b/ui/events/android/event_flags_android.cc
@@ -60,25 +60,25 @@ EventFlags EventFlagsFromAndroidButtonState(int button_state) { int flags = EF_NONE; - if ((button_state & JNI_MotionEvent::BUTTON_BACK) != 0) { + if ((button_state & MotionEventJni::BUTTON_BACK) != 0) { flags |= EF_BACK_MOUSE_BUTTON; } - if ((button_state & JNI_MotionEvent::BUTTON_FORWARD) != 0) { + if ((button_state & MotionEventJni::BUTTON_FORWARD) != 0) { flags |= EF_FORWARD_MOUSE_BUTTON; } - if ((button_state & JNI_MotionEvent::BUTTON_PRIMARY) != 0) { + if ((button_state & MotionEventJni::BUTTON_PRIMARY) != 0) { flags |= EF_LEFT_MOUSE_BUTTON; } - if ((button_state & JNI_MotionEvent::BUTTON_SECONDARY) != 0) { + if ((button_state & MotionEventJni::BUTTON_SECONDARY) != 0) { flags |= EF_RIGHT_MOUSE_BUTTON; } - if ((button_state & JNI_MotionEvent::BUTTON_TERTIARY) != 0) { + if ((button_state & MotionEventJni::BUTTON_TERTIARY) != 0) { flags |= EF_MIDDLE_MOUSE_BUTTON; } - if ((button_state & JNI_MotionEvent::BUTTON_STYLUS_PRIMARY) != 0) { + if ((button_state & MotionEventJni::BUTTON_STYLUS_PRIMARY) != 0) { flags |= EF_LEFT_MOUSE_BUTTON; } - if ((button_state & JNI_MotionEvent::BUTTON_STYLUS_SECONDARY) != 0) { + if ((button_state & MotionEventJni::BUTTON_STYLUS_SECONDARY) != 0) { flags |= EF_RIGHT_MOUSE_BUTTON; }
diff --git a/ui/events/android/events_android_utils.cc b/ui/events/android/events_android_utils.cc index 011543d..c0340d7 100644 --- a/ui/events/android/events_android_utils.cc +++ b/ui/events/android/events_android_utils.cc
@@ -35,8 +35,8 @@ NOTREACHED(); } -#define ACTION_CASE(x) \ - case JNI_MotionEvent::ACTION_##x: \ +#define ACTION_CASE(x) \ + case MotionEventJni::ACTION_##x: \ return MotionEvent::Action::x MotionEvent::Action FromAndroidAction(int android_action) { @@ -63,15 +63,15 @@ MotionEvent::ToolType FromAndroidToolType(int android_tool_type) { switch (android_tool_type) { - case JNI_MotionEvent::TOOL_TYPE_UNKNOWN: + case MotionEventJni::TOOL_TYPE_UNKNOWN: return MotionEvent::ToolType::UNKNOWN; - case JNI_MotionEvent::TOOL_TYPE_FINGER: + case MotionEventJni::TOOL_TYPE_FINGER: return MotionEvent::ToolType::FINGER; - case JNI_MotionEvent::TOOL_TYPE_STYLUS: + case MotionEventJni::TOOL_TYPE_STYLUS: return MotionEvent::ToolType::STYLUS; - case JNI_MotionEvent::TOOL_TYPE_MOUSE: + case MotionEventJni::TOOL_TYPE_MOUSE: return MotionEvent::ToolType::MOUSE; - case JNI_MotionEvent::TOOL_TYPE_ERASER: + case MotionEventJni::TOOL_TYPE_ERASER: return MotionEvent::ToolType::ERASER; default: NOTREACHED() << "Invalid Android MotionEvent tool type: "
diff --git a/ui/events/android/key_event_utils.cc b/ui/events/android/key_event_utils.cc index b437a73d..c204420 100644 --- a/ui/events/android/key_event_utils.cc +++ b/ui/events/android/key_event_utils.cc
@@ -28,7 +28,7 @@ const base::android::JavaRef<jobject>& event) { int flags = static_cast<int>(JNI_KeyEvent::Java_KeyEvent_getFlags(env, event)); - return (flags & JNI_KeyEvent::FLAG_SOFT_KEYBOARD) != 0; + return (flags & KeyEventJni::FLAG_SOFT_KEYBOARD) != 0; } } // namespace android
diff --git a/ui/events/android/motion_event_android.cc b/ui/events/android/motion_event_android.cc index 1577654..4931c35d 100644 --- a/ui/events/android/motion_event_android.cc +++ b/ui/events/android/motion_event_android.cc
@@ -63,11 +63,11 @@ #define ACTION_REVERSE_CASE(x) \ case MotionEventAndroid::Action::x: \ - return JNI_MotionEvent::ACTION_##x + return MotionEventJni::ACTION_##x #define TOOL_TYPE_REVERSE_CASE(x) \ case MotionEventAndroid::ToolType::x: \ - return JNI_MotionEvent::TOOL_TYPE_##x + return MotionEventJni::TOOL_TYPE_##x int ToAndroidAction(MotionEventAndroid::Action action) { switch (action) { @@ -104,20 +104,27 @@ int FromAndroidButtonState(int button_state) { int result = 0; - if ((button_state & JNI_MotionEvent::BUTTON_BACK) != 0) + if ((button_state & MotionEventJni::BUTTON_BACK) != 0) { result |= MotionEventAndroid::BUTTON_BACK; - if ((button_state & JNI_MotionEvent::BUTTON_FORWARD) != 0) + } + if ((button_state & MotionEventJni::BUTTON_FORWARD) != 0) { result |= MotionEventAndroid::BUTTON_FORWARD; - if ((button_state & JNI_MotionEvent::BUTTON_PRIMARY) != 0) + } + if ((button_state & MotionEventJni::BUTTON_PRIMARY) != 0) { result |= MotionEventAndroid::BUTTON_PRIMARY; - if ((button_state & JNI_MotionEvent::BUTTON_SECONDARY) != 0) + } + if ((button_state & MotionEventJni::BUTTON_SECONDARY) != 0) { result |= MotionEventAndroid::BUTTON_SECONDARY; - if ((button_state & JNI_MotionEvent::BUTTON_TERTIARY) != 0) + } + if ((button_state & MotionEventJni::BUTTON_TERTIARY) != 0) { result |= MotionEventAndroid::BUTTON_TERTIARY; - if ((button_state & JNI_MotionEvent::BUTTON_STYLUS_PRIMARY) != 0) + } + if ((button_state & MotionEventJni::BUTTON_STYLUS_PRIMARY) != 0) { result |= MotionEventAndroid::BUTTON_STYLUS_PRIMARY; - if ((button_state & JNI_MotionEvent::BUTTON_STYLUS_SECONDARY) != 0) + } + if ((button_state & MotionEventJni::BUTTON_STYLUS_SECONDARY) != 0) { result |= MotionEventAndroid::BUTTON_STYLUS_SECONDARY; + } return result; }
diff --git a/ui/events/android/motion_event_android_source_java.cc b/ui/events/android/motion_event_android_source_java.cc index 8977027..7700d1ff 100644 --- a/ui/events/android/motion_event_android_source_java.cc +++ b/ui/events/android/motion_event_android_source_java.cc
@@ -73,20 +73,20 @@ } float MotionEventAndroidSourceJava::GetAxisHscroll(size_t pointer_index) const { - return Java_MotionEvent_getAxisValue(AttachCurrentThread(), event_, - JNI_MotionEvent::AXIS_HSCROLL, - pointer_index); + return JNI_MotionEvent::Java_MotionEvent_getAxisValue( + AttachCurrentThread(), event_, MotionEventJni::AXIS_HSCROLL, + pointer_index); } float MotionEventAndroidSourceJava::GetAxisVscroll(size_t pointer_index) const { - return Java_MotionEvent_getAxisValue(AttachCurrentThread(), event_, - JNI_MotionEvent::AXIS_VSCROLL, - pointer_index); + return JNI_MotionEvent::Java_MotionEvent_getAxisValue( + AttachCurrentThread(), event_, MotionEventJni::AXIS_VSCROLL, + pointer_index); } float MotionEventAndroidSourceJava::GetRawTilt(size_t pointer_index) const { - return Java_MotionEvent_getAxisValue( - AttachCurrentThread(), event_, JNI_MotionEvent::AXIS_TILT, pointer_index); + return JNI_MotionEvent::Java_MotionEvent_getAxisValue( + AttachCurrentThread(), event_, MotionEventJni::AXIS_TILT, pointer_index); } MotionEvent::ToolType MotionEventAndroidSourceJava::GetToolType(
diff --git a/ui/gfx/android/rect_jni_conversion.cc b/ui/gfx/android/rect_jni_conversion.cc index edcb598..7b0ef81 100644 --- a/ui/gfx/android/rect_jni_conversion.cc +++ b/ui/gfx/android/rect_jni_conversion.cc
@@ -16,36 +16,32 @@ gfx::Rect FromJniType<gfx::Rect>( JNIEnv* env, const base::android::JavaRef<jobject>& j_rect) { - return gfx::Rect(JNI_Rect::Java_Rect_GetField_left(env, j_rect), - JNI_Rect::Java_Rect_GetField_top(env, j_rect), - JNI_Rect::Java_Rect_width(env, j_rect), - JNI_Rect::Java_Rect_height(env, j_rect)); + const auto& rect = j_rect.As<JRect>(); + return gfx::Rect(rect->Get_left(env), rect->Get_top(env), rect->width(env), + rect->height(env)); } template <> base::android::ScopedJavaLocalRef<jobject> ToJniType<gfx::Rect>( JNIEnv* env, const gfx::Rect& rect) { - return JNI_Rect::Java_Rect_Constructor(env, rect.x(), rect.y(), rect.right(), - rect.bottom()); + return RectJni::New(env, rect.x(), rect.y(), rect.right(), rect.bottom()); } template <> gfx::RectF FromJniType<gfx::RectF>( JNIEnv* env, const base::android::JavaRef<jobject>& j_rect) { - return gfx::RectF(JNI_RectF::Java_RectF_GetField_left(env, j_rect), - JNI_RectF::Java_RectF_GetField_top(env, j_rect), - JNI_RectF::Java_RectF_width(env, j_rect), - JNI_RectF::Java_RectF_height(env, j_rect)); + const auto& rect = j_rect.As<JRectF>(); + return gfx::RectF(rect->Get_left(env), rect->Get_top(env), rect->width(env), + rect->height(env)); } template <> base::android::ScopedJavaLocalRef<jobject> ToJniType<gfx::RectF>( JNIEnv* env, const gfx::RectF& rect) { - return JNI_RectF::Java_RectF_Constructor(env, rect.x(), rect.y(), - rect.right(), rect.bottom()); + return RectFJni::New(env, rect.x(), rect.y(), rect.right(), rect.bottom()); } } // namespace jni_zero
diff --git a/ui/ozone/platform/flatland/flatland_surface_factory.cc b/ui/ozone/platform/flatland/flatland_surface_factory.cc index 69de648e..b617bea 100644 --- a/ui/ozone/platform/flatland/flatland_surface_factory.cc +++ b/ui/ozone/platform/flatland/flatland_surface_factory.cc
@@ -9,6 +9,7 @@ #include <memory> +#include "base/containers/flat_set.h" #include "base/fuchsia/fuchsia_logging.h" #include "base/fuchsia/process_context.h" #include "base/functional/bind.h" @@ -205,13 +206,11 @@ bool FlatlandSurfaceFactory::IsFormatSupportedForTexturing( viz::SharedImageFormat format) const { - base::flat_set<viz::SharedImageFormat> kSupportedFormats = - base::MakeFlatSet<viz::SharedImageFormat>(std::vector( - {viz::SinglePlaneFormat::kR_8, viz::SinglePlaneFormat::kRG_88, - viz::SinglePlaneFormat::kRGBA_8888, - viz::SinglePlaneFormat::kBGRA_8888, - viz::SinglePlaneFormat::kRGBX_8888, - viz::SinglePlaneFormat::kBGRX_8888, viz::MultiPlaneFormat::kNV12})); + auto kSupportedFormats = base::flat_set<viz::SharedImageFormat>( + {viz::SinglePlaneFormat::kR_8, viz::SinglePlaneFormat::kRG_88, + viz::SinglePlaneFormat::kRGBA_8888, viz::SinglePlaneFormat::kBGRA_8888, + viz::SinglePlaneFormat::kRGBX_8888, viz::SinglePlaneFormat::kBGRX_8888, + viz::MultiPlaneFormat::kNV12}); return kSupportedFormats.contains(format); }
diff --git a/ui/ozone/platform/flatland/flatland_sysmem_buffer_collection.cc b/ui/ozone/platform/flatland/flatland_sysmem_buffer_collection.cc index 044d0f4..f227d72b 100644 --- a/ui/ozone/platform/flatland/flatland_sysmem_buffer_collection.cc +++ b/ui/ozone/platform/flatland/flatland_sysmem_buffer_collection.cc
@@ -191,13 +191,11 @@ bool FlatlandSysmemBufferCollection::IsNativePixmapConfigSupported( viz::SharedImageFormat format, gfx::BufferUsage usage) { - base::flat_set<viz::SharedImageFormat> kSupportedFormats = - base::MakeFlatSet<viz::SharedImageFormat>(std::vector( - {viz::SinglePlaneFormat::kR_8, viz::SinglePlaneFormat::kRG_88, - viz::SinglePlaneFormat::kRGBA_8888, - viz::SinglePlaneFormat::kBGRA_8888, - viz::SinglePlaneFormat::kRGBX_8888, - viz::SinglePlaneFormat::kBGRX_8888, viz::MultiPlaneFormat::kNV12})); + auto kSupportedFormats = base::flat_set<viz::SharedImageFormat>( + {viz::SinglePlaneFormat::kR_8, viz::SinglePlaneFormat::kRG_88, + viz::SinglePlaneFormat::kRGBA_8888, viz::SinglePlaneFormat::kBGRA_8888, + viz::SinglePlaneFormat::kRGBX_8888, viz::SinglePlaneFormat::kBGRX_8888, + viz::MultiPlaneFormat::kNV12}); if (!kSupportedFormats.contains(format)) { return false; } @@ -219,13 +217,11 @@ bool FlatlandSysmemBufferCollection::IsNativePixmapConfigSupported( viz::SharedImageFormat format, NativePixmapUsageSet usage) { - base::flat_set<viz::SharedImageFormat> kSupportedFormats = - base::MakeFlatSet<viz::SharedImageFormat>(std::vector( - {viz::SinglePlaneFormat::kR_8, viz::SinglePlaneFormat::kRG_88, - viz::SinglePlaneFormat::kRGBA_8888, - viz::SinglePlaneFormat::kBGRA_8888, - viz::SinglePlaneFormat::kRGBX_8888, - viz::SinglePlaneFormat::kBGRX_8888, viz::MultiPlaneFormat::kNV12})); + auto kSupportedFormats = base::flat_set<viz::SharedImageFormat>( + {viz::SinglePlaneFormat::kR_8, viz::SinglePlaneFormat::kRG_88, + viz::SinglePlaneFormat::kRGBA_8888, viz::SinglePlaneFormat::kBGRA_8888, + viz::SinglePlaneFormat::kRGBX_8888, viz::SinglePlaneFormat::kBGRX_8888, + viz::MultiPlaneFormat::kNV12}); if (!kSupportedFormats.contains(format)) { return false; }
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn index 5c0cad26..82c365a684 100644 --- a/ui/views/BUILD.gn +++ b/ui/views/BUILD.gn
@@ -243,6 +243,7 @@ "focus/focus_search.h", "focus/native_view_focus_manager.h", "input_event_activation_protector.h", + "input_protection/occluded_widget_input_protector.h", "interaction/element_highlighter_views.h", "interaction/element_tracker_views.h", "interaction/element_tracker_widget_state.h", @@ -482,6 +483,7 @@ "focus/focus_search.cc", "focus/native_view_focus_manager.cc", "input_event_activation_protector.cc", + "input_protection/occluded_widget_input_protector.cc", "interaction/element_highlighter_views.cc", "interaction/element_tracker_views.cc", "interaction/element_tracker_widget_state.cc", @@ -1317,6 +1319,7 @@ "event_monitor_unittest.cc", "focus/focus_manager_unittest.cc", "focus/focus_traversal_unittest.cc", + "input_protection/occluded_widget_input_protector_unittest.cc", "interaction/element_tracker_views_unittest.cc", "interaction/element_tracker_widget_state_unittest.cc", "interaction/interaction_sequence_views_unittest.cc",
diff --git a/ui/views/input_protection/occluded_widget_input_protector.cc b/ui/views/input_protection/occluded_widget_input_protector.cc new file mode 100644 index 0000000..884d32d7 --- /dev/null +++ b/ui/views/input_protection/occluded_widget_input_protector.cc
@@ -0,0 +1,75 @@ +// Copyright 2026 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/views/input_protection/occluded_widget_input_protector.h" + +#include "ui/base/ui_base_types.h" +#include "ui/views/views_features.h" +#include "ui/views/widget/widget.h" + +namespace views { + +namespace { + +bool IsAlwaysOnTop(Widget* widget) { + return widget->GetZOrderLevel() >= ui::ZOrderLevel::kFloatingWindow; +} + +} // namespace + +// static +OccludedWidgetInputProtector* OccludedWidgetInputProtector::GetInstance() { + return base::Singleton<OccludedWidgetInputProtector>::get(); +} + +OccludedWidgetInputProtector::OccludedWidgetInputProtector() = default; + +OccludedWidgetInputProtector::~OccludedWidgetInputProtector() = default; + +void OccludedWidgetInputProtector::UpdateTracking(base::PassKey<views::Widget>, + Widget* widget) { + UpdateTrackingImpl(widget); +} + +void OccludedWidgetInputProtector::OnWidgetVisibilityChanged(Widget* widget, + bool visible) { + UpdateTrackingImpl(widget); +} + +void OccludedWidgetInputProtector::OnWidgetDestroying(Widget* widget) { + Unregister(widget); +} + +void OccludedWidgetInputProtector::UpdateTrackingImpl(Widget* widget) { + if (!base::FeatureList::IsEnabled(features::kEnableInputProtection)) { + return; + } + + if (!IsAlwaysOnTop(widget)) { + Unregister(widget); + return; + } + + Register(widget); +} + +void OccludedWidgetInputProtector::Register(Widget* widget) { + if (!widget->HasObserver(this)) { + widget->AddObserver(this); + } + + if (widget->IsVisible()) { + always_on_top_widgets_.insert(widget); + return; + } + + always_on_top_widgets_.erase(widget); +} + +void OccludedWidgetInputProtector::Unregister(Widget* widget) { + always_on_top_widgets_.erase(widget); + widget->RemoveObserver(this); +} + +} // namespace views
diff --git a/ui/views/input_protection/occluded_widget_input_protector.h b/ui/views/input_protection/occluded_widget_input_protector.h new file mode 100644 index 0000000..903b574f --- /dev/null +++ b/ui/views/input_protection/occluded_widget_input_protector.h
@@ -0,0 +1,65 @@ +// Copyright 2026 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_VIEWS_INPUT_PROTECTION_OCCLUDED_WIDGET_INPUT_PROTECTOR_H_ +#define UI_VIEWS_INPUT_PROTECTION_OCCLUDED_WIDGET_INPUT_PROTECTOR_H_ + +#include <set> + +#include "base/memory/singleton.h" +#include "base/types/pass_key.h" +#include "ui/views/views_export.h" +#include "ui/views/widget/widget_observer.h" + +namespace views { + +class Widget; + +// Singleton to support always-on-top input protection for Widgets. +class VIEWS_EXPORT OccludedWidgetInputProtector : public views::WidgetObserver { + public: + static OccludedWidgetInputProtector* GetInstance(); + + OccludedWidgetInputProtector(const OccludedWidgetInputProtector&) = delete; + OccludedWidgetInputProtector& operator=(const OccludedWidgetInputProtector&) = + delete; + + // Updates the tracking state of the protector for `widget`. The protector + // will decide whether to track or stop tracking the widget based on its + // current state (Z-order level and visibility). + // + // Restricted to Widget via PassKey. + void UpdateTracking(base::PassKey<views::Widget> pass_key, + views::Widget* widget); + + // views::WidgetObserver: + void OnWidgetVisibilityChanged(views::Widget* widget, bool visible) override; + void OnWidgetDestroying(views::Widget* widget) override; + + const std::set<views::Widget*>& always_on_top_widgets_for_testing() const { + return always_on_top_widgets_; + } + + private: + friend struct base::DefaultSingletonTraits<OccludedWidgetInputProtector>; + + OccludedWidgetInputProtector(); + ~OccludedWidgetInputProtector() override; + + // Internal implementation of `UpdateTracking`. + void UpdateTrackingImpl(views::Widget* widget); + + // Registers `widget` for always-on-top monitoring. + void Register(views::Widget* widget); + + // Unregisters `widget` from always-on-top monitoring. + void Unregister(views::Widget* widget); + + // The set of always-on-top widgets that are currently visible. + std::set<views::Widget*> always_on_top_widgets_; +}; + +} // namespace views + +#endif // UI_VIEWS_INPUT_PROTECTION_OCCLUDED_WIDGET_INPUT_PROTECTOR_H_
diff --git a/ui/views/input_protection/occluded_widget_input_protector_unittest.cc b/ui/views/input_protection/occluded_widget_input_protector_unittest.cc new file mode 100644 index 0000000..05f44b5 --- /dev/null +++ b/ui/views/input_protection/occluded_widget_input_protector_unittest.cc
@@ -0,0 +1,225 @@ +// Copyright 2026 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/views/input_protection/occluded_widget_input_protector.h" + +#include <memory> +#include <utility> +#include <vector> + +#include "base/test/scoped_feature_list.h" +#include "ui/views/test/widget_test.h" +#include "ui/views/views_features.h" +#include "ui/views/widget/widget.h" + +namespace views::test { + +class OccludedWidgetInputProtectorTestBase : public WidgetTest { + public: + OccludedWidgetInputProtectorTestBase() = default; + + const std::set<Widget*>& always_on_top_widgets() { + return OccludedWidgetInputProtector::GetInstance() + ->always_on_top_widgets_for_testing(); + } + + bool IsObserving(Widget* widget) { + return widget->HasObserver(OccludedWidgetInputProtector::GetInstance()); + } + + protected: + std::unique_ptr<Widget> CreateWidgetWithZOrder( + ui::ZOrderLevel z_order = ui::ZOrderLevel::kNormal) { + Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW); + params.z_order = z_order; + params.ownership = Widget::InitParams::CLIENT_OWNS_WIDGET; + auto widget = std::make_unique<Widget>(); + widget->Init(std::move(params)); + return widget; + } +}; + +class OccludedWidgetInputProtectorTest + : public OccludedWidgetInputProtectorTestBase { + public: + OccludedWidgetInputProtectorTest() { + scoped_feature_list_.InitAndEnableFeature(features::kEnableInputProtection); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +TEST_F(OccludedWidgetInputProtectorTest, TracksAlwaysOnTopWidget) { + auto widget = CreateWidgetWithZOrder(ui::ZOrderLevel::kFloatingWindow); + EXPECT_TRUE(IsObserving(widget.get())); + + // Not tracked yet because it is not visible. + EXPECT_FALSE(always_on_top_widgets().contains(widget.get())); + + widget->Show(); + WidgetVisibleWaiter(widget.get()).Wait(); + EXPECT_TRUE(always_on_top_widgets().contains(widget.get())); + EXPECT_TRUE(IsObserving(widget.get())); + + widget->Hide(); + WidgetVisibleWaiter(widget.get()).WaitUntilInvisible(); + EXPECT_FALSE(always_on_top_widgets().contains(widget.get())); + EXPECT_TRUE(IsObserving(widget.get())); + + widget->Show(); + WidgetVisibleWaiter(widget.get()).Wait(); + EXPECT_TRUE(always_on_top_widgets().contains(widget.get())); + EXPECT_TRUE(IsObserving(widget.get())); +} + +TEST_F(OccludedWidgetInputProtectorTest, DoesNotTrackNormalWidget) { + auto widget = CreateWidgetWithZOrder(); + EXPECT_FALSE(IsObserving(widget.get())); + + EXPECT_FALSE(always_on_top_widgets().contains(widget.get())); + + widget->Show(); + WidgetVisibleWaiter(widget.get()).Wait(); + EXPECT_FALSE(always_on_top_widgets().contains(widget.get())); +} + +TEST_F(OccludedWidgetInputProtectorTest, CleanupOnDestroy) { + auto widget = CreateWidgetWithZOrder(ui::ZOrderLevel::kFloatingWindow); + widget->Show(); + WidgetVisibleWaiter(widget.get()).Wait(); + + EXPECT_TRUE(always_on_top_widgets().contains(widget.get())); + EXPECT_TRUE(IsObserving(widget.get())); + + widget.reset(); + EXPECT_TRUE(always_on_top_widgets().empty()); +} + +TEST_F(OccludedWidgetInputProtectorTest, HandlesZOrderLevelChanges) { + // Start with a normal widget. + auto widget = CreateWidgetWithZOrder(ui::ZOrderLevel::kNormal); + EXPECT_FALSE(IsObserving(widget.get())); + widget->Show(); + WidgetVisibleWaiter(widget.get()).Wait(); + EXPECT_FALSE(always_on_top_widgets().contains(widget.get())); + + // Change Z-order to always-on-top. + widget->SetZOrderLevel(ui::ZOrderLevel::kFloatingWindow); + + // It should now be observed and tracked (since it is visible). + EXPECT_TRUE(IsObserving(widget.get())); + EXPECT_TRUE(always_on_top_widgets().contains(widget.get())); + + // Change back to normal. + widget->SetZOrderLevel(ui::ZOrderLevel::kNormal); + EXPECT_FALSE(IsObserving(widget.get())); + EXPECT_FALSE(always_on_top_widgets().contains(widget.get())); +} + +TEST_F(OccludedWidgetInputProtectorTest, HandlesZOrderLevelChangesWhileHidden) { + auto widget = CreateWidgetWithZOrder(ui::ZOrderLevel::kNormal); + EXPECT_FALSE(IsObserving(widget.get())); + + // Change to AOT while hidden. + widget->SetZOrderLevel(ui::ZOrderLevel::kFloatingWindow); + // Should be observed now, but not in the visible set. + EXPECT_TRUE(IsObserving(widget.get())); + EXPECT_FALSE(always_on_top_widgets().contains(widget.get())); + + // Showing should add it to the set. + widget->Show(); + WidgetVisibleWaiter(widget.get()).Wait(); + EXPECT_TRUE(always_on_top_widgets().contains(widget.get())); + + // Hiding it. + widget->Hide(); + WidgetVisibleWaiter(widget.get()).WaitUntilInvisible(); + EXPECT_TRUE(IsObserving(widget.get())); + EXPECT_FALSE(always_on_top_widgets().contains(widget.get())); + + // Changing to normal while hidden. + widget->SetZOrderLevel(ui::ZOrderLevel::kNormal); + EXPECT_FALSE(IsObserving(widget.get())); +} + +TEST_F(OccludedWidgetInputProtectorTest, TracksHigherZOrderLevels) { + auto widget = CreateWidgetWithZOrder(ui::ZOrderLevel::kSecuritySurface); + widget->Show(); + WidgetVisibleWaiter(widget.get()).Wait(); + + EXPECT_TRUE(IsObserving(widget.get())); + EXPECT_TRUE(always_on_top_widgets().contains(widget.get())); +} + +TEST_F(OccludedWidgetInputProtectorTest, TracksMultipleWidgets) { + auto widget1 = CreateWidgetWithZOrder(ui::ZOrderLevel::kFloatingWindow); + auto widget2 = CreateWidgetWithZOrder(ui::ZOrderLevel::kFloatingWindow); + + EXPECT_TRUE(IsObserving(widget1.get())); + EXPECT_TRUE(IsObserving(widget2.get())); + + EXPECT_FALSE(always_on_top_widgets().contains(widget1.get())); + EXPECT_FALSE(always_on_top_widgets().contains(widget2.get())); + + widget1->Show(); + WidgetVisibleWaiter(widget1.get()).Wait(); + EXPECT_TRUE(always_on_top_widgets().contains(widget1.get())); + EXPECT_TRUE(IsObserving(widget1.get())); + EXPECT_FALSE(always_on_top_widgets().contains(widget2.get())); + + widget2->Show(); + WidgetVisibleWaiter(widget2.get()).Wait(); + EXPECT_TRUE(always_on_top_widgets().contains(widget1.get())); + EXPECT_TRUE(always_on_top_widgets().contains(widget2.get())); + EXPECT_TRUE(IsObserving(widget2.get())); + + widget1->Hide(); + WidgetVisibleWaiter(widget1.get()).WaitUntilInvisible(); + EXPECT_FALSE(always_on_top_widgets().contains(widget1.get())); + EXPECT_TRUE(IsObserving(widget1.get())); + EXPECT_TRUE(always_on_top_widgets().contains(widget2.get())); + + widget2->Hide(); + WidgetVisibleWaiter(widget2.get()).WaitUntilInvisible(); + EXPECT_FALSE(always_on_top_widgets().contains(widget1.get())); + EXPECT_FALSE(always_on_top_widgets().contains(widget2.get())); + EXPECT_TRUE(IsObserving(widget2.get())); +} + +TEST_F(OccludedWidgetInputProtectorTest, HandlesDestroyWhileHidden) { + auto widget = CreateWidgetWithZOrder(ui::ZOrderLevel::kFloatingWindow); + widget->Show(); + WidgetVisibleWaiter(widget.get()).Wait(); + + widget->Hide(); + WidgetVisibleWaiter(widget.get()).WaitUntilInvisible(); + EXPECT_FALSE(always_on_top_widgets().contains(widget.get())); + EXPECT_TRUE(IsObserving(widget.get())); + + widget.reset(); + EXPECT_TRUE(always_on_top_widgets().empty()); +} + +class OccludedWidgetInputProtectorDisabledTest + : public OccludedWidgetInputProtectorTestBase { + public: + OccludedWidgetInputProtectorDisabledTest() { + scoped_feature_list_.InitAndDisableFeature( + features::kEnableInputProtection); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +TEST_F(OccludedWidgetInputProtectorDisabledTest, DoesNotTrackWhenDisabled) { + auto widget = CreateWidgetWithZOrder(ui::ZOrderLevel::kFloatingWindow); + EXPECT_FALSE(IsObserving(widget.get())); + widget->Show(); + + EXPECT_TRUE(always_on_top_widgets().empty()); +} + +} // namespace views::test
diff --git a/ui/views/views_features.cc b/ui/views/views_features.cc index d033e49..c74cf66 100644 --- a/ui/views/views_features.cc +++ b/ui/views/views_features.cc
@@ -21,11 +21,11 @@ // stable. BASE_FEATURE(kApplyInitialUrlToWebContents, base::FEATURE_ENABLED_BY_DEFAULT); -// Enables clickjacking protection by blocking interaction with views that are +// Enables input protection by blocking interaction with views that are // currently or were recently obscured by always-on-top windows, and prevents // unintended events on security-sensitive UI that appears and activates // unexpectedly." -BASE_FEATURE(kEnableClickjackingProtection, base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kEnableInputProtection, base::FEATURE_DISABLED_BY_DEFAULT); // If mouse cursor is over different window Windows will not start a Drag // and drop. This feature moves the cursor to the location of a touch on
diff --git a/ui/views/views_features.h b/ui/views/views_features.h index 78d8585..092e515 100644 --- a/ui/views/views_features.h +++ b/ui/views/views_features.h
@@ -14,7 +14,7 @@ // Please keep alphabetized. VIEWS_EXPORT BASE_DECLARE_FEATURE(kAnnounceTextAdditionalAttributes); VIEWS_EXPORT BASE_DECLARE_FEATURE(kApplyInitialUrlToWebContents); -VIEWS_EXPORT BASE_DECLARE_FEATURE(kEnableClickjackingProtection); +VIEWS_EXPORT BASE_DECLARE_FEATURE(kEnableInputProtection); VIEWS_EXPORT BASE_DECLARE_FEATURE(kEnableTouchDragCursorSync); VIEWS_EXPORT BASE_DECLARE_FEATURE(kKeyboardAccessibleTooltipInViews);
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc index f67a1ad..e02d00c 100644 --- a/ui/views/widget/widget.cc +++ b/ui/views/widget/widget.cc
@@ -52,6 +52,7 @@ #include "ui/views/focus/focus_manager.h" #include "ui/views/focus/focus_manager_factory.h" #include "ui/views/focus/native_view_focus_manager.h" +#include "ui/views/input_protection/occluded_widget_input_protector.h" #include "ui/views/views_delegate.h" #include "ui/views/widget/any_widget_observer_singleton.h" #include "ui/views/widget/native_widget_private.h" @@ -610,6 +611,9 @@ delegate->WidgetInitialized(); } + OccludedWidgetInputProtector::GetInstance()->UpdateTracking( + base::PassKey<Widget>(), this); + internal::AnyWidgetObserverSingleton::GetInstance()->OnAnyWidgetInitialized( this); } @@ -1098,6 +1102,9 @@ void Widget::SetZOrderLevel(ui::ZOrderLevel order) { if (native_widget_) { native_widget_->SetZOrderLevel(order); + + OccludedWidgetInputProtector::GetInstance()->UpdateTracking( + base::PassKey<Widget>(), this); } }
diff --git a/ui/webui/resources/cr_components/composebox/composebox.css b/ui/webui/resources/cr_components/composebox/composebox.css index 64533e3..bf9b7b1 100644 --- a/ui/webui/resources/cr_components/composebox/composebox.css +++ b/ui/webui/resources/cr_components/composebox/composebox.css
@@ -689,10 +689,6 @@ padding-top: 4px; } -:host-context([searchbox-layout-mode='TallTopContext']) .carousel-divider { - margin-top: 10px; -} - :host([searchbox-layout-mode='Compact'][show-dropdown_]) .carousel-divider { --contextual-entrypoint-and-carousel-carousel-divider-margin-bottom: 8px; --contextual-entrypoint-and-carousel-carousel-divider-margin-top: 12px; @@ -728,27 +724,6 @@ inset-inline-end: calc(var(--cr-icon-button-size) + 18px); } -:host([searchbox-layout-mode='TallTopContext']) #voiceSearchButton { - margin-inline-end: 12px; - margin-inline-start: auto; - position: static; -} - -:host([submit-enabled_][searchbox-layout-mode='TallTopContext']) #voiceSearchButton { - margin-inline-end: 0; -} - -:host([submit-enabled_][searchbox-layout-mode='TallTopContext']) #submitContainer { - margin-inline-end: 10px; - margin-inline-start: var(--cr-composebox-submit-button-margin-inline-start, 4px); - position: static; -} - -:host([submit-enabled_][searchbox-layout-mode='TallTopContext']) #submitIcon { - margin-inline-end: 12px; - position: relative; -} - :host([searchbox-layout-mode='Compact']) #voiceSearchButton { position: absolute; inset-inline-end: calc(var(--cr-composebox-submit-container-size) + 12px);
diff --git a/ui/webui/resources/cr_components/composebox/composebox.html.ts b/ui/webui/resources/cr_components/composebox/composebox.html.ts index 714cbc6..611a6742 100644 --- a/ui/webui/resources/cr_components/composebox/composebox.html.ts +++ b/ui/webui/resources/cr_components/composebox/composebox.html.ts
@@ -25,11 +25,11 @@ ` : ''} <ntp-error-scrim id="errorScrim" part="error-scrim" ?compact-mode="${this.searchboxLayoutMode === 'Compact' && - this.files.size === 0}" - .errorMessage="${this.errorMessage}" + this.files_.size === 0}" + .errorMessage="${this.errorMessage_}" @dismiss-error-scrim="${this.onDismissErrorScrim_}"> </ntp-error-scrim> - <div id="composebox" part="composebox" ?inert="${!!this.errorMessage}" + <div id="composebox" part="composebox" ?inert="${!!this.errorMessage_}" @keydown="${this.onKeydown_}" @focusin="${this.onComposeboxFocusin_}" @focusout="${this.onComposeboxFocusout_}" @@ -52,9 +52,9 @@ aria-expanded="${this.showDropdown_}" aria-controls="matches" role="combobox" autocomplete="off" id="input" type="search" spellcheck="false" - placeholder="${this.inputPlaceholder}" + placeholder="${this.inputPlaceholder_}" part="input" - .value="${this.input}" + .value="${this.input_}" @click="${this.onInputClick_}" @keyup="${this.onInputKeyup_}" @input="${this.onInputInput_}" @@ -65,7 +65,7 @@ <div id="smartCompose" part="smart-compose"> <!-- Comments in between spans to eliminate spacing between spans --> - <span id="invisibleText">${this.input}</span><!-- + <span id="invisibleText">${this.input_}</span><!-- --><span id="ghostText">${this.smartComposeInlineHint_}</span><!-- --><span id="tabChip">${this.i18n('composeboxSmartComposeTabTitle')}</span> </div> @@ -101,7 +101,7 @@ exportparts="thumbnail, thumbnail-title" id="carousel" class="${this.carouselOnTop_ ? 'top' : ''}" - .files="${Array.from(this.files.values())}" + .files="${Array.from(this.files_.values())}" ?enable-scrolling="${this.enableCarouselScrolling}" @delete-file="${this.onDeleteFile_}"> </cr-composebox-file-carousel> ` : ''} @@ -110,7 +110,7 @@ part="tool-chips-container"> <cr-composebox-tool-chip exportparts="tool-chip-label" - .inputState="${this.inputState}" + .inputState="${this.inputState_}" @tool-click="${this.onToolClick_}"> </cr-composebox-tool-chip> </div> @@ -120,9 +120,6 @@ getSubmitButtonHtml.bind(this)() : ''} </div> - ${this.searchboxLayoutMode === 'TallTopContext' ? - getContextMenuHtml.bind(this)() - : ''} ${this.shouldShowDivider_ ? html` <div class="carousel-divider" part="carousel-divider"></div> ` : ''} @@ -134,7 +131,7 @@ .result="${this.result_}" .selectedMatchIndex="${this.selectedMatchIndex_}" .maxSuggestions="${this.maxSuggestions}" - .toolMode="${this.inputState?.activeTool}" + .toolMode="${this.inputState_?.activeTool}" @selected-match-index-changed="${this.onSelectedMatchIndexChanged_}" @match-focusin="${this.onMatchFocusin_}" @match-click="${this.onMatchClick_}"
diff --git a/ui/webui/resources/cr_components/composebox/composebox.ts b/ui/webui/resources/cr_components/composebox/composebox.ts index 4b844a1..c3e22786 100644 --- a/ui/webui/resources/cr_components/composebox/composebox.ts +++ b/ui/webui/resources/cr_components/composebox/composebox.ts
@@ -22,14 +22,13 @@ import {getInstance as getAnnouncerInstance} from '//resources/cr_elements/cr_a11y_announcer/cr_a11y_announcer.js'; import type {CrIconButtonElement} from '//resources/cr_elements/cr_icon_button/cr_icon_button.js'; import {I18nMixinLit} from '//resources/cr_elements/i18n_mixin_lit.js'; -import {assert, assertNotReachedCase} from '//resources/js/assert.js'; +import {assert} from '//resources/js/assert.js'; import {EventTracker} from '//resources/js/event_tracker.js'; import {loadTimeData} from '//resources/js/load_time_data.js'; import {hasKeyModifiers} from '//resources/js/util.js'; import type {PropertyValues} from '//resources/lit/v3_0/lit.rollup.js'; import {CrLitElement} from '//resources/lit/v3_0/lit.rollup.js'; import type {AutocompleteMatch, AutocompleteResult, FileAttachment, PageCallbackRouter as SearchboxPageCallbackRouter, PageHandlerRemote as SearchboxPageHandlerRemote, SearchContext, SelectedFileInfo, TabAttachment, TabInfo} from '//resources/mojo/components/omnibox/browser/searchbox.mojom-webui.js'; -import {ToolMode} from '//resources/mojo/components/omnibox/browser/searchbox.mojom-webui.js'; import {ModelMode} from '//resources/mojo/components/omnibox/composebox/composebox_query.mojom-webui.js'; import type {BigBuffer} from '//resources/mojo/mojo/public/mojom/base/big_buffer.mojom-webui.js'; import type {UnguessableToken} from '//resources/mojo/mojo/public/mojom/base/unguessable_token.mojom-webui.js'; @@ -42,9 +41,8 @@ import type {PageHandlerRemote} from './composebox.mojom-webui.js'; import type {ComposeboxDropdownElement} from './composebox_dropdown.js'; import type {ComposeboxFileInputsElement} from './composebox_file_inputs.js'; -import {ComposeboxEmbedderMixin} from './composebox_mixin.js'; import {ComposeboxProxyImpl} from './composebox_proxy.js'; -import {ContextUploadStatus, InputType, ToolMode as ComposeboxToolMode} from './composebox_query.mojom-webui.js'; +import {ContextUploadStatus, InputType, ToolMode} from './composebox_query.mojom-webui.js'; import type {ContextUploadErrorType, InputState} from './composebox_query.mojom-webui.js'; import type {ComposeboxVoiceSearchElement} from './composebox_voice_search.js'; import type {ContextualEntrypointAndMenuElement} from './contextual_entrypoint_and_menu.js'; @@ -57,24 +55,6 @@ QUERY_SUBMITTED = 1, } -export function isTerminalState(status: ContextUploadStatus): boolean { - switch (status) { - case ContextUploadStatus.kUploadSuccessful: - case ContextUploadStatus.kUploadFailed: - case ContextUploadStatus.kValidationFailed: - case ContextUploadStatus.kUploadExpired: - case ContextUploadStatus.kUploadReplaced: - return true; - case ContextUploadStatus.kNotUploaded: - case ContextUploadStatus.kProcessing: - case ContextUploadStatus.kUploadStarted: - case ContextUploadStatus.kProcessingSuggestSignalsReady: - return false; - default: - assertNotReachedCase(status, 'Unknown enum value'); - } -} - const DEBOUNCE_TIMEOUT_MS: number = 20; const ZERO_SPACE_STRING: string = '\u200b'; @@ -128,8 +108,8 @@ } -export class ComposeboxElement extends ComposeboxEmbedderMixin -(I18nMixinLit(CrLitElement)) implements DragAndDropHost { +export class ComposeboxElement extends I18nMixinLit +(CrLitElement) implements DragAndDropHost { static get is() { return 'cr-composebox'; } @@ -148,6 +128,7 @@ showLensButton: {type: Boolean}, suggestionActivityEnabled: {type: Boolean}, lensButtonTriggersOverlay: {type: Boolean}, + input_: {type: String}, isCollapsible: { reflect: true, type: Boolean, @@ -179,6 +160,10 @@ reflect: true, type: Boolean, }, + inputPlaceholder_: { + reflect: true, + type: String, + }, smartComposeEnabled_: { reflect: true, type: Boolean, @@ -192,8 +177,8 @@ reflect: true, type: Boolean, }, - inToolMode_: { - type: Boolean, + activeToolMode_: { + type: Number, reflect: true, }, /** @@ -219,6 +204,7 @@ reflect: true, type: Boolean, }, + errorMessage_: {type: String}, searchboxLayoutMode: { type: String, reflect: true, @@ -250,6 +236,7 @@ reflect: true, }, showModelPicker: {type: Boolean}, + inputState_: {type: Object}, showModelPicker_: { type: Boolean, reflect: true, @@ -260,7 +247,9 @@ }, enableCarouselScrolling: {type: Boolean}, inputPlaceholderOverride: {type: String}, + files_: {type: Object}, contextMenuEnabled_: {type: Boolean}, + addedTabsIds_: {type: Object}, showContextMenuDescription_: {type: Boolean}, uploadButtonDisabled_: { type: Boolean, @@ -315,6 +304,7 @@ // Whether the composebox is currently expanded. Always true if isCollapsible // is false. protected accessor expanding_: boolean = false; + protected accessor input_: string = ''; protected accessor showDropdown_: boolean = loadTimeData.getBoolean('composeboxShowZps'); protected accessor enableImageContextualSuggestions_: boolean = @@ -326,10 +316,15 @@ protected accessor smartComposeInlineHint_: string = ''; protected accessor smartComposeEnabled_: boolean = loadTimeData.getBoolean('composeboxSmartComposeEnabled'); + protected accessor inputPlaceholder_: string = + loadTimeData.getString('searchboxComposePlaceholder'); protected accessor showFileCarousel_: boolean = false; + protected accessor activeToolMode_: ToolMode = ToolMode.kUnspecified; + protected accessor errorMessage_: string = ''; protected accessor transcript_: string = ''; protected accessor receivedSpeech_: boolean = false; protected accessor canSubmitFilesAndInput_: boolean = true; + protected accessor inputState_: InputState|null = null; protected lastQueriedInput_: string = ''; protected showVoiceSearchInSteadyComposebox_: boolean = loadTimeData.getBoolean('steadyComposeboxShowVoiceSearch'); @@ -340,16 +335,16 @@ loadTimeData.getBoolean('contextualMenuUsePecApi') : false; protected accessor hasAllowedInputs_: boolean = false; + protected accessor files_: Map<UnguessableToken, ComposeboxFile> = new Map(); protected accessor contextMenuEnabled_: boolean = loadTimeData.getBoolean('composeboxShowContextMenu'); + protected accessor addedTabsIds_: Map<number, UnguessableToken> = new Map(); protected accessor uploadButtonDisabled_: boolean = false; protected contextMenuDescriptionEnabled_: boolean = loadTimeData.getBoolean('composeboxShowContextMenuDescription'); protected accessor showContextMenuDescription_: boolean = this.contextMenuDescriptionEnabled_; protected accessor isOmniboxInCompactMode_: boolean = false; - protected accessor inVoiceSearchMode_: boolean = false; - protected accessor inToolMode_: boolean = false; // Synchronous immediate guard used to deduplicate processing // autochips being added, not fully processed chips. protected pendingAutomaticActiveTabUrl_: string = ''; @@ -385,6 +380,7 @@ loadTimeData.valueExists('autoSubmitVoiceSearchQuery') ? loadTimeData.getBoolean('autoSubmitVoiceSearchQuery') : true; + protected accessor inVoiceSearchMode_: boolean = false; private selectedMatch_: AutocompleteMatch|null = null; // Whether the composebox is actively waiting for an autocomplete response. If // this is false, that means at least one response has been received (even if @@ -407,6 +403,10 @@ private lensSendRawFileMediaTypesEnabled_: boolean = loadTimeData.getBoolean('lensSendRawFileMediaTypesEnabled'); + protected get inToolMode_(): boolean { + return this.activeToolMode_ !== ToolMode.kUnspecified; + } + protected get shouldShowDivider_(): boolean { // TODO(crbug.com/476175193): Remove `entrypointName` condition. if (this.entrypointName === 'Omnibox' && @@ -417,7 +417,6 @@ return this.showDropdown_ && (this.showFileCarousel_ || - this.searchboxLayoutMode === 'TallTopContext' || this.shouldShowSubmitButton_ || this.inToolMode_); } @@ -485,7 +484,7 @@ const inputState = await this.searchboxHandler_.getInputState(); if (inputState) { - this.inputState = inputState.state; + this.inputState_ = inputState.state; } this.setupResizeObservers_(); @@ -542,11 +541,11 @@ const changedPrivateProperties = changedProperties as Map<PropertyKey, unknown>; // When the result initially gets set check if dropdown should show. - if (changedPrivateProperties.has('input') || + if (changedPrivateProperties.has('input_') || changedPrivateProperties.has('result_') || - changedPrivateProperties.has('files') || - changedPrivateProperties.has('errorMessage')) { - this.showFileCarousel_ = this.files.size > 0; + changedPrivateProperties.has('files_') || + changedPrivateProperties.has('errorMessage_')) { + this.showFileCarousel_ = this.files_.size > 0; this.showDropdown_ = this.computeShowDropdown_(); } if (changedPrivateProperties.has('submitEnabled_') || @@ -556,23 +555,23 @@ this.submitEnabled_ && this.fileUploadsComplete; } - if (changedPrivateProperties.has('inputState') && this.inputState) { + if (changedPrivateProperties.has('inputState_') && this.inputState_) { this.hasAllowedInputs_ = - (this.inputState.allowedModels.length > 0 || - this.inputState.allowedTools.length > 0 || - this.inputState.allowedInputTypes.length > 0); - this.inToolMode_ = - this.inputState.activeTool !== ComposeboxToolMode.kUnspecified; + (this.inputState_.allowedModels.length > 0 || + this.inputState_.allowedTools.length > 0 || + this.inputState_.allowedInputTypes.length > 0); + + this.activeToolMode_ = this.inputState_.activeTool; this.dispatchEvent(new CustomEvent('input-state-changed', { - detail: {inputState: this.inputState}, + detail: {inputState: this.inputState_}, })); } if (changedPrivateProperties.has('inputPlaceholderOverride') || - changedPrivateProperties.has('files') || + changedPrivateProperties.has('files_') || changedPrivateProperties.has('enableFileHint') || - changedPrivateProperties.has('inputState') || - changedPrivateProperties.has('inputState.activeTool')) { + changedPrivateProperties.has('inputState_') || + changedPrivateProperties.has('inputState_.activeTool')) { this.updateInputPlaceholder_(); } } @@ -589,7 +588,7 @@ if (this.selectedMatch_) { // Update the input. const text = this.selectedMatch_.fillIntoEdit; - this.input = text; + this.input_ = text; } else if (!this.lastQueriedInput_) { // This is for cases when focus leaves the matches/input. // If there was already text in the input do not clear it. @@ -597,14 +596,14 @@ } else { // For typed queries reset the input back to typed value when // focus leaves the match. - this.input = this.lastQueriedInput_; + this.input_ = this.lastQueriedInput_; } } if (changedPrivateProperties.has('selectedMatchIndex_') || - changedPrivateProperties.has('inputState') || + changedPrivateProperties.has('inputState_') || changedPrivateProperties.has('isFollowupQuery') || - changedPrivateProperties.has('files')) { + changedPrivateProperties.has('files_')) { this.submitEnabled_ = this.computeSubmitEnabled_(); this.canSubmitFilesAndInput_ = this.submitEnabled_ && this.fileUploadsComplete; @@ -642,7 +641,7 @@ } getText() { - return this.input; + return this.input_; } queryAutocomplete(clearMatches: boolean) { @@ -672,34 +671,35 @@ } setText(text: string) { - this.input = text; + this.input_ = text; } resetModes() { - const previousTool = this.inputState?.activeTool; + const previousTool = this.inputState_?.activeTool; this.uploadButtonDisabled_ = false; - if (previousTool !== ComposeboxToolMode.kUnspecified) { + if (previousTool !== ToolMode.kUnspecified) { this.showContextMenuDescription_ = this.contextMenuDescriptionEnabled_; - this.handleToolModeUpdate_(ComposeboxToolMode.kUnspecified); + this.handleToolModeUpdate_(ToolMode.kUnspecified); } } setDefaultModel() { - if (this.inputState?.activeModel && - (this.inputState.activeModel as ModelMode) !== ModelMode.kUnspecified) { - this.searchboxHandler_.setActiveModelMode(this.inputState.activeModel); + if (this.inputState_?.activeModel && + (this.inputState_.activeModel as ModelMode) !== + ModelMode.kUnspecified) { + this.searchboxHandler_.setActiveModelMode(this.inputState_.activeModel); } else if ( - this.inputState?.allowedModels && - this.inputState.allowedModels.length > 0) { + this.inputState_?.allowedModels && + this.inputState_.allowedModels.length > 0) { this.searchboxHandler_.setActiveModelMode( - this.inputState.allowedModels[0]!); + this.inputState_.allowedModels[0]!); } } resetToolsAndModels() { - if (this.inputState) { - this.searchboxHandler_.setActiveToolMode(ComposeboxToolMode.kUnspecified); + if (this.inputState_) { + this.searchboxHandler_.setActiveToolMode(ToolMode.kUnspecified); this.searchboxHandler_.setActiveModelMode(ModelMode.kUnspecified); } } @@ -735,7 +735,7 @@ } hasFiles(): boolean { - return this.files.size > 0; + return this.files_.size > 0; } isExpanded(): boolean { @@ -749,11 +749,11 @@ protected async updateState_(state: ComposeboxState) { const text = state.text || ''; const files = state.files || []; - const mode = state.mode ?? ComposeboxToolMode.kUnspecified; + const mode = state.mode ?? ToolMode.kUnspecified; let model = state.model ?? ModelMode.kUnspecified; if (text) { - this.input = text; + this.input_ = text; this.lastQueriedInput_ = text; } if (this.showZps && files.length === 0) { @@ -787,13 +787,13 @@ } this.processFiles_(dataTransfer.files); } - if (mode !== ComposeboxToolMode.kUnspecified) { + if (mode !== ToolMode.kUnspecified) { this.handleToolClick_(mode); } - if (!!this.inputState && model === ModelMode.kUnspecified && - this.inputState.allowedModels.length > 0) { - model = this.inputState.allowedModels[0]!; + if (!!this.inputState_ && model === ModelMode.kUnspecified && + this.inputState_.allowedModels.length > 0) { + model = this.inputState_.allowedModels[0]!; } this.searchboxHandler_.setActiveModelMode(model); this.updateInputPlaceholder_(); @@ -811,7 +811,7 @@ } protected computeCancelButtonTitle_() { - return this.input.trim().length > 0 || this.files.size > 0 ? + return this.input_.trim().length > 0 || this.files_.size > 0 ? this.i18n('composeboxCancelButtonTitleInput') : this.i18n('composeboxCancelButtonTitle'); } @@ -843,7 +843,7 @@ private computeShowDropdown_() { // Don't show dropdown if there's multiple files. - if (this.files.size > 1) { + if (this.files_.size > 1) { return false; } @@ -853,7 +853,7 @@ } // Do not show dropdown if there's an error scrim. - if (this.errorMessage !== '') { + if (this.errorMessage_ !== '') { return false; } @@ -866,7 +866,7 @@ if (this.showTypedSuggest_ && this.lastQueriedInput_.trim()) { // If context is present, but not enabled, continue to avoid showing the // dropdown. - if (!this.showTypedSuggestWithContext_ && this.files.size > 0) { + if (!this.showTypedSuggestWithContext_ && this.files_.size > 0) { return false; } // Do not show the dropdown for multiline input or if only the verbatim @@ -877,8 +877,8 @@ } } - // lastQueriedInput_ is used here since the input changes based on - // the selected match. If typed suggest is not enabled and input is used, + // lastQueriedInput_ is used here since the input_ changes based on + // the selected match. If typed suggest is not enabled and input_ is used, // the dropdown will hide if the user keys down over zps matches. return this.showZps && !this.lastQueriedInput_; } @@ -886,7 +886,7 @@ private hasValidQuery_() { // If there is at least one file that supports unimodal search, query is // valid. - if (this.files.values().find( + if (this.files_.values().find( (file: ComposeboxFile) => file.supportsUnimodal)) { return true; } @@ -896,14 +896,14 @@ return true; } - if (this.input.trim().length > 0) { + if (this.input_.trim().length > 0) { return true; } // TODO(crbug.com/485648942): Update to drive Deep Search behavior from the // PEC API's ToolSubstateConfig. // Allow empty query for Deep Search follow-ups. - if (this.inputState?.activeTool === ComposeboxToolMode.kDeepSearch && + if (this.inputState_?.activeTool === ToolMode.kDeepSearch && this.isFollowupQuery) { return true; } @@ -927,7 +927,7 @@ } protected shouldShowVoiceSearch_(): boolean { - const isExpanded = this.showDropdown_ || this.files.size > 0; + const isExpanded = this.showDropdown_ || this.files_.size > 0; const isFeatureEnabled = isExpanded ? this.showVoiceSearchInExpandedComposebox_ : this.showVoiceSearchInSteadyComposebox_; @@ -950,13 +950,13 @@ } deleteFile(uuidToDelete: UnguessableToken, fromUserAction?: boolean) { - if (!uuidToDelete || !this.files.has(uuidToDelete)) { + if (!uuidToDelete || !this.files_.has(uuidToDelete)) { return; } - const file = this.files.get(uuidToDelete); + const file = this.files_.get(uuidToDelete); if (file?.tabId) { - this.addedTabsIds = new Map([...this.addedTabsIds.entries()].filter( + this.addedTabsIds_ = new Map([...this.addedTabsIds_.entries()].filter( ([id, _]) => id !== file.tabId)); } @@ -982,8 +982,8 @@ recordBoolean(metricName, true); } - this.files = new Map( - [...this.files.entries()].filter(([uuid, _]) => uuid !== uuidToDelete)); + this.files_ = new Map([...this.files_.entries()].filter( + ([uuid, _]) => uuid !== uuidToDelete)); this.pendingUploads_.delete(uuidToDelete); this.fileUploadsComplete = this.pendingUploads_.size === 0; this.searchboxHandler_.deleteContext(uuidToDelete, fromAutoSuggestedChip); @@ -1031,7 +1031,7 @@ } catch (e) { const err = e as ContextUploadErrorType; if (FILE_VALIDATION_ERRORS_MAP.has(err)) { - this.errorMessage = this.i18n(FILE_VALIDATION_ERRORS_MAP.get(err)!); + this.errorMessage_ = this.i18n(FILE_VALIDATION_ERRORS_MAP.get(err)!); } continue; } @@ -1048,8 +1048,8 @@ const announcer = getAnnouncerInstance(); announcer.announce(this.i18n('composeboxFileUploadStartedText')); } - this.files = - new Map([...this.files.entries(), ...composeboxFiles.entries()]); + this.files_ = + new Map([...this.files_.entries(), ...composeboxFiles.entries()]); this.recordFileValidationMetric_(ComposeboxFileValidationError.NONE); this.focusInput(); } @@ -1146,10 +1146,10 @@ } private onInputStateChanged_(inputState: InputState) { - this.inputState = inputState; + this.inputState_ = inputState; - const allowedTypes = this.inputState.allowedInputTypes; - this.files.forEach((file, uuid) => { + const allowedTypes = this.inputState_.allowedInputTypes; + this.files_.forEach((file, uuid) => { if (!allowedTypes.includes(file.inputType)) { this.deleteFile(uuid); } @@ -1201,10 +1201,12 @@ tabUpload.title, tabUpload.url, {supportsUnimodal: true}); - this.files = - new Map([...this.files.entries(), [attachment.uuid, attachment]]); - this.addedTabsIds = new Map( - [...this.addedTabsIds.entries(), [tabUpload.tabId, attachment.uuid]]); + this.files_ = + new Map([...this.files_.entries(), [attachment.uuid, attachment]]); + this.addedTabsIds_ = new Map([ + ...this.addedTabsIds_.entries(), + [tabUpload.tabId, attachment.uuid], + ]); // Do not reset pending active tab to avoid overwriting // synchronous "pending statuses" that are queued (since this function @@ -1219,7 +1221,7 @@ } catch (e) { const err = e as ContextUploadErrorType; if (FILE_VALIDATION_ERRORS_MAP.has(err)) { - this.errorMessage = this.i18n(FILE_VALIDATION_ERRORS_MAP.get(err)!); + this.errorMessage_ = this.i18n(FILE_VALIDATION_ERRORS_MAP.get(err)!); } return; } @@ -1301,7 +1303,7 @@ // TODO(crbug.com/466412331): Remove, only recorded for the NTP. this.fire( 'voice-search-action', {value: VoiceSearchAction.QUERY_SUBMITTED}); - this.input = e.detail; + this.input_ = e.detail; const metricName = `ContextualSearch.UserAction.SubmitVoiceQuery.${ this.composeboxSource_}`; recordUserAction(metricName); @@ -1314,7 +1316,7 @@ // If auto-submit is not enabled, update the input to the voice search // query, clear autocomplete matches, and recompute whether submission // should be enabled. - this.input = e.detail; + this.input_ = e.detail; this.queryAutocomplete_(/* clearMatches= */ true); this.submitEnabled_ = this.computeSubmitEnabled_(); await this.updateComplete; @@ -1383,8 +1385,8 @@ } private hasContent_(): boolean { - return this.inputState?.activeTool !== ComposeboxToolMode.kUnspecified || - this.input.trim().length > 0 || this.files.size > 0; + return this.inputState_?.activeTool !== ToolMode.kUnspecified || + this.input_.trim().length > 0 || this.files_.size > 0; } protected onLensClick_() { @@ -1405,85 +1407,89 @@ private updateInputPlaceholder_() { if (this.inputPlaceholderOverride) { - this.inputPlaceholder = this.inputPlaceholderOverride; + this.inputPlaceholder_ = this.inputPlaceholderOverride; return; } // The file hint should only be shown when there is context that was // deliberately added by the user (i.e. not the automatic active tab). - const isOnlyAutoTab = this.files.size === 1 && !!this.automaticActiveTab_; + const isOnlyAutoTab = this.files_.size === 1 && !!this.automaticActiveTab_; const shouldUseFileHint = this.enableFileHint && this.hasFiles() && !isOnlyAutoTab && - this.inputState?.activeTool === ComposeboxToolMode.kUnspecified; + this.inputState_?.activeTool === ToolMode.kUnspecified; if (shouldUseFileHint) { - if (this.files.size > 1) { - this.inputPlaceholder = this.i18n('composeboxHintTextAskAboutThese'); + if (this.files_.size > 1) { + this.inputPlaceholder_ = this.i18n('composeboxHintTextAskAboutThese'); return; } - const file = this.files.values().next().value!; + const file = this.files_.values().next().value!; if (file.type === 'tab') { - this.inputPlaceholder = this.i18n('composeboxHintTextAskAboutThisTab'); + this.inputPlaceholder_ = this.i18n('composeboxHintTextAskAboutThisTab'); return; } else if (file.type.includes('image')) { - this.inputPlaceholder = + this.inputPlaceholder_ = this.i18n('composeboxHintTextAskAboutThisImage'); return; } else if (file.type === 'pdf' || file.type === 'application/pdf') { - this.inputPlaceholder = this.i18n('composeboxHintTextAskAboutThisDoc'); + this.inputPlaceholder_ = this.i18n('composeboxHintTextAskAboutThisDoc'); return; } } - if (this.inputState) { - if (this.inputState.activeTool !== ComposeboxToolMode.kUnspecified) { - const config = this.inputState.toolConfigs.find( - c => c.tool === this.inputState!.activeTool); + if (this.inputState_) { + if (this.inputState_.activeTool !== ToolMode.kUnspecified) { + const config = this.inputState_.toolConfigs.find( + c => c.tool === this.inputState_!.activeTool); if (config?.hintText) { - this.inputPlaceholder = config.hintText; + this.inputPlaceholder_ = config.hintText; return; } } - if (this.inputState.activeModel !== ModelMode.kUnspecified) { - const config = this.inputState.modelConfigs.find( - c => c.model === this.inputState!.activeModel); + if (this.inputState_.activeModel !== ModelMode.kUnspecified) { + const config = this.inputState_.modelConfigs.find( + c => c.model === this.inputState_!.activeModel); if (config?.hintText) { - this.inputPlaceholder = config.hintText; + this.inputPlaceholder_ = config.hintText; return; } } - if (this.inputState.hintText) { - this.inputPlaceholder = this.inputState.hintText; + if (this.inputState_.hintText) { + this.inputPlaceholder_ = this.inputState_.hintText; return; } } - if (this.inputState?.activeTool === ComposeboxToolMode.kDeepSearch) { - this.inputPlaceholder = + if (this.inputState_?.activeTool === ToolMode.kDeepSearch) { + this.inputPlaceholder_ = loadTimeData.getString('composeDeepSearchPlaceholder'); - } else if (this.inputState?.activeTool === ComposeboxToolMode.kImageGen) { - this.inputPlaceholder = + } else if (this.inputState_?.activeTool === ToolMode.kImageGen) { + this.inputPlaceholder_ = loadTimeData.getString('composeCreateImagePlaceholder'); } else { - this.inputPlaceholder = + this.inputPlaceholder_ = loadTimeData.getString('searchboxComposePlaceholder'); } } - protected onToolClick_(e: CustomEvent<{toolMode: ComposeboxToolMode}>) { + get activeToolMode(): ToolMode { + return this.activeToolMode_; + } + + protected onToolClick_(e: CustomEvent<{toolMode: ToolMode}>) { this.handleToolClick_(e.detail.toolMode); } - protected handleToolClick_(tool: ComposeboxToolMode) { - const isTogglingOff = this.inputState?.activeTool === tool; + protected handleToolClick_(tool: ToolMode) { + const isTogglingOff = this.inputState_?.activeTool === tool; if (this.contextMenuDescriptionEnabled_) { this.showContextMenuDescription_ = - isTogglingOff || tool === ComposeboxToolMode.kUnspecified; + isTogglingOff || tool === ToolMode.kUnspecified; } - const newToolMode = isTogglingOff ? ComposeboxToolMode.kUnspecified : tool; + const newToolMode = isTogglingOff ? ToolMode.kUnspecified : tool; if (isTogglingOff) { const metricName = `ContextualSearch.UserAction.InputStateDeletion.Tool.${ @@ -1496,7 +1502,7 @@ this.handleToolModeUpdate_(newToolMode); } - private handleToolModeUpdate_(newTool: ComposeboxToolMode) { + private handleToolModeUpdate_(newTool: ToolMode) { this.searchboxHandler_.setActiveToolMode(newTool); this.queryAutocomplete_(/* clearMatches= */ true); this.updateInputPlaceholder_(); @@ -1509,14 +1515,14 @@ } protected onDismissErrorScrim_() { - this.errorMessage = ''; + this.errorMessage_ = ''; } // Sets the input property to compute the cancel button title without using // "$." syntax as this is not allowed in WillUpdate(). protected onInputInput_(e: Event) { const inputElement = e.target as HTMLInputElement; - this.input = inputElement.value; + this.input_ = inputElement.value; if (!this.disableCaretColorAnimation) { this.updateMirror_(); @@ -1531,12 +1537,12 @@ // If the composebox no flickering fix is enabled, stop the ACController // from querying for suggestions when the input is empty, but don't clear // the matches so the dropdown doesn't close. - if (this.input === '') { + if (this.input_ === '') { this.searchboxHandler_.stopAutocomplete(/*clearResult=*/ true); } this.queryAutocomplete_(/* clearMatches= */ false); } else { - this.queryAutocomplete_(/* clearMatches= */ this.input === ''); + this.queryAutocomplete_(/* clearMatches= */ this.input_ === ''); } } @@ -1548,7 +1554,7 @@ mirror.textContent = ''; - const chars = this.input.split(''); + const chars = this.input_.split(''); if (chars.length === 0) { const emptySpan = document.createElement('span'); @@ -1710,7 +1716,7 @@ if (e.shiftKey) { this.$.matches.unselect(); } else if (this.smartComposeEnabled_ && this.smartComposeInlineHint_) { - this.input = this.input + this.smartComposeInlineHint_; + this.input_ = this.input_ + this.smartComposeInlineHint_; this.smartComposeInlineHint_ = ''; e.preventDefault(); this.queryAutocomplete_(/* clearMatches= */ true); @@ -1839,7 +1845,7 @@ protected onSubmitContainerFocusin_() { // Matches should always be greater than 0 due to verbatim match. - if (this.input && !this.selectedMatch_) { + if (this.input_ && !this.selectedMatch_) { this.selectFirstMatch(); } } @@ -1847,7 +1853,7 @@ addSearchContext(context: SearchContext|null) { if (context) { if (context.input.length > 0) { - this.input = context.input; + this.input_ = context.input; } for (const attachment of context.attachments) { if (attachment.fileAttachment) { @@ -1859,13 +1865,13 @@ switch (context.toolMode) { case ToolMode.kDeepSearch: - this.handleToolModeUpdate_(ComposeboxToolMode.kDeepSearch); + this.handleToolModeUpdate_(ToolMode.kDeepSearch); break; - case ToolMode.kCreateImage: - this.handleToolModeUpdate_(ComposeboxToolMode.kImageGen); + case ToolMode.kImageGen: + this.handleToolModeUpdate_(ToolMode.kImageGen); break; case ToolMode.kCanvas: - this.handleToolModeUpdate_(ComposeboxToolMode.kCanvas); + this.handleToolModeUpdate_(ToolMode.kCanvas); break; default: } @@ -1880,7 +1886,7 @@ this.resetModes(); this.searchboxHandler_.clearFiles(/*shouldBlockAutoSuggestedTabs=*/ false); this.resetToolsAndModels(); - this.fire('close-composebox', {composeboxText: this.input}); + this.fire('close-composebox', {composeboxText: this.input_}); if (this.isCollapsible) { this.expanding_ = false; @@ -1927,8 +1933,8 @@ e.altKey, e.ctrlKey, e.metaKey, e.shiftKey); } else { this.searchboxHandler_.submitQuery( - this.input.trim(), (e as MouseEvent).button || 0, e.altKey, e.ctrlKey, - e.metaKey, e.shiftKey); + this.input_.trim(), (e as MouseEvent).button || 0, e.altKey, + e.ctrlKey, e.metaKey, e.shiftKey); } this.submitCleanup_(); @@ -1970,7 +1976,7 @@ } getFilesForTesting(): ComposeboxFile[] { - return [...this.files.values()]; + return [...this.files_.values()]; } getResultForTesting(): AutocompleteResult|null { @@ -2038,7 +2044,7 @@ if (firstMatch && firstMatch.allowedToBeDefaultMatch) { this.selectFirstMatch(); } else if ( - this.input.trim() && hasMatches && this.selectedMatchIndex_ >= 0 && + this.input_.trim() && hasMatches && this.selectedMatchIndex_ >= 0 && this.selectedMatchIndex_ < this.result_.matches.length) { // Restore the selection and update the input. Don't restore when the // user deletes all their input and autocomplete is queried or else the @@ -2049,7 +2055,7 @@ // (and therefore `selectedMatch_` does not get updated since // `onSelectedMatchIndexChanged_` is not called). this.selectedMatch_ = this.result_.matches[this.selectedMatchIndex_]!; - this.input = this.selectedMatch_.fillIntoEdit; + this.input_ = this.selectedMatch_.fillIntoEdit; } else { this.$.matches.unselect(); } @@ -2071,13 +2077,13 @@ const {file, errorMessage} = this.updateFileStatus_(token, status, errorType); if (errorMessage) { // `file` value is definitely stale. - this.errorMessage = errorMessage; + this.errorMessage_ = errorMessage; this.pendingUploads_.delete(token); this.fileUploadsComplete = this.pendingUploads_.size === 0; } else if (file) { // Treat `kUploadReplaced` like an error upload state // (like `kUploadFailed`. `kValidationFailed`, - // `kUploadExpired`), just without setting `errorMessage`. + // `kUploadExpired`), just without setting `errorMessage_`. // This means for `kUploadReplaced`, we do not fetch suggestions, // etc. if (file.status === ContextUploadStatus.kUploadReplaced) { @@ -2164,9 +2170,9 @@ if (clearMatches) { this.clearAutocompleteMatches(); } - this.lastQueriedInput_ = this.input; + this.lastQueriedInput_ = this.input_; this.haveReceivedAutcompleteResponse_ = false; - this.searchboxHandler_.queryAutocomplete(this.input, false); + this.searchboxHandler_.queryAutocomplete(this.input_, false); } clearAllInputs( @@ -2182,14 +2188,14 @@ this.resetModes(); } const undeletableFiles = - Array.from(this.files.values()).filter(file => !file.isDeletable); - if (undeletableFiles.length !== this.files.size) { - this.files = new Map(undeletableFiles.map(file => [file.uuid, file])); - this.addedTabsIds = new Map(undeletableFiles.filter(file => file.tabId) - .map(file => [file.tabId!, file.uuid])); + Array.from(this.files_.values()).filter(file => !file.isDeletable); + if (undeletableFiles.length !== this.files_.size) { + this.files_ = new Map(undeletableFiles.map(file => [file.uuid, file])); + this.addedTabsIds_ = new Map(undeletableFiles.filter(file => file.tabId) + .map(file => [file.tabId!, file.uuid])); } // Reset files in set to match remaining files in carousel. - this.setPendingUploads([...this.files.keys()]); + this.setPendingUploads([...this.files_.keys()]); this.smartComposeInlineHint_ = ''; if (!querySubmitted) { // If the query was submitted, the searchbox handler will clear its own @@ -2203,7 +2209,7 @@ } clearInput() { - this.input = ''; + this.input_ = ''; this.lastQueriedInput_ = ''; this.$.matches.unselect(); if (!this.disableCaretColorAnimation) { @@ -2213,11 +2219,11 @@ } getInputText(): string { - return this.input; + return this.input_; } getNumOfFilesForTesting(): number { - return this.files.size; + return this.files_.size; } private selectFirstMatch() { @@ -2238,7 +2244,7 @@ } protected hasImageFiles_() { - return Array.from(this.files.values()) + return Array.from(this.files_.values()) .some(file => file.type.includes('image')); } @@ -2247,9 +2253,9 @@ // contrasts with the workflows where the frontend starts a file upload flow // (`addFileContext_`). private onFileContextAdded_(file: ComposeboxFile) { - const newFiles = new Map(this.files); + const newFiles = new Map(this.files_); newFiles.set(file.uuid, file); - this.files = newFiles; + this.files_ = newFiles; this.addToPendingUploads_(file.uuid); } @@ -2263,29 +2269,29 @@ switch (error) { case ProcessFilesError.MAX_FILES_EXCEEDED: metric = ComposeboxFileValidationError.TOO_MANY_FILES; - this.errorMessage = this.i18n('maxFilesReachedError'); + this.errorMessage_ = this.i18n('maxFilesReachedError'); break; case ProcessFilesError.MAX_IMAGES_EXCEEDED: metric = ComposeboxFileValidationError.TOO_MANY_FILES; - this.errorMessage = this.i18n('maxImagesReachedError'); + this.errorMessage_ = this.i18n('maxImagesReachedError'); break; case ProcessFilesError.MAX_PDFS_EXCEEDED: metric = ComposeboxFileValidationError.TOO_MANY_FILES; - this.errorMessage = this.i18n('maxPdfsReachedError'); + this.errorMessage_ = this.i18n('maxPdfsReachedError'); break; case ProcessFilesError.FILE_EMPTY: metric = ComposeboxFileValidationError.FILE_EMPTY; - this.errorMessage = this.i18n('composeboxFileUploadInvalidEmptySize'); + this.errorMessage_ = this.i18n('composeboxFileUploadInvalidEmptySize'); break; case ProcessFilesError.FILE_TOO_LARGE: metric = ComposeboxFileValidationError.FILE_SIZE_TOO_LARGE; - this.errorMessage = this.i18n('composeboxFileUploadInvalidTooLarge'); + this.errorMessage_ = this.i18n('composeboxFileUploadInvalidTooLarge'); break; case ProcessFilesError.INVALID_TYPE: - this.errorMessage = this.i18n('composeFileTypesAllowedError'); + this.errorMessage_ = this.i18n('composeFileTypesAllowedError'); break; case ProcessFilesError.FILE_UPLOAD_NOT_ALLOWED: - this.errorMessage = this.i18n('composeboxFileUploadNotAllowed'); + this.errorMessage_ = this.i18n('composeboxFileUploadNotAllowed'); break; default: break; @@ -2299,14 +2305,18 @@ token: UnguessableToken, status: ContextUploadStatus, errorType: ContextUploadErrorType|null) { let errorMessage = null; - let file = this.files.get(token); + let file = this.files_.get(token); if (file) { - if (isTerminalState(status) && - status !== ContextUploadStatus.kUploadSuccessful) { - this.files.delete(token); + if ([ + ContextUploadStatus.kValidationFailed, + ContextUploadStatus.kUploadFailed, + ContextUploadStatus.kUploadExpired, + ContextUploadStatus.kUploadReplaced, + ].includes(status)) { + this.files_.delete(token); if (file.tabId) { - this.addedTabsIds = new Map([...this.addedTabsIds.entries()].filter( + this.addedTabsIds_ = new Map([...this.addedTabsIds_.entries()].filter( ([id, _]) => id !== file!.tabId)); } switch (status) { @@ -2339,9 +2349,9 @@ this.closeMenu_(); } else { file = {...file, status: status}; - this.files.set(token, file); + this.files_.set(token, file); } - this.files = new Map([...this.files]); + this.files_ = new Map([...this.files_]); } else { // File is unknown but its status is known. Show this if // ghost/unknown files in frontend are allowed to be in @@ -2375,7 +2385,7 @@ if (!files || files.length === 0) { return; } - if (this.inputState?.activeTool === ComposeboxToolMode.kDeepSearch) { + if (this.inputState_?.activeTool === ToolMode.kDeepSearch) { this.handleProcessFilesError_(ProcessFilesError.FILE_UPLOAD_NOT_ALLOWED); return; } @@ -2388,16 +2398,16 @@ counts.set(InputType.kLensFile, 0); counts.set(InputType.kBrowserTab, 0); - for (const file of this.files.values()) { + for (const file of this.files_.values()) { const type = this.getInputType_(file.type); counts.set(type, (counts.get(type) || 0) + 1); } - let totalCount = this.files.size; + let totalCount = this.files_.size; let maxTotal = this.maxFileCount_; - if (this.inputState && this.inputState.maxTotalInputs > 0) { - maxTotal = this.inputState.maxTotalInputs; + if (this.inputState_ && this.inputState_.maxTotalInputs > 0) { + maxTotal = this.inputState_.maxTotalInputs; } if (totalCount + files.length > maxTotal) { @@ -2406,8 +2416,8 @@ for (const file of files) { const inputType = this.getInputType_(file.type); - if (this.inputState?.activeTool !== ComposeboxToolMode.kUnspecified) { - const disabledTypes = this.inputState?.disabledInputTypes || []; + if (this.inputState_?.activeTool !== ToolMode.kUnspecified) { + const disabledTypes = this.inputState_?.disabledInputTypes || []; if (disabledTypes.includes(inputType)) { errorToDisplay = Math.max(errorToDisplay, ProcessFilesError.INVALID_TYPE); @@ -2429,9 +2439,9 @@ } let maxType = maxTotal; - if (this.inputState && - this.inputState.maxInputsByType[inputType] !== undefined) { - maxType = this.inputState.maxInputsByType[inputType]; + if (this.inputState_ && + this.inputState_.maxInputsByType[inputType] !== undefined) { + maxType = this.inputState_.maxInputsByType[inputType]; } const currentTypeCount = counts.get(inputType) || 0; @@ -2490,7 +2500,7 @@ this.handleProcessFilesError_(ProcessFilesError.INVALID_TYPE); return; } - const pendingStatus = this.files.get(fileAttachment.uuid)?.status; + const pendingStatus = this.files_.get(fileAttachment.uuid)?.status; const composeboxFile = ComposeboxFile.createFromFile( fileAttachment.uuid as unknown as UnguessableToken, {name: fileAttachment.name, type: fileAttachment.mimeType}, @@ -2563,6 +2573,7 @@ this.automaticActiveTab_ = file; } + updateAutoSuggestedTabContextForTesting(tab: TabInfo|null) { this.updateAutoSuggestedTabContext_(tab); }
diff --git a/ui/webui/resources/cr_components/composebox/composebox_context_menu.html.ts b/ui/webui/resources/cr_components/composebox/composebox_context_menu.html.ts index 1709014..27ea90c 100644 --- a/ui/webui/resources/cr_components/composebox/composebox_context_menu.html.ts +++ b/ui/webui/resources/cr_components/composebox/composebox_context_menu.html.ts
@@ -4,9 +4,8 @@ import {html} from '//resources/lit/v3_0/lit.rollup.js'; -import {ToolMode as ComposeboxToolMode} from './composebox_query.mojom-webui.js'; import type {ComposeboxElement} from './composebox.js'; -import {getHtml as getSubmitButtonHtml} from './composebox_submit_button.html.js'; +import {ToolMode} from './composebox_query.mojom-webui.js'; export function getHtml(this: ComposeboxElement) { // clang-format off @@ -29,14 +28,14 @@ @context-menu-closed="${this.onContextMenuClosed_ }" @context-menu-opened="${this.onContextMenuOpened_}" .showModelPicker="${this.showModelPicker_}" - .inputState="${this.inputState}" + .inputState="${this.inputState_}" .searchboxLayoutMode="${this.searchboxLayoutMode}" .tabSuggestions="${this.tabSuggestions_}" .inCreateImageMode="${ - this.inputState?.activeTool === ComposeboxToolMode.kImageGen}" + this.inputState_?.activeTool === ToolMode.kImageGen}" .hasImageFiles="${this.hasImageFiles_()}" - .disabledTabIds="${this.addedTabsIds}" - .fileNum="${this.files.size}" + .disabledTabIds="${this.addedTabsIds_}" + .fileNum="${this.files_.size}" ?upload-button-disabled="${this.uploadButtonDisabled_}" ?show-context-menu-description="${this.showContextMenuDescription_}"> </cr-composebox-contextual-entrypoint-and-menu> @@ -46,7 +45,7 @@ part="composebox-entrypoint" exportparts="context-menu-entrypoint-icon" class="upload-button no-overlap" - .inputState="${this.inputState}" + .inputState="${this.inputState_}" ?upload-button-disabled="${this.uploadButtonDisabled_}" ?show-context-menu-description="${this.showContextMenuDescription_}"> </cr-composebox-contextual-entrypoint-button> @@ -62,23 +61,11 @@ ${this.inToolMode_ ? html` <cr-composebox-tool-chip exportparts="tool-chip-label" - .inputState="${this.inputState}" + .inputState="${this.inputState_}" @tool-click="${this.onToolClick_}"> </cr-composebox-tool-chip> ` : ''} ` : ''} - ${this.searchboxLayoutMode === 'TallTopContext' ? html` - ${this.shouldShowVoiceSearch_() ? html` - <cr-icon-button id="voiceSearchButton" class="voice-icon" - part="voice-icon" iron-icon="cr:mic" - @click="${this.onVoiceSearchButtonClick_}" - title="${this.i18n('voiceSearchButtonLabel')}"> - </cr-icon-button> - ` : ''} - ${this.shouldShowSubmitButton_ ? html` - ${getSubmitButtonHtml.bind(this)()} - ` : ''} - ` : ''} </div> `; // clang-format on
diff --git a/ui/webui/resources/cr_components/composebox/composebox_mixin.ts b/ui/webui/resources/cr_components/composebox/composebox_mixin.ts index a4babc4..b11dfd3 100644 --- a/ui/webui/resources/cr_components/composebox/composebox_mixin.ts +++ b/ui/webui/resources/cr_components/composebox/composebox_mixin.ts
@@ -2,12 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import {assertNotReached} from '//resources/js/assert.js'; import {loadTimeData} from '//resources/js/load_time_data.js'; import type {CrLitElement} from '//resources/lit/v3_0/lit.rollup.js'; import type {UnguessableToken} from '//resources/mojo/mojo/public/mojom/base/unguessable_token.mojom-webui.js'; import type {ComposeboxFile} from './common.js'; -import {ToolMode as ComposeboxToolMode} from './composebox_query.mojom-webui.js'; +import type {ComposeboxInputElement} from './composebox_input.js'; +import {ToolMode} from './composebox_query.mojom-webui.js'; import type {InputState} from './composebox_query.mojom-webui.js'; type Constructor<T> = new (...args: any[]) => T; @@ -29,8 +31,7 @@ }; } - accessor activeToolMode: ComposeboxToolMode = - ComposeboxToolMode.kUnspecified; + accessor activeToolMode: ToolMode = ToolMode.kUnspecified; accessor addedTabsIds: Map<number, UnguessableToken> = new Map(); accessor errorMessage: string = ''; accessor files: Map<UnguessableToken, ComposeboxFile> = new Map(); @@ -38,17 +39,23 @@ accessor inputPlaceholder: string = loadTimeData.getString('searchboxComposePlaceholder'); accessor inputState: InputState|null = null; + + getInputElement(): ComposeboxInputElement { + assertNotReached(); + } } return ComposeboxEmbedderMixin; }; export interface ComposeboxEmbedderMixinInterface { - activeToolMode: ComposeboxToolMode; + activeToolMode: ToolMode; addedTabsIds: Map<number, UnguessableToken>; errorMessage: string; files: Map<UnguessableToken, ComposeboxFile>; input: string; inputPlaceholder: string; inputState: InputState|null; + + getInputElement(): ComposeboxInputElement; }
diff --git a/ui/webui/resources/cr_components/searchbox/searchbox.css b/ui/webui/resources/cr_components/searchbox/searchbox.css index 4a09b4ff..7cfe4a4 100644 --- a/ui/webui/resources/cr_components/searchbox/searchbox.css +++ b/ui/webui/resources/cr_components/searchbox/searchbox.css
@@ -392,10 +392,6 @@ --cr-button-height: 36px; } -:host-context([searchbox-layout-mode='TallTopContext']) .carousel-divider { - margin-top: 10px; -} - :host([searchbox-layout-mode='Compact']) { --cr-searchbox-border-radius: 30px; --cr-searchbox-dropdown-padding-bottom: 10px;
diff --git a/url/android/gurl_android.cc b/url/android/gurl_android.cc index 8c0cbe88..332ccab 100644 --- a/url/android/gurl_android.cc +++ b/url/android/gurl_android.cc
@@ -64,14 +64,14 @@ // static ScopedJavaLocalRef<JGURL> GURLAndroid::FromNativeGURL(JNIEnv* env, const GURL& gurl) { - ScopedJavaLocalRef<JGURL> j_gurl = JGURLJni::New(env); + ScopedJavaLocalRef<JGURL> j_gurl = GURLJni::New(env); InitFromGURL(env, gurl, j_gurl); return j_gurl; } // static ScopedJavaLocalRef<JGURL> GURLAndroid::EmptyGURL(JNIEnv* env) { - return JGURLJni::emptyGURL(env); + return GURLJni::emptyGURL(env); } static void JNI_GURL_GetOrigin(JNIEnv* env,
diff --git a/url/android/origin_android.cc b/url/android/origin_android.cc index 81d831b..a0f97021 100644 --- a/url/android/origin_android.cc +++ b/url/android/origin_android.cc
@@ -28,9 +28,9 @@ base::android::ScopedJavaLocalRef<JOrigin> Origin::ToJavaObject( JNIEnv* env) const { const base::UnguessableToken* token = GetNonceForSerialization(); - return JOriginJni::New(env, tuple_.scheme(), tuple_.host(), tuple_.port(), - opaque(), token ? token->GetHighForSerialization() : 0, - token ? token->GetLowForSerialization() : 0); + return OriginJni::New(env, tuple_.scheme(), tuple_.host(), tuple_.port(), + opaque(), token ? token->GetHighForSerialization() : 0, + token ? token->GetLowForSerialization() : 0); } // static
diff --git a/url/android/parsed_android.cc b/url/android/parsed_android.cc index 8caa116..91add65 100644 --- a/url/android/parsed_android.cc +++ b/url/android/parsed_android.cc
@@ -29,7 +29,7 @@ (!is_signed && sizeof(int32_t) > offset_size), "Java size offsets for Parsed Components must be large enough " "to store the full C++ offset."); - return JParsedJni::New( + return ParsedJni::New( env, parsed.scheme.begin, parsed.scheme.len, parsed.username.begin, parsed.username.len, parsed.password.begin, parsed.password.len, parsed.host.begin, parsed.host.len, parsed.port.begin, parsed.port.len,
diff --git a/v8 b/v8 index 10ddc71..33e9c15 160000 --- a/v8 +++ b/v8
@@ -1 +1 @@ -Subproject commit 10ddc719896016bd984d3c44e068eb2c6d6dcde6 +Subproject commit 33e9c15f2a2674c85af2869b2d7f46245eff8ac1