diff --git a/.clang-tidy b/.clang-tidy index 982be9b2..75505982 100644 --- a/.clang-tidy +++ b/.clang-tidy
@@ -1,6 +1,7 @@ --- Checks: '-*, bugprone-argument-comment, + bugprone-assert-side-effect, bugprone-dangling-handle, bugprone-inaccurate-erase, bugprone-string-constructor, @@ -29,6 +30,8 @@ modernize-use-transparent-functors, readability-redundant-member-init' CheckOptions: + - key: bugprone-assert-side-effect.AssertMacros + value: assert,DCHECK - key: bugprone-dangling-handle.HandleClasses value: ::std::basic_string_view;::std::span;::absl::string_view;::base::BasicStringPiece;::base::span - key: bugprone-string-constructor.StringNames
diff --git a/DEPS b/DEPS index c9d149c0..82da2461 100644 --- a/DEPS +++ b/DEPS
@@ -238,7 +238,7 @@ 'dawn_standalone': False, # reclient CIPD package version - 'reclient_version': 're_client_version:0.54.0.741c1ca-gomaip', + 'reclient_version': 're_client_version:0.57.0.4865132-gomaip', 'android_git': 'https://android.googlesource.com', 'aomedia_git': 'https://aomedia.googlesource.com', @@ -253,7 +253,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '4bd442901f81e1ce273e925cefcb129edf63087b', + 'skia_revision': 'c444394841139218d26be2b12e5953246a26fda7', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -261,7 +261,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': '98bb4f32ded001ead85c6e1480e319163c3720de', + 'angle_revision': 'b465a7366cb82a1be0bca5c4508eef7157363843', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -320,7 +320,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '8ff5321b11a8dadc44aa7ba9fdc3707377417a5a', + 'catapult_revision': '4cc26bd5a059cf275feff2c934f744617dd26e8c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -328,7 +328,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': '935ee90b0e7af9226c2d1ab3f55abcb3acf5206c', + 'devtools_frontend_revision': 'b2a3923617328a970bf07eca721bb8f6ad9c4574', # 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. @@ -368,7 +368,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': 'd87602df93241ee6358c205eb54b0d4126522fc8', + 'dawn_revision': '80b94d13a707ccf941b4e36bb18b120285db33c8', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -1510,7 +1510,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'deac2d35a18ac8a216f70607fcbfe6615445869f', + Var('android_git') + '/platform/external/perfetto.git' + '@' + 'a2dabf80a38b16846d9a3209d61f452a1bfc8f15', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1801,7 +1801,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@20b24fae349fffbb203cceb4baaf7f4b8a437e75', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@84b3be6df03d468145962a5239d27da83ccd3e14', 'condition': 'checkout_src_internal', }, @@ -1831,7 +1831,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'u67vrrhNviCfWBV4S_3DgdPbceF4ciF4jNJUV3vlrskC', + 'version': '_fsfATiokrgU562IXkEUlu49ttGo2GP6B_3KMV4YGj8C', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -1842,7 +1842,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'y5viY342EESJm7wfhkfW4AqG8rAi-M57CDJcTtztnukC', + 'version': '74VBtd9mFKuJjJ4wsplDS7Av21ogn2oCHw3eTIqwGnwC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -3880,29 +3880,15 @@ ], }, { - 'name': 'clang_format_mac_x64', + 'name': 'clang_format_mac', 'pattern': '.', - 'condition': 'host_os == "mac" and host_cpu == "x64"', + 'condition': 'host_os == "mac"', 'action': [ 'python3', 'src/third_party/depot_tools/download_from_google_storage.py', '--no_resume', '--no_auth', '--bucket', 'chromium-clang-format', - '-s', 'src/buildtools/mac/clang-format.x64.sha1', - '-o', 'clang-format', - ], - }, - { - 'name': 'clang_format_mac_arm64', - 'pattern': '.', - 'condition': 'host_os == "mac" and host_cpu == "arm64"', - 'action': [ 'python3', - 'src/third_party/depot_tools/download_from_google_storage.py', - '--no_resume', - '--no_auth', - '--bucket', 'chromium-clang-format', - '-s', 'src/buildtools/mac/clang-format.arm64.sha1', - '-o', 'clang-format', + '-s', 'src/buildtools/mac/clang-format.sha1', ], }, {
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn index 6045ffa..3a5df0d 100644 --- a/android_webview/BUILD.gn +++ b/android_webview/BUILD.gn
@@ -448,6 +448,7 @@ java_group("android_webview_no_weblayer_java") { deps = [ ":browser_java", + ":js_sandbox_service_java", # This includes AwResource, which may be called via JNI. We're including it # here because there's currently no good way to enforce that it gets included @@ -750,27 +751,42 @@ srcjar_deps = [ ":js_sandbox_aidl" ] } -android_library("js_sandbox_java") { +android_library("js_sandbox_service_java") { sources = [ - "java/src/org/chromium/android_webview/js/browser/AwJsContext.java", - "java/src/org/chromium/android_webview/js/browser/AwJsSandbox.java", - "java/src/org/chromium/android_webview/js/common/ExecutionErrorTypes.java", "java/src/org/chromium/android_webview/js/renderer/JsSandboxContext.java", "java/src/org/chromium/android_webview/js/renderer/JsSandboxService.java", + "java/src/org/chromium/android_webview/js/renderer/JsSandboxService0.java", ] deps = [ ":js_sandbox_aidl_java", ":js_sandbox_jni_headers", - "//android_webview/glue:glue_java", "//base:base_java", "//base:jni_java", "//third_party/android_deps:com_google_code_findbugs_jsr305_java", "//third_party/androidx:androidx_annotation_annotation_java", ] + annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] } +android_library("js_sandbox_java") { + sources = [ + "java/src/org/chromium/android_webview/js/browser/AwJsContext.java", + "java/src/org/chromium/android_webview/js/browser/AwJsSandbox.java", + "java/src/org/chromium/android_webview/js/common/ExecutionErrorTypes.java", + ] + + deps = [ + ":js_sandbox_aidl_java", + ":js_sandbox_service_java", + "//android_webview/glue:glue_java", + "//base:base_java", + "//third_party/android_deps:com_google_code_findbugs_jsr305_java", + "//third_party/androidx:androidx_annotation_annotation_java", + ] +} + # This target compiles the implementation of PlatformServiceBridge for AOSP targets. android_library("platform_service_bridge_upstream_implementation_java") { sources = [ "java/src/org/chromium/android_webview/common/PlatformServiceBridgeImpl.java" ]
diff --git a/android_webview/expectations/system_webview_bundle.AndroidManifest.expected b/android_webview/expectations/system_webview_bundle.AndroidManifest.expected index 1e15014..c094813 100644 --- a/android_webview/expectations/system_webview_bundle.AndroidManifest.expected +++ b/android_webview/expectations/system_webview_bundle.AndroidManifest.expected
@@ -102,6 +102,14 @@ android:name="com.google.android.gms.cast.framework.media.MediaNotificationService" android:exported="false"> </service> # DIFF-ANCHOR: 48ce9d28 + <service # DIFF-ANCHOR: 8520a49e + android:name="org.chromium.android_webview.js.renderer.JsSandboxService0" + android:exported="true" + android:externalService="true" + android:isolatedProcess="true" + android:process=":js_sandboxed_process0" + android:visibleToInstantApps="true"> + </service> # DIFF-ANCHOR: 8520a49e <service # DIFF-ANCHOR: b9ec52c4 android:name="org.chromium.android_webview.nonembedded.AwComponentUpdateService" android:exported="false"
diff --git a/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected b/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected index 9b40ada9..0f3a057 100644 --- a/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected +++ b/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected
@@ -102,6 +102,14 @@ android:name="com.google.android.gms.cast.framework.media.MediaNotificationService" android:exported="false"> </service> # DIFF-ANCHOR: 48ce9d28 + <service # DIFF-ANCHOR: 8520a49e + android:name="org.chromium.android_webview.js.renderer.JsSandboxService0" + android:exported="true" + android:externalService="true" + android:isolatedProcess="true" + android:process=":js_sandboxed_process0" + android:visibleToInstantApps="true"> + </service> # DIFF-ANCHOR: 8520a49e <service # DIFF-ANCHOR: b9ec52c4 android:name="org.chromium.android_webview.nonembedded.AwComponentUpdateService" android:exported="false"
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 7b7e98f..4b124688 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
@@ -298,5 +298,7 @@ "Collects metrics on when the User-Agent string is overridden and how"), Flag.baseFeature(GpuFeatures.CANVAS_CONTEXT_LOST_IN_BACKGROUND, "Free Canvas2D resources when the webview is in the background."), + Flag.baseFeature(VizFeatures.SURFACE_SYNC_THROTTLING, + "Enables throttling of Surface Sync to improve rotations"), }; }
diff --git a/android_webview/java/src/org/chromium/android_webview/js/browser/AwJsSandbox.java b/android_webview/java/src/org/chromium/android_webview/js/browser/AwJsSandbox.java index b7d8242..4b83c7b 100644 --- a/android_webview/java/src/org/chromium/android_webview/js/browser/AwJsSandbox.java +++ b/android_webview/java/src/org/chromium/android_webview/js/browser/AwJsSandbox.java
@@ -13,7 +13,7 @@ import org.chromium.android_webview.js.common.IJsSandboxContext; import org.chromium.android_webview.js.common.IJsSandboxService; -import org.chromium.android_webview.js.renderer.JsSandboxService; +import org.chromium.android_webview.js.renderer.JsSandboxService0; import org.chromium.base.ContextUtils; /** @@ -65,7 +65,7 @@ * @param callback used to pass a callback function on creation of object. */ public static void newConnectedInstance(ReadyCallback callback) { - Intent intent = new Intent(ContextUtils.getApplicationContext(), JsSandboxService.class); + Intent intent = new Intent(ContextUtils.getApplicationContext(), JsSandboxService0.class); ConnectionSetup connectionSetup = new ConnectionSetup(callback); boolean isBinding = ContextUtils.getApplicationContext().bindService( intent, connectionSetup, Context.BIND_AUTO_CREATE);
diff --git a/android_webview/java/src/org/chromium/android_webview/js/renderer/JsSandboxService0.java b/android_webview/java/src/org/chromium/android_webview/js/renderer/JsSandboxService0.java new file mode 100644 index 0000000..782040c --- /dev/null +++ b/android_webview/java/src/org/chromium/android_webview/js/renderer/JsSandboxService0.java
@@ -0,0 +1,8 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.android_webview.js.renderer; + +/** Hardcoded numbered subclass to support multiple services later on */ +public class JsSandboxService0 extends JsSandboxService {}
diff --git a/android_webview/lib/BUILD.gn b/android_webview/lib/BUILD.gn index f46521b..61c09f3 100644 --- a/android_webview/lib/BUILD.gn +++ b/android_webview/lib/BUILD.gn
@@ -20,6 +20,7 @@ "//android_webview/common", "//android_webview/gpu", "//android_webview/renderer", + "//android_webview/renderer/js_sandbox:js_sandbox", "//base", "//cc/base", "//components/autofill/core/common",
diff --git a/android_webview/nonembedded/BUILD.gn b/android_webview/nonembedded/BUILD.gn index 9c4b3d73..e691b7d 100644 --- a/android_webview/nonembedded/BUILD.gn +++ b/android_webview/nonembedded/BUILD.gn
@@ -50,6 +50,7 @@ "//ui/android:ui_no_recycler_view_java", "//url:gurl_java", ] + annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] } @@ -161,7 +162,7 @@ "//android_webview/common", "//base", "//components/component_updater", - "//components/component_updater/installer_policies", + "//components/component_updater/installer_policies:installer_policies_no_content_deps", "//components/prefs", "//components/update_client", "//components/update_client:in_process_patcher", @@ -174,6 +175,9 @@ # Called via JNI by LicenseContentProvider in :nonembedded_java. "//components/about_ui:about_ui_android", ] + + # Disallow depending on content. + assert_no_deps = [ "//content/public" ] } # WebView icon used by upstream SystemWebView and Trichrome.
diff --git a/android_webview/nonembedded/DEPS b/android_webview/nonembedded/DEPS index e187d375..7e7a8b9 100644 --- a/android_webview/nonembedded/DEPS +++ b/android_webview/nonembedded/DEPS
@@ -1,4 +1,7 @@ include_rules = [ + # nonembedded WebView can't depend on //content layer. + "-content", + "+components/component_updater", "+components/crash/android", "+components/update_client",
diff --git a/android_webview/nonembedded/java/AndroidManifest.xml b/android_webview/nonembedded/java/AndroidManifest.xml index 6b1c677d..1ef875d9 100644 --- a/android_webview/nonembedded/java/AndroidManifest.xml +++ b/android_webview/nonembedded/java/AndroidManifest.xml
@@ -166,6 +166,14 @@ android:visibleToInstantApps="true" android:process=":webview_service" {# Explicit process required for monochrome compatibility. #} tools:ignore="ExportedService" /> + <!-- JS Execution Sandbox --> + <service android:name="org.chromium.android_webview.js.renderer.JsSandboxService0" + android:process=":js_sandboxed_process0" + android:isolatedProcess="true" + android:exported="true" + android:externalService="true" + tools:ignore="ExportedService" + android:visibleToInstantApps="true" /> {% endif %} {% endmacro %} {{ common(manifest_package|default('com.android.webview'), library|default('libwebviewchromium.so')) }}
diff --git a/android_webview/test/shell/AndroidManifest.xml b/android_webview/test/shell/AndroidManifest.xml index 351fe87..a2e0397f 100644 --- a/android_webview/test/shell/AndroidManifest.xml +++ b/android_webview/test/shell/AndroidManifest.xml
@@ -70,7 +70,7 @@ <meta-data android:name="org.chromium.content.browser.NUM_PRIVILEGED_SERVICES" android:value="0"/> <!-- JS Execution Sandbox --> - <service android:name="org.chromium.android_webview.js.renderer.JsSandboxService" + <service android:name="org.chromium.android_webview.js.renderer.JsSandboxService0" android:process=":js_sandboxed_process0" android:isolatedProcess="true" android:exported="false" />
diff --git a/ash/app_list/views/continue_section_view.cc b/ash/app_list/views/continue_section_view.cc index bf4a5095..2cde90d 100644 --- a/ash/app_list/views/continue_section_view.cc +++ b/ash/app_list/views/continue_section_view.cc
@@ -209,20 +209,12 @@ nudge_controller_->SetPrivacyNoticeAcceptedPref(true); nudge_controller_->SetPrivacyNoticeShown(false); } - - // Keep the privacy notice view for the dismiss animation in clamshell mode. - if (tablet_mode_) { - RemovePrivacyNotice(); - } else { - AnimateDismissToast( - base::BindRepeating(&ContinueSectionView::AnimateShowContinueSection, - weak_ptr_factory_.GetWeakPtr())); - } + AnimateDismissToast( + base::BindRepeating(&ContinueSectionView::AnimateShowContinueSection, + weak_ptr_factory_.GetWeakPtr())); } void ContinueSectionView::AnimateDismissToast(base::RepeatingClosure callback) { - DCHECK(!tablet_mode_); - PrepareForLayerAnimation(privacy_toast_); views::AnimationBuilder animation_builder; @@ -253,12 +245,9 @@ } void ContinueSectionView::AnimateShowContinueSection() { - DCHECK(!tablet_mode_); + int height_difference = privacy_toast_->GetPreferredSize().height() - + suggestions_container_->GetPreferredSize().height(); - const int height_difference = - privacy_toast_->GetPreferredSize().height() - - (suggestions_container_->GetPreferredSize().height() + - continue_label_->GetPreferredSize().height()); const gfx::Tween::Type animation_tween = gfx::Tween::ACCEL_40_DECEL_100_3; // The initial position for the launcher continue section should be right @@ -266,10 +255,13 @@ gfx::Transform initial_transform; initial_transform.Translate(0, -kVerticalPaddingFromParent); - PrepareForLayerAnimation(continue_label_); - continue_label_->SetVisible(true); - continue_label_->layer()->SetOpacity(0); - continue_label_->layer()->SetTransform(initial_transform); + if (continue_label_) { + height_difference -= continue_label_->GetPreferredSize().height(); + PrepareForLayerAnimation(continue_label_); + continue_label_->SetVisible(true); + continue_label_->layer()->SetOpacity(0); + continue_label_->layer()->SetTransform(initial_transform); + } PrepareForLayerAnimation(suggestions_container_); suggestions_container_->layer()->SetTransform(initial_transform); @@ -283,20 +275,29 @@ AnimateSlideLauncherContent(height_difference); - auto cleanup = base::BindRepeating(&CleanupLayer, continue_label_); + auto cleanup = continue_label_ + ? base::BindRepeating(&CleanupLayer, continue_label_) + : base::DoNothing(); views::AnimationBuilder animation_builder; animation_builder.OnEnded(cleanup); animation_builder.OnAborted(cleanup); + animation_builder.SetPreemptionStrategy( + ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); + animation_builder.Once(); - animation_builder - .SetPreemptionStrategy( - ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET) - .Once() - .SetOpacity(continue_label_, 1.0, animation_tween) - .SetTransform(continue_label_, gfx::Transform(), animation_tween) - .SetTransform(suggestions_container_, gfx::Transform(), animation_tween) - .SetDuration(kShowSuggestionsAnimationDuration); + animation_builder.GetCurrentSequence().SetTransform( + suggestions_container_, gfx::Transform(), animation_tween); + + if (continue_label_) { + animation_builder.GetCurrentSequence().SetOpacity(continue_label_, 1.0, + animation_tween); + animation_builder.GetCurrentSequence().SetTransform( + continue_label_, gfx::Transform(), animation_tween); + } + + animation_builder.GetCurrentSequence().SetDuration( + kShowSuggestionsAnimationDuration); } void ContinueSectionView::RemovePrivacyNotice() {
diff --git a/ash/app_list/views/continue_section_view_unittest.cc b/ash/app_list/views/continue_section_view_unittest.cc index a424aec..d845cf78 100644 --- a/ash/app_list/views/continue_section_view_unittest.cc +++ b/ash/app_list/views/continue_section_view_unittest.cc
@@ -1992,7 +1992,7 @@ EXPECT_FALSE(GetContinueSectionView()->GetVisible()); } -TEST_F(ContinueSectionViewClamshellModeTest, AnimatesPrivacyNoticeAccept) { +TEST_P(ContinueSectionViewTest, AnimatesPrivacyNoticeAccept) { ResetPrivacyNoticePref(); InitializeForAnimationTest(/*result_count=*/3);
diff --git a/ash/app_list/views/continue_task_container_view.cc b/ash/app_list/views/continue_task_container_view.cc index 0526022..b2d750ad 100644 --- a/ash/app_list/views/continue_task_container_view.cc +++ b/ash/app_list/views/continue_task_container_view.cc
@@ -429,20 +429,19 @@ int available_space, base::TimeDelta duration, gfx::Tween::Type tween) { - DCHECK(!tablet_mode_); - DCHECK(columns_); - SetVisible(true); const int rows = - std::ceil(static_cast<double>(suggestion_tasks_views_.size()) / columns_); + columns_ ? std::ceil(static_cast<double>(suggestion_tasks_views_.size()) / + columns_) + : 1; double space_per_row = static_cast<double>(available_space) / rows; for (size_t i = 0; i < suggestion_tasks_views_.size(); i++) { views::View* view = suggestion_tasks_views_[i]; gfx::Transform translation; - int row_number = (i / columns_) + 1; + int row_number = columns_ ? ((i / columns_) + 1) : 1; // Distribute the space between the elements so that the space between the // previous element in the parent view and the first row is the same as the // space between rows. The items in the first row will just be translated by @@ -452,6 +451,7 @@ translation.Translate(0, space_per_row * row_number); view->layer()->SetTransform(translation); + view->layer()->SetOpacity(0.0f); } views::AnimationBuilder animation_builder; animation_builder.Once().SetDuration(duration);
diff --git a/ash/app_list/views/paged_apps_grid_view.cc b/ash/app_list/views/paged_apps_grid_view.cc index 536d74b8..9091a9f 100644 --- a/ash/app_list/views/paged_apps_grid_view.cc +++ b/ash/app_list/views/paged_apps_grid_view.cc
@@ -1178,6 +1178,10 @@ return settings; }; + // Apps might be animating due to drag reorder. Cancel any active animations + // so that the cardified state animation can be applied. + bounds_animator()->Cancel(); + gfx::Vector2d translate_offset( 0, start_position.y() - items_container()->origin().y()); for (int i = 0; i < view_model()->view_size(); ++i) {
diff --git a/ash/components/policy/OWNERS b/ash/components/policy/OWNERS index cc5d491..5bfa765 100644 --- a/ash/components/policy/OWNERS +++ b/ash/components/policy/OWNERS
@@ -6,8 +6,6 @@ # http://google3/chrome/enterprise/gwsq/enterprise-policy-review.gwsq anqing@chromium.org antrim@chromium.org -atwilson@chromium.org -bartfab@chromium.org emaxx@chromium.org hendrich@chromium.org pmarko@chromium.org
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index 1f44bab..3da72786 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -406,10 +406,6 @@ const base::Feature kDiacriticsOnPhysicalKeyboardLongpress{ "DiacriticsOnPhysicalKeyboardLongpress", base::FEATURE_DISABLED_BY_DEFAULT}; -// Enables or disables the Diagnostics app. -const base::Feature kDiagnosticsApp{"DiagnosticsApp", - base::FEATURE_ENABLED_BY_DEFAULT}; - // If enabled, the navigation panel will be shown in the diagnostics app. const base::Feature kDiagnosticsAppNavigation{"DiagnosticsAppNavigation", base::FEATURE_ENABLED_BY_DEFAULT}; @@ -558,7 +554,7 @@ // Enables skipping of network screen. const base::Feature kEnableOobeNetworkScreenSkip{ - "EnableOobeNetworkScreenSkip", base::FEATURE_DISABLED_BY_DEFAULT}; + "EnableOobeNetworkScreenSkip", base::FEATURE_ENABLED_BY_DEFAULT}; // Enables showing notification after the password change for SAML users. const base::Feature kEnableSamlNotificationOnPasswordChangeSuccess{ @@ -1598,10 +1594,6 @@ return base::FeatureList::IsEnabled(kDeskTemplateSync); } -bool IsDiagnosticsAppEnabled() { - return base::FeatureList::IsEnabled(kDiagnosticsApp); -} - bool IsDisplayAlignmentAssistanceEnabled() { return base::FeatureList::IsEnabled(kDisplayAlignAssist); }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h index 38185825..29461803 100644 --- a/ash/constants/ash_features.h +++ b/ash/constants/ash_features.h
@@ -135,8 +135,6 @@ COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kDesksTemplates; COMPONENT_EXPORT(ASH_CONSTANTS) -extern const base::Feature kDiagnosticsApp; -COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kCrostiniDiskResizing; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kCrostiniGpuSupport; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kCrostiniResetLxdDb; @@ -176,7 +174,6 @@ extern const base::FeatureParam<int> kDeviceForceScheduledRebootMaxDelay; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kDiacriticsOnPhysicalKeyboardLongpress; -COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kDiagnosticsApp; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kDiagnosticsAppNavigation; COMPONENT_EXPORT(ASH_CONSTANTS) @@ -596,7 +593,6 @@ COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDeepLinkingEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDemoModeSWAEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDeskTemplateSyncEnabled(); -COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDiagnosticsAppEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDisplayAlignmentAssistanceEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDragUnpinnedAppToPinEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDragWindowToNewDeskEnabled();
diff --git a/ash/constants/ash_switches.cc b/ash/constants/ash_switches.cc index ba7d0ee5..44d9d0f 100644 --- a/ash/constants/ash_switches.cc +++ b/ash/constants/ash_switches.cc
@@ -362,6 +362,10 @@ const char kDisableOOBEChromeVoxHintTimerForTesting[] = "disable-oobe-chromevox-hint-timer-for-testing"; +// Disables network screen skip check which is based on ethernet connection. +const char kDisableOOBENetworkScreenSkippingForTesting[] = + "disable-oobe-network-screen-skipping-for-testing"; + // Disables per-user timezone. const char kDisablePerUserTimezone[] = "disable-per-user-timezone"; @@ -937,6 +941,11 @@ kDisableOOBEChromeVoxHintTimerForTesting); } +bool IsOOBENetworkScreenSkippingDisabledForTesting() { + return base::CommandLine::ForCurrentProcess()->HasSwitch( + kDisableOOBENetworkScreenSkippingForTesting); +} + bool IsOOBEChromeVoxHintEnabledForDevMode() { return base::CommandLine::ForCurrentProcess()->HasSwitch( kEnableOOBEChromeVoxHintForDevMode);
diff --git a/ash/constants/ash_switches.h b/ash/constants/ash_switches.h index 93df5fd..911bbe2 100644 --- a/ash/constants/ash_switches.h +++ b/ash/constants/ash_switches.h
@@ -118,6 +118,8 @@ COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kDisableMachineCertRequest[]; COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kDisableOOBEChromeVoxHintTimerForTesting[]; +COMPONENT_EXPORT(ASH_CONSTANTS) +extern const char kDisableOOBENetworkScreenSkippingForTesting[]; COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kDisablePerUserTimezone[]; COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kDisableRollbackOption[]; COMPONENT_EXPORT(ASH_CONSTANTS) @@ -341,6 +343,11 @@ COMPONENT_EXPORT(ASH_CONSTANTS) bool IsOOBEChromeVoxHintTimerDisabledForTesting(); +// Returns true if the OOBE Network screen skipping check based on ethernet +// connection is disabled for testing. +COMPONENT_EXPORT(ASH_CONSTANTS) +bool IsOOBENetworkScreenSkippingDisabledForTesting(); + // Returns true if the OOBE ChromeVox hint is enabled for dev mode. COMPONENT_EXPORT(ASH_CONSTANTS) bool IsOOBEChromeVoxHintEnabledForDevMode();
diff --git a/ash/metrics/user_metrics_action.h b/ash/metrics/user_metrics_action.h index d4cc99a7..d936127 100644 --- a/ash/metrics/user_metrics_action.h +++ b/ash/metrics/user_metrics_action.h
@@ -15,33 +15,11 @@ UMA_LAUNCHER_LAUNCH_TASK, UMA_LAUNCHER_MINIMIZE_TASK, UMA_LAUNCHER_SWITCH_TASK, - UMA_STATUS_AREA_AUDIO_CURRENT_INPUT_DEVICE, - UMA_STATUS_AREA_AUDIO_CURRENT_OUTPUT_DEVICE, - UMA_STATUS_AREA_AUDIO_SWITCH_INPUT_DEVICE, - UMA_STATUS_AREA_AUDIO_SWITCH_OUTPUT_DEVICE, - UMA_STATUS_AREA_BRIGHTNESS_CHANGED, - UMA_STATUS_AREA_BLUETOOTH_DISABLED, - UMA_STATUS_AREA_BLUETOOTH_ENABLED, - UMA_STATUS_AREA_CAPS_LOCK_DETAILED, - UMA_STATUS_AREA_CAPS_LOCK_DISABLED_BY_CLICK, - UMA_STATUS_AREA_CAPS_LOCK_ENABLED_BY_CLICK, - UMA_STATUS_AREA_CAPS_LOCK_POPUP, - UMA_STATUS_AREA_CAST_STOP_CAST, UMA_STATUS_AREA_CONNECT_TO_CONFIGURED_NETWORK, UMA_STATUS_AREA_CONNECT_TO_UNCONFIGURED_NETWORK, UMA_STATUS_AREA_CONNECT_TO_VPN, UMA_STATUS_AREA_CHANGED_VOLUME_MENU, UMA_STATUS_AREA_CHANGED_VOLUME_POPUP, - UMA_STATUS_AREA_DETAILED_ACCESSIBILITY, - UMA_STATUS_AREA_DETAILED_AUDIO_VIEW, - UMA_STATUS_AREA_DETAILED_BLUETOOTH_VIEW, - UMA_STATUS_AREA_DETAILED_BRIGHTNESS_VIEW, - UMA_STATUS_AREA_DETAILED_CAST_VIEW, - UMA_STATUS_AREA_DETAILED_CAST_VIEW_LAUNCH_CAST, - UMA_STATUS_AREA_DETAILED_DRIVE_VIEW, - UMA_STATUS_AREA_DETAILED_NETWORK_VIEW, - UMA_STATUS_AREA_DETAILED_SMS_VIEW, - UMA_STATUS_AREA_DETAILED_VPN_VIEW, UMA_STATUS_AREA_DISABLE_WIFI, UMA_STATUS_AREA_DISPLAY_DEFAULT_SELECTED, UMA_STATUS_AREA_DISPLAY_DEFAULT_SHOW_SETTINGS, @@ -60,7 +38,6 @@ UMA_STATUS_AREA_SCREEN_CAPTURE_NOTIFICATION_STOP, UMA_STATUS_AREA_SHOW_NETWORK_CONNECTION_DETAILS, UMA_STATUS_AREA_SHOW_VPN_CONNECTION_DETAILS, - UMA_STATUS_AREA_SIGN_OUT, UMA_STATUS_AREA_SMS_DETAILED_DISMISS_MSG, UMA_STATUS_AREA_SMS_NOTIFICATION_DISMISS_MSG, UMA_STATUS_AREA_TRACING_DEFAULT_SELECTED, @@ -68,12 +45,6 @@ UMA_STATUS_AREA_VPN_ADD_THIRD_PARTY_CLICKED, UMA_STATUS_AREA_VPN_DISCONNECT_CLICKED, UMA_STATUS_AREA_VPN_SETTINGS_OPENED, - UMA_TRAY_HELP, - UMA_TRAY_LOCK_SCREEN, - UMA_TRAY_NIGHT_LIGHT, - UMA_TRAY_OVERVIEW, - UMA_TRAY_SETTINGS, - UMA_TRAY_SHUT_DOWN, // DEPRECATED: Do not add new values. See top of file. };
diff --git a/ash/metrics/user_metrics_recorder.cc b/ash/metrics/user_metrics_recorder.cc index e6cabf8..d2c08d5 100644 --- a/ash/metrics/user_metrics_recorder.cc +++ b/ash/metrics/user_metrics_recorder.cc
@@ -174,42 +174,6 @@ RecordAction(UserMetricsAction("Launcher_SwitchTask")); task_switch_metrics_recorder_.OnTaskSwitch(TaskSwitchSource::SHELF); break; - case UMA_STATUS_AREA_AUDIO_CURRENT_INPUT_DEVICE: - RecordAction(UserMetricsAction("StatusArea_Audio_CurrentInputDevice")); - break; - case UMA_STATUS_AREA_AUDIO_CURRENT_OUTPUT_DEVICE: - RecordAction(UserMetricsAction("StatusArea_Audio_CurrentOutputDevice")); - break; - case UMA_STATUS_AREA_AUDIO_SWITCH_INPUT_DEVICE: - RecordAction(UserMetricsAction("StatusArea_Audio_SwitchInputDevice")); - break; - case UMA_STATUS_AREA_AUDIO_SWITCH_OUTPUT_DEVICE: - RecordAction(UserMetricsAction("StatusArea_Audio_SwitchOutputDevice")); - break; - case UMA_STATUS_AREA_BRIGHTNESS_CHANGED: - RecordAction(UserMetricsAction("StatusArea_BrightnessChanged")); - break; - case UMA_STATUS_AREA_BLUETOOTH_DISABLED: - RecordAction(UserMetricsAction("StatusArea_Bluetooth_Disabled")); - break; - case UMA_STATUS_AREA_BLUETOOTH_ENABLED: - RecordAction(UserMetricsAction("StatusArea_Bluetooth_Enabled")); - break; - case UMA_STATUS_AREA_CAPS_LOCK_DETAILED: - RecordAction(UserMetricsAction("StatusArea_CapsLock_Detailed")); - break; - case UMA_STATUS_AREA_CAPS_LOCK_DISABLED_BY_CLICK: - RecordAction(UserMetricsAction("StatusArea_CapsLock_DisabledByClick")); - break; - case UMA_STATUS_AREA_CAPS_LOCK_ENABLED_BY_CLICK: - RecordAction(UserMetricsAction("StatusArea_CapsLock_EnabledByClick")); - break; - case UMA_STATUS_AREA_CAPS_LOCK_POPUP: - RecordAction(UserMetricsAction("StatusArea_CapsLock_Popup")); - break; - case UMA_STATUS_AREA_CAST_STOP_CAST: - RecordAction(UserMetricsAction("StatusArea_Cast_StopCast")); - break; case UMA_STATUS_AREA_CONNECT_TO_CONFIGURED_NETWORK: RecordAction(UserMetricsAction("StatusArea_Network_ConnectConfigured")); break; @@ -225,36 +189,6 @@ case UMA_STATUS_AREA_CHANGED_VOLUME_POPUP: RecordAction(UserMetricsAction("StatusArea_Volume_ChangedPopup")); break; - case UMA_STATUS_AREA_DETAILED_ACCESSIBILITY: - RecordAction(UserMetricsAction("StatusArea_Accessability_DetailedView")); - break; - case UMA_STATUS_AREA_DETAILED_AUDIO_VIEW: - RecordAction(UserMetricsAction("StatusArea_Audio_Detailed")); - break; - case UMA_STATUS_AREA_DETAILED_BLUETOOTH_VIEW: - RecordAction(UserMetricsAction("StatusArea_Bluetooth_Detailed")); - break; - case UMA_STATUS_AREA_DETAILED_BRIGHTNESS_VIEW: - RecordAction(UserMetricsAction("StatusArea_Brightness_Detailed")); - break; - case UMA_STATUS_AREA_DETAILED_CAST_VIEW: - RecordAction(UserMetricsAction("StatusArea_Cast_Detailed")); - break; - case UMA_STATUS_AREA_DETAILED_CAST_VIEW_LAUNCH_CAST: - RecordAction(UserMetricsAction("StatusArea_Cast_Detailed_Launch_Cast")); - break; - case UMA_STATUS_AREA_DETAILED_DRIVE_VIEW: - RecordAction(UserMetricsAction("StatusArea_Drive_Detailed")); - break; - case UMA_STATUS_AREA_DETAILED_NETWORK_VIEW: - RecordAction(UserMetricsAction("StatusArea_Network_Detailed")); - break; - case UMA_STATUS_AREA_DETAILED_SMS_VIEW: - RecordAction(UserMetricsAction("StatusArea_SMS_Detailed")); - break; - case UMA_STATUS_AREA_DETAILED_VPN_VIEW: - RecordAction(UserMetricsAction("StatusArea_VPN_Detailed")); - break; case UMA_STATUS_AREA_DISPLAY_DEFAULT_SELECTED: RecordAction(UserMetricsAction("StatusArea_Display_Default_Selected")); break; @@ -314,9 +248,6 @@ case UMA_STATUS_AREA_SHOW_VPN_CONNECTION_DETAILS: RecordAction(UserMetricsAction("StatusArea_VPN_ConnectionDetails")); break; - case UMA_STATUS_AREA_SIGN_OUT: - RecordAction(UserMetricsAction("StatusArea_SignOut")); - break; case UMA_STATUS_AREA_SMS_DETAILED_DISMISS_MSG: RecordAction(UserMetricsAction("StatusArea_SMS_Detailed_DismissMsg")); break; @@ -338,24 +269,6 @@ case UMA_STATUS_AREA_VPN_SETTINGS_OPENED: RecordAction(UserMetricsAction("StatusArea_VPN_Settings")); break; - case UMA_TRAY_HELP: - RecordAction(UserMetricsAction("Tray_Help")); - break; - case UMA_TRAY_LOCK_SCREEN: - RecordAction(UserMetricsAction("Tray_LockScreen")); - break; - case UMA_TRAY_NIGHT_LIGHT: - RecordAction(UserMetricsAction("Tray_NightLight")); - break; - case UMA_TRAY_OVERVIEW: - RecordAction(UserMetricsAction("Tray_Overview")); - break; - case UMA_TRAY_SETTINGS: - RecordAction(UserMetricsAction("Tray_Settings")); - break; - case UMA_TRAY_SHUT_DOWN: - RecordAction(UserMetricsAction("Tray_ShutDown")); - break; } }
diff --git a/ash/public/cpp/desk_template.h b/ash/public/cpp/desk_template.h index 724ad416..d8e1cd5a 100644 --- a/ash/public/cpp/desk_template.h +++ b/ash/public/cpp/desk_template.h
@@ -68,6 +68,9 @@ const ::app_restore::RestoreData* desk_restore_data() const { return desk_restore_data_.get(); } + ::app_restore::RestoreData* mutable_desk_restore_data() { + return desk_restore_data_.get(); + } void set_desk_restore_data( std::unique_ptr<::app_restore::RestoreData> restore_data) {
diff --git a/ash/quick_pair/common/fast_pair/fast_pair_feature_usage_metrics_logger.cc b/ash/quick_pair/common/fast_pair/fast_pair_feature_usage_metrics_logger.cc index bb7c832..20a961d 100644 --- a/ash/quick_pair/common/fast_pair/fast_pair_feature_usage_metrics_logger.cc +++ b/ash/quick_pair/common/fast_pair/fast_pair_feature_usage_metrics_logger.cc
@@ -43,8 +43,8 @@ // IsEligible reflects the hardware filtering support on the Chromebook. // Devices that do not have hardware filtering support are not eligible for // Fast Pair. - return bluetooth_adapter_.get() && bluetooth_adapter_->IsPresent() && - (features::IsFastPairSoftwareScanningEnabled() || + return features::IsFastPairSoftwareScanningEnabled() || + (bluetooth_adapter_.get() && bluetooth_adapter_->IsPresent() && bluetooth_adapter_ ->GetLowEnergyScanSessionHardwareOffloadingStatus() == device::BluetoothAdapter:: @@ -72,7 +72,8 @@ bool FastPairFeatureUsageMetricsLogger::IsEnabled() const { PrefService* pref_service = QuickPairBrowserDelegate::Get()->GetActivePrefService(); - return pref_service && pref_service->GetBoolean(ash::prefs::kFastPairEnabled); + return IsEligible() && pref_service && + pref_service->GetBoolean(ash::prefs::kFastPairEnabled); } } // namespace quick_pair
diff --git a/ash/quick_pair/common/fast_pair/fast_pair_feature_usage_metrics_logger_unittest.cc b/ash/quick_pair/common/fast_pair/fast_pair_feature_usage_metrics_logger_unittest.cc index 7eb526c..1529431 100644 --- a/ash/quick_pair/common/fast_pair/fast_pair_feature_usage_metrics_logger_unittest.cc +++ b/ash/quick_pair/common/fast_pair/fast_pair_feature_usage_metrics_logger_unittest.cc
@@ -112,12 +112,21 @@ TEST_F(FastPairFeatureUsageMetricsLoggerTest, IsEnabled_Enabled) { FastPairFeatureUsageMetricsLogger feature_usage_metrics; + + SetBluetoothIsPresent(/*present=*/true); + SetHardwareOffloadingStatus( + /*hardware_offloading_status=*/device::BluetoothAdapter:: + LowEnergyScanSessionHardwareOffloadingStatus::kSupported); EXPECT_TRUE(feature_usage_metrics.IsEnabled()); } TEST_F(FastPairFeatureUsageMetricsLoggerTest, IsEnabled_NotEnabled) { FastPairFeatureUsageMetricsLogger feature_usage_metrics; + SetBluetoothIsPresent(/*present=*/true); + SetHardwareOffloadingStatus( + /*hardware_offloading_status=*/device::BluetoothAdapter:: + LowEnergyScanSessionHardwareOffloadingStatus::kSupported); SetEnabled(/*is_enabled=*/false); EXPECT_FALSE(feature_usage_metrics.IsEnabled()); } @@ -158,6 +167,10 @@ TEST_F(FastPairFeatureUsageMetricsLoggerTest, IsAccessible_Unmanaged_Enabled) { FastPairFeatureUsageMetricsLogger feature_usage_metrics; + SetBluetoothIsPresent(/*present=*/true); + SetHardwareOffloadingStatus( + /*hardware_offloading_status=*/device::BluetoothAdapter:: + LowEnergyScanSessionHardwareOffloadingStatus::kSupported); EXPECT_TRUE(feature_usage_metrics.IsAccessible().value()); EXPECT_TRUE(feature_usage_metrics.IsEnabled()); @@ -166,6 +179,10 @@ TEST_F(FastPairFeatureUsageMetricsLoggerTest, IsAccessible_Unmanaged_Disabled) { FastPairFeatureUsageMetricsLogger feature_usage_metrics; + SetBluetoothIsPresent(/*present=*/true); + SetHardwareOffloadingStatus( + /*hardware_offloading_status=*/device::BluetoothAdapter:: + LowEnergyScanSessionHardwareOffloadingStatus::kSupported); SetEnabled(/*is_enabled=*/false); EXPECT_TRUE(feature_usage_metrics.IsAccessible().value()); EXPECT_FALSE(feature_usage_metrics.IsEnabled()); @@ -174,6 +191,10 @@ TEST_F(FastPairFeatureUsageMetricsLoggerTest, IsAccessible_Managed_Enabled) { FastPairFeatureUsageMetricsLogger feature_usage_metrics; + SetBluetoothIsPresent(/*present=*/true); + SetHardwareOffloadingStatus( + /*hardware_offloading_status=*/device::BluetoothAdapter:: + LowEnergyScanSessionHardwareOffloadingStatus::kSupported); SetManagedEnabled(/*is_enabled=*/true); EXPECT_TRUE(feature_usage_metrics.IsAccessible().value()); EXPECT_TRUE(feature_usage_metrics.IsEnabled()); @@ -182,6 +203,10 @@ TEST_F(FastPairFeatureUsageMetricsLoggerTest, IsAccessible_Managed_Disabled) { FastPairFeatureUsageMetricsLogger feature_usage_metrics; + SetBluetoothIsPresent(/*present=*/true); + SetHardwareOffloadingStatus( + /*hardware_offloading_status=*/device::BluetoothAdapter:: + LowEnergyScanSessionHardwareOffloadingStatus::kSupported); SetManagedEnabled(/*is_enabled=*/false); EXPECT_FALSE(feature_usage_metrics.IsAccessible().value()); EXPECT_FALSE(feature_usage_metrics.IsEnabled());
diff --git a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.cc b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.cc index 6f9a18f..4fe0079 100644 --- a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.cc +++ b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.cc
@@ -185,8 +185,13 @@ void FastPairGattServiceClientImpl::NotifyInitializedError( PairFailure failure) { ClearCurrentState(); - DCHECK(on_initialized_callback_); - std::move(on_initialized_callback_).Run(failure); + + // This function is invoked in several flows and it is possible for it to run + // twice. In that case, we are ok with the first instance being the one that + // reports the failure. An example is if we timeout waiting for all notify + // sessions to start. + if (on_initialized_callback_) + std::move(on_initialized_callback_).Run(failure); } void FastPairGattServiceClientImpl::NotifyWriteRequestError(
diff --git a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_unittest.cc b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_unittest.cc index 8e4f4c4..8f007b97 100644 --- a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_unittest.cc +++ b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_unittest.cc
@@ -695,6 +695,18 @@ histogram_tester().ExpectTotalCount(kNotifyKeyBasedCharacteristicTime, 0); } +TEST_F(FastPairGattServiceClientTest, MultipleNotifyTimeout) { + histogram_tester().ExpectTotalCount(kNotifyKeyBasedCharacteristicTime, 0); + SetKeybasedNotifySessionTimeout(true); + SetPasskeyNotifySessionTimeout(true); + SuccessfulGattConnectionSetUp(); + NotifyGattDiscoveryCompleteForService(); + EXPECT_EQ(GetInitializedCallbackResult(), + PairFailure::kKeyBasedPairingCharacteristicNotifySessionTimeout); + EXPECT_FALSE(ServiceIsSet()); + histogram_tester().ExpectTotalCount(kNotifyKeyBasedCharacteristicTime, 0); +} + TEST_F(FastPairGattServiceClientTest, WriteKeyBasedRequest) { histogram_tester().ExpectTotalCount(kWriteKeyBasedCharacteristicGattError, 0); histogram_tester().ExpectTotalCount(kNotifyKeyBasedCharacteristicTime, 0);
diff --git a/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_impl.cc b/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_impl.cc index fce55b61..b13ce8e 100644 --- a/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_impl.cc +++ b/ash/quick_pair/fast_pair_handshake/fast_pair_handshake_impl.cc
@@ -31,9 +31,19 @@ std::move(on_complete), nullptr, nullptr) { + device::BluetoothDevice* bluetooth_device = + adapter_->GetDevice(device_->ble_address); + + if (!bluetooth_device) { + QP_LOG(INFO) << __func__ << ": Lost device before starting handshake."; + std::move(on_complete_callback_) + .Run(device_, PairFailure::kPairingDeviceLost); + return; + } + fast_pair_gatt_service_client_ = FastPairGattServiceClientImpl::Factory::Create( - adapter_->GetDevice(device_->ble_address), adapter_, + bluetooth_device, adapter_, base::BindRepeating( &FastPairHandshakeImpl::OnGattClientInitializedCallback, weak_ptr_factory_.GetWeakPtr()));
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 d53ab6eb..703ce6c 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
@@ -24,6 +24,7 @@ #include "device/bluetooth/bluetooth_adapter.h" #include "device/bluetooth/bluetooth_adapter_factory.h" #include "device/bluetooth/test/mock_bluetooth_adapter.h" +#include "device/bluetooth/test/mock_bluetooth_device.h" #include "testing/gtest/include/gtest/gtest.h" namespace { @@ -128,6 +129,12 @@ device_ = base::MakeRefCounted<Device>(kMetadataId, kAddress, Protocol::kFastPairInitial); + mock_device_ = std::make_unique<device::MockBluetoothDevice>( + adapter_.get(), /*bluetooth_class=*/0, "test_device_name", kAddress, + /*paired=*/false, /*connected=*/false); + ON_CALL(*(adapter_.get()), GetDevice(kAddress)) + .WillByDefault(testing::Return(mock_device_.get())); + FastPairGattServiceClientImpl::Factory::SetFactoryForTesting( &gatt_service_client_factory_); @@ -155,6 +162,7 @@ } scoped_refptr<testing::NiceMock<device::MockBluetoothAdapter>> adapter_; + std::unique_ptr<device::MockBluetoothDevice> mock_device_; base::HistogramTester histogram_tester_; scoped_refptr<Device> device_; FakeFastPairGattServiceClientImplFactory gatt_service_client_factory_; @@ -284,5 +292,17 @@ histogram_tester().ExpectTotalCount(kHandshakeFailureReason, 0); } +TEST_F(FastPairHandshakeImplTest, FailsIfNoDevice) { + auto device = base::MakeRefCounted<Device>(kMetadataId, "invalid_address", + Protocol::kFastPairInitial); + + auto handshake = std::make_unique<FastPairHandshakeImpl>( + adapter_, device, + base::BindLambdaForTesting([](scoped_refptr<Device> device, + absl::optional<PairFailure> failure) { + EXPECT_EQ(failure, PairFailure::kPairingDeviceLost); + })); +} + } // namespace quick_pair } // namespace ash
diff --git a/ash/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc b/ash/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc index 994bff7..fd7a4c0 100644 --- a/ash/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc +++ b/ash/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc
@@ -1539,6 +1539,13 @@ {}, // |accelerator_ids| {{ui::VKEY_SPACE, ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN}}}, + + {// |categories| + {ShortcutCategory::kSystemAndDisplay}, + IDS_KSV_DESCRIPTION_OPEN_DIAGNOSTICS, + {}, + // |accelerator_ids| + {{ui::VKEY_ESCAPE, ui::EF_CONTROL_DOWN | ui::EF_COMMAND_DOWN}}}, }); static bool is_initialized = false; @@ -1548,18 +1555,6 @@ if (!is_initialized) { is_initialized = true; - // Include diagnostics shortcuts only when experiment flag is enabled. - if (base::FeatureList::IsEnabled(chromeos::features::kDiagnosticsApp)) { - const ash::KeyboardShortcutItem diagnostics_shortcut = { - // |categories| - {ShortcutCategory::kSystemAndDisplay}, - IDS_KSV_DESCRIPTION_OPEN_DIAGNOSTICS, - {}, - // |accelerator_ids| - {{ui::VKEY_ESCAPE, ui::EF_CONTROL_DOWN | ui::EF_COMMAND_DOWN}}}; - item_list->emplace_back(diagnostics_shortcut); - } - // The improved desks keyboard shortcuts should only be enabled if the // improved keyboard shortcuts flag is also enabled. if (::features::IsImprovedKeyboardShortcutsEnabled() &&
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb index 285875a..336fe33a 100644 --- a/ash/strings/ash_strings_ar.xtb +++ b/ash/strings/ash_strings_ar.xtb
@@ -126,6 +126,7 @@ <translation id="1668469839109562275">الشبكة الافتراضية الخاصة المُدمجة</translation> <translation id="1677472565718498478">الوقت المتبقي <ph name="TIME" /></translation> <translation id="1677507110654891115">ميزة <ph name="FEATURE_NAME" /> غير متصلة.</translation> +<translation id="1677582821739292812">تم رصد مستخدم ينظر إلى شاشتك.</translation> <translation id="1698080062160024910">مؤقت <ph name="TOTAL_TIME" /> <ph name="LABEL" /></translation> <translation id="1698760176351776263">عنوان IPv6: <ph name="ADDRESS" /></translation> <translation id="1703117532528082099">تم إرساء النافذة النشطة على يمين الشاشة.</translation>
diff --git a/ash/strings/ash_strings_be.xtb b/ash/strings/ash_strings_be.xtb index 0624bff..3aee331 100644 --- a/ash/strings/ash_strings_be.xtb +++ b/ash/strings/ash_strings_be.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">Каляндар</translation> <translation id="1153356358378277386">Спалучаныя прылады</translation> <translation id="1165712434476988950">Каб прымяніць абнаўленне, трэба перазапусціць прыладу.</translation> +<translation id="1171742223880403396">Кабель USB-C можа не падключацца да дысплэяў належным чынам</translation> <translation id="1175572348579024023">Прагартаць</translation> <translation id="1178581264944972037">Прыпыніць</translation> <translation id="1181037720776840403">Выдаліць</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index 0ecbad417..6d7f78e 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">ক্যালেন্ডার</translation> <translation id="1153356358378277386">যুক্ত করা ডিভাইসগুলি</translation> <translation id="1165712434476988950">আপটেড প্রয়োগ করতে ডিভাইস রিস্টার্ট করুন।</translation> +<translation id="1171742223880403396">আপনার USB-C কেবলটি ডিসপ্লেতে সঠিকভাবে কানেক্ট নাও করতে পারে</translation> <translation id="1175572348579024023">স্ক্রল করুন</translation> <translation id="1178581264944972037">বিরতি</translation> <translation id="1181037720776840403">সরান</translation> @@ -124,8 +125,10 @@ <translation id="1668469839109562275">বিল্ট-ইন ভিপিএন</translation> <translation id="1677472565718498478"><ph name="TIME" /> বাকি আছে</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> ফিচারটি কানেক্ট করা নেই।</translation> +<translation id="1677582821739292812">কেউ আপনার স্ক্রিনের দিকে তাকিয়ে আছে</translation> <translation id="1698080062160024910"><ph name="TOTAL_TIME" />-এর টাইমার · <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6 ঠিকানা: <ph name="ADDRESS" /></translation> +<translation id="1703117532528082099">অ্যাক্টিভ উইন্ডোটি বাঁদিকে ডক করা আছে।</translation> <translation id="1708345662127501511">ডেস্ক: <ph name="DESK_NAME" /></translation> <translation id="1709762881904163296">নেটওয়ার্ক সেটিংস</translation> <translation id="1715293566947629045">প্রোফাইল বন্ধ করা হচ্ছে। কয়েক মিনিট অপেক্ষা করুন।</translation> @@ -276,6 +279,7 @@ <translation id="2727977024730340865">একটি নিম্ন শক্তির চার্জার প্লাগইন করা হয়েছে৷ বিশ্বস্ত ব্যাটারি চার্জ নাও হতে পারে৷</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"মুছে ফেলুন"</translation> +<translation id="2750941250130734256">অ্যাক্টিভ উইন্ডোটি আনডক করা হয়েছে।</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" />, <ph name="MANAGER" />-এর মাধ্যমে ম্যানেজ করা হয়</translation> <translation id="2782591952652094792">ক্যাপচার মোড থেকে বেরিয়ে আসুন</translation> <translation id="2791421900609674576">আপনি সাজেশন দেখতে পাবেন যাতে যেখানে শেষ কাজ করেছিলেন সেখান থেকেই আবার শুরু করতে পারেন। সাজেশন সরিয়ে দেওয়ার জন্য আপনি টাচ করে ধরে থাকতে পারেন।</translation> @@ -789,6 +793,7 @@ <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">চালু</translation> <translation id="5920710855273935292">মাইক্রোফোন মিউট করা আছে।</translation> +<translation id="5924838240953214369">ক্যাপচার মোড, এই <ph name="SOURCE" /> <ph name="TYPE" /> ডিফল্ট হিসেবে সেট করা হয়েছে। ক্যামেরা ইনপুট <ph name="CAMERA_NAME" />-এ সেট করা আছে, প্রিভিউ চালু করুন। কীবোর্ড ব্যবহার করে নেভিগেট করতে Tab কী প্রেস করুন।</translation> <translation id="5946788582095584774"><ph name="FEATURE_NAME" /> চালু আছে।</translation> <translation id="5947494881799873997">ফেরান</translation> <translation id="595202126637698455">কার্য-সম্পাদনা ট্রেস করা সক্ষম রয়েছে</translation> @@ -1047,6 +1052,7 @@ <translation id="7564874036684306347">কোনও উইন্ডো অন্য ডেস্কটপে সরানো হলে সেটির আচরণে অপ্রত্যাশিত পরিবর্তন হতে পারে। পরবর্তী বিজ্ঞপ্তি, উইন্ডো এবং ডায়ালগ দুটি ডেস্কটপ মিলিয়ে দেখানো হতে পারে।</translation> <translation id="7569509451529460200">ব্রেল এবং ChromeVox সক্ষম করেছেন</translation> <translation id="7569983096843329377">কালো</translation> +<translation id="7573585051776738856">অ্যাক্টিভ উইন্ডোটি ডানদিকে ডক করা আছে।</translation> <translation id="7579778809502851308">স্ক্রিন ক্যাপচার করুন</translation> <translation id="7590883480672980941">ইনপুট সেটিংস</translation> <translation id="7593891976182323525">Search অথবা Shift</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index deda43f..0790a855 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">Calendari</translation> <translation id="1153356358378277386">Dispositius vinculats</translation> <translation id="1165712434476988950">Cal reiniciar el dispositiu per aplicar l'actualització.</translation> +<translation id="1171742223880403396">És possible que el teu cable USB-C no es connecti correctament a les pantalles.</translation> <translation id="1175572348579024023">Desplaça</translation> <translation id="1178581264944972037">Posa en pausa</translation> <translation id="1181037720776840403">Suprimeix</translation> @@ -126,6 +127,7 @@ <translation id="1677507110654891115">La funció <ph name="FEATURE_NAME" /> no està connectada.</translation> <translation id="1698080062160024910">Temporitzador de: <ph name="TOTAL_TIME" /> · <ph name="LABEL" /></translation> <translation id="1698760176351776263">Adreça IPv6: <ph name="ADDRESS" /></translation> +<translation id="1703117532528082099">Finestra activa acoblada a l'esquerra.</translation> <translation id="1708345662127501511">Escriptori: <ph name="DESK_NAME" /></translation> <translation id="1709762881904163296">Configuració de la xarxa</translation> <translation id="1715293566947629045">S'està desactivant el perfil. Espera uns minuts.</translation> @@ -276,6 +278,7 @@ <translation id="2727977024730340865">S'ha connectat a un carregador de baix consum. És possible que la càrrega de la bateria no sigui fiable.</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Suprimeix"</translation> +<translation id="2750941250130734256">Finestra activa desacoblada.</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> gestionat per <ph name="MANAGER" /></translation> <translation id="2782591952652094792">Surt del mode de captura</translation> <translation id="2791421900609674576">Veuràs recomanacions per poder continuar des d'on ho vas deixar. Pots mantenir premuda qualsevol recomanació per suprimir-la.</translation> @@ -789,6 +792,7 @@ <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Activat</translation> <translation id="5920710855273935292">El micròfon està silenciat.</translation> +<translation id="5924838240953214369">Mode de captura, l'opció predeterminada és <ph name="TYPE" /> <ph name="SOURCE" />. L'entrada per càmera s'ha establert en <ph name="CAMERA_NAME" />, previsualització activada. Prem la tecla de tabulació per navegar amb el teclat.</translation> <translation id="5946788582095584774">La funció <ph name="FEATURE_NAME" /> està activada.</translation> <translation id="5947494881799873997">Reverteix</translation> <translation id="595202126637698455">Traça del rendiment activada</translation> @@ -1047,6 +1051,7 @@ <translation id="7564874036684306347">Moure finestres a un altre escriptori pot provocar un comportament imprevist. És possible que les notificacions, les finestres i els quadres de diàleg següents quedin dividits entre escriptoris.</translation> <translation id="7569509451529460200">S'ha activat el braille i ChromeVox</translation> <translation id="7569983096843329377">Negre</translation> +<translation id="7573585051776738856">Finestra activa acoblada a la dreta.</translation> <translation id="7579778809502851308">Captura de pantalla</translation> <translation id="7590883480672980941">Configuració de l'entrada</translation> <translation id="7593891976182323525">Cerca o Maj</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb index 15cf4ea..266438f2e 100644 --- a/ash/strings/ash_strings_cs.xtb +++ b/ash/strings/ash_strings_cs.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">Kalendář</translation> <translation id="1153356358378277386">Spárovaná zařízení</translation> <translation id="1165712434476988950">K použití aktualizace je potřeba restartovat zařízení.</translation> +<translation id="1171742223880403396">Váš kabel USB-C se možná nedokáže správně připojit k displejům</translation> <translation id="1175572348579024023">Posunout</translation> <translation id="1178581264944972037">Pozastavit</translation> <translation id="1181037720776840403">Odebrat</translation> @@ -124,6 +125,7 @@ <translation id="1668469839109562275">Vestavěná VPN</translation> <translation id="1677472565718498478">zbývající čas: <ph name="TIME" /></translation> <translation id="1677507110654891115">Funkce <ph name="FEATURE_NAME" /> není připojena.</translation> +<translation id="1677582821739292812">Někdo se dívá na vaši obrazovku</translation> <translation id="1698080062160024910">Časovač na <ph name="TOTAL_TIME" /> · <ph name="LABEL" /></translation> <translation id="1698760176351776263">Adresa IPv6: <ph name="ADDRESS" /></translation> <translation id="1708345662127501511">Plocha: <ph name="DESK_NAME" /></translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index 4fa481c..3f70309 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">Kalender</translation> <translation id="1153356358378277386">Parrede enheder</translation> <translation id="1165712434476988950">Enheden skal genstartes, før opdateringen anvendes.</translation> +<translation id="1171742223880403396">Dit USB-C-kabel kan muligvis ikke sluttes korrekt til skærmene</translation> <translation id="1175572348579024023">Rul</translation> <translation id="1178581264944972037">Pause</translation> <translation id="1181037720776840403">Fjern</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb index 0038e0d..6bbe6145 100644 --- a/ash/strings/ash_strings_es-419.xtb +++ b/ash/strings/ash_strings_es-419.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">Calendario</translation> <translation id="1153356358378277386">Dispositivos sincronizados</translation> <translation id="1165712434476988950">Para aplicar la actualización, se debe reiniciar el dispositivo.</translation> +<translation id="1171742223880403396">Es posible que el cable USB-C no se conecte a las pantallas de manera adecuada</translation> <translation id="1175572348579024023">Desplazamiento</translation> <translation id="1178581264944972037">Detener</translation> <translation id="1181037720776840403">Quitar</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb index 3520c67f..b6fc92f3 100644 --- a/ash/strings/ash_strings_es.xtb +++ b/ash/strings/ash_strings_es.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">Calendario</translation> <translation id="1153356358378277386">Dispositivos vinculados</translation> <translation id="1165712434476988950">Se debe reiniciar el dispositivo para aplicar la actualización.</translation> +<translation id="1171742223880403396">Tu cable USB‑C podría no conectarse correctamente a pantallas</translation> <translation id="1175572348579024023">Desplazarse</translation> <translation id="1178581264944972037">Pausar</translation> <translation id="1181037720776840403">Quitar</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb index 4c0025f..2909d3c9 100644 --- a/ash/strings/ash_strings_et.xtb +++ b/ash/strings/ash_strings_et.xtb
@@ -125,6 +125,7 @@ <translation id="1668469839109562275">Sisseehitatud VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> tühjenemiseni</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> pole ühendatud.</translation> +<translation id="1677582821739292812">Keegi vaatab teie ekraanikuva</translation> <translation id="1698080062160024910"><ph name="TOTAL_TIME" /> taimer · <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6-aadress: <ph name="ADDRESS" /></translation> <translation id="1708345662127501511">Töölaud: <ph name="DESK_NAME" /></translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index fd35388..0a849764 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -125,8 +125,10 @@ <translation id="1668469839109562275">VPN داخلی</translation> <translation id="1677472565718498478"><ph name="TIME" /> باقیمانده</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> متصل نیست.</translation> +<translation id="1677582821739292812">فردی درحال نگاه کردن به صفحهنمایش شما است</translation> <translation id="1698080062160024910">زمانسنج <ph name="TOTAL_TIME" /> · <ph name="LABEL" /></translation> <translation id="1698760176351776263">نشانی IPv6: <ph name="ADDRESS" /></translation> +<translation id="1703117532528082099">پنجره فعال به چپ متصل شد.</translation> <translation id="1708345662127501511">میزکار: <ph name="DESK_NAME" /></translation> <translation id="1709762881904163296">«تنظیمات شبکه»</translation> <translation id="1715293566947629045">درحال غیرفعال کردن نمایه. چند دقیقه صبر کنید.</translation> @@ -277,6 +279,7 @@ <translation id="2727977024730340865">باتری به شارژر برق ضعیف متصل است. شارژ باتری ممکن است قابل اطمینان نباشد.</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />، <ph name="PRICE" /></translation> <translation id="2750932254614666392">«حذف»</translation> +<translation id="2750941250130734256">پنجره فعال جدا شد.</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> تحت مدیریت <ph name="MANAGER" /></translation> <translation id="2782591952652094792">خروج از حالت ضبط</translation> <translation id="2791421900609674576">توصیههایی خواهید دید تا بتوانید کارتان را از جایی که رها کردهاید ادامه دهید. برای حذف توصیهها میتوانید لمس کنید و نگه دارید.</translation> @@ -790,6 +793,7 @@ <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">روشن</translation> <translation id="5920710855273935292">میکروفون صامت است.</translation> +<translation id="5924838240953214369">«حالت ضبط»، پیشفرض <ph name="SOURCE" /> <ph name="TYPE" /> است. ورودی دوربین روی <ph name="CAMERA_NAME" /> تنظیم شد، پیشنمایش روشن است برای پیمایش با صفحهکلید، کلید جهش را فشار دهید.</translation> <translation id="5946788582095584774"><ph name="FEATURE_NAME" /> روشن است.</translation> <translation id="5947494881799873997">برگرداندن</translation> <translation id="595202126637698455">ردیابی عملکرد فعال شد</translation> @@ -1048,6 +1052,7 @@ <translation id="7564874036684306347">انتقال پنجرهها به میز کار دیگر میتواند به رفتار غیرمنتظره منجر شود. اعلانها، پنجرهها و کادرهای گفتگوی بعدی ممکن است بین میز کارها تقسیم شوند.</translation> <translation id="7569509451529460200">بریل و ChromeVox فعال هستند</translation> <translation id="7569983096843329377">سیاه</translation> +<translation id="7573585051776738856">پنجره فعال به راست متصل شد.</translation> <translation id="7579778809502851308">ضبط صفحهنمایش</translation> <translation id="7590883480672980941">تنظیمات ورودی</translation> <translation id="7593891976182323525">جستجو یا Shift</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb index feab07d4..df63d48 100644 --- a/ash/strings/ash_strings_fi.xtb +++ b/ash/strings/ash_strings_fi.xtb
@@ -124,6 +124,7 @@ <translation id="1668469839109562275">Sisäänrakennettu VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> jäljellä</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> ei ole yhdistetty.</translation> +<translation id="1677582821739292812">Joku katsoo näyttöäsi</translation> <translation id="1698080062160024910"><ph name="TOTAL_TIME" /> ajastin · <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6-osoite: <ph name="ADDRESS" /></translation> <translation id="1708345662127501511">Työpöytä: <ph name="DESK_NAME" /></translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb index 68e49238..7c37b57 100644 --- a/ash/strings/ash_strings_fil.xtb +++ b/ash/strings/ash_strings_fil.xtb
@@ -125,8 +125,10 @@ <translation id="1668469839109562275">Built-in na VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> na lang ang natitira</translation> <translation id="1677507110654891115">Hindi nakakonekta ang <ph name="FEATURE_NAME" />.</translation> +<translation id="1677582821739292812">May taong tumitingin sa iyong screen</translation> <translation id="1698080062160024910"><ph name="TOTAL_TIME" /> timer · <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6 address: <ph name="ADDRESS" /></translation> +<translation id="1703117532528082099">Naka-dock sa kaliwa ang aktibong window.</translation> <translation id="1708345662127501511">Desk: <ph name="DESK_NAME" /></translation> <translation id="1709762881904163296">Mga Network Setting</translation> <translation id="1715293566947629045">Dini-disable ang profile. Maghintay nang ilang minuto.</translation> @@ -277,6 +279,7 @@ <translation id="2727977024730340865">Naka-saksak sa isang low-power charger. Maaaring hindi maging tiyak ang pag-charge ng baterya.</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"I-delete"</translation> +<translation id="2750941250130734256">Naka-undock ang aktibong window.</translation> <translation id="2778650143428714839">Pinapamahalaan ng <ph name="MANAGER" /> ang <ph name="DEVICE_TYPE" /></translation> <translation id="2782591952652094792">Lumabas sa capture mode</translation> <translation id="2791421900609674576">Makakakita ka ng mga rekomendasyon para makapagpatuloy ka kung saan ka huminto. Puwede kang pumindot nang matagal para alisin ang mga rekomendasyon.</translation> @@ -790,6 +793,7 @@ <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Naka-on</translation> <translation id="5920710855273935292">Naka-mute ang mikropono.</translation> +<translation id="5924838240953214369">Capture Mode, <ph name="SOURCE" /> <ph name="TYPE" /> ang default. Nakatakda ang input ng camera sa <ph name="CAMERA_NAME" />, naka-on ang preview. Pindutin ang tab para mag-navigate gamit ang keyboard.</translation> <translation id="5946788582095584774">Naka-on ang <ph name="FEATURE_NAME" />.</translation> <translation id="5947494881799873997">I-revert</translation> <translation id="595202126637698455">Naka-enable ang pagte-trace sa pagganap</translation> @@ -1048,6 +1052,7 @@ <translation id="7564874036684306347">Kapag inilipat ang mga window sa isa pang desktop, maaari itong magresulta sa hindi inaasahang gawi. Maaaring hatiin ang mga susunod na notification, window, at dialog sa pagitan ng mga desktop.</translation> <translation id="7569509451529460200">Na-enable ang Braille at ChromeVox</translation> <translation id="7569983096843329377">Itim</translation> +<translation id="7573585051776738856">Naka-dock sa kanan ang aktibong window.</translation> <translation id="7579778809502851308">Screen capture</translation> <translation id="7590883480672980941">Mga setting ng input</translation> <translation id="7593891976182323525">Search or Shift</translation>
diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb index 54bedc6..03eb4537 100644 --- a/ash/strings/ash_strings_fr-CA.xtb +++ b/ash/strings/ash_strings_fr-CA.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">Agenda</translation> <translation id="1153356358378277386">Appareils associés</translation> <translation id="1165712434476988950">Vous devez redémarrer l'appareil pour appliquer la mise à jour.</translation> +<translation id="1171742223880403396">Votre câble USB-C peut ne pas se connecter correctement aux écrans</translation> <translation id="1175572348579024023">Faire défiler</translation> <translation id="1178581264944972037">Interrompre</translation> <translation id="1181037720776840403">Supprimer</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb index c355436..3370d51f 100644 --- a/ash/strings/ash_strings_fr.xtb +++ b/ash/strings/ash_strings_fr.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">Agenda</translation> <translation id="1153356358378277386">Appareils associés</translation> <translation id="1165712434476988950">Vous devez redémarrer l'appareil pour appliquer la mise à jour.</translation> +<translation id="1171742223880403396">Votre câble USB-C n'est peut-être pas connecté correctement à l'écran</translation> <translation id="1175572348579024023">Faire défiler</translation> <translation id="1178581264944972037">Suspendre</translation> <translation id="1181037720776840403">Supprimer</translation> @@ -937,7 +938,7 @@ <translation id="685782768769951078">{NUM_DIGITS,plural, =1{1 chiffre manquant}one{# chiffre manquant}other{# chiffres manquants}}</translation> <translation id="6867938213751067702">Téléchargement du fichier <ph name="FILENAME" /> suspendu</translation> <translation id="6878400149835617132">Raccourci désactivé</translation> -<translation id="6880133753431418782">Vous avez effectué cette recherche précédemment. Si vous la supprimez de votre historique, la requête sera supprimée de votre compte Google sur tous vos appareils de manière définitive.</translation> +<translation id="6880133753431418782">Vous avez effectué cette recherche précédemment. Si vous la supprimez de votre historique, la requête sera définitivement supprimée de votre compte Google sur tous vos appareils.</translation> <translation id="6884665277231944629">Revenir à aujourd'hui</translation> <translation id="6886172995547742638">Cela peut nuire aux performances de votre <ph name="DEVICE_TYPE" />. Utilisez un adaptateur secteur USB-C de <ph name="PREFERRED_MINIMUM_POWER" /> W ou plus.</translation> <translation id="688631446150864480">Appuyez sur la flèche vers le bas pour changer de fenêtre</translation>
diff --git a/ash/strings/ash_strings_gl.xtb b/ash/strings/ash_strings_gl.xtb index c5fd60e..b1b0dbb 100644 --- a/ash/strings/ash_strings_gl.xtb +++ b/ash/strings/ash_strings_gl.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">Calendario</translation> <translation id="1153356358378277386">Dispositivos sincronizados</translation> <translation id="1165712434476988950">É necesario reiniciar o dispositivo para que se aplique a actualización.</translation> +<translation id="1171742223880403396">O teu cable USB-C non pode conectarse a pantallas de maneira adecuada</translation> <translation id="1175572348579024023">Desprazarse</translation> <translation id="1178581264944972037">Pausar</translation> <translation id="1181037720776840403">Eliminar</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb index 7d680ba..01bd82f 100644 --- a/ash/strings/ash_strings_gu.xtb +++ b/ash/strings/ash_strings_gu.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">કૅલેન્ડર</translation> <translation id="1153356358378277386">જોડી કરેલા ઉપકરણો</translation> <translation id="1165712434476988950">અપડેટ લાગુ કરવા માટે ડિવાઇસને ફરી શરૂ કરવાની જરૂર છે.</translation> +<translation id="1171742223880403396">તમારો USB-C કેબલ ડિસ્પ્લે સાથે કદાચ યોગ્ય રીતે કનેક્ટ ન થાય</translation> <translation id="1175572348579024023">સ્ક્રોલ કરો</translation> <translation id="1178581264944972037">થોભો</translation> <translation id="1181037720776840403">કાઢી નાખો</translation>
diff --git a/ash/strings/ash_strings_hy.xtb b/ash/strings/ash_strings_hy.xtb index d08f7b9..5c4c0c9e 100644 --- a/ash/strings/ash_strings_hy.xtb +++ b/ash/strings/ash_strings_hy.xtb
@@ -125,8 +125,10 @@ <translation id="1668469839109562275">Ներկառուցված VPN</translation> <translation id="1677472565718498478">Մնացել է <ph name="TIME" /></translation> <translation id="1677507110654891115">«<ph name="FEATURE_NAME" />» գործառույթը միացված չէ։</translation> +<translation id="1677582821739292812">Ինչ-որ մեկը նայում է ձեր էկրանին</translation> <translation id="1698080062160024910">Ժամաչափ՝ <ph name="TOTAL_TIME" /> · <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6 հասցե՝ <ph name="ADDRESS" /></translation> +<translation id="1703117532528082099">Ակտիվ պատուհանն ամրացված է ձախ կողմում։</translation> <translation id="1708345662127501511">Աշխատասեղան՝ <ph name="DESK_NAME" /></translation> <translation id="1709762881904163296">Ցանցի կարգավորումներ</translation> <translation id="1715293566947629045">Պրոֆիլն անջատվում է։ Մի փոքր սպասեք։</translation> @@ -277,6 +279,7 @@ <translation id="2727977024730340865">Միացված է թույլ լիցքավորիչի: Մարտկոցի լիցքավորումը կարող է հուսալի չլինել:</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">«Delete» (Ջնջել)</translation> +<translation id="2750941250130734256">Ակտիվ պատուհանն ապամրացված է։</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> սարքը կառավարվում է <ph name="MANAGER" />-ի կողմից</translation> <translation id="2782591952652094792">Դուրս գալ տեսագրման ռեժիմից</translation> <translation id="2791421900609674576">Դուք առաջարկություններ կտեսնեք և կկարողանաք շարունակել այն պահից, որտեղ կանգ էիք առել։ Առաջարկությունները հեռացնելու համար հպեք և պահեք։</translation> @@ -790,6 +793,7 @@ <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Միացնել</translation> <translation id="5920710855273935292">Խոսափողի ձայնն անջատված է։</translation> +<translation id="5924838240953214369">Նկարահանման կանխադրված ռեժիմը՝ <ph name="SOURCE" /> <ph name="TYPE" />։ Ներածման համար սահմանված է <ph name="CAMERA_NAME" /> տեսակցիկը։ Նախադիտումը միացված է։ Սեղմեք Tab՝ ստեղնաշարի միջոցով նավիգացիայի համար։</translation> <translation id="5946788582095584774">«<ph name="FEATURE_NAME" />» գործառույթը միացված է։</translation> <translation id="5947494881799873997">Հետադարձել</translation> <translation id="595202126637698455">Կատարողականության հետագծումը միացված է</translation> @@ -1048,6 +1052,7 @@ <translation id="7564874036684306347">Պատուհանների տեղափոխումն այլ աշխատասեղան կարող է անսպասելի արդյունքներ ունենալ: Հետագա ծանուցումները, պատուհանները և երկխոսությունները կարող են տրոհվել աշխատասեղանների միջև:</translation> <translation id="7569509451529460200">Բրայլյան գրատիպն ու ChromeVox-ը միացված են</translation> <translation id="7569983096843329377">Սև</translation> +<translation id="7573585051776738856">Ակտիվ պատուհանն ամրացված է աջ կողմում։</translation> <translation id="7579778809502851308">Էկրանի լուսանկարում</translation> <translation id="7590883480672980941">Ներածման կարգավորումներ</translation> <translation id="7593891976182323525">Search կամ Shift</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb index eff0c0fe..0e8f5af 100644 --- a/ash/strings/ash_strings_id.xtb +++ b/ash/strings/ash_strings_id.xtb
@@ -125,8 +125,10 @@ <translation id="1668469839109562275">VPN bawaan</translation> <translation id="1677472565718498478">Sisa waktu <ph name="TIME" /></translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> tidak terhubung.</translation> +<translation id="1677582821739292812">Seseorang sedang melihat layar Anda</translation> <translation id="1698080062160024910">Timer <ph name="TOTAL_TIME" /> · <ph name="LABEL" /></translation> <translation id="1698760176351776263">Alamat IPv6: <ph name="ADDRESS" /></translation> +<translation id="1703117532528082099">Jendela yang aktif dikaitkan di kiri.</translation> <translation id="1708345662127501511">Desktop: <ph name="DESK_NAME" /></translation> <translation id="1709762881904163296">Setelan Jaringan</translation> <translation id="1715293566947629045">Menonaktifkan profil. Tunggu beberapa menit.</translation> @@ -277,6 +279,7 @@ <translation id="2727977024730340865">Dipasang ke pengisi daya rendah. Pengisian daya baterai mungkin tidak dapat diandalkan.</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Hapus"</translation> +<translation id="2750941250130734256">Jendela yang aktif dilepas kaitannya.</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> dikelola oleh <ph name="MANAGER" /></translation> <translation id="2782591952652094792">Keluar dari mode tangkapan layar</translation> <translation id="2791421900609674576">Rekomendasi akan ditampilkan sehingga Anda dapat melanjutkan aktivitas terakhir yang Anda lakukan. Anda dapat menyentuh lama untuk menghapus rekomendasi.</translation> @@ -790,6 +793,7 @@ <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Aktif</translation> <translation id="5920710855273935292">Mikrofon dibisukan.</translation> +<translation id="5924838240953214369">Mode Tangkapan Layar, opsi defaultnya adalah <ph name="TYPE" /> <ph name="SOURCE" />. Input kamera disetel ke <ph name="CAMERA_NAME" />, pratinjau aktif. Tekan tab untuk menavigasi dengan keyboard.</translation> <translation id="5946788582095584774"><ph name="FEATURE_NAME" /> aktif.</translation> <translation id="5947494881799873997">Kembalikan</translation> <translation id="595202126637698455">Kinerja pelacakan aktif</translation> @@ -1048,6 +1052,7 @@ <translation id="7564874036684306347">Memindahkan jendela ke desktop lain dapat mengakibatkan perilaku tak terduga. Notifikasi, jendela, dan dialog berikutnya dapat terpisah antardesktop.</translation> <translation id="7569509451529460200">Braille dan ChromeVox diaktifkan</translation> <translation id="7569983096843329377">Hitam</translation> +<translation id="7573585051776738856">Jendela yang aktif dikaitkan di kanan.</translation> <translation id="7579778809502851308">Screenshot</translation> <translation id="7590883480672980941">Setelan masukan</translation> <translation id="7593891976182323525">Telusuri atau Shift</translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb index 6134bd7d..574535100c 100644 --- a/ash/strings/ash_strings_is.xtb +++ b/ash/strings/ash_strings_is.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">Dagatal</translation> <translation id="1153356358378277386">Pöruð tæki</translation> <translation id="1165712434476988950">Endurræsa þarf tækið til að nota uppfærsluna.</translation> +<translation id="1171742223880403396">Ekki er víst að USB-C-snúran tengist skjáum á réttan hátt</translation> <translation id="1175572348579024023">Fletta</translation> <translation id="1178581264944972037">Gera hlé</translation> <translation id="1181037720776840403">Fjarlægja</translation> @@ -124,8 +125,10 @@ <translation id="1668469839109562275">Innbyggt VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> eftir</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> er ótengt.</translation> +<translation id="1677582821739292812">Einhver er að horfa á skjáinn þinn</translation> <translation id="1698080062160024910"><ph name="TOTAL_TIME" /> teljari · <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6-vistfang: <ph name="ADDRESS" /></translation> +<translation id="1703117532528082099">Virkur gluggi festur vinstra megin.</translation> <translation id="1708345662127501511">Skjár: <ph name="DESK_NAME" /></translation> <translation id="1709762881904163296">Netkerfisstillingar</translation> <translation id="1715293566947629045">Slekkur á prófíl. Hinkraðu í nokkrar mínútur.</translation> @@ -276,6 +279,7 @@ <translation id="2727977024730340865">Tengt við afllítið hleðslutæki. Hleðsla rafhlöðunnar kann að vera brigðul.</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">„Eyða“</translation> +<translation id="2750941250130734256">Virkur gluggi losaður.</translation> <translation id="2778650143428714839"><ph name="MANAGER" /> hefur umsjón með <ph name="DEVICE_TYPE" /></translation> <translation id="2782591952652094792">Loka tökustillingu</translation> <translation id="2791421900609674576">Þú sérð tillögur svo þú getir haldið áfram þar sem frá var horfið. Þú getur haldið inni til að fjarlægja tillögur.</translation> @@ -789,6 +793,7 @@ <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Kveikt</translation> <translation id="5920710855273935292">Slökkt er á hljóðnemanum.</translation> +<translation id="5924838240953214369">Tökustilling, <ph name="SOURCE" /> <ph name="TYPE" /> er sjálfgefið. Myndavélarinntak stillt á <ph name="CAMERA_NAME" />, kveikt er á forskoðun. Ýttu á Tab (dálkalykilinn) til að fletta á lyklaborði.</translation> <translation id="5946788582095584774">Kveikt er á <ph name="FEATURE_NAME" /></translation> <translation id="5947494881799873997">Afturkalla</translation> <translation id="595202126637698455">Kveikt á afkastarakningu</translation> @@ -1047,6 +1052,7 @@ <translation id="7564874036684306347">Ef gluggar eru færðir á annað skjáborð getur það valdið óvæntri hegðun. Frekari tilkynningum, gluggum og svargluggum verður hugsanlega deilt á milli skjáborða.</translation> <translation id="7569509451529460200">Kveikt á blindraletri og ChromeVox</translation> <translation id="7569983096843329377">Svartur</translation> +<translation id="7573585051776738856">Virkur gluggi festur hægra megin.</translation> <translation id="7579778809502851308">Skjámyndataka</translation> <translation id="7590883480672980941">Inntaksstillingar</translation> <translation id="7593891976182323525">Leit eða Shift</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb index e9359b2b..fbf4b9ab 100644 --- a/ash/strings/ash_strings_it.xtb +++ b/ash/strings/ash_strings_it.xtb
@@ -122,8 +122,10 @@ <translation id="1668469839109562275">VPN integrata</translation> <translation id="1677472565718498478"><ph name="TIME" /> rimanenti</translation> <translation id="1677507110654891115">La funzionalità <ph name="FEATURE_NAME" /> non è connessa.</translation> +<translation id="1677582821739292812">Qualcuno sta guardando il tuo schermo</translation> <translation id="1698080062160024910">Timer: <ph name="TOTAL_TIME" /> · <ph name="LABEL" /></translation> <translation id="1698760176351776263">Indirizzo IPv6: <ph name="ADDRESS" /></translation> +<translation id="1703117532528082099">Finestra attiva agganciata a sinistra.</translation> <translation id="1708345662127501511">Scrivania: <ph name="DESK_NAME" /></translation> <translation id="1709762881904163296">Impostazioni di rete</translation> <translation id="1715293566947629045">È in corso la disattivazione del profilo. Attendi qualche minuto.</translation> @@ -274,6 +276,7 @@ <translation id="2727977024730340865">Collegato a un caricabatterie a basso consumo. La carica della batteria potrebbe non essere affidabile.</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Elimina"</translation> +<translation id="2750941250130734256">Finestra attiva sganciata.</translation> <translation id="2778650143428714839">Dispositivo <ph name="DEVICE_TYPE" /> gestito da <ph name="MANAGER" /></translation> <translation id="2782591952652094792">Esci dalla modalità di acquisizione</translation> <translation id="2791421900609674576">Vedrai consigli per poter continuare dal punto in cui avevi interrotto. Puoi toccare i consigli e tenere premuto per rimuoverli.</translation> @@ -788,6 +791,7 @@ <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">On</translation> <translation id="5920710855273935292">L'audio del microfono è disattivato.</translation> +<translation id="5924838240953214369">Modalità di acquisizione, l'impostazione predefinita è <ph name="SOURCE" /> <ph name="TYPE" />. Input fotocamera impostato su <ph name="CAMERA_NAME" />, anteprima attiva. Premi Tab per usare la navigazione da tastiera.</translation> <translation id="5946788582095584774">La funzionalità <ph name="FEATURE_NAME" /> è attiva.</translation> <translation id="5947494881799873997">Ripristina</translation> <translation id="595202126637698455">Rilevamento del rendimento attivo</translation> @@ -1046,6 +1050,7 @@ <translation id="7564874036684306347">Lo spostamento delle finestre su un altro desktop potrebbe causare comportamenti imprevisti. Le finestre, le notifiche e le finestre di dialogo successive potrebbero essere divise tra i desktop.</translation> <translation id="7569509451529460200">Braille e ChromeVox attivati</translation> <translation id="7569983096843329377">Nero</translation> +<translation id="7573585051776738856">Finestra attiva agganciata a destra.</translation> <translation id="7579778809502851308">Acquisizione schermo</translation> <translation id="7590883480672980941">Impostazioni di immissione</translation> <translation id="7593891976182323525">Tasto per la ricerca o Maiusc</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb index 4f97606..9fbd2689 100644 --- a/ash/strings/ash_strings_iw.xtb +++ b/ash/strings/ash_strings_iw.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">יומן</translation> <translation id="1153356358378277386">מכשירים מותאמים</translation> <translation id="1165712434476988950">יש להפעיל מחדש את המכשיר כדי להחיל את העדכון.</translation> +<translation id="1171742223880403396">יכול להיות שכבל ה-USB-C שלך לא יתחבר למסכים כמו שצריך</translation> <translation id="1175572348579024023">גלילה</translation> <translation id="1178581264944972037">השהיה</translation> <translation id="1181037720776840403">הסרה</translation> @@ -124,6 +125,7 @@ <translation id="1668469839109562275">רשתות VPN מובנות</translation> <translation id="1677472565718498478">זמן נותר - <ph name="TIME" /></translation> <translation id="1677507110654891115">התכונה <ph name="FEATURE_NAME" /> לא מחוברת.</translation> +<translation id="1677582821739292812">מישהו מביט במסך שלך</translation> <translation id="1698080062160024910">טיימר של <ph name="TOTAL_TIME" /> · <ph name="LABEL" /></translation> <translation id="1698760176351776263">כתובת IPv6: <ph name="ADDRESS" /></translation> <translation id="1708345662127501511">שולחן עבודה וירטואלי: <ph name="DESK_NAME" /></translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb index 739ac10e..b062239f 100644 --- a/ash/strings/ash_strings_ja.xtb +++ b/ash/strings/ash_strings_ja.xtb
@@ -125,6 +125,7 @@ <translation id="1668469839109562275">組み込みの VPN</translation> <translation id="1677472565718498478">残り <ph name="TIME" /></translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> は接続されていません。</translation> +<translation id="1677582821739292812">他の人があなたの画面を見ています</translation> <translation id="1698080062160024910"><ph name="TOTAL_TIME" /> タイマー · <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6 アドレス: <ph name="ADDRESS" /></translation> <translation id="1703117532528082099">アクティブなウィンドウを左側に固定しました。</translation>
diff --git a/ash/strings/ash_strings_kk.xtb b/ash/strings/ash_strings_kk.xtb index ad777d8..abce29f 100644 --- a/ash/strings/ash_strings_kk.xtb +++ b/ash/strings/ash_strings_kk.xtb
@@ -125,8 +125,10 @@ <translation id="1668469839109562275">Ендірілген VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> қалды</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> қосылмады.</translation> +<translation id="1677582821739292812">Әлдекім экраныңызға қарап тұр.</translation> <translation id="1698080062160024910"><ph name="TOTAL_TIME" /> таймер · <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6 мекенжайы: <ph name="ADDRESS" /></translation> +<translation id="1703117532528082099">Белсенді терезе сол жаққа бекітілген.</translation> <translation id="1708345662127501511">Жұмыс үстелі: <ph name="DESK_NAME" /></translation> <translation id="1709762881904163296">Желі параметрлері</translation> <translation id="1715293566947629045">Профиль өшіріліп жатыр. Бірнеше минут күтіңіз.</translation> @@ -277,6 +279,7 @@ <translation id="2727977024730340865">Төмен қуатты зарядтағышқа жалғанған. Батареяны зарядтау кезінде қиындықтар болуы мүмкін.</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Жою"</translation> +<translation id="2750941250130734256">Белсенді терезе бекітілмеген.</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> құрылғысын <ph name="MANAGER" /> басқарады.</translation> <translation id="2782591952652094792">Түсіру режимінен шығу</translation> <translation id="2791421900609674576">Көретін ұсыныстардың арқасында тоқтаған жеріңізден жалғастыра аласыз. Ұсыныстарды өшіру үшін басып тұрыңыз.</translation> @@ -790,6 +793,7 @@ <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Қосулы</translation> <translation id="5920710855273935292">Микрофон дыбысы өшірулі.</translation> +<translation id="5924838240953214369">Түсіру режимі, әдепкі параметр – <ph name="SOURCE" /> <ph name="TYPE" />. Камера кірісі – <ph name="CAMERA_NAME" />, алдын ала қарау қосулы. Пернетақтамен басқару үшін Tab пернесін басыңыз.</translation> <translation id="5946788582095584774"><ph name="FEATURE_NAME" /> қосулы.</translation> <translation id="5947494881799873997">Қайтару</translation> <translation id="595202126637698455">Өнімділікті бақылау қосылған</translation> @@ -1048,6 +1052,7 @@ <translation id="7564874036684306347">Терезелерді басқа жұмыс үстеліне ауыстырғанда, күтпеген қате шығуы мүмкін. Хабарландырулар, терезелер мен диалогтік терезелер түрлі жұмыс үстелдерінде көрсетілуі ықтимал.</translation> <translation id="7569509451529460200">Брайль және ChromeVox қосулы</translation> <translation id="7569983096843329377">Қара</translation> +<translation id="7573585051776738856">Белсенді терезе оң жаққа бекітілген.</translation> <translation id="7579778809502851308">Экран суреті</translation> <translation id="7590883480672980941">Енгізу параметрлері</translation> <translation id="7593891976182323525">Search немесе Shift</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb index a7cc2d1..a4ee3fc3 100644 --- a/ash/strings/ash_strings_ko.xtb +++ b/ash/strings/ash_strings_ko.xtb
@@ -125,8 +125,10 @@ <translation id="1668469839109562275">기본 제공 VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> 남음</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" />이 연결되어 있지 않습니다.</translation> +<translation id="1677582821739292812">누가 내 화면을 보고 있습니다.</translation> <translation id="1698080062160024910"><ph name="TOTAL_TIME" /> 타이머 · <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6 주소: <ph name="ADDRESS" /></translation> +<translation id="1703117532528082099">활성 창이 왼쪽에 고정되었습니다.</translation> <translation id="1708345662127501511">데스크: <ph name="DESK_NAME" /></translation> <translation id="1709762881904163296">네트워크 설정</translation> <translation id="1715293566947629045">프로필을 사용 중지하는 중입니다. 몇 분 정도 기다려 주세요.</translation> @@ -277,6 +279,7 @@ <translation id="2727977024730340865">저출력 충전기에 연결되었습니다. 배터리 충전 상태가 불안정합니다.</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"삭제"</translation> +<translation id="2750941250130734256">활성 창이 고정 해제되었습니다.</translation> <translation id="2778650143428714839"><ph name="MANAGER" />에서 관리하는 <ph name="DEVICE_TYPE" /></translation> <translation id="2782591952652094792">캡처 모드 종료</translation> <translation id="2791421900609674576">이전에 중단한 부분부터 계속할 수 있도록 추천 항목이 표시됩니다. 추천 항목을 삭제하려면 길게 터치하세요.</translation> @@ -790,6 +793,7 @@ <translation id="5911909173233110115"><ph name="USERNAME" />(<ph name="MAIL" />)</translation> <translation id="5916664084637901428">사용</translation> <translation id="5920710855273935292">마이크가 음소거되어 있습니다.</translation> +<translation id="5924838240953214369">캡처 모드, 기본값은 <ph name="SOURCE" /> <ph name="TYPE" />입니다. 카메라 입력이 <ph name="CAMERA_NAME" />(으)로 설정되어 있으며, 미리보기가 켜져 있습니다. 키보드 탐색을 사용하려면 Tab 키를 누르세요.</translation> <translation id="5946788582095584774"><ph name="FEATURE_NAME" /> 기능이 켜져 있습니다.</translation> <translation id="5947494881799873997">되돌리기</translation> <translation id="595202126637698455">성능 추적 사용 중</translation> @@ -1048,6 +1052,7 @@ <translation id="7564874036684306347">창을 다른 데스크톱으로 이동하면 예기치 못한 동작이 나타날 수 있습니다. 이후의 알림, 창, 대화상자가 데스크톱 간에 분할될 수 있습니다.</translation> <translation id="7569509451529460200">점자와 ChromeVox가 사용 설정되었습니다.</translation> <translation id="7569983096843329377">검정색</translation> +<translation id="7573585051776738856">활성 창이 오른쪽에 고정되었습니다.</translation> <translation id="7579778809502851308">화면 캡처</translation> <translation id="7590883480672980941">입력 설정</translation> <translation id="7593891976182323525">검색 또는 Shift 키</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb index 49d8443..e9662c0 100644 --- a/ash/strings/ash_strings_ky.xtb +++ b/ash/strings/ash_strings_ky.xtb
@@ -125,6 +125,7 @@ <translation id="1668469839109562275">Камтылган VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> калды</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> туташкан жок.</translation> +<translation id="1677582821739292812">Кимдир бирөө экраныңызды көрүп турат</translation> <translation id="1698080062160024910"><ph name="TOTAL_TIME" /> таймер · <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6 дареги: <ph name="ADDRESS" /></translation> <translation id="1703117532528082099">Активдүү терезе сол жакка бекитилди.</translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb index caba3f2..85ece68f 100644 --- a/ash/strings/ash_strings_lo.xtb +++ b/ash/strings/ash_strings_lo.xtb
@@ -125,6 +125,7 @@ <translation id="1668469839109562275">VPN ໃນຕົວ</translation> <translation id="1677472565718498478">ຍັງເຫຼືອ <ph name="TIME" /></translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> ບໍ່ໄດ້ເຊື່ອມຕໍ່.</translation> +<translation id="1677582821739292812">ມີຄົນກຳລັງເບິ່ງໜ້າຈໍຂອງທ່ານ</translation> <translation id="1698080062160024910">ໂມງນັບຖອຍຫຼັງ <ph name="TOTAL_TIME" /> · <ph name="LABEL" /></translation> <translation id="1698760176351776263">ທີ່ຢູ່ IPv6: <ph name="ADDRESS" /></translation> <translation id="1703117532528082099">ຈອດໜ້າຈໍທີ່ນຳໃຊ້ຢູ່ທາງຊ້າຍແລ້ວ.</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index d6178fc..fb7f560 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">Kalendorius</translation> <translation id="1153356358378277386">Susieti įrenginiai</translation> <translation id="1165712434476988950">Norint pritaikyti naujinį, reikia paleisti įrenginį iš naujo.</translation> +<translation id="1171742223880403396">Gali būti, kad USB-C laidu nepavyksta tinkamai prisijungti prie ekranų</translation> <translation id="1175572348579024023">Slinkti</translation> <translation id="1178581264944972037">Pristabdyti</translation> <translation id="1181037720776840403">Pašalinti</translation> @@ -124,8 +125,10 @@ <translation id="1668469839109562275">Įtaisytasis VPN</translation> <translation id="1677472565718498478">Liko <ph name="TIME" /></translation> <translation id="1677507110654891115">„<ph name="FEATURE_NAME" />“ neprijungta.</translation> +<translation id="1677582821739292812">Kažkas žiūri į jūsų ekraną</translation> <translation id="1698080062160024910"><ph name="TOTAL_TIME" /> laikmatis · <ph name="LABEL" /></translation> <translation id="1698760176351776263">„IPv6“ adresas: <ph name="ADDRESS" /></translation> +<translation id="1703117532528082099">Aktyvus langas įstatytas kairėje.</translation> <translation id="1708345662127501511">Darbalaukis: <ph name="DESK_NAME" /></translation> <translation id="1709762881904163296">Tinklo nustatymai</translation> <translation id="1715293566947629045">Profilis išjungiamas. Palaukite kelias minutes.</translation> @@ -276,6 +279,7 @@ <translation id="2727977024730340865">Prijungtas mažos galios įkroviklis. Akumuliatoriaus įkrovimas gali būti nepatikimas.</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">„Ištrinti“</translation> +<translation id="2750941250130734256">Aktyvus langas pašalintas.</translation> <translation id="2778650143428714839">„<ph name="DEVICE_TYPE" />“ tvarko <ph name="MANAGER" /></translation> <translation id="2782591952652094792">Išjungti užfiksavimo režimą</translation> <translation id="2791421900609674576">Matysite rekomendacijas, kad galėtumėte tęsti nuo ten, kur baigėte. Palieskite ir palaikykite, jei norite pašalinti rekomendacijas.</translation> @@ -789,6 +793,7 @@ <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Įjungta</translation> <translation id="5920710855273935292">Mikrofonas nutildytas.</translation> +<translation id="5924838240953214369">Užfiksavimo režimas, numatytoji parinktis yra <ph name="SOURCE" /> <ph name="TYPE" />. Fotoaparato įvestis nustatyta kaip „<ph name="CAMERA_NAME" />“, peržiūra įjungta. Jei norite naudoti klaviatūrą, paspauskite tabuliavimo klavišą.</translation> <translation id="5946788582095584774">„<ph name="FEATURE_NAME" />“ įjungta.</translation> <translation id="5947494881799873997">Grąžinti</translation> <translation id="595202126637698455">Įgalintas našumo stebėjimas</translation> @@ -1047,6 +1052,7 @@ <translation id="7564874036684306347">Perkėlus langus į kitą darbalaukį gali pasireikšti nenumatyta elgsena. Vėlesni pranešimai, langai ir dialogų langai gali būti padalyti keliuose darbalaukiuose.</translation> <translation id="7569509451529460200">Brailio rašmenys ir „ChromeVox“ įgalinti</translation> <translation id="7569983096843329377">Juoda</translation> +<translation id="7573585051776738856">Aktyvus langas įstatytas dešinėje.</translation> <translation id="7579778809502851308">Ekrano fiksavimas</translation> <translation id="7590883480672980941">Įvesties nustatymai</translation> <translation id="7593891976182323525">Paieškos arba „Shift“</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb index 1ed0431..f737ee7 100644 --- a/ash/strings/ash_strings_lv.xtb +++ b/ash/strings/ash_strings_lv.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">Kalendārs</translation> <translation id="1153356358378277386">Pārī savienotās ierīces</translation> <translation id="1165712434476988950">Lai lietotu atjauninājumu, ir jārestartē ierīce.</translation> +<translation id="1171742223880403396">Iespējams, jūsu USB-C vads nevarēs nodrošināt pareizu savienojumu ar displejiem.</translation> <translation id="1175572348579024023">Ritināt</translation> <translation id="1178581264944972037">Pauzēt</translation> <translation id="1181037720776840403">Noņemt</translation>
diff --git a/ash/strings/ash_strings_my.xtb b/ash/strings/ash_strings_my.xtb index 3ef042a..a8c8a341 100644 --- a/ash/strings/ash_strings_my.xtb +++ b/ash/strings/ash_strings_my.xtb
@@ -125,8 +125,10 @@ <translation id="1668469839109562275">အသင့်ပါသော VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> ကျန်ပါသည်</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> ချိတ်ဆက်မထားပါ။</translation> +<translation id="1677582821739292812">တစ်စုံတစ်ဦးက သင့်စခရင်ကို ကြည့်နေသည်</translation> <translation id="1698080062160024910"><ph name="TOTAL_TIME" /> တိုင်မာ · <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6 လိပ်စာ− <ph name="ADDRESS" /></translation> +<translation id="1703117532528082099">ဖွင့်ထားသည့်ဝင်းဒိုးကို ဘယ်ဖက်တွင် နေရာချလိုက်သည်။</translation> <translation id="1708345662127501511">မျက်နှာပြင်နေရာ - <ph name="DESK_NAME" /></translation> <translation id="1709762881904163296">ကွန်ရက်ဆက်တင်များ</translation> <translation id="1715293566947629045">ပရိုဖိုင် ပိတ်နေသည်။ မိနစ်အနည်းငယ် စောင့်ပါ။</translation> @@ -277,6 +279,7 @@ <translation id="2727977024730340865">ပါဝါနည်းသည့် အားသွင်းကိရိယာသို့ ချိတ်ဆက်ထားသည်။ ဘတ်ထရီအားသွင်းခြင်း အားကိုး၍ရမည် မဟုတ်ပါ။</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />၊ <ph name="PRICE" /></translation> <translation id="2750932254614666392">"ဖျက်ရန်"</translation> +<translation id="2750941250130734256">ဖွင့်ထားသည့်ဝင်းဒိုးကို ဖြုတ်လိုက်သည်။</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> ကို <ph name="MANAGER" /> က စီမံခန့်ခွဲသည်</translation> <translation id="2782591952652094792">ပုံဖမ်းယူမှုမုဒ်မှ ထွက်မည်</translation> <translation id="2791421900609674576">ထားခဲ့သည့်နေရာမှ ဆက်လုပ်နိုင်ရန် အကြံပြုချက်များ မြင်ရပါမည်။ တို့ထိ၍ ဖိထားပြီး အကြံပြုချက်များ ဖျက်နိုင်သည်။</translation> @@ -790,6 +793,7 @@ <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">ဖွင့်ရန်</translation> <translation id="5920710855273935292">မိုက်ပိတ်ထားသည်။</translation> +<translation id="5924838240953214369">ပုံဖမ်းယူမှုမုဒ်၊ မူရင်းမှာ <ph name="SOURCE" /> <ph name="TYPE" /> ဖြစ်သည်။ <ph name="CAMERA_NAME" /> အတွက် ကင်မရာသုံးခြင်းကို သတ်မှတ်ပြီး အစမ်းကြည့်ရှုမှု ဖွင့်ထားသည်။ ကီးဘုတ် လမ်းညွှန်အတွက် တဘ်ကိုနှိပ်ပါ။</translation> <translation id="5946788582095584774"><ph name="FEATURE_NAME" /> ဖွင့်ထားသည်။</translation> <translation id="5947494881799873997">မူလအခြေအနေ ပြန်သွားရန်</translation> <translation id="595202126637698455">ဆောင်ရွက်ချက်များကို ခြေရာခံနေသည်။</translation> @@ -1048,6 +1052,7 @@ <translation id="7564874036684306347">ဝင်းဒိုးများကို အခြားဒက်စ်တော့တစ်ခုသို့ ရွှေ့ခြင်းဖြင့် မျှော်လင့်မထားသည့် လုပ်ဆောင်ပုံများ ဖြစ်ပေါ်စေနိုင်ပါသည်။ နောက်ဆက်တွဲ အကြောင်းကြားချက်များ၊ ဝင်းဒိုးများနှင့် စကားပြောများကို ဒက်စ်တော့များအကြား ခွဲဖွင့်နိုင်ပါသည်။</translation> <translation id="7569509451529460200">မျက်မမြင်စာ နှင့် ChromeVox ကို ဖွင့်ထားပါသည်</translation> <translation id="7569983096843329377">အနက်ရောင်</translation> +<translation id="7573585051776738856">ဖွင့်ထားသည့်ဝင်းဒိုးကို ညာဖက်တွင် နေရာချလိုက်သည်။</translation> <translation id="7579778809502851308">ဖန်သားပြင် ပုံဖမ်းခြင်း</translation> <translation id="7590883480672980941">ထည့်သွင်းမှု ဆက်တင်များ</translation> <translation id="7593891976182323525">ရှာဖွေမည် သို့မဟုတ် ပြောင်းလဲမည်</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb index 6fd6e2e..c7f40860 100644 --- a/ash/strings/ash_strings_ne.xtb +++ b/ash/strings/ash_strings_ne.xtb
@@ -125,6 +125,7 @@ <translation id="1668469839109562275">अन्तर्निर्मित VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> बाँकी छ</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> कनेक्ट गरिएको छैन।</translation> +<translation id="1677582821739292812">कुनै व्यक्तिले तपाईंको स्क्रिनमा हेरिरहनुभएको छ</translation> <translation id="1698080062160024910"><ph name="TOTAL_TIME" /> टाइमर · <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6 ठेगाना: <ph name="ADDRESS" /></translation> <translation id="1703117532528082099">सक्रिय विन्डो बायाँतिर डक गरिएको छ।</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb index 3294a1c..31aec3a 100644 --- a/ash/strings/ash_strings_nl.xtb +++ b/ash/strings/ash_strings_nl.xtb
@@ -122,6 +122,7 @@ <translation id="1668469839109562275">Ingebouwde VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> resterend</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> is niet verbonden.</translation> +<translation id="1677582821739292812">Iemand bekijkt je scherm</translation> <translation id="1698080062160024910">Timer van <ph name="TOTAL_TIME" /> · <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6-adres: <ph name="ADDRESS" /></translation> <translation id="1703117532528082099">Actief venster links vastgezet.</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index a2bc6ec..8ba4c26 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb
@@ -125,8 +125,10 @@ <translation id="1668469839109562275">Innebygd VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> igjen</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> er ikke tilkoblet.</translation> +<translation id="1677582821739292812">Noen ser på skjermen din</translation> <translation id="1698080062160024910">Nedtelling på <ph name="TOTAL_TIME" /> · <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6-adresse: <ph name="ADDRESS" /></translation> +<translation id="1703117532528082099">Det aktive vinduet er festet på venstre side.</translation> <translation id="1708345662127501511">Skrivebord: <ph name="DESK_NAME" /></translation> <translation id="1709762881904163296">Nettverksinnstillinger</translation> <translation id="1715293566947629045">Deaktiverer profil. Vent i noen minutter.</translation> @@ -277,6 +279,7 @@ <translation id="2727977024730340865">Tilkoblet laveffektslader. Batteriladingen kan være upålitelig.</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" /> – <ph name="PRICE" /></translation> <translation id="2750932254614666392">«Slett»</translation> +<translation id="2750941250130734256">Det aktive vinduet er løsnet.</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> administreres av <ph name="MANAGER" /></translation> <translation id="2782591952652094792">Avslutt opptaksmodus</translation> <translation id="2791421900609674576">Du ser anbefalinger, slik at du kan fortsette der du slapp. Trykk og hold for å fjerne anbefalinger.</translation> @@ -790,6 +793,7 @@ <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">På</translation> <translation id="5920710855273935292">Lyden for mikrofonen er kuttet.</translation> +<translation id="5924838240953214369">Opptaksmodus – standard er <ph name="SOURCE" /> <ph name="TYPE" />. Kamerakilden er satt til <ph name="CAMERA_NAME" />. Forhåndsvisning er på. Trykk på Tab for å navigere med tastaturet.</translation> <translation id="5946788582095584774"><ph name="FEATURE_NAME" /> er på.</translation> <translation id="5947494881799873997">Tilbakestill</translation> <translation id="595202126637698455">Ytelsessporing er aktivert</translation> @@ -1048,6 +1052,7 @@ <translation id="7564874036684306347">Flytting av vinduer til et annet skrivebord kan føre til uventet atferd. Følgende varsler, vinduer og dialogbokser kan bli delt mellom skrivebordene.</translation> <translation id="7569509451529460200">Braille og ChromeVox er slått på</translation> <translation id="7569983096843329377">Svart</translation> +<translation id="7573585051776738856">Det aktive vinduet er festet på høyre side.</translation> <translation id="7579778809502851308">Skjermdump</translation> <translation id="7590883480672980941">Inndatainnstillinger</translation> <translation id="7593891976182323525">Søk eller Shift</translation>
diff --git a/ash/strings/ash_strings_or.xtb b/ash/strings/ash_strings_or.xtb index 4b56f50..87b3a15 100644 --- a/ash/strings/ash_strings_or.xtb +++ b/ash/strings/ash_strings_or.xtb
@@ -128,6 +128,7 @@ <translation id="1677582821739292812">କୌଣସି ବ୍ୟକ୍ତି ଆପଣଙ୍କ ସ୍କ୍ରିନକୁ ଦେଖୁଛନ୍ତି</translation> <translation id="1698080062160024910"><ph name="TOTAL_TIME" /> ଟାଇମର୍ · <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6 ଠିକଣା: <ph name="ADDRESS" /></translation> +<translation id="1703117532528082099">ସକ୍ରିୟ ୱିଣ୍ଡୋକୁ ବାମପଟେ ଡକ କରାଯାଇଛି।</translation> <translation id="1708345662127501511">ଡେସ୍କ: <ph name="DESK_NAME" /></translation> <translation id="1709762881904163296">ନେଟୱାର୍କ ସେଟିଂସ୍</translation> <translation id="1715293566947629045">ପ୍ରୋଫାଇଲକୁ ଅକ୍ଷମ କରାଯାଉଛି। କିଛି ସମୟ ପାଇଁ ଅପେକ୍ଷା କରନ୍ତୁ।</translation> @@ -278,6 +279,7 @@ <translation id="2727977024730340865">କମ୍-ପାୱର୍ଯୁକ୍ତ ଚାର୍ଜର୍। ବ୍ୟାଟେରୀ ଚାର୍ଜିଂ ନିର୍ଭରଯୋଗ୍ୟ ହୋଇନପାରେ।</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"ଡିଲିଟ କରନ୍ତୁ"</translation> +<translation id="2750941250130734256">ସକ୍ରିୟ ୱିଣ୍ଡୋକୁ ଅନଡକ କରାଯାଇଛି।</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" />, <ph name="MANAGER" /> ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଛି</translation> <translation id="2782591952652094792">କ୍ୟାପଚର୍ ମୋଡରୁ ବାହାରି ଯାଆନ୍ତୁ</translation> <translation id="2791421900609674576">ଆପଣ ଯେଉଁଠାରେ ଛାଡ଼ିଥିଲେ ସେଠାରୁ ଜାରି ରଖିବା ପାଇଁ ସୁପାରିଶଗୁଡ଼ିକ ଦେଖିବେ। ଆପଣ ସୁପାରିଶଗୁଡ଼ିକୁ କାଢ଼ି ଦେବା ପାଇଁ ସ୍ପର୍ଶ କରି ଧରି ରଖିପାରିବେ।</translation> @@ -791,6 +793,7 @@ <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">ଚାଲୁ</translation> <translation id="5920710855273935292">ମାଇକ୍ ମ୍ୟୁଟ୍ କରାଯାଇଛି।</translation> +<translation id="5924838240953214369">କ୍ୟାପଚର ମୋଡ, ଡିଫଲ୍ଟ ହେଉଛି <ph name="SOURCE" /> <ph name="TYPE" />। କ୍ୟାମେରା ଇନପୁଟକୁ <ph name="CAMERA_NAME" />ରେ ସେଟ କରାଯାଇଛି, ପ୍ରିଭ୍ୟୁ ଚାଲୁ ଅଛି। କୀବୋର୍ଡ ନାଭିଗେସନ ପାଇଁ ଟାବକୁ ଦବାନ୍ତୁ।</translation> <translation id="5946788582095584774"><ph name="FEATURE_NAME" /> ଚାଲୁ ଅଛି।</translation> <translation id="5947494881799873997">ପୂର୍ବାବସ୍ଥାକୁ ଆଣନ୍ତୁ</translation> <translation id="595202126637698455">କାର୍ଯ୍ୟଦକ୍ଷତା ଟ୍ରେସିଂ ସକ୍ଷମ କରାଯାଇଛି</translation> @@ -1048,6 +1051,7 @@ <translation id="7564874036684306347">ୱିଣ୍ଡୋକୁ ଅନ୍ୟ ଡେକ୍ସଟପ୍କୁ ତ୍ୱରିତ କରିବା ଦ୍ୱାରା ଅପ୍ରତ୍ୟାଶିତ ଆଚରଣ ହୋଇପାରେ। ଏହା ପରବର୍ତ୍ତୀ ବିଜ୍ଞପ୍ତି, ୱିଣ୍ଡୋ ଏବଂ ଡାଏଲଗ୍ଗୁଡ଼ିକ ଡେକ୍ସଟପ୍ଗୁଡ଼ିକ ମଧ୍ୟରେ ଅଲଗା ହୋଇପାରେ।</translation> <translation id="7569509451529460200">Braille ଏବଂ ChromeVoxକୁ ସକ୍ଷମ କରାଯାଇଛି</translation> <translation id="7569983096843329377">କଳା</translation> +<translation id="7573585051776738856">ସକ୍ରିୟ ୱିଣ୍ଡୋକୁ ଡାହାଣପଟେ ଡକ କରାଯାଇଛି।</translation> <translation id="7579778809502851308">ସ୍କ୍ରିନ୍ କ୍ୟାପଚର୍</translation> <translation id="7590883480672980941">ଇନପୁଟ୍ ସେଟିଂସ୍</translation> <translation id="7593891976182323525">Search କିମ୍ବା Shift</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb index 22117218..191ba5e 100644 --- a/ash/strings/ash_strings_pa.xtb +++ b/ash/strings/ash_strings_pa.xtb
@@ -125,6 +125,7 @@ <translation id="1668469839109562275">ਅੰਦਰ-ਮੌਜੂਦ VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> ਬਾਕੀ</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> ਕਨੈਕਟ ਨਹੀਂ ਹੈ।</translation> +<translation id="1677582821739292812">ਕੋਈ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਵੱਲ ਦੇਖ ਰਿਹਾ ਹੈ</translation> <translation id="1698080062160024910"><ph name="TOTAL_TIME" /> ਟਾਈਮਰ · <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6 ਪਤਾ: <ph name="ADDRESS" /></translation> <translation id="1708345662127501511">ਡੈਸਕ: <ph name="DESK_NAME" /></translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index 9d4ab72..46f5fc8 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb
@@ -125,6 +125,7 @@ <translation id="1668469839109562275">Wbudowana sieć VPN</translation> <translation id="1677472565718498478">Pozostało <ph name="TIME" /></translation> <translation id="1677507110654891115">Funkcja <ph name="FEATURE_NAME" /> nie ma połączenia.</translation> +<translation id="1677582821739292812">Ktoś patrzy na Twój ekran</translation> <translation id="1698080062160024910">Minutnik <ph name="TOTAL_TIME" /> · <ph name="LABEL" /></translation> <translation id="1698760176351776263">Adres IPv6: <ph name="ADDRESS" /></translation> <translation id="1703117532528082099">Aktywne okno zadokowano po lewej.</translation>
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb index 4b69a3c..acc930f 100644 --- a/ash/strings/ash_strings_si.xtb +++ b/ash/strings/ash_strings_si.xtb
@@ -125,8 +125,10 @@ <translation id="1668469839109562275">තිළැලි VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> ඉතිරිය</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> සම්බන්ධ නැත.</translation> +<translation id="1677582821739292812">යම් කෙනෙක් ඔබගේ තිරය දෙස බලා සිටී</translation> <translation id="1698080062160024910"><ph name="TOTAL_TIME" /> කාල ගණකය · <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6 ලිපිනය: <ph name="ADDRESS" /></translation> +<translation id="1703117532528082099">සක්රිය කවුළුව වමේ ඈඳා ඇත.</translation> <translation id="1708345662127501511">මේසය: <ph name="DESK_NAME" /></translation> <translation id="1709762881904163296">ජාල සැකසීම්</translation> <translation id="1715293566947629045">පැතිකඩ අබල කරමින්. මිනිත්තු කිහිපයක් රැඳී සිටින්න.</translation> @@ -277,6 +279,7 @@ <translation id="2727977024730340865">අඩු බල චාජරයකට ප්ලග් ඉන් කර ඇත. බැටරිය චාජ් කිරිම විශ්වාස නැති විය හැක.</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"මකන්න"</translation> +<translation id="2750941250130734256">සක්රිය කවුළුව ඈඳීම ඉවත් කර ඇත.</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> <ph name="MANAGER" /> විසින් කළමනාකරණය කෙරේ</translation> <translation id="2782591952652094792">ග්රහණ ප්රකාරයෙන් ඉවත් වන්න</translation> <translation id="2791421900609674576">ඔබ නතර කළ තැනින් ඉදිරියට යාමට ඔබට නිර්දේශ පෙනෙනු ඇත. නිර්දේශ ඉවත් කිරීමට ඔබට ස්පර්ශ කර අල්ලා ගෙන සිටිය හැකිය.</translation> @@ -790,6 +793,7 @@ <translation id="5911909173233110115"><ph name="USERNAME" /> <ph name="MAIL" /></translation> <translation id="5916664084637901428">ක්රියාත්මකයි</translation> <translation id="5920710855273935292">මයිකය නිහඬයි.</translation> +<translation id="5924838240953214369">ග්රහණ ප්රකාරය, පෙරනිමි වන්නේ <ph name="SOURCE" /> <ph name="TYPE" />. කැමරා ආදානය <ph name="CAMERA_NAME" /> ලෙස සකසා ඇත, පෙරදසුන ක්රියාත්මකයි. යතුරු පුවරු සංචාලනය සඳහා ටැබය ඔබන්න.</translation> <translation id="5946788582095584774"><ph name="FEATURE_NAME" /> ක්රියාත්මකයි.</translation> <translation id="5947494881799873997">ප්රතිවර්තනය</translation> <translation id="595202126637698455">ක්රියාකරිත්ව හඹායෑම සබල කෙරිණි</translation> @@ -1048,6 +1052,7 @@ <translation id="7564874036684306347">කවුළු වෙනත් ඩෙස්ක්ටොප් එකකට මාරු කිරීමෙන් අනපේක්ෂිත හැසිරීමකට හේතු විය හැකිය. පසුකාලීන දැනුම්දීම්, කවුළු සහ සංවාද ඩෙස්ක්ටොප් අතර බෙදී යනු ඇත.</translation> <translation id="7569509451529460200">බ්රේල් සහ ChromeVox සබලයි</translation> <translation id="7569983096843329377">කළු</translation> +<translation id="7573585051776738856">සක්රිය කවුළුව දකුණේ ඈඳා ඇත.</translation> <translation id="7579778809502851308">තිර ග්රහණය</translation> <translation id="7590883480672980941">ආදාන සැකසීම්</translation> <translation id="7593891976182323525">Search හෝ Shift</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index e0daee1e..9ff0c35 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -125,6 +125,7 @@ <translation id="1668469839109562275">Vstavaná sieť VPN</translation> <translation id="1677472565718498478">Zostávajúci čas: <ph name="TIME" /></translation> <translation id="1677507110654891115">Funkcia <ph name="FEATURE_NAME" /> nie je pripojená.</translation> +<translation id="1677582821739292812">Niekto sa pozerá na vašu obrazovku</translation> <translation id="1698080062160024910">Časovač na <ph name="TOTAL_TIME" /> · <ph name="LABEL" /></translation> <translation id="1698760176351776263">Adresa IPv6: <ph name="ADDRESS" /></translation> <translation id="1703117532528082099">Aktívne okno je ukotvené vľavo.</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index 74ce659..c94fe36 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb
@@ -125,6 +125,7 @@ <translation id="1668469839109562275">Vgrajeno omrežje VPN</translation> <translation id="1677472565718498478">Še <ph name="TIME" /></translation> <translation id="1677507110654891115">Povezava s funkcijo <ph name="FEATURE_NAME" /> ni vzpostavljena.</translation> +<translation id="1677582821739292812">Nekdo gleda na vaš zaslon</translation> <translation id="1698080062160024910">Časovnik (<ph name="TOTAL_TIME" />) · <ph name="LABEL" /></translation> <translation id="1698760176351776263">Naslov IPv6: <ph name="ADDRESS" /></translation> <translation id="1708345662127501511">Namizje: <ph name="DESK_NAME" /></translation>
diff --git a/ash/strings/ash_strings_sq.xtb b/ash/strings/ash_strings_sq.xtb index abae71e..c98215bc 100644 --- a/ash/strings/ash_strings_sq.xtb +++ b/ash/strings/ash_strings_sq.xtb
@@ -127,6 +127,7 @@ <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> nuk është lidhur.</translation> <translation id="1698080062160024910">Kohëmatësi: <ph name="TOTAL_TIME" /> · <ph name="LABEL" /></translation> <translation id="1698760176351776263">Adresa IPv6: <ph name="ADDRESS" /></translation> +<translation id="1703117532528082099">Dritarja aktive u pozicionua në të majtë.</translation> <translation id="1708345662127501511">Tavolina e punës: <ph name="DESK_NAME" /></translation> <translation id="1709762881904163296">Cilësimet e rrjetit</translation> <translation id="1715293566947629045">Profili po çaktivizohet. Prit disa minuta.</translation> @@ -277,6 +278,7 @@ <translation id="2727977024730340865">E lidhur me një karikues me fuqi të ulët. Ngarkimi i baterisë mund të mos jetë i sigurt.</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Fshi"</translation> +<translation id="2750941250130734256">Dritarja aktive u hoq nga pozicioni.</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> menaxhohet nga <ph name="MANAGER" /></translation> <translation id="2782591952652094792">Dil nga modaliteti i regjistrimit</translation> <translation id="2791421900609674576">Do të shohësh rekomandime, në mënyrë që të vazhdosh aty ku e ke lënë. Mund të prekësh dhe të mbash shtypur për të hequr rekomandimet.</translation> @@ -790,6 +792,7 @@ <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Aktiv</translation> <translation id="5920710855273935292">Mikrofoni është i çaktivizuar.</translation> +<translation id="5924838240953214369">Modaliteti i regjistrimit, parazgjedhja është <ph name="TYPE" /> (<ph name="SOURCE" />). Hyrja e kamerës u caktua te <ph name="CAMERA_NAME" />; pamja paraprake aktive. Shtyp tastin Tab për navigimin e tastierës.</translation> <translation id="5946788582095584774"><ph name="FEATURE_NAME" /> është aktive.</translation> <translation id="5947494881799873997">Riktheje</translation> <translation id="595202126637698455">Gjurmimi i rendimentit u aktivizua</translation> @@ -1048,6 +1051,7 @@ <translation id="7564874036684306347">Zhvendosja e dritareve te një desktop tjetër mund të shkaktojë një sjellje të papritur. Njoftimet pasuese, dritarja dhe dialogët mund të ndahen mes desktopëve.</translation> <translation id="7569509451529460200">Braille dhe ChromeVox janë aktivizuar</translation> <translation id="7569983096843329377">E zezë</translation> +<translation id="7573585051776738856">Dritarja aktive u pozicionua në të djathtë.</translation> <translation id="7579778809502851308">Regjistrimi i ekranit</translation> <translation id="7590883480672980941">Cilësimet e hyrjes</translation> <translation id="7593891976182323525">Kërko ose Shift</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb index aef2997..e93e8b0 100644 --- a/ash/strings/ash_strings_sv.xtb +++ b/ash/strings/ash_strings_sv.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">Kalender</translation> <translation id="1153356358378277386">Kopplade enheter</translation> <translation id="1165712434476988950">Enheten måste startas om för att uppdateringen ska tillämpas.</translation> +<translation id="1171742223880403396">Det kanske inte går att ansluta skärmar korrekt med den här USB-C-kabeln</translation> <translation id="1175572348579024023">Scrolla</translation> <translation id="1178581264944972037">Paus</translation> <translation id="1181037720776840403">Ta bort</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index dd034a2..be576fe 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">Kalenda</translation> <translation id="1153356358378277386">Vifaa vilivyooanishwa</translation> <translation id="1165712434476988950">Unahitaji kuzima kisha uwashe kifaa ili utekeleze sasisho.</translation> +<translation id="1171742223880403396">Huenda kebo yako ya USB-C isiunganike vizuri na skrini</translation> <translation id="1175572348579024023">Sogeza</translation> <translation id="1178581264944972037">Sitisha</translation> <translation id="1181037720776840403">Ondoa</translation> @@ -124,6 +125,7 @@ <translation id="1668469839109562275">VPN iliyojumuishwa ndani</translation> <translation id="1677472565718498478">Zimesalia <ph name="TIME" /></translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> haijaunganishwa.</translation> +<translation id="1677582821739292812">Kuna mtu anaangalia skrini yako</translation> <translation id="1698080062160024910">Kipima muda cha <ph name="TOTAL_TIME" /> · <ph name="LABEL" /></translation> <translation id="1698760176351776263">Anwani ya IPv6: <ph name="ADDRESS" /></translation> <translation id="1708345662127501511">Eneokazi: <ph name="DESK_NAME" /></translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb index 392e9c6..4061268 100644 --- a/ash/strings/ash_strings_te.xtb +++ b/ash/strings/ash_strings_te.xtb
@@ -125,6 +125,7 @@ <translation id="1668469839109562275">బిల్ట్-ఇన్ VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> మిగిలి ఉంది</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> కనెక్ట్ కాలేదు.</translation> +<translation id="1677582821739292812">ఎవరో మీ స్క్రీన్ వైపు చూస్తున్నారు</translation> <translation id="1698080062160024910"><ph name="TOTAL_TIME" /> టైమర్ · <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6 అడ్రస్: <ph name="ADDRESS" /></translation> <translation id="1703117532528082099">ఎడమ వైపున డాక్ చేసి ఉన్న విండోను యాక్టివేట్ చేయండి.</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb index 23fb62dbb..66158e8 100644 --- a/ash/strings/ash_strings_th.xtb +++ b/ash/strings/ash_strings_th.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">ปฏิทิน</translation> <translation id="1153356358378277386">อุปกรณ์ที่จับคู่</translation> <translation id="1165712434476988950">ต้องรีสตาร์ทอุปกรณ์เพื่อใช้การอัปเดต</translation> +<translation id="1171742223880403396">สาย USB-C อาจเชื่อมต่อกับจอแสดงผลอย่างไม่ถูกต้อง</translation> <translation id="1175572348579024023">เลื่อน</translation> <translation id="1178581264944972037">หยุดชั่วคราว</translation> <translation id="1181037720776840403">นำออก</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb index f67269c..0ea04422 100644 --- a/ash/strings/ash_strings_tr.xtb +++ b/ash/strings/ash_strings_tr.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">Takvim</translation> <translation id="1153356358378277386">Eşlenen cihazlar</translation> <translation id="1165712434476988950">Güncellemenin uygulanması için cihazın yeniden başlatılması gerekiyor.</translation> +<translation id="1171742223880403396">USB-C kablonuz ekranlara gerekli şekilde bağlanamayabilir</translation> <translation id="1175572348579024023">Kaydır</translation> <translation id="1178581264944972037">Duraklat</translation> <translation id="1181037720776840403">Kaldır</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb index 40f456c5..c82464a2 100644 --- a/ash/strings/ash_strings_uk.xtb +++ b/ash/strings/ash_strings_uk.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">Календар</translation> <translation id="1153356358378277386">Підключені пристрої</translation> <translation id="1165712434476988950">Щоб застосувати оновлення, потрібно перезапустити пристрій.</translation> +<translation id="1171742223880403396">Ваш кабель USB-C може не підключатися до екранів належним чином</translation> <translation id="1175572348579024023">Прокрутити</translation> <translation id="1178581264944972037">Пауза</translation> <translation id="1181037720776840403">Видалити</translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb index a9d1307..6568f5a 100644 --- a/ash/strings/ash_strings_ur.xtb +++ b/ash/strings/ash_strings_ur.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">کیلنڈر</translation> <translation id="1153356358378277386">جوڑا بنائے ہوئے آلات</translation> <translation id="1165712434476988950">اپ ڈیٹ لاگو کرنے کیلئے آلے کو ری سٹارٹ کرنا درکار ہے۔</translation> +<translation id="1171742223880403396">ہو سکتا ہے کہ آپ کی USB-C کیبل مناسب طریقے سے ڈسپلیز سے منسلک نہ ہو</translation> <translation id="1175572348579024023">اسکرول کریں</translation> <translation id="1178581264944972037">موقوف کریں</translation> <translation id="1181037720776840403">ہٹائیں</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb index 97b19d3f..add4152 100644 --- a/ash/strings/ash_strings_uz.xtb +++ b/ash/strings/ash_strings_uz.xtb
@@ -125,6 +125,7 @@ <translation id="1668469839109562275">Ichki oʻrnatilgan VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> qoldi</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> ulanmadi.</translation> +<translation id="1677582821739292812">Kimdir ekranga qarayapti</translation> <translation id="1698080062160024910"><ph name="TOTAL_TIME" /> taymer · <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6 manzil: <ph name="ADDRESS" /></translation> <translation id="1703117532528082099">Faol oyna chapga mahkamlandi.</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index 2559b02..5f04c6c 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb
@@ -125,8 +125,10 @@ <translation id="1668469839109562275">VPN tích hợp sẵn</translation> <translation id="1677472565718498478">Còn <ph name="TIME" /></translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> chưa kết nối.</translation> +<translation id="1677582821739292812">Có người đang nhìn vào màn hình của bạn</translation> <translation id="1698080062160024910">Đồng hồ hẹn giờ <ph name="TOTAL_TIME" /> · <ph name="LABEL" /></translation> <translation id="1698760176351776263">Địa chỉ IPv6: <ph name="ADDRESS" /></translation> +<translation id="1703117532528082099">Cửa sổ đang hoạt động gắn phía bên trái.</translation> <translation id="1708345662127501511">Không gian làm việc: <ph name="DESK_NAME" /></translation> <translation id="1709762881904163296">Cài đặt mạng</translation> <translation id="1715293566947629045">Đang vô hiệu hoá hồ sơ. Hãy chờ ít phút.</translation> @@ -277,6 +279,7 @@ <translation id="2727977024730340865">Được cắm vào bộ sạc công suất thấp. Việc sạc pin có thể không được đảm bảo.</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Xoá"</translation> +<translation id="2750941250130734256">Đã gỡ cửa sổ đang hoạt động.</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> này do <ph name="MANAGER" /> quản lý</translation> <translation id="2782591952652094792">Thoát khỏi chế độ chụp</translation> <translation id="2791421900609674576">Bạn sẽ thấy các đề xuất để có thể tiếp tục từ nơi mình chưa xong. Bạn có thể chạm và giữ để xoá đề xuất.</translation> @@ -790,6 +793,7 @@ <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Bật</translation> <translation id="5920710855273935292">Micrô đang tắt.</translation> +<translation id="5924838240953214369">Chế độ chụp, mặc định là <ph name="SOURCE" /> <ph name="TYPE" />. Thiết bị đầu vào của máy ảnh hiện là <ph name="CAMERA_NAME" />, đã bật chế độ xem trước. Nhấn phím Tab để di chuyển bằng bàn phím.</translation> <translation id="5946788582095584774"><ph name="FEATURE_NAME" /> đang bật.</translation> <translation id="5947494881799873997">Hoàn nguyên</translation> <translation id="595202126637698455">Đã bật theo dõi hoạt động</translation> @@ -1048,6 +1052,7 @@ <translation id="7564874036684306347">Di chuyển cửa sổ sang màn hình khác có thể gây ra hoạt động không mong muốn. Các thông báo, cửa sổ và hộp thoại tiếp theo có thể bị phân tách giữa các màn hình.</translation> <translation id="7569509451529460200">Đã bật chữ nổi Braille và ChromeVox</translation> <translation id="7569983096843329377">Đen</translation> +<translation id="7573585051776738856">Cửa sổ đang hoạt động gắn phía bên phải.</translation> <translation id="7579778809502851308">Chụp ảnh màn hình</translation> <translation id="7590883480672980941">Cài đặt phương thức nhập</translation> <translation id="7593891976182323525">Search hoặc Shift</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb index f4c8f8e..558e548 100644 --- a/ash/strings/ash_strings_zh-CN.xtb +++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -31,6 +31,7 @@ <translation id="1150989369772528668">日历</translation> <translation id="1153356358378277386">已配对的设备</translation> <translation id="1165712434476988950">必须重启设备,才能应用这项更新。</translation> +<translation id="1171742223880403396">您的 USB-C 数据线可能没有正确连接到显示屏</translation> <translation id="1175572348579024023">滚动</translation> <translation id="1178581264944972037">暂停</translation> <translation id="1181037720776840403">移除</translation> @@ -121,6 +122,7 @@ <translation id="1668469839109562275">内置 VPN</translation> <translation id="1677472565718498478">电量尚余 <ph name="TIME" /></translation> <translation id="1677507110654891115">未连接“<ph name="FEATURE_NAME" />”。</translation> +<translation id="1677582821739292812">有人正在看着您的屏幕</translation> <translation id="1698080062160024910"><ph name="TOTAL_TIME" />定时器 <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6 地址:<ph name="ADDRESS" /></translation> <translation id="1708345662127501511">桌面:<ph name="DESK_NAME" /></translation>
diff --git a/ash/strings/ash_strings_zh-HK.xtb b/ash/strings/ash_strings_zh-HK.xtb index 9ef806c..302a7e2 100644 --- a/ash/strings/ash_strings_zh-HK.xtb +++ b/ash/strings/ash_strings_zh-HK.xtb
@@ -125,9 +125,10 @@ <translation id="1668469839109562275">內置 VPN</translation> <translation id="1677472565718498478">電量尚餘 <ph name="TIME" /></translation> <translation id="1677507110654891115">「<ph name="FEATURE_NAME" />」並未連線。</translation> +<translation id="1677582821739292812">有人正在望向您的螢幕</translation> <translation id="1698080062160024910"><ph name="TOTAL_TIME" /> 計時器 · <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6 位址:<ph name="ADDRESS" /></translation> -<translation id="1703117532528082099">讓使用中的視窗固定在畫面左側。</translation> +<translation id="1703117532528082099">用緊嘅視固定咗喺畫面左邊。</translation> <translation id="1708345662127501511">桌面:<ph name="DESK_NAME" /></translation> <translation id="1709762881904163296">網絡設定</translation> <translation id="1715293566947629045">正在停用設定檔,請等候幾分鐘。</translation> @@ -278,7 +279,7 @@ <translation id="2727977024730340865">使用低功率充電器,可能導致充電狀態不穩定。</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />,<ph name="PRICE" /></translation> <translation id="2750932254614666392">「刪除」</translation> -<translation id="2750941250130734256">已取消固定使用中的視窗。</translation> +<translation id="2750941250130734256">已經取消固定用緊嘅視窗。</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> 由 <ph name="MANAGER" /> 管理</translation> <translation id="2782591952652094792">結束擷取模式</translation> <translation id="2791421900609674576">系統會顯示建議,讓您繼續使用上次開啟的內容。只要輕觸並按住建議即可移除。</translation> @@ -791,7 +792,7 @@ <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">開啟</translation> <translation id="5920710855273935292">咪高風校咗靜音。</translation> -<translation id="5924838240953214369">擷取模式,預設為<ph name="SOURCE" /><ph name="TYPE" />。影像辨識輸入已設為「<ph name="CAMERA_NAME" />」,預覽功能已開啟。按下 Tab 鍵即可查看鍵盤瀏覽資訊。</translation> +<translation id="5924838240953214369">擷取模式,預設係<ph name="SOURCE" /><ph name="TYPE" />。拍照輸入設定咗做「<ph name="CAMERA_NAME" />」,預覽功能開咗。㩒 tab 鍵就可以睇下鍵盤導覽資料。</translation> <translation id="5946788582095584774"><ph name="FEATURE_NAME" />功能已開啟。</translation> <translation id="5947494881799873997">還原</translation> <translation id="595202126637698455">效能追蹤已啟用</translation> @@ -1049,7 +1050,7 @@ <translation id="7564874036684306347">將視窗移至其他桌面可能會導致非預期的行為。後續的通知、視窗和對話框可能會在不同的桌面上分開顯示。</translation> <translation id="7569509451529460200">已啟用點字和 ChromeVox</translation> <translation id="7569983096843329377">黑色</translation> -<translation id="7573585051776738856">讓使用中的視窗固定在畫面右側。</translation> +<translation id="7573585051776738856">用緊嘅視固定咗喺畫面右邊。</translation> <translation id="7579778809502851308">擷取螢幕畫面</translation> <translation id="7590883480672980941">輸入法設定</translation> <translation id="7593891976182323525">搜尋鍵或 Shift 鍵</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb index 2a559a0..b1a2cd4 100644 --- a/ash/strings/ash_strings_zh-TW.xtb +++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -122,6 +122,7 @@ <translation id="1668469839109562275">內建 VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> 後用盡</translation> <translation id="1677507110654891115">「<ph name="FEATURE_NAME" />」並未連線。</translation> +<translation id="1677582821739292812">有人正在注視你的螢幕</translation> <translation id="1698080062160024910"><ph name="TOTAL_TIME" />的計時器 · <ph name="LABEL" /></translation> <translation id="1698760176351776263">IPv6 位址:<ph name="ADDRESS" /></translation> <translation id="1703117532528082099">讓使用中的視窗固定在畫面左側。</translation>
diff --git a/ash/system/bluetooth/tray_bluetooth_helper_legacy.cc b/ash/system/bluetooth/tray_bluetooth_helper_legacy.cc index 679064091..889c6ca 100644 --- a/ash/system/bluetooth/tray_bluetooth_helper_legacy.cc +++ b/ash/system/bluetooth/tray_bluetooth_helper_legacy.cc
@@ -311,9 +311,13 @@ void TrayBluetoothHelperLegacy::SetBluetoothEnabled(bool enabled) { if (enabled != (GetBluetoothState() == BluetoothSystem::State::kPoweredOn)) { - Shell::Get()->metrics()->RecordUserMetricsAction( - enabled ? UMA_STATUS_AREA_BLUETOOTH_ENABLED - : UMA_STATUS_AREA_BLUETOOTH_DISABLED); + if (enabled) { + base::RecordAction( + base::UserMetricsAction("StatusArea_Bluetooth_Enabled")); + } else { + base::RecordAction( + base::UserMetricsAction("StatusArea_Bluetooth_Disabled")); + } } Shell::Get()->bluetooth_power_controller()->SetBluetoothEnabled(enabled);
diff --git a/ash/system/caps_lock_notification_controller.cc b/ash/system/caps_lock_notification_controller.cc index 9ae7e37..b001b0e 100644 --- a/ash/system/caps_lock_notification_controller.cc +++ b/ash/system/caps_lock_notification_controller.cc
@@ -15,6 +15,7 @@ #include "ash/system/status_area_widget.h" #include "ash/system/unified/unified_system_tray.h" #include "ash/system/unified/unified_system_tray_model.h" +#include "base/metrics/user_metrics.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" #include "ui/base/l10n/l10n_util.h" @@ -114,9 +115,7 @@ enabled ? AccessibilityAlert::CAPS_ON : AccessibilityAlert::CAPS_OFF); if (enabled) { - Shell::Get()->metrics()->RecordUserMetricsAction( - UMA_STATUS_AREA_CAPS_LOCK_POPUP); - + base::RecordAction(base::UserMetricsAction("StatusArea_CapsLock_Popup")); MessageCenter::Get()->AddNotification(CreateNotification()); } else if (MessageCenter::Get()->FindVisibleNotificationById( kCapsLockNotificationId)) {
diff --git a/ash/system/cast/cast_notification_controller.cc b/ash/system/cast/cast_notification_controller.cc index 10f20e1..d8b003d 100644 --- a/ash/system/cast/cast_notification_controller.cc +++ b/ash/system/cast/cast_notification_controller.cc
@@ -9,6 +9,7 @@ #include "ash/shell.h" #include "ash/strings/grit/ash_strings.h" #include "base/bind.h" +#include "base/metrics/user_metrics.h" #include "base/strings/utf_string_conversions.h" #include "ui/base/l10n/l10n_util.h" #include "ui/message_center/message_center.h" @@ -113,8 +114,7 @@ void CastNotificationController::StopCasting(absl::optional<int> button_index) { CastConfigController::Get()->StopCasting(displayed_route_id_); - Shell::Get()->metrics()->RecordUserMetricsAction( - UMA_STATUS_AREA_CAST_STOP_CAST); + base::RecordAction(base::UserMetricsAction("StatusArea_Cast_StopCast")); } } // namespace ash
diff --git a/ash/system/cast/tray_cast.cc b/ash/system/cast/tray_cast.cc index bf4e6ad..a3ec185 100644 --- a/ash/system/cast/tray_cast.cc +++ b/ash/system/cast/tray_cast.cc
@@ -9,7 +9,6 @@ #include <utility> #include <vector> -#include "ash/metrics/user_metrics_recorder.h" #include "ash/public/cpp/ash_view_ids.h" #include "ash/public/cpp/system_tray_client.h" #include "ash/resources/vector_icons/vector_icons.h" @@ -140,8 +139,8 @@ auto it = view_to_sink_map_.find(view); if (it != view_to_sink_map_.end()) { CastConfigController::Get()->CastToSink(it->second); - Shell::Get()->metrics()->RecordUserMetricsAction( - UMA_STATUS_AREA_DETAILED_CAST_VIEW_LAUNCH_CAST); + base::RecordAction( + base::UserMetricsAction("StatusArea_Cast_Detailed_Launch_Cast")); } else if (view == add_access_code_device_) { base::RecordAction(base::UserMetricsAction( "StatusArea_Cast_Detailed_Launch_AccesCastDialog"));
diff --git a/ash/system/overview/overview_button_tray.cc b/ash/system/overview/overview_button_tray.cc index 76787d2..f3afb76 100644 --- a/ash/system/overview/overview_button_tray.cc +++ b/ash/system/overview/overview_button_tray.cc
@@ -5,7 +5,6 @@ #include "ash/system/overview/overview_button_tray.h" #include "ash/constants/ash_features.h" -#include "ash/metrics/user_metrics_recorder.h" #include "ash/public/cpp/shelf_config.h" #include "ash/resources/vector_icons/vector_icons.h" #include "ash/session/session_controller_impl.h" @@ -187,7 +186,7 @@ overview_controller->EndOverview(OverviewEndAction::kOverviewButton); else overview_controller->StartOverview(OverviewStartAction::kOverviewButton); - Shell::Get()->metrics()->RecordUserMetricsAction(UMA_TRAY_OVERVIEW); + base::RecordAction(base::UserMetricsAction("Tray_Overview")); // The return value doesn't matter here. OnOverviewModeStarting() and // OnOverviewModeEnded() will do the right thing to set the button state.
diff --git a/ash/system/unified/unified_system_tray_controller.cc b/ash/system/unified/unified_system_tray_controller.cc index a7c540b..2bced26 100644 --- a/ash/system/unified/unified_system_tray_controller.cc +++ b/ash/system/unified/unified_system_tray_controller.cc
@@ -8,8 +8,6 @@ #include "ash/capture_mode/capture_mode_feature_pod_controller.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_pref_names.h" -#include "ash/metrics/user_metrics_action.h" -#include "ash/metrics/user_metrics_recorder.h" #include "ash/public/cpp/metrics_util.h" #include "ash/public/cpp/pagination/pagination_controller.h" #include "ash/public/cpp/system_tray_client.h" @@ -168,19 +166,19 @@ } void UnifiedSystemTrayController::HandleSignOutAction() { - Shell::Get()->metrics()->RecordUserMetricsAction(UMA_STATUS_AREA_SIGN_OUT); + base::RecordAction(base::UserMetricsAction("StatusArea_SignOut")); if (Shell::Get()->session_controller()->IsDemoSession()) base::RecordAction(base::UserMetricsAction("DemoMode.ExitFromSystemTray")); Shell::Get()->session_controller()->RequestSignOut(); } void UnifiedSystemTrayController::HandleLockAction() { - Shell::Get()->metrics()->RecordUserMetricsAction(UMA_TRAY_LOCK_SCREEN); + base::RecordAction(base::UserMetricsAction("Tray_LockScreen")); Shell::Get()->session_controller()->LockScreen(); } void UnifiedSystemTrayController::HandleSettingsAction() { - Shell::Get()->metrics()->RecordUserMetricsAction(UMA_TRAY_SETTINGS); + base::RecordAction(base::UserMetricsAction("Tray_Settings")); Shell::Get()->system_tray_model()->client()->ShowSettings( display::Screen::GetScreen() ->GetDisplayNearestView(unified_view_->GetWidget()->GetNativeView()) @@ -188,7 +186,7 @@ } void UnifiedSystemTrayController::HandlePowerAction() { - Shell::Get()->metrics()->RecordUserMetricsAction(UMA_TRAY_SHUT_DOWN); + base::RecordAction(base::UserMetricsAction("Tray_ShutDown")); Shell::Get()->lock_state_controller()->RequestShutdown( ShutdownReason::TRAY_SHUT_DOWN_BUTTON); CloseBubble(); @@ -335,8 +333,7 @@ if (!force && !IsExpanded()) return; - Shell::Get()->metrics()->RecordUserMetricsAction( - UMA_STATUS_AREA_DETAILED_NETWORK_VIEW); + base::RecordAction(base::UserMetricsAction("StatusArea_Network_Detailed")); ShowDetailedView( std::make_unique<UnifiedNetworkDetailedViewController>(this)); } @@ -345,8 +342,7 @@ if (!IsExpanded()) return; - Shell::Get()->metrics()->RecordUserMetricsAction( - UMA_STATUS_AREA_DETAILED_BLUETOOTH_VIEW); + base::RecordAction(base::UserMetricsAction("StatusArea_Bluetooth_Detailed")); if (ash::features::IsBluetoothRevampEnabled()) { ShowDetailedView(std::make_unique<BluetoothDetailedViewController>(this)); } else { @@ -356,21 +352,19 @@ } void UnifiedSystemTrayController::ShowCastDetailedView() { - Shell::Get()->metrics()->RecordUserMetricsAction( - UMA_STATUS_AREA_DETAILED_CAST_VIEW); + base::RecordAction(base::UserMetricsAction("StatusArea_Cast_Detailed")); ShowDetailedView(std::make_unique<UnifiedCastDetailedViewController>(this)); } void UnifiedSystemTrayController::ShowAccessibilityDetailedView() { - Shell::Get()->metrics()->RecordUserMetricsAction( - UMA_STATUS_AREA_DETAILED_ACCESSIBILITY); + base::RecordAction( + base::UserMetricsAction("StatusArea_Accessability_DetailedView")); ShowDetailedView( std::make_unique<UnifiedAccessibilityDetailedViewController>(this)); } void UnifiedSystemTrayController::ShowVPNDetailedView() { - Shell::Get()->metrics()->RecordUserMetricsAction( - UMA_STATUS_AREA_DETAILED_VPN_VIEW); + base::RecordAction(base::UserMetricsAction("StatusArea_VPN_Detailed")); ShowDetailedView(std::make_unique<UnifiedVPNDetailedViewController>(this)); }
diff --git a/ash/system/unified/unified_system_tray_model.cc b/ash/system/unified/unified_system_tray_model.cc index 2e44a85..0dc20b1 100644 --- a/ash/system/unified/unified_system_tray_model.cc +++ b/ash/system/unified/unified_system_tray_model.cc
@@ -11,6 +11,7 @@ #include "ash/system/brightness_control_delegate.h" #include "ash/system/status_area_widget.h" #include "base/bind.h" +#include "base/metrics/user_metrics.h" #include "chromeos/dbus/power_manager/backlight.pb.h" namespace { @@ -98,8 +99,7 @@ void UnifiedSystemTrayModel::DBusObserver::ScreenBrightnessChanged( const power_manager::BacklightBrightnessChange& change) { - Shell::Get()->metrics()->RecordUserMetricsAction( - UMA_STATUS_AREA_BRIGHTNESS_CHANGED); + base::RecordAction(base::UserMetricsAction("StatusArea_BrightnessChanged")); owner_->DisplayBrightnessChanged( change.percent() / 100., change.cause() ==
diff --git a/ash/wallpaper/wallpaper_controller_impl.cc b/ash/wallpaper/wallpaper_controller_impl.cc index 9407f47..0e083009 100644 --- a/ash/wallpaper/wallpaper_controller_impl.cc +++ b/ash/wallpaper/wallpaper_controller_impl.cc
@@ -2284,8 +2284,10 @@ const gfx::ImageSkia& image, const WallpaperInfo& wallpaper_info) { auto path = GlobalChromeOSGooglePhotosWallpapersDir().Append(params.id); + gfx::ImageSkia thread_safe_image(image); thread_safe_image.MakeThreadSafe(); + sequenced_task_runner_->PostTask( FROM_HERE, base::BindOnce(&EnsureGooglePhotosDirectoryExists) @@ -2294,12 +2296,14 @@ thread_safe_image.height())) .Then(base::BindOnce([](bool success) { if (!success) { - DCHECK(success); + NOTREACHED(); LOG(ERROR) << "Failed to save Google Photos wallpaper cache."; return; } }))); + wallpaper_cache_map_[params.account_id] = CustomWallpaperElement(path, image); + if (IsActiveUser(params.account_id)) { ShowWallpaperImage(image, wallpaper_info, /*preview_mode=*/false,
diff --git a/ash/wallpaper/wallpaper_controller_unittest.cc b/ash/wallpaper/wallpaper_controller_unittest.cc index 342296d..a258867 100644 --- a/ash/wallpaper/wallpaper_controller_unittest.cc +++ b/ash/wallpaper/wallpaper_controller_unittest.cc
@@ -4213,7 +4213,9 @@ WallpaperControllerGooglePhotosWallpaperTest, testing::Bool()); -TEST_P(WallpaperControllerGooglePhotosWallpaperTest, SetGooglePhotosWallpaper) { +// TODO(https://crbug.com/1307283): The test is failing. +TEST_P(WallpaperControllerGooglePhotosWallpaperTest, + DISABLED_SetGooglePhotosWallpaper) { bool feature_enabled = GooglePhotosEnabled(); SimulateUserLogin(account_id_1);
diff --git a/ash/webui/diagnostics_ui/backend/network_health_provider_unittest.cc b/ash/webui/diagnostics_ui/backend/network_health_provider_unittest.cc index 89067ad..953dbd3 100644 --- a/ash/webui/diagnostics_ui/backend/network_health_provider_unittest.cc +++ b/ash/webui/diagnostics_ui/backend/network_health_provider_unittest.cc
@@ -1392,8 +1392,7 @@ base::test::ScopedFeatureList features; features.InitWithFeatures( std::vector<base::Feature>{features::kDiagnosticsAppNavigation, - features::kEnableNetworkingInDiagnosticsApp, - features::kDiagnosticsApp}, + features::kEnableNetworkingInDiagnosticsApp}, std::vector<base::Feature>{}); ASSERT_FALSE(network_health_provider_->ReceiverIsBound()); mojo::Remote<mojom::NetworkHealthProvider> remote;
diff --git a/ash/webui/diagnostics_ui/diagnostics_metrics.cc b/ash/webui/diagnostics_ui/diagnostics_metrics.cc index c8f14ec..ec5bc459 100644 --- a/ash/webui/diagnostics_ui/diagnostics_metrics.cc +++ b/ash/webui/diagnostics_ui/diagnostics_metrics.cc
@@ -19,11 +19,11 @@ successful_usage_started_(false) {} bool DiagnosticsMetrics::IsEligible() const { - return features::IsDiagnosticsAppEnabled(); + return true; } bool DiagnosticsMetrics::IsEnabled() const { - return features::IsDiagnosticsAppEnabled(); + return true; } // Helper function for feature_usage::FeatureUsageMetrics RecordUsage.
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/ambient_preview_element.html b/ash/webui/personalization_app/resources/trusted/ambient/ambient_preview_element.html index 16daae3..d0ad231 100644 --- a/ash/webui/personalization_app/resources/trusted/ambient/ambient_preview_element.html +++ b/ash/webui/personalization_app/resources/trusted/ambient/ambient_preview_element.html
@@ -15,10 +15,10 @@ border: none; display: grid; grid-template-areas: - '. . . .' - '. image . subpage-desc' - '. . . .'; - grid-template-columns: 20px 224px 32px minmax(0,1fr); + '. . .' + 'image . subpage-desc' + '. . .'; + grid-template-columns: 224px 32px minmax(0,1fr); grid-template-rows: 20px 152px 20px; }
diff --git a/ash/webui/personalization_app/resources/trusted/user/avatar_list_element.html b/ash/webui/personalization_app/resources/trusted/user/avatar_list_element.html index c711516e..165c1ec6 100644 --- a/ash/webui/personalization_app/resources/trusted/user/avatar_list_element.html +++ b/ash/webui/personalization_app/resources/trusted/user/avatar_list_element.html
@@ -88,10 +88,10 @@ <iron-icon icon="personalization:loop"></iron-icon> </div> </template> - <div class="avatar-button-container"> + <div class="avatar-button-container" + on-click="onSelectImageFromDisk_" on-keypress="onSelectImageFromDisk_"> <paper-ripple class="circle"></paper-ripple> - <iron-icon icon="personalization:folder" on-click="onSelectImageFromDisk_" - on-keypress="onSelectImageFromDisk_"> + <iron-icon icon="personalization:folder"> </iron-icon> </div> <template is="dom-if" if="[[lastExternalUserImageUrl_]]">
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_albums_element.html b/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_albums_element.html index cce761e..978ae56d 100644 --- a/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_albums_element.html +++ b/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_albums_element.html
@@ -3,21 +3,26 @@ overflow: hidden; } + iron-scroll-threshold, iron-list { height: 100%; width: 100%; } </style> -<iron-list id="grid" items="[[albums_]]" as="album" grid> - <template> - <wallpaper-grid-item - class="album" - image-src="[[album.preview.url]]" - on-click="onAlbumSelected_" - on-keypress="onAlbumSelected_" - primary-text="[[album.title]]" - secondary-text="[[getSecondaryText_(album)]]" - tabindex$="[[tabIndex]]"> - </wallpaper-grid-item> - </template> -</iron-list> +<iron-scroll-threshold id="gridScrollThreshold" + on-lower-threshold="onGridScrollThresholdReached_"> + <iron-list id="grid" items="[[albumsForDisplay_]]" as="album" grid + scroll-target="gridScrollThreshold"> + <template> + <wallpaper-grid-item + class="album" + image-src="[[album.preview.url]]" + on-click="onAlbumSelected_" + on-keypress="onAlbumSelected_" + primary-text="[[album.title]]" + secondary-text="[[getSecondaryText_(album)]]" + tabindex$="[[tabIndex]]"> + </wallpaper-grid-item> + </template> + </iron-list> +</iron-scroll-threshold>
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_albums_element.ts b/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_albums_element.ts index 66e59d2b..bf32d0f 100644 --- a/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_albums_element.ts +++ b/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_albums_element.ts
@@ -7,20 +7,25 @@ */ import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js'; +import 'chrome://resources/polymer/v3_0/iron-scroll-threshold/iron-scroll-threshold.js'; import './styles.js'; import '../../common/styles.js'; import {assert} from 'chrome://resources/js/assert.m.js'; import {IronListElement} from 'chrome://resources/polymer/v3_0/iron-list/iron-list.js'; +import {IronScrollThresholdElement} from 'chrome://resources/polymer/v3_0/iron-scroll-threshold/iron-scroll-threshold.js'; import {afterNextRender, html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {getCountText, isSelectionEvent} from '../../common/utils.js'; -import {GooglePhotosAlbum} from '../personalization_app.mojom-webui.js'; +import {getCountText, isNonEmptyArray, isSelectionEvent} from '../../common/utils.js'; +import {GooglePhotosAlbum, WallpaperProviderInterface} from '../personalization_app.mojom-webui.js'; import {PersonalizationRouter} from '../personalization_router_element.js'; import {WithPersonalizationStore} from '../personalization_store.js'; +import {fetchGooglePhotosAlbums} from './wallpaper_controller.js'; +import {getWallpaperProvider} from './wallpaper_interface_provider.js'; + export interface GooglePhotosAlbums { - $: {grid: IronListElement;}; + $: {grid: IronListElement; gridScrollThreshold: IronScrollThresholdElement}; } export class GooglePhotosAlbums extends WithPersonalizationStore { @@ -41,8 +46,18 @@ observer: 'onHiddenChanged_', }, - albums_: Array, + albums_: { + type: Array, + observer: 'onAlbumsChanged_', + }, + + albumsForDisplay_: Array, albumsLoading_: Boolean, + + albumsResumeToken: { + type: String, + observer: 'onAlbumsResumeTokenChanged_', + }, }; } @@ -52,9 +67,19 @@ /** The list of albums. */ private albums_: GooglePhotosAlbum[]|null|undefined; + /** The list of |albums_| which is updated in place for display. */ + private albumsForDisplay_: GooglePhotosAlbum[]|null|undefined; + /** Whether the list of albums is currently loading. */ private albumsLoading_: boolean; + /** The resume token needed to fetch the next page of albums. */ + private albumsResumeToken_: string|null; + + /** The singleton wallpaper provider interface. */ + private wallpaperProvider_: WallpaperProviderInterface = + getWallpaperProvider(); + override connectedCallback() { super.connectedCallback(); @@ -62,6 +87,9 @@ 'albums_', state => state.wallpaper.googlePhotos.albums); this.watch<GooglePhotosAlbums['albumsLoading_']>( 'albumsLoading_', state => state.wallpaper.loading.googlePhotos.albums); + this.watch<GooglePhotosAlbums['albumsResumeToken_']>( + 'albumsResumeToken_', + state => state.wallpaper.googlePhotos.resumeTokens.albums); this.updateFromStore(); } @@ -74,6 +102,63 @@ } } + /** Invoked on changes to |albums_|. */ + private onAlbumsChanged_(albums: GooglePhotosAlbums['albums_']) { + if (!isNonEmptyArray(albums)) { + this.albumsForDisplay_ = null; + return; + } + + // Case: First batch of albums. + if (this.albumsForDisplay_ === null || + this.albumsForDisplay_ === undefined) { + this.albumsForDisplay_ = albums; + return; + } + + // Case: Subsequent batches of albums. + // NOTE: |albumsForDisplay_| is updated in place to avoid resetting the + // scroll position of the grid but it will be deeply equal to |albums_| + // after being updated. + albums.forEach((album, i) => { + if (i < this.albumsForDisplay_!.length) { + this.set(`albumsForDisplay_.${i}`, album); + } else { + this.push('albumsForDisplay_', album); + } + }); + + while (this.albumsForDisplay_.length > albums.length) { + this.pop(`albumsForDisplay_`); + } + } + + /** Invoked on changes to |albumsResumeToken_|. */ + private onAlbumsResumeTokenChanged_( + albumsResumeToken: GooglePhotosAlbums['albumsResumeToken_']) { + if (albumsResumeToken?.length) { + this.$.gridScrollThreshold.clearTriggers(); + } + } + + /** Invoked on grid scroll threshold reached. */ + private onGridScrollThresholdReached_() { + // Ignore this event if fired during initialization. + if (!this.$.gridScrollThreshold.scrollHeight) { + this.$.gridScrollThreshold.clearTriggers(); + return; + } + + // Ignore this event if albums are already being loading or if there is no + // resume token (indicating there are no additional albums to load). + if (this.albumsLoading_ === true || this.albumsResumeToken_ === null) { + return; + } + + // Fetch the next page of albums. + fetchGooglePhotosAlbums(this.wallpaperProvider_, this.getStore()); + } + /** Invoked on changes to this element's |hidden| state. */ private onHiddenChanged_(hidden: GooglePhotosAlbums['hidden']) { if (hidden) {
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_photos_element.ts b/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_photos_element.ts index d2492633..6b3e7d4 100644 --- a/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_photos_element.ts +++ b/ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_photos_element.ts
@@ -248,12 +248,14 @@ const photosByRow = photosBySection.flatMap(section => section.rows); // Case: First batch of photos. - if (this.photosByRow_ === null) { + if (this.photosByRow_ === null || this.photosByRow_ === undefined) { this.photosByRow_ = photosByRow; return; } // Case: Subsequent batches of photos. + // NOTE: |photosByRow_| is updated in place to avoid resetting the scroll + // position of the grid. photosByRow.forEach((row, i) => { if (i < this.photosByRow_!.length) { this.set(`photosByRow_.${i}`, row);
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_actions.ts b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_actions.ts index e8396906..7248743c 100644 --- a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_actions.ts +++ b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_actions.ts
@@ -14,6 +14,7 @@ */ export enum WallpaperActionName { + APPEND_GOOGLE_PHOTOS_ALBUMS = 'append_google_photos_albums', APPEND_GOOGLE_PHOTOS_PHOTOS = 'append_google_photos_photos', BEGIN_LOAD_GOOGLE_PHOTOS_ALBUM = 'begin_load_google_photos_album', BEGIN_LOAD_GOOGLE_PHOTOS_ALBUMS = 'begin_load_google_photos_albums', @@ -29,7 +30,6 @@ SET_COLLECTIONS = 'set_collections', SET_DAILY_REFRESH_COLLECTION_ID = 'set_daily_refresh_collection_id', SET_GOOGLE_PHOTOS_ALBUM = 'set_google_photos_album', - SET_GOOGLE_PHOTOS_ALBUMS = 'set_google_photos_albums', SET_GOOGLE_PHOTOS_COUNT = 'set_google_photos_count', SET_IMAGES_FOR_COLLECTION = 'set_images_for_collection', SET_LOCAL_IMAGES = 'set_local_images', @@ -40,18 +40,38 @@ } export type WallpaperActions = - AppendGooglePhotosPhotosAction|BeginLoadGooglePhotosAlbumAction| - BeginLoadGooglePhotosAlbumsAction|BeginLoadGooglePhotosCountAction| - BeginLoadGooglePhotosPhotosAction|BeginLoadImagesForCollectionsAction| - BeginLoadLocalImagesAction|BeginLoadLocalImageDataAction| - BeginUpdateDailyRefreshImageAction|BeginLoadSelectedImageAction| - BeginSelectImageAction|EndSelectImageAction|SetCollectionsAction| - SetDailyRefreshCollectionIdAction|SetGooglePhotosAlbumAction| - SetGooglePhotosAlbumsAction|SetGooglePhotosCountAction| + AppendGooglePhotosAlbumsAction|AppendGooglePhotosPhotosAction| + BeginLoadGooglePhotosAlbumAction|BeginLoadGooglePhotosAlbumsAction| + BeginLoadGooglePhotosCountAction|BeginLoadGooglePhotosPhotosAction| + BeginLoadImagesForCollectionsAction|BeginLoadLocalImagesAction| + BeginLoadLocalImageDataAction|BeginUpdateDailyRefreshImageAction| + BeginLoadSelectedImageAction|BeginSelectImageAction|EndSelectImageAction| + SetCollectionsAction|SetDailyRefreshCollectionIdAction| + SetGooglePhotosAlbumAction|SetGooglePhotosCountAction| SetImagesForCollectionAction|SetLocalImageDataAction|SetLocalImagesAction| SetUpdatedDailyRefreshImageAction|SetSelectedImageAction| SetFullscreenEnabledAction; +export type AppendGooglePhotosAlbumsAction = Action&{ + name: WallpaperActionName.APPEND_GOOGLE_PHOTOS_ALBUMS; + albums: GooglePhotosAlbum[]|null; + resumeToken: string|null; +}; + +/** + * Appends to the list of Google Photos albums. May be called with null on + * error. + */ +export function appendGooglePhotosAlbumsAction( + albums: GooglePhotosAlbum[]|null, + resumeToken: string|null): AppendGooglePhotosAlbumsAction { + return { + albums, + resumeToken, + name: WallpaperActionName.APPEND_GOOGLE_PHOTOS_ALBUMS + }; +} + export type AppendGooglePhotosPhotosAction = Action&{ name: WallpaperActionName.APPEND_GOOGLE_PHOTOS_PHOTOS; photos: GooglePhotosPhoto[]|null; @@ -263,17 +283,6 @@ return {albumId, photos, name: WallpaperActionName.SET_GOOGLE_PHOTOS_ALBUM}; } -export type SetGooglePhotosAlbumsAction = Action&{ - name: WallpaperActionName.SET_GOOGLE_PHOTOS_ALBUMS; - albums: GooglePhotosAlbum[]|null; -}; - -/** Sets the list of Google Photos albums. May be called with null on error. */ -export function setGooglePhotosAlbumsAction(albums: GooglePhotosAlbum[]| - null): SetGooglePhotosAlbumsAction { - return {albums, name: WallpaperActionName.SET_GOOGLE_PHOTOS_ALBUMS}; -} - export type SetGooglePhotosCountAction = Action&{ name: WallpaperActionName.SET_GOOGLE_PHOTOS_COUNT; count: number|null;
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_controller.ts b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_controller.ts index 0c4f2da..aa6f76d 100644 --- a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_controller.ts +++ b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_controller.ts
@@ -98,27 +98,25 @@ } /** Fetches the list of Google Photos albums and saves it to the store. */ -async function fetchGooglePhotosAlbums( +export async function fetchGooglePhotosAlbums( provider: WallpaperProviderInterface, store: PersonalizationStore): Promise<void> { store.dispatch(action.beginLoadGooglePhotosAlbumsAction()); let albums: Array<GooglePhotosAlbum>|null = []; - let resumeToken: string|null|undefined = null; + let resumeToken = store.data.wallpaper.googlePhotos.resumeTokens.albums; - // TODO(b/215179074): Support incremental load of albums as the user scrolls - // through their library as opposed to loading them all at once. - do { - const {response} = await provider.fetchGooglePhotosAlbums(resumeToken) as - {response: FetchGooglePhotosAlbumsResponse}; - if (!Array.isArray(response.albums)) { - console.warn('Failed to fetch Google Photos albums'); - albums = null; - break; - } + const {response} = await provider.fetchGooglePhotosAlbums(resumeToken) as + {response: FetchGooglePhotosAlbumsResponse}; + if (Array.isArray(response.albums)) { albums.push(...response.albums); - resumeToken = response.resumeToken; - } while (resumeToken); + resumeToken = response.resumeToken ?? null; + } else { + console.warn('Failed to fetch Google Photos albums'); + albums = null; + // NOTE: `resumeToken` is intentionally *not* modified so that the request + // which failed can be reattempted. + } // Impose max resolution. if (albums !== null) { @@ -127,7 +125,7 @@ ({...album, preview: appendMaxResolutionSuffix(album.preview)})); } - store.dispatch(action.setGooglePhotosAlbumsAction(albums)); + store.dispatch(action.appendGooglePhotosAlbumsAction(albums, resumeToken)); } /** Fetches the count of Google Photos photos and saves it to the store. */ @@ -356,12 +354,13 @@ // to query the server for the list of albums/photos. const count = store.data.wallpaper.googlePhotos.count; if (count === 0 || count === null) { - const /** ?Array<undefined> */ result = count === 0 ? [] : null; + const result = count === 0 ? [] : null; + const resumeToken = null; store.beginBatchUpdate(); store.dispatch(action.beginLoadGooglePhotosAlbumsAction()); store.dispatch(action.beginLoadGooglePhotosPhotosAction()); - store.dispatch(action.setGooglePhotosAlbumsAction(result)); - store.dispatch(action.appendGooglePhotosPhotosAction(result, null)); + store.dispatch(action.appendGooglePhotosAlbumsAction(result, resumeToken)); + store.dispatch(action.appendGooglePhotosPhotosAction(result, resumeToken)); store.endBatchUpdate(); return; }
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_reducers.ts b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_reducers.ts index 4bf700df..140676f0 100644 --- a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_reducers.ts +++ b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_reducers.ts
@@ -156,7 +156,7 @@ albums: true, }, }; - case WallpaperActionName.SET_GOOGLE_PHOTOS_ALBUMS: + case WallpaperActionName.APPEND_GOOGLE_PHOTOS_ALBUMS: assert(state.googlePhotos.albums === true); return { ...state, @@ -343,14 +343,40 @@ }, }; case WallpaperActionName.BEGIN_LOAD_GOOGLE_PHOTOS_ALBUMS: - // The list of albums should be loaded only once. - assert(state.albums === undefined); + // The list of albums should be loaded only while additional albums exist. + assert(state.albums === undefined || state.resumeTokens.albums); return state; - case WallpaperActionName.SET_GOOGLE_PHOTOS_ALBUMS: + case WallpaperActionName.APPEND_GOOGLE_PHOTOS_ALBUMS: assert(action.albums !== undefined); + // Case: First batch of albums. + if (!Array.isArray(state.albums)) { + return { + ...state, + albums: action.albums, + resumeTokens: { + ...state.resumeTokens, + albums: action.resumeToken, + }, + }; + } + // Case: Subsequent batches of albums. + if (Array.isArray(action.albums)) { + return { + ...state, + albums: [...state.albums, ...action.albums], + resumeTokens: { + ...state.resumeTokens, + albums: action.resumeToken, + }, + }; + } + // Case: Error. return { ...state, - albums: action.albums, + resumeTokens: { + ...state.resumeTokens, + albums: action.resumeToken, + }, }; case WallpaperActionName.BEGIN_LOAD_GOOGLE_PHOTOS_COUNT: // The total count of photos should be loaded only once.
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_state.ts b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_state.ts index 6cc4009..663a49b 100644 --- a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_state.ts +++ b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_state.ts
@@ -31,7 +31,7 @@ albums: GooglePhotosAlbum[]|null|undefined; photos: GooglePhotosPhoto[]|null|undefined; photosByAlbumId: Record<string, GooglePhotosPhoto[]|null|undefined>; - resumeTokens: {photos: string|null}; + resumeTokens: {albums: string|null, photos: string|null}; } /** @@ -116,7 +116,7 @@ albums: undefined, photos: undefined, photosByAlbumId: {}, - resumeTokens: {photos: null}, + resumeTokens: {albums: null, photos: null}, }, }; }
diff --git a/ash/webui/personalization_app/test/personalization_app_browsertest.js b/ash/webui/personalization_app/test/personalization_app_browsertest.js index 27d3b272..caef8d9 100644 --- a/ash/webui/personalization_app/test/personalization_app_browsertest.js +++ b/ash/webui/personalization_app/test/personalization_app_browsertest.js
@@ -167,9 +167,7 @@ testDone(); }); -// TODO(crbug.com/1306628): Disable this test while LayoutNGBlockInInline is -// off. This should be reenabled before the M101 branch point. -TEST_F('WallpaperSubpageBrowserTest', 'DISABLED_LoadsCollectionsGrid', () => { +TEST_F('WallpaperSubpageBrowserTest', 'LoadsCollectionsGrid', () => { const router = document.querySelector('personalization-router'); assertTrue(!!router, 'personalization-router should be top level element');
diff --git a/ash/wm/desks/desk.cc b/ash/wm/desks/desk.cc index 1412aa4..b8cae383 100644 --- a/ash/wm/desks/desk.cc +++ b/ash/wm/desks/desk.cc
@@ -191,37 +191,6 @@ owner_->RemoveWindowFromDesk(removed_window); } - void OnWindowVisibilityChanged(aura::Window* window, bool visible) override { - // We need this for desks templates, where new app windows can be created - // while in overview. The window may not be visible when `OnWindowAdded` is - // called so updating the previews then wouldn't show the new window - // preview. - - // `OnWindowVisibilityChanged()` will be run for all windows in the tree of - // `container_`. We are only interested in direct children. - if (!window->parent() || window->parent() != container_) - return; - - if (!Shell::Get()->overview_controller()->InOverviewSession()) - return; - - // No need to update transient children as the update will handle them. - if (wm::GetTransientRoot(window) != window) - return; - - // Minimized windows may be force shown to be mirrored. They won't be - // visible on the desk preview however, so no need to update. - if (!WindowState::Get(window) || WindowState::Get(window)->IsMinimized()) - return; - - // Do not update windows shown or hidden for overview as they will not be - // shown in the desk previews anyways. - if (window->GetProperty(kHideInDeskMiniViewKey)) - return; - - owner_->NotifyContentChanged(); - } - void OnWindowDestroyed(aura::Window* window) override { // We should never get here. We should be notified in // `OnRootWindowClosing()` before the child containers of the root window
diff --git a/ash/wm/desks/templates/desks_templates_unittest.cc b/ash/wm/desks/templates/desks_templates_unittest.cc index f4f1096d..1d277ae 100644 --- a/ash/wm/desks/templates/desks_templates_unittest.cc +++ b/ash/wm/desks/templates/desks_templates_unittest.cc
@@ -472,6 +472,38 @@ EXPECT_FALSE(grid_list[1]->no_windows_widget()); } +// Tests that the no windows widget is shown when the last desk template is +// deleted, forcing it out of desk template grid and return to overview mode +// onto a desk grid with no windows +TEST_F(DesksTemplatesTest, NoWindowsLabelOnReturnToEmptyOverviewDesk) { + UpdateDisplay("800x600,800x600"); + // Create a test window. + auto test_window = CreateAppWindow(); + + // Open overview and save a template. + OpenOverviewAndSaveTemplate(Shell::Get()->GetPrimaryRootWindow()); + std::vector<DeskTemplate*> entries = GetAllEntries(); + ASSERT_EQ(1ul, desk_model()->GetEntryCount()); + + // Close the window and enter overview mode. The no windows widget should be + // shown. + test_window.reset(); + ToggleOverview(); + WaitForDesksTemplatesUI(); + EXPECT_TRUE(GetOverviewGridList()[0]->no_windows_widget()); + + // Open the desk templates grid. The no windows widget should now be hidden. + ShowDesksTemplatesGrids(); + EXPECT_FALSE(GetOverviewGridList()[0]->no_windows_widget()); + + // Delete the one and only template, which should hide the templates grid but + // remain in overview. Check that the no windows widget is now back. + OpenOverviewAndShowTemplatesGrid(); + DeleteTemplate(entries[0]->uuid(), /*expected_current_item_count=*/1); + ASSERT_TRUE(InOverviewSession()); + EXPECT_TRUE(GetOverviewGridList()[0]->no_windows_widget()); +} + // Tests that the "App does not support split-screen" label is hidden when the // desk templates grid is shown. TEST_F(DesksTemplatesTest, NoAppSplitScreenLabelOnTemplateGridShow) {
diff --git a/ash/wm/overview/overview_grid.cc b/ash/wm/overview/overview_grid.cc index 8bffaff..459153c 100644 --- a/ash/wm/overview/overview_grid.cc +++ b/ash/wm/overview/overview_grid.cc
@@ -2418,6 +2418,7 @@ desks_bar_view_->UpdateButtonsForDesksTemplatesGrid(); desks_bar_view_->OnDesksTemplatesGridHidden(); UpdateSaveDeskAsTemplateButton(); + UpdateNoWindowsWidget(/*no_items=*/empty()); } void OverviewGrid::OnSaveDeskAsTemplateButtonFadedOut() {
diff --git a/base/allocator/partition_allocator/partition_alloc_unittest.cc b/base/allocator/partition_allocator/partition_alloc_unittest.cc index 401c5e757..2781798 100644 --- a/base/allocator/partition_allocator/partition_alloc_unittest.cc +++ b/base/allocator/partition_allocator/partition_alloc_unittest.cc
@@ -298,15 +298,16 @@ allocator.root()->UncapEmptySlotSpanMemoryForTesting(); aligned_allocator.root()->UncapEmptySlotSpanMemoryForTesting(); - if (!GetParam()) + if (GetParam()) allocator.root()->SwitchToDenserBucketDistribution(); else allocator.root()->ResetBucketDistributionForTesting(); } size_t SizeToIndex(size_t size) { + const bool with_denser_bucket_distribution = GetParam(); return PartitionRoot<base::internal::ThreadSafe>::SizeToBucketIndex( - size, GetParam()); + size, with_denser_bucket_distribution); } void TearDown() override { @@ -1272,27 +1273,36 @@ } } -// TODO(crbug.com/1217582): Disabled since the `real_size` is never set or set incorrectly. -TEST_P(PartitionAllocTest, DISABLED_GetSlotStartMultiplePages) { - // Find the smallest bucket with multiple PartitionPages. - size_t real_size; - bool init_real_size = false; - for (PartitionBucket<ThreadSafe>& bucket : allocator.root()->buckets) { +TEST_P(PartitionAllocTest, GetSlotStartMultiplePages) { + auto* root = allocator.root(); + // Find the smallest bucket with multiple PartitionPages. When searching for + // a bucket here, we need to check two conditions: + // (1) The bucket is used in our current bucket distribution. + // (2) The bucket is large enough that our requested size (see below) will be + // non-zero. + size_t real_size = 0; + for (const auto& bucket : root->buckets) { + if ((root->buckets + SizeToIndex(bucket.slot_size))->slot_size != + bucket.slot_size) + continue; + if (bucket.slot_size <= kExtraAllocSize) + continue; if (bucket.num_system_pages_per_slot_span > NumSystemPagesPerPartitionPage()) { real_size = bucket.slot_size; - init_real_size = true; break; } } - ASSERT_TRUE(init_real_size); + + // Make sure that we've managed to find an appropriate bucket. + ASSERT_GT(real_size, 0u); const size_t requested_size = real_size - kExtraAllocSize; // Double check we don't end up with 0 or negative size. EXPECT_GT(requested_size, 0u); EXPECT_LE(requested_size, real_size); - PartitionBucket<ThreadSafe>* bucket = - allocator.root()->buckets + SizeToIndex(real_size); + const auto* bucket = allocator.root()->buckets + SizeToIndex(real_size); + EXPECT_EQ(bucket->slot_size, real_size); // Make sure the test is testing multiple partition pages case. EXPECT_GT(bucket->num_system_pages_per_slot_span, PartitionPageSize() / SystemPageSize()); @@ -2946,6 +2956,60 @@ allocator.root()->Free(ptr2); } +TEST_P(PartitionAllocTest, ActiveListMaintenance) { + size_t size = base::SystemPageSize() - kExtraAllocSize; + size_t real_size = size + kExtraAllocSize; + size_t bucket_index = + allocator.root()->SizeToBucketIndex(real_size, GetParam()); + PartitionRoot<ThreadSafe>::Bucket* bucket = + &allocator.root()->buckets[bucket_index]; + ASSERT_EQ(bucket->slot_size, real_size); + size_t slots_per_span = bucket->num_system_pages_per_slot_span; + + // Make 10 full slot spans. + constexpr int kSpans = 10; + std::vector<std::vector<void*>> allocated_memory_spans(kSpans); + for (int span_index = 0; span_index < kSpans; span_index++) { + for (size_t i = 0; i < slots_per_span; i++) { + allocated_memory_spans[span_index].push_back( + allocator.root()->Alloc(size, "")); + } + } + + // Free one entry in the middle span, creating a partial slot span. + constexpr size_t kSpanIndex = 5; + allocator.root()->Free(allocated_memory_spans[kSpanIndex].back()); + allocated_memory_spans[kSpanIndex].pop_back(); + + // Empty the last slot span. + for (void* ptr : allocated_memory_spans[kSpans - 1]) + allocator.root()->Free(ptr); + allocated_memory_spans.pop_back(); + + // The active list now is: + // Partial -> Empty -> Full -> Full -> ... -> Full + bucket->MaintainActiveList(); + + // Only one entry in the active list. + ASSERT_NE(bucket->active_slot_spans_head, + SlotSpanMetadata<ThreadSafe>::get_sentinel_slot_span()); + EXPECT_FALSE(bucket->active_slot_spans_head->next_slot_span); + + // The empty list has 1 entry. + ASSERT_NE(bucket->empty_slot_spans_head, + SlotSpanMetadata<ThreadSafe>::get_sentinel_slot_span()); + EXPECT_FALSE(bucket->empty_slot_spans_head->next_slot_span); + + // The rest are full slot spans. + EXPECT_EQ(8u, bucket->num_full_slot_spans); + + // Free all memory. + for (const auto& span : allocated_memory_spans) { + for (void* ptr : span) + allocator.root()->Free(ptr); + } +} + TEST_P(PartitionAllocTest, ReallocMovesCookie) { // Resize so as to be sure to hit a "resize in place" case, and ensure that // use of the entire result is compatible with the debug mode's cookie, even
diff --git a/base/allocator/partition_allocator/partition_bucket.cc b/base/allocator/partition_allocator/partition_bucket.cc index 1ee9ce0..8b0429a 100644 --- a/base/allocator/partition_allocator/partition_bucket.cc +++ b/base/allocator/partition_allocator/partition_bucket.cc
@@ -558,11 +558,6 @@ } template <bool thread_safe> -NOINLINE void PartitionBucket<thread_safe>::OnFull() { - OOM_CRASH(0); -} - -template <bool thread_safe> ALWAYS_INLINE SlotSpanMetadata<thread_safe>* PartitionBucket<thread_safe>::AllocNewSlotSpan(PartitionRoot<thread_safe>* root, int flags, @@ -965,10 +960,11 @@ // list. slot_span->marked_full = 1; ++num_full_slot_spans; - // num_full_slot_spans is a uint16_t for efficient packing so guard - // against overflow to be safe. - if (UNLIKELY(!num_full_slot_spans)) - OnFull(); + // Overflow. Most likely a correctness issue in the code. It is in theory + // possible that the number of full slot spans really reaches (1 << 24), + // but this is very unlikely (and not possible with most GigaCage + // settings). + PA_CHECK(num_full_slot_spans); // Not necessary but might help stop accidents. slot_span->next_slot_span = nullptr; } @@ -1000,6 +996,53 @@ } template <bool thread_safe> +void PartitionBucket<thread_safe>::MaintainActiveList() { + SlotSpanMetadata<thread_safe>* slot_span = active_slot_spans_head; + if (slot_span == SlotSpanMetadata<thread_safe>::get_sentinel_slot_span()) + return; + + SlotSpanMetadata<thread_safe>* new_active_slot_spans_head = nullptr; + SlotSpanMetadata<thread_safe>* new_active_slot_spans_tail = nullptr; + + SlotSpanMetadata<thread_safe>* next_slot_span; + for (; slot_span; slot_span = next_slot_span) { + next_slot_span = slot_span->next_slot_span; + + if (slot_span->is_active()) { + // Ordering in the active slot span list matters, don't reverse it. + if (!new_active_slot_spans_head) + new_active_slot_spans_head = slot_span; + if (new_active_slot_spans_tail) + new_active_slot_spans_tail->next_slot_span = slot_span; + new_active_slot_spans_tail = slot_span; + slot_span->next_slot_span = nullptr; + } else if (slot_span->is_empty()) { + // For the empty and decommitted lists, LIFO ordering makes sense (since + // it would lead to reusing memory which has been touched relatively + // recently, which only matters for committed spans though). + slot_span->next_slot_span = empty_slot_spans_head; + empty_slot_spans_head = slot_span; + } else if (slot_span->is_decommitted()) { + slot_span->next_slot_span = decommitted_slot_spans_head; + decommitted_slot_spans_head = slot_span; + } else { + // Full slot spans are not tracked, just accounted for. + PA_DCHECK(slot_span->is_full()); + slot_span->marked_full = 1; + ++num_full_slot_spans; + PA_CHECK(num_full_slot_spans); // Overflow. + slot_span->next_slot_span = nullptr; + } + } + + if (!new_active_slot_spans_head) { + new_active_slot_spans_head = + SlotSpanMetadata<thread_safe>::get_sentinel_slot_span(); + } + active_slot_spans_head = new_active_slot_spans_head; +} + +template <bool thread_safe> void PartitionBucket<thread_safe>::SortSlotSpanFreelists() { for (auto* slot_span = active_slot_spans_head; slot_span; slot_span = slot_span->next_slot_span) {
diff --git a/base/allocator/partition_allocator/partition_bucket.h b/base/allocator/partition_allocator/partition_bucket.h index bb41227..d15d80b 100644 --- a/base/allocator/partition_allocator/partition_bucket.h +++ b/base/allocator/partition_allocator/partition_bucket.h
@@ -128,6 +128,11 @@ // This is where the guts of the bucket maintenance is done! bool SetNewActiveSlotSpan(); + // Walks the entire active slot span list, and perform regular maintenance, + // where empty, decommitted and full slot spans are moved to their + // steady-state place. + BASE_EXPORT void MaintainActiveList(); + // Returns a slot number starting from the beginning of the slot span. ALWAYS_INLINE size_t GetSlotNumber(size_t offset_in_slot_span) const { // See the static assertion for `kReciprocalShift` above. @@ -145,8 +150,6 @@ void SortSlotSpanFreelists(); private: - static NOINLINE void OnFull(); - // Allocates a new slot span with size |num_partition_pages| from the // current extent. Metadata within this slot span will be initialized. // Returns nullptr on error.
diff --git a/base/allocator/partition_allocator/partition_page.cc b/base/allocator/partition_allocator/partition_page.cc index 020c5b4..ee0301a 100644 --- a/base/allocator/partition_allocator/partition_page.cc +++ b/base/allocator/partition_allocator/partition_page.cc
@@ -183,6 +183,7 @@ if (LIKELY(bucket->active_slot_spans_head != get_sentinel_slot_span())) next_slot_span = bucket->active_slot_spans_head; bucket->active_slot_spans_head = this; + PA_CHECK(bucket->num_full_slot_spans); // Underflow. --bucket->num_full_slot_spans; }
diff --git a/base/allocator/partition_allocator/partition_root.cc b/base/allocator/partition_allocator/partition_root.cc index 39a3ee6..70d7d63 100644 --- a/base/allocator/partition_allocator/partition_root.cc +++ b/base/allocator/partition_allocator/partition_root.cc
@@ -1045,6 +1045,7 @@ // TODO(bikineev): Consider rescheduling the purging after PCScan. if (PCScan::IsInProgress()) return; + if (flags & PurgeFlags::kDecommitEmptySlotSpans) DecommitEmptySlotSpans(); if (flags & PurgeFlags::kDiscardUnusedSystemPages) { @@ -1056,6 +1057,10 @@ internal::PartitionPurgeBucket(&bucket); else bucket.SortSlotSpanFreelists(); + + // Do it at the end, as the actions above change the status of slot + // spans (e.g. empty -> decommitted). + bucket.MaintainActiveList(); } } }
diff --git a/base/allocator/partition_allocator/partition_root.h b/base/allocator/partition_allocator/partition_root.h index d425016..4779db8 100644 --- a/base/allocator/partition_allocator/partition_root.h +++ b/base/allocator/partition_allocator/partition_root.h
@@ -195,7 +195,7 @@ // Never instantiate a PartitionRoot directly, instead use // PartitionAllocator. template <bool thread_safe> -struct alignas(64) BASE_EXPORT PartitionRoot { +struct ALIGNAS(64) BASE_EXPORT PartitionRoot { using SlotSpan = internal::SlotSpanMetadata<thread_safe>; using Page = internal::PartitionPage<thread_safe>; using Bucket = internal::PartitionBucket<thread_safe>;
diff --git a/base/allocator/partition_allocator/thread_cache_unittest.cc b/base/allocator/partition_allocator/thread_cache_unittest.cc index 3038e34..cc4e1b1 100644 --- a/base/allocator/partition_allocator/thread_cache_unittest.cc +++ b/base/allocator/partition_allocator/thread_cache_unittest.cc
@@ -111,7 +111,7 @@ protected: void SetUp() override { - if (!GetParam()) + if (GetParam()) root_->SwitchToDenserBucketDistribution(); else root_->ResetBucketDistributionForTesting(); @@ -157,9 +157,12 @@ return tc_bucket->slot_size; } + static size_t SizeToIndex(size_t size) { + return PartitionRoot<ThreadSafe>::SizeToBucketIndex(size, GetParam()); + } + size_t FillThreadCacheAndReturnIndex(size_t size, size_t count = 1) { - uint16_t bucket_index = - PartitionRoot<ThreadSafe>::SizeToBucketIndex(size, GetParam()); + uint16_t bucket_index = SizeToIndex(size); std::vector<void*> allocated_data; for (size_t i = 0; i < count; ++i) { @@ -203,8 +206,7 @@ void* ptr = root_->Alloc(kSmallSize, ""); ASSERT_TRUE(ptr); - uint16_t index = - PartitionRoot<ThreadSafe>::SizeToBucketIndex(kSmallSize, GetParam()); + uint16_t index = SizeToIndex(kSmallSize); EXPECT_EQ(kFillCountForSmallBucket - 1, tcache->bucket_count_for_testing(index)); @@ -232,8 +234,7 @@ auto* tcache = root_->thread_cache_for_testing(); EXPECT_TRUE(tcache); - uint16_t index = - PartitionRoot<ThreadSafe>::SizeToBucketIndex(kSmallSize, GetParam()); + uint16_t index = SizeToIndex(kSmallSize); EXPECT_EQ(kFillCountForSmallBucket - 1, tcache->bucket_count_for_testing(index)); @@ -703,6 +704,7 @@ auto* tcache = root_->thread_cache_for_testing(); size_t bucket_index = FillThreadCacheAndReturnIndex(kMediumSize, kDefaultCountForMediumBucket); + EXPECT_EQ(kDefaultCountForMediumBucket, tcache->buckets_[bucket_index].count); ThreadCacheRegistry::Instance().SetThreadCacheMultiplier( @@ -932,8 +934,7 @@ void* ptr = root_->Alloc(kMediumSize, ""); - auto* medium_bucket = - &root_->buckets[root_->SizeToBucketIndex(kMediumSize, GetParam())]; + auto* medium_bucket = root_->buckets + SizeToIndex(kMediumSize); size_t medium_alloc_size = medium_bucket->slot_size; expected_allocated_size += medium_alloc_size; expected_committed_size += @@ -984,8 +985,7 @@ void* ptr = root_->Alloc(kMediumSize, ""); - auto* medium_bucket = - &root_->buckets[root_->SizeToBucketIndex(kMediumSize, GetParam())]; + auto* medium_bucket = root_->buckets + SizeToIndex(kMediumSize); auto* curr = medium_bucket->active_slot_spans_head->get_freelist_head(); curr = curr->GetNextForThreadCache<true>(kMediumSize);
diff --git a/base/task/thread_pool/thread_pool_instance.h b/base/task/thread_pool/thread_pool_instance.h index 56fb258c..4b8e5f7 100644 --- a/base/task/thread_pool/thread_pool_instance.h +++ b/base/task/thread_pool/thread_pool_instance.h
@@ -213,7 +213,7 @@ // post_task.h API. In particular, refrain from doing // if (!ThreadPoolInstance::Get()) { // ThreadPoolInstance::Set(...); - // base::PostTask(...); + // base::ThreadPool::PostTask(...); // } // instead make sure to SetInstance() early in one determinstic place in the // process' initialization phase.
diff --git a/build/config/ios/BUILD.gn b/build/config/ios/BUILD.gn index b709c38..52e2e4a 100644 --- a/build/config/ios/BUILD.gn +++ b/build/config/ios/BUILD.gn
@@ -147,20 +147,27 @@ # for catalyst build. This can be removed when a catalyst slice is added # to upstream Clang. if (target_environment == "catalyst") { - assert(1300 <= xcode_version_int && xcode_version_int <= 1321) + if (xcode_version_int >= 1300 && xcode_version_int <= 1321) { + _xcode_clang_version = "13.0.0" + } else if (xcode_version_int == 1330) { + _xcode_clang_version = "13.1.6" + } else { + assert(false) + } ldflags += [ "-lSystem", - rebase_path("$ios_toolchains_path/usr/lib/clang/13.0.0/" + - "lib/darwin/libclang_rt.osx.a", + rebase_path("$ios_toolchains_path/usr/lib/clang/" + _xcode_clang_version + + "/lib/darwin/libclang_rt.osx.a", root_build_dir), "-nodefaultlibs", ] # UBSAn runtime library is also required when using libfuzzer. if (use_libfuzzer) { - ldflags += [ rebase_path("$ios_toolchains_path/usr/lib/clang/13.0.0/" + - "lib/darwin/libclang_rt.ubsan_osx.a", - root_build_dir) ] + ldflags += [ rebase_path( + "$ios_toolchains_path/usr/lib/clang/" + _xcode_clang_version + + "/lib/darwin/libclang_rt.ubsan_osx.a", + root_build_dir) ] } } }
diff --git a/build/config/win/BUILD.gn b/build/config/win/BUILD.gn index 0929e29..a892cfe 100644 --- a/build/config/win/BUILD.gn +++ b/build/config/win/BUILD.gn
@@ -298,46 +298,11 @@ # Linker flags for Windows SDK setup, this is applied only to EXEs and DLLs. config("sdk_link") { - assert(current_cpu == "x64" || current_cpu == "x86" || current_cpu == "arm" || - current_cpu == "arm64", - "Only supports x64, x86, arm and arm64 CPUs") - if (current_cpu == "x64") { - ldflags = [ "/MACHINE:X64" ] - } else if (current_cpu == "x86") { + if (current_cpu == "x86") { ldflags = [ - "/MACHINE:X86", "/SAFESEH", # Not compatible with x64 so use only for x86. "/largeaddressaware", ] - } else if (current_cpu == "arm") { - ldflags = [ "/MACHINE:ARM" ] - } else if (current_cpu == "arm64") { - ldflags = [ "/MACHINE:ARM64" ] - } - - vcvars_toolchain_data = exec_script("../../toolchain/win/setup_toolchain.py", - [ - visual_studio_path, - windows_sdk_path, - visual_studio_runtime_dirs, - current_os, - current_cpu, - "none", - ], - "scope") - - vc_lib_path = vcvars_toolchain_data.vc_lib_path - if (defined(vcvars_toolchain_data.vc_lib_atlmfc_path)) { - vc_lib_atlmfc_path = vcvars_toolchain_data.vc_lib_atlmfc_path - } - vc_lib_um_path = vcvars_toolchain_data.vc_lib_um_path - - lib_dirs = [ - "$vc_lib_um_path", - "$vc_lib_path", - ] - if (defined(vc_lib_atlmfc_path)) { - lib_dirs += [ "$vc_lib_atlmfc_path" ] } }
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index cc9bb32..dfbe3ef 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -7.20220316.3.1 +7.20220317.1.1
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index cc9bb32..dfbe3ef 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@ -7.20220316.3.1 +7.20220317.1.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index cc9bb32..dfbe3ef 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -7.20220316.3.1 +7.20220317.1.1
diff --git a/build/rust/BUILD.gn b/build/rust/BUILD.gn index 7b44d0d..09da28ee 100644 --- a/build/rust/BUILD.gn +++ b/build/rust/BUILD.gn
@@ -14,12 +14,6 @@ rustflags = [ "--edition=2015" ] } -# The required config for cxx-generated bindings because Chromium C++ is built -# with -fno-exceptions. -config("cxx_cppconfig") { - defines = [ "RUST_CXX_NO_EXCEPTIONS" ] -} - # The required dependencies for cxx-generated bindings, that must be included # on the C++ side. static_library("cxx_cppdeps") { @@ -28,6 +22,11 @@ "//third_party/rust/cxx/v1/crate/src/cxx.cc", ] + defines = [ + "RUST_CXX_NO_EXCEPTIONS", + "CXX_RS_EXPORT=__attribute__((visibility(\"default\")))", + ] + # Depending on the C++ bindings side of cxx then requires also depending # on the Rust bindings, since one calls the other. And the Rust bindings # require the Rust standard library. @@ -39,7 +38,6 @@ ":cxx_rustdeps", "//build/rust/std", ] - public_configs = [ ":cxx_cppconfig" ] } # The required dependencies for cxx-generated bindings, that must be included
diff --git a/build/rust/rust_cxx.gni b/build/rust/rust_cxx.gni index ee0fef6..59f14b1 100644 --- a/build/rust/rust_cxx.gni +++ b/build/rust/rust_cxx.gni
@@ -138,11 +138,6 @@ args += [ "__attribute__((visibility(\"default\")))" ] } } - - # Anyone building the header files we generate needs to have - # RUST_CXX_NO_EXCEPTIONS defined so that they build without exception - # support. - public_configs = [ "//build/rust:cxx_cppconfig" ] } static_library(target_name) {
diff --git a/build/toolchain/win/BUILD.gn b/build/toolchain/win/BUILD.gn index 254855d..dd7fff8 100644 --- a/build/toolchain/win/BUILD.gn +++ b/build/toolchain/win/BUILD.gn
@@ -368,7 +368,8 @@ tool("alink") { rspfile = "{{output}}.rsp" - command = "$linker_wrapper$lib /OUT:{{output}} /nologo ${sys_lib_flags}{{arflags}} @$rspfile" + command = + "$linker_wrapper$lib /OUT:{{output}} /nologo {{arflags}} @$rspfile" description = "LIB {{output}}" outputs = [ # Ignore {{output_extension}} and always use .lib, there's no reason to @@ -539,7 +540,21 @@ sys_include_flags = "${win_toolchain_data.include_flags_imsvc}" if (use_lld) { sys_lib_flags = - "-libpath:$_clang_lib_dir ${win_toolchain_data.libpath_flags}" + "-libpath:$_clang_lib_dir ${win_toolchain_data.libpath_lldlink_flags}" + + # TODO(thakis): Remove once crbug.com/1300005 is fixed + assert(toolchain_arch == "x64" || toolchain_arch == "x86" || + toolchain_arch == "arm" || toolchain_arch == "arm64", + "Only supports x64, x86, arm and arm64 CPUs") + if (toolchain_arch == "x64") { + sys_lib_flags += " /MACHINE:X64" + } else if (toolchain_arch == "x86") { + sys_lib_flags += " /MACHINE:X86" + } else if (toolchain_arch == "arm") { + sys_lib_flags += " /MACHINE:ARM" + } else if (toolchain_arch == "arm64") { + sys_lib_flags += " /MACHINE:ARM64" + } } toolchain_args = {
diff --git a/build/toolchain/win/setup_toolchain.py b/build/toolchain/win/setup_toolchain.py index ec9e9eed..d692fc9 100644 --- a/build/toolchain/win/setup_toolchain.py +++ b/build/toolchain/win/setup_toolchain.py
@@ -243,9 +243,6 @@ cpus = ('x86', 'x64', 'arm', 'arm64') assert target_cpu in cpus vc_bin_dir = '' - vc_lib_path = '' - vc_lib_atlmfc_path = '' - vc_lib_um_path = '' include = '' lib = '' @@ -268,10 +265,6 @@ env['PATH'] = runtime_dirs + os.pathsep + env['PATH'] vc_bin_dir = FindFileInEnvList(env, 'PATH', os.pathsep, 'cl.exe') - vc_lib_path = FindFileInEnvList(env, 'LIB', ';', 'msvcrt.lib') - vc_lib_atlmfc_path = FindFileInEnvList( - env, 'LIB', ';', 'atls.lib', optional=True) - vc_lib_um_path = FindFileInEnvList(env, 'LIB', ';', 'user32.lib') # The separator for INCLUDE here must match the one used in # _LoadToolchainEnv() above. @@ -299,15 +292,14 @@ gn_helpers.ToGNString(q('/winsysroot' + relflag(toolchain_root)))) else: print('include_flags_imsvc = ' + gn_helpers.ToGNString(include_imsvc)) - print('vc_lib_path = ' + gn_helpers.ToGNString(vc_lib_path)) - # Possible atlmfc library path gets introduced in the future for store thus - # output result if a result exists. - if (vc_lib_atlmfc_path != ''): - print('vc_lib_atlmfc_path = ' + gn_helpers.ToGNString(vc_lib_atlmfc_path)) - print('vc_lib_um_path = ' + gn_helpers.ToGNString(vc_lib_um_path)) print('paths = ' + gn_helpers.ToGNString(env['PATH'])) assert libpath_flags print('libpath_flags = ' + gn_helpers.ToGNString(libpath_flags)) + if bool(int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', 1))) and win_sdk_path: + print('libpath_lldlink_flags = ' + + gn_helpers.ToGNString(q('/winsysroot:' + relflag(toolchain_root)))) + else: + print('libpath_lldlink_flags = ' + gn_helpers.ToGNString(libpath_flags)) if __name__ == '__main__':
diff --git a/buildtools/mac/clang-format.arm64.sha1 b/buildtools/mac/clang-format.arm64.sha1 deleted file mode 100644 index 6b3f7a91..0000000 --- a/buildtools/mac/clang-format.arm64.sha1 +++ /dev/null
@@ -1 +0,0 @@ -5ba974b3b37f9f4e3b44fdde11d7ef2ab71619ab
diff --git a/buildtools/mac/clang-format.x64.sha1 b/buildtools/mac/clang-format.x64.sha1 deleted file mode 100644 index 6b3f7a91..0000000 --- a/buildtools/mac/clang-format.x64.sha1 +++ /dev/null
@@ -1 +0,0 @@ -5ba974b3b37f9f4e3b44fdde11d7ef2ab71619ab
diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc index 10e2750..feb6874a 100644 --- a/cc/trees/property_tree.cc +++ b/cc/trees/property_tree.cc
@@ -23,6 +23,7 @@ #include "cc/trees/scroll_node.h" #include "cc/trees/transform_node.h" #include "components/viz/common/frame_sinks/copy_output_request.h" +#include "ui/gfx/geometry/outsets_f.h" #include "ui/gfx/geometry/point_conversions.h" #include "ui/gfx/geometry/transform_util.h" #include "ui/gfx/geometry/vector2d_conversions.h" @@ -455,6 +456,40 @@ return fixed_elements_dont_overscroll_ && node && node->is_fixed_position; } +void TransformTree::UpdateFixedNodeTransformAndClip( + const TransformNode* node, + gfx::Vector2dF& fixed_position_adjustment) { + if (!ShouldUndoOverscroll(node) || + overscroll_node_id_ == kInvalidPropertyNodeId) + return; + + const TransformNode* overscroll_node = Node(overscroll_node_id_); + const gfx::Vector2dF overscroll_offset = + overscroll_node->scroll_offset.OffsetFromOrigin(); + if (overscroll_offset.IsZero()) + return; + + fixed_position_adjustment += + gfx::ScaleVector2d(overscroll_offset, 1.f / page_scale_factor()); + + ClipNode* clip_node = property_trees()->clip_tree_mutable().Node( + property_trees()->clip_tree_mutable().overscroll_node_id()); + + if (clip_node) { + // Inflate the clip rect based on the overscroll direction. + gfx::OutsetsF outsets; + fixed_position_adjustment.x() < 0 + ? outsets.set_left(-fixed_position_adjustment.x()) + : outsets.set_right(fixed_position_adjustment.x()); + fixed_position_adjustment.y() < 0 + ? outsets.set_top(-fixed_position_adjustment.y()) + : outsets.set_bottom(fixed_position_adjustment.y()); + + clip_node->clip.Outset(outsets); + property_trees()->clip_tree_mutable().set_needs_update(true); + } +} + void TransformTree::UpdateLocalTransform(TransformNode* node) { gfx::Transform transform; transform.Translate3d(node->post_translation.x() + node->origin.x(), @@ -467,15 +502,7 @@ property_trees()->outer_viewport_container_bounds_delta().y()); } - if (ShouldUndoOverscroll(node)) { - const TransformNode* overscroll_node = Node(overscroll_node_id_); - if (overscroll_node) { - fixed_position_adjustment += - gfx::ScaleVector2d(overscroll_node->scroll_offset.OffsetFromOrigin(), - 1.f / page_scale_factor()); - } - } - + UpdateFixedNodeTransformAndClip(node, fixed_position_adjustment); transform.Translate(fixed_position_adjustment - node->scroll_offset.OffsetFromOrigin()); transform.Translate(StickyPositionOffset(node)); @@ -1212,7 +1239,8 @@ } ClipTree::ClipTree(PropertyTrees* property_trees) - : PropertyTree<ClipNode>(property_trees) {} + : PropertyTree<ClipNode>(property_trees), + overscroll_node_id_(kInvalidPropertyNodeId) {} void ClipTree::SetViewportClip(gfx::RectF viewport_rect) { if (size() < 2) @@ -1232,7 +1260,8 @@ #if DCHECK_IS_ON() bool ClipTree::operator==(const ClipTree& other) const { - return PropertyTree::operator==(other); + return PropertyTree::operator==(other) && + overscroll_node_id_ == other.overscroll_node_id(); } #endif
diff --git a/cc/trees/property_tree.h b/cc/trees/property_tree.h index be389ca..10f80237 100644 --- a/cc/trees/property_tree.h +++ b/cc/trees/property_tree.h
@@ -247,6 +247,9 @@ } bool ShouldUndoOverscroll(const TransformNode* node) const; + void UpdateFixedNodeTransformAndClip( + const TransformNode* node, + gfx::Vector2dF& fixed_position_adjustment); const StickyPositionNodeData* GetStickyPositionData(int node_id) const { return const_cast<TransformTree*>(this)->MutableStickyPositionData(node_id); @@ -330,6 +333,14 @@ void SetViewportClip(gfx::RectF viewport_rect); gfx::RectF ViewportClip() const; + + void set_overscroll_node_id(int id) { overscroll_node_id_ = id; } + int overscroll_node_id() const { return overscroll_node_id_; } + + private: + // Used to track the ClipNode that is corresponding to the overscroll + // TransformNode. + int overscroll_node_id_; }; class CC_EXPORT EffectTree final : public PropertyTree<EffectNode> {
diff --git a/chrome/VERSION b/chrome/VERSION index 32b7815..8609131 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=101 MINOR=0 -BUILD=4950 +BUILD=4951 PATCH=0
diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni index bb294cf..8ca2154 100644 --- a/chrome/android/chrome_java_resources.gni +++ b/chrome/android/chrome_java_resources.gni
@@ -12,6 +12,7 @@ "java/res/anim/activity_close_exit.xml", "java/res/anim/activity_open_enter.xml", "java/res/anim/decelerate_quart.xml", + "java/res/anim/fast_out_extra_slow_in_interpolator.xml", "java/res/anim/fast_out_slow_in_interpolator.xml", "java/res/anim/slide_in_up.xml", "java/res/anim/stay_hidden.xml", @@ -81,6 +82,8 @@ "java/res/drawable-hdpi/spinner_white.png", "java/res/drawable-hdpi/tab_strip_fade.png", "java/res/drawable-hdpi/tab_strip_fade_for_model_selector.png", + "java/res/drawable-hdpi/tab_strip_fade_long.png", + "java/res/drawable-hdpi/tab_strip_fade_short.png", "java/res/drawable-hdpi/tabswitcher_border_frame.9.png", "java/res/drawable-hdpi/tabswitcher_border_frame_decoration.9.png", "java/res/drawable-hdpi/tabswitcher_border_frame_inner_shadow.9.png", @@ -156,6 +159,8 @@ "java/res/drawable-mdpi/spinner_white.png", "java/res/drawable-mdpi/tab_strip_fade.png", "java/res/drawable-mdpi/tab_strip_fade_for_model_selector.png", + "java/res/drawable-mdpi/tab_strip_fade_long.png", + "java/res/drawable-mdpi/tab_strip_fade_short.png", "java/res/drawable-mdpi/tabswitcher_border_frame.9.png", "java/res/drawable-mdpi/tabswitcher_border_frame_decoration.9.png", "java/res/drawable-mdpi/tabswitcher_border_frame_inner_shadow.9.png", @@ -239,6 +244,8 @@ "java/res/drawable-xhdpi/spinner_white.png", "java/res/drawable-xhdpi/tab_strip_fade.png", "java/res/drawable-xhdpi/tab_strip_fade_for_model_selector.png", + "java/res/drawable-xhdpi/tab_strip_fade_long.png", + "java/res/drawable-xhdpi/tab_strip_fade_short.png", "java/res/drawable-xhdpi/tabswitcher_border_frame.9.png", "java/res/drawable-xhdpi/tabswitcher_border_frame_decoration.9.png", "java/res/drawable-xhdpi/tabswitcher_border_frame_inner_shadow.9.png", @@ -308,6 +315,8 @@ "java/res/drawable-xxhdpi/spinner_white.png", "java/res/drawable-xxhdpi/tab_strip_fade.png", "java/res/drawable-xxhdpi/tab_strip_fade_for_model_selector.png", + "java/res/drawable-xxhdpi/tab_strip_fade_long.png", + "java/res/drawable-xxhdpi/tab_strip_fade_short.png", "java/res/drawable-xxhdpi/tabswitcher_border_frame.9.png", "java/res/drawable-xxhdpi/tabswitcher_border_frame_decoration.9.png", "java/res/drawable-xxhdpi/tabswitcher_border_frame_inner_shadow.9.png", @@ -374,6 +383,8 @@ "java/res/drawable-xxxhdpi/spinner_white.png", "java/res/drawable-xxxhdpi/tab_strip_fade.png", "java/res/drawable-xxxhdpi/tab_strip_fade_for_model_selector.png", + "java/res/drawable-xxxhdpi/tab_strip_fade_long.png", + "java/res/drawable-xxxhdpi/tab_strip_fade_short.png", "java/res/drawable-xxxhdpi/tabswitcher_border_frame.9.png", "java/res/drawable-xxxhdpi/tabswitcher_border_frame_decoration.9.png", "java/res/drawable-xxxhdpi/tabswitcher_border_frame_inner_shadow.9.png",
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index 515101a..0a0e96c5 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -69,7 +69,6 @@ "java/src/org/chromium/chrome/browser/app/appmenu/IncognitoMenuItemViewBinder.java", "java/src/org/chromium/chrome/browser/app/appmenu/ManagedByMenuItemViewBinder.java", "java/src/org/chromium/chrome/browser/app/appmenu/UpdateMenuItemViewBinder.java", - "java/src/org/chromium/chrome/browser/app/download/DownloadInterstitialCoordinatorFactoryHelper.java", "java/src/org/chromium/chrome/browser/app/download/DownloadMessageUiDelegate.java", "java/src/org/chromium/chrome/browser/app/download/home/DownloadActivity.java", "java/src/org/chromium/chrome/browser/app/download/home/DownloadManagerCoordinatorFactoryHelper.java",
diff --git a/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected b/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected index 59ce62e..6228f7b 100644 --- a/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected +++ b/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected
@@ -1162,6 +1162,14 @@ <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY"/> </intent-filter> # DIFF-ANCHOR: 99686c45 </service> # DIFF-ANCHOR: 4c2196d9 + <service # DIFF-ANCHOR: 8520a49e + android:name="org.chromium.android_webview.js.renderer.JsSandboxService0" + android:exported="true" + android:externalService="true" + android:isolatedProcess="true" + android:process=":js_sandboxed_process0" + android:visibleToInstantApps="true"> + </service> # DIFF-ANCHOR: 8520a49e <service # DIFF-ANCHOR: b9ec52c4 android:name="org.chromium.android_webview.nonembedded.AwComponentUpdateService" android:exported="false"
diff --git a/chrome/android/features/autofill_assistant/BUILD.gn b/chrome/android/features/autofill_assistant/BUILD.gn index cb8664c..d8ac68f 100644 --- a/chrome/android/features/autofill_assistant/BUILD.gn +++ b/chrome/android/features/autofill_assistant/BUILD.gn
@@ -98,6 +98,7 @@ "javatests/src/org/chromium/chrome/browser/autofill_assistant/DirectActionsIntegrationTest.java", "javatests/src/org/chromium/chrome/browser/autofill_assistant/InCctTriggeringFromGsaTest.java", "javatests/src/org/chromium/chrome/browser/autofill_assistant/InCctTriggeringFromNonGsaTest.java", + "javatests/src/org/chromium/chrome/browser/autofill_assistant/JsFlowIntegrationTest.java", "javatests/src/org/chromium/chrome/browser/autofill_assistant/MiniActionTestUtil.java", "javatests/src/org/chromium/chrome/browser/autofill_assistant/PasswordChangeFixtureParameters.java", "javatests/src/org/chromium/chrome/browser/autofill_assistant/PasswordChangeFixtureTest.java",
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataIntegrationTest.java index 737ca96b..2fb69153 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataIntegrationTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataIntegrationTest.java
@@ -3,7 +3,6 @@ // found in the LICENSE file. package org.chromium.chrome.browser.autofill_assistant; - import static androidx.test.espresso.Espresso.onView; import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.action.ViewActions.pressImeActionButton; @@ -73,6 +72,7 @@ import org.chromium.chrome.browser.autofill_assistant.proto.CollectUserDataProto.TermsAndConditionsState; import org.chromium.chrome.browser.autofill_assistant.proto.CollectUserDataResultProto; import org.chromium.chrome.browser.autofill_assistant.proto.ContactDetailsProto; +import org.chromium.chrome.browser.autofill_assistant.proto.DataOriginNoticeProto; import org.chromium.chrome.browser.autofill_assistant.proto.DropdownSelectStrategy; import org.chromium.chrome.browser.autofill_assistant.proto.ElementAreaProto; import org.chromium.chrome.browser.autofill_assistant.proto.ElementAreaProto.Rectangle; @@ -1334,4 +1334,51 @@ waitUntilViewMatchesCondition(withText("Prompt"), isCompletelyDisplayed()); assertThat(getElementValue(getWebContents(), "profile_name"), is("John Doe")); } + + /** + * Data origin notice should be shown and should open the dialog when clicked. + */ + @Test + @MediumTest + public void testDataOriginNotice() throws Exception { + ArrayList<ActionProto> list = new ArrayList<>(); + list.add( + ActionProto.newBuilder() + .setCollectUserData( + CollectUserDataProto.newBuilder() + .setRequestTermsAndConditions(false) + .setDataOriginNotice( + DataOriginNoticeProto.newBuilder() + .setLinkText("About this data") + .setDialogTitle( + "About your personal information") + .setDialogText( + "Information on the data.\n\n" + + "<link0>Manage your Google" + + " account</link0>") + .setDialogButtonText("Got it")) + .setContactDetails(ContactDetailsProto.newBuilder() + .setContactDetailsName("contact") + .setRequestPayerName(true) + .setRequestPayerEmail(true))) + .build()); + + AutofillAssistantTestScript script = new AutofillAssistantTestScript( + SupportedScriptProto.newBuilder() + .setPath("form_target_website.html") + .setPresentation(PresentationProto.newBuilder().setAutostart(true)) + .build(), + list); + + AutofillAssistantTestService testService = + new AutofillAssistantTestService(Collections.singletonList(script)); + startAutofillAssistant(mTestRule.getActivity(), testService); + + waitUntilViewMatchesCondition(withText("About this data"), isDisplayed()); + onView(withText("About this data")).perform(click()); + + waitUntilViewMatchesCondition(withText("About your personal information"), isDisplayed()); + onView(withText("Information on the data.\n\nManage your Google account")) + .check(matches(isDisplayed())); + } }
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataTestHelper.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataTestHelper.java index 0ed5420..5e37f3d 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataTestHelper.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataTestHelper.java
@@ -10,6 +10,7 @@ import android.view.View; import android.widget.LinearLayout; +import android.widget.RelativeLayout; import android.widget.TextView; import androidx.annotation.Nullable; @@ -62,6 +63,7 @@ final AssistantChoiceList mShippingAddressList; final AssistantChoiceList mLoginList; final List<View> mDividers; + final RelativeLayout mDataOriginNotice; ViewHolder(AssistantCollectUserDataCoordinator coordinator) { mAccordion = coordinator.getView().findViewWithTag( @@ -80,6 +82,8 @@ AssistantTagsForTesting.COLLECT_USER_DATA_RADIO_TERMS_SECTION_TAG); mInfoSection = coordinator.getView().findViewWithTag( AssistantTagsForTesting.COLLECT_USER_DATA_INFO_SECTION_TAG); + mDataOriginNotice = coordinator.getView().findViewWithTag( + AssistantTagsForTesting.COLLECT_USER_DATA_DATA_ORIGIN_NOTICE_TAG); mDividers = findViewsWithTag(coordinator.getView(), DIVIDER_TAG); mContactList = (AssistantChoiceList) (findViewsWithTag( mContactSection, COLLECT_USER_DATA_CHOICE_LIST)
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataUiTest.java index e843203..c275ff9c 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataUiTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataUiTest.java
@@ -865,6 +865,37 @@ @Test @MediumTest + public void testDataOriginNotice() throws Exception { + AssistantCollectUserDataModel model = createCollectUserDataModel(); + AssistantCollectUserDataCoordinator coordinator = createCollectUserDataCoordinator(model); + AutofillAssistantCollectUserDataTestHelper + .ViewHolder viewHolder = TestThreadUtils.runOnUiThreadBlocking( + () -> new AutofillAssistantCollectUserDataTestHelper.ViewHolder(coordinator)); + + TextView dataOriginLinkText = + viewHolder.mDataOriginNotice.findViewById(R.id.link_to_data_origin_dialog); + + // Setting a text from "backend". + TestThreadUtils.runOnUiThreadBlocking(() -> { + model.set(AssistantCollectUserDataModel.DATA_ORIGIN_LINK_TEXT, "About this data"); + model.set(AssistantCollectUserDataModel.DATA_ORIGIN_DIALOG_TITLE, + "About your personal information"); + model.set(AssistantCollectUserDataModel.DATA_ORIGIN_DIALOG_TEXT, + "This is some text describing the <link2>user's data</link2> info."); + model.set(AssistantCollectUserDataModel.DATA_ORIGIN_DIALOG_BUTTON_TEXT, "Got it"); + model.set(AssistantCollectUserDataModel.VISIBLE, true); + }); + + onView(is(dataOriginLinkText)) + .check(matches(allOf(withText("About this data"), isDisplayed()))); + + onView(withText("About this data")).perform(click()); + onView(withText("This is some text describing the user's data info.")) + .check(matches(isDisplayed())); + } + + @Test + @MediumTest public void testAdditionalStaticSections() throws Exception { AssistantCollectUserDataModel model = createCollectUserDataModel(); AssistantCollectUserDataCoordinator coordinator = createCollectUserDataCoordinator(model);
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/JsFlowIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/JsFlowIntegrationTest.java new file mode 100644 index 0000000..48800d3c --- /dev/null +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/JsFlowIntegrationTest.java
@@ -0,0 +1,437 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.autofill_assistant; + +import static androidx.test.espresso.Espresso.onView; +import static androidx.test.espresso.action.ViewActions.click; +import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist; +import static androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed; +import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; +import static androidx.test.espresso.matcher.ViewMatchers.withId; +import static androidx.test.espresso.matcher.ViewMatchers.withText; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.iterableWithSize; + +import static org.chromium.base.test.util.CriteriaHelper.DEFAULT_POLLING_INTERVAL; +import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.checkElementExists; +import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.startAutofillAssistant; +import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.tapElement; +import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.waitUntil; +import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.waitUntilViewAssertionTrue; +import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.waitUntilViewMatchesCondition; +import static org.chromium.chrome.browser.autofill_assistant.MiniActionTestUtil.addClickSteps; +import static org.chromium.chrome.browser.autofill_assistant.ProtoTestUtil.toCssSelector; + +import android.support.test.InstrumentationRegistry; +import android.util.Base64; + +import androidx.test.filters.MediumTest; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.chrome.browser.autofill_assistant.AutofillAssistantTestService.ScriptsReturnMode; +import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto; +import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto; +import org.chromium.chrome.browser.autofill_assistant.proto.ChipType; +import org.chromium.chrome.browser.autofill_assistant.proto.ConfigureUiStateProto; +import org.chromium.chrome.browser.autofill_assistant.proto.ConfigureUiStateProto.OverlayBehavior; +import org.chromium.chrome.browser.autofill_assistant.proto.ElementConditionProto; +import org.chromium.chrome.browser.autofill_assistant.proto.ElementConditionsProto; +import org.chromium.chrome.browser.autofill_assistant.proto.JsFlowProto; +import org.chromium.chrome.browser.autofill_assistant.proto.ProcessedActionProto; +import org.chromium.chrome.browser.autofill_assistant.proto.ProcessedActionStatusProto; +import org.chromium.chrome.browser.autofill_assistant.proto.PromptProto; +import org.chromium.chrome.browser.autofill_assistant.proto.PromptProto.Choice; +import org.chromium.chrome.browser.autofill_assistant.proto.ScriptPreconditionProto; +import org.chromium.chrome.browser.autofill_assistant.proto.SelectorProto; +import org.chromium.chrome.browser.autofill_assistant.proto.StopProto; +import org.chromium.chrome.browser.autofill_assistant.proto.SupportedScriptProto; +import org.chromium.chrome.browser.autofill_assistant.proto.SupportedScriptProto.PresentationProto; +import org.chromium.chrome.browser.autofill_assistant.proto.TellProto; +import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule; +import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils; +import org.chromium.chrome.browser.flags.ChromeSwitches; +import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.components.autofill_assistant.AutofillAssistantPreferencesUtil; +import org.chromium.components.autofill_assistant.R; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Tests JS flows. + */ +@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) +@RunWith(ChromeJUnit4ClassRunner.class) +public class JsFlowIntegrationTest { + private static final String HTML_DIRECTORY = "/components/test/data/autofill_assistant/html/"; + private static final String TEST_PAGE = "autofill_assistant_target_website.html"; + private static final String MAIN_SCRIPT_PATH = "main_script"; + private static final String INTERRUPT_SCRIPT_PATH = "interrupt_script"; + private static final SupportedScriptProto TEST_SCRIPT = + SupportedScriptProto.newBuilder() + .setPath(MAIN_SCRIPT_PATH) + .setPresentation(PresentationProto.newBuilder().setAutostart(true)) + .build(); + + @Rule + public CustomTabActivityTestRule mTestRule = new CustomTabActivityTestRule(); + + private String getTargetWebsiteUrl(String testPage) { + return mTestRule.getTestServer().getURL(HTML_DIRECTORY + testPage); + } + + private AutofillAssistantTestService runScript(AutofillAssistantTestScript script) { + return runScript(Collections.singletonList(script)); + } + + private AutofillAssistantTestService runScript(List<AutofillAssistantTestScript> scripts) { + AutofillAssistantTestService testService = + new AutofillAssistantTestService(scripts, ScriptsReturnMode.ALL_AT_ONCE); + startAutofillAssistant(mTestRule.getActivity(), testService); + return testService; + } + + @Before + public void setUp() { + AutofillAssistantPreferencesUtil.setInitialPreferences(true); + mTestRule.startCustomTabActivityWithIntent(CustomTabsTestUtils.createMinimalCustomTabIntent( + InstrumentationRegistry.getTargetContext(), getTargetWebsiteUrl(TEST_PAGE))); + } + + private byte[] getActionBytes(ActionProto action) { + switch (action.getActionInfoCase()) { + case SELECT_OPTION: + return action.getSelectOption().toByteArray(); + case NAVIGATE: + return action.getNavigate().toByteArray(); + case PROMPT: + return action.getPrompt().toByteArray(); + case TELL: + return action.getTell().toByteArray(); + case SHOW_CAST: + return action.getShowCast().toByteArray(); + case WAIT_FOR_DOM: + return action.getWaitForDom().toByteArray(); + case USE_CARD: + return action.getUseCard().toByteArray(); + case USE_ADDRESS: + return action.getUseAddress().toByteArray(); + case UPLOAD_DOM: + return action.getUploadDom().toByteArray(); + case SHOW_PROGRESS_BAR: + return action.getShowProgressBar().toByteArray(); + case SHOW_DETAILS: + return action.getShowDetails().toByteArray(); + case STOP: + return action.getStop().toByteArray(); + case COLLECT_USER_DATA: + return action.getCollectUserData().toByteArray(); + case SET_ATTRIBUTE: + return action.getSetAttribute().toByteArray(); + case SHOW_INFO_BOX: + return action.getShowInfoBox().toByteArray(); + case EXPECT_NAVIGATION: + return action.getExpectNavigation().toByteArray(); + case WAIT_FOR_NAVIGATION: + return action.getWaitForNavigation().toByteArray(); + case CONFIGURE_BOTTOM_SHEET: + return action.getConfigureBottomSheet().toByteArray(); + case SHOW_FORM: + return action.getShowForm().toByteArray(); + case POPUP_MESSAGE: + return action.getPopupMessage().toByteArray(); + case WAIT_FOR_DOCUMENT: + return action.getWaitForDocument().toByteArray(); + case SHOW_GENERIC_UI: + return action.getShowGenericUi().toByteArray(); + case GENERATE_PASSWORD_FOR_FORM_FIELD: + return action.getGeneratePasswordForFormField().toByteArray(); + case SAVE_GENERATED_PASSWORD: + return action.getSaveGeneratedPassword().toByteArray(); + case CONFIGURE_UI_STATE: + return action.getConfigureUiState().toByteArray(); + case PRESAVE_GENERATED_PASSWORD: + return action.getPresaveGeneratedPassword().toByteArray(); + case GET_ELEMENT_STATUS: + return action.getGetElementStatus().toByteArray(); + case SCROLL_INTO_VIEW: + return action.getScrollIntoView().toByteArray(); + case WAIT_FOR_DOCUMENT_TO_BECOME_INTERACTIVE: + return action.getWaitForDocumentToBecomeInteractive().toByteArray(); + case WAIT_FOR_DOCUMENT_TO_BECOME_COMPLETE: + return action.getWaitForDocumentToBecomeComplete().toByteArray(); + case SEND_CLICK_EVENT: + return action.getSendClickEvent().toByteArray(); + case SEND_TAP_EVENT: + return action.getSendTapEvent().toByteArray(); + case JS_CLICK: + return action.getJsClick().toByteArray(); + case SEND_KEYSTROKE_EVENTS: + return action.getSendKeystrokeEvents().toByteArray(); + case SEND_CHANGE_EVENT: + return action.getSendChangeEvent().toByteArray(); + case SET_ELEMENT_ATTRIBUTE: + return action.getSetElementAttribute().toByteArray(); + case SELECT_FIELD_VALUE: + return action.getSelectFieldValue().toByteArray(); + case FOCUS_FIELD: + return action.getFocusField().toByteArray(); + case WAIT_FOR_ELEMENT_TO_BECOME_STABLE: + return action.getWaitForElementToBecomeStable().toByteArray(); + case CHECK_ELEMENT_IS_ON_TOP: + return action.getCheckElementIsOnTop().toByteArray(); + case RELEASE_ELEMENTS: + return action.getReleaseElements().toByteArray(); + case DISPATCH_JS_EVENT: + return action.getDispatchJsEvent().toByteArray(); + case SEND_KEY_EVENT: + return action.getSendKeyEvent().toByteArray(); + case SELECT_OPTION_ELEMENT: + return action.getSelectOptionElement().toByteArray(); + case CHECK_ELEMENT_TAG: + return action.getCheckElementTag().toByteArray(); + case CHECK_OPTION_ELEMENT: + return action.getCheckOptionElement().toByteArray(); + case SET_PERSISTENT_UI: + return action.getSetPersistentUi().toByteArray(); + case CLEAR_PERSISTENT_UI: + return action.getClearPersistentUi().toByteArray(); + case SCROLL_INTO_VIEW_IF_NEEDED: + return action.getScrollIntoViewIfNeeded().toByteArray(); + case SCROLL_WINDOW: + return action.getScrollWindow().toByteArray(); + case SCROLL_CONTAINER: + return action.getScrollContainer().toByteArray(); + case SET_TOUCHABLE_AREA: + return action.getSetTouchableArea().toByteArray(); + case DELETE_PASSWORD: + return action.getDeletePassword().toByteArray(); + case EDIT_PASSWORD: + return action.getEditPassword().toByteArray(); + case BLUR_FIELD: + return action.getBlurField().toByteArray(); + case RESET_PENDING_CREDENTIALS: + return action.getResetPendingCredentials().toByteArray(); + case SAVE_SUBMITTED_PASSWORD: + return action.getSaveSubmittedPassword().toByteArray(); + case UPDATE_CLIENT_SETTINGS: + return action.getUpdateClientSettings().toByteArray(); + case JS_FLOW: + return action.getJsFlow().toByteArray(); + case EXECUTE_JS: + return action.getExecuteJs().toByteArray(); + default: + assert false : "Unhandled action case, please add above!"; + return null; + } + } + + /** + * Returns a JS flow action that will execute all actions in {@code actions} consecutively. + */ + private ActionProto toJsFlowAction(List<ActionProto> actions) { + assert (!actions.isEmpty()); + StringBuilder jsFlow = new StringBuilder(); + for (int i = 0; i < actions.size(); i++) { + jsFlow.append("[client_status, value] = await runNativeAction(") + .append(actions.get(i).getActionInfoCase().getNumber()) + .append(", '") + .append(Base64.encodeToString(getActionBytes(actions.get(i)), Base64.NO_WRAP)) + .append("');\nif (client_status != 2) { return {status:client_status}; }\n"); + } + jsFlow.append("return {status:client_status};"); + return ActionProto.newBuilder() + .setJsFlow(JsFlowProto.newBuilder().setJsFlow(jsFlow.toString())) + .build(); + } + + @Test + @MediumTest + public void runSimpleJsFlowWithNativeActions() throws Exception { + // Clicking #touch_area_one will make it disappear, which makes for a convenient test. + ArrayList<ActionProto> nestedActions = new ArrayList<>(); + addClickSteps(toCssSelector("#touch_area_one"), nestedActions); + + ArrayList<ActionProto> list = new ArrayList<>(); + list.add(toJsFlowAction(nestedActions)); + list.add(ActionProto.newBuilder() + .setPrompt(PromptProto.newBuilder().addChoices(Choice.newBuilder().setChip( + ChipProto.newBuilder() + .setType(ChipType.HIGHLIGHTED_ACTION) + .setText("After JS flow")))) + .build()); + + Assert.assertTrue(checkElementExists(mTestRule.getWebContents(), "touch_area_one")); + + AutofillAssistantTestScript script = new AutofillAssistantTestScript(TEST_SCRIPT, list); + runScript(script); + + waitUntilViewMatchesCondition(withText("After JS flow"), isCompletelyDisplayed()); + waitUntil(() -> !checkElementExists(mTestRule.getWebContents(), "touch_area_one")); + } + + @Test + @MediumTest + public void runSimpleJsFlowWithReturnValue() throws Exception { + ArrayList<ActionProto> list = new ArrayList<>(); + String jsFlow = "return {" + + "status:3," + + "result:[[1,2], null, {enum:5}]" + + "}"; + list.add(ActionProto.newBuilder() + .setJsFlow(JsFlowProto.newBuilder().setJsFlow(jsFlow)) + .build()); + list.add(ActionProto.newBuilder() + .setPrompt(PromptProto.newBuilder().addChoices(Choice.newBuilder().setChip( + ChipProto.newBuilder() + .setType(ChipType.HIGHLIGHTED_ACTION) + .setText("Should not run because JS flow returned " + + "OTHER_ACTION_STATUS != ACTION_APPLIED")))) + .build()); + + AutofillAssistantTestScript script = new AutofillAssistantTestScript(TEST_SCRIPT, list); + AutofillAssistantTestService testService = runScript(script); + + testService.waitUntilGetNextActions(1); + List<ProcessedActionProto> processedActions = testService.getProcessedActions(); + assertThat(processedActions, iterableWithSize(1)); + assertThat(processedActions.get(0).getStatus(), + is(ProcessedActionStatusProto.OTHER_ACTION_STATUS)); + // Note that the JS flow returns a JS object (no quotes around 'enum'), but the action + // returns the JSON representation of that object (with quotes around 'enum'). + assertThat(processedActions.get(0).getJsFlowResult().getResultJson(), + is("[[1,2],null,{\"enum\":5}]")); + } + + @Test + @MediumTest + public void stopFlowFromJs() throws Exception { + ArrayList<ActionProto> nestedActions = new ArrayList<>(); + nestedActions.add(ActionProto.newBuilder() + .setTell(TellProto.newBuilder().setMessage("Bye!")) + .build()); + nestedActions.add(ActionProto.newBuilder().setStop(StopProto.newBuilder()).build()); + + ArrayList<ActionProto> list = new ArrayList<>(); + list.add(ActionProto.newBuilder() + .setPrompt(PromptProto.newBuilder().addChoices(Choice.newBuilder().setChip( + ChipProto.newBuilder() + .setType(ChipType.HIGHLIGHTED_ACTION) + .setText("Stop")))) + .build()); + list.add(toJsFlowAction(nestedActions)); + list.add(ActionProto.newBuilder() + .setPrompt(PromptProto.newBuilder().addChoices(Choice.newBuilder().setChip( + ChipProto.newBuilder() + .setType(ChipType.HIGHLIGHTED_ACTION) + .setText("Should not run!")))) + .build()); + + AutofillAssistantTestScript script = new AutofillAssistantTestScript(TEST_SCRIPT, list); + runScript(script); + + waitUntilViewMatchesCondition(withText("Stop"), isCompletelyDisplayed()); + onView(withText("Stop")).perform(click()); + waitUntilViewAssertionTrue( + withId(R.id.autofill_assistant), doesNotExist(), DEFAULT_POLLING_INTERVAL); + } + + @Test + @MediumTest + public void runInterruptDuringFlow() throws Exception { + ArrayList<AutofillAssistantTestScript> scripts = new ArrayList<>(); + ArrayList<ActionProto> nestedActions = new ArrayList<>(); + nestedActions.add( + ActionProto.newBuilder() + .setConfigureUiState(ConfigureUiStateProto.newBuilder().setOverlayBehavior( + OverlayBehavior.HIDDEN)) + .build()); + + nestedActions.add( + ActionProto.newBuilder() + .setPrompt(PromptProto.newBuilder().setAllowInterrupt(true).addChoices( + PromptProto.Choice.newBuilder().setChip( + ChipProto.newBuilder().setText("Continue")))) + .build()); + nestedActions.add(ActionProto.newBuilder() + .setPrompt(PromptProto.newBuilder().addChoices( + PromptProto.Choice.newBuilder().setChip( + ChipProto.newBuilder().setText("Finished")))) + .build()); + + // The main script runs the above actions as a JS flow, i.e., it contains only a single + // action. + AutofillAssistantTestScript mainScript = new AutofillAssistantTestScript( + TEST_SCRIPT, Collections.singletonList(toJsFlowAction(nestedActions))); + scripts.add(mainScript); + + ArrayList<ActionProto> interruptActionList = new ArrayList<>(); + SelectorProto touchAreaOne = toCssSelector("#touch_area_one"); + addClickSteps(touchAreaOne, interruptActionList); + interruptActionList.add( + ActionProto.newBuilder() + .setPrompt(PromptProto.newBuilder().addChoices( + PromptProto.Choice.newBuilder().setChip( + ChipProto.newBuilder().setText("Interrupt")))) + .build()); + + // The interrupt triggers when touch_area_one is present but touch_area_four is gone, so + // that we can trigger it manually. + SelectorProto touchAreaFour = toCssSelector("#touch_area_four"); + ScriptPreconditionProto interruptPrecondition = + ScriptPreconditionProto.newBuilder() + .setElementCondition(ElementConditionProto.newBuilder().setAllOf( + ElementConditionsProto.newBuilder() + .addConditions(ElementConditionProto.newBuilder().setNoneOf( + ElementConditionsProto.newBuilder().addConditions( + ElementConditionProto.newBuilder().setMatch( + touchAreaFour)))) + .addConditions(ElementConditionProto.newBuilder().setMatch( + touchAreaOne)))) + .build(); + + // The interrupt is also run as a JS flow. + AutofillAssistantTestScript interruptScript = new AutofillAssistantTestScript( + SupportedScriptProto.newBuilder() + .setPath(INTERRUPT_SCRIPT_PATH) + .setPresentation( + PresentationProto.newBuilder().setInterrupt(true).setPrecondition( + interruptPrecondition)) + .build(), + Collections.singletonList(toJsFlowAction(interruptActionList))); + scripts.add(interruptScript); + + runScript(scripts); + + waitUntilViewMatchesCondition(withText("Continue"), isDisplayed()); + + // Tapping touch_area_four will make it disappear, which triggers the interrupt. + tapElement(mTestRule, "touch_area_four"); + waitUntil(() -> !checkElementExists(mTestRule.getWebContents(), "touch_area_four")); + + // The interrupt should click on touch_area_one, making it disappear. + waitUntilViewMatchesCondition(withText("Interrupt"), isDisplayed()); + waitUntil(() -> !checkElementExists(mTestRule.getWebContents(), "touch_area_one")); + + // Click the chip to end the interrupt and go back to the main script. + onView(withText("Interrupt")).perform(click()); + + // Once the interrupt is done, the prompt chip should appear again. + waitUntilViewMatchesCondition(withText("Continue"), isDisplayed()); + + // The flow should continue after the prompt finishes. + onView(withText("Continue")).perform(click()); + waitUntilViewMatchesCondition(withText("Finished"), isDisplayed()); + } +}
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java index dfefb19..0f25002 100644 --- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java +++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
@@ -278,12 +278,12 @@ TabSwitcher.Controller controller = mTabSwitcher != null ? mTabSwitcher.getController() : mTasksSurface.getController(); - mStartSurfaceMediator = - new StartSurfaceMediator(controller, mTabModelSelector, mPropertyModel, - mIsStartSurfaceEnabled ? this::initializeSecondaryTasksSurface : null, - mIsStartSurfaceEnabled, mActivity, mBrowserControlsManager, - this::isActivityFinishingOrDestroyed, excludeMVTiles, excludeQueryTiles, - startSurfaceOneshotSupplier, hadWarmStart, jankTracker); + mStartSurfaceMediator = new StartSurfaceMediator(controller, containerView, + mTabModelSelector, mPropertyModel, + mIsStartSurfaceEnabled ? this::initializeSecondaryTasksSurface : null, + mIsStartSurfaceEnabled, mActivity, mBrowserControlsManager, + this::isActivityFinishingOrDestroyed, excludeMVTiles, excludeQueryTiles, + startSurfaceOneshotSupplier, hadWarmStart, jankTracker); // Show feed loading image. if (mStartSurfaceMediator.shouldShowFeedPlaceholder()) {
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java index 74a8040..ca74f81 100644 --- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java +++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java
@@ -7,15 +7,18 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; import android.content.Context; import android.graphics.Rect; import android.graphics.RectF; import android.os.Handler; import android.os.SystemClock; +import android.view.View; import android.view.ViewGroup; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; +import androidx.vectordrawable.graphics.drawable.AnimationUtilsCompat; import org.chromium.base.Log; import org.chromium.base.TraceEvent; @@ -24,6 +27,7 @@ import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.supplier.Supplier; +import org.chromium.chrome.R; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; import org.chromium.chrome.browser.compositor.layouts.Layout; import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost; @@ -67,6 +71,7 @@ // Duration of the transition animation public static final long ZOOMING_DURATION = 300; + private static final int TRANSLATE_DURATION_MS = 500; private static final int BACKGROUND_FADING_DURATION_MS = 150; private static final String TRACE_SHOW_TAB_SWITCHER = "StartSurfaceLayout.Show.TabSwitcher"; @@ -75,7 +80,7 @@ private static final String TRACE_HIDE_START_SURFACE = "StartSurfaceLayout.Hide.StartSurface"; // The transition animation from a tab to the tab switcher. - private AnimatorSet mTabToSwitcherShrinkExpandAnimation; + private AnimatorSet mTabToSwitcherAnimation; private boolean mIsAnimating; private TabListSceneLayer mSceneLayer; @@ -272,9 +277,8 @@ boolean isCurrentTabModelEmpty = mTabModelSelector.getCurrentModel().getCount() == 0; animate = animate && !isCurrentTabModelEmpty && !isShowingStartSurfaceHomepage; - if (mScrimCoordinator != null - && TabUiFeatureUtilities.isTabletGridTabSwitcherPolishEnabled(getContext())) { - showOverviewWithScrim(animate); + if (TabUiFeatureUtilities.isTabletGridTabSwitcherPolishEnabled(getContext())) { + showOverviewWithTranslateUp(animate); } else { showOverviewWithTabShrink(animate, () @@ -283,16 +287,16 @@ } } - private void showOverviewWithScrim(boolean animate) { + private void showBrowserScrim() { + if (mScrimCoordinator == null) return; PropertyModel scrimProp = new PropertyModel.Builder(ScrimProperties.REQUIRED_KEYS) .with(ScrimProperties.ANCHOR_VIEW, mScrimAnchor) .with(ScrimProperties.SHOW_IN_FRONT_OF_ANCHOR_VIEW, false) .build(); mScrimCoordinator.showScrim(scrimProp); - mController.showOverview(animate); } - private void removeBrowserScrim() { + private void hideBrowserScrim() { if (mScrimCoordinator == null || !mScrimCoordinator.isShowingScrim()) return; mScrimCoordinator.hideScrim(true); } @@ -359,8 +363,11 @@ updateCacheVisibleIds(new LinkedList<>(Arrays.asList(sourceTabId))); mIsAnimating = true; - removeBrowserScrim(); - mController.hideOverview(!isTabGtsAnimationEnabled()); + if (TabUiFeatureUtilities.isTabletGridTabSwitcherPolishEnabled(getContext())) { + translateDown(); + } else { + mController.hideOverview(!isTabGtsAnimationEnabled()); + } } @Override @@ -423,9 +430,9 @@ @Override protected void forceAnimationToFinish() { super.forceAnimationToFinish(); - if (mTabToSwitcherShrinkExpandAnimation != null) { - if (mTabToSwitcherShrinkExpandAnimation.isRunning()) { - mTabToSwitcherShrinkExpandAnimation.end(); + if (mTabToSwitcherAnimation != null) { + if (mTabToSwitcherAnimation.isRunning()) { + mTabToSwitcherAnimation.end(); } } } @@ -520,12 +527,12 @@ backgroundAlpha.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN_INTERPOLATOR); animationList.add(backgroundAlpha); - mTabToSwitcherShrinkExpandAnimation = new AnimatorSet(); - mTabToSwitcherShrinkExpandAnimation.playTogether(animationList); - mTabToSwitcherShrinkExpandAnimation.addListener(new AnimatorListenerAdapter() { + mTabToSwitcherAnimation = new AnimatorSet(); + mTabToSwitcherAnimation.playTogether(animationList); + mTabToSwitcherAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { - mTabToSwitcherShrinkExpandAnimation = null; + mTabToSwitcherAnimation = null; // Step 2: fade in the real GTS RecyclerView. mController.showOverview(true); @@ -536,7 +543,7 @@ mStartTime = SystemClock.elapsedRealtime(); mLastFrameTime = SystemClock.elapsedRealtime(); mMaxFrameInterval = 0; - mTabToSwitcherShrinkExpandAnimation.start(); + mTabToSwitcherAnimation.start(); } /** @@ -575,12 +582,12 @@ backgroundAlpha.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN_INTERPOLATOR); animationList.add(backgroundAlpha); - mTabToSwitcherShrinkExpandAnimation = new AnimatorSet(); - mTabToSwitcherShrinkExpandAnimation.playTogether(animationList); - mTabToSwitcherShrinkExpandAnimation.addListener(new AnimatorListenerAdapter() { + mTabToSwitcherAnimation = new AnimatorSet(); + mTabToSwitcherAnimation.playTogether(animationList); + mTabToSwitcherAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { - mTabToSwitcherShrinkExpandAnimation = null; + mTabToSwitcherAnimation = null; postHiding(); reportAnimationPerf(false); @@ -590,7 +597,70 @@ mStartTime = SystemClock.elapsedRealtime(); mLastFrameTime = SystemClock.elapsedRealtime(); mMaxFrameInterval = 0; - mTabToSwitcherShrinkExpandAnimation.start(); + mTabToSwitcherAnimation.start(); + } + + /** + * Animate translating grid tab switcher and its toolbar up. + */ + private void showOverviewWithTranslateUp(boolean animate) { + forceAnimationToFinish(); + showBrowserScrim(); + + Animator translateUp = ObjectAnimator.ofFloat(mController.getTabSwitcherContainer(), + View.TRANSLATION_Y, mController.getTabSwitcherContainer().getHeight(), 0f); + translateUp.setInterpolator(AnimationUtilsCompat.loadInterpolator( + getContext(), R.anim.fast_out_extra_slow_in_interpolator)); + translateUp.setDuration(TRANSLATE_DURATION_MS); + + mTabToSwitcherAnimation = new AnimatorSet(); + mTabToSwitcherAnimation.play(translateUp); + mTabToSwitcherAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + // Skip fade-in for tab switcher view, since it will translate in instead. + mController.showOverview(false); + mController.getTabSwitcherContainer().setVisibility(View.VISIBLE); + } + + @Override + public void onAnimationEnd(Animator animation) { + mTabToSwitcherAnimation = null; + + reportTabletAnimationPerf(true); + } + }); + mTabToSwitcherAnimation.start(); + } + + /** + * Animate translating grid tab switcher and its toolbar down off-screen. + */ + private void translateDown() { + forceAnimationToFinish(); + hideBrowserScrim(); + + Animator translateDown = ObjectAnimator.ofFloat(mController.getTabSwitcherContainer(), + View.TRANSLATION_Y, 0f, mController.getTabSwitcherContainer().getHeight()); + translateDown.setInterpolator(AnimationUtilsCompat.loadInterpolator( + getContext(), R.anim.fast_out_extra_slow_in_interpolator)); + translateDown.setDuration(TRANSLATE_DURATION_MS); + + mTabToSwitcherAnimation = new AnimatorSet(); + mTabToSwitcherAnimation.play(translateDown); + mTabToSwitcherAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mTabToSwitcherAnimation = null; + + // Skip fade-out for tab switcher view, since it will translate out instead. + mController.hideOverview(false); + mController.getTabSwitcherContainer().setVisibility(View.GONE); + + reportTabletAnimationPerf(false); + } + }); + mTabToSwitcherAnimation.start(); } private Rect getThumbnailLocationOfCurrentTab() { @@ -710,6 +780,10 @@ } } + private void reportTabletAnimationPerf(boolean translatingUp) { + // TODO(crbug.com/1304926): Record metrics for tablet animations. + } + @Override protected void updateSceneLayer(RectF viewport, RectF contentViewport, TabContentManager tabContentManager, ResourceManager resourceManager, @@ -740,7 +814,7 @@ @Override public boolean onUpdateAnimation(long time, boolean jumpToEnd) { - return mTabToSwitcherShrinkExpandAnimation == null && !mIsAnimating; + return mTabToSwitcherAnimation == null && !mIsAnimating; } @Override @@ -757,12 +831,10 @@ /** * Shrink/Expand animation is disabled for Tablet TabSwitcher launch polish. - * @return + * @return Whether shrink/expand animation is enabled. */ private boolean isTabGtsAnimationEnabled() { - if (TabUiFeatureUtilities.isTabletGridTabSwitcherPolishEnabled(getContext())) { - return false; - } + if (TabUiFeatureUtilities.isTabletGridTabSwitcherPolishEnabled(getContext())) return false; return TabUiFeatureUtilities.isTabToGtsAnimationEnabled(); } }
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java index 9a0cba23..459e41c 100644 --- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java +++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
@@ -32,6 +32,7 @@ import android.content.Context; import android.content.res.Resources; import android.view.View; +import android.view.ViewGroup; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; @@ -164,9 +165,10 @@ private boolean mHideTabCarouselForNewSurface; private boolean mHideOverviewOnTabSelecting = true; private StartSurface.OnTabSelectingListener mOnTabSelectingListener; + private ViewGroup mTabSwitcherContainer; - StartSurfaceMediator(TabSwitcher.Controller controller, TabModelSelector tabModelSelector, - @Nullable PropertyModel propertyModel, + StartSurfaceMediator(TabSwitcher.Controller controller, ViewGroup tabSwitcherContainer, + TabModelSelector tabModelSelector, @Nullable PropertyModel propertyModel, @Nullable SecondaryTasksSurfaceInitializer secondaryTasksSurfaceInitializer, boolean isStartSurfaceEnabled, Context context, BrowserControlsStateProvider browserControlsStateProvider, @@ -174,6 +176,7 @@ boolean excludeQueryTiles, OneshotSupplier<StartSurface> startSurfaceSupplier, boolean hadWarmStart, JankTracker jankTracker) { mController = controller; + mTabSwitcherContainer = tabSwitcherContainer; mTabModelSelector = tabModelSelector; mPropertyModel = propertyModel; mSecondaryTasksSurfaceInitializer = secondaryTasksSurfaceInitializer; @@ -561,6 +564,11 @@ } @Override + public ViewGroup getTabSwitcherContainer() { + return mTabSwitcherContainer; + } + + @Override public void addOverviewModeObserver(StartSurface.OverviewModeObserver observer) { mObservers.addObserver(observer); }
diff --git a/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java b/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java index bebcfee..aedea8f0 100644 --- a/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java +++ b/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java
@@ -1282,13 +1282,14 @@ private StartSurfaceMediator createStartSurfaceMediatorWithoutInit( boolean isStartSurfaceEnabled, boolean excludeMVTiles, boolean hadWarmStart) { - StartSurfaceMediator mediator = new StartSurfaceMediator(mMainTabGridController, - mTabModelSelector, !isStartSurfaceEnabled ? null : mPropertyModel, - isStartSurfaceEnabled ? mSecondaryTasksSurfaceInitializer : null, - isStartSurfaceEnabled, ContextUtils.getApplicationContext(), - mBrowserControlsStateProvider, mActivityStateChecker, excludeMVTiles, - true /* excludeQueryTiles */, mStartSurfaceSupplier, hadWarmStart, - new DummyJankTracker()); + StartSurfaceMediator mediator = + new StartSurfaceMediator(mMainTabGridController, null /* tabSwitcherContainer */, + mTabModelSelector, !isStartSurfaceEnabled ? null : mPropertyModel, + isStartSurfaceEnabled ? mSecondaryTasksSurfaceInitializer : null, + isStartSurfaceEnabled, ContextUtils.getApplicationContext(), + mBrowserControlsStateProvider, mActivityStateChecker, excludeMVTiles, + true /* excludeQueryTiles */, mStartSurfaceSupplier, hadWarmStart, + new DummyJankTracker()); return mediator; } }
diff --git a/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurface.java b/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurface.java index 5ebdf55..a5ca3c7 100644 --- a/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurface.java +++ b/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurface.java
@@ -5,6 +5,7 @@ package org.chromium.chrome.features.start_surface; import android.os.SystemClock; +import android.view.ViewGroup; import androidx.annotation.Nullable; @@ -193,6 +194,11 @@ * @return Whether the Start surface or the Tab switcher is shown or showing. */ boolean inShowState(); + + /** + * @return The Tab switcher container view. + */ + ViewGroup getTabSwitcherContainer(); } /**
diff --git a/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml b/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml index 6dfd866..d5fc2dc 100644 --- a/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml +++ b/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml
@@ -46,8 +46,6 @@ android:layout_height="wrap_content" android:layout_below="@id/tab_title" android:gravity="center_horizontal" - android:adjustViewBounds="true" - android:scaleType="fitCenter" android:importantForAccessibility="no" android:src="@color/thumbnail_placeholder_on_primary_bg" style="?attr/tabGridThumbnailStyle"/>
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java index 9bf3db65..fe85161 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java
@@ -15,6 +15,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; +import android.widget.ImageView.ScaleType; import android.widget.TextView; import androidx.annotation.Nullable; @@ -28,6 +29,7 @@ import org.chromium.base.Callback; import org.chromium.chrome.tab_ui.R; import org.chromium.components.browser_ui.widget.chips.ChipView; +import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.widget.ButtonCompat; @@ -138,6 +140,14 @@ updateThumbnail(view, model); } else if (TabProperties.CONTENT_DESCRIPTION_STRING == propertyKey) { view.setContentDescription(model.get(TabProperties.CONTENT_DESCRIPTION_STRING)); + } else if (TabProperties.GRID_CARD_HEIGHT == propertyKey) { + view.setMinimumHeight(model.get(TabProperties.GRID_CARD_HEIGHT)); + view.getLayoutParams().height = model.get(TabProperties.GRID_CARD_HEIGHT); + view.setLayoutParams(view.getLayoutParams()); + } else if (TabProperties.GRID_CARD_WIDTH == propertyKey) { + view.setMinimumWidth(model.get(TabProperties.GRID_CARD_WIDTH)); + view.getLayoutParams().width = model.get(TabProperties.GRID_CARD_WIDTH); + view.setLayoutParams(view.getLayoutParams()); } } @@ -326,6 +336,13 @@ TabGridThumbnailView thumbnail = (TabGridThumbnailView) view.fastFindViewById(R.id.tab_thumbnail); thumbnail.maybeAdjustThumbnailHeight(); + if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(view.getContext()) + && TabUiFeatureUtilities.isGridTabSwitcherEnabled(view.getContext())) { + thumbnail.setScaleType(ScaleType.CENTER_CROP); + } else { + thumbnail.setScaleType(ScaleType.FIT_CENTER); + thumbnail.setAdjustViewBounds(true); + } if (fetcher == null) { thumbnail.setImageDrawable(null); return;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java index b93c313..1f9d8ef 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java
@@ -14,6 +14,7 @@ import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.widget.ImageView; +import android.widget.ImageView.ScaleType; import androidx.annotation.IntDef; import androidx.annotation.NonNull; @@ -33,6 +34,7 @@ import org.chromium.chrome.browser.tasks.tab_management.TabProperties.UiType; import org.chromium.chrome.tab_ui.R; import org.chromium.ui.base.DeviceFormFactor; +import org.chromium.ui.base.ViewUtils; import org.chromium.ui.modelutil.MVCListAdapter; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyModel; @@ -159,6 +161,13 @@ ViewLookupCachingFrameLayout root = (ViewLookupCachingFrameLayout) holder.itemView; ImageView thumbnail = (ImageView) root.fastFindViewById(R.id.tab_thumbnail); if (thumbnail == null) return; + if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(context) + && TabUiFeatureUtilities.isGridTabSwitcherEnabled(context)) { + thumbnail.setScaleType(ScaleType.CENTER_CROP); + } else { + thumbnail.setScaleType(ScaleType.FIT_CENTER); + thumbnail.setAdjustViewBounds(true); + } if (TabUiFeatureUtilities.isLaunchPolishEnabled()) { thumbnail.setImageDrawable(null); @@ -310,13 +319,24 @@ private void updateThumbnailAndSpanCount() { updateThumbnailLocation(); - // Resetting span count for tablets. if (mMode == TabListMode.GRID && DeviceFormFactor.isNonMultiDisplayContextOnTablet(mContext) && TabUiFeatureUtilities.isGridTabSwitcherEnabled(mContext)) { - mMediator.updateSpanCount( - (GridLayoutManager) mRecyclerView.getLayoutManager(), + // Determine and set span count + final GridLayoutManager layoutManager = + (GridLayoutManager) mRecyclerView.getLayoutManager(); + mMediator.updateSpanCount(layoutManager, mContext.getResources().getConfiguration().orientation, mContext.getResources().getConfiguration().screenWidthDp); + + final int screenWidthPx = ViewUtils.dpToPx( + mContext, mContext.getResources().getConfiguration().screenWidthDp); + int itemWidthPx = (screenWidthPx / layoutManager.getSpanCount()); + int itemHeightPx = + ((int) ((itemWidthPx * 1f) / TabUtils.getTabThumbnailAspectRatio(mContext))); + for (int i = 0; i < mModel.size(); i++) { + mModel.get(i).model.set(TabProperties.GRID_CARD_WIDTH, itemWidthPx); + mModel.get(i).model.set(TabProperties.GRID_CARD_HEIGHT, itemHeightPx); + } } }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java index 2a8e849..f0fda7c46 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
@@ -1315,11 +1315,13 @@ private int getSpanCount(int orientation, int screenWidthDp) { if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(mContext) && TabUiFeatureUtilities.isGridTabSwitcherEnabled(mContext)) { - return screenWidthDp < TabListCoordinator.MAX_SCREEN_WIDTH_COMPACT_DP + int spanCount = screenWidthDp < TabListCoordinator.MAX_SCREEN_WIDTH_COMPACT_DP ? TabListCoordinator.GRID_LAYOUT_SPAN_COUNT_COMPACT : screenWidthDp < TabListCoordinator.MAX_SCREEN_WIDTH_MEDIUM_DP ? TabListCoordinator.GRID_LAYOUT_SPAN_COUNT_MEDIUM : TabListCoordinator.GRID_LAYOUT_SPAN_COUNT_LARGE; + if (orientation == Configuration.ORIENTATION_PORTRAIT || mModel.size() == 0) return spanCount; + return mModel.size() == 1 ? 2 : Math.min(spanCount, mModel.size()); } return orientation == Configuration.ORIENTATION_PORTRAIT || MultiWindowUtils.getInstance().isInMultiWindowMode((Activity) mContext)
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java index f0703d2..33b6b933 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java
@@ -16,6 +16,7 @@ import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModel.WritableBooleanPropertyKey; +import org.chromium.ui.modelutil.PropertyModel.WritableIntPropertyKey; import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey; import java.lang.annotation.Retention; @@ -54,6 +55,10 @@ public static final WritableObjectPropertyKey<TabListMediator.ThumbnailFetcher> THUMBNAIL_FETCHER = new WritableObjectPropertyKey<>(true); + public static final WritableIntPropertyKey GRID_CARD_WIDTH = new WritableIntPropertyKey(); + + public static final WritableIntPropertyKey GRID_CARD_HEIGHT = new WritableIntPropertyKey(); + public static final WritableObjectPropertyKey<TabListMediator.IphProvider> IPH_PROVIDER = new WritableObjectPropertyKey<>(); @@ -133,7 +138,7 @@ SEARCH_QUERY, PAGE_INFO_LISTENER, PAGE_INFO_ICON_DRAWABLE_ID, CARD_TYPE, CONTENT_DESCRIPTION_STRING, CLOSE_BUTTON_DESCRIPTION_STRING, SHOPPING_PERSISTED_TAB_DATA_FETCHER, STORE_PERSISTED_TAB_DATA_FETCHER, - SHOULD_SHOW_PRICE_DROP_TOOLTIP}; + SHOULD_SHOW_PRICE_DROP_TOOLTIP, GRID_CARD_WIDTH, GRID_CARD_HEIGHT}; public static final PropertyKey[] ALL_KEYS_TAB_STRIP = new PropertyKey[] {TAB_ID, TAB_SELECTED_LISTENER, TAB_CLOSED_LISTENER, FAVICON,
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tab/TabUtilsUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tab/TabUtilsUnitTest.java index 831c686..4a43fc00 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tab/TabUtilsUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tab/TabUtilsUnitTest.java
@@ -5,6 +5,9 @@ import static com.google.common.truth.Truth.assertThat; +import android.content.Context; +import android.content.res.Configuration; + import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.annotation.Config; @@ -40,7 +43,11 @@ @Test @Config(qualifiers = "sw800dp-land") public void testGetTabThumbnailAspectRatio_withTabletLandscapeContext() { - assertThat(TabUtils.getTabThumbnailAspectRatio(ContextUtils.getApplicationContext())) - .isEqualTo(TabUtils.TABLET_LANDSCAPE_TAB_THUMBNAIL_ASPECT_RATIO); + final Context applicationContext = ContextUtils.getApplicationContext(); + final Configuration configuration = applicationContext.getResources().getConfiguration(); + float expectedAspectRatio = + (configuration.screenWidthDp * 1f) / (configuration.screenHeightDp * 1f); + assertThat(TabUtils.getTabThumbnailAspectRatio(applicationContext)) + .isEqualTo(expectedAspectRatio); } } \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java index 40eb4259..fe4a332 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
@@ -775,9 +775,7 @@ doReturn(mTab2).when(mTabModelFilter).getTabAt(1); doReturn(newTab).when(mTabModelFilter).getTabAt(2); doReturn(3).when(mTabModelFilter).getCount(); - doReturn(Arrays.asList(newTab)) - .when(mTabModelFilter) - .getRelatedTabList(eq(TAB3_ID)); + doReturn(Arrays.asList(newTab)).when(mTabModelFilter).getRelatedTabList(eq(TAB3_ID)); assertThat(mModel.size(), equalTo(2)); mTabModelObserverCaptor.getValue().didAddTab( @@ -799,9 +797,7 @@ doReturn(mTab1).when(mTabModelFilter).getTabAt(0); doReturn(mTab2).when(mTabModelFilter).getTabAt(1); doReturn(2).when(mTabModelFilter).getCount(); - doReturn(Arrays.asList(mTab2, newTab)) - .when(mTabModelFilter) - .getRelatedTabList(eq(TAB3_ID)); + doReturn(Arrays.asList(mTab2, newTab)).when(mTabModelFilter).getRelatedTabList(eq(TAB3_ID)); assertThat(mModel.size(), equalTo(2)); mTabModelObserverCaptor.getValue().didAddTab( @@ -821,9 +817,7 @@ doReturn(newTab).when(mTabModelFilter).getTabAt(1); doReturn(mTab2).when(mTabModelFilter).getTabAt(2); doReturn(3).when(mTabModelFilter).getCount(); - doReturn(Arrays.asList(newTab)) - .when(mTabModelFilter) - .getRelatedTabList(eq(TAB3_ID)); + doReturn(Arrays.asList(newTab)).when(mTabModelFilter).getRelatedTabList(eq(TAB3_ID)); assertThat(mModel.size(), equalTo(2)); mTabModelObserverCaptor.getValue().didAddTab( @@ -1534,12 +1528,12 @@ @Test @Features.EnableFeatures(GRID_TAB_SWITCHER_FOR_TABLETS) public void updateSpanCount_onTablet_multipleScreenWidths() { - initAndAssertAllProperties(); + initAndAssertAllProperties(3); // Mock tablet when(mResources.getInteger(R.integer.min_screen_width_bucket)) .thenReturn(TabListCoordinator.MAX_SCREEN_WIDTH_MEDIUM_DP + 1); Configuration portraitConfiguration = new Configuration(); - portraitConfiguration.orientation = Configuration.ORIENTATION_PORTRAIT; + portraitConfiguration.orientation = Configuration.ORIENTATION_LANDSCAPE; // Mock that we are in single window mode. MultiWindowUtils.getInstance().setIsInMultiWindowModeForTesting(false); @@ -1561,6 +1555,40 @@ } @Test + @Features.EnableFeatures(GRID_TAB_SWITCHER_FOR_TABLETS) + public void updateSpanCount_onLargeTabletWithThreeTabs_landscape() { + // Init 3 tabs + initAndAssertAllProperties(1); + // Mock large tablet + when(mResources.getInteger(R.integer.min_screen_width_bucket)) + .thenReturn(TabListCoordinator.MAX_SCREEN_WIDTH_MEDIUM_DP + 1); + + Configuration portraitConfiguration = new Configuration(); + portraitConfiguration.orientation = Configuration.ORIENTATION_LANDSCAPE; + portraitConfiguration.screenWidthDp = TabListCoordinator.MAX_SCREEN_WIDTH_MEDIUM_DP + 1; + mComponentCallbacksCaptor.getValue().onConfigurationChanged(portraitConfiguration); + + verify(mGridLayoutManager).setSpanCount(mTabModel.getCount()); + } + + @Test + @Features.EnableFeatures(GRID_TAB_SWITCHER_FOR_TABLETS) + public void updateSpanCount_onLargeTabletWithThreeTabs_portrait() { + // Init 3 tabs + initAndAssertAllProperties(1); + // Mock large tablet + when(mResources.getInteger(R.integer.min_screen_width_bucket)) + .thenReturn(TabListCoordinator.MAX_SCREEN_WIDTH_MEDIUM_DP + 1); + + Configuration portraitConfiguration = new Configuration(); + portraitConfiguration.orientation = Configuration.ORIENTATION_PORTRAIT; + portraitConfiguration.screenWidthDp = TabListCoordinator.MAX_SCREEN_WIDTH_MEDIUM_DP + 1; + mComponentCallbacksCaptor.getValue().onConfigurationChanged(portraitConfiguration); + + verify(mGridLayoutManager).setSpanCount(TabListCoordinator.GRID_LAYOUT_SPAN_COUNT_LARGE); + } + + @Test public void resetWithListOfTabs_MruOrder() { List<Tab> tabs = new ArrayList<>(); for (int i = 0; i < mTabModel.getCount(); i++) { @@ -3097,6 +3125,20 @@ initAndAssertAllProperties(mMediator); } + // initAndAssertAllProperties called with regular mMediator + private void initAndAssertAllProperties(int extraTabCount) { + int index = mTabModel.getCount(); + int totalCount = mTabModel.getCount() + extraTabCount; + while (index < totalCount) { + Tab tab = prepareTab(index, TAB1_TITLE, TAB1_URL); + doReturn(tab).when(mTabModel).getTabAt(index); + doReturn(index).when(mTabModel).indexOf(tab); + index++; + } + doReturn(totalCount).when(mTabModel).getCount(); + initAndAssertAllProperties(mMediator); + } + // initAndAssertAllProperties called with custom mMediator (e.g. if spy needs to be used) private void initAndAssertAllProperties(TabListMediator mediator) { List<Tab> tabs = new ArrayList<>(); @@ -3108,7 +3150,7 @@ callback.onResult(mFavicon); } - assertThat(mModel.size(), equalTo(2)); + assertThat(mModel.size(), equalTo(mTabModel.getCount())); assertThat(mModel.get(0).model.get(TabProperties.TAB_ID), equalTo(TAB1_ID)); assertThat(mModel.get(1).model.get(TabProperties.TAB_ID), equalTo(TAB2_ID));
diff --git a/chrome/android/java/res/anim/fast_out_extra_slow_in_interpolator.xml b/chrome/android/java/res/anim/fast_out_extra_slow_in_interpolator.xml new file mode 100644 index 0000000..da641af --- /dev/null +++ b/chrome/android/java/res/anim/fast_out_extra_slow_in_interpolator.xml
@@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2022 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. --> + +<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android" + android:pathData="M 0,0 C 0.05, 0, 0.133333, 0.06, 0.166666, 0.4 C 0.208333, 0.82, 0.25, 1, 1, 1"/>
diff --git a/chrome/android/java/res/drawable-hdpi/tab_strip_fade_long.png b/chrome/android/java/res/drawable-hdpi/tab_strip_fade_long.png new file mode 100644 index 0000000..ab9cbfb --- /dev/null +++ b/chrome/android/java/res/drawable-hdpi/tab_strip_fade_long.png Binary files differ
diff --git a/chrome/android/java/res/drawable-hdpi/tab_strip_fade_short.png b/chrome/android/java/res/drawable-hdpi/tab_strip_fade_short.png new file mode 100644 index 0000000..e833f57 --- /dev/null +++ b/chrome/android/java/res/drawable-hdpi/tab_strip_fade_short.png Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/tab_strip_fade_long.png b/chrome/android/java/res/drawable-mdpi/tab_strip_fade_long.png new file mode 100644 index 0000000..061eee8 --- /dev/null +++ b/chrome/android/java/res/drawable-mdpi/tab_strip_fade_long.png Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/tab_strip_fade_short.png b/chrome/android/java/res/drawable-mdpi/tab_strip_fade_short.png new file mode 100644 index 0000000..e320a18 --- /dev/null +++ b/chrome/android/java/res/drawable-mdpi/tab_strip_fade_short.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/tab_strip_fade_long.png b/chrome/android/java/res/drawable-xhdpi/tab_strip_fade_long.png new file mode 100644 index 0000000..9f3621b --- /dev/null +++ b/chrome/android/java/res/drawable-xhdpi/tab_strip_fade_long.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/tab_strip_fade_short.png b/chrome/android/java/res/drawable-xhdpi/tab_strip_fade_short.png new file mode 100644 index 0000000..15fe01fe --- /dev/null +++ b/chrome/android/java/res/drawable-xhdpi/tab_strip_fade_short.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/tab_strip_fade_long.png b/chrome/android/java/res/drawable-xxhdpi/tab_strip_fade_long.png new file mode 100644 index 0000000..ae2bfe5 --- /dev/null +++ b/chrome/android/java/res/drawable-xxhdpi/tab_strip_fade_long.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/tab_strip_fade_short.png b/chrome/android/java/res/drawable-xxhdpi/tab_strip_fade_short.png new file mode 100644 index 0000000..5f91e66 --- /dev/null +++ b/chrome/android/java/res/drawable-xxhdpi/tab_strip_fade_short.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/tab_strip_fade_long.png b/chrome/android/java/res/drawable-xxxhdpi/tab_strip_fade_long.png new file mode 100644 index 0000000..8c538e6 --- /dev/null +++ b/chrome/android/java/res/drawable-xxxhdpi/tab_strip_fade_long.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/tab_strip_fade_short.png b/chrome/android/java/res/drawable-xxxhdpi/tab_strip_fade_short.png new file mode 100644 index 0000000..7a1eee5 --- /dev/null +++ b/chrome/android/java/res/drawable-xxxhdpi/tab_strip_fade_short.png Binary files differ
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index ff91c94..ae6717f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -833,8 +833,10 @@ newTabClickHandler, bookmarkClickHandler, null, showStartSurfaceSupplier); if (!isInstantStartEnabled()) { - assert !(mOverviewModeController != null - && mOverviewModeController.overviewVisible()); + // TODO(https://crbug.com/1306904): Fix this assert which is tripping on unrelated + // tests. + // assert !(mOverviewModeController != null + // && mOverviewModeController.overviewVisible()); } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/download/DownloadInterstitialCoordinatorFactoryHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/app/download/DownloadInterstitialCoordinatorFactoryHelper.java deleted file mode 100644 index 4d20a424..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/download/DownloadInterstitialCoordinatorFactoryHelper.java +++ /dev/null
@@ -1,24 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.app.download; - -import org.chromium.chrome.browser.download.interstitial.DownloadInterstitialCoordinator; -import org.chromium.chrome.browser.download.interstitial.DownloadInterstitialCoordinatorFactory; -import org.chromium.chrome.browser.download.items.OfflineContentAggregatorFactory; -import org.chromium.chrome.browser.tab.Tab; - -/** A helper class to build and return a {@link DownloadInterstitialCoordinator}. */ -public class DownloadInterstitialCoordinatorFactoryHelper { - /** - * @param tab The tab which will show the download interstitial. - * @return A new {@link DownloadInterstitialCoordinator} instance. - */ - public static DownloadInterstitialCoordinator create(Tab tab) { - return DownloadInterstitialCoordinatorFactory.create( - tab.getContext(), OfflineContentAggregatorFactory.get(), tab.getWindowAndroid()); - } - - private DownloadInterstitialCoordinatorFactoryHelper() {} -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/CascadingStripStacker.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/CascadingStripStacker.java index 6cf05e4..032218c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/CascadingStripStacker.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/CascadingStripStacker.java
@@ -100,17 +100,6 @@ } @Override - public float computeNewTabButtonOffset(StripLayoutTab[] indexOrderedTabs, - float tabOverlapWidth, float stripLeftMargin, float stripRightMargin, float stripWidth, - float newTabButtonWidth) { - return LocalizationUtils.isLayoutRtl() - ? computeNewTabButtonOffsetRtl(indexOrderedTabs, tabOverlapWidth, stripLeftMargin, - stripRightMargin, stripWidth, newTabButtonWidth) - : computeNewTabButtonOffsetLtr(indexOrderedTabs, tabOverlapWidth, - stripLeftMargin, stripRightMargin, stripWidth); - } - - @Override public void performOcclusionPass(int selectedIndex, StripLayoutTab[] indexOrderedTabs, float stripWidth) { for (int i = 1; i < indexOrderedTabs.length; i++) { @@ -138,46 +127,4 @@ if (i - 1 == selectedIndex) prevTab.setVisible(true); } } - - private float computeNewTabButtonOffsetLtr(StripLayoutTab[] indexOrderedTabs, - float tabOverlapWidth, float stripLeftMargin, float stripRightMargin, - float stripWidth) { - float rightEdge = stripLeftMargin; - - for (int i = 0; i < indexOrderedTabs.length; i++) { - StripLayoutTab tab = indexOrderedTabs[i]; - float layoutWidth = (tab.getWidth() - tabOverlapWidth) * tab.getWidthWeight(); - rightEdge = Math.max(tab.getDrawX() + layoutWidth, rightEdge); - } - - rightEdge = Math.min(rightEdge + tabOverlapWidth, stripWidth - stripRightMargin); - - // Adjust the right edge by the tab overlap width so that the new tab button is nestled - // closer to the tab. - rightEdge -= tabOverlapWidth / 2; - - // The draw X position for the new tab button is the rightEdge of the tab strip. - return rightEdge; - } - - private float computeNewTabButtonOffsetRtl(StripLayoutTab[] indexOrderedTabs, - float tabOverlapWidth, float stripLeftMargin, float stripRightMargin, float stripWidth, - float newTabButtonWidth) { - float leftEdge = stripWidth - stripRightMargin; - - for (int i = 0; i < indexOrderedTabs.length; i++) { - StripLayoutTab tab = indexOrderedTabs[i]; - leftEdge = Math.min(tab.getDrawX(), leftEdge); - } - - leftEdge = Math.max(leftEdge, stripLeftMargin); - - // Adjust the left edge by the tab overlap width so that the new tab button is nestled - // closer to the tab. - leftEdge += tabOverlapWidth / 2; - - // The draw X position for the new tab button is the left edge of the tab strip minus - // the new tab button width. - return leftEdge - newTabButtonWidth; - } } \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/ScrollingStripStacker.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/ScrollingStripStacker.java index b1deeb3..fd65ebb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/ScrollingStripStacker.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/ScrollingStripStacker.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.compositor.overlays.strip; +import org.chromium.chrome.browser.flags.CachedFeatureFlags; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.ui.base.LocalizationUtils; /** @@ -29,11 +31,14 @@ public float computeNewTabButtonOffset(StripLayoutTab[] indexOrderedTabs, float tabOverlapWidth, float stripLeftMargin, float stripRightMargin, float stripWidth, float newTabButtonWidth) { + if (CachedFeatureFlags.isEnabled(ChromeFeatureList.TAB_STRIP_IMPROVEMENTS)) { + return super.computeNewTabButtonOffset(indexOrderedTabs, tabOverlapWidth, + stripLeftMargin, stripRightMargin, stripWidth, newTabButtonWidth); + } return LocalizationUtils.isLayoutRtl() ? computeNewTabButtonOffsetRtl(indexOrderedTabs, tabOverlapWidth, stripRightMargin, stripWidth, newTabButtonWidth) - : computeNewTabButtonOffsetLtr(indexOrderedTabs, tabOverlapWidth, - stripLeftMargin, stripWidth); + : computeNewTabButtonOffsetLtr(indexOrderedTabs, tabOverlapWidth, stripLeftMargin); } @Override @@ -45,8 +50,8 @@ } } - private float computeNewTabButtonOffsetLtr(StripLayoutTab[] indexOrderedTabs, - float tabOverlapWidth, float stripLeftMargin, float stripWidth) { + private float computeNewTabButtonOffsetLtr( + StripLayoutTab[] indexOrderedTabs, float tabOverlapWidth, float stripLeftMargin) { float rightEdge = stripLeftMargin; int numTabs = indexOrderedTabs.length;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java index 714cc89d..84f84f15 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
@@ -103,7 +103,6 @@ private static final float TAB_WIDTH_MEDIUM = 156.f; private static final float THRESHOLD_MEDIUM = 120.f; private static final float THRESHOLD_SMALL = 96.f; - private static final float THRESHOLD_LAST_TAB = 72.f; // External influences private final LayoutUpdateHost mUpdateHost; @@ -459,10 +458,9 @@ /** * Helper-specific updates. Cascades the values updated by the animations and flings. * @param time The current time of the app in ms. - * @param dt The delta time between update frames in ms. * @return Whether or not animations are done. */ - public boolean updateLayout(long time, long dt) { + public boolean updateLayout(long time) { // 1. Handle any Scroller movements (flings). updateScrollOffset(time); @@ -672,7 +670,8 @@ boolean isLastTab = index == mStripTabs.length - 1; if (LocalizationUtils.isLayoutRtl()) { if (isLastTab) { - tabStartHidden = tab.getDrawX() + mTabOverlapWidth < THRESHOLD_LAST_TAB; + tabStartHidden = tab.getDrawX() + mTabOverlapWidth + < mNewTabButton.getX() + mNewTabButton.getWidth(); } else { tabStartHidden = tab.getDrawX() + mTabOverlapWidth < THRESHOLD_MEDIUM; } @@ -680,8 +679,8 @@ } else { tabStartHidden = tab.getDrawX() + tab.getWidth() < THRESHOLD_SMALL; if (isLastTab) { - tabEndHidden = tab.getDrawX() + tab.getWidth() - mTabOverlapWidth - > mWidth - THRESHOLD_LAST_TAB; + tabEndHidden = + tab.getDrawX() + tab.getWidth() - mTabOverlapWidth > mNewTabButton.getX(); } else { tabEndHidden = tab.getDrawX() + tab.getWidth() - mTabOverlapWidth > mWidth - THRESHOLD_MEDIUM;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java index 6ade280d..d3111674 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
@@ -637,7 +637,7 @@ @Override public boolean updateOverlay(long time, long dt) { getInactiveStripLayoutHelper().finishAnimation(); - return getActiveStripLayoutHelper().updateLayout(time, dt); + return getActiveStripLayoutHelper().updateLayout(time); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripStacker.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripStacker.java index c9e00e33..2cfb451 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripStacker.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripStacker.java
@@ -6,6 +6,7 @@ import org.chromium.base.MathUtils; import org.chromium.chrome.browser.compositor.layouts.Layout; +import org.chromium.ui.base.LocalizationUtils; /** * An interface that defines how to stack tabs and how they should look visually. This lets @@ -76,9 +77,55 @@ * @param mNewTabButtonWidth The width of the new tab button. * @return The x offset for the new tab button. */ - public abstract float computeNewTabButtonOffset(StripLayoutTab[] indexOrderedTabs, + public float computeNewTabButtonOffset(StripLayoutTab[] indexOrderedTabs, float tabOverlapWidth, + float stripLeftMargin, float stripRightMargin, float stripWidth, + float mNewTabButtonWidth) { + return LocalizationUtils.isLayoutRtl() + ? computeNewTabButtonOffsetRtl(indexOrderedTabs, tabOverlapWidth, stripLeftMargin, + stripRightMargin, stripWidth, mNewTabButtonWidth) + : computeNewTabButtonOffsetLtr(indexOrderedTabs, tabOverlapWidth, stripLeftMargin, + stripRightMargin, stripWidth); + } + + private float computeNewTabButtonOffsetLtr(StripLayoutTab[] indexOrderedTabs, + float tabOverlapWidth, float stripLeftMargin, float stripRightMargin, + float stripWidth) { + float rightEdge = stripLeftMargin; + + for (StripLayoutTab tab : indexOrderedTabs) { + float layoutWidth = (tab.getWidth() - tabOverlapWidth) * tab.getWidthWeight(); + rightEdge = Math.max(tab.getDrawX() + layoutWidth, rightEdge); + } + + rightEdge = Math.min(rightEdge + tabOverlapWidth, stripWidth - stripRightMargin); + + // Adjust the right edge by the tab overlap width so that the new tab button is nestled + // closer to the tab. + rightEdge -= tabOverlapWidth / 2; + + // The draw X position for the new tab button is the rightEdge of the tab strip. + return rightEdge; + } + + private float computeNewTabButtonOffsetRtl(StripLayoutTab[] indexOrderedTabs, float tabOverlapWidth, float stripLeftMargin, float stripRightMargin, float stripWidth, - float mNewTabButtonWidth); + float newTabButtonWidth) { + float leftEdge = stripWidth - stripRightMargin; + + for (StripLayoutTab tab : indexOrderedTabs) { + leftEdge = Math.min(tab.getDrawX(), leftEdge); + } + + leftEdge = Math.max(leftEdge, stripLeftMargin); + + // Adjust the left edge by the tab overlap width so that the new tab button is nestled + // closer to the tab. + leftEdge += tabOverlapWidth / 2; + + // The draw X position for the new tab button is the left edge of the tab strip minus + // the new tab button width. + return leftEdge - newTabButtonWidth; + } /** * Performs an occlusion pass, setting the visibility on tabs. This is relegated to this
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java index 1aa94e46..9a531ff 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java
@@ -142,18 +142,27 @@ boolean showRightTabStripFade = !tabStripImprovementsEnabled || !LocalizationUtils.isLayoutRtl(); + int tab_strip_fade_short = + CachedFeatureFlags.isEnabled(ChromeFeatureList.TAB_STRIP_IMPROVEMENTS) + ? R.drawable.tab_strip_fade_short + : R.drawable.tab_strip_fade; + int tab_strip_fade_long = + CachedFeatureFlags.isEnabled(ChromeFeatureList.TAB_STRIP_IMPROVEMENTS) + ? R.drawable.tab_strip_fade_long + : R.drawable.tab_strip_fade_for_model_selector; + if (showLeftTabStripFade) { int leftFadeDrawable = modelSelectorButtonVisible && LocalizationUtils.isLayoutRtl() - ? R.drawable.tab_strip_fade_for_model_selector - : R.drawable.tab_strip_fade; + ? tab_strip_fade_long + : tab_strip_fade_short; TabStripSceneLayerJni.get().updateTabStripLeftFade(mNativePtr, TabStripSceneLayer.this, leftFadeDrawable, layoutHelper.getLeftFadeOpacity(), resourceManager); } if (showRightTabStripFade) { int rightFadeDrawable = modelSelectorButtonVisible && !LocalizationUtils.isLayoutRtl() - ? R.drawable.tab_strip_fade_for_model_selector - : R.drawable.tab_strip_fade; + ? tab_strip_fade_long + : tab_strip_fade_short; TabStripSceneLayerJni.get().updateTabStripRightFade(mNativePtr, TabStripSceneLayer.this, rightFadeDrawable, layoutHelper.getRightFadeOpacity(), resourceManager); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java index a1212c5..9de1281 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
@@ -46,6 +46,7 @@ import org.chromium.chrome.browser.page_info.ChromePageInfo; import org.chromium.chrome.browser.page_info.ChromePageInfoHighlight; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tab.TrustedCdn; import org.chromium.components.page_info.PageInfoController.OpenedFromSource; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.WebContents; @@ -238,7 +239,7 @@ } else if (id == R.id.info_menu_id) { Tab tab = getTabModelSelector().getCurrentTab(); if (tab == null) return false; - String publisher = getToolbarManager().getContentPublisher(); + String publisher = TrustedCdn.getContentPublisher(tab); new ChromePageInfo(getModalDialogManagerSupplier(), publisher, OpenedFromSource.MENU, () -> mRootUiCoordinator.getMerchantTrustSignalsCoordinatorSupplier().get()) .show(tab, ChromePageInfoHighlight.noHighlight());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java index dfc1971..367b063 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
@@ -311,22 +311,6 @@ } @Override - protected String getContentPublisher() { - Tab tab = getToolbarDataProvider().getTab(); - if (tab == null) return null; - - String publisherUrl = TrustedCdn.getPublisherUrl(tab); - if (publisherUrl != null) { - return UrlUtilities.extractPublisherFromPublisherUrl(publisherUrl); - } - - // TODO(bauerb): Remove this once trusted CDN publisher URLs have rolled out completely. - if (mLocationBar.isShowingTitleOnly()) return parsePublisherNameFromUrl(tab.getUrl()); - - return null; - } - - @Override protected void onNavigatedToDifferentPage() { super.onNavigatedToDifferentPage(); mLocationBarModel.notifyTitleChanged(); @@ -779,7 +763,8 @@ if (activity == null) return; if (mCurrentlyShowingBranding) return; // For now we don't show "store info" row for custom tab. - new ChromePageInfo(mModalDialogManagerSupplier, getContentPublisher(), + new ChromePageInfo(mModalDialogManagerSupplier, + TrustedCdn.getContentPublisher(getToolbarDataProvider().getTab()), OpenedFromSource.TOOLBAR, /*storeInfoActionHandlerSupplier=*/null) .show(currentTab, ChromePageInfoHighlight.noHighlight()); });
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/FileAccessPermissionHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/download/FileAccessPermissionHelper.java index d67be1c5..89840077 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/FileAccessPermissionHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/FileAccessPermissionHelper.java
@@ -5,14 +5,15 @@ package org.chromium.chrome.browser.download; import android.Manifest.permission; +import android.content.Context; import android.content.pm.PackageManager; import android.util.Pair; import androidx.annotation.NonNull; -import org.chromium.base.ApplicationStatus; import org.chromium.base.Callback; import org.chromium.components.permissions.AndroidPermissionRequester; +import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.permissions.AndroidPermissionDelegate; import org.chromium.ui.permissions.PermissionCallback; @@ -24,12 +25,12 @@ /** * Requests the storage permission from Java. * - * @param delegate The permission delegate to be used for file access request. + * @param windowAndroid The window to be used for file access request. * @param callback Callback to notify if the permission is granted or not. */ public static void requestFileAccessPermission( - @NonNull AndroidPermissionDelegate delegate, final Callback<Boolean> callback) { - requestFileAccessPermissionHelper(delegate, result -> { + @NonNull WindowAndroid windowAndroid, final Callback<Boolean> callback) { + requestFileAccessPermissionHelper(windowAndroid, result -> { boolean granted = result.first; String permissions = result.second; if (granted || permissions == null) { @@ -44,30 +45,36 @@ }); } - static void requestFileAccessPermissionHelper(@NonNull AndroidPermissionDelegate delegate, - final Callback<Pair<Boolean, String>> callback) { - if (delegate.hasPermission(permission.WRITE_EXTERNAL_STORAGE)) { + static void requestFileAccessPermissionHelper( + @NonNull WindowAndroid windowAndroid, final Callback<Pair<Boolean, String>> callback) { + if (windowAndroid.hasPermission(permission.WRITE_EXTERNAL_STORAGE)) { callback.onResult(Pair.create(true, null)); return; } - if (!delegate.canRequestPermission(permission.WRITE_EXTERNAL_STORAGE)) { + if (!windowAndroid.canRequestPermission(permission.WRITE_EXTERNAL_STORAGE)) { callback.onResult(Pair.create(false, - delegate.isPermissionRevokedByPolicy(permission.WRITE_EXTERNAL_STORAGE) + windowAndroid.isPermissionRevokedByPolicy(permission.WRITE_EXTERNAL_STORAGE) ? null : permission.WRITE_EXTERNAL_STORAGE)); return; } - final AndroidPermissionDelegate permissionDelegate = delegate; + final AndroidPermissionDelegate permissionDelegate = windowAndroid; final PermissionCallback permissionCallback = (permissions, grantResults) -> callback.onResult(Pair.create(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED, null)); - AndroidPermissionRequester.showMissingPermissionDialog( - ApplicationStatus.getLastTrackedFocusedActivity(), - org.chromium.chrome.R.string.missing_storage_permission_download_education_text, + Context context = windowAndroid.getContext().get(); + if (context == null) { + callback.onResult(Pair.create(false, null)); + return; + } + + AndroidPermissionRequester.showMissingPermissionDialog(windowAndroid, + context.getString(org.chromium.chrome.R.string + .missing_storage_permission_download_education_text), () -> permissionDelegate.requestPermissions( new String[] {permission.WRITE_EXTERNAL_STORAGE},
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/new_download_tab/NewDownloadTab.java b/chrome/android/java/src/org/chromium/chrome/browser/download/new_download_tab/NewDownloadTab.java index bb9e858..28bf44d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/new_download_tab/NewDownloadTab.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/new_download_tab/NewDownloadTab.java
@@ -11,8 +11,8 @@ import androidx.annotation.Nullable; import org.chromium.base.UserData; -import org.chromium.chrome.browser.app.download.DownloadInterstitialCoordinatorFactoryHelper; import org.chromium.chrome.browser.download.interstitial.DownloadInterstitialCoordinator; +import org.chromium.chrome.browser.download.interstitial.DownloadInterstitialCoordinatorFactory; import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabViewProvider; @@ -98,7 +98,8 @@ private NewDownloadTab(Tab tab) { mTab = tab; - mCoordinator = DownloadInterstitialCoordinatorFactoryHelper.create(tab); + mCoordinator = DownloadInterstitialCoordinatorFactory.create( + tab.getContext(), tab.getWindowAndroid()); } private boolean isViewAttached() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncConsentFragmentBase.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncConsentFragmentBase.java index 3fa8cc1..9692f32 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncConsentFragmentBase.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncConsentFragmentBase.java
@@ -79,6 +79,10 @@ private static final String SETTINGS_LINK_CLOSE = "</LINK1>"; private static final String ARGUMENT_ACCOUNT_NAME = "SyncConsentFragmentBase.AccountName"; + + // This bundle argument is optional; it is set only if the child status cannot be reliably + // inferred by looking at the last used regular profile, because child sign auto sign in may + // not have completed. private static final String ARGUMENT_CHILD_ACCOUNT_STATUS = "SyncConsentFragmentBase.ChildAccountStatus"; private static final String ARGUMENT_SIGNIN_FLOW_TYPE = @@ -131,6 +135,10 @@ /** * Creates an argument bundle for the default {@link SyncConsentFragment} flow with * {@link ChildAccountStatus}. + * + * This version of the method should be used where we cannot guarantee that child auto-signin + * has completed and therefore the child status is explicitly provided. + * * @param accessPoint The access point for starting sign-in flow. * @param accountName The account to preselect. * @param isChild Whether the selected account is a child one. @@ -198,8 +206,16 @@ Bundle arguments = getArguments(); mSigninAccessPoint = arguments.getInt(ARGUMENT_ACCESS_POINT, SigninAccessPoint.MAX); assert mSigninAccessPoint != SigninAccessPoint.MAX : "Cannot find SigninAccessPoint!"; + + // TODO(crbug.com/1306971): remove usage of Profile.isChild() and the need for a bundle + // argument in the FRE, but moving to a new API for determining device supervision status. mSelectedAccountName = arguments.getString(ARGUMENT_ACCOUNT_NAME, null); - mIsChild = arguments.getBoolean(ARGUMENT_CHILD_ACCOUNT_STATUS, false); + if (arguments.containsKey(ARGUMENT_CHILD_ACCOUNT_STATUS)) { + mIsChild = arguments.getBoolean(ARGUMENT_CHILD_ACCOUNT_STATUS); + } else { + mIsChild = Profile.getLastUsedRegularProfile().isChild(); + } + @SigninFlowType int signinFlowType = arguments.getInt(ARGUMENT_SIGNIN_FLOW_TYPE, SigninFlowType.DEFAULT);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.java index a13091a4..e5ce4194 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.java
@@ -36,8 +36,6 @@ public class TabUtils { private static final String REQUEST_DESKTOP_SCREEN_WIDTH_PARAM = "screen_width_dp"; @VisibleForTesting - static final float TABLET_LANDSCAPE_TAB_THUMBNAIL_ASPECT_RATIO = 1.33f; - @VisibleForTesting static final float TAB_THUMBNAIL_ASPECT_RATIO = 0.85f; // Do not instantiate this class. private TabUtils() {} @@ -172,7 +170,8 @@ if (context != null && DeviceFormFactor.isNonMultiDisplayContextOnTablet(context) && context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { - return TABLET_LANDSCAPE_TAB_THUMBNAIL_ASPECT_RATIO; + return (context.getResources().getConfiguration().screenWidthDp * 1f) + / (context.getResources().getConfiguration().screenHeightDp * 1f); } return TAB_THUMBNAIL_ASPECT_RATIO;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java index 735714d8..ca17b2c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -1740,13 +1740,6 @@ } /** - * @see TopToolbarCoordinator#getContentPublisher() - */ - public String getContentPublisher() { - return mToolbar.getContentPublisher(); - } - - /** * Focuses or unfocuses the URL bar. * * If you request focus and the UrlBar was already focused, this will select all of the text.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java index 1dbc508..e51f637 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
@@ -439,7 +439,7 @@ public void onAttachFragment(Fragment fragment) { if (fragment instanceof QrCodeDialog) { QrCodeDialog qrCodeDialog = (QrCodeDialog) fragment; - qrCodeDialog.setAndroidPermissionDelegate(mWindowAndroid); + qrCodeDialog.setWindowAndroid(mWindowAndroid); } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/RuntimePermissionTestUtils.java b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/RuntimePermissionTestUtils.java index 84080053..326de4e1 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/RuntimePermissionTestUtils.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/RuntimePermissionTestUtils.java
@@ -14,6 +14,7 @@ import org.hamcrest.Matchers; import org.junit.Assert; +import org.chromium.base.BuildInfo; import org.chromium.base.test.util.Criteria; import org.chromium.base.test.util.CriteriaHelper; import org.chromium.chrome.browser.app.ChromeActivity; @@ -188,8 +189,9 @@ final View dialogText = manager.getCurrentDialogForTest() .get(ModalDialogProperties.CUSTOM_VIEW) .findViewById(R.id.text); + String appName = BuildInfo.getInstance().hostPackageLabel; Assert.assertEquals(((TextView) dialogText).getText(), - activity.getResources().getString(missingPermissionPromptTextId)); + activity.getResources().getString(missingPermissionPromptTextId, appName)); TestThreadUtils.runOnUiThreadBlocking(() -> { manager.getCurrentPresenterForTest().dismissCurrentDialog(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SyncConsentFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SyncConsentFragmentTest.java index dea5681f..950bb57 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SyncConsentFragmentTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SyncConsentFragmentTest.java
@@ -226,6 +226,26 @@ @Test @LargeTest @Feature("RenderTest") + // This test is only relevant if child users do not have sync force-enabled (if they do, then + // they can only ever access this fragment from the FRE). + @EnableFeatures({ChromeFeatureList.ALLOW_SYNC_OFF_FOR_CHILD_ACCOUNTS}) + public void testSyncConsentScreenWithChildAccount() throws IOException { + CoreAccountInfo accountInfo = + mAccountManagerTestRule.addChildTestAccountThenWaitForSignin(); + mAccountManagerTestRule.addAccount(AccountManagerTestRule.TEST_ACCOUNT_EMAIL); + mSyncConsentActivity = ActivityTestUtils.waitForActivity( + InstrumentationRegistry.getInstrumentation(), SyncConsentActivity.class, () -> { + SyncConsentActivityLauncherImpl.get().launchActivityForPromoDefaultFlow( + mChromeActivityTestRule.getActivity(), + SigninAccessPoint.BOOKMARK_MANAGER, accountInfo.getEmail()); + }); + mRenderTestRule.render(mSyncConsentActivity.findViewById(R.id.fragment_container), + "sync_consent_fragment_child_account"); + } + + @Test + @LargeTest + @Feature("RenderTest") public void testSigninFREFragmentWithNoAccountsOnDevice() throws IOException { HistogramDelta startPageHistogram = new HistogramDelta("Signin.SigninStartedAccessPoint", SigninAccessPoint.START_PAGE); @@ -263,7 +283,7 @@ @Test @LargeTest @Feature("RenderTest") - public void testFragmentWithChildAccount() throws IOException { + public void testFRESyncConsentScreenWithChildAccount() throws IOException { HistogramDelta startPageHistogram = new HistogramDelta("Signin.SigninStartedAccessPoint", SigninAccessPoint.START_PAGE); mAccountManagerTestRule.addAccount(AccountManagerTestRule.TEST_ACCOUNT_EMAIL); @@ -286,7 +306,7 @@ @LargeTest @Feature("RenderTest") @EnableFeatures({ChromeFeatureList.ALLOW_SYNC_OFF_FOR_CHILD_ACCOUNTS}) - public void testFragmentWithChildAccountAllowSyncOff() throws IOException { + public void testFRESyncConsentScreenWithChildAccountAllowSyncOff() throws IOException { HistogramDelta startPageHistogram = new HistogramDelta("Signin.SigninStartedAccessPoint", SigninAccessPoint.START_PAGE); mAccountManagerTestRule.addAccount(AccountManagerTestRule.TEST_ACCOUNT_EMAIL); @@ -309,7 +329,7 @@ @LargeTest @Feature("RenderTest") @CommandLineFlags.Remove({ChromeSwitches.FORCE_ENABLE_SIGNIN_FRE}) - public void testFragmentWithChildAccountLegacy() throws IOException { + public void testFRESyncConsentScreenWithChildAccountLegacy() throws IOException { HistogramDelta startPageHistogram = new HistogramDelta("Signin.SigninStartedAccessPoint", SigninAccessPoint.START_PAGE); mAccountManagerTestRule.addAccount(AccountManagerTestRule.TEST_ACCOUNT_EMAIL);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SiteSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SiteSettingsTest.java index 5dc2568..48d70d5 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SiteSettingsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SiteSettingsTest.java
@@ -36,7 +36,6 @@ import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; -import org.chromium.base.test.util.FlakyTest; import org.chromium.chrome.browser.browsing_data.BrowsingDataBridge; import org.chromium.chrome.browser.browsing_data.BrowsingDataType; import org.chromium.chrome.browser.browsing_data.TimePeriod; @@ -525,7 +524,6 @@ @Test @SmallTest @Feature({"Preferences"}) - @FlakyTest(message = "https://crbug.com/1112409") public void testClearDomainCookies() throws Exception { final String url = mPermissionRule.getURLWithHostName( "test.example.com", "/chrome/test/data/android/cookie.html");
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java index 4392dbe..3ed5f4d 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java
@@ -220,6 +220,7 @@ StripLayoutTab[] tabs = getMockedStripLayoutTabs(TAB_WIDTH_2); // Set mWidth value to 800.f mStripLayoutHelper.onSizeChanged(SCREEN_WIDTH, SCREEN_HEIGHT); + mStripLayoutHelper.getNewTabButton().setX(600.f); // The leftmost tab is partially hidden when(tabs[0].getDrawX()).thenReturn(-80.f); mStripLayoutHelper.setStripLayoutTabsForTest(tabs);
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp index 0c53452..7a66254 100644 --- a/chrome/app/chromeos_strings.grdp +++ b/chrome/app/chromeos_strings.grdp
@@ -4212,7 +4212,7 @@ Lock-on-leave </message> <message name="IDS_SMART_PRIVACY_PROTECTION_SCREEN_LOCK_DESCRIPTION" desc="Description of the lock-on-leave feature."> - If you move away from your device, your screen will lock automatically. When you're in front of your device, your screen will stay awake. + If you move away from your device, your screen will lock automatically. When you're in front of your device, your screen will stay awake longer. If lock screen is disabled, your device will sleep instead of lock. </message> <message name="IDS_SMART_PRIVACY_PROTECTION_SNOOPING_DETECTION" desc="Title of the viewing protection section."> Viewing protection
diff --git a/chrome/app/chromeos_strings_grdp/IDS_SMART_PRIVACY_PROTECTION_SCREEN_LOCK_DESCRIPTION.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_SMART_PRIVACY_PROTECTION_SCREEN_LOCK_DESCRIPTION.png.sha1 index c54db0a3..47e45b7 100644 --- a/chrome/app/chromeos_strings_grdp/IDS_SMART_PRIVACY_PROTECTION_SCREEN_LOCK_DESCRIPTION.png.sha1 +++ b/chrome/app/chromeos_strings_grdp/IDS_SMART_PRIVACY_PROTECTION_SCREEN_LOCK_DESCRIPTION.png.sha1
@@ -1 +1 @@ -0efca7134f43aee14a23d3ce32e3911a96772c7b \ No newline at end of file +347637afca9914ee8a71d2588578268a36f096fe \ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 7119066391..42f3041 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -6543,7 +6543,7 @@ Reader Mode </message> - <!--Tooltip strings--> + <!--Tooltip strings --> <message name="IDS_TOOLTIP_BACK" desc="The tooltip for back button"> Click to go back, hold to see history </message> @@ -12511,7 +12511,7 @@ <message name="IDS_SIDE_PANEL_EXPERIMENT_DESCRIPTION" desc="Description for Side Panel experiment"> Enables a browser-level side panel for a useful and persistent way to access your Reading List and Bookmarks. </message> - <!-- ChromeLabs Tab Scrolling--> + <!-- ChromeLabs Tab Scrolling --> <message name="IDS_TAB_SCROLLING_EXPERIMENT_NAME" desc="Name for Tab Scrolling experiment"> Tab Scrolling </message> @@ -12537,7 +12537,7 @@ <message name="IDS_TAB_SEARCH_EXPERIMENT_DESCRIPTION" desc="Description for Tab Search experiment"> Enable a popup bubble in Top Chrome UI to search over currently open tabs. </message> - <!-- ChromeLabs Lens Region Search--> + <!-- ChromeLabs Lens Region Search --> <message name="IDS_LENS_REGION_SEARCH_EXPERIMENT_NAME" desc="Name for Lens Region Search experiment"> Search your screen with Google Lens </message>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 7b425e1..8d1fb155 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -3198,6 +3198,10 @@ <translation id="4110490973560452005">اكتمل التنزيل: <ph name="FILE_NAME" />. يمكنك الضغط على Shift+F6 للانتقال إلى منطقة شريط عمليات التنزيل.</translation> <translation id="4110686435123617899">اختيار ألبوم <ph name="TITLE" /> <ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (غير متصل بالإنترنت)</translation> +<translation id="4114524937989710624">تظهر لك ملفات مُقترحة لمساعدتك في الرجوع بسهولة إلى آخر نشاط أجريته في Google Drive. + <ph name="BREAK" /> + <ph name="BREAK" /> + يمكنك إدارة الإعدادات من قائمة البطاقات أو الاطّلاع على المزيد من الخيارات في قسم "تخصيص Chrome".</translation> <translation id="4115002065223188701">الشبكة خارج النطاق</translation> <translation id="4115378294792113321">أرجواني</translation> <translation id="4116704186509653070">فتح مرة أخرى</translation> @@ -3705,6 +3709,10 @@ <translation id="4651484272688821107">تعذَّر تحميل المكوِّن على الإنترنت باستخدام موارد الوضع التجريبي.</translation> <translation id="4652935475563630866">يتطلب تغيير إعدادات الكاميرا إعادة تشغيل نظام Parallels Desktop. أعِد تشغيل نظام Parallels Desktop للمتابعة.</translation> <translation id="4653405415038586100">حدث خطأ أثناء إعداد نظام التشغيل Linux.</translation> +<translation id="465406513924180949">تظهر لك سلّات تسوّق لمساعدتك في الرجوع بسهولة إلى السلع التي أضفتها إلى سلّات التسوّق على الويب. + <ph name="BREAK" /> + <ph name="BREAK" /> + يمكنك إدارة الإعدادات من قائمة البطاقات أو الاطّلاع على المزيد من الخيارات في قسم "تخصيص Chrome".</translation> <translation id="4654236001025007561">مشاركة الملفات مع أجهزة Chromebook وأجهزة تعمل بنظام التشغيل Android من حولك</translation> <translation id="4657914796247705218">سرعة TrackPoint</translation> <translation id="4658285806588491142">الحفاظ على خصوصية محتوى الشاشة</translation> @@ -4147,6 +4155,7 @@ <translation id="5121130586824819730">القرص الصلب ممتلئ. يُرجى الحفظ في مكان آخر أو توفير مساحة أكبر على القرص الصلب.</translation> <translation id="5123433949759960244">كرة السلة</translation> <translation id="5125751979347152379">عنوان URL غير صالح.</translation> +<translation id="5125967981703109366">معلومات عن هذه البطاقة</translation> <translation id="5126611267288187364">عرض التغييرات</translation> <translation id="5127242257756472928">المواقع الإلكترونية غير المسموح لها باستخدام المعلومات المتعلقة بشاشاتك لفتح النوافذ ووضعها عليها</translation> <translation id="5127620150973591153">رمز إتمام الاتصال الآمن: <ph name="TOKEN" /></translation> @@ -5133,6 +5142,10 @@ <translation id="6116921718742659598">تغيير إعدادات اللغة والإدخال</translation> <translation id="6119927814891883061">تسمية الجهاز باسم <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">جارٍ إضافة هذه الصفحة إلى شاشة البدء...</translation> +<translation id="6120707837086723438">تظهر لك وصفات طعام مُقترحة استنادًا إلى آخر عمليات بحث أجريتها في "بحث Google" عن وصفات الطعام. + <ph name="BREAK" /> + <ph name="BREAK" /> + يمكنك إدارة الإعدادات من قائمة البطاقات أو الاطّلاع على المزيد من الخيارات في قسم "تخصيص Chrome".</translation> <translation id="6121773125605585883">عرض كلمة المرور مع اسم المستخدم <ph name="USERNAME" /> للموقع الإلكتروني <ph name="WEBSITE" /></translation> <translation id="6122081475643980456">يتم التحكم في اتصال الإنترنت التابع لك</translation> <translation id="6122093587541546701">البريد الإلكتروني (اختياري):</translation> @@ -6740,6 +6753,10 @@ <translation id="7744192722284567281">تم العثور عليها في عملية اختراق البيانات.</translation> <translation id="7744649840067671761">اضغط على مفتاح تحكّم جديد أو مفتاح معيّن على لوحة المفاتيح لبدء التخصيص. ولإزالة مفتاح تحكّم أو مفتاح على لوحة المفاتيح مخصّص حاليًا، اضغط عليه.</translation> +<translation id="7746739418892731373">تظهر لك أهمّ الصور والفيديوهات من مكتبة "صور Google". يمكنك التحكّم في المحتوى الذي يتم عرضه في الفيديوهات والصور المميّزة من خلال الانتقال إلى <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" />. + <ph name="BREAK" /> + <ph name="BREAK" /> + يمكنك إدارة إعدادات هذه البطاقة من قائمة البطاقات أو الاطّلاع على المزيد من الخيارات في قسم "تخصيص Chrome".</translation> <translation id="7750228210027921155">نافذة ضمن النافذة</translation> <translation id="7751260505918304024">عرض الكل</translation> <translation id="7753735457098489144">تعذَّر التثبيت لعدم توفُّر مساحة تخزين. لتوفير مساحة، يمكنك حذف الملفات من مساحة تخزين الجهاز.</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index db16035..3ef11da 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -1368,6 +1368,7 @@ <ph name="FOOTER_MESSAGE" /></translation> <translation id="2307630946657910723">Səhifənin bir hissəsini <ph name="VISUAL_SEARCH_PROVIDER" /> ilə axtarın</translation> <translation id="2309620859903500144">Bu saytın hərəkət və zəif sensorlarınıza girişi blok edilib.</translation> +<translation id="2311721625890389967">↓</translation> <translation id="2312219318583366810">Səhifə keçidi</translation> <translation id="2314165183524574721">Cari görünmə ayarı gizli olaraq ayarlanıb</translation> <translation id="2314774579020744484">Səhifələrin tərcüməsində istifadə edilən dil</translation> @@ -1961,6 +1962,7 @@ <translation id="288734198558082692"><ph name="DEVICE" /> və digər <ph name="NUMBER_OF_DEVICES" /> cihaz</translation> <translation id="2889064240420137087">Linki bununla açın:</translation> <translation id="2891922230654533301"><ph name="APP_NAME" /> tətbiqinə daxil olmaq üçün cihazınız istifadə edilsin?</translation> +<translation id="2893013536106749396">Sizin üçün vacib olanlar haqqında sizi xəbərdar edən kartları seçin</translation> <translation id="2893168226686371498">Defolt brauzer</translation> <translation id="2893180576842394309">Axtarış və digər Google xidmətlərini fərdiləşdirmək üçün Google tarixçədən istifadə edə bilər</translation> <translation id="2894757982205307093">Qrupa yeni tab</translation> @@ -2074,6 +2076,7 @@ <translation id="3003623123441819449">CSS Keşi</translation> <translation id="3003828226041301643">Cihaz domenə qoşulmadı. Cihaz əlavə etmək imtiyazınızın olduğunu yoxlamaq üçün hesabınızı yoxlayın.</translation> <translation id="3003967365858406397"><ph name="PHONE_NAME" /> şəxsi Wi-Fi bağlantısı yaradacaq.</translation> +<translation id="3005574332301273731">Göstərməyin</translation> <translation id="3006881078666935414">Data istifadəsi yoxdur</translation> <translation id="3007771295016901659">Tabın dublikatını çıxarın</translation> <translation id="3008232374986381779"><ph name="DEVICE_TYPE" /> cihazınızda Linux alətləri, redaktorları və IDE-ləri işə salın. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> @@ -4291,6 +4294,7 @@ <translation id="5265797726250773323">Quraşdıran zaman xəta baş verdi</translation> <translation id="5266113311903163739">Certification Authority Import Error</translation> <translation id="526622169288322445"><ph name="ADDRESS_SUMMARY" /> üçün digər əməliyyatlar</translation> +<translation id="5268373933383932086">Səhifənizi istədiyiniz kimi ayarlayın</translation> <translation id="5269977353971873915">Çap alınmadı</translation> <translation id="5273806377963980154">Sayt keçidini redaktə edin</translation> <translation id="5275352920323889391">İt</translation> @@ -5101,6 +5105,7 @@ <translation id="6080689532560039067">Sistem vaxtınızı yoxlayın</translation> <translation id="6082877069782862752">Açarların əks olunması</translation> <translation id="608531959444400877"><ph name="WINDOW_TITLE" /> - Adsız qrupun hissəsi</translation> +<translation id="6085457109149794212">Chrome'u Fərdiləşdirin bölməsində bütün kart seçimlərini görə bilərsiniz</translation> <translation id="6085886413119427067">Güvənli bağlantı vasitəsilə vebsaytlara necə qoşulmağı müəyyən edir</translation> <translation id="6086004606538989567">Doğruladığınız hesabın bu cihaza giriş icazəsi yoxdur.</translation> <translation id="6086846494333236931">Administratorunuz tərəfindən quraşdırılıb</translation> @@ -5555,6 +5560,7 @@ <translation id="6537880577641744343">Komandan</translation> <translation id="6538098297809675636">Kodu aşkarlayarkən xəta oldu</translation> <translation id="653920215766444089">Göstərici cihaz axtarılır</translation> +<translation id="653983593749614101">Davam etdirilir...</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Qeyd:<ph name="END_BOLD" /> Yalnız nə etdiyinizi bildiyiniz halda aktivləşdirin.</translation> <translation id="6540672086173674880">Google Axtarış və digər Google xidmətlərində axtarış tarixçəsini istifadə edə bilər. Bunu istənilən zaman myaccount.google.com/activitycontrols/search ünvanında dəyişə bilərsiniz</translation> <translation id="6541638731489116978">Bu saytın hərəkət sensorlarınıza girişini blok edilib.</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index 1014c1cc..c97fc1f 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -1331,6 +1331,7 @@ <translation id="2278562042389100163">Адкрыць акно браўзера</translation> <translation id="2278668501808246459">Запускаецца менеджар кантэйнераў</translation> <translation id="2280486287150724112">Правае поле</translation> +<translation id="2281863813036651454">Націсканне левай клавішай мышы</translation> <translation id="2282146716419988068">Працэс GPU</translation> <translation id="2285109769884538519">{COUNT,plural, =0{Адкрыць усе ў новай групе ўкладак}=1{Адкрыць у новай групе ўкладак}one{Адкрыць усе ({COUNT}) у новай групе ўкладак}few{Адкрыць усе ({COUNT}) у новай групе ўкладак}many{Адкрыць усе ({COUNT}) у новай групе ўкладак}other{Адкрыць усе ({COUNT}) у новай групе ўкладак}}</translation> <translation id="2285942871162473373">Не ўдалося распазнаць адбітак пальца. Паўтарыце спробу.</translation> @@ -5144,6 +5145,7 @@ <translation id="6129938384427316298">Netscape Certificate Comment</translation> <translation id="6129953537138746214">Прабел</translation> <translation id="6130692320435119637">Дадаць сетку Wi-Fi</translation> +<translation id="6130887916931372608">Клавіша клавіятуры</translation> <translation id="6136114942382973861">Закрыць панэль спамповак</translation> <translation id="6136287496450963112">Ключ бяспекі не абаронены PIN-кодам. Каб кіраваць адбіткамі пальцаў, спачатку стварыце PIN-код.</translation> <translation id="6138680304137685902">Подпіс X9.62 ECDSA з SHA-384</translation> @@ -6756,6 +6758,7 @@ <translation id="7768770796815395237">Змяніць</translation> <translation id="7768784765476638775">Чытаць уголас</translation> <translation id="7770406201819593386">Запуск дыягнастычных праверак Chrome OS Flex.</translation> +<translation id="7770450735129978837">Націсканне правай клавішай мышы</translation> <translation id="7770612696274572992">Відарыс скапіраваны з іншай прылады</translation> <translation id="7771452384635174008">Раскладка</translation> <translation id="7772032839648071052">Пацвердзіце фразу-пароль</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index d325776..d3a01b1 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -1276,6 +1276,7 @@ <translation id="2218019600945559112">মাউস ও টাচপ্যাড</translation> <translation id="2218320521449013367">ক্ষতিকর সফ্টওয়্যার সরিয়ে দেওয়ার সময় Chrome এ কোনও সমস্যা হয়েছে</translation> <translation id="2218515861914035131">সাধারণ টেক্সট হিসেবে আটকে দিন</translation> +<translation id="2219658597883514593">আবার টিউটোরিয়াল শুরু করুন</translation> <translation id="2220409419896228519">আপনার পছন্দের Google অ্যাপে বুকমার্ক যোগ করুন</translation> <translation id="2220529011494928058">কোনো সমস্যার অভিযোগ করুন</translation> <translation id="2220572644011485463">PIN বা পাসওয়ার্ড</translation> @@ -1344,6 +1345,7 @@ <translation id="2278562042389100163">ব্রাউজার উইন্ডো খুলুন</translation> <translation id="2278668501808246459">কন্টেনার ম্যানেজার শুরু করা হচ্ছে</translation> <translation id="2280486287150724112">ডান মার্জিন</translation> +<translation id="2281863813036651454">বাঁদিকের মাউস ক্লিক করার বোতাম</translation> <translation id="2282146716419988068">GPU প্রক্রিয়া</translation> <translation id="2285109769884538519">{COUNT,plural, =0{সবকটি ইউআরএল নতুন ট্যাব গ্রুপে খুলুন}=1{নতুন ট্যাব গ্রুপে খুলুন}one{({COUNT})টির সবকটি ইউআরএল নতুন ট্যাব গ্রুপে খুলুন}other{({COUNT})টির সবকটি ইউআরএল নতুন ট্যাব গ্রুপে খুলুন}}</translation> <translation id="2285942871162473373">ফিঙ্গারপ্রিন্ট মেলেনি। আবার চেষ্টা করুন।</translation> @@ -2421,6 +2423,7 @@ <translation id="3378627645871606983">Steam-এর জন্য অনুমোদিত অনুমতিগুলি সমস্ত Steam গেম এবং অ্যাপগুলিতে প্রযোজ্য৷</translation> <translation id="337920581046691015"><ph name="PRODUCT_NAME" /> ইনস্টল করা হবে৷</translation> <translation id="3380365263193509176">অজানা ত্রুটি</translation> +<translation id="3380850890226973980">পরের বার মনে করিও</translation> <translation id="3382073616108123819">ওহো! সিস্টেমটি এই ডিভাইসের জন্য ডিভাইস শনাক্তকারী নির্ধারণ করতে ব্যর্থ হয়েছে৷</translation> <translation id="3382200254148930874">তত্ত্বাবধান থামানো হচ্ছে...</translation> <translation id="338323348408199233">ভিপিএন ছাড়া ট্রাফিক ব্লক করুন</translation> @@ -3208,6 +3211,11 @@ <translation id="4110490973560452005">ডাউনলোড হয়ে গেছে: <ph name="FILE_NAME" />। Shift+F6 প্রেস করে ডাউনলোড বার এরিয়াতে যান।</translation> <translation id="4110686435123617899"><ph name="TITLE" /> <ph name="DESC" /> অ্যালবাম বেছে নিন</translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (অফলাইন)</translation> +<translation id="4114524937989710624">Google Drive-এ আপনার সাম্প্রতিক অ্যাক্টিভিটিতে সহজে ফিরে যেতে সাহায্য করার জন্য সাজেস্ট করা ফাইলগুলি দেখছেন। + <ph name="BREAK" /> + <ph name="BREAK" /> + +আপনি কার্ড মেনু থেকে সেটিংস ম্যানেজ করতে পারেন বা কাস্টমাইজ Chrome-এ আরও বিকল্প দেখতে পারেন।</translation> <translation id="4115002065223188701">নেটওয়ার্ক সীমার বাইরে</translation> <translation id="4115378294792113321">ম্যাজেন্টা</translation> <translation id="4116704186509653070">আবার খুলুন</translation> @@ -3716,6 +3724,11 @@ <translation id="4651484272688821107">ডেমো মোড রিসোর্স সহ অনলাইন কম্পোনেন্ট লোড করা যায়নি।</translation> <translation id="4652935475563630866">ক্যামেরা সেটিংয়ে পরিবর্তন করতে হলে, Parallels Desktop আবার লঞ্চ করতে হবে। আগে কাজ চালিয়ে যাওয়ার জন্য, Parallels Desktop আবার লঞ্চ করুন।</translation> <translation id="4653405415038586100">Linux কনফিগার করার সময় কোনও সমস্যা হয়েছে</translation> +<translation id="465406513924180949">আপনি কার্টগুলি দেখছেন যা আপনাকে ওয়েব জুড়ে শপিং কার্টে রেখে যাওয়া আইটেমগুলি সহজে ফিরে পেতে সহায়তা করে। + <ph name="BREAK" /> + <ph name="BREAK" /> + +আপনি কার্ড মেনু থেকে সেটিংস ম্যানেজ করতে পারেন বা কাস্টমাইজ Chrome-এ আরও বিকল্প দেখতে পারেন।</translation> <translation id="4654236001025007561">আপনার আশেপাশের Chromebooks ও Android ডিভাইসের সাথে ফাইল শেয়ার করুন</translation> <translation id="4657914796247705218">TrackPoint-এর স্পিড</translation> <translation id="4658285806588491142">আপনার স্ক্রিনটি ব্যক্তিগত রাখুন</translation> @@ -4158,6 +4171,7 @@ <translation id="5121130586824819730">আপনার হার্ড ডিস্ক পূর্ণ৷ দয়া করে অন্য কোনো স্থানে সেভ করুন অথবা হার্ড ডিস্কে আরও জায়গা তৈরী করুন৷</translation> <translation id="5123433949759960244">বাস্কেটবল</translation> <translation id="5125751979347152379">ভুল ইউআরএল৷</translation> +<translation id="5125967981703109366">এই কার্ড সম্পর্কে</translation> <translation id="5126611267288187364">পরিবর্তনগুলি দেখুন</translation> <translation id="5127242257756472928">উইন্ডো খুলে রাখার জন্য আপনার স্ক্রিনের বিষয়ে তথ্য ব্যবহার করার অনুমতি নেই</translation> <translation id="5127620150973591153">নিরাপদ কানেকশন আইডি: <ph name="TOKEN" /></translation> @@ -4219,6 +4233,7 @@ <translation id="5185500136143151980">ইন্টারনেট কানেকশন নেই</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">আপনার প্রিয় স্মৃতিগুলি রোমন্থন করুন। অ্যালবাম যোগ ও এডিট করতে, <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />-এ যান।</translation> +<translation id="5190316321948122159">{NUM_APPS,plural, =1{এখনই অ্যাপ মুছে ফেলুন}one{এখনই অ্যাপ মুছে ফেলুন}other{এখনই অ্যাপ মুছে ফেলুন}}</translation> <translation id="5190926251776387065">পোর্ট চালু করুন</translation> <translation id="5191094172448199359">আপনার লেখা পিন মিলছে না</translation> <translation id="5191251636205085390">থার্ড-পার্টি কুকি সরানোর নতুন প্রযুক্তি ও তা নিয়ন্ত্রণ সংক্রান্ত তথ্যগুলি জানুন</translation> @@ -4391,6 +4406,7 @@ <translation id="5342091991439452114">পিন অবশ্যই কমপক্ষে <ph name="MINIMUM" /> সংখ্যার হতে হবে</translation> <translation id="5344036115151554031">Linux-কে ফিরিয়ে আনা হচ্ছে</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (ডানদিক)</translation> +<translation id="534572711507965074">আপনার গ্রুপের নাম দিন, রঙ বেছে নিন এবং Enter ট্যাপ করুন</translation> <translation id="5345916423802287046">সাইন-ইন করলেই অ্যাপ চালু হয়ে যাবে</translation> <translation id="5350293332385664455">Google Assistant অ্যাপ বন্ধ করুন</translation> <translation id="535123479159372765">অন্য ডিভাইস থেকে টেক্সট কপি করা হয়েছে</translation> @@ -4972,6 +4988,7 @@ <translation id="5946591249682680882">আইডি অভিযোগ করুন <ph name="WEBRTC_LOG_REPORT_ID" /></translation> <translation id="5948536763493709626">একটি কীবোর্ড বা মাউস কানেক্ট করুন বা আপনার টাচস্ক্রিন ব্যবহার করে সেটআপ করা চালিয়ে যান। আপনি যদি ব্লুটুথ ডিভাইস ব্যবহার করেন, তাহলে আপনার ডিভাইস পেয়ার করার জন্য তৈরি কিনা ভাল করে দেখে নিন।</translation> <translation id="5949544233750246342">ফাইল বিশ্লেষণ করতে বন্ধ</translation> +<translation id="5950039854561387265">পরের বার মনে করিও</translation> <translation id="5950819593680344519">Chrome আপনার কম্পিউটারে কোনও ক্ষতিকারক সফ্টওয়্যার খুঁজে পায়নি • গতকাল চেক করা হয়েছে</translation> <translation id="5951303645598168883"><ph name="ORIGIN" /> লোকাল ফন্ট ব্যবহার করতে চায়</translation> <translation id="5951624318208955736">মনিটর</translation> @@ -5142,6 +5159,11 @@ <translation id="6116921718742659598">ভাষা এবং ইনপুট সেটিংস পরিবর্তন করুন</translation> <translation id="6119927814891883061">ডিভাইসের নাম <ph name="DEVICE_NAME" /> দিন</translation> <translation id="6120205520491252677">স্টার্ট স্ক্রীনে এই পৃষ্ঠাটিকে পিন করুন...</translation> +<translation id="6120707837086723438">আপনি রেসিপিগুলির জন্য আপনার সাম্প্রতিক সার্চ অ্যাক্টিভিটির উপর ভিত্তি করে সাজেস্ট করা রেসিপিগুলি দেখছেন। + <ph name="BREAK" /> + <ph name="BREAK" /> + +আপনি কার্ড মেনু থেকে সেটিংস ম্যানেজ করতে পারেন বা কাস্টমাইজ Chrome-এ আরও বিকল্প দেখতে পারেন।</translation> <translation id="6121773125605585883"><ph name="WEBSITE" />-এ <ph name="USERNAME" /> ইউজারনেমের পাসওয়ার্ড দেখুন</translation> <translation id="6122081475643980456">আপনার ইন্টারনেট সংযোগ নিয়ন্ত্রিত হচ্ছে</translation> <translation id="6122093587541546701">ইমেল (ঐচ্ছিক):</translation> @@ -5158,6 +5180,7 @@ <translation id="6129938384427316298">Netscape সার্টিফিকেট মন্তব্য</translation> <translation id="6129953537138746214">ব্যবধান</translation> <translation id="6130692320435119637">ওয়াই-ফাই নেটওয়ার্কে কানেক্ট করুন</translation> +<translation id="6130887916931372608">কীবোর্ড কী</translation> <translation id="6136114942382973861">ডাউনলোড বার বন্ধ করুন</translation> <translation id="6136287496450963112">আপনার নিরাপত্তা কী কোনও পিন দ্বারা সুরক্ষিত নেই। আঙ্গুলের ছাপ ম্যানেজ করতে, প্রথমে পিন তৈরি করুন।</translation> <translation id="6138680304137685902">SHA-384 সহ X9.62 ECDSA স্বাক্ষর</translation> @@ -5233,6 +5256,7 @@ <translation id="6218058416316985984"><ph name="DEVICE_TYPE" /> অফলাইন আছে৷ ইন্টারনেটে কানেক্ট করে আবার চেষ্টা করুন৷</translation> <translation id="6220413761270491930">এক্সটেনশন লোড হওয়ার সময় সমস্যা</translation> <translation id="6223447490656896591">কাস্টম ছবি:</translation> +<translation id="62236885217374510">{NUM_APPS,plural, =1{এখনই অ্যাপ মুছে ফেলুন}one{এখনই অ্যাপ মুছে ফেলুন}other{এখনই অ্যাপ মুছে ফেলুন}}</translation> <translation id="6224481128663248237">বিন্যাসন সফলভাবে সম্পূর্ণ</translation> <translation id="622537739776246443">প্রোফাইল মুছে ফেলা হবে</translation> <translation id="6225475702458870625">আপনার <ph name="PHONE_NAME" /> থেকে ডেটা সংযোগ পাওয়া যাচ্ছে</translation> @@ -5865,6 +5889,7 @@ <translation id="6846178040388691741">"<ph name="EXTENSION_NAME" />", <ph name="PRINTER_NAME" /> নামের প্রিন্টারের মাধ্যমে <ph name="FILE_NAME" /> প্রিন্ট করতে চাইছে।</translation> <translation id="6847125920277401289">চালিয়ে যেতে জায়গা খালি করুন</translation> <translation id="6848388270925200958">এই মুহূর্তে, আপনার কাছে কিছু কার্ড রয়েছে যা শুধুমাত্র এই ডিভাইসে ব্যবহার করা যেতে পারে</translation> +<translation id="6848425544473873717">{NUM_APPS,plural, =1{আপনার ১টি অ্যাপ আর কাজ করবে না। <ph name="LEARN_MORE" />}one{আপনার #টি অ্যাপ আর কাজ করবে না। <ph name="LEARN_MORE" />}other{আপনার #টি অ্যাপ আর কাজ করবে না। <ph name="LEARN_MORE" />}}</translation> <translation id="6848716236260083778">আঙ্গুলের ছাপ সেট আপ করতে, আপনার সন্তানকে আঙ্গুলের ছাপের সেন্সর টাচ করতে বলুন। আপনার সন্তানের আঙ্গুলের ছাপ সম্পর্কিত ডেটা নিরাপদে সেভ করা হয় এবং সবসময় <ph name="DEVICE_TYPE" />-এ থাকে।</translation> <translation id="6850286078059909152">টেক্সটের রঙ</translation> <translation id="6851181413209322061">ব্যবহার এবং ডায়াগনস্টিক বিষয়ক ডেটা পাঠান। বর্তমানে এই ডিভাইসটি অটোমেটিক Google-কে ডায়াগনস্টিক, ডিভাইস এবং অ্যাপ ব্যবহারের ডেটা পাঠাচ্ছে। এটি আপনার সন্তানকে শনাক্ত করতে ব্যবহার করা হবে না এবং সিস্টেম ও অ্যাপের স্টেবিলিটি বাড়াতে ও অন্যান্য উন্নতিতে সাহায্য করবে। কিছু একত্রিত করা ডেটা Android ডেভেলপারের মতো Google অ্যাপ এবং পার্টনারদেরও সাহায্য করবে। এই সেটিং মালিকের নিয়ন্ত্রণে রয়েছে। অতিরিক্ত 'ওয়েব ও অ্যাপ অ্যাক্টিভিটি' সেটিং আপনার সন্তানের ডিভাইসের জন্য চালু করা থাকলে, এই ডেটা তাদের Google অ্যাকাউন্টে সেভ করা হতে পারে।</translation> @@ -6745,6 +6770,10 @@ <translation id="7744192722284567281">ডেটার নিরাপত্তা লঙ্ঘন দেখা গেছে</translation> <translation id="7744649840067671761">অ্যাসাইনমেন্ট চালু করতে নতুন সুইচ বা কীবোর্ডের 'কী' প্রেস করুন। অ্যাসাইনমেন্ট সরাতে একটি অ্যাসাইন করা সুইচ বা 'কী' প্রেস করুন।</translation> +<translation id="7746739418892731373">আপনার Google Photos লাইব্রেরি থেকে ফটো এবং ভিডিও হাইলাইটগুলি দেখছেন। আপনার হাইলাইটে কী দেখানো হবে তা <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" /> লিঙ্ক থেকে আপনি নিয়ন্ত্রণ করতে পারবেন। + <ph name="BREAK" /> + <ph name="BREAK" /> + আপনি কার্ড মেনু থেকে এই কার্ডের জন্য সেটিংস ম্যানেজ করতে পারেন বা কাস্টমাইজ Chrome-এ আরও বিকল্প দেখতে পারেন।</translation> <translation id="7750228210027921155">ছবির-মধ্যে-ছবি</translation> <translation id="7751260505918304024">সকল দেখান</translation> <translation id="7753735457098489144">স্টোরেজের জন্য যথেষ্ট জায়গা নেই বলে ইনস্টল করা যায়নি। জায়গা খালি করতে, ডিভাইসের স্টোরেজ থেকে ফাইল মুছুন।</translation> @@ -6770,6 +6799,7 @@ <translation id="7768770796815395237">পরিবর্তন করুন</translation> <translation id="7768784765476638775">বাছুন ও শুনুন</translation> <translation id="7770406201819593386">ChromeOS Flex-এর ডায়াগনস্টিকস টেস্ট রান করান।</translation> +<translation id="7770450735129978837">ডানদিকের মাউস ক্লিক করার বোতাম</translation> <translation id="7770612696274572992">অন্য ডিভাইস থেকে ছবি কপি করা হয়েছে</translation> <translation id="7771452384635174008">লেআউট</translation> <translation id="7772032839648071052">পাসফ্রেজ নিশ্চিত করুন</translation> @@ -7126,6 +7156,7 @@ <translation id="8102139037507939978">System_logs.txt থেকে ব্যক্তিগতভাবে শনাক্তকরণযোগ্য তথ্য সরিয়ে দিন</translation> <translation id="8104088837833760645">ই-সিম প্রোফাইল ডাউনলোড করুন</translation> <translation id="8105368624971345109">বন্ধ করুন</translation> +<translation id="8105541061909542455">{NUM_APPS,plural, =1{কাজ করে না এমন অ্যাপ}one{কাজ করে না এমন অ্যাপ}other{কাজ করে না এমন অ্যাপ}}</translation> <translation id="8107015733319732394">আপনার <ph name="DEVICE_TYPE" /> এ Google Play Store ইনস্টল করা হচ্ছে। এতে কয়েক মিনিট সময় লাগতে পারে।</translation> <translation id="810728361871746125">ডিসপ্লের রেজোলিউশন</translation> <translation id="8108526232944491552">{COUNT,plural, =0{কোনও থার্ড-পার্টি কুকি নেই}=1{১টি থার্ড-পার্টি কুকি ব্লক করা হয়েছে}one{#টি থার্ড-পার্টি কুকি ব্লক করা হয়েছে}other{#টি থার্ড-পার্টি কুকি ব্লক করা হয়েছে}}</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index 7158acb8..5e91967 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -5049,7 +5049,7 @@ <translation id="6022526133015258832">Otvori preko cijelog ekrana</translation> <translation id="6022659036123304283">Prilagodite Chrome svojim potrebama</translation> <translation id="6023643151125006053">Ovaj uređaj (SN: <ph name="SERIAL_NUMBER" />) je zaključao administrator domene <ph name="SAML_DOMAIN" />.</translation> -<translation id="6025215716629925253">Stanje steka</translation> +<translation id="6025215716629925253">Stanje stoga</translation> <translation id="6026819612896463875"><ph name="WINDOW_TITLE" /> – USB uređaj je povezan</translation> <translation id="6027945736510816438">Jeste li mislili <ph name="WEBSITE" />?</translation> <translation id="6028117231645531007">Dodajte otisak prsta</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index aea8934..e1f2dfe 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -1263,6 +1263,7 @@ <translation id="2218019600945559112">Ratolí i ratolí tàctil</translation> <translation id="2218320521449013367">S'ha produït un error mentre Chrome suprimia programari maliciós</translation> <translation id="2218515861914035131">Enganxa com a text sense format</translation> +<translation id="2219658597883514593">Reinicia el tutorial</translation> <translation id="2220409419896228519">Afegeix adreces d'interès a les teves aplicacions de Google preferides</translation> <translation id="2220529011494928058">Informa d'un problema</translation> <translation id="2220572644011485463">PIN o contrasenya</translation> @@ -1328,6 +1329,7 @@ <translation id="2278562042389100163">Obre una finestra del navegador</translation> <translation id="2278668501808246459">S'està iniciant el gestor de contenidors</translation> <translation id="2280486287150724112">Marge dret</translation> +<translation id="2281863813036651454">Clic del botó esquerre del ratolí</translation> <translation id="2282146716419988068">Procés de GPU</translation> <translation id="2285109769884538519">{COUNT,plural, =0{Obre'ls tots en un &grup de pestanyes nou}=1{Obre en un &grup de pestanyes nou}other{Obre'ls tots ({COUNT}) en un &grup de pestanyes nou}}</translation> <translation id="2285942871162473373">La teva empremta digital no s'ha pogut reconèixer. Torna-ho a provar.</translation> @@ -2406,6 +2408,7 @@ <translation id="3378627645871606983">Els permisos autoritzats per a Steam s'apliquen a tots els jocs i les aplicacions de Steam.</translation> <translation id="337920581046691015">S'instal·larà <ph name="PRODUCT_NAME" />.</translation> <translation id="3380365263193509176">Error desconegut</translation> +<translation id="3380850890226973980">Pregunta-m'ho la propera vegada</translation> <translation id="3382073616108123819">El sistema no ha pogut determinar els identificadors d'aquest dispositiu.</translation> <translation id="3382200254148930874">S'està aturant la supervisió...</translation> <translation id="338323348408199233">Bloqueja el trànsit sense VPN</translation> @@ -3778,7 +3781,7 @@ <translation id="473936925429402449">Seleccionat, contingut addicional, <ph name="CURRENT_ELEMENT" /> de <ph name="TOTAL_ELEMENTS" /></translation> <translation id="4739639199548674512">Tiquets</translation> <translation id="4742334355511750246">Sense permís per mostrar imatges</translation> -<translation id="4742970037960872810">Suprimeix el marcatge</translation> +<translation id="4742970037960872810">Suprimeix les marques</translation> <translation id="4743260470722568160"><ph name="BEGIN_LINK" />Obtén informació sobre com s'actualitzen les aplicacions<ph name="END_LINK" /></translation> <translation id="4744981231093950366">{NUM_TABS,plural, =1{Activa el so del lloc web}other{Activa el so dels llocs web}}</translation> <translation id="474609389162964566">Accedeix al teu Assistent amb "Hey Google"</translation> @@ -4203,6 +4206,7 @@ <translation id="5185500136143151980">Sense connexió a Internet</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Reviu els teus records preferits. Per afegir o editar àlbums, ves a <ph name="LINK_BEGIN" />Google Fotos<ph name="LINK_END" />.</translation> +<translation id="5190316321948122159">{NUM_APPS,plural, =1{Suprimeix l'aplicació ara}other{Suprimeix les aplicacions ara}}</translation> <translation id="5190926251776387065">Activa el port</translation> <translation id="5191094172448199359">Els codis PIN que has introduït no coincideixen</translation> <translation id="5191251636205085390">Obtén informació sobre les noves tecnologies per substituir les galetes de tercers i controla-les</translation> @@ -4376,6 +4380,7 @@ <translation id="5342091991439452114">El PIN ha de tenir com a mínim <ph name="MINIMUM" /> dígits</translation> <translation id="5344036115151554031">S'està restaurant Linux</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (auricular dret)</translation> +<translation id="534572711507965074">Posa nom al teu grup, tria un color i toca Retorn</translation> <translation id="5345916423802287046">Obre l'aplicació en iniciar la sessió</translation> <translation id="5350293332385664455">Desactiva l'Assistent de Google</translation> <translation id="535123479159372765">Text copiat des d'un altre dispositiu</translation> @@ -4957,6 +4962,7 @@ <translation id="5946591249682680882">Identificador de l'informe: <ph name="WEBRTC_LOG_REPORT_ID" /></translation> <translation id="5948536763493709626">Connecta un teclat o un ratolí, o bé continua amb la configuració mitjançant la pantalla tàctil. Si fas servir dispositius Bluetooth, comprova que estiguin preparats per vincular-se.</translation> <translation id="5949544233750246342">No es pot analitzar el fitxer</translation> +<translation id="5950039854561387265">Pregunta-m'ho la propera vegada</translation> <translation id="5950819593680344519">Chrome no ha trobat programari nociu a l'ordinador • Es va comprovar ahir</translation> <translation id="5951303645598168883"><ph name="ORIGIN" /> vol utilitzar tipus de lletra locals</translation> <translation id="5951624318208955736">Monitor</translation> @@ -5143,6 +5149,7 @@ <translation id="6129938384427316298">Comentari de certificat de Netscape</translation> <translation id="6129953537138746214">Espai</translation> <translation id="6130692320435119637">Afegeix una Wi‑Fi</translation> +<translation id="6130887916931372608">Tecla del teclat</translation> <translation id="6136114942382973861">Tanca la barra de baixades</translation> <translation id="6136287496450963112">La clau de seguretat no està protegida amb un PIN. Crea'n un per gestionar les empremtes digitals.</translation> <translation id="6138680304137685902">Signatura d'ECDSA X9.62 amb SHA-384</translation> @@ -5218,6 +5225,7 @@ <translation id="6218058416316985984"><ph name="DEVICE_TYPE" /> no té connexió. Connecta't a Internet i torna-ho a provar.</translation> <translation id="6220413761270491930">Error en carregar l'extensió</translation> <translation id="6223447490656896591">Imatge personalitzada:</translation> +<translation id="62236885217374510">{NUM_APPS,plural, =1{Suprimeix l'aplicació ara}other{Suprimeix les aplicacions ara}}</translation> <translation id="6224481128663248237">Ha finalitzat satisfactòriament el format.</translation> <translation id="622537739776246443">El perfil se suprimirà</translation> <translation id="6225475702458870625">Connexió de dades disponible des del teu <ph name="PHONE_NAME" /></translation> @@ -5850,6 +5858,7 @@ <translation id="6846178040388691741">"<ph name="EXTENSION_NAME" />" vol imprimir <ph name="FILE_NAME" /> amb <ph name="PRINTER_NAME" />.</translation> <translation id="6847125920277401289">Allibera espai per continuar</translation> <translation id="6848388270925200958">En aquest moment tens targetes que només es poden fer servir en aquest dispositiu</translation> +<translation id="6848425544473873717">{NUM_APPS,plural, =1{1 de les teves aplicacions ja no s'admet. <ph name="LEARN_MORE" />}other{# de les teves aplicacions ja no s'admeten. <ph name="LEARN_MORE" />}}</translation> <translation id="6848716236260083778">Per configurar una impremta digital, fes que el teu fill toqui el sensor d'empremtes digitals. Les dades de l'empremta digital del teu fill s'emmagatzemen de manera segura i no surten mai del dispositiu <ph name="DEVICE_TYPE" />.</translation> <translation id="6850286078059909152">Color del text</translation> <translation id="6851181413209322061">Envia dades d'ús i de diagnòstic. En aquests moments aquest dispositiu envia automàticament a Google dades de diagnòstic, del dispositiu i d'ús d'aplicacions. Aquestes dades no es faran servir per identificar el teu fill i ajudaran a millorar l'estabilitat del sistema i de les aplicacions, entre altres característiques. Una part de les dades agregades també serà útil per a les aplicacions i per als partners de Google, com ara els desenvolupadors d'Android. El propietari ha aplicat aquesta opció de configuració. Si l'opció Activitat al web i en aplicacions addicional està activada per al teu fill, és possible que aquestes dades es desin al seu Compte de Google.</translation> @@ -6024,7 +6033,7 @@ <translation id="7009709314043432820"><ph name="APP_NAME" /> està utilitzant la càmera</translation> <translation id="701080569351381435">Mostra la font</translation> <translation id="7014174261166285193">La instal·lació ha fallat.</translation> -<translation id="7014480873681694324">Suprimeix el marcatge</translation> +<translation id="7014480873681694324">Suprimeix les marques</translation> <translation id="7017004637493394352">Torneu a dir "Ok Google"</translation> <translation id="7017219178341817193">Afegeix una pàgina nova</translation> <translation id="7017354871202642555">No es pot configurar el mode després d'haver configurat la finestra.</translation> @@ -6755,6 +6764,7 @@ <translation id="7768770796815395237">Canvia</translation> <translation id="7768784765476638775">Escolta la selecció</translation> <translation id="7770406201819593386">Executar proves diagnòstiques de ChromeOS Flex.</translation> +<translation id="7770450735129978837">Clic del botó dret del ratolí</translation> <translation id="7770612696274572992">Imatge copiada des d'un altre dispositiu</translation> <translation id="7771452384635174008">Disseny</translation> <translation id="7772032839648071052">Confirmeu la frase de contrasenya</translation> @@ -7112,6 +7122,7 @@ <translation id="8102139037507939978">Elimina la informació d'identificació personal del fitxer system_logs.txt.</translation> <translation id="8104088837833760645">Baixa el perfil de l'eSIM</translation> <translation id="8105368624971345109">Desactiva</translation> +<translation id="8105541061909542455">{NUM_APPS,plural, =1{Aplicació no admesa}other{Aplicacions no admeses}}</translation> <translation id="8107015733319732394">S'està instal·lant Google Play Store al teu dispositiu <ph name="DEVICE_TYPE" />. Aquest procés pot tardar uns quants minuts.</translation> <translation id="810728361871746125">Resolució de pantalla</translation> <translation id="8108526232944491552">{COUNT,plural, =0{No hi ha cap galeta de tercers}=1{Hi ha 1 galeta de tercers bloquejada}other{Hi ha # galetes de tercers bloquejades}}</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index e273d96..44fe6ad8 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -1330,6 +1330,7 @@ <translation id="2278562042389100163">Otevřít okno prohlížeče</translation> <translation id="2278668501808246459">Spouštění správce kontejneru</translation> <translation id="2280486287150724112">Pravý okraj</translation> +<translation id="2281863813036651454">Levé kliknutí myši</translation> <translation id="2282146716419988068">Proces GPU</translation> <translation id="2285109769884538519">{COUNT,plural, =0{Otevřít vše v &nové skupině karet}=1{Otevřít v &nové skupině karet}few{Otevřít vše ({COUNT}) v &nové skupině karet}many{Otevřít vše ({COUNT}) v &nové skupině karet}other{Otevřít vše ({COUNT}) v &nové skupině karet}}</translation> <translation id="2285942871162473373">Otisk prstu nebyl rozpoznán. Zkuste to znovu.</translation> @@ -3194,6 +3195,10 @@ <translation id="4110490973560452005">Stažení bylo dokončeno: <ph name="FILE_NAME" />. Stisknutím kombinace kláves Shift+F6 přejdete na lištu se staženými soubory.</translation> <translation id="4110686435123617899">Vyberte album <ph name="TITLE" /> <ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (offline)</translation> +<translation id="4114524937989710624">Zobrazují se vám navrhované soubory, abyste se mohli snadno vrátit k nedávné aktivitě na Disku Google. + <ph name="BREAK" /> + <ph name="BREAK" /> + Nastavení můžete spravovat v nabídce karty. Další možnosti zobrazíte v sekci Přizpůsobit Chrome.</translation> <translation id="4115002065223188701">Síť je mimo dosah</translation> <translation id="4115378294792113321">Purpurová</translation> <translation id="4116704186509653070">Otevřít znovu</translation> @@ -3701,6 +3706,10 @@ <translation id="4651484272688821107">Online komponentu se zdroji pro ukázkový režim se nepodařilo načíst.</translation> <translation id="4652935475563630866">Změna nastavení kamery vyžaduje restart nástroje Parallels Desktop. Pokračujte restartováním nástroje Parallels Desktop.</translation> <translation id="4653405415038586100">Chyba konfigurace Linuxu</translation> +<translation id="465406513924180949">Zobrazují se vám karty, které vám pomohou snadno se vrátit na položky, které jste nechali v nákupních košících v různých internetových obchodech. + <ph name="BREAK" /> + <ph name="BREAK" /> + Nastavení můžete spravovat v nabídce karty. Další možnosti zobrazíte v sekci Přizpůsobit Chrome.</translation> <translation id="4654236001025007561">Sdílejte soubory s Chromebooky a zařízeními Android v okolí</translation> <translation id="4657914796247705218">Rychlost TrackPointu</translation> <translation id="4658285806588491142">Chraňte obsah své obrazovky</translation> @@ -4143,6 +4152,7 @@ <translation id="5121130586824819730">Pevný disk je plný. Uložte prosím soubor do jiného umístění nebo uvolněte místo na disku.</translation> <translation id="5123433949759960244">Basketbal</translation> <translation id="5125751979347152379">Neplatná adresa URL.</translation> +<translation id="5125967981703109366">Informace o kartě</translation> <translation id="5126611267288187364">Zobrazit změny</translation> <translation id="5127242257756472928">Nemají povoleno používat informace o vašich obrazovkách k otevření a umístění oken</translation> <translation id="5127620150973591153">ID bezpečného připojení: <ph name="TOKEN" /></translation> @@ -5126,6 +5136,10 @@ <translation id="6116921718742659598">Změnit nastavení jazyka a vstupu</translation> <translation id="6119927814891883061">Nastavit název zařízení na <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Připnout tuto stránku na úvodní obrazovku...</translation> +<translation id="6120707837086723438">Zobrazují se vám navrhované recepty na základě nedávné aktivity ve vyhledávání receptů. + <ph name="BREAK" /> + <ph name="BREAK" /> + Nastavení můžete spravovat v nabídce karty. Další možnosti zobrazíte v sekci Přizpůsobit Chrome.</translation> <translation id="6121773125605585883">Zobrazit heslo pro uživatelské jméno <ph name="USERNAME" /> pro web <ph name="WEBSITE" /></translation> <translation id="6122081475643980456">Vaše připojení k internetu je ovládáno</translation> <translation id="6122093587541546701">E-mail (nepovinné):</translation> @@ -5142,6 +5156,7 @@ <translation id="6129938384427316298">Komentář certifikátu Netscape</translation> <translation id="6129953537138746214">Mezera</translation> <translation id="6130692320435119637">Přidat Wi-Fi</translation> +<translation id="6130887916931372608">Klávesa</translation> <translation id="6136114942382973861">Zavřít lištu se staženými soubory</translation> <translation id="6136287496450963112">Váš bezpečnostní klíč není chráněn kódem PIN. Pokud chcete spravovat otisky prstů, nejdříve vytvořte PIN.</translation> <translation id="6138680304137685902">Podpis X9.62 ECDSA s SHA-384</translation> @@ -6729,6 +6744,10 @@ <translation id="7744192722284567281">Nalezeno v porušení zabezpečení údajů</translation> <translation id="7744649840067671761">Pokud chcete spustit přiřazení, stiskněte nový přepínač nebo klávesu. Pokud přiřazení chcete odstranit, stiskněte přiřazený přepínač nebo klávesu.</translation> +<translation id="7746739418892731373">Zobrazuje se vám výběr fotek a videí z knihovny Fotek Google. Typy návrhů zobrazovaných ve výběru můžete upravit na stránce <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" />. + <ph name="BREAK" /> + <ph name="BREAK" /> + Nastavení této karty můžete spravovat v nabídce karty. Další možnosti zobrazíte v sekci Přizpůsobit Chrome.</translation> <translation id="7750228210027921155">Obraz v obraze</translation> <translation id="7751260505918304024">Zobrazit vše</translation> <translation id="7753735457098489144">Instalace se z důvodu nedostatku místa v úložišti nezdařila. Místo uvolníte smazáním souborů z úložiště zařízení.</translation> @@ -6754,6 +6773,7 @@ <translation id="7768770796815395237">Změnit</translation> <translation id="7768784765476638775">Poslech vybraného textu</translation> <translation id="7770406201819593386">Spouštět diagnostické testy systému ChromeOS Flex.</translation> +<translation id="7770450735129978837">Pravé kliknutí myši</translation> <translation id="7770612696274572992">Obrázek zkopírovaný z jiného zařízení</translation> <translation id="7771452384635174008">Rozložení</translation> <translation id="7772032839648071052">Potvrďte heslovou frázi</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index cbe086d..c187f9b 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -1344,6 +1344,7 @@ <translation id="2278562042389100163">Åbn browservindue</translation> <translation id="2278668501808246459">Starter containeradministration</translation> <translation id="2280486287150724112">Højremargen</translation> +<translation id="2281863813036651454">Venstre museknap</translation> <translation id="2282146716419988068">GPU-proces</translation> <translation id="2285109769884538519">{COUNT,plural, =0{Åbn alle i gruppen &Ny fane}=1{Åbn i gruppen &Ny fane}one{Åbn ({COUNT}) i gruppen &Ny fane}other{Åbn alle ({COUNT}) i gruppen &Ny fane}}</translation> <translation id="2285942871162473373">Dit fingeraftryk blev ikke genkendt. Prøv igen.</translation> @@ -5159,6 +5160,7 @@ <translation id="6129938384427316298">Kommentar til Netscape-certifikat</translation> <translation id="6129953537138746214">Mellemrum</translation> <translation id="6130692320435119637">Tilføj Wi-Fi</translation> +<translation id="6130887916931372608">Tastaturtast</translation> <translation id="6136114942382973861">Luk downloadlinje</translation> <translation id="6136287496450963112">Din sikkerhedsnøgle er ikke beskyttet med en pinkode. Du skal oprette en pinkode, før du kan administrere fingeraftryk.</translation> <translation id="6138680304137685902">X9.62 ECDSA-signatur med SHA-384</translation> @@ -6771,6 +6773,7 @@ <translation id="7768770796815395237">Skift</translation> <translation id="7768784765476638775">Tekstoplæsning</translation> <translation id="7770406201819593386">Kør ChromeOS Flex-diagnostiktest.</translation> +<translation id="7770450735129978837">Højre museknap</translation> <translation id="7770612696274572992">Billede kopieret fra en anden enhed</translation> <translation id="7771452384635174008">Layout</translation> <translation id="7772032839648071052">Bekræft adgangssætning</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 4f868f98..f836771c 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -1384,6 +1384,7 @@ <ph name="FOOTER_MESSAGE" /></translation> <translation id="2307630946657910723">Search part of the page with <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="2309620859903500144">This site has been blocked from accessing your motion or light sensors.</translation> +<translation id="2311721625890389967">↓</translation> <translation id="2312219318583366810">Page URL</translation> <translation id="2314165183524574721">Current visibility setting is hidden</translation> <translation id="2314774579020744484">Language used when translating pages</translation> @@ -1978,6 +1979,7 @@ <translation id="288734198558082692"><ph name="DEVICE" /> and <ph name="NUMBER_OF_DEVICES" /> others</translation> <translation id="2889064240420137087">Open link with...</translation> <translation id="2891922230654533301">Use your device to sign in to <ph name="APP_NAME" />?</translation> +<translation id="2893013536106749396">Pick cards that keep you updated on things that matter to you</translation> <translation id="2893168226686371498">Default browser</translation> <translation id="2893180576842394309">Google may use your history to personalise Search and other Google services</translation> <translation id="2894757982205307093">New tab in group</translation> @@ -2091,6 +2093,7 @@ <translation id="3003623123441819449">CSS Cache</translation> <translation id="3003828226041301643">Can't join the device to the domain. Check your account to make sure that you have privileges to add devices.</translation> <translation id="3003967365858406397">Your <ph name="PHONE_NAME" /> will create a private Wi-Fi connection.</translation> +<translation id="3005574332301273731">Don't show</translation> <translation id="3006881078666935414">No usage data</translation> <translation id="3007771295016901659">Duplicate tab</translation> <translation id="3008232374986381779">Run Linux tools, editors and IDEs on your <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Learn more<ph name="LINK_END" /></translation> @@ -4311,6 +4314,7 @@ <translation id="5265797726250773323">Error while installing</translation> <translation id="5266113311903163739">Certification Authority Import Error</translation> <translation id="526622169288322445">More actions for <ph name="ADDRESS_SUMMARY" /></translation> +<translation id="5268373933383932086">Your page, your way</translation> <translation id="5269977353971873915">Print Failed</translation> <translation id="5273806377963980154">Edit site URL</translation> <translation id="5275352920323889391">Dog</translation> @@ -5123,6 +5127,7 @@ <translation id="6080689532560039067">Check your system time</translation> <translation id="6082877069782862752">Key mapping</translation> <translation id="608531959444400877"><ph name="WINDOW_TITLE" /> – Part of unnamed group</translation> +<translation id="6085457109149794212">See all card options in Customise Chrome</translation> <translation id="6085886413119427067">Determines how to connect to websites over a secure connection</translation> <translation id="6086004606538989567">The account that you verified is not authorised to access this device.</translation> <translation id="6086846494333236931">Installed by your administrator</translation> @@ -5577,6 +5582,7 @@ <translation id="6537880577641744343">Commander</translation> <translation id="6538098297809675636">Error detecting code</translation> <translation id="653920215766444089">Searching for pointing device</translation> +<translation id="653983593749614101">Resuming…</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Note:<ph name="END_BOLD" /> Only enable if you know what you are doing or if you have been asked to do so, as collection of data may reduce performance.</translation> <translation id="6540672086173674880">Google may use your browsing history to personalise Search and other Google services. You can change this at any time at myaccount.google.com/activitycontrols/search</translation> <translation id="6541638731489116978">This site has been blocked from accessing your motion sensors.</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 2c67d81..19c64826 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -1325,6 +1325,7 @@ <translation id="2278562042389100163">Abrir ventana del navegador</translation> <translation id="2278668501808246459">Se está iniciando el administrador de contenedores</translation> <translation id="2280486287150724112">Margen derecho</translation> +<translation id="2281863813036651454">Hacer clic con el botón izquierdo del mouse</translation> <translation id="2282146716419988068">Proceso de GPU</translation> <translation id="2285109769884538519">{COUNT,plural, =0{Abrir todo en un &nuevo grupo de pestañas}=1{Abrir en un &nuevo grupo de pestañas}other{Abrir todo ({COUNT}) en un &nuevo grupo de pestañas}}</translation> <translation id="2285942871162473373">No se reconoció tu huella dactilar. Vuelve a intentarlo.</translation> @@ -5139,6 +5140,7 @@ <translation id="6129938384427316298">Comentario sobre el certificado Netscape</translation> <translation id="6129953537138746214">Espacio</translation> <translation id="6130692320435119637">Agregar Wi-Fi</translation> +<translation id="6130887916931372608">Tecla del teclado</translation> <translation id="6136114942382973861">Cerrar la barra de descargas</translation> <translation id="6136287496450963112">Tu llave de seguridad no está protegida con un PIN. Para administrar las huellas dactilares, crea uno.</translation> <translation id="6138680304137685902">Firma X9.62 ECDSA con SHA-384</translation> @@ -6751,6 +6753,7 @@ <translation id="7768770796815395237">Cambiar</translation> <translation id="7768784765476638775">Seleccionar para pronunciar</translation> <translation id="7770406201819593386">Ejecuta pruebas diagnóstico de Chrome OS Flex.</translation> +<translation id="7770450735129978837">Hacer clic con el botón derecho del mouse</translation> <translation id="7770612696274572992">Imagen copiada de otro dispositivo</translation> <translation id="7771452384635174008">Diseño</translation> <translation id="7772032839648071052">Confirmar frase de contraseña</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 7681154..320afe1 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -1329,6 +1329,7 @@ <translation id="2278562042389100163">Abrir ventana del navegador</translation> <translation id="2278668501808246459">Iniciando el gestor de contenedores</translation> <translation id="2280486287150724112">Margen derecho</translation> +<translation id="2281863813036651454">Clic izquierdo del ratón</translation> <translation id="2282146716419988068">Proceso de GPU</translation> <translation id="2285109769884538519">{COUNT,plural, =0{Abrir todas en un &nuevo grupo de pestañas}=1{Abrir en un &nuevo grupo de pestañas}other{Abrir todas ({COUNT}) en un &nuevo grupo de pestañas}}</translation> <translation id="2285942871162473373">No se ha podido reconocer tu huella digital. Inténtalo de nuevo.</translation> @@ -5141,6 +5142,7 @@ <translation id="6129938384427316298">Comentario del certificado de Netscape</translation> <translation id="6129953537138746214">Espacio</translation> <translation id="6130692320435119637">Añadir Wi‑Fi</translation> +<translation id="6130887916931372608">Tecla del teclado</translation> <translation id="6136114942382973861">Cerrar barra de descargas</translation> <translation id="6136287496450963112">Tu llave de seguridad no está protegida mediante un PIN. Para gestionar huellas dactilares, primero debes crear un PIN.</translation> <translation id="6138680304137685902">Firma X9.62 ECDSA con SHA-384</translation> @@ -6753,6 +6755,7 @@ <translation id="7768770796815395237">Cambiar</translation> <translation id="7768784765476638775">Enunciar selección</translation> <translation id="7770406201819593386">Ejecuta pruebas diagnósticas de ChromeOS Flex.</translation> +<translation id="7770450735129978837">Clic derecho del ratón</translation> <translation id="7770612696274572992">Imagen copiada desde otro dispositivo</translation> <translation id="7771452384635174008">Diseño</translation> <translation id="7772032839648071052">Repite la frase de contraseña</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 86c8897..09ddd474c 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -3201,6 +3201,10 @@ <translation id="4110490973560452005">Allalaadimine on lõpule viidud: <ph name="FILE_NAME" />. Allalaadimiste riba valikute vahel vahetamiseks vajutage klahvikombinatsiooni Tõstuklahv + F6.</translation> <translation id="4110686435123617899">Valige album <ph name="TITLE" /> <ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (võrguühenduseta)</translation> +<translation id="4114524937989710624">Näete soovitatud faile, mis aitavad teil Google Drive'is hõlpsalt naasta hiljutiste tegevuste juurde. + <ph name="BREAK" /> + <ph name="BREAK" /> + Saate seadeid kohandada kaardimenüüs või näha rohkem valikuid jaotises Chrome'i kohandamine.</translation> <translation id="4115002065223188701">Võrk ei ole läheduses</translation> <translation id="4115378294792113321">Magenta</translation> <translation id="4116704186509653070">Ava uuesti</translation> @@ -3708,6 +3712,10 @@ <translation id="4651484272688821107">Demorežiimi ressurssidega veebipõhist komponenti ei saanud laadida.</translation> <translation id="4652935475563630866">Kaamera seade muudatuse jõustumiseks tuleb Parallels Desktop uuesti käivitada. Jätkamiseks käivitage Parallels Desktop uuesti.</translation> <translation id="4653405415038586100">Viga Linuxi seadistamisel</translation> +<translation id="465406513924180949">Näete kaarte, mis aitavad teil hõlpsalt naasta üksuste juurde, mille veebis ostukorvidesse jätsite. + <ph name="BREAK" /> + <ph name="BREAK" /> + Saate seadeid kohandada kaardimenüüs või näha rohkem valikuid jaotises Chrome'i kohandamine.</translation> <translation id="4654236001025007561">Jagage faile läheduses olevate Chromebookide ja Android-seadmetega</translation> <translation id="4657914796247705218">Näpuhiire kiirus</translation> <translation id="4658285806588491142">Hoidke oma ekraanikuva privaatsena</translation> @@ -4150,6 +4158,7 @@ <translation id="5121130586824819730">Teie kõvaketas on täis. Salvestage muusse asukohta või vabastage kõvakettaruumi.</translation> <translation id="5123433949759960244">Korvpall</translation> <translation id="5125751979347152379">Vale URL.</translation> +<translation id="5125967981703109366">Teave selle kaardi kohta</translation> <translation id="5126611267288187364">Kuva muudatused</translation> <translation id="5127242257756472928">Pole lubatud kasutada teavet teie ekraanikuvade kohta, et avada ja paigutada aknaid</translation> <translation id="5127620150973591153">Turvalise ühenduse ID: <ph name="TOKEN" /></translation> @@ -5133,6 +5142,10 @@ <translation id="6116921718742659598">Keele ja sisestusseadete muutmine</translation> <translation id="6119927814891883061">Määra seadme nimeks <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Kinnita see leht avakuvale ...</translation> +<translation id="6120707837086723438">Näete soovitatud retsepte, mis põhinevad teie hiljutistel retseptide otsingutel. + <ph name="BREAK" /> + <ph name="BREAK" /> + Saate seadeid kohandada kaardimenüüs või näha rohkem valikuid jaotises Chrome'i kohandamine.</translation> <translation id="6121773125605585883">Saidi <ph name="WEBSITE" /> puhul parooli vaatamine koos kasutajanimega <ph name="USERNAME" /></translation> <translation id="6122081475643980456">Teie Interneti-ühendust juhitakse</translation> <translation id="6122093587541546701">E-post (valikuline):</translation> @@ -6737,6 +6750,10 @@ <translation id="7744192722284567281">Ilmnes andmetega seotud rikkumises</translation> <translation id="7744649840067671761">Määramise alustamiseks vajutage uut lülitit või klaviatuuri klahvi. Määrangu eemaldamiseks vajutage määratud lülitit või klahvi.</translation> +<translation id="7746739418892731373">Näete teenuse Google Photos kogust fotode ja videote esiletõste. Saidil <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" /> saate hallata, mis teie esiletõstudes kuvatakse. + <ph name="BREAK" /> + <ph name="BREAK" /> + Saate selle kaardi seadeid kohandada kaardimenüüs või näha rohkem valikuid jaotises Chrome'i kohandamine.</translation> <translation id="7750228210027921155">Pilt pildis</translation> <translation id="7751260505918304024">Kuva kõik</translation> <translation id="7753735457098489144">Installimine ebaõnnestus, kuna salvestusruumi on liiga vähe. Ruumi vabastamiseks kustutage seadme salvestusruumist faile.</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index a97fa3b6..c27894c 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -1272,6 +1272,7 @@ <translation id="2218019600945559112">موشواره و صفحه لمسی</translation> <translation id="2218320521449013367">هنگام حذف نرمافزار مضر توسط Chrome، خطایی روی داد</translation> <translation id="2218515861914035131">جایگذاری بهعنوان متن ساده</translation> +<translation id="2219658597883514593">بازراهاندازی آموزش گامبهگام</translation> <translation id="2220409419896228519">اضافه کردن نشانکها به برنامههای Google دلخواه</translation> <translation id="2220529011494928058">گزارش یک مشکل</translation> <translation id="2220572644011485463">پین یا گذرواژه</translation> @@ -2419,6 +2420,7 @@ <translation id="3378627645871606983">اجازههایی که برای Steam مجاز شده است برای همه بازیها و برنامههای Steam اعمال میشود.</translation> <translation id="337920581046691015"><ph name="PRODUCT_NAME" /> نصب خواهد شد.</translation> <translation id="3380365263193509176">خطای ناشناس</translation> +<translation id="3380850890226973980">دفعه بعد پرسیده شود</translation> <translation id="3382073616108123819">وای! سیستم نتوانست شناسههای دستگاه را برای این دستگاه تعیین کند.</translation> <translation id="3382200254148930874">درحال توقف نظارت...</translation> <translation id="338323348408199233">مسدود کردن ترافیک بدون VPN</translation> @@ -3208,6 +3210,10 @@ <translation id="4110490973560452005">بارگیری کامل شد: <ph name="FILE_NAME" />. برای چرخش در قسمت نوار بارگیریها، Shift+F6 را فشار دهید.</translation> <translation id="4110686435123617899">انتخاب آلبوم <ph name="TITLE" /> <ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (آفلاین)</translation> +<translation id="4114524937989710624">درحال دیدن فایلهای پیشنهادی هستید تا بهکمک آنها بتوانید خیلی راحت به جدیدترین فعالیتتان در Google Drive برگردید. + <ph name="BREAK" /> + <ph name="BREAK" /> + از منوی کارت میتوانید تنظیمات را مدیریت کنید یا در «سفارشی کردن Chrome» گزینههای بیشتری را ببینید.</translation> <translation id="4115002065223188701">شبکه خارج از محدوده است</translation> <translation id="4115378294792113321">سرخابی</translation> <translation id="4116704186509653070">باز کردن دوباره</translation> @@ -3716,6 +3722,10 @@ <translation id="4651484272688821107">بااستفاده از منابع حالت نمایشی، مؤلفه آنلاین بار نشد.</translation> <translation id="4652935475563630866">برای اعمال تغییر ایجادشده در تنظیم دوربین، باید Parallels Desktop را راهاندازی مجدد کنید. برای ادامه، Parallels Desktop را راهاندازی مجدد کنید.</translation> <translation id="4653405415038586100">خطا در پیکربندی Linux</translation> +<translation id="465406513924180949">درحال دیدن سبدهای خرید هستید تا بهکمک آنها بتوانید خیلی راحت به محصولاتی که در سبدهای خریدتان در سراسر وب دارید برگردید. + <ph name="BREAK" /> + <ph name="BREAK" /> + از منوی کارت میتوانید تنظیمات را مدیریت کنید یا در «سفارشی کردن Chrome» گزینههای بیشتری را ببینید.</translation> <translation id="4654236001025007561">همرسانی فایل با دستگاههای Chromebook و Android در اطراف شما</translation> <translation id="4657914796247705218">سرعت TrackPoint</translation> <translation id="4658285806588491142">صفحهنمایشتان را خصوصی نگه دارید</translation> @@ -4158,6 +4168,7 @@ <translation id="5121130586824819730">دیسک سخت پر است. لطفاً در محل دیگری ذخیره کنید یا فضای بیشتری در دیسک سخت ایجاد کنید.</translation> <translation id="5123433949759960244">بسکتبال</translation> <translation id="5125751979347152379">نشانی وب نامعتبر است.</translation> +<translation id="5125967981703109366">درباره این کارت</translation> <translation id="5126611267288187364">مشاهده تغییرات</translation> <translation id="5127242257756472928">اجازه ندارد برای باز کردن و جایگذاری پنجرهها از اطلاعات صفحهنمایشهایتان استفاده کند</translation> <translation id="5127620150973591153">شناسه اتصال امن: <ph name="TOKEN" /></translation> @@ -4219,6 +4230,7 @@ <translation id="5185500136143151980">اتصال اینترنت وجود ندارد</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">خاطرات دلخواهتان را دوباره زنده کنید. برای افزودن یا ویرایش کردن آلبومها، به <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" /> بروید.</translation> +<translation id="5190316321948122159">{NUM_APPS,plural, =1{اکنون برنامه حذف شود}one{اکنون برنامه حذف شود}other{اکنون برنامهها حذف شوند}}</translation> <translation id="5190926251776387065">فعال کردن درگاه</translation> <translation id="5191094172448199359">پینهایی که وارد کردید مطابقت ندارند</translation> <translation id="5191251636205085390">با فناوریهای جدیدی که قرار است جایگزین کوکیهای شخص ثالث شود آشنا شوید و آنها را کنترل کنید</translation> @@ -4392,6 +4404,7 @@ <translation id="5342091991439452114">پین باید حداقل <ph name="MINIMUM" /> رقم باشد</translation> <translation id="5344036115151554031">درحال بازیابی Linux</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (راست)</translation> +<translation id="534572711507965074">گروه را نامگذاری کنید، رنگی را انتخاب کنید، و روی «ورود» ضربه بزنید</translation> <translation id="5345916423802287046">راهاندازی برنامه هنگام ورود به سیستم</translation> <translation id="5350293332385664455">خاموش کردن «دستیار Google»</translation> <translation id="535123479159372765">نوشتار از دستگاه دیگری کپی شده است</translation> @@ -4972,6 +4985,7 @@ <translation id="5946591249682680882">شناسه گزارش <ph name="WEBRTC_LOG_REPORT_ID" /></translation> <translation id="5948536763493709626">برای ادامه راهاندازی بااستفاده از صفحه لمسی، صفحهکلید یا موشوارهای را متصل کنید. اگر از دستگاههای بلوتوث استفاده میکنید، مطمئن شوید دستگاههایتان برای مرتبطسازی آماده باشند.</translation> <translation id="5949544233750246342">تجزیه فایل امکانپذیر نیست</translation> +<translation id="5950039854561387265">دفعه بعد پرسیده شود</translation> <translation id="5950819593680344519">Chrome نرمافزار مضری در رایانهتان پیدا نکرد • دیروز بررسی شد</translation> <translation id="5951303645598168883"><ph name="ORIGIN" /> میخواهد از قلمهای محلی استفاده کند</translation> <translation id="5951624318208955736">نمایشگر</translation> @@ -5142,6 +5156,10 @@ <translation id="6116921718742659598">تغییر تنظیمات زبان و ورودی</translation> <translation id="6119927814891883061">تغییر نام دستگاه به <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">سنجاق کردن این صفحه به صفحه شروع…</translation> +<translation id="6120707837086723438">درحال دیدن دستورهای پخت پیشنهادی هستید که براساس فعالیت اخیر مرتبط با دستورهای پخت در «جستجو» گردآوری شده است. + <ph name="BREAK" /> + <ph name="BREAK" /> + از منوی کارت میتوانید تنظیمات را مدیریت کنید یا در «سفارشی کردن Chrome» گزینههای بیشتری را ببینید.</translation> <translation id="6121773125605585883">مشاهده گذرواژه با نام کاربری <ph name="USERNAME" /> برای <ph name="WEBSITE" /></translation> <translation id="6122081475643980456">اتصال اینترنت شما کنترل میشود</translation> <translation id="6122093587541546701">ایمیل (اختیاری):</translation> @@ -5234,6 +5252,7 @@ <translation id="6218058416316985984"><ph name="DEVICE_TYPE" /> آفلاین است. به اینترنت متصل شوید و دوباره امتحان کنید.</translation> <translation id="6220413761270491930">خطا هنگام بارگیری برنامه افزودنی</translation> <translation id="6223447490656896591">تصویر سفارشی:</translation> +<translation id="62236885217374510">{NUM_APPS,plural, =1{اکنون برنامه حذف شود}one{اکنون برنامه حذف شود}other{اکنون برنامهها حذف شوند}}</translation> <translation id="6224481128663248237">قالببندی با موفقیت به پایان رسید!</translation> <translation id="622537739776246443">نمایه حذف خواهد شد</translation> <translation id="6225475702458870625">اتصال داده از <ph name="PHONE_NAME" /> دردسترس است</translation> @@ -5866,6 +5885,7 @@ <translation id="6846178040388691741">«<ph name="EXTENSION_NAME" />» میخواهد <ph name="FILE_NAME" /> را با <ph name="PRINTER_NAME" /> چاپ کند.</translation> <translation id="6847125920277401289">برای ادامه، فضا خالی کنید</translation> <translation id="6848388270925200958">درحالحاضر، کارتهایی دارید که فقط در این دستگاه قابل استفادهاند</translation> +<translation id="6848425544473873717">{NUM_APPS,plural, =1{یکی از برنامههای شما دیگر پشتیبانی نمیشود. <ph name="LEARN_MORE" />}one{# برنامه شما دیگر پشتیبانی نمیشود. <ph name="LEARN_MORE" />}other{# برنامه شما دیگر پشتیبانی نمیشود. <ph name="LEARN_MORE" />}}</translation> <translation id="6848716236260083778">برای راهاندازی اثر انگشت، از فرزندتان بخواهید حسگر اثر انگشت را لمس کند. دادههای اثر انگشت فرزندتان بهصورت ایمن ذخیره میشود و هرگز از این <ph name="DEVICE_TYPE" /> خارج نمیشود.</translation> <translation id="6850286078059909152">رنگ نوشتار</translation> <translation id="6851181413209322061">دادههای استفاده و عیبیابی را ارسال کنید. این دستگاه درحالحاضر بهصورت خودکار دادههای عیبیابی و دادههای استفاده از دستگاه و برنامه را برای Google ارسال میکند. این دادهها برای شناسایی فرزندتان استفاده نخواهند شد و به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی دادههای انبوهشی نیز به برنامهها و شرکای Google (مانند «برنامهنویسهای Android») کمک میکند. این تنظیم را مالک اعمال میکند. اگر «فعالیت وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این دادهها در «حساب Google» او ذخیره شود.</translation> @@ -6746,6 +6766,10 @@ <translation id="7744192722284567281">در نقض داده پیدا شد</translation> <translation id="7744649840067671761">برای شروع روند اختصاص دادن، کلیدی از صفحهکلید یا کلید خارجی دیگری را فشار دهید. برای برداشتن تخصیص، کلید اختصاصیافته را فشار دهید.</translation> +<translation id="7746739418892731373">درحال دیدن عکسها و ویدیوهای برگزیده از «کتابخانه Google Photos» هستید. در <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" /> میتوانید محتوایی را که در برگزیدهها نشان داده میشود کنترل کنید. + <ph name="BREAK" /> + <ph name="BREAK" /> + از منوی کارت میتوانید تنظیمات این کارت را مدیریت کنید یا در «سفارشی کردن Chrome» گزینههای بیشتری را ببینید.</translation> <translation id="7750228210027921155">تصویردرتصویر</translation> <translation id="7751260505918304024">نمایش همه</translation> <translation id="7753735457098489144">بهدلیل نبودن فضای ذخیرهسازی، نصب انجام نشد. برای آزاد کردن فضا، فایلها را در حافظه دستگاه حذف کنید.</translation> @@ -7128,6 +7152,7 @@ <translation id="8102139037507939978">«اطلاعات قابلشناسایی شخصی» از system_logs.txt حذف شود.</translation> <translation id="8104088837833760645">بارگیری نمایه سیمکارت داخلی</translation> <translation id="8105368624971345109">خاموش کردن</translation> +<translation id="8105541061909542455">{NUM_APPS,plural, =1{برنامه پشتیبانینشده}one{برنامه پشتیبانینشده}other{برنامههای پشتیبانینشده}}</translation> <translation id="8107015733319732394">«فروشگاه Google Play» در <ph name="DEVICE_TYPE" /> شما درحال نصب شدن است. ممکن است این کار چند دقیقه طول بکشد.</translation> <translation id="810728361871746125">وضوح نمایشگر</translation> <translation id="8108526232944491552">{COUNT,plural, =0{فاقد کوکی شخص ثالث}=1{۱ کوکی شخص ثالث مسدود شده است}one{# کوکی شخص ثالث مسدود شده است}other{# کوکی شخص ثالث مسدود شده است}}</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 5e72908..bb67edd0 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -3206,6 +3206,10 @@ <translation id="4110490973560452005">Lataus valmis: <ph name="FILE_NAME" />. Paina Shift + F6 siirtyäksesi latauspalkkialueelle.</translation> <translation id="4110686435123617899">Valitse albumi <ph name="TITLE" /> <ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (offline)</translation> +<translation id="4114524937989710624">Näet suositeltuja tiedostoja, jotta voit helposti jatkaa viimeaikaista toimintaasi Google Drivessa. + <ph name="BREAK" /> + <ph name="BREAK" /> + Voit muuttaa asetuksia korttivalikossa. Lisää vaihtoehtoja löydät Yksilöi Chromea ‑osiosta.</translation> <translation id="4115002065223188701">Verkon kantama ei riitä</translation> <translation id="4115378294792113321">Purppura</translation> <translation id="4116704186509653070">Avaa uudelleen</translation> @@ -3714,6 +3718,10 @@ <translation id="4651484272688821107">Verkkoelementtiä ei voitu ladata esittelytilan resursseilla.</translation> <translation id="4652935475563630866">Kamera-asetuksen muutos edellyttää Parallels Desktopin käynnistämistä uudelleen. Käynnistä Parallels Desktop uudelleen jatkaaksesi.</translation> <translation id="4653405415038586100">Virhe Linuxin määrittämisessä</translation> +<translation id="465406513924180949">Näet koreja, joiden avulla voit helposti palata verkkokauppojen ostoskoreihin jääneisiin tuotteisiin. + <ph name="BREAK" /> + <ph name="BREAK" /> + Voit muuttaa asetuksia korttivalikossa. Lisää vaihtoehtoja löydät Yksilöi Chromea ‑osiosta.</translation> <translation id="4654236001025007561">Jaa tiedostoja lähellä olevien Chromebookien ja Android-laitteiden kanssa</translation> <translation id="4657914796247705218">TrackPoint-nopeus</translation> <translation id="4658285806588491142">Näytöllä näkyvän tiedon pitäminen yksityisenä</translation> @@ -4156,6 +4164,7 @@ <translation id="5121130586824819730">Kiintolevy on täynnä. Tallenna muuhun sijaintiin tai vapauta levytilaa.</translation> <translation id="5123433949759960244">Koripallo</translation> <translation id="5125751979347152379">Virheellinen URL-osoite.</translation> +<translation id="5125967981703109366">Tietoa tästä kortista</translation> <translation id="5126611267288187364">Näytä muutokset</translation> <translation id="5127242257756472928">Tietoja näytöistäsi ei saa käyttää ikkunoiden avaamiseksi ja sijoittamiseksi</translation> <translation id="5127620150973591153">Suojatun yhteyden tunnus: <ph name="TOKEN" /></translation> @@ -5139,6 +5148,10 @@ <translation id="6116921718742659598">Vaihda kielen ja syöttötavan asetuksia</translation> <translation id="6119927814891883061">Valitse laitteen nimeksi <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Kiinnitä tämä sivu aloitusruutuun...</translation> +<translation id="6120707837086723438">Näet suositeltuja reseptejä, jotka perustuvat viime aikoina hakemiisi resepteihin. + <ph name="BREAK" /> + <ph name="BREAK" /> + Voit muuttaa asetuksia korttivalikossa. Lisää vaihtoehtoja löydät Yksilöi Chromea ‑osiosta.</translation> <translation id="6121773125605585883">Katso käyttäjänimellä <ph name="USERNAME" /> tallennettu salasana (<ph name="WEBSITE" />)</translation> <translation id="6122081475643980456">Internetyhteyttäsi hallinnoidaan</translation> <translation id="6122093587541546701">Sähköpostiosoite (valinnainen):</translation> @@ -6743,6 +6756,10 @@ <translation id="7744192722284567281">Kuului tietosuojaloukkaukseen</translation> <translation id="7744649840067671761">Aloita määritys painamalla uutta kytkintä tai näppäimistön näppäintä. Poista määritys painamalla määritettyä kytkintä tai näppäintä.</translation> +<translation id="7746739418892731373">Näet kohokohtia Google Kuvat ‑kirjastosi kuvista ja videoista. Voit valita, mitä kohokohdissa näkyy, osoitteessa <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" />. + <ph name="BREAK" /> + <ph name="BREAK" /> + Voit muuttaa kortin asetuksia korttivalikossa. Lisää vaihtoehtoja löydät Yksilöi Chromea ‑osiosta.</translation> <translation id="7750228210027921155">Kuva kuvassa</translation> <translation id="7751260505918304024">Näytä kaikki</translation> <translation id="7753735457098489144">Asennus epäonnistui, koska tallennustila ei riitä. Vapauta tilaa poistamalla laitteen tallennustilasta tiedostoja.</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 0b4361e..16e00703 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -1276,6 +1276,7 @@ <translation id="2218019600945559112">Mouse at touchpad</translation> <translation id="2218320521449013367">Nagkaroon ng error habang inaalis ng Chrome ang mapaminsalang software</translation> <translation id="2218515861914035131">I-paste bilang plain text</translation> +<translation id="2219658597883514593">I-restart ang tutorial</translation> <translation id="2220409419896228519">Magdagdag ng mga bookmark sa iyong paboritong Google Apps</translation> <translation id="2220529011494928058">Mag-ulat ng isyu</translation> <translation id="2220572644011485463">PIN o password</translation> @@ -2423,6 +2424,7 @@ <translation id="3378627645871606983">Nalalapat ang mga pahintulot na pinayagan para sa Steam sa lahat ng laro at app ng Steam.</translation> <translation id="337920581046691015">Ang <ph name="PRODUCT_NAME" /> ay maiinstall.</translation> <translation id="3380365263193509176">Hindi kilalang error</translation> +<translation id="3380850890226973980">Magtanong sa susunod</translation> <translation id="3382073616108123819">Oops! Hindi nakatukoy ang system ng mga identifier ng device para sa device na ito.</translation> <translation id="3382200254148930874">Inihihinto ang pagsubaybay...</translation> <translation id="338323348408199233">I-block ang trapiko nang walang VPN</translation> @@ -3211,6 +3213,10 @@ <translation id="4110490973560452005">Na-download na: <ph name="FILE_NAME" />. Pindutin ang Shift+F6 para mag-cycle sa lugar ng bar ng mga download.</translation> <translation id="4110686435123617899">Piliin ang album na <ph name="TITLE" /> <ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (offline)</translation> +<translation id="4114524937989710624">Nakikita mo ang mga iminumungkahing file na makakatulong para madali mong mabalikan ang iyong pinakakamakailang aktibidad sa Google Drive. + <ph name="BREAK" /> + <ph name="BREAK" /> + Puwede mong pamahalaan ang mga setting mula sa menu ng card o tingnan ang higit pang opsyon sa I-customize ang Chrome.</translation> <translation id="4115002065223188701">Hindi nasasagap ang network</translation> <translation id="4115378294792113321">Magenta</translation> <translation id="4116704186509653070">Buksan ulit</translation> @@ -3719,6 +3725,10 @@ <translation id="4651484272688821107">Hindi ma-load ang online na bahagi gamit ang mga resource ng demo mode.</translation> <translation id="4652935475563630866">Hinihingi ng pagbabago sa setting ng camera na ilunsad ulit ang Parallels Desktop. Ilunsad ulit ang Parallels Desktop para magpatuloy.</translation> <translation id="4653405415038586100">Error sa pag-configure ng Linux</translation> +<translation id="465406513924180949">Nakikita mo ang mga cart na makakatulong para madali mong mabalikan ang mga item na iniwan mo sa mga shopping cart sa buong web. + <ph name="BREAK" /> + <ph name="BREAK" /> + Puwede mong pamahalaan ang mga setting mula sa menu ng card o tingnan ang higit pang opsyon sa I-customize ang Chrome.</translation> <translation id="4654236001025007561">Magbahagi ng mga file sa Mga Chromebook at Android device sa paligid mo</translation> <translation id="4657914796247705218">Bilis ng TrackPoint</translation> <translation id="4658285806588491142">Panatilihing pribado ang iyong screen</translation> @@ -4161,6 +4171,7 @@ <translation id="5121130586824819730">Puno na ang iyong hard disk. Mangyaring i-save sa isa pang lokasyon o magbakante ng espasyo sa hard disk.</translation> <translation id="5123433949759960244">Basketball</translation> <translation id="5125751979347152379">Di-wastong URL.</translation> +<translation id="5125967981703109366">Tungkol sa card na ito</translation> <translation id="5126611267288187364">Tingnan ang mga pagbabago</translation> <translation id="5127242257756472928">Hindi pinapayagang gamitin ang impormasyon tungkol sa iyong mga screen para magbukas at maglagay ng mga window</translation> <translation id="5127620150973591153">Secure na connection ID: <ph name="TOKEN" /></translation> @@ -4222,6 +4233,7 @@ <translation id="5185500136143151980">Walang Internet</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Balikan ang iyong mga paboritong alaala. Para magdagdag o mag-edit ng mga album, pumunta sa <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />.</translation> +<translation id="5190316321948122159">{NUM_APPS,plural, =1{I-delete ang app ngayon}one{I-delete ang mga app ngayon}other{I-delete ang mga app ngayon}}</translation> <translation id="5190926251776387065">I-activate ang port</translation> <translation id="5191094172448199359">Hindi tugma ang mga PIN na inilagay mo</translation> <translation id="5191251636205085390">Matuto pa tungkol sa at kontrolin ang mga bagong teknolohiyang naglalayong palitan ang third-party na cookies</translation> @@ -4394,6 +4406,7 @@ <translation id="5342091991439452114">Hindi dapat bababa sa <ph name="MINIMUM" /> (na) digit ang PIN</translation> <translation id="5344036115151554031">Nire-restore ang Linux</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (Kanan)</translation> +<translation id="534572711507965074">Pangalanan ang iyong grupo, pumili ng kulay, at i-tap ang Enter</translation> <translation id="5345916423802287046">Buksan ang app kapag nag-sign in ka</translation> <translation id="5350293332385664455">I-off ang Google Assistant</translation> <translation id="535123479159372765">Nakopya ang text mula sa isa pang device</translation> @@ -4974,6 +4987,7 @@ <translation id="5946591249682680882">Report ID <ph name="WEBRTC_LOG_REPORT_ID" /></translation> <translation id="5948536763493709626">Magkonekta ng keyboard o mouse, o ipagpatuloy ang pag-set up gamit ang iyong touchscreen. Kung gumagamit ka ng mga Bluetooth device, tiyaking nakahandang ipares ang iyong mga device.</translation> <translation id="5949544233750246342">Hindi ma-parse ang file</translation> +<translation id="5950039854561387265">Magtanong sa Susunod</translation> <translation id="5950819593680344519">Walang nakitang mapaminsalang software ang Chrome sa iyong computer • Tiningnan kahapon</translation> <translation id="5951303645598168883">Gustong gumamit ng <ph name="ORIGIN" /> ng mga lokal na font</translation> <translation id="5951624318208955736">Monitor</translation> @@ -5144,6 +5158,10 @@ <translation id="6116921718742659598">Baguhin ang mga setting ng wika at input</translation> <translation id="6119927814891883061">Pangalanan ang device na <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">I-pin ang pahinang ito screen ng Simula...</translation> +<translation id="6120707837086723438">Nakikita mo ang mga iminumungkahing recipe batay sa iyong kamakailang Aktibidad sa paghahanap para sa mga recipe. + <ph name="BREAK" /> + <ph name="BREAK" /> + Puwede mong pamahalaan ang mga setting mula sa menu ng card o tingnan ang higit pang opsyon sa I-customize ang Chrome.</translation> <translation id="6121773125605585883">Tingnan ang password na may username na <ph name="USERNAME" /> para sa <ph name="WEBSITE" /></translation> <translation id="6122081475643980456">Kinokontrol ang iyong koneksyon sa Internet</translation> <translation id="6122093587541546701">Email (opsyonal):</translation> @@ -5236,6 +5254,7 @@ <translation id="6218058416316985984">Offline ang <ph name="DEVICE_TYPE" />. Kumonekta sa Internet at subukang muli.</translation> <translation id="6220413761270491930">Error sa Paglo-load ng Extension</translation> <translation id="6223447490656896591">Custom na Larawan:</translation> +<translation id="62236885217374510">{NUM_APPS,plural, =1{I-delete ang App Ngayon}one{I-delete ang Mga App Ngayon}other{I-delete ang Mga App Ngayon}}</translation> <translation id="6224481128663248237">Matagumpay na natapos ang pag-format!</translation> <translation id="622537739776246443">Ide-delete ang profile</translation> <translation id="6225475702458870625">Available ang koneksyon sa data mula sa iyong <ph name="PHONE_NAME" /></translation> @@ -5868,6 +5887,7 @@ <translation id="6846178040388691741">Gustong i-print ng "<ph name="EXTENSION_NAME" />" ang <ph name="FILE_NAME" /> gamit ang <ph name="PRINTER_NAME" />.</translation> <translation id="6847125920277401289">Magbakante ng espasyo para magpatuloy</translation> <translation id="6848388270925200958">Sa ngayon, mayroon kang ilang card na magagamit lang sa device na ito</translation> +<translation id="6848425544473873717">{NUM_APPS,plural, =1{Hindi na suportado ang 1 sa iyong mga app. <ph name="LEARN_MORE" />}one{Hindi na suportado ang # sa iyong mga app. <ph name="LEARN_MORE" />}other{Hindi na suportado ang # sa iyong mga app. <ph name="LEARN_MORE" />}}</translation> <translation id="6848716236260083778">Para mag-set up ng fingerprint, ipapindot sa iyong anak ang sensor para sa fingerprint. Secure na sino-store ang data ng fingerprint ng iyong anak at hindi ito kailanman lalabas sa <ph name="DEVICE_TYPE" /> na ito.</translation> <translation id="6850286078059909152">Kulay ng text</translation> <translation id="6851181413209322061">Magpadala ng data ng paggamit at diagnostic. Sa kasalukuyan, ang device na ito ay awtomatikong nagpapadala ng diagnostic na data, data ng device, at data ng paggamit sa app sa Google. Hindi ito gagamitin para tukuyin ang pagkakakilanlan ng iyong anak, at makakatulong ito sa stability ng system at ng app, at sa iba pang pagpapahusay. Makakatulong din ang ilang pinagsama-samang data sa mga app at partner ng Google, gaya ng mga developer ng Android. Ipinapatupad ng may-ari ang setting na ito. Kung naka-on ang karagdagang Aktibidad sa Web at App para sa iyong anak, posibleng ma-save ang data na ito sa kanyang Google Account.</translation> @@ -6748,6 +6768,10 @@ <translation id="7744192722284567281">Nakita sa paglabag sa data</translation> <translation id="7744649840067671761">Pumindot ng bagong switch o key sa keyboard para simulan ang pagtatalaga. Pumindot ng nakatalagang switch o key para alisin ang pagtatalaga.</translation> +<translation id="7746739418892731373">Nakikita mo ang mga highlight na larawan at video mula sa iyong library ng Google Photos. Puwede mong kontrolin kung ano ang lalabas sa iyong mga highlight sa <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" />. + <ph name="BREAK" /> + <ph name="BREAK" /> + Puwede mong pamahalaan ang mga setting para sa card na ito mula sa menu ng card o tingnan ang higit pang opsyon sa I-customize ang Chrome.</translation> <translation id="7750228210027921155">Picture in picture</translation> <translation id="7751260505918304024">Ipakita lahat</translation> <translation id="7753735457098489144">Hindi na-install dahil kulang ang storage space. Para magbakante ng espasyo, mag-delete ng mga file sa storage ng device.</translation> @@ -7131,6 +7155,7 @@ <translation id="8102139037507939978">Alisin ang Impormasyong Nagbibigay ng Personal na Pagkakakilanlan sa system_logs.txt.</translation> <translation id="8104088837833760645">I-download ang profile ng eSIM</translation> <translation id="8105368624971345109">I-off</translation> +<translation id="8105541061909542455">{NUM_APPS,plural, =1{Hindi Suportadong App}one{Mga Hindi Suportadong App}other{Mga Hindi Suportadong App}}</translation> <translation id="8107015733319732394">Ini-install ang Google Play Store sa iyong <ph name="DEVICE_TYPE" />. Maaaring abutin ito nang ilang minuto.</translation> <translation id="810728361871746125">Resolution ng display</translation> <translation id="8108526232944491552">{COUNT,plural, =0{Walang third-party na cookies}=1{1 third-party na cookie ang na-block}one{# third-party na cookies ang na-block}other{# na third-party na cookies ang na-block}}</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index 3c0afb63..b00e41ce 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -1329,6 +1329,7 @@ <translation id="2278562042389100163">Ouvrir une fenêtre de navigateur</translation> <translation id="2278668501808246459">Démarrage du gestionnaire de conteneur en cours…</translation> <translation id="2280486287150724112">Marge de droite</translation> +<translation id="2281863813036651454">Clic gauche de la souris</translation> <translation id="2282146716419988068">Processus de GPU</translation> <translation id="2285109769884538519">{COUNT,plural, =0{Tout ouvrir dans &un nouveau groupe d'onglets}=1{Tout ouvrir dans &un nouveau groupe d'onglets}one{Tout ouvrir ({COUNT}) dans un nouveau groupe d'onglets}other{Tout ouvrir ({COUNT}) dans un nouveau groupe d'onglets}}</translation> <translation id="2285942871162473373">Impossible de reconnaître votre empreinte digitale. Réessayez.</translation> @@ -5144,6 +5145,7 @@ <translation id="6129938384427316298">Commentaire du certificat Netscape</translation> <translation id="6129953537138746214">Espace</translation> <translation id="6130692320435119637">Ajouter un réseau Wi-Fi</translation> +<translation id="6130887916931372608">Touche de clavier</translation> <translation id="6136114942382973861">Fermer la barre des téléchargements</translation> <translation id="6136287496450963112">Votre clé de sécurité n'est pas protégée par un NIP. Pour gérer les empreintes digitales, commencez par créer un NIP.</translation> <translation id="6138680304137685902">Signature X9.62 ECDSA avec SHA-384</translation> @@ -6756,6 +6758,7 @@ <translation id="7768770796815395237">Changer</translation> <translation id="7768784765476638775">Sélectionner pour énoncer</translation> <translation id="7770406201819593386">Exécutez les tests de diagnostic de Chrome OS Flex.</translation> +<translation id="7770450735129978837">Clic droit de la souris</translation> <translation id="7770612696274572992">Image copiée d'un autre appareil</translation> <translation id="7771452384635174008">Disposition</translation> <translation id="7772032839648071052">Confirmer la phrase de passe</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index de86fcc..752533c6 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -1329,6 +1329,7 @@ <translation id="2278562042389100163">Ouvrir une fenêtre du navigateur</translation> <translation id="2278668501808246459">Démarrage du gestionnaire de conteneurs</translation> <translation id="2280486287150724112">Marge droite</translation> +<translation id="2281863813036651454">Clic gauche de la souris</translation> <translation id="2282146716419988068">GPU</translation> <translation id="2285109769884538519">{COUNT,plural, =0{Tout ouvrir dans un &nouveau groupe d'onglets}=1{Ouvrir dans un &nouveau groupe d'onglets}one{Tout ouvrir ({COUNT}) dans un &nouveau groupe d'onglets}other{Tout ouvrir ({COUNT}) dans un &nouveau groupe d'onglets}}</translation> <translation id="2285942871162473373">Nous ne reconnaissons pas votre empreinte digitale. Réessayez.</translation> @@ -5144,6 +5145,7 @@ <translation id="6129938384427316298">Commentaire du certificat Netscape</translation> <translation id="6129953537138746214">Espace</translation> <translation id="6130692320435119637">Ajouter un réseau Wi-Fi</translation> +<translation id="6130887916931372608">Touche du clavier</translation> <translation id="6136114942382973861">Fermer la barre de téléchargements</translation> <translation id="6136287496450963112">Votre clé de sécurité n'est pas protégée par un code. Pour gérer les empreintes digitales, vous devez d'abord en créer un.</translation> <translation id="6138680304137685902">Signature X9.62 ECDSA avec SHA-384</translation> @@ -6756,6 +6758,7 @@ <translation id="7768770796815395237">Modifier</translation> <translation id="7768784765476638775">Sélectionner pour prononcer</translation> <translation id="7770406201819593386">Exécuter des tests de diagnostic Chrome OS Flex.</translation> +<translation id="7770450735129978837">Clic droit de la souris</translation> <translation id="7770612696274572992">Image copiée depuis un autre appareil</translation> <translation id="7771452384635174008">Mise en page</translation> <translation id="7772032839648071052">Confirmez la phrase secrète</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index d6770db..d5f78ee 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -1327,6 +1327,7 @@ <translation id="2278562042389100163">Abrir ventá do navegador</translation> <translation id="2278668501808246459">Iniciando xestor de contedores</translation> <translation id="2280486287150724112">Marxe dereita</translation> +<translation id="2281863813036651454">Clic co botón esquerdo do rato</translation> <translation id="2282146716419988068">Proceso de GPU</translation> <translation id="2285109769884538519">{COUNT,plural, =0{Abrir todas as ligazóns nun grupo de pestanas &novo}=1{Abrir ligazón nun grupo de pestanas &novo}other{Abrir todas as ligazóns ({COUNT}) nun grupo de pestanas &novo}}</translation> <translation id="2285942871162473373">Non se puido recoñecer a túa impresión dixital. Téntao de novo.</translation> @@ -5140,6 +5141,7 @@ <translation id="6129938384427316298">Comentario do certificado de Netscape</translation> <translation id="6129953537138746214">Espazo</translation> <translation id="6130692320435119637">Engadir wifi</translation> +<translation id="6130887916931372608">Tecla do teclado</translation> <translation id="6136114942382973861">Pechar barra de descargas</translation> <translation id="6136287496450963112">A túa chave de seguranza non está protexida cun PIN. Para xestionar as impresións dixitais, primeiro crea un PIN.</translation> <translation id="6138680304137685902">Sinatura X9.62 ECDSA con SHA-384</translation> @@ -6752,6 +6754,7 @@ <translation id="7768770796815395237">Cambiar</translation> <translation id="7768784765476638775">Escoitar selección</translation> <translation id="7770406201819593386">Executar probas de diagnóstico de Chrome OS Flex.</translation> +<translation id="7770450735129978837">Clic co botón dereito do rato</translation> <translation id="7770612696274572992">Copiouse a imaxe desde outro dispositivo</translation> <translation id="7771452384635174008">Deseño</translation> <translation id="7772032839648071052">Confirmar frase de acceso</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 9eaf8a1..c5f977d 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -1326,6 +1326,7 @@ <translation id="2278562042389100163">બ્રાઉઝર વિંડો ખોલો</translation> <translation id="2278668501808246459">કન્ટેનર મેનેજર શરૂ કરી રહ્યાં છીએ</translation> <translation id="2280486287150724112">જમણો હાસિયો</translation> +<translation id="2281863813036651454">માઉસનું ડાબું ક્લિક</translation> <translation id="2282146716419988068">GPU પ્રક્રિયા</translation> <translation id="2285109769884538519">{COUNT,plural, =0{બધું &નવા ટૅબ ગ્રૂપમાં ખોલો}=1{&નવા ટૅબ ગ્રૂપમાં ખોલો}one{({COUNT})ને &નવા ટૅબ ગ્રૂપમાં ખોલો}other{બધા ({COUNT})ને &નવા ટૅબ ગ્રૂપમાં ખોલો}}</translation> <translation id="2285942871162473373">તમારી ફિંગરપ્રિન્ટ ઓળખી શક્યાં નહીં. ફરી પ્રયાસ કરો.</translation> @@ -5142,6 +5143,7 @@ <translation id="6129938384427316298">નેટસ્કેપ પ્રમાણપત્ર ટિપ્પણી</translation> <translation id="6129953537138746214">જગ્યા</translation> <translation id="6130692320435119637">વાઇ-ફાઇ ઉમેરો</translation> +<translation id="6130887916931372608">કીબોર્ડની કી</translation> <translation id="6136114942382973861">ડાઉનલોડ બાર બંધ કરો</translation> <translation id="6136287496450963112">તમારી 'સિક્યુરિટી કી' પિન વડે સુરક્ષિત નથી. ફિંગરપ્રિન્ટ મેનેજ કરવા માટે, પહેલાં પિન બનાવો.</translation> <translation id="6138680304137685902">SHA-384 સાથે X9.62 ECDSA સહી</translation> @@ -6754,6 +6756,7 @@ <translation id="7768770796815395237">બદલો</translation> <translation id="7768784765476638775">સાંભળવા માટે પસંદ કરો</translation> <translation id="7770406201819593386">ChromeOS Flex ડાયગ્નોસ્ટિક પરીક્ષણો ચલાવો.</translation> +<translation id="7770450735129978837">માઉસનું જમણું ક્લિક</translation> <translation id="7770612696274572992">અન્ય ડિવાઇસમાંથી કૉપિ કરવામાં આવેલી છબી</translation> <translation id="7771452384635174008">લેઆઉટ</translation> <translation id="7772032839648071052">પાસફ્રેઝની પુષ્ટિ કરો</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index 5fd6db2..02abdb3 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -1265,6 +1265,7 @@ <translation id="2218019600945559112">Մկնիկ և հպահարթակ</translation> <translation id="2218320521449013367">Վնասաբեր ծրագրեր հեռացնելիս սխալ առաջացավ</translation> <translation id="2218515861914035131">Տեղադրել որպես պարզ տեքստ</translation> +<translation id="2219658597883514593">Նորից բացել ուղեցույցը</translation> <translation id="2220409419896228519">Ավելացրեք էջանիշներ ձեր նախընտրած Google հավելվածներում։</translation> <translation id="2220529011494928058">Հաղորդել խնդրի մասին</translation> <translation id="2220572644011485463">PIN կոդը կամ գաղտնաբառը</translation> @@ -2408,6 +2409,7 @@ <translation id="3378627645871606983">Թույլտվությունները, որոնք տրամադրվել են Steam հարթակին, գործում են դրա միջոցով տեղադրված բոլոր խաղերի և հավելվածների համար։</translation> <translation id="337920581046691015">Կտեղադրվի <ph name="PRODUCT_NAME" />-ը:</translation> <translation id="3380365263193509176">Անհայտ սխալ</translation> +<translation id="3380850890226973980">Հարցնել հաջորդ անգամ</translation> <translation id="3382073616108123819">Համակարգը չճանաչեց սարքի նույնացուցիչները:</translation> <translation id="3382200254148930874">Ծնողական վերահսկողությունն անջատվում է…</translation> <translation id="338323348408199233">Արգելափակել առանց VPN-ի թրաֆիկը</translation> @@ -3196,6 +3198,10 @@ <translation id="4110490973560452005">Ներբեռնումն ավարտվեց. <ph name="FILE_NAME" />: Սեղմեք Shift+F6՝ ներբեռնումների գոտու տարածք անցնելու համար:</translation> <translation id="4110686435123617899">Ընտրեք ալբոմը՝ «<ph name="TITLE" />» (<ph name="DESC" />)</translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (անցանց)</translation> +<translation id="4114524937989710624">Այս առաջարկվող ֆայլերը կօգնեն ձեզ արագ անցնել վերջին գործողություններին Google-ում։ + <ph name="BREAK" /> + <ph name="BREAK" /> + Դուք կարող եք կառավարել կարգավորումները քարտի ընտրացանկից կամ դիտել լրացուցիչ ընտրանքները «Կարգավորել Chrome-ը» բաժնում։</translation> <translation id="4115002065223188701">Դուք ցանցի ծածկույթից դուրս եք</translation> <translation id="4115378294792113321">Ծիրանեգույն</translation> <translation id="4116704186509653070">Նորից բացել</translation> @@ -3703,6 +3709,10 @@ <translation id="4651484272688821107">Չհաջողվեց առցանց բաղադրիչը բեռնել դեմո ռեժիմի ռեսուրսներով։</translation> <translation id="4652935475563630866">Վերագործարկեք Parallels Desktop-ը, որպեսզի տեսախցիկի կարգավորումը փոխվի, և դուք կարողանաք շարունակել աշխատանքը։</translation> <translation id="4653405415038586100">Չհաջողվեց կարգավորել Լինուքսը</translation> +<translation id="465406513924180949">Այս զամբյուղները կօգնեն ձեզ համացանցում արագ անցնել գնումների զամբյուղներ, որտեղ ապրանքներ եք թողել։ + <ph name="BREAK" /> + <ph name="BREAK" /> + Դուք կարող եք կառավարել կարգավորումները քարտի ընտրացանկից կամ դիտել լրացուցիչ ընտրանքները «Կարգավորել Chrome-ը» բաժնում։</translation> <translation id="4654236001025007561">Կիսվեք ֆայլերով մոտակայքում գտնվող Chromebook և Android սարքերի հետ</translation> <translation id="4657914796247705218">TrackPoint-ի արագությունը</translation> <translation id="4658285806588491142">Պաշտպանեք էկրանի բովանդակությունը հետաքրքրասեր աչքերից</translation> @@ -4146,6 +4156,7 @@ <translation id="5121130586824819730">Ձեր կոշտ սկավառակը լցված է: Պահեք այլ տեղադրությունում կամ տեղ ազատեք կոշտ սկավառակի վրա:</translation> <translation id="5123433949759960244">Բասկետբոլ</translation> <translation id="5125751979347152379">URL-ն անվավեր է:</translation> +<translation id="5125967981703109366">Այս քարտի մասին</translation> <translation id="5126611267288187364">Դիտել փոփոխությունները</translation> <translation id="5127242257756472928">Չի թույլատրվում օգտագործել ձեր էկրանների մասին տեղեկությունները՝ պատուհաններ բացելու և տեղակայելու նպատակով</translation> <translation id="5127620150973591153">Անվտանգ միացման կոդ՝ <ph name="TOKEN" /></translation> @@ -4207,6 +4218,7 @@ <translation id="5185500136143151980">Կապ չկա</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Վերապրեք լավագույն պահերը։ Ալբոմ ավելացնելու կամ առկա ալբոմներում փոփոխություններ անելու համար անցեք <ph name="LINK_BEGIN" />Google Լուսանկարներ<ph name="LINK_END" />։</translation> +<translation id="5190316321948122159">{NUM_APPS,plural, =1{Ջնջել հավելվածը հիմա}one{Ջնջել հավելվածը հիմա}other{Ջնջել հավելվածները հիմա}}</translation> <translation id="5190926251776387065">Ակտիվացնել միացքը</translation> <translation id="5191094172448199359">Ձեր մուտքագրած PIN կոդերը չեն համընկնում</translation> <translation id="5191251636205085390">Իմացեք ավելին նոր տեխնոլոգիաների մասին, որոնք փոխարինելու են երրորդ կողմի քուքիներին։</translation> @@ -4381,6 +4393,7 @@ <translation id="5342091991439452114">PIN կոդը պետք է առնվազն <ph name="MINIMUM" /> թիվ պարունակի</translation> <translation id="5344036115151554031">Լինուքսի վերականգնում</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (աջ)</translation> +<translation id="534572711507965074">Անվանեք ձեր խումբը, ընտրեք գույն և սեղմեք Enter։</translation> <translation id="5345916423802287046">Գործարկել հավելվածը մուտք գործելիս</translation> <translation id="5350293332385664455">Անջատել Google Օգնականը</translation> <translation id="535123479159372765">Տեքստը պատճենվեց այլ սարքից</translation> @@ -4961,6 +4974,7 @@ <translation id="5946591249682680882">Հաշվետվության ID <ph name="WEBRTC_LOG_REPORT_ID" /></translation> <translation id="5948536763493709626">Սարքին միացրեք ստեղնաշար կամ մկնիկ կամ կարգավորումը շարունակեք հպէկրանի միջոցով։ Bluetooth սարքեր օգտագործելու դեպքում համոզվեք, որ դրանք պատրաստ են զուգակցման։</translation> <translation id="5949544233750246342">Հնարավոր չէ վերլուծել ֆայլը</translation> +<translation id="5950039854561387265">Հարցնել հաջորդ անգամ</translation> <translation id="5950819593680344519">Chrome-ը ձեր համակարգչում վնասաբեր ծրագրեր չի հայտնաբերել • Ստուգվել է երեկ</translation> <translation id="5951303645598168883"><ph name="ORIGIN" /> կայքն ուզում է օգտագործել տեղական տառատեսակներ</translation> <translation id="5951624318208955736">Մոնիտոր</translation> @@ -5131,6 +5145,10 @@ <translation id="6116921718742659598">Փոխել լեզուն և ներածման կարգավորումները</translation> <translation id="6119927814891883061"><ph name="DEVICE_NAME" /> սարքի անվան փոփոխություն</translation> <translation id="6120205520491252677">Ամրացնել այս էջը մեկնարկի էկրանին…</translation> +<translation id="6120707837086723438">Այս առաջարկվող բաղադրատոմսերն ընտրվել են որոնումների պատմությունից ձեր վերջին հարցումների հիման վրա։ + <ph name="BREAK" /> + <ph name="BREAK" /> + Դուք կարող եք կառավարել կարգավորումները քարտի ընտրացանկից կամ դիտել լրացուցիչ ընտրանքները «Կարգավորել Chrome-ը» բաժնում։</translation> <translation id="6121773125605585883">Դիտել <ph name="WEBSITE" /> կայքի համար <ph name="USERNAME" />-ի գաղտնաբառը</translation> <translation id="6122081475643980456">Ձեր կապակցումը համացանցին վերահսկվում է</translation> <translation id="6122093587541546701">Էլփոստ պարտադիր չէ՝</translation> @@ -5223,6 +5241,7 @@ <translation id="6218058416316985984"><ph name="DEVICE_TYPE" /> սարքը միացված չէ համացանցին: Միացրեք այն համացանցին և նորից փորձեք:</translation> <translation id="6220413761270491930">Ընդլայնումը բեռնելիս սխալ առաջացավ</translation> <translation id="6223447490656896591">Անհատականացված պատկեր</translation> +<translation id="62236885217374510">{NUM_APPS,plural, =1{Ջնջել հավելվածը հիմա}one{Ջնջել հավելվածը հիմա}other{Ջնջել հավելվածները հիմա}}</translation> <translation id="6224481128663248237">Ձևաչափումը բարեհաջող ավարտվեց:</translation> <translation id="622537739776246443">Պրոֆիլը կհեռացվի</translation> <translation id="6225475702458870625">Հասանելի է բջջային ինտերնետ ձեր <ph name="PHONE_NAME" /> սարքից</translation> @@ -5855,6 +5874,7 @@ <translation id="6846178040388691741">«<ph name="EXTENSION_NAME" />» ընդլայնմանն անհրաժեշտ է տպել <ph name="FILE_NAME" /> ֆայլը <ph name="PRINTER_NAME" /> տպիչի միջոցով։</translation> <translation id="6847125920277401289">Շարունակելու համար սարքում տարածք ազատեք</translation> <translation id="6848388270925200958">Տվյալ պահին ձեր քարտերից որոշները կարող են օգտագործվել միայն այս սարքում</translation> +<translation id="6848425544473873717">{NUM_APPS,plural, =1{Ձեր հավելվածներից 1-ն այլևս չի աջակցվում։ <ph name="LEARN_MORE" />}one{Ձեր հավելվածներից #-ն այլևս չի աջակցվում։ <ph name="LEARN_MORE" />}other{Ձեր հավելվածներից #-ն այլևս չի աջակցվում։ <ph name="LEARN_MORE" />}}</translation> <translation id="6848716236260083778">Մատնահետքը կարգավորելու համար ձեր երեխան պետք է հպի մատնահետքերի սկաներին։ Երեխայի մատնահետքի տվյալները ապահով պահվում են այս <ph name="DEVICE_TYPE" /> սարքում և երբեք չեն փոխանցվում այլ անձանց։</translation> <translation id="6850286078059909152">Տեքստի գույնը</translation> <translation id="6851181413209322061">Օգտագործման և դիագնոստիկ տվյալների ուղարկում։ Այս սարքը Google-ին ավտոմատ ուղարկում է ախտորոշման, ինչպես նաև սարքի և հավելվածի օգտագործման մասին տվյալներ։ Այս տեղեկությունները չեն օգտագործվի ձեր երեխային նույնականացնելու համար և կօգնեն բարելավել համակարգի ու հավելվածի աշխատանքի կայունությունը։ Հավաքված տեղեկությունների մի մասը օգտակար կլինի մեր գործընկերների, օրինակ, Android ծրագրավորողների համար։ Այս կարգավորումը պարտադրված է սեփականատիրոջ կողմից։ Եթե Վեբ որոնման և հավելվածների լրացուցիչ պատմությունը միացված է, այս տվյալները կպահվեն երեխայի Google հաշվում։</translation> @@ -6735,6 +6755,10 @@ <translation id="7744192722284567281">Հայտնաբերվել է տվյալների արտահոսքում</translation> <translation id="7744649840067671761">Սեղմեք որևէ փոխանջատիչ կամ ստեղնաշարի ստեղն՝ նշանակումը սկսելու համար։ Նշանակումը չեղարկելու համար սեղմեք նշանակված փոխանջատիչը կամ ստեղնը։</translation> +<translation id="7746739418892731373">Լավագույն պահերով այս լուսանկարներն ու տեսանյութերը Google Լուսանկարների ֆոտոդարանից են։ Լավագույն պահերի կարգավորումները կարող եք կառավարել <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" /> էջում։ + <ph name="BREAK" /> + <ph name="BREAK" /> + Դուք կարող եք կառավարել այս քարտի կարգավորումները քարտի ընտրացանկից կամ դիտել լրացուցիչ ընտրանքները «Կարգավորել Chrome-ը» բաժնում։</translation> <translation id="7750228210027921155">Նկար նկարի մեջ</translation> <translation id="7751260505918304024">Ցույց տալ բոլորը</translation> <translation id="7753735457098489144">Չհաջողվեց տեղադրել։ Հիշողությունը բավարար չէ։ Տարածք ազատելու համար սարքի հիշողությունից ֆայլեր ջնջեք։</translation> @@ -7115,6 +7139,7 @@ <translation id="8102139037507939978">Հեռացնել անձը նույնականացնող տեղեկությունները system_logs.txt ֆայլից։</translation> <translation id="8104088837833760645">Ներբեռնել eSIM պրոֆիլը</translation> <translation id="8105368624971345109">Անջատել</translation> +<translation id="8105541061909542455">{NUM_APPS,plural, =1{Չաջակցվող հավելված}one{Չաջակցվող հավելված}other{Չաջակցվող հավելվածներ}}</translation> <translation id="8107015733319732394">Google Play Խանութը տեղադրվում է <ph name="DEVICE_TYPE" /> սարքում։ Սա կարող է մի քանի րոպե տևել։</translation> <translation id="810728361871746125">Էկրանի լուծաչափ</translation> <translation id="8108526232944491552">{COUNT,plural, =0{Երրորդ կողմի քուքիներ չկան}=1{Երրորդ կողմի 1 քուքի արգելափակված է}one{Երրորդ կողմի # քուքի արգելափակված է}other{Երրորդ կողմի # քուքի արգելափակված է}}</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 11e661cd..325e8fb18 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -1275,6 +1275,7 @@ <translation id="2218019600945559112">Mouse dan touchpad</translation> <translation id="2218320521449013367">Terjadi error saat Chrome menghapus software berbahaya</translation> <translation id="2218515861914035131">Tempel sebagai teks biasa</translation> +<translation id="2219658597883514593">Mulai ulang tutorial</translation> <translation id="2220409419896228519">Tambahkan bookmark ke aplikasi Google favorit Anda</translation> <translation id="2220529011494928058">Laporkan masalah</translation> <translation id="2220572644011485463">PIN atau sandi</translation> @@ -2422,6 +2423,7 @@ <translation id="3378627645871606983">Izin yang diizinkan untuk Steam berlaku untuk semua game dan aplikasi Steam.</translation> <translation id="337920581046691015"><ph name="PRODUCT_NAME" /> akan dipasang.</translation> <translation id="3380365263193509176">Kesalahan tidak dikenal</translation> +<translation id="3380850890226973980">Tanyakan lain kali</translation> <translation id="3382073616108123819">Ups! Sistem gagal menentukan pengenal perangkat untuk perangkat ini.</translation> <translation id="3382200254148930874">Menghentikan pengawasan...</translation> <translation id="338323348408199233">Blokir traffic tanpa VPN</translation> @@ -3210,6 +3212,10 @@ <translation id="4110490973560452005">Download selesai: <ph name="FILE_NAME" />. Tekan Shift+F6 untuk masuk ke area kotak download</translation> <translation id="4110686435123617899">Pilih album <ph name="TITLE" /> <ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (offline)</translation> +<translation id="4114524937989710624">Anda melihat saran file untuk membantu Anda kembali ke aktivitas terbaru Anda di Google Drive dengan mudah. + <ph name="BREAK" /> + <ph name="BREAK" /> + Anda dapat mengelola setelan dari menu kartu atau melihat opsi lainnya di Sesuaikan Chrome.</translation> <translation id="4115002065223188701">Jaringan di luar jangkauan</translation> <translation id="4115378294792113321">Magenta</translation> <translation id="4116704186509653070">Buka lagi</translation> @@ -3718,6 +3724,10 @@ <translation id="4651484272688821107">Tidak dapat memuat komponen online dengan resource mode demo.</translation> <translation id="4652935475563630866">Perubahan pada setelan kamera mengharuskan Parallels Desktop diluncurkan kembali. Luncurkan kembali Parallels Desktop untuk melanjutkan.</translation> <translation id="4653405415038586100">Error saat mengonfigurasi Linux</translation> +<translation id="465406513924180949">Anda melihat keranjang yang membantu Anda kembali dengan mudah ke item yang Anda tinggalkan di keranjang belanja di seluruh web. + <ph name="BREAK" /> + <ph name="BREAK" /> + Anda dapat mengelola setelan dari menu kartu atau melihat opsi lainnya di Sesuaikan Chrome.</translation> <translation id="4654236001025007561">Berbagi file dengan Chromebook dan perangkat Android di sekitar Anda</translation> <translation id="4657914796247705218">Kecepatan TrackPoint</translation> <translation id="4658285806588491142">Jaga kerahasiaan layar Anda</translation> @@ -4160,6 +4170,7 @@ <translation id="5121130586824819730">Hard disk Anda sudah penuh. Simpan ke lokasi lain atau kosongkan lebih banyak ruang pada hard disk.</translation> <translation id="5123433949759960244">Bola basket</translation> <translation id="5125751979347152379">URL tidak valid.</translation> +<translation id="5125967981703109366">Tentang kartu ini</translation> <translation id="5126611267288187364">Lihat perubahan</translation> <translation id="5127242257756472928">Tidak diizinkan untuk menggunakan info tentang layar Anda guna membuka dan menempatkan jendela</translation> <translation id="5127620150973591153">ID koneksi aman: <ph name="TOKEN" /></translation> @@ -4221,6 +4232,7 @@ <translation id="5185500136143151980">Tidak ada internet</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Hidupkan kembali memori favorit Anda. Untuk menambahkan atau mengedit album, buka <ph name="LINK_BEGIN" />Google Foto<ph name="LINK_END" />.</translation> +<translation id="5190316321948122159">{NUM_APPS,plural, =1{Hapus aplikasi sekarang}other{Hapus aplikasi sekarang}}</translation> <translation id="5190926251776387065">Aktifkan port</translation> <translation id="5191094172448199359">PIN yang Anda masukkan tidak cocok</translation> <translation id="5191251636205085390">Pelajari dan kontrol teknologi baru yang ditujukan untuk menggantikan cookie pihak ketiga</translation> @@ -4393,6 +4405,7 @@ <translation id="5342091991439452114">PIN minimal harus <ph name="MINIMUM" /> digit</translation> <translation id="5344036115151554031">Memulihkan Linux</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (Kanan)</translation> +<translation id="534572711507965074">Beri nama grup, pilih warna, lalu ketuk Enter</translation> <translation id="5345916423802287046">Mulai aplikasi saat login</translation> <translation id="5350293332385664455">Nonaktifkan Asisten Google</translation> <translation id="535123479159372765">Teks disalin dari perangkat lain</translation> @@ -4973,6 +4986,7 @@ <translation id="5946591249682680882">ID Laporan <ph name="WEBRTC_LOG_REPORT_ID" /></translation> <translation id="5948536763493709626">Hubungkan keyboard atau mouse, atau lanjutkan penyiapan menggunakan layar sentuh. Jika Anda menggunakan perangkat Bluetooth, pastikan perangkat siap disambungkan.</translation> <translation id="5949544233750246342">Tidak dapat mengurai file</translation> +<translation id="5950039854561387265">Tanyakan Lain Kali</translation> <translation id="5950819593680344519">Chrome tidak menemukan software berbahaya di komputer Anda • Diperiksa kemarin</translation> <translation id="5951303645598168883"><ph name="ORIGIN" /> ingin menggunakan font lokal</translation> <translation id="5951624318208955736">Monitor</translation> @@ -5143,6 +5157,10 @@ <translation id="6116921718742659598">Ubah setelan masukan dan bahasa</translation> <translation id="6119927814891883061">Beri nama perangkat untuk <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Pasang pin halaman ini ke layar Awal...</translation> +<translation id="6120707837086723438">Anda melihat resep yang disarankan berdasarkan Aktivitas penelusuran terbaru Anda terkait resep. + <ph name="BREAK" /> + <ph name="BREAK" /> + Anda dapat mengelola setelan dari menu kartu atau melihat opsi lainnya di Sesuaikan Chrome.</translation> <translation id="6121773125605585883">Lihat sandi dengan nama pengguna <ph name="USERNAME" /> untuk <ph name="WEBSITE" /></translation> <translation id="6122081475643980456">Koneksi internet Anda sedang dikendalikan</translation> <translation id="6122093587541546701">Email (opsional):</translation> @@ -5235,6 +5253,7 @@ <translation id="6218058416316985984"><ph name="DEVICE_TYPE" /> offline. Sambungkan ke internet, lalu coba lagi.</translation> <translation id="6220413761270491930">Terjadi Kesalahan Saat Memuat Ekstensi</translation> <translation id="6223447490656896591">Gambar Khusus:</translation> +<translation id="62236885217374510">{NUM_APPS,plural, =1{Hapus Aplikasi Sekarang}other{Hapus Aplikasi Sekarang}}</translation> <translation id="6224481128663248237">Berhasil menyelesaikan pemformatan!</translation> <translation id="622537739776246443">Profil akan dihapus</translation> <translation id="6225475702458870625">Koneksi data tersedia dari <ph name="PHONE_NAME" /> Anda</translation> @@ -5867,6 +5886,7 @@ <translation id="6846178040388691741">"<ph name="EXTENSION_NAME" />" ingin mencetak <ph name="FILE_NAME" /> dengan <ph name="PRINTER_NAME" />.</translation> <translation id="6847125920277401289">Kosongkan ruang untuk melanjutkan</translation> <translation id="6848388270925200958">Sekarang, Anda memiliki beberapa kartu yang hanya dapat digunakan di perangkat ini</translation> +<translation id="6848425544473873717">{NUM_APPS,plural, =1{1 aplikasi Anda tidak lagi didukung. <ph name="LEARN_MORE" />}other{# aplikasi Anda tidak lagi didukung. <ph name="LEARN_MORE" />}}</translation> <translation id="6848716236260083778">Untuk menyiapkan sidik jari, minta anak Anda menyentuh sensor sidik jari. Data sidik jari anak Anda disimpan dengan aman dan hanya ada di <ph name="DEVICE_TYPE" /> ini.</translation> <translation id="6850286078059909152">Warna teks</translation> <translation id="6851181413209322061">Kirimkan data penggunaan dan diagnostik. Perangkat ini saat ini otomatis mengirimkan data diagnostik, perangkat, dan penggunaan aplikasi ke Google. Data ini tidak akan digunakan untuk mengidentifikasi anak Anda dan akan membantu sistem dan stabilitas aplikasi serta penyempurnaan lainnya. Beberapa data gabungan juga akan membantu aplikasi dan partner Google, seperti developer Android. Setelan ini diterapkan oleh pemilik. Jika Aktivitas Web & Aplikasi tambahan diaktifkan untuk anak Anda, data ini mungkin akan disimpan ke Akun Google miliknya.</translation> @@ -6747,6 +6767,10 @@ <translation id="7744192722284567281">Ditemukan di pelanggaran data</translation> <translation id="7744649840067671761">Tekan tombol akses atau tombol keyboard baru untuk memulai penetapan. Tekan tombol akses atau tombol keyboard yang telah ditetapkan untuk menghapus penetapan.</translation> +<translation id="7746739418892731373">Anda melihat sorotan foto dan video dari galeri Google Foto Anda. Anda dapat mengontrol apa yang ditampilkan di sorotan Anda di <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" />. + <ph name="BREAK" /> + <ph name="BREAK" /> + Anda dapat mengelola setelan kartu ini dari menu kartu atau melihat opsi lainnya di Sesuaikan Chrome.</translation> <translation id="7750228210027921155">Picture-in-picture</translation> <translation id="7751260505918304024">Tampilkan semua</translation> <translation id="7753735457098489144">Gagal menginstal karena ruang penyimpanan tidak cukup. Untuk mengosongkan ruang, hapus file dari penyimpanan perangkat.</translation> @@ -7130,6 +7154,7 @@ <translation id="8102139037507939978">Hapus Informasi Identitas Pribadi dari system_logs.txt.</translation> <translation id="8104088837833760645">Download profil eSIM</translation> <translation id="8105368624971345109">Nonaktifkan</translation> +<translation id="8105541061909542455">{NUM_APPS,plural, =1{Aplikasi Tidak Didukung}other{Aplikasi Tidak Didukung}}</translation> <translation id="8107015733319732394">Menginstal Google Play Store di <ph name="DEVICE_TYPE" />. Tindakan ini dapat memakan waktu beberapa menit.</translation> <translation id="810728361871746125">Resolusi layar</translation> <translation id="8108526232944491552">{COUNT,plural, =0{Tidak ada cookie pihak ketiga}=1{1 cookie pihak ketiga diblokir}other{# cookie pihak ketiga diblokir}}</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index af00bf4..79eb808 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -1276,6 +1276,7 @@ <translation id="2218019600945559112">Mús og snertiflötur</translation> <translation id="2218320521449013367">Villa kom upp þegar Chrome fjarlægði skaðlegan hugbúnað</translation> <translation id="2218515861914035131">Líma sem ósniðinn texta</translation> +<translation id="2219658597883514593">Endurræsa leiðsögn</translation> <translation id="2220409419896228519">Bæta bókamerkjum við eftirlætis Google forritin þín</translation> <translation id="2220529011494928058">Tilkynna vandamál</translation> <translation id="2220572644011485463">PIN-númer eða aðgangsorð</translation> @@ -1344,6 +1345,7 @@ <translation id="2278562042389100163">Opna vafraglugga</translation> <translation id="2278668501808246459">Ræsir geymisstjórnandann</translation> <translation id="2280486287150724112">Hægri spássía</translation> +<translation id="2281863813036651454">Vinstri músarsmellur</translation> <translation id="2282146716419988068">Skjákortsvinnsla</translation> <translation id="2285109769884538519">{COUNT,plural, =0{Opna allt í &nýjum flipahóp}=1{Opna í &nýjum flipahóp}one{Opna allt ({COUNT}) í &nýjum flipahóp}other{Opna allt ({COUNT}) í &nýjum flipahóp}}</translation> <translation id="2285942871162473373">Fingrafarið þekktist ekki. Reyndu aftur.</translation> @@ -2421,6 +2423,7 @@ <translation id="3378627645871606983">Heimildir sem eru veittar Steam gilda um alla leiki og forrit Steam.</translation> <translation id="337920581046691015"><ph name="PRODUCT_NAME" /> verður sett upp.</translation> <translation id="3380365263193509176">Óþekkt villa</translation> +<translation id="3380850890226973980">Spyrja næst</translation> <translation id="3382073616108123819">Úbbs! Kerfið gat ekki ákvarðað tækisauðkenni fyrir þetta tæki.</translation> <translation id="3382200254148930874">Eftirlit stöðvað...</translation> <translation id="338323348408199233">Loka á umferð án VPN</translation> @@ -3209,6 +3212,10 @@ <translation id="4110490973560452005">Niðurhali lokið: <ph name="FILE_NAME" />. Ýttu á Shift+F6 til að fara á niðurhalsstikuna.</translation> <translation id="4110686435123617899">Velja albúm <ph name="TITLE" /> <ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (ekki nettengt)</translation> +<translation id="4114524937989710624">Þú sérð skráatillögur sem auðvelda þér að halda áfram í nýjustu virkni þinni á Google Drive. + <ph name="BREAK" /> + <ph name="BREAK" /> + Þú getur stjórnað stillingum á valmynd spjaldsins eða skoðað fleiri valkosti í „Sérsníða Chrome“.</translation> <translation id="4115002065223188701">Ekki næst í netkerfi</translation> <translation id="4115378294792113321">Bleikur</translation> <translation id="4116704186509653070">Opna aftur</translation> @@ -3717,6 +3724,10 @@ <translation id="4651484272688821107">Ekki var hægt að hlaða nettengdum íhluta með tilföngum prufustillingar.</translation> <translation id="4652935475563630866">Breytingin á myndavélarstillingu krefst þess að Parallels Desktop sé endurræst. Endurræstu Parallels Desktop til að halda áfram.</translation> <translation id="4653405415038586100">Villa við að stilla Linux</translation> +<translation id="465406513924180949">Þú sérð körfur sem auðvelda þér að endurheimta atriði sem þú skildir eftir í innkaupakörfum víðsvegar um netið. + <ph name="BREAK" /> + <ph name="BREAK" /> + Þú getur stjórnað stillingum á valmynd spjaldsins eða skoðað fleiri valkosti í „Sérsníða Chrome“.</translation> <translation id="4654236001025007561">Deildu skrám með nálægum Chromebook tölvum og Android tækjum</translation> <translation id="4657914796247705218">TrackPoint-hraði</translation> <translation id="4658285806588491142">Hafðu skjáinn út af fyrir þig</translation> @@ -4159,6 +4170,7 @@ <translation id="5121130586824819730">Harði diskurinn er fullur. Vistaðu á öðrum stað eða búðu til pláss á harða diskinum.</translation> <translation id="5123433949759960244">Körfubolti</translation> <translation id="5125751979347152379">Ógild vefslóð.</translation> +<translation id="5125967981703109366">Nánar um þetta spjald</translation> <translation id="5126611267288187364">Skoða breytingar</translation> <translation id="5127242257756472928">Má ekki nota upplýsingar um skjáina þína til að opna og staðsetja glugga</translation> <translation id="5127620150973591153">Auðkenni öruggrar tengingar: <ph name="TOKEN" /></translation> @@ -4220,6 +4232,7 @@ <translation id="5185500136143151980">Engin nettenging</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Upplifðu uppáhaldsstundirnar aftur. Opnaðu <ph name="LINK_BEGIN" />Google myndir<ph name="LINK_END" /> til að bæta við eða breyta albúmum.</translation> +<translation id="5190316321948122159">{NUM_APPS,plural, =1{Eyða forriti núna}one{Eyða forritum núna}other{Eyða forritum núna}}</translation> <translation id="5190926251776387065">Virkja gátt</translation> <translation id="5191094172448199359">PIN-númerin sem þú færðir inn stemma ekki</translation> <translation id="5191251636205085390">Kynntu þér og hafðu umsjón með nýrri tækni sem er ætlað að koma í stað fótspora þriðja aðila</translation> @@ -4392,6 +4405,7 @@ <translation id="5342091991439452114">PIN-númerið má ekki vera styttra en <ph name="MINIMUM" /> tölustafir</translation> <translation id="5344036115151554031">Endurheimtir Linux</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (hægri)</translation> +<translation id="534572711507965074">Gefðu hópnum heiti, veldu lit og ýttu á Enter</translation> <translation id="5345916423802287046">Ræsa forrit þegar þú skráir þig inn</translation> <translation id="5350293332385664455">Slökkva á Google hjálpara</translation> <translation id="535123479159372765">Texti afritaður úr öðru tæki</translation> @@ -4972,6 +4986,7 @@ <translation id="5946591249682680882">Auðkenni tilkynningar <ph name="WEBRTC_LOG_REPORT_ID" /></translation> <translation id="5948536763493709626">Tengdu lyklaborð eða mús eða haltu uppsetningu áfram á snertiskjánum. Ef þú ert að nota Bluetooth-tæki þarftu að tryggja að tækin séu tilbúin fyrir pörun.</translation> <translation id="5949544233750246342">Ekki er hægt að þátta skrá</translation> +<translation id="5950039854561387265">Spyrja næst</translation> <translation id="5950819593680344519">Chrome fann engan skaðlegan hugbúnað í tölvunni þinni • athugað í gær</translation> <translation id="5951303645598168883"><ph name="ORIGIN" /> vill nota staðbundnar leturgerðir</translation> <translation id="5951624318208955736">Skjár</translation> @@ -5142,6 +5157,10 @@ <translation id="6116921718742659598">Breyta tungumála- og innsláttarstillingum</translation> <translation id="6119927814891883061">Breyta heiti tækis í <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Festa þessa síðu á upphafsskjánum...</translation> +<translation id="6120707837086723438">Þú sérð uppskriftatillögur sem byggjast á nýlegum leitum þínum að uppskriftum. + <ph name="BREAK" /> + <ph name="BREAK" /> + Þú getur stjórnað stillingum á valmynd spjaldsins eða skoðað fleiri valkosti í „Sérsníða Chrome“.</translation> <translation id="6121773125605585883">Skoða aðgangsorð með notandanafnið <ph name="USERNAME" /> fyrir <ph name="WEBSITE" /></translation> <translation id="6122081475643980456">Tengingunni þinni við internetið er stýrt</translation> <translation id="6122093587541546701">Netfang (valfrjálst):</translation> @@ -5158,6 +5177,7 @@ <translation id="6129938384427316298">Athugasemd Netscape-vottorðs</translation> <translation id="6129953537138746214">Bil</translation> <translation id="6130692320435119637">Bæta Wi-Fi við</translation> +<translation id="6130887916931372608">Lykill á lyklaborði</translation> <translation id="6136114942382973861">Loka niðurhalsstiku</translation> <translation id="6136287496450963112">Öryggislykillinn þinn er ekki varinn með PIN-númeri. Til að hafa umsjón með fingraförum þarftu að búa til PIN-númer.</translation> <translation id="6138680304137685902">X9.62 ECDSA undirskrift með SHA-384</translation> @@ -5233,6 +5253,7 @@ <translation id="6218058416316985984"><ph name="DEVICE_TYPE" /> er án nettengingar. Tengdu við internetið og reyndu aftur.</translation> <translation id="6220413761270491930">Villa við að hlaða viðbót</translation> <translation id="6223447490656896591">Sérstillt mynd:</translation> +<translation id="62236885217374510">{NUM_APPS,plural, =1{Eyða forriti núna}one{Eyða forritum núna}other{Eyða forritum núna}}</translation> <translation id="6224481128663248237">Lokið við að sníða!</translation> <translation id="622537739776246443">Prófílnum verður eytt</translation> <translation id="6225475702458870625">Gagnatenging tiltæk úr <ph name="PHONE_NAME" /></translation> @@ -5865,6 +5886,7 @@ <translation id="6846178040388691741">„<ph name="EXTENSION_NAME" />“ vill prenta <ph name="FILE_NAME" /> með <ph name="PRINTER_NAME" />.</translation> <translation id="6847125920277401289">Losaðu um pláss til að halda áfram</translation> <translation id="6848388270925200958">Eins og er ertu með einhver kort sem aðeins er hægt að nota í þessu tæki</translation> +<translation id="6848425544473873717">{NUM_APPS,plural, =1{1 af forritum þínum er ekki lengur stutt. <ph name="LEARN_MORE" />}one{# af forritum þínum er ekki lengur stutt. <ph name="LEARN_MORE" />}other{# af forritum þínum eru ekki lengur studd. <ph name="LEARN_MORE" />}}</translation> <translation id="6848716236260083778">Láttu barnið snerta fingrafaralesarann til að setja upp fingrafar. Fingrafaragögn barnsins eru í öruggri geymslu og fara aldrei út fyrir þetta <ph name="DEVICE_TYPE" /> tæki.</translation> <translation id="6850286078059909152">Textalitur</translation> <translation id="6851181413209322061">Senda notkunar- og greiningargögn. Þetta tæki sendir núna sjálfkrafa greiningargögn, tækisgögn og upplýsingar um forritanotkun til Google. Þetta verður ekki notað til að bera kennsl á barnið þitt og mun stuðla að stöðugleika kerfa og forrita og öðrum endurbótum. Sum uppsöfnuð gögn munu einnig gagnast forritum og samstarfsaðilum Google, til dæmis þróunaraðilum Android. Eigandi valdi þessa stillingu. Ef kveikt er á ítarlegri vef- og forritavirkni fyrir barnið geta þessi gögn verið vistuð á Google reikningi barnsins.</translation> @@ -6745,6 +6767,10 @@ <translation id="7744192722284567281">Fannst í öryggisbroti</translation> <translation id="7744649840067671761">Ýttu á nýjan rofa eða lyklaborðshnapp til að hefja úthlutun. Ýttu á úthlutaðan rofa eða hnapp til að afturkalla úthlutun.</translation> +<translation id="7746739418892731373">Þú sérð helstu myndir og myndskeið úr safninu þínu í Google myndum. Þú getur stjórnað því hvaða hápunktar birtast á <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" />. + <ph name="BREAK" /> + <ph name="BREAK" /> + Þú getur stjórnað stillingum þessa spjalds á valmynd spjaldsins eða skoðað fleiri valkosti í „Sérsníða Chrome“.</translation> <translation id="7750228210027921155">Mynd í mynd</translation> <translation id="7751260505918304024">Sýna allt</translation> <translation id="7753735457098489144">Uppsetning mistókst vegna skorts á geymslurými. Eyddu skrám úr geymslu tækisins til að losa um pláss.</translation> @@ -6770,6 +6796,7 @@ <translation id="7768770796815395237">Breyta</translation> <translation id="7768784765476638775">Textaupplestur</translation> <translation id="7770406201819593386">Keyra greiningarprófanir ChromeOS Flex.</translation> +<translation id="7770450735129978837">Hægri músarsmellur</translation> <translation id="7770612696274572992">Mynd afrituð úr öðru tæki</translation> <translation id="7771452384635174008">Útlit</translation> <translation id="7772032839648071052">Staðfestu aðgangsorðið</translation> @@ -7126,6 +7153,7 @@ <translation id="8102139037507939978">Fjarlægja persónugreinanlegar upplýsingar úr system_logs.txt.</translation> <translation id="8104088837833760645">Sækja eSIM-prófíl</translation> <translation id="8105368624971345109">Slökkva</translation> +<translation id="8105541061909542455">{NUM_APPS,plural, =1{Óstutt forrit}one{Óstutt forrit}other{Óstudd forrit}}</translation> <translation id="8107015733319732394">Setur Google Play Store upp á <ph name="DEVICE_TYPE" />. Þetta gæti tekið nokkrar mínútur.</translation> <translation id="810728361871746125">Skjáupplausn</translation> <translation id="8108526232944491552">{COUNT,plural, =0{Engin fótspor frá þriðju aðilum}=1{Lokað á eitt fótspor frá þriðja aðila}one{Lokað er á # fótspor frá þriðju aðilum}other{Lokað er á # fótspor frá þriðju aðilum}}</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 4caf1d5a..d242dd1b 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -1263,6 +1263,7 @@ <translation id="2218019600945559112">Mouse e touchpad</translation> <translation id="2218320521449013367">Si è verificato un errore in Chrome durante la rimozione di software dannoso</translation> <translation id="2218515861914035131">Incolla come solo testo</translation> +<translation id="2219658597883514593">Riavvia tutorial</translation> <translation id="2220409419896228519">Aggiungi le tue app Google preferite ai Preferiti</translation> <translation id="2220529011494928058">Segnala un problema</translation> <translation id="2220572644011485463">PIN o password</translation> @@ -2407,6 +2408,7 @@ <translation id="3378627645871606983">Le autorizzazioni concesse per Steam si applicano a tutti i giochi e a tutte le app Steam.</translation> <translation id="337920581046691015"><ph name="PRODUCT_NAME" /> verrà installato.</translation> <translation id="3380365263193509176">Errore sconosciuto</translation> +<translation id="3380850890226973980">Chiedi la prossima volta</translation> <translation id="3382073616108123819">Spiacenti, il sistema non è riuscito a determinare gli identificatori di questo dispositivo.</translation> <translation id="3382200254148930874">Interruzione della supervisione…</translation> <translation id="338323348408199233">Blocca traffico senza VPN</translation> @@ -3195,6 +3197,10 @@ <translation id="4110490973560452005">Download completato: <ph name="FILE_NAME" />. Premi MAIUSC+F6 per passare alla parte con la barra dei download.</translation> <translation id="4110686435123617899">Seleziona l'album <ph name="TITLE" /> <ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (offline)</translation> +<translation id="4114524937989710624">Visualizzi i file suggeriti per aiutarti a tornare facilmente alle tue attività più recenti in Google Drive. + <ph name="BREAK" /> + <ph name="BREAK" /> + Puoi gestire le impostazioni dal menu della scheda o visualizzare altre opzioni in Personalizza Chrome.</translation> <translation id="4115002065223188701">Rete fuori portata</translation> <translation id="4115378294792113321">Magenta</translation> <translation id="4116704186509653070">Apri di nuovo</translation> @@ -3702,6 +3708,10 @@ <translation id="4651484272688821107">Impossibile caricare il componente online con le risorse della modalità demo.</translation> <translation id="4652935475563630866">La modifica dell'impostazione della videocamera richiede il riavvio di Parallels Desktop. Riavvia Parallels Desktop per continuare.</translation> <translation id="4653405415038586100">Errore durante la configurazione di Linux</translation> +<translation id="465406513924180949">Visualizzi dei carrelli per aiutarti a tornare facilmente agli elementi che hai lasciato nei carrelli degli acquisti sul Web. + <ph name="BREAK" /> + <ph name="BREAK" /> + Puoi gestire le impostazioni dal menu della scheda o visualizzare altre opzioni in Personalizza Chrome.</translation> <translation id="4654236001025007561">Condividi file con Chromebook e dispositivi Android nelle vicinanze</translation> <translation id="4657914796247705218">Velocità TrackPoint</translation> <translation id="4658285806588491142">Mantieni privato lo schermo</translation> @@ -4144,6 +4154,7 @@ <translation id="5121130586824819730">Il disco rigido è pieno. Salva in un'altra posizione o libera spazio sul disco rigido.</translation> <translation id="5123433949759960244">Basket</translation> <translation id="5125751979347152379">URL non valido.</translation> +<translation id="5125967981703109366">Informazioni su questa scheda</translation> <translation id="5126611267288187364">Visualizza modifiche</translation> <translation id="5127242257756472928">Non possono usare informazioni sui tuoi schermi per aprire e posizionare finestre</translation> <translation id="5127620150973591153">ID connessione sicura: <ph name="TOKEN" /></translation> @@ -4205,6 +4216,7 @@ <translation id="5185500136143151980">Nessuna connessione a Internet</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Rivivi i tuoi ricordi più cari. Per aggiungere o modificare gli album, vai a<ph name="LINK_BEGIN" />Google Foto<ph name="LINK_END" />.</translation> +<translation id="5190316321948122159">{NUM_APPS,plural, =1{Elimina ora l'app}other{Elimina ora le app}}</translation> <translation id="5190926251776387065">Attiva porta</translation> <translation id="5191094172448199359">I PIN inseriti non corrispondono</translation> <translation id="5191251636205085390">Scopri e gestisci le nuove tecnologie che mirano a sostituire i cookie di terze parti</translation> @@ -4377,6 +4389,7 @@ <translation id="5342091991439452114">Il PIN deve contenere almeno <ph name="MINIMUM" /> cifre</translation> <translation id="5344036115151554031">Ripristino di Linux</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (destro)</translation> +<translation id="534572711507965074">Assegna un nome al gruppo, scegli un colore e tocca Invio</translation> <translation id="5345916423802287046">Avvia app all'accesso</translation> <translation id="5350293332385664455">Disattivare l'Assistente Google</translation> <translation id="535123479159372765">Testo copiato da un altro dispositivo</translation> @@ -4957,6 +4970,7 @@ <translation id="5946591249682680882">ID report <ph name="WEBRTC_LOG_REPORT_ID" /></translation> <translation id="5948536763493709626">Collega una tastiera o un mouse oppure continua la configurazione usando il touchscreen. Se usi dispositivi Bluetooth, assicurati che siano pronti per essere accoppiati.</translation> <translation id="5949544233750246342">Impossibile analizzare il file</translation> +<translation id="5950039854561387265">Chiedi la prossima volta</translation> <translation id="5950819593680344519">Chrome non ha rilevato software dannoso sul computer • Ultima verifica: ieri</translation> <translation id="5951303645598168883"><ph name="ORIGIN" /> vuole usare caratteri locali</translation> <translation id="5951624318208955736">Monitor</translation> @@ -5127,6 +5141,10 @@ <translation id="6116921718742659598">Modifica impostazioni della lingua e di immissione</translation> <translation id="6119927814891883061">Cambia il nome del dispositivo in <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Blocca questa pagina in schermata iniziale...</translation> +<translation id="6120707837086723438">Visualizzi ricette suggerite in base alla tua attività di ricerca recente per le ricette. + <ph name="BREAK" /> + <ph name="BREAK" /> + Puoi gestire le impostazioni dal menu della scheda o visualizzare altre opzioni in Personalizza Chrome.</translation> <translation id="6121773125605585883">Visualizza password con nome utente <ph name="USERNAME" /> per <ph name="WEBSITE" /></translation> <translation id="6122081475643980456">La tua connessione Internet è controllata</translation> <translation id="6122093587541546701">Email (facoltativo):</translation> @@ -5219,6 +5237,7 @@ <translation id="6218058416316985984"><ph name="DEVICE_TYPE" /> è offline. Connettiti a Internet e riprova.</translation> <translation id="6220413761270491930">Errore di caricamento dell'estensione</translation> <translation id="6223447490656896591">Immagine personalizzata:</translation> +<translation id="62236885217374510">{NUM_APPS,plural, =1{Elimina ora l'app}other{Elimina ora le app}}</translation> <translation id="6224481128663248237">Formattazione terminata.</translation> <translation id="622537739776246443">Il profilo verrà eliminato</translation> <translation id="6225475702458870625">Connessione dati disponibile dal tuo dispositivo <ph name="PHONE_NAME" /></translation> @@ -5851,6 +5870,7 @@ <translation id="6846178040388691741">L'estensione "<ph name="EXTENSION_NAME" />" vuole stampare il file <ph name="FILE_NAME" /> con la stampante <ph name="PRINTER_NAME" />.</translation> <translation id="6847125920277401289">Libera spazio per continuare</translation> <translation id="6848388270925200958">Al momento hai delle carte che possono essere utilizzate solo da questo dispositivo.</translation> +<translation id="6848425544473873717">{NUM_APPS,plural, =1{1 delle tue app non è più supportata. <ph name="LEARN_MORE" />}other{# delle tue app non sono più supportate. <ph name="LEARN_MORE" />}}</translation> <translation id="6848716236260083778">Per configurare l'impronta, chiedi a tuo figlio di toccare il sensore di impronte digitali. I dati relativi all'impronta di tuo figlio vengono memorizzati in modo sicuro e non possono essere trasferiti in alcun modo da questo <ph name="DEVICE_TYPE" />.</translation> <translation id="6850286078059909152">Colore testo</translation> <translation id="6851181413209322061">Invia dati diagnostici e sull'utilizzo. Attualmente, questo dispositivo invia a Google dati diagnostici e sull'utilizzo delle app e del dispositivo. Non verranno utilizzati per identificare tuo figlio e contribuiranno alla stabilità di app e sistema, nonché ad altri miglioramenti. Alcuni dati aggregati saranno utili anche alle app e ai partner di Google, come ad esempio agli sviluppatori Android. Questa impostazione è applicata dal proprietario. Se l'impostazione Attività web e app aggiuntiva è attiva per tuo figlio, queste informazioni potrebbero essere salvate nel suo Account Google.</translation> @@ -6731,6 +6751,10 @@ <translation id="7744192722284567281">Rilevata in una violazione dei dati</translation> <translation id="7744649840067671761">Premi un nuovo sensore o tasto della tastiera per iniziare un'assegnazione. Premi un sensore o un tasto assegnato per rimuovere l'assegnazione.</translation> +<translation id="7746739418892731373">Visualizzi foto e video in evidenza dalla tua raccolta di Google Foto. Puoi decidere cosa viene visualizzato tra i tuoi contenuti in evidenza all'indirizzo <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" />. + <ph name="BREAK" /> + <ph name="BREAK" /> + Puoi gestire le impostazioni per questa scheda dal menu della stessa o visualizzare altre opzioni in Personalizza Chrome.</translation> <translation id="7750228210027921155">Picture in picture</translation> <translation id="7751260505918304024">Mostra tutto</translation> <translation id="7753735457098489144">Installazione non riuscita per spazio di archiviazione insufficiente. Per liberare spazio, elimina i file dallo spazio di archiviazione del dispositivo.</translation> @@ -7114,6 +7138,7 @@ <translation id="8102139037507939978">Rimuovi le informazioni che consentono l'identificazione personale dal file system_logs.txt.</translation> <translation id="8104088837833760645">Scarica profilo eSIM</translation> <translation id="8105368624971345109">Disattiva</translation> +<translation id="8105541061909542455">{NUM_APPS,plural, =1{App non supportata}other{App non supportate}}</translation> <translation id="8107015733319732394">Installazione in corso del Google Play Store sul tuo dispositivo <ph name="DEVICE_TYPE" />. L'operazione potrebbe richiedere alcuni minuti.</translation> <translation id="810728361871746125">Risoluzione del display</translation> <translation id="8108526232944491552">{COUNT,plural, =0{Nessun cookie di terze parti}=1{È stato bloccato 1 cookie di terze parti}other{Sono stati bloccati # cookie di terze parti}}</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 56cacaf3..0293622 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -1342,6 +1342,7 @@ <translation id="2278562042389100163">פתיחת חלון דפדפן</translation> <translation id="2278668501808246459">המערכת מפעילה את מנהל המאגר</translation> <translation id="2280486287150724112">שוליים ימניים</translation> +<translation id="2281863813036651454">הלחצן השמאלי בעכבר</translation> <translation id="2282146716419988068">תהליך GPU</translation> <translation id="2285109769884538519">{COUNT,plural, =0{פתיחת כל הכתובות ב&קבוצת כרטיסיות חדשה}=1{פתיחת הכתובת ב&קבוצת כרטיסיות חדשה}two{פתיחת כל הכתובות ({COUNT}) ב&קבוצת כרטיסיות חדשה}many{פתיחת כל הכתובות ({COUNT}) ב&קבוצת כרטיסיות חדשה}other{פתיחת כל הכתובות ({COUNT}) ב&קבוצת כרטיסיות חדשה}}</translation> <translation id="2285942871162473373">לא ניתן לזהות את טביעת האצבע שלך. יש לנסות שוב.</translation> @@ -3209,6 +3210,10 @@ <translation id="4110490973560452005">ההורדה הושלמה: <ph name="FILE_NAME" />. אפשר להקיש על Shift+F6 כדי לעבור לאזור סרגל ההורדות.</translation> <translation id="4110686435123617899">בחירת האלבום <ph name="TITLE" /> <ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (אופליין)</translation> +<translation id="4114524937989710624">מוצגות לך הצעות לקבצים כדי לעזור לך לחזור לפעילות האחרונה שלך ב-Google Drive. + <ph name="BREAK" /> + <ph name="BREAK" /> + ניתן לנהל את ההגדרות דרך התפריט בכרטיס או לראות עוד אפשרויות ב'התאמה אישית של Chrome'.</translation> <translation id="4115002065223188701">הרשת מחוץ לטווח</translation> <translation id="4115378294792113321">מג'נטה</translation> <translation id="4116704186509653070">פתיחה מחדש</translation> @@ -3717,6 +3722,10 @@ <translation id="4651484272688821107">לא ניתן לטעון רכיב אונליין עם משאבי מצב ההדגמה.</translation> <translation id="4652935475563630866">השינוי בהגדרת המצלמה מחייב הפעלה מחדש של Parallels Desktop. יש להפעיל מחדש את Parallels Desktop כדי להמשיך.</translation> <translation id="4653405415038586100">שגיאה במהלך ההגדרה של Linux</translation> +<translation id="465406513924180949">מוצגות לך עגלות קניות כדי שיהיה לך קל לחזור לפריטים שהוספת לעגלות הקניות ברחבי האינטרנט. + <ph name="BREAK" /> + <ph name="BREAK" /> + ניתן לנהל את ההגדרות דרך התפריט בכרטיס או לראות עוד אפשרויות ב'התאמה אישית של Chrome'.</translation> <translation id="4654236001025007561">שיתוף קבצים עם מכשירי Chromebook ו-Android בסביבה</translation> <translation id="4657914796247705218">מהירות TrackPoint</translation> <translation id="4658285806588491142">שמירה על פרטיות המסך</translation> @@ -4159,6 +4168,7 @@ <translation id="5121130586824819730">הדיסק הקשיח מלא. יש לשמור במיקום אחר או לפנות מקום בדיסק הקשיח.</translation> <translation id="5123433949759960244">כדורסל</translation> <translation id="5125751979347152379">כתובת אתר לא חוקית.</translation> +<translation id="5125967981703109366">מידע על הכרטיס הזה</translation> <translation id="5126611267288187364">צפייה בשינויים</translation> <translation id="5127242257756472928">אתרים ללא הרשאה להשתמש במידע לגבי המסכים שלך כדי לפתוח ולהציב חלונות</translation> <translation id="5127620150973591153">מזהה חיבור בטוח: <ph name="TOKEN" /></translation> @@ -5142,6 +5152,10 @@ <translation id="6116921718742659598">שינוי הגדרות הקלט והשפה</translation> <translation id="6119927814891883061">שמירת שם המכשיר <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">הצמדת דף זה למסך הפתיחה...</translation> +<translation id="6120707837086723438">מוצגות לך הצעות למתכונים על סמך פעילות חיפוש המתכונים שלך מהזמן האחרון. + <ph name="BREAK" /> + <ph name="BREAK" /> + ניתן לנהל את ההגדרות דרך התפריט בכרטיס או לראות עוד אפשרויות ב'התאמה אישית של Chrome'.</translation> <translation id="6121773125605585883">הצגת הסיסמה של שם המשתמש <ph name="USERNAME" /> לאתר <ph name="WEBSITE" /></translation> <translation id="6122081475643980456">החיבור שלך לאינטרנט נשלט על ידי גורם כלשהו</translation> <translation id="6122093587541546701">אימייל (אופציונלי):</translation> @@ -5158,6 +5172,7 @@ <translation id="6129938384427316298">הערה לאישור Netscape</translation> <translation id="6129953537138746214">רווח</translation> <translation id="6130692320435119637">הוספת Wi-Fi</translation> +<translation id="6130887916931372608">מקש במקלדת</translation> <translation id="6136114942382973861">סגירת סרגל ההורדות</translation> <translation id="6136287496450963112">מפתח האבטחה שלך אינו מוגן באמצעות קוד אימות. כדי לנהל טביעות אצבע, יש ליצור תחילה קוד אימות.</translation> <translation id="6138680304137685902">חתימת X9.62 ECDSA עם SHA-384</translation> @@ -6745,6 +6760,10 @@ <translation id="7744192722284567281">נמצאה בפרצה באבטחת מידע</translation> <translation id="7744649840067671761">צריך להקיש על מתג חדש או מקש במקלדת כדי להתחיל בהקצאה. כדי להסיר את ההקצאה, מקישים על מתג או מקש במקלדת שהוקצו.</translation> +<translation id="7746739418892731373">מוצג לך המיטב מהתמונות והסרטונים מספריית Google Photos שלך. ניתן לשלוט במה שמוצג בקטע 'המיטב' בכתובת <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" />. + <ph name="BREAK" /> + <ph name="BREAK" /> + ניתן לנהל את הגדרות הכרטיס הזה דרך התפריט בכרטיס או לראות עוד אפשרויות ב'התאמה אישית של Chrome'.</translation> <translation id="7750228210027921155">תמונה בתוך תמונה</translation> <translation id="7751260505918304024">הצגת הכול</translation> <translation id="7753735457098489144">ההתקנה נכשלה כי אין מספיק נפח אחסון. כדי לפנות נפח אחסון, עליך למחוק קבצים מאחסון המכשיר.</translation> @@ -6770,6 +6789,7 @@ <translation id="7768770796815395237">שינוי</translation> <translation id="7768784765476638775">הקראה</translation> <translation id="7770406201819593386">הרצה של בדיקות ניתוחים לגבי ChromeOS Flex.</translation> +<translation id="7770450735129978837">הלחצן הימני בעכבר</translation> <translation id="7770612696274572992">התמונה הועתקה ממכשיר אחר</translation> <translation id="7771452384635174008">פריסה</translation> <translation id="7772032839648071052">אישור משפט-סיסמה</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 50c7fee..4bc2d09 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -1499,7 +1499,7 @@ <translation id="2443487764245141020">サイトで識別子を使用したデバイスの認識も必要となる場合があります</translation> <translation id="244475495405467108">左側のタブを閉じる</translation> <translation id="2445081178310039857">拡張機能のルート ディレクトリを指定してください。</translation> -<translation id="2445484935443597917">新しいプロフィールを作成</translation> +<translation id="2445484935443597917">新しいプロファイルを作成</translation> <translation id="244641233057214044">検索に関連</translation> <translation id="2448312741937722512">種類</translation> <translation id="2448810255793562605">スイッチ アクセスの自動スキャン</translation> @@ -3189,6 +3189,10 @@ <translation id="4110490973560452005">ダウンロードが完了しました(<ph name="FILE_NAME" />)。ダウンロード バーの領域に切り替えるには Shift+F6 キーを押してください。</translation> <translation id="4110686435123617899">アルバム「<ph name="TITLE" />」の <ph name="DESC" />を選択</translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" />(オフライン)</translation> +<translation id="4114524937989710624">Google ドライブで最近使用したファイルに簡単にアクセスできるよう、ファイルの候補が表示されています。 + <ph name="BREAK" /> + <ph name="BREAK" /> + カードメニューから設定を管理することや、[Chrome をカスタマイズ] でその他のオプションを見ることができます。</translation> <translation id="4115002065223188701">ネットワークが圏外です</translation> <translation id="4115378294792113321">マゼンタ</translation> <translation id="4116704186509653070">もう一度開く</translation> @@ -3694,6 +3698,10 @@ <translation id="4651484272688821107">デモモード リソースでオンライン コンポーネントを読み込めませんでした。</translation> <translation id="4652935475563630866">カメラの設定を変更するには、Parallels Desktop を再起動する必要があります。続行するには、Parallels Desktop を再起動してください。</translation> <translation id="4653405415038586100">Linux の設定中にエラーが発生しました</translation> +<translation id="465406513924180949">ウェブ上でショッピング カートに入れた商品に簡単にアクセスできるよう、カートが表示されています。 + <ph name="BREAK" /> + <ph name="BREAK" /> + カードメニューから設定を管理することや、[Chrome をカスタマイズ] でその他のオプションを見ることができます。</translation> <translation id="4654236001025007561">近くの Chromebook や Android デバイスとファイルを共有できます</translation> <translation id="4657914796247705218">トラック ポイントの速度</translation> <translation id="4658285806588491142">画面を非公開のままにする</translation> @@ -4136,6 +4144,7 @@ <translation id="5121130586824819730">ハード ディスクがいっぱいです。別の場所に保存するか、ハード ディスクの空き容量を増やしてください。</translation> <translation id="5123433949759960244">バスケットボール</translation> <translation id="5125751979347152379">URL が無効です。</translation> +<translation id="5125967981703109366">このカードについて</translation> <translation id="5126611267288187364">変更の表示</translation> <translation id="5127242257756472928">画面に関する情報を基にウィンドウを開いて配置することを許可しない</translation> <translation id="5127620150973591153">安全な接続 ID: <ph name="TOKEN" /></translation> @@ -5117,6 +5126,10 @@ <translation id="6116921718742659598">言語と入力の設定を変更</translation> <translation id="6119927814891883061">デバイス名を <ph name="DEVICE_NAME" /> に指定します</translation> <translation id="6120205520491252677">このページを起動画面に固定...</translation> +<translation id="6120707837086723438">最近検索したレシピの候補が表示されています。 + <ph name="BREAK" /> + <ph name="BREAK" /> + カードメニューから設定を管理することや、[Chrome をカスタマイズ] でその他のオプションを見ることができます。</translation> <translation id="6121773125605585883"><ph name="WEBSITE" /> のユーザー名 <ph name="USERNAME" /> のパスワードを表示します</translation> <translation id="6122081475643980456">インターネット接続が制限されています</translation> <translation id="6122093587541546701">メール(省略可):</translation> @@ -6403,7 +6416,7 @@ <translation id="7439519621174723623">続行するにはデバイス名を追加してください</translation> <translation id="7441736921018636843">この設定を変更するには、<ph name="BEGIN_LINK" />同期をリセット<ph name="END_LINK" />して同期パスフレーズを削除します</translation> <translation id="7441830548568730290">他のユーザー</translation> -<translation id="744341768939279100">新しいプロフィールを作成</translation> +<translation id="744341768939279100">新しいプロファイルを作成</translation> <translation id="744366959743242014">データを読み込んでいます。これには数秒かかる場合があります。</translation> <translation id="7443806024147773267">Google アカウントにログインすれば、いつでもパスワードにアクセスできます。</translation> <translation id="7444970023873202833">Google フォトで思い出の写真に簡単アクセス</translation> @@ -6720,6 +6733,10 @@ <translation id="7744047395460924128">印刷履歴の表示</translation> <translation id="7744192722284567281">データ侵害で漏洩</translation> <translation id="7744649840067671761">新しいスイッチかキーボードのキーを押すと割り当てを開始できます。割り当て済みのスイッチかキーを押すと割り当てが解除されます。</translation> +<translation id="7746739418892731373">Google フォト ライブラリの写真と動画のハイライトが表示されています。ハイライトに何を表示するかは、<ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" /> で管理できます。 + <ph name="BREAK" /> + <ph name="BREAK" /> + カードメニューからこのカードの設定を管理することや、[Chrome をカスタマイズ] でその他のオプションを見ることができます。</translation> <translation id="7750228210027921155">ピクチャー イン ピクチャー</translation> <translation id="7751260505918304024">すべて表示</translation> <translation id="7753735457098489144">ストレージの空き容量が不足しているため、インストールできませんでした。空き容量を確保するために、デバイスのストレージからファイルを削除してください。</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index 669c80b..9a511cb 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -1369,6 +1369,7 @@ <ph name="FOOTER_MESSAGE" /></translation> <translation id="2307630946657910723">გვერდის ნაწილში ძიება <ph name="VISUAL_SEARCH_PROVIDER" />-ით</translation> <translation id="2309620859903500144">ამ საიტს აეკრძალა მოძრაობისა თუ განათების სენსორებზე წვდომა.</translation> +<translation id="2311721625890389967">↓</translation> <translation id="2312219318583366810">გვერდის URL</translation> <translation id="2314165183524574721">ხილვადობის პარამეტრად ამჟამად მითითებულია დამალული</translation> <translation id="2314774579020744484">გვერდების თარგმნისას გამოყენებული ენა</translation> @@ -1963,6 +1964,7 @@ <translation id="288734198558082692"><ph name="DEVICE" /> და <ph name="NUMBER_OF_DEVICES" /> სხვა</translation> <translation id="2889064240420137087">ბმულის გახსნა…</translation> <translation id="2891922230654533301">გსურთ, გამოიყენოთ თქვენი მოწყობილობა <ph name="APP_NAME" />-ში შესასვლელად?</translation> +<translation id="2893013536106749396">აირჩიეთ ბარათები, რომლებიც თქვენთვის მნიშვნელოვან უახლეს ინფორმაციას მოგაწვდით</translation> <translation id="2893168226686371498">ნაგულისხმევი ბრაუზერი</translation> <translation id="2893180576842394309">Google-მა შეიძლება გამოიყენოს თქვენი ისტორია Search-ისა და Google-ის სხვა სერვისების თქვენზე მოსარგებად</translation> <translation id="2894757982205307093">ახალი ჩანართი ჯგუფში</translation> @@ -2076,6 +2078,7 @@ <translation id="3003623123441819449">CSS კეში</translation> <translation id="3003828226041301643">მოწყობილობის გაწევრიანება დომენში ვერ მოხერხდა. შეამოწმეთ, აქვს თუ არა თქვენს ანგარიშს მოწყობილობების დამატების უფლება.</translation> <translation id="3003967365858406397">თქვენი <ph name="PHONE_NAME" /> კერძო Wi-Fi კავშირს შექმნის.</translation> +<translation id="3005574332301273731">არ გამოჩნდეს</translation> <translation id="3006881078666935414">გამოყენების შესახებ მონაცემები არ არის</translation> <translation id="3007771295016901659">ჩანართის დუბლიკატის შექმნა</translation> <translation id="3008232374986381779">თქვენს <ph name="DEVICE_TYPE" />-ზე Linux-ის ხელსაწყოების, რედაქტორებისა და IDE-ების გაშვება. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> @@ -4295,6 +4298,7 @@ <translation id="5265797726250773323">შეცდომა ინსტალაციისას</translation> <translation id="5266113311903163739">სერთიფიკატის ავტორიზაციის იმპორტის შეეცდომა</translation> <translation id="526622169288322445">სხვა ქმედებები „<ph name="ADDRESS_SUMMARY" />“-სთვის</translation> +<translation id="5268373933383932086">თქვენი გვერდი, თქვენი წესები</translation> <translation id="5269977353971873915">ბეჭვდის შეცდომა</translation> <translation id="5273806377963980154">საიტის URL-ის რედაქტირება</translation> <translation id="5275352920323889391">ძაღლი</translation> @@ -5107,6 +5111,7 @@ <translation id="6080689532560039067">შეამოწმეთ სისტემის დრო</translation> <translation id="6082877069782862752">კლავიშების ასახვა</translation> <translation id="608531959444400877"><ph name="WINDOW_TITLE" /> — უსახელო ჯგუფის ნაწილი</translation> +<translation id="6085457109149794212">გაეცანით ბარათებთან დაკავშირებულ ყველა ვარიანტს „Chrome-ის მორგების“ სექციიდან</translation> <translation id="6085886413119427067">განსაზღვრავს დაცული კავშირით ვებსაიტებთან დაკავშირების ხერხს</translation> <translation id="6086004606538989567">ანგარიშს, რომელიც დაადასტურეთ, არ აქვს ამ მოწყობილობაზე წვდომის უფლება.</translation> <translation id="6086846494333236931">დაინსტალირებულია თქვენი ადმინისტრატორის მიერ</translation> @@ -5561,6 +5566,7 @@ <translation id="6537880577641744343">Commander</translation> <translation id="6538098297809675636">კოდის ამოცნობა ვერ მოხერხდა</translation> <translation id="653920215766444089">მიმდინარეობს მიმთითებელი მოწყობილობის ძიება</translation> +<translation id="653983593749614101">მიმდინარეობს განახლება...</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />შენიშვნა:<ph name="END_BOLD" /> ჩართეთ მხოლოდ იმ შემთხვევაში, თუ ზუსტად იცით, რას აკეთებთ, ან თუ სისტემამ მოითხოვა ეს მოქმედება, რადგან მონაცემების შეგროვებამ შეიძლება შეამციროს ეფექტურობა.</translation> <translation id="6540672086173674880">თქვენი დათვალიერების ისტორიის მეშვეობით Google შეძლებს Search-ისა და Google-ის სხვა სერვისების თქვენზე მორგებას. აღნიშნულის ნებისმიერ დროს შეცვლა შეგიძლიათ მისამართზე myaccount.google.com/activitycontrols/search</translation> <translation id="6541638731489116978">ამ საიტს აეკრძალა მოძრაობის სენსორებზე წვდომა.</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index 0fc47f4e..6ce5d663 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -1260,6 +1260,7 @@ <translation id="2218019600945559112">Тінтуір мен сенсорлық тақта</translation> <translation id="2218320521449013367">Chrome браузері зиянды бағдарламалық жасақтаманы өшіріп жатқанда, қате шықты</translation> <translation id="2218515861914035131">Қарапайым мәтін ретінде қою</translation> +<translation id="2219658597883514593">Оқулықты қайта бастау</translation> <translation id="2220409419896228519">Ұнайтын Google қолданбаларына бетбелгілер енгізу</translation> <translation id="2220529011494928058">Ақау туралы хабарлау</translation> <translation id="2220572644011485463">PIN коды немесе құпия сөз</translation> @@ -2403,6 +2404,7 @@ <translation id="3378627645871606983">Steam қолданбасына арналған рұқсаттар барлық Steam ойыны мен қолданбасына қолданылады.</translation> <translation id="337920581046691015"><ph name="PRODUCT_NAME" /> орнатылады.</translation> <translation id="3380365263193509176">Белгісіз қате</translation> +<translation id="3380850890226973980">Келесіде сұрау</translation> <translation id="3382073616108123819">Жүйенің осы құрылғыға арналған құрылғы идентификаторларын анықтауы сәтсіз аяқталды.</translation> <translation id="3382200254148930874">Қадағалау тоқтатылуда…</translation> <translation id="338323348408199233">Трафикті VPN-сіз бөгеу</translation> @@ -3191,6 +3193,10 @@ <translation id="4110490973560452005">Жүктеп алу аяқталды: <ph name="FILE_NAME" />. Жүктеп алынғандар жолағы аумағына оралу үшін Shift+F6 пернелерін басыңыз.</translation> <translation id="4110686435123617899">"<ph name="TITLE" />" альбомын таңдаңыз (<ph name="DESC" />).</translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (офлайн)</translation> +<translation id="4114524937989710624">Google Drive қызметіндегі соңғы іс-әрекеттерге оңай оралуға көмектесетін файлдарды көріп тұрсыз. + <ph name="BREAK" /> + <ph name="BREAK" /> + Параметрлерді карта мәзірінен реттей, басқа опцияларды "Chrome браузерін реттеу" бөлімінен көре аласыз.</translation> <translation id="4115002065223188701">Желі қолжетімді емес</translation> <translation id="4115378294792113321">Күлгін</translation> <translation id="4116704186509653070">Қайта ашу</translation> @@ -3698,6 +3704,10 @@ <translation id="4651484272688821107">Демо режиміндегі ресурстары бар онлайн компонент жүктелмеді.</translation> <translation id="4652935475563630866">Камераның параметріне өзгеріс енгізілгендіктен, Parallels Desktop қайта іске қосылуы қажет. Жалғастыру үшін Parallels Desktop қолданбасын қайта іске қосыңыз.</translation> <translation id="4653405415038586100">Linux-ті конфигурациялау қатесі шықты</translation> +<translation id="465406513924180949">Интернеттегі сатып алу себеттерінде сақталған элементтерге оңай оралуға көмектесетін себеттерді көріп тұрсыз. + <ph name="BREAK" /> + <ph name="BREAK" /> + Параметрлерді карта мәзірінен реттей, басқа опцияларды "Chrome браузерін реттеу" бөлімінен көре аласыз.</translation> <translation id="4654236001025007561">Файлдарды маңайдағы Chromebook және Android құрылғыларымен бөлісіңіз.</translation> <translation id="4657914796247705218">TrackPoint жылдамдығы</translation> <translation id="4658285806588491142">Экраныңызды өзіңіз ғана көріңіз</translation> @@ -4140,6 +4150,7 @@ <translation id="5121130586824819730">Қатты дискіңіз толған. Басқа орынға сақтаңыз немесе қатты дискіні босатыңыз.</translation> <translation id="5123433949759960244">Баскетбол</translation> <translation id="5125751979347152379">Жарамсыз URL.</translation> +<translation id="5125967981703109366">Осы карта туралы ақпарат</translation> <translation id="5126611267288187364">Өзгерістерді көру</translation> <translation id="5127242257756472928">Терезелерді ашып, орналастыру үшін экрандар туралы ақпаратты пайдалануға рұқсат берілмеген.</translation> <translation id="5127620150973591153">Қауіпсіз байланыс коды: <ph name="TOKEN" /></translation> @@ -4201,6 +4212,7 @@ <translation id="5185500136143151980">Интернет жоқ</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Өміріңіздегі ерекше сәттерді қайта өткеріңіз. Альбомдарды қосу немесе өзгерту үшін <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" /> қызметіне өтіңіз.</translation> +<translation id="5190316321948122159">{NUM_APPS,plural, =1{Қолданбаны қазір жою}other{Қолданбаларды қазір жою}}</translation> <translation id="5190926251776387065">Портты іске қосу</translation> <translation id="5191094172448199359">Енгізген PIN кодтарыңыз сәйкес келмейді.</translation> <translation id="5191251636205085390">Үшінші тарап cookie файлдарын ауыстыруға арналған жаңа технологиялар туралы ақпарат алыңыз және оларды басқарыңыз.</translation> @@ -4373,6 +4385,7 @@ <translation id="5342091991439452114">PIN коды кемінде <ph name="MINIMUM" /> таңбадан құралуы керек</translation> <translation id="5344036115151554031">Linux қалпына келтірілуде</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (оң)</translation> +<translation id="534572711507965074">Топ атауын көрсетіп, түсті таңдап, Enter пернесін басыңыз.</translation> <translation id="5345916423802287046">Аккаунтқа кірген кезде, қолданбаны іске қосу</translation> <translation id="5350293332385664455">Google Assistant қызметін өшіру</translation> <translation id="535123479159372765">Мәтін басқа құрылғыдан көшірілді</translation> @@ -4953,6 +4966,7 @@ <translation id="5946591249682680882">Есеп идентификаторы <ph name="WEBRTC_LOG_REPORT_ID" /></translation> <translation id="5948536763493709626">Пернетақтаны немесе тінтуірді қосыңыз, не болмаса сенсорлық экран көмегімен реттеуді жалғастырыңыз. Bluetooth құрылғыларын қолдансаңыз, құрылғыларыңыздың қосуға дайын екеніне көз жеткізіңіз.</translation> <translation id="5949544233750246342">Файлды талдау мүмкін емес</translation> +<translation id="5950039854561387265">Келесіде сұрау</translation> <translation id="5950819593680344519">Chrome браузері компьютеріңізден ешқандай зиянды бағдарламалық құрал таппады. • Кеше тексерілді.</translation> <translation id="5951303645598168883"><ph name="ORIGIN" /> жергілікті қаріптерді пайдаланғысы келеді.</translation> <translation id="5951624318208955736">Бақылау</translation> @@ -5123,6 +5137,10 @@ <translation id="6116921718742659598">Тіл және енгізу параметрлерін өзгерту</translation> <translation id="6119927814891883061">Құрылғыны <ph name="DEVICE_NAME" /> деп атау</translation> <translation id="6120205520491252677">Бұл бетті "Іске қосу" экранына бекіту…</translation> +<translation id="6120707837086723438">Соңғы іздеу сұрауларының мәліметі негізінде ұсынылған рецептілерді көріп тұрсыз. + <ph name="BREAK" /> + <ph name="BREAK" /> + Параметрлерді карта мәзірінен реттей, басқа опцияларды "Chrome браузерін реттеу" бөлімінен көре аласыз.</translation> <translation id="6121773125605585883"><ph name="WEBSITE" /> веб-сайтының <ph name="USERNAME" /> пайдаланушы аты мен құпия сөзін көріңіз.</translation> <translation id="6122081475643980456">Интернет байланысыңыз бақылануда</translation> <translation id="6122093587541546701">Электрондық пошта (міндетті емес):</translation> @@ -5215,6 +5233,7 @@ <translation id="6218058416316985984"><ph name="DEVICE_TYPE" /> офлайн режимде тұр. Интернетке қосылып, қайталап көріңіз.</translation> <translation id="6220413761270491930">Кеңейтім жүктеу қатесі</translation> <translation id="6223447490656896591">Арнаулы кескін:</translation> +<translation id="62236885217374510">{NUM_APPS,plural, =1{Қолданбаны қазір жою}other{Қолданбаларды қазір жою}}</translation> <translation id="6224481128663248237">Пішімдеу сәтті аяқталды!</translation> <translation id="622537739776246443">Профиль жойылады</translation> <translation id="6225475702458870625">Деректер байланысы <ph name="PHONE_NAME" /> телефонынан қолжетімді</translation> @@ -5847,6 +5866,7 @@ <translation id="6846178040388691741">"<ph name="EXTENSION_NAME" />" кеңейтімі <ph name="FILE_NAME" /> файлын <ph name="PRINTER_NAME" /> принтерімен басып шығаруға рұқсат сұрайды.</translation> <translation id="6847125920277401289">Жалғастыру үшін орын босатыңыз</translation> <translation id="6848388270925200958">Қазір осы құрылғыда ғана пайдаланылатын бірнеше карта бар</translation> +<translation id="6848425544473873717">{NUM_APPS,plural, =1{1 қолданбаға енді қолдау көрсетілмейді. <ph name="LEARN_MORE" />}other{# қолданбаға енді қолдау көрсетілмейді. <ph name="LEARN_MORE" />}}</translation> <translation id="6848716236260083778">Саусақ ізін реттеу үшін балаңыз саусақ ізі сканерін түртуі керек. Балаңыздың саусағының ізі туралы дерек қауіпсіз сақталған және <ph name="DEVICE_TYPE" /> құрылғысынан басқа ешқайда жіберілмейді.</translation> <translation id="6850286078059909152">Мәтін түсі</translation> <translation id="6851181413209322061">Пайдалану және диагностика туралы деректерді жіберу. Бұл құрылғыдан Google-ға диагностика, құрылғы мен қолданбаны пайдалану деректері автоматты түрде жіберіліп тұрады. Бұл деректер баланың жеке басын анықтауға пайдаланылмайды. Олар жүйе мен қолданбаның тұрақты жұмыс істеуіне және басқа да жақсартулар енгізуге көмектеседі. Кейбір жиынтық деректер Google қолданбаларын жетілдіруге және Android әзірлеушілері сияқты серіктестердің жұмысына көмектеседі. Бұл параметрді иесі орнатқан. Егер "Интернет пен қолданбаларды пайдаланудың қосымша тарихы" параметрі қосылып тұрса, бұл деректер балаңыздың Google аккаунтына сақталуы мүмкін.</translation> @@ -6727,6 +6747,10 @@ <translation id="7744192722284567281">Деректер қолды болғанда табылды</translation> <translation id="7744649840067671761">Тағайындауды бастау үшін жаңа ауыстырғышты немесе пернетақта пернесін басыңыз. Тағайындалған элементті жою үшін тағайындалған ауыстырғышты немесе пернені басыңыз.</translation> +<translation id="7746739418892731373">Google Photos жинағындағы үздік фотосуреттер мен бейнелерді көріп тұрсыз. Көрсетілетін үздік элементтерді <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" /> бетінде реттей аласыз. + <ph name="BREAK" /> + <ph name="BREAK" /> + Осы картаға арналған параметрлерді карта мәзірінен реттей, басқа опцияларды "Chrome браузерін реттеу" бөлімінен көре аласыз.</translation> <translation id="7750228210027921155">Суреттегі сурет</translation> <translation id="7751260505918304024">Барлығын көрсету</translation> <translation id="7753735457098489144">Жад көлемі жеткіліксіз болғандықтан, орнату мүмкін болмады. Орын босату үшін құрылғы жадынан файлдарды жойыңыз.</translation> @@ -7108,6 +7132,7 @@ <translation id="8102139037507939978">Жеке тұлғаны анықтау ақпаратын system_logs.txt файлынан өшіру.</translation> <translation id="8104088837833760645">eSIM профилін жүктеп алу</translation> <translation id="8105368624971345109">Өшіру</translation> +<translation id="8105541061909542455">{NUM_APPS,plural, =1{Қолдау көрсетілмейтін қолданба}other{Қолдау көрсетілмейтін қолданбалар}}</translation> <translation id="8107015733319732394">Google Play Store дүкені <ph name="DEVICE_TYPE" /> құрылғысына орнатылуда. Бұл бірнеше минут алады.</translation> <translation id="810728361871746125">Дисплей ажыратымдылығы</translation> <translation id="8108526232944491552">{COUNT,plural, =0{Үшінші тараптың cookie файлдары жоқ}=1{Үшінші тараптың 1 cookie файлы бөгелді}other{Үшінші тараптың # cookie файлы бөгелді}}</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index d8446f92..989a0dc 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -1275,6 +1275,7 @@ <translation id="2218019600945559112">마우스 및 터치패드</translation> <translation id="2218320521449013367">Chrome에서 유해한 소프트웨어를 제거하는 중에 오류가 발생했습니다.</translation> <translation id="2218515861914035131">일반 텍스트로 붙여넣기</translation> +<translation id="2219658597883514593">가이드 다시 시작</translation> <translation id="2220409419896228519">즐겨찾는 Google 앱에 책갈피를 추가합니다.</translation> <translation id="2220529011494928058">문제 신고</translation> <translation id="2220572644011485463">PIN 또는 비밀번호</translation> @@ -2422,6 +2423,7 @@ <translation id="3378627645871606983">Steam에 부여된 권한은 모든 Steam 게임 및 앱에 적용됩니다.</translation> <translation id="337920581046691015"><ph name="PRODUCT_NAME" />이(가) 설치됩니다.</translation> <translation id="3380365263193509176">알 수 없는 오류가 발생했습니다.</translation> +<translation id="3380850890226973980">다음에 확인</translation> <translation id="3382073616108123819">시스템에서 이 기기의 기기 식별자를 확인하지 못했습니다.</translation> <translation id="3382200254148930874">감독 기능 중지...</translation> <translation id="338323348408199233">VPN 없는 트래픽 차단</translation> @@ -3208,6 +3210,10 @@ <translation id="4110490973560452005">다운로드 완료: <ph name="FILE_NAME" />. 다운로드바 영역으로 이동하려면 Shift+F6를 누르세요.</translation> <translation id="4110686435123617899">앨범 <ph name="TITLE" /> <ph name="DESC" /> 선택</translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" />(오프라인)</translation> +<translation id="4114524937989710624">Google Drive에서 최근 활동으로 쉽게 돌아갈 수 있도록 표시된 추천 파일입니다. + <ph name="BREAK" /> + <ph name="BREAK" /> + 카드 메뉴에서 설정을 관리하거나 Chrome 맞춤설정에서 추가 옵션을 확인할 수 있습니다.</translation> <translation id="4115002065223188701">네트워크 범위를 벗어남</translation> <translation id="4115378294792113321">자홍색</translation> <translation id="4116704186509653070">다시 열기</translation> @@ -3716,6 +3722,10 @@ <translation id="4651484272688821107">데모 모드 리소스로 온라인 구성요소를 로드하지 못했습니다.</translation> <translation id="4652935475563630866">카메라 설정을 변경하려면 Parallels Desktop을 다시 실행해야 합니다. 계속하려면 Parallels Desktop을 다시 실행하세요.</translation> <translation id="4653405415038586100">Linux 설정 중 오류 발생</translation> +<translation id="465406513924180949">웹에서 장바구니에 둔 항목으로 쉽게 돌아갈 수 있도록 표시된 장바구니입니다. + <ph name="BREAK" /> + <ph name="BREAK" /> + 카드 메뉴에서 설정을 관리하거나 Chrome 맞춤설정에서 추가 옵션을 확인할 수 있습니다.</translation> <translation id="4654236001025007561">파일을 근처의 Chromebook 및 Android 기기와 공유합니다.</translation> <translation id="4657914796247705218">TrackPoint 속도</translation> <translation id="4658285806588491142">화면을 비공개로 유지하세요</translation> @@ -4158,6 +4168,7 @@ <translation id="5121130586824819730">하드 디스크가 가득 찼습니다. 다른 위치에 저장하거나 하드 디스크에 더 많은 공간을 확보하시기 바랍니다.</translation> <translation id="5123433949759960244">농구공</translation> <translation id="5125751979347152379">잘못된 URL입니다.</translation> +<translation id="5125967981703109366">카드 정보</translation> <translation id="5126611267288187364">변경사항 보기</translation> <translation id="5127242257756472928">화면에 관한 정보를 사용하여 창을 열고 배치하는 것 허용되지 않음</translation> <translation id="5127620150973591153">보안 연결 ID: <ph name="TOKEN" /></translation> @@ -4219,6 +4230,7 @@ <translation id="5185500136143151980">인터넷 연결 없음</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" />(<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">소중한 추억을 되새겨 보세요. 앨범을 추가하거나 수정하려면 <ph name="LINK_BEGIN" />Google 포토<ph name="LINK_END" />로 이동하세요.</translation> +<translation id="5190316321948122159">{NUM_APPS,plural, =1{지금 앱 삭제}other{지금 앱 삭제}}</translation> <translation id="5190926251776387065">포트 활성화</translation> <translation id="5191094172448199359">입력한 PIN이 일치하지 않음</translation> <translation id="5191251636205085390">타사 쿠키를 대체하는 것을 목표로 하는 새로운 기술을 알아보고 관리하세요.</translation> @@ -4392,6 +4404,7 @@ <translation id="5342091991439452114">PIN은 <ph name="MINIMUM" />자리 이상이어야 합니다.</translation> <translation id="5344036115151554031">Linux 복원 중</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />%(오른쪽)</translation> +<translation id="534572711507965074">그룹의 이름을 지정하고 색상을 선택한 후 Enter를 탭하세요.</translation> <translation id="5345916423802287046">로그인 시 앱 실행</translation> <translation id="5350293332385664455">Google 어시스턴트 사용 중지</translation> <translation id="535123479159372765">다른 기기에서 텍스트가 복사됨</translation> @@ -4972,6 +4985,7 @@ <translation id="5946591249682680882">보고서 ID <ph name="WEBRTC_LOG_REPORT_ID" /></translation> <translation id="5948536763493709626">키보드 또는 마우스를 연결하거나 터치스크린을 사용하여 설정을 계속하세요. 블루투스 기기를 사용 중인 경우 기기를 페어링할 준비가 되었는지 확인합니다.</translation> <translation id="5949544233750246342">파일을 파싱할 수 없습니다.</translation> +<translation id="5950039854561387265">다음에 확인</translation> <translation id="5950819593680344519">Chrome이 컴퓨터에서 유해한 소프트웨어를 발견하지 못함 • 어제 확인</translation> <translation id="5951303645598168883"><ph name="ORIGIN" />에서 로컬 글꼴을 사용하려고 합니다.</translation> <translation id="5951624318208955736">모니터</translation> @@ -5142,6 +5156,10 @@ <translation id="6116921718742659598">언어 및 입력 설정 변경</translation> <translation id="6119927814891883061">기기 이름을 다음으로 지정: <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">이 페이지를 시작 화면에 고정...</translation> +<translation id="6120707837086723438">최근 레시피 검색 활동을 기반으로 표시되는 추천 레시피입니다. + <ph name="BREAK" /> + <ph name="BREAK" /> + 카드 메뉴에서 설정을 관리하거나 Chrome 맞춤설정에서 추가 옵션을 확인할 수 있습니다.</translation> <translation id="6121773125605585883"><ph name="WEBSITE" />의 사용자 이름 <ph name="USERNAME" /> 및 비밀번호 표시</translation> <translation id="6122081475643980456">인터넷 연결이 제어되고 있습니다.</translation> <translation id="6122093587541546701">이메일(선택사항):</translation> @@ -5234,6 +5252,7 @@ <translation id="6218058416316985984"><ph name="DEVICE_TYPE" />이(가) 오프라인 상태입니다. 인터넷에 연결하고 다시 시도해 보세요.</translation> <translation id="6220413761270491930">확장 프로그램 로드 중 오류</translation> <translation id="6223447490656896591">맞춤 이미지:</translation> +<translation id="62236885217374510">{NUM_APPS,plural, =1{지금 앱 삭제}other{지금 앱 삭제}}</translation> <translation id="6224481128663248237">포맷을 마쳤습니다.</translation> <translation id="622537739776246443">프로필이 삭제됩니다</translation> <translation id="6225475702458870625">데이터 연결을 <ph name="PHONE_NAME" />에서 사용할 수 있습니다.</translation> @@ -5866,6 +5885,7 @@ <translation id="6846178040388691741">‘<ph name="EXTENSION_NAME" />’ 확장 프로그램이 <ph name="PRINTER_NAME" />에서 <ph name="FILE_NAME" /> 파일을 인쇄하려고 합니다.</translation> <translation id="6847125920277401289">계속하려면 여유 공간을 확보하세요</translation> <translation id="6848388270925200958">현재 이 기기에서만 사용할 수 있는 카드가 있습니다.</translation> +<translation id="6848425544473873717">{NUM_APPS,plural, =1{앱 1개가 더 이상 지원되지 않습니다. <ph name="LEARN_MORE" />}other{앱 #개가 더 이상 지원되지 않습니다. <ph name="LEARN_MORE" />}}</translation> <translation id="6848716236260083778">지문을 설정하려면 자녀가 지문 센서를 터치하게 하세요. 자녀의 지문 데이터는 안전하게 저장되며 절대 <ph name="DEVICE_TYPE" /> 외부로 유출되지 않습니다</translation> <translation id="6850286078059909152">텍스트 색상</translation> <translation id="6851181413209322061">사용 및 진단 데이터를 보냅니다. 이 기기는 현재 진단, 기기 및 앱 사용 데이터를 Google에 자동으로 보내고 있습니다. 데이터는 자녀를 식별하는 용도로 사용되지 않으며, 시스템 및 앱 안정성 등을 개선하는 데 활용됩니다. 일부 수집 데이터는 Google 앱과 파트너(Android 개발자 등)에게도 도움을 줍니다. 설정은 소유자가 지정합니다. 자녀의 추가 웹 및 앱 활동이 사용 설정되어 있다면 이 데이터가 자녀의 Google 계정에 저장될 수 있습니다.</translation> @@ -6746,6 +6766,10 @@ <translation id="7744192722284567281">정보 유출에 포함됨</translation> <translation id="7744649840067671761">할당을 시작하려면 새 스위치 또는 키보드 키를 누르세요. 할당을 삭제하려면 할당된 스위치 또는 키를 누르세요.</translation> +<translation id="7746739418892731373">Google 사진 라이브러리의 사진 및 동영상 하이라이트입니다. <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" />에서 하이라이트에 표시되는 항목을 제어할 수 있습니다. + <ph name="BREAK" /> + <ph name="BREAK" /> + 카드 메뉴에서 카드 설정을 관리하거나 Chrome 맞춤설정에서 추가 옵션을 볼 수 있습니다.</translation> <translation id="7750228210027921155">PIP 모드</translation> <translation id="7751260505918304024">모두 표시</translation> <translation id="7753735457098489144">저장공간이 부족하여 설치할 수 없습니다. 여유 공간을 확보하려면 기기에서 파일을 삭제하세요.</translation> @@ -7130,6 +7154,7 @@ <translation id="8102139037507939978">system_logs.txt에서 개인 식별 정보를 삭제합니다.</translation> <translation id="8104088837833760645">eSIM 프로필 다운로드</translation> <translation id="8105368624971345109">사용 중지</translation> +<translation id="8105541061909542455">{NUM_APPS,plural, =1{지원되지 않는 앱}other{지원되지 않는 앱}}</translation> <translation id="8107015733319732394"><ph name="DEVICE_TYPE" />에 Google Play 스토어를 설치합니다. 설치하는 데 몇 분 정도 걸릴 수 있습니다.</translation> <translation id="810728361871746125">화면 해상도</translation> <translation id="8108526232944491552">{COUNT,plural, =0{타사 쿠키 없음}=1{타사 쿠키 1개가 차단됨}other{타사 쿠키 #개가 차단됨}}</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index 141d50de..9a6b8fa 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -3212,6 +3212,10 @@ <translation id="4110490973560452005">Жүктөп алуу аяктады: <ph name="FILE_NAME" />. Жүктөлүп алынган файлдар тилкесине өтүү үчүн Shift+F6 баскычтарын басыңыз.</translation> <translation id="4110686435123617899">Альбом тандаңыз <ph name="TITLE" /> <ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (оффлайн)</translation> +<translation id="4114524937989710624">Google Drive'дагы акыркы аракеттериңизге кайтууну жеңилдетүү үчүн сунушталган файлдарды көрүп турасыз. + <ph name="BREAK" /> + <ph name="BREAK" /> + Картанын менюсунан жөндөөлөрдү башкарсаңыз болот же көбүрөөк параметрлерди көрүү үчүн Chrome'ду ыңгайлаштыруу бөлүмүнө өтүңүз.</translation> <translation id="4115002065223188701">Тармак көрүнбөй калды</translation> <translation id="4115378294792113321">Маджента</translation> <translation id="4116704186509653070">Кайра ачуу</translation> @@ -3720,6 +3724,10 @@ <translation id="4651484272688821107">Онлайн компоненти демо режиминдеги ресурстар менен жүктөлбөй калды.</translation> <translation id="4652935475563630866">Камеранын жөндөөлөрүнө өзгөртүүлөр киргизилгендиктен Parallels Desktop'ту кайра иштетүү керек. Улантуу үчүн Parallels Desktop'ту кайра иштетиңиз.</translation> <translation id="4653405415038586100">Linux'ту конфигурациялоо катасы</translation> +<translation id="465406513924180949">Интернеттеги себеттерде калган нерселерге кайтууну жеңилдетүү үчүн себеттерди көрүп турасыз. + <ph name="BREAK" /> + <ph name="BREAK" /> + Картанын менюсунан жөндөөлөрдү башкарсаңыз болот же көбүрөөк параметрлерди көрүү үчүн Chrome'ду ыңгайлаштыруу бөлүмүнө өтүңүз.</translation> <translation id="4654236001025007561">Файлдарды айланаңыздагы Chromebook жана Android түзмөктөрү менен бөлүшүңүз</translation> <translation id="4657914796247705218">TrackPoint ылдамдыгы</translation> <translation id="4658285806588491142">Экраныңызды өзүңүз гана көрүңүз</translation> @@ -4162,6 +4170,7 @@ <translation id="5121130586824819730">Катуу дискиңиз толуп калды. Башка жерге сактаңыз же катуу дисктен орун бошотуңуз.</translation> <translation id="5123433949759960244">Баскетбол</translation> <translation id="5125751979347152379">Жараксыз URL.</translation> +<translation id="5125967981703109366">Бул карта жөнүндө маалымат</translation> <translation id="5126611267288187364">Өзгөртүүлөрдү көрүү</translation> <translation id="5127242257756472928">Терезелерди ачып, экранга жайгаштыруу үчүн экрандар тууралуу маалыматты колдонууга тыюу салынат</translation> <translation id="5127620150973591153">Коопсуз байланыш идентификатору: <ph name="TOKEN" /></translation> @@ -5148,6 +5157,10 @@ <translation id="6116921718742659598">Тил жана текст киргизүү жөндөөлөрүн өзгөртүү</translation> <translation id="6119927814891883061">Түзмөктүн аталышын <ph name="DEVICE_NAME" /> деп коюу</translation> <translation id="6120205520491252677">Бул бетти баштоо экранына кадап коюу…</translation> +<translation id="6120707837086723438">Акыркы жолу изделген рецепттердин негизинде сунушталган рецепттерди көрүп турасыз. + <ph name="BREAK" /> + <ph name="BREAK" /> + Картанын менюсунан жөндөөлөрдү башкарсаңыз болот же көбүрөөк параметрлерди көрүү үчүн Chrome'ду ыңгайлаштыруу бөлүмүнө өтүңүз.</translation> <translation id="6121773125605585883"><ph name="WEBSITE" /> үчүн <ph name="USERNAME" /> колдонуучу аты менен сырсөзүн көрүү</translation> <translation id="6122081475643980456">Интернет байланышыңыз көзөмөлдөнүүдө</translation> <translation id="6122093587541546701">Электрондук почта (милдеттүү эмес):</translation> @@ -6754,6 +6767,10 @@ <translation id="7744192722284567281">Сырсөз уурдалды</translation> <translation id="7744649840067671761">Башка аракеттерди дайындоо үчүн жаңы которгучту же баскычтоптогу баскычты таптап коюңуз. Дайындоону өчүрүү үчүн дайындалган которгучту же баскычты таптаңыз.</translation> +<translation id="7746739418892731373">Google Фото медиатекасында бөлүнүп көрсөтүлгөн сүрөттөр менен видеолорду көрүп турасыз. Эмнелер бөлүнүп көрсөтүлөрүн <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" /> бөлүмүнөн көзөмөлдөй аласыз. + <ph name="BREAK" /> + <ph name="BREAK" /> + Бул картанын жөндөөлөрүн картанын менюсунан башкарсаңыз болот же көбүрөөк параметрлерди көрүү үчүн Chrome'ду ыңгайлаштыруу бөлүмүнө өтүңүз.</translation> <translation id="7750228210027921155">Сүрөт ичиндеги сүрөт</translation> <translation id="7751260505918304024">Баарын көрсөтүү</translation> <translation id="7753735457098489144">Сактагычта орун жетишсиз болгондуктан, орнотулган жок. Орун бошотуу үчүн түзмөктүн сактагычынан файлдарды жок кылыңыз.</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index 6be3fab6..4219d70 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -3210,6 +3210,10 @@ <translation id="4110490973560452005">ການດາວໂຫຼດສຳເລັດແລ້ວ: <ph name="FILE_NAME" />. ກົດ Shift+F6 ເພື່ອໝຸນວົນໄປຫາບໍລິເວນແຖບການດາວໂຫຼດ.</translation> <translation id="4110686435123617899">ເລືອກອະລະບ້ຳ <ph name="TITLE" /> <ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (ອອບລາຍ)</translation> +<translation id="4114524937989710624">ທ່ານກຳລັງເບິ່ງໄຟລ໌ທີ່ແນະນຳເພື່ອຊ່ວຍໃຫ້ທ່ານກັບໄປຫາການເຄື່ອນໄຫວຫຼ້າສຸດຂອງທ່ານໃນ Google Drive ໄດ້ຢ່າງງ່າຍດາຍ. + <ph name="BREAK" /> + <ph name="BREAK" /> + ທ່ານສາມາດຈັດການການຕັ້ງຄ່າໄດ້ຈາກເມນູບັດ ຫຼື ເບິ່ງຕົວເລືອກເພີ່ມເຕີມໄດ້ໃນປັບແຕ່ງ Chrome.</translation> <translation id="4115002065223188701">ຢູ່ນອກເຂດສັນຍານເຄືອຂ່າຍ</translation> <translation id="4115378294792113321">ສີແດງມ່ວງ</translation> <translation id="4116704186509653070">ເປີດອີກເທື່ອໜຶ່ງ</translation> @@ -3718,6 +3722,10 @@ <translation id="4651484272688821107">ບໍ່ສາມາດໂຫຼດອົງປະກອບອອນລາຍທີ່ມີຊັບພະຍາກອນໂໝດສາທິດໄດ້.</translation> <translation id="4652935475563630866">ການປ່ຽນແປງການຕັ້ງຄ່າກ້ອງຖ່າຍຮູບກຳນົດໃຫ້ Parallels Desktop ເລີ່ມເປີດໃຊ້ໃໝ່. ເປີດການນຳໃຊ້ Parallels Desktop ເພື່ອສືບຕໍ່.</translation> <translation id="4653405415038586100">ເກີດຄວາມຜິດພາດໃນການຕັ້ງຄ່າ Linux</translation> +<translation id="465406513924180949">ທ່ານກຳລັງເບິ່ງກະຕ່າທີ່ຊ່ວຍທ່ານກັບໄປຫາລາຍການທີ່ທ່ານປະໄວ້ໃນກະຕ່າຊື້ເຄື່ອງໃນເວັບໄດ້ຢ່າງງ່າຍດາຍ. + <ph name="BREAK" /> + <ph name="BREAK" /> + ທ່ານສາມາດຈັດການການຕັ້ງຄ່າໄດ້ຈາກເມນູບັດ ຫຼື ເບິ່ງຕົວເລືອກເພີ່ມເຕີມໄດ້ໃນປັບແຕ່ງ Chrome.</translation> <translation id="4654236001025007561">ແບ່ງປັນໄຟລ໌ກັບ Chromebook ແລະ ອຸປະກອຍ Android ໃນບໍລິເວນທ່ານ</translation> <translation id="4657914796247705218">ຄວາມໄວ TrackPoint</translation> <translation id="4658285806588491142">ຮັກສາຄວາມເປັນສ່ວນຕົວໃຫ້ໜ້າຈໍຂອງທ່ານ</translation> @@ -4160,6 +4168,7 @@ <translation id="5121130586824819730">ຮາດດິສກ໌ຂອງທ່ານເຕັມ. ກະລຸນາບັນທຶກໄປໃສ່ທີ່ຕັ້ງອື່ນ ຫຼືເຮັດໃຫ້ມີຫ້ອງເພີ່ມຂຶ້ນຢູ່ໃນຮາດດິສກ໌.</translation> <translation id="5123433949759960244">ບານບ້ວງ</translation> <translation id="5125751979347152379">URL ໃຊ້ບໍ່ໄດ້.</translation> +<translation id="5125967981703109366">ກ່ຽວກັບບັດນີ້</translation> <translation id="5126611267288187364">ເບິ່ງການປ່ຽນແປງ</translation> <translation id="5127242257756472928">ບໍ່ອະນຸຍາດໃຫ້ໃຊ້ຂໍ້ມູນກ່ຽວກັບໜ້າຈໍຂອງທ່ານເພື່ອເປີດ ແລະ ວາງໜ້າຈໍຕ່າງໆໄດ້</translation> <translation id="5127620150973591153">ໄອດີການເຊື່ອມຕໍ່ທີ່ປອດໄພ: <ph name="TOKEN" /></translation> @@ -5146,6 +5155,10 @@ <translation id="6116921718742659598">ປ່ຽນພາສາ ແລະການຕັ້ງຄ່າປ້ອນຂໍ້ມູນເຂົ້າ</translation> <translation id="6119927814891883061">ຕັ້ງຊື່ອຸປະກອນ <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">ປັກໝຸດຫນ້ານີ້ເພື່ອເລີ່ມຕົ້ນຫນ້າຈໍ...</translation> +<translation id="6120707837086723438">ທ່ານກຳລັງເບິ່ງສູດທີ່ແນະນຳໂດຍອ້າງອີງໃສ່ການເຄື່ອນໄຫວການຊອກຫາຫຼ້າສຸດຂອງທ່ານສຳລັບສູດ. + <ph name="BREAK" /> + <ph name="BREAK" /> + ທ່ານສາມາດຈັດການການຕັ້ງຄ່າໄດ້ຈາກເມນູບັດ ຫຼື ເບິ່ງຕົວເລືອກເພີ່ມເຕີມໄດ້ໃນປັບແຕ່ງ Chrome.</translation> <translation id="6121773125605585883">ເບິ່ງລະຫັດຜ່ານທີ່ມີຊື່ຜູ້ໃຊ້ <ph name="USERNAME" /> ສຳລັບ <ph name="WEBSITE" /></translation> <translation id="6122081475643980456">ການເຊື່ອມຕໍ່ອິນເຕີເນັດຂອງທ່ານກໍາລັງຖືກຄວບຄຸມ</translation> <translation id="6122093587541546701">ອີເມວ (ທາງເລືອກ):</translation> @@ -6752,6 +6765,10 @@ <translation id="7744192722284567281">ພົບເຫັນໃນການລະເມີດຂໍ້ມູນ</translation> <translation id="7744649840067671761">ກົດສະວິດ ຫຼື ປຸ່ມແປ້ນພິມໃໝ່ເພື່ອເລີ່ມການມອບໝາຍ. ກົດສະວິດ ຫຼື ປຸ່ມທີ່ໄດ້ຮັບມອບໝາຍເພື່ອລຶບການມອບໝາຍອອກ.</translation> +<translation id="7746739418892731373">ທ່ານກຳລັງເບິ່ງໄຮໄລ້ຮູບພາບ ແລະ ວິດີໂອຈາກຫ້ອງສະໝຸດ Google ຮູບພາບຂອງທ່ານ. ທ່ານສາມາດຄວບຄຸມສິ່ງທີ່ປາກົດໃນໄຮໄລ້ຂອງທ່ານໄດ້ຢູ່ <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" />. + <ph name="BREAK" /> + <ph name="BREAK" /> + ທ່ານສາມາດຈັດການການຕັ້ງຄ່າສຳລັບບັດນີ້ໄດ້ຈາກເມນູບັດ ຫຼື ເບິ່ງຕົວເລືອກເພີ່ມເຕີມໄດ້ໃນປັບແຕ່ງ Chrome.</translation> <translation id="7750228210027921155">ສະແດງຜົນຊ້ອນກັນ</translation> <translation id="7751260505918304024">ສະແດງທັງຫມົດ</translation> <translation id="7753735457098489144">ຕິດຕັ້ງບໍ່ສຳເລັດຍ້ອນຂາດພື້ນທີ່ຈັດເກັບຂໍ້ມູນ. ເພື່ອຂະຫຍາຍພື້ນທີ່ຫວ່າງ, ໃຫ້ລຶບໄຟລ໌ຕ່າງໆຈາກບ່ອນເກັບຂໍ້ມູນຂອງອຸປະກອນ.</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 0ea1666d..cc0c3e2 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -1278,6 +1278,7 @@ <translation id="2218019600945559112">Pelė ir jutiklinė dalis</translation> <translation id="2218320521449013367">„Chrome“ šalinant kenkėjišką programinę įrangą įvyko klaida</translation> <translation id="2218515861914035131">Įklijuoti kaip grynąjį tekstą</translation> +<translation id="2219658597883514593">Leisti mokymo programą iš naujo</translation> <translation id="2220409419896228519">Pridėkite žymių prie mėgstamiausių „Google“ programų</translation> <translation id="2220529011494928058">Pranešti apie problemą</translation> <translation id="2220572644011485463">PIN kodas arba slaptažodis</translation> @@ -1346,6 +1347,7 @@ <translation id="2278562042389100163">Atidaryti naršyklės langą</translation> <translation id="2278668501808246459">Paleidžiama sudėtinių rodinių tvarkytuvė</translation> <translation id="2280486287150724112">Dešinioji paraštė</translation> +<translation id="2281863813036651454">Paspaudimas kairiuoju pelės klavišu</translation> <translation id="2282146716419988068">GPU procesas</translation> <translation id="2285109769884538519">{COUNT,plural, =0{Atidaryti viską &naujoje skirtukų grupėje}=1{Atidaryti &naujoje skirtukų grupėje}one{Atidaryti viską ({COUNT}) &naujoje skirtukų grupėj}few{Atidaryti viską ({COUNT}) &naujoje skirtukų grupėje}many{Atidaryti viską ({COUNT}) &naujoje skirtukų grupėje}other{Atidaryti viską ({COUNT}) &naujoje skirtukų grupėje}}</translation> <translation id="2285942871162473373">Kontrolinio kodo atpažinti nepavyko. Bandykite dar kartą.</translation> @@ -2424,6 +2426,7 @@ <translation id="3378627645871606983">„Steam“ suteikti leidimai taikomi visiems „Steam“ žaidimams ir programoms.</translation> <translation id="337920581046691015">„<ph name="PRODUCT_NAME" />“ bus įdiegta.</translation> <translation id="3380365263193509176">Nežinoma klaida</translation> +<translation id="3380850890226973980">Kitą kartą klausti</translation> <translation id="3382073616108123819">Oi! Sistemai nepavyko nustatyti šio įrenginio identifikatorių.</translation> <translation id="3382200254148930874">Stabdoma priežiūra...</translation> <translation id="338323348408199233">Blokuoti srautą, jei neprijungtas VPN</translation> @@ -3212,6 +3215,10 @@ <translation id="4110490973560452005">Atsisiuntimas baigtas: <ph name="FILE_NAME" />. Kad perjungtumėte į atsisiuntimų juostą, paspauskite „Shift“ + F6.</translation> <translation id="4110686435123617899">Pasirinkti albumą „<ph name="TITLE" />“ (<ph name="DESC" />)</translation> <translation id="4112194537011183136">„<ph name="DEVICE_NAME" />“ (neprisijungta)</translation> +<translation id="4114524937989710624">Rodomi siūlomi failai, skirti padėti jums lengvai grįžti prie pastarosios veiklos „Google“ diske. + <ph name="BREAK" /> + <ph name="BREAK" /> + Galite tvarkyti nustatymus kortelės meniu arba peržiūrėti daugiau parinkčių skiltyje „Chrome“ tinkinimas“.</translation> <translation id="4115002065223188701">Tinklas nepasiekiamas</translation> <translation id="4115378294792113321">Purpurinė</translation> <translation id="4116704186509653070">Atidaryti dar kartą</translation> @@ -3720,6 +3727,10 @@ <translation id="4651484272688821107">Nepavyko įkelti prisijungus pasiekiamo komponento naudojant demonstracinio režimo šaltinius.</translation> <translation id="4652935475563630866">Buvo pakeistas fotoaparato nustatymas, todėl reikia iš naujo paleisti „Parallels Desktop“. Norėdami tęsti, paleiskite „Parallels Desktop“ iš naujo.</translation> <translation id="4653405415038586100">Konfigūruojant „Linux“ įvyko klaida</translation> +<translation id="465406513924180949">Rodomi krepšeliai, kad galėtumėte lengvai grįžti prie prekių, kurias palikote pirkinių krepšeliuose žiniatinklyje. + <ph name="BREAK" /> + <ph name="BREAK" /> + Galite tvarkyti nustatymus kortelės meniu arba peržiūrėti daugiau parinkčių skiltyje „Chrome“ tinkinimas“.</translation> <translation id="4654236001025007561">Bendrinkite failus su „Chromebook“ ir „Android“ įrenginiais, esančiais netoliese</translation> <translation id="4657914796247705218">„TrackPoint“ sparta</translation> <translation id="4658285806588491142">Ekrano privatumo užtikrinimas</translation> @@ -4162,6 +4173,7 @@ <translation id="5121130586824819730">Jūsų standusis diskas pilnas. Išsaugokite kitoje vietoje arba atlaisvinkite vietos standžiajame diske.</translation> <translation id="5123433949759960244">Krepšinis</translation> <translation id="5125751979347152379">Negaliojantis URL.</translation> +<translation id="5125967981703109366">Apie šią kortelę</translation> <translation id="5126611267288187364">Peržiūrėti pakeitimus</translation> <translation id="5127242257756472928">Neleidžiama naudoti informacijos apie ekranus, kad būtų galima atidaryti ir įdėti langų</translation> <translation id="5127620150973591153">Saugaus ryšio ID: <ph name="TOKEN" /></translation> @@ -4223,6 +4235,7 @@ <translation id="5185500136143151980">Nėra interneto ryšio</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Atgaivinkite mėgstamiausius prisiminimus. Norėdami pridėti ar redaguoti albumus, eikite į <ph name="LINK_BEGIN" />„Google“ nuotraukas<ph name="LINK_END" />.</translation> +<translation id="5190316321948122159">{NUM_APPS,plural, =1{Dabar ištrinti programą}one{Dabar ištrinti programas}few{Dabar ištrinti programas}many{Dabar ištrinti programas}other{Dabar ištrinti programas}}</translation> <translation id="5190926251776387065">Suaktyvinti prievadą</translation> <translation id="5191094172448199359">Įvesti PIN kodai neatitinka</translation> <translation id="5191251636205085390">Sužinokite apie naujas technologijas, kurios pakeis trečiųjų šalių slapukus, ir valdykite jas</translation> @@ -4395,6 +4408,7 @@ <translation id="5342091991439452114">PIN kodą turi sudaryti bent <ph name="MINIMUM" /> skaitm.</translation> <translation id="5344036115151554031">Atkuriama „Linux“</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" /> % (dešinioji)</translation> +<translation id="534572711507965074">Pavadinkite grupę, pasirinkite spalvą ir palieskite „Enter“</translation> <translation id="5345916423802287046">Paleisti programą, kai prisijungiate</translation> <translation id="5350293332385664455">Išjungti „Google“ padėjėją</translation> <translation id="535123479159372765">Tekstas nukopijuotas iš kito įrenginio</translation> @@ -4976,6 +4990,7 @@ <translation id="5946591249682680882">Ataskaitos ID <ph name="WEBRTC_LOG_REPORT_ID" /></translation> <translation id="5948536763493709626">Prijunkite klaviatūrą ar pelę arba tęskite sąranką naudodamiesi jutikliniu ekranu. Jei naudojate „Bluetooth“ įrenginius, įsitikinkite, kad įrenginiai parengti susieti.</translation> <translation id="5949544233750246342">Nepavyksta išanalizuoti failo</translation> +<translation id="5950039854561387265">Kitą kartą klausti</translation> <translation id="5950819593680344519">„Chrome“ kompiuteryje nerado žalingos programinės įrangos. • Tikrinta vakar</translation> <translation id="5951303645598168883"><ph name="ORIGIN" /> nori naudoti vietinius šriftus</translation> <translation id="5951624318208955736">Monitorius</translation> @@ -5146,6 +5161,10 @@ <translation id="6116921718742659598">Keisti kalbos ir įvesties nustatymus</translation> <translation id="6119927814891883061">Įrenginį pavadinti „<ph name="DEVICE_NAME" />“</translation> <translation id="6120205520491252677">Prisegti šį puslapį prie pradžios ekrano...</translation> +<translation id="6120707837086723438">Matote siūlomus receptus, rodomus pagal jūsų naujausią su receptais susijusios paieškos veiklą. + <ph name="BREAK" /> + <ph name="BREAK" /> + Galite tvarkyti nustatymus kortelės meniu arba peržiūrėti daugiau parinkčių skiltyje „Chrome“ tinkinimas“.</translation> <translation id="6121773125605585883">Peržiūrėkite <ph name="WEBSITE" /> slaptažodį su naudotojo vardu <ph name="USERNAME" /></translation> <translation id="6122081475643980456">Jūsų interneto ryšys yra kontroliuojamas</translation> <translation id="6122093587541546701">El. paštas (pasirenkama):</translation> @@ -5162,6 +5181,7 @@ <translation id="6129938384427316298">„Netscape“ sertifikato komentaras</translation> <translation id="6129953537138746214">Tarpas</translation> <translation id="6130692320435119637">Pridėti „Wi-Fi“</translation> +<translation id="6130887916931372608">Klaviatūros klavišas</translation> <translation id="6136114942382973861">Uždaryti atsisiuntimų juostą</translation> <translation id="6136287496450963112">Saugos raktas neapsaugotas PIN kodu. Kad galėtumėte tvarkyti kontrolinius kodus, pirmiausia sukurkite PIN kodą.</translation> <translation id="6138680304137685902">X9.62 ECDSA parašas naudojant SHA-384</translation> @@ -5237,6 +5257,7 @@ <translation id="6218058416316985984">„<ph name="DEVICE_TYPE" />“ įrenginyje neįjungtas internetas. Prisijunkite prie interneto ir bandykite dar kartą.</translation> <translation id="6220413761270491930">Klaida įkeliant plėtinį</translation> <translation id="6223447490656896591">Tinkintas vaizdas:</translation> +<translation id="62236885217374510">{NUM_APPS,plural, =1{Dabar ištrinti programą}one{Dabar ištrinti programas}few{Dabar ištrinti programas}many{Dabar ištrinti programas}other{Dabar ištrinti programas}}</translation> <translation id="6224481128663248237">Formatavimas sėkmingai baigtas!</translation> <translation id="622537739776246443">Profilis bus ištrintas</translation> <translation id="6225475702458870625">Duomenų ryšys pasiekiamas iš „<ph name="PHONE_NAME" />“ telefono</translation> @@ -5869,6 +5890,7 @@ <translation id="6846178040388691741">„<ph name="EXTENSION_NAME" />“ nori spausdinti failą „<ph name="FILE_NAME" />“ spausdintuvu „<ph name="PRINTER_NAME" />“.</translation> <translation id="6847125920277401289">Atlaisvinkite vietos, kad galėtumėte tęsti</translation> <translation id="6848388270925200958">Šiuo metu turite kelias korteles, kurias galima naudoti tik šiuo įrenginiu</translation> +<translation id="6848425544473873717">{NUM_APPS,plural, =1{Viena jūsų programa nebepalaikoma. <ph name="LEARN_MORE" />}one{# jūsų programa nebepalaikoma. <ph name="LEARN_MORE" />}few{# jūsų programos nebepalaikomos. <ph name="LEARN_MORE" />}many{# jūsų programos nebepalaikoma. <ph name="LEARN_MORE" />}other{# jūsų programų nebepalaikoma. <ph name="LEARN_MORE" />}}</translation> <translation id="6848716236260083778">Jei norite nustatyti kontrolinį kodą, paprašykite, kad vaikas paliestų kontrolinio kodo jutiklį. Vaiko kontrolinio kodo duomenys saugomi saugiai ir niekada nepatenka už įrenginio „<ph name="DEVICE_TYPE" />“ ribų.</translation> <translation id="6850286078059909152">Teksto spalva</translation> <translation id="6851181413209322061">Siųskite naudojimo ir diagnostikos duomenis. Šiuo metu šis įrenginys automatiškai siunčia „Google“ diagnostikos, įrenginio ir programų naudojimo duomenis. Tai nebus naudojama siekiant nustatyti jūsų vaiko tapatybę ir padės pagerinti sistemos bei programos stabilumą ir teikti kitus patobulinimus. Kai kurie sukaupti duomenys taip pat bus naudingi „Google“ programoms ir partneriams, pvz., „Android“ kūrėjams. Šį nustatymą taiko savininkas. Jei papildomas Žiniatinklio ir programų veiklos nustatymas įjungtas vaiko įrenginyje, šie duomenys gali būti išsaugoti vaiko „Google“ paskyroje.</translation> @@ -6749,6 +6771,10 @@ <translation id="7744192722284567281">Rasta duomenų saugos pažeidime</translation> <translation id="7744649840067671761">Paspauskite naują jungiklį ar klaviatūros klavišą, kad pradėtumėte priskyrimo procesą. Paspauskite priskirtą jungiklį ar klavišą, kad pašalintumėte priskyrimą</translation> +<translation id="7746739418892731373">Matote svarbių įvykių nuotraukas ir vaizdo įrašus iš „Google“ nuotraukų bibliotekos. Galite valdyti, kas rodoma kaip svarbūs įvykiai, adresu <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" />. + <ph name="BREAK" /> + <ph name="BREAK" /> + Galite tvarkyti šios kortelės nustatymus kortelės meniu arba peržiūrėti daugiau parinkčių skiltyje „Chrome“ tinkinimas“.</translation> <translation id="7750228210027921155">Vaizdas vaizde</translation> <translation id="7751260505918304024">Rodyti visas</translation> <translation id="7753735457098489144">Įdiegti nepavyko, nes pritrūko saugyklos vietos. Kad atlaisvintumėte vietos, ištrinkite failus iš įrenginio saugyklos.</translation> @@ -6774,6 +6800,7 @@ <translation id="7768770796815395237">Keisti</translation> <translation id="7768784765476638775">Teksto ištarimas</translation> <translation id="7770406201819593386">Vykdyti „ChromeOS Flex“ diagnostikos bandymus.</translation> +<translation id="7770450735129978837">Paspaudimas dešiniuoju pelės klavišu</translation> <translation id="7770612696274572992">Vaizdas nukopijuotas iš kito įrenginio</translation> <translation id="7771452384635174008">Išdėstymas</translation> <translation id="7772032839648071052">Patvirtinti slaptafrazę</translation> @@ -7131,6 +7158,7 @@ <translation id="8102139037507939978">Panaikinti asmens identifikavimo informaciją iš „system_logs.txt“.</translation> <translation id="8104088837833760645">Atsisiųsti „eSIM“ kortelės profilį</translation> <translation id="8105368624971345109">Išjungti</translation> +<translation id="8105541061909542455">{NUM_APPS,plural, =1{Nepalaikoma programa}one{Nepalaikomos programos}few{Nepalaikomos programos}many{Nepalaikomos programos}other{Nepalaikomos programos}}</translation> <translation id="8107015733319732394">Įdiegiama „Google Play“ parduotuvė jūsų „<ph name="DEVICE_TYPE" />“ įrenginyje. Tai gali šiek tiek užtrukti.</translation> <translation id="810728361871746125">Ekrano skyra</translation> <translation id="8108526232944491552">{COUNT,plural, =0{Nėra trečiųjų šalių slapukų}=1{1 trečiųjų šalių slapukas}one{# trečiųjų šalių slapukas}few{# trečiųjų šalių slapukai}many{# trečiųjų šalių slapuko}other{# trečiųjų šalių slapukų}}</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 4c006519..6df197b 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -1330,6 +1330,7 @@ <translation id="2278562042389100163">Atvērt pārlūka logu</translation> <translation id="2278668501808246459">Notiek konteineru pārvaldnieka startēšana</translation> <translation id="2280486287150724112">Labā piemale</translation> +<translation id="2281863813036651454">Klikšķis ar peles kreiso pogu</translation> <translation id="2282146716419988068">GPU process</translation> <translation id="2285109769884538519">{COUNT,plural, =0{Atvērt visus &jaunā ciļņu grupā}=1{Atvērt &jaunā ciļņu grupā}zero{Atvērt visus ({COUNT}) &jaunā ciļņu grupā}one{Atvērt visus ({COUNT}) &jaunā ciļņu grupā}other{Atvērt visus ({COUNT}) &jaunā ciļņu grupā}}</translation> <translation id="2285942871162473373">Nevarēja atpazīt pirksta nospiedumu. Mēģiniet vēlreiz.</translation> @@ -5144,6 +5145,7 @@ <translation id="6129938384427316298">Netscape sertifikāta komentārs</translation> <translation id="6129953537138746214">Atstarpe</translation> <translation id="6130692320435119637">Pievienot Wi-Fi tīklu</translation> +<translation id="6130887916931372608">Tastatūras taustiņš</translation> <translation id="6136114942382973861">Aizvērt lejupielāžu joslu</translation> <translation id="6136287496450963112">Jūsu drošības atslēga nav aizsargāta ar PIN kodu. Lai pārvaldītu pirkstu nospiedumus, vispirms izveidojiet PIN kodu.</translation> <translation id="6138680304137685902">X9.62 ECDSA paraksts ar SHA-384</translation> @@ -6756,6 +6758,7 @@ <translation id="7768770796815395237">Mainīt</translation> <translation id="7768784765476638775">Atlasīt, lai izrunātu</translation> <translation id="7770406201819593386">Izpildīt Chrome OS Flex diagnostikas testus.</translation> +<translation id="7770450735129978837">Klikšķis ar peles labo pogu</translation> <translation id="7770612696274572992">Attēls nokopēts no citas ierīces</translation> <translation id="7771452384635174008">Izkārtojums</translation> <translation id="7772032839648071052">Apstipriniet ieejas frāzi</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index 6aaa15b..5a1f585c 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -1273,6 +1273,7 @@ <translation id="2218019600945559112">မောက်စ်နှင့် ထိတွေ့ညွှန်ကြားခြင်းကိရိယာ</translation> <translation id="2218320521449013367">Chrome သည် အန္တရာယ်ရှိသည့် ဆော့ဖ်ဝဲကို ဖယ်ရှားနေစဉ် အမှားအယွင်း ရှိနေသည်</translation> <translation id="2218515861914035131">ရိုးရိုးစာသားအဖြစ် ကူးယူရန်</translation> +<translation id="2219658597883514593">ရှင်းလင်းပို့ချချက် ပြန်စရန်</translation> <translation id="2220409419896228519">သင်အကြိုက်ဆုံး Google Apps သို့ လိပ်စာများထည့်သည်။</translation> <translation id="2220529011494928058">ပြဿနာ အစီရင်ခံရန်</translation> <translation id="2220572644011485463">ပင်နံပါတ် သို့မဟုတ် စကားဝှက်</translation> @@ -2420,6 +2421,7 @@ <translation id="3378627645871606983">Steam အတွက် ခွင့်ပြုချက်များသည် Steam ဂိမ်းနှင့် အက်ပ်အားလုံးအတွက် အကျုံးဝင်သည်။</translation> <translation id="337920581046691015"><ph name="PRODUCT_NAME" /> အားထည့်သွင်းလိုက်ပါပြီ။</translation> <translation id="3380365263193509176">မသိရ အမှား</translation> +<translation id="3380850890226973980">နောက်တစ်ကြိမ်မှ မေးရန်</translation> <translation id="3382073616108123819">အူးပ်စ်! စနစ်က ဒီကိရိယာ အတွက် ကိရိယာကို ဖေါ်ထုတ်ပေးသူအား ဆုံးဖြတ် မပေးနိုင်ခဲ့ပါ။</translation> <translation id="3382200254148930874">ကြီးကြပ်မှု ရပ်နေသည်...</translation> <translation id="338323348408199233">VPN မသုံးသည့် ဒေတာစီးဆင်းမှုကို ပိတ်ထားရန်</translation> @@ -3207,6 +3209,10 @@ <translation id="4110490973560452005">ဒေါင်းလုဒ်လုပ်ပြီးပါပြီ− <ph name="FILE_NAME" />။ ဒေါင်းလုဒ်များ ဘားဧရိယာသို့ သွားရန် Shift+F6 နှိပ်ပါ။</translation> <translation id="4110686435123617899"><ph name="TITLE" /> <ph name="DESC" /> အယ်လ်ဘမ်ရွေးရန်</translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (အော့ဖ်လိုင်း)</translation> +<translation id="4114524937989710624">Google Drive ရှိ လတ်တလောအဖြစ်ဆုံး လုပ်ဆောင်ချက်သို့ အလွယ်တကူပြန်သွားနိုင်ရန် အကြံပြုထားသောဖိုင်များကို မြင်နေရခြင်းဖြစ်သည်။ + <ph name="BREAK" /> + <ph name="BREAK" /> + ကတ်မီနူးတွင် ဆက်တင်များကို စီမံနိုင်သည် (သို့) ‘Chrome စိတ်ကြိုက်လုပ်ခြင်း’ တွင် နောက်ထပ်ရွေးစရာများ ကြည့်နိုင်သည်။</translation> <translation id="4115002065223188701">ကွန်ရက် မမိတော့ပါ</translation> <translation id="4115378294792113321">ပန်းခရမ်းရောင်</translation> <translation id="4116704186509653070">ပြန်ဖွင့်ရန်</translation> @@ -3715,6 +3721,10 @@ <translation id="4651484272688821107">သရုပ်ပြမုဒ်အရင်းအမြစ်များဖြင့် အွန်လိုင်းအစိတ်အပိုင်းကို ဖွင့်၍မရပါ။</translation> <translation id="4652935475563630866">ကင်မရာဆက်တင် ပြောင်းလဲမှု အကျိုးသက်ရောက်စေရန် Parallels Desktop ကို ပြန်ဖွင့်ရပါမည်။ ရှေ့ဆက်ရန် Parallels Desktop ကို ပြန်ဖွင့်ပါ။</translation> <translation id="4653405415038586100">Linux စီစဉ်သတ်မှတ်ရာတွင် အမှားအယွင်းရှိသည်</translation> +<translation id="465406513924180949">ဝဘ်ပေါ်ရှိ ဈေးခြင်းတောင်းများတွင် ကျန်ခဲ့သောပစ္စည်းများသို့ အလွယ်တကူပြန်သွားနိုင်ရန် ကူညီပေးသည့် ဈေးခြင်းတောင်းများကို မြင်နေရခြင်းဖြစ်သည်။ + <ph name="BREAK" /> + <ph name="BREAK" /> + ကတ်မီနူးတွင် ဆက်တင်များကို စီမံနိုင်သည် (သို့) ‘Chrome စိတ်ကြိုက်လုပ်ခြင်း’ တွင် နောက်ထပ်ရွေးစရာများ ကြည့်နိုင်သည်။</translation> <translation id="4654236001025007561">သင့်အနီးရှိ Chromebook နှင့် Android စက်များအား ဖိုင်များမျှဝေပါ</translation> <translation id="4657914796247705218">TrackPoint မြန်နှုန်း</translation> <translation id="4658285806588491142">ဖန်သားပြင်ကို ပုဂ္ဂိုလ်ရေးသီးသန့်ပြုလုပ်ခြင်း</translation> @@ -4157,6 +4167,7 @@ <translation id="5121130586824819730">သင့်ဟာ့ဒစ် ပြည့်ပါပြီ။ ကျေးဇူးပြု၍ အခြားတည်နေရာတစ်ခုသို့ သိမ်းပါ သို့မဟုတ် ဟာ့ဒစ်ပေါ်တွင် နေရာများရန် ပြုလုပ်ပါ။</translation> <translation id="5123433949759960244">ဘတ်စကက်ဘော</translation> <translation id="5125751979347152379">URL မမှန်</translation> +<translation id="5125967981703109366">ဤကတ်အကြောင်း</translation> <translation id="5126611267288187364">ပြောင်းလဲမှုများကို ကြည့်ရန်</translation> <translation id="5127242257756472928">ဝင်းဒိုးများဖွင့်ပြီး နေရာချထားရန်အတွက် သင့်ဖန်သားပြင်အချက်အလက်ကို အသုံးပြုရန် ခွင့်ပြုမထားပါ</translation> <translation id="5127620150973591153">လုံခြုံသော ချိတ်ဆက်မှု ID−<ph name="TOKEN" /></translation> @@ -4218,6 +4229,7 @@ <translation id="5185500136143151980">အင်တာနက် မရှိပါ</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">သင့်အကြိုက်ဆုံး အမှတ်တရအချိန်များကို ပြန်လည်ခံစားကြည့်ပါ။ အယ်လ်ဘမ်များ ထည့်ရန် သို့မဟုတ် တည်းဖြတ်ရန် <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" /> သို့သွားပါ။</translation> +<translation id="5190316321948122159">{NUM_APPS,plural, =1{အက်ပ်ကို ယခုဖျက်ရန်}other{အက်ပ်များ ယခုဖျက်ရန်}}</translation> <translation id="5190926251776387065">ပို့တ်စဖွင့်ရန်</translation> <translation id="5191094172448199359">သင်ထည့်ထားသော ပင်နံပါတ်များ မတူညီပါ</translation> <translation id="5191251636205085390">ပြင်ပကုမ္ပဏီကွတ်ကီးများကို အစားထိုးမည့် နည်းပညာသစ်များအကြောင်း လေ့လာပြီး စီမံပါ</translation> @@ -4390,6 +4402,7 @@ <translation id="5342091991439452114">ပင်နံပါတ်သည် အနည်းဆုံးဂဏန်း <ph name="MINIMUM" /> လုံးရှိရပါမည်</translation> <translation id="5344036115151554031">Linux ကို ပြန်ယူနေသည်</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (ညာ)</translation> +<translation id="534572711507965074">အဖွဲ့အမည်ပေးကာ အရောင်ရွေးပြီး Enter ခလုတ်တို့ပါ</translation> <translation id="5345916423802287046">သင်လက်မှတ်ထိုးဝင်သောအခါ အက်ပ်စတင်ရန်</translation> <translation id="5350293332385664455">Google Assistant ပိတ်ရန်</translation> <translation id="535123479159372765">အခြားစက်မှ မိတ္တူကူးထားသည့် စာသား</translation> @@ -4969,6 +4982,7 @@ <translation id="5946591249682680882">ID အစီရင်ခံရန် <ph name="WEBRTC_LOG_REPORT_ID" /></translation> <translation id="5948536763493709626">ကီးဘုတ် (သို့) မောက်စ်နှင့် ချိတ်ဆက်ပါ၊ (သို့) သင့်တို့ထိမျက်နှာပြင် သုံး၍ စနစ်ဆက်လက်ထည့်သွင်းပါ။ ဘလူးတုသ်သုံးစက်များ သုံးနေပါက သင့်စက်များတွဲချိတ်ရန် အသင့်ဖြစ်နေကြောင်း သေချာပါစေ။</translation> <translation id="5949544233750246342">ဖိုင်ကို ခွဲခြမ်းစိတ်ဖြာနိုင်ခြင်း မရှိပါ</translation> +<translation id="5950039854561387265">နောက်တစ်ကြိမ်မှ မေးရန်</translation> <translation id="5950819593680344519">Chrome သည် သင့်ကွန်ပျူတာတွင် အန္တရာယ်ဆော့ဖ်ဝဲကို ရှာမတွေ့ပါ • မနေ့က စစ်ထားသည်</translation> <translation id="5951303645598168883"><ph name="ORIGIN" /> က စက်အတွင်းရှိ ဖောင့်များကို အသုံးပြုလိုသည်</translation> <translation id="5951624318208955736">မော်နီတာ</translation> @@ -5139,6 +5153,10 @@ <translation id="6116921718742659598">ဘာသာစကား နှင့် ရိုက်သွင်းရေး ဆက်တင်များကို ပြောင်းလဲရန်</translation> <translation id="6119927814891883061"><ph name="DEVICE_NAME" /> အဖြစ် အမည်ပေးရန်</translation> <translation id="6120205520491252677">မျက်နှာပြင်ကို စတင်ရန် ဒီစာမျက်နှာကို ပင်ထိုးထားရန်...</translation> +<translation id="6120707837086723438">ချက်ပြုတ်နည်းများအတွက် သင်၏လတ်တလော ‘ရှာဖွေရေးလုပ်ဆောင်ချက်’ ပေါ်အခြေခံသည့် ချက်ပြုတ်နည်းအကြံပြုချက်များကို မြင်နေရခြင်းဖြစ်သည်။ + <ph name="BREAK" /> + <ph name="BREAK" /> + ကတ်မီနူးတွင် ဆက်တင်များကို စီမံနိုင်သည် (သို့) ‘Chrome စိတ်ကြိုက်လုပ်ခြင်း’ တွင် နောက်ထပ်ရွေးစရာများ ကြည့်နိုင်သည်။</translation> <translation id="6121773125605585883"><ph name="WEBSITE" /> အတွက် အသုံးပြုသူအမည် <ph name="USERNAME" /> နှင့် စကားဝှက်ကို ကြည့်ပါ</translation> <translation id="6122081475643980456">သင်၏ အင်တာနက် ချိတ်ဆက်မှုကို ထိန်းချုပ်ထား</translation> <translation id="6122093587541546701">အီးမေးလ် (ရွေးချယ်နိုင်):</translation> @@ -5231,6 +5249,7 @@ <translation id="6218058416316985984"><ph name="DEVICE_TYPE" /> သည် အော့ဖ်လိုင်း ဖြစ်နေပါသည်။ အင်တာနက်သို့ ချိတ်ဆက်ပြီး ထပ်စမ်းကြည့်ပါ။</translation> <translation id="6220413761270491930">တိုးချဲ့မှု တင်မှု အမှား</translation> <translation id="6223447490656896591">စိတ်ကြိုက် ပုံ:</translation> +<translation id="62236885217374510">{NUM_APPS,plural, =1{အက်ပ်ကို ယခုဖျက်ရန်}other{အက်ပ်များ ယခုဖျက်ရန်}}</translation> <translation id="6224481128663248237">ပြန်လည်ဖိုင်စီခြင်း အောင်မြင်စွာ ပြီးဆုံးပါသည်!</translation> <translation id="622537739776246443">ပရိုဖိုင်ကို ဖျက်ပါမည်</translation> <translation id="6225475702458870625">သင်၏ <ph name="PHONE_NAME" /> မှ ဒေတာချိတ်ဆက်မှု ရရှိနိုင်ပါသည်</translation> @@ -5862,6 +5881,7 @@ <translation id="6846178040388691741">"<ph name="EXTENSION_NAME" />" က <ph name="FILE_NAME" /> ကို <ph name="PRINTER_NAME" /> ဖြင့် ပုံနှိပ်ထုတ်ယူလိုသည်။</translation> <translation id="6847125920277401289">ရှေ့ဆက်ရန် နေရာလွတ်ပြုလုပ်ပါ</translation> <translation id="6848388270925200958">လက်ရှိတွင် ဤစက်ပစ္စည်းပေါ်၌ အသုံးပြုနိုင်သည့် ကတ်အချို့သာရှိပါသည်</translation> +<translation id="6848425544473873717">{NUM_APPS,plural, =1{သင့်အက်ပ် 1 ခုကို ပံ့ပိုးမှုမရှိတော့ပါ။ <ph name="LEARN_MORE" />}other{သင့်အက်ပ် # ခုကို ပံ့ပိုးမှုမရှိတော့ပါ။ <ph name="LEARN_MORE" />}}</translation> <translation id="6848716236260083778">လက်ဗွေစနစ်ထည့်သွင်းရန် သင့်ကလေးအား လက်ဗွေ အာရုံခံကိရိယာကို ထိခိုင်းပါ။ သင့်ကလေး၏ လက်ဗွေဒေတာကို ဤ <ph name="DEVICE_TYPE" /> တွင်သာ လုံခြုံစွာ သိမ်းထားသည်။</translation> <translation id="6850286078059909152">စာသားအရောင်</translation> <translation id="6851181413209322061">အသုံးပြုမှုနှင့် အမှားရှာဖွေမှုဒေတာ ပို့ပါ။ ဤစက်ပစ္စည်းက အမှားရှာဖွေမှု၊ စက်ပစ္စည်းနှင့် အက်ပ်အသုံးပြုမှု ဒေတာတို့ကို လောလောဆယ်တွင် Google သို့ အလိုအလျောက် ပို့ပေးပါသည်။ ၎င်းကို အသုံးပြု၍ သင့်ကလေး မည်သူမည်ဝါဖြစ်ကြောင်း ထုတ်ဖော်သွားမည် မဟုတ်ဘဲ စနစ်နှင့် အက်ပ်တည်ငြိမ်မှု၊ အခြား တိုးတက်ပြင်ဆင်မှုများအတွက် အသုံးပြုသွားပါမည်။ စုစည်းထားသော ဒေတာအချို့က Google အက်ပ်နှင့် Android ဆော့ဖ်ဝဲအင်ဂျင်နီယာများကဲ့သို့ ပါတနာများကို ကူညီပေးပါမည်။ ဤဆက်တင်ကို ပိုင်ရှင်ဖြစ်သူက သတ်မှတ်ထားခြင်းဖြစ်သည်။ သင့်ကလေးအတွက် ထပ်တိုး 'ဝဘ်နှင့် အက်ပ်လုပ်ဆောင်ချက်' ကို ဖွင့်ထားသည့်အခါ ဤဒေတာကို သူ၏ Google အကောင့်သို့ သိမ်းသွားပါမည်။</translation> @@ -6742,6 +6762,10 @@ <translation id="7744192722284567281">ဒေတာကျိုးပေါက်မှုတွင် တွေ့ထားသည်</translation> <translation id="7744649840067671761">သတ်မှတ်မှုစတင်ရန် အသွင်တူခလုတ် (သို့) ကီးဘုတ်ကီး အသစ်ကို နှိပ်ပါ။ သတ်မှတ်မှုဖယ်ရှားရန် သတ်မှတ်ထားသော အသွင်တူခလုတ် (သို့) ကီးကို နှိပ်ပါ။</translation> +<translation id="7746739418892731373">သင်၏ Google Photos ဒစ်ဂျစ်တိုက်မှ ဓာတ်ပုံနှင့် ဗီဒီယိုအထူးပြသမှုများကို မြင်နေရခြင်းဖြစ်သည်။ အထူးပြသမှုများတွင် ပြမည့်အရာကို <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" /> ၌ စီမံနိုင်သည်။ + <ph name="BREAK" /> + <ph name="BREAK" /> + ကတ်မီနူးတွင် ဤကတ်အတွက်ဆက်တင်များကို စီမံနိုင်သည် (သို့) ‘Chrome စိတ်ကြိုက်လုပ်ခြင်း’ တွင် နောက်ထပ်ရွေးစရာများ ကြည့်နိုင်သည်။</translation> <translation id="7750228210027921155">နှစ်ခုထပ်၍ကြည့်ခြင်း</translation> <translation id="7751260505918304024">အားလုံးပြပါ</translation> <translation id="7753735457098489144">သိုလှောင်ခန်း နေရာ မရှိသဖြင့် ထည့်သွင်း၍မရပါ။ နေရာလွတ်ပြုလုပ်ရန် စက်သိုလှောင်ခန်းမှ ဖိုင်များကို ဖျက်ပါ။</translation> @@ -7124,6 +7148,7 @@ <translation id="8102139037507939978">system_logs.txt မှ 'ပုဂ္ဂိုလ်ရေးအရ ခွဲခြားသိရှိနိုင်သော အချက်အလက်များ' ကို ဖယ်ရှားသည်။</translation> <translation id="8104088837833760645">eSIM ပရိုဖိုင် ဒေါင်းလုဒ်လုပ်ရန်</translation> <translation id="8105368624971345109">ပိတ်ပါ</translation> +<translation id="8105541061909542455">{NUM_APPS,plural, =1{ပံ့ပိုးမထားသော အက်ပ်}other{ပံ့ပိုးမထားသော အက်ပ်များ}}</translation> <translation id="8107015733319732394">သင့် <ph name="DEVICE_TYPE" /> တွင် Google Play Store ကို ထည့်သွင်းနေပါသည်။ မိနစ်အနည်းငယ် ကြာနိုင်ပါသည်။</translation> <translation id="810728361871746125">မျက်နှာပြင်ပြသမှုပုံရိပ် ပြတ်သားကိန်း</translation> <translation id="8108526232944491552">{COUNT,plural, =0{ပြင်ပအဖွဲ့အစည်း၏ ကွတ်ကီးများ မရှိပါ}=1{ပြင်ပအဖွဲ့အစည်း၏ ကွတ်ကီး ၁ ခုကို ပိတ်ထားသည်}other{ပြင်ပအဖွဲ့အစည်း၏ ကွတ်ကီး # ခုကို ပိတ်ထားသည်}}</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index c6db6cac..86eb3a4a 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -3194,6 +3194,10 @@ <translation id="4110490973560452005">डाउनलोड सम्पन्न भयो: <ph name="FILE_NAME" />। डाउनलोडहरूको पट्टीमा जान Shift+F6 थिच्नुहोस्।</translation> <translation id="4110686435123617899"><ph name="TITLE" /> <ph name="DESC" /> एल्बम चयन गर्नुहोस्</translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (अफलाइन)</translation> +<translation id="4114524937989710624">तपाईंले Google Drive मा गर्नुभएका हालसालैको क्रियाकलापका आधारमा तपाईंलाई Google Drive मा फाइलहरू खोज्न सजिलो होस् भन्नाका लागि तपाईं सिफारिस गरिएका फाइलहरू देख्दै हुनुहुन्छ। + <ph name="BREAK" /> + <ph name="BREAK" /> + तपाईं कार्ड मेनुमार्फत सेटिङ मिलाउन वा "Chrome कस्टमाइज गर्नुहोस्" मा गई थप विकल्पहरू हेर्न सक्नुहुन्छ।</translation> <translation id="4115002065223188701">नेटवर्क पहुँचको दायराभन्दा बाहिर छ</translation> <translation id="4115378294792113321">म्याग्नेटा</translation> <translation id="4116704186509653070">फेरि खोल्नुहोस्</translation> @@ -3701,6 +3705,10 @@ <translation id="4651484272688821107">डेमो मोडका स्रोतहरूमार्फत अनलाइन कम्पोनेन्ट लोड गर्न सकिएन।</translation> <translation id="4652935475563630866">क्यामेराको सेटिङमा गरिएका परिवर्तन लागू गर्न Parallels Desktop बन्द गरेर फेरि खोल्नु पर्ने हुन्छ। अगाडि बढ्नका निम्ति Parallels Desktop बन्द गरेर फेरि खोल्नुहोस्।</translation> <translation id="4653405415038586100">Linux कन्फिगर गर्ने क्रममा त्रुटि भयो</translation> +<translation id="465406513924180949">तपाईं आफूले वेबमा रहेका सपिङ कार्टहरूमा हालेका वस्तुहरू खोज्न आफूलाई मद्दत गर्ने कार्टहरू देख्दै हुनुहुन्छ। + <ph name="BREAK" /> + <ph name="BREAK" /> + तपाईं कार्ड मेनुमार्फत सेटिङ मिलाउन वा "Chrome कस्टमाइज गर्नुहोस्" मा गई थप विकल्पहरू हेर्न सक्नुहुन्छ।</translation> <translation id="4654236001025007561">आफू वरपरका Chromebook तथा Android यन्त्रसँग फाइलहरू सेयर गर्नुहोस्</translation> <translation id="4657914796247705218">TrackPoint को गति</translation> <translation id="4658285806588491142">आफ्नो डिभाइसको स्क्रिन गोप्य राख्नुहोस्</translation> @@ -4143,6 +4151,7 @@ <translation id="5121130586824819730">तपाईंको हार्ड डिस्क भरिएको छ । कृपया अर्को स्थानमा बचत गर्नुहोस् वा हार्डडिस्कमा थप खाली ठाउँ बनाउनुहोस् ।</translation> <translation id="5123433949759960244">बास्केटबल</translation> <translation id="5125751979347152379">अवैध URL।</translation> +<translation id="5125967981703109366">यस कार्डका बारेमा</translation> <translation id="5126611267288187364">परिवर्तनहरू हेर्नुहोस्</translation> <translation id="5127242257756472928">विन्डोहरू खोल्ने र स्क्रिनमा ती विन्डो राख्ने प्रयोजनका लागि तपाईंका स्क्रिनहरूका बारेमा जानकारी प्रयोग गर्ने अनुमति दिइएको छैन</translation> <translation id="5127620150973591153">सुरक्षित कनेक्सन ID: <ph name="TOKEN" /></translation> @@ -5128,6 +5137,10 @@ <translation id="6116921718742659598">भाषा र इनपुट सेटिङहरू परिवर्तन गर्नुहोस्</translation> <translation id="6119927814891883061">यो डिभाइसको नाम <ph name="DEVICE_NAME" /> राख्नुहोस्</translation> <translation id="6120205520491252677">यस पृष्ठलाई सुरुवात स्क्रिनमा पिन गर्नुहोस्...</translation> +<translation id="6120707837086723438">तपाईं आफूले पाकविधिका बारेमा गरेका हालसालैका खोज गतिविधिका आधारमा सिफारिस गरिएका पाकविधिहरू देख्दै हुनुहुन्छ। + <ph name="BREAK" /> + <ph name="BREAK" /> + तपाईं कार्ड मेनुमार्फत सेटिङ मिलाउन वा "Chrome कस्टमाइज गर्नुहोस्" मा गई थप विकल्पहरू हेर्न सक्नुहुन्छ।</translation> <translation id="6121773125605585883"><ph name="WEBSITE" /> मा <ph name="USERNAME" /> युजरनेमको पासवर्ड हेर्नुहोस्</translation> <translation id="6122081475643980456">तपाईंको इन्टरनेट जडान नियन्त्रणमा रहेको छ</translation> <translation id="6122093587541546701">इमेल (वैकल्पिक):</translation> @@ -6734,6 +6747,10 @@ <translation id="7744192722284567281">डेटा चोरीको घटनामा फेला परेको</translation> <translation id="7744649840067671761">तपाईं कुनै नयाँ स्विच वा की असाइन गर्न चाहनुहुन्छ भने उक्त स्विच वा किबोर्ड की थिच्नुहोस्। तपाईं असाइन गरिएको स्विच वा की हटाउन चाहनुहुन्छ भने उक्त स्विच वा की थिच्नुहोस्।</translation> +<translation id="7746739418892731373">तपाईं आफ्नो Google Photos को लाइब्रेरीमा भएका फोटो तथा भिडियोका हाइलाइटहरू देख्दै हुनुहुन्छ। तपाईं <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" /> मा गई हाइलाइटमा कुन कुन सामग्री देखाउने भन्ने कुरा व्यवस्थापन गर्न सक्नुहुन्छ। + <ph name="BREAK" /> + <ph name="BREAK" /> + तपाईं कार्ड मेनुमार्फत यो कार्डको सेटिङ मिलाउन वा "Chrome कस्टमाइज गर्नुहोस्" मा गई थप विकल्पहरू हेर्न सक्नुहुन्छ।</translation> <translation id="7750228210027921155">Picture in picture</translation> <translation id="7751260505918304024">सबै देखाउनुहोस्</translation> <translation id="7753735457098489144">पर्याप्त भण्डारण स्थान नभएका कारण स्थापना गर्न सकिएन। ठाउँ खाली गर्न यन्त्रको भण्डारणबाट फाइलहरू मेटाउनुहोस्।</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 47398b0..bd44ca5 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -3196,6 +3196,9 @@ <translation id="4110490973560452005">Download voltooid: <ph name="FILE_NAME" />. Druk op Shift+F6 om naar het gedeelte met de downloadbalk te gaan.</translation> <translation id="4110686435123617899">Album selecteren: <ph name="TITLE" /> (<ph name="DESC" />)</translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (offline)</translation> +<translation id="4114524937989710624">Je ziet voorgestelde bestanden om makkelijk terug te gaan naar je meest recente activiteit in Google Drive. + <ph name="BREAK" /><ph name="BREAK" /> +Je kunt instellingen beheren via het kaartmenu of meer opties bekijken in het gedeelte Chrome aanpassen.</translation> <translation id="4115002065223188701">Netwerk buiten bereik</translation> <translation id="4115378294792113321">Magenta</translation> <translation id="4116704186509653070">Opnieuw openen</translation> @@ -3703,6 +3706,9 @@ <translation id="4651484272688821107">Kan online component niet laden met bronnen van demomodus.</translation> <translation id="4652935475563630866">Parallels Desktop moet worden herstart om de camera-instelling te wijzigen. Herstart Parallels Desktop om door te gaan.</translation> <translation id="4653405415038586100">Fout bij configureren van Linux</translation> +<translation id="465406513924180949">Je ziet winkelwagens waarmee je snel kunt teruggaan naar artikelen die je in winkelwagens op internet hebt achtergelaten. + <ph name="BREAK" /><ph name="BREAK" /> +Je kunt instellingen beheren via het kaartmenu of meer opties bekijken in het gedeelte Chrome aanpassen.</translation> <translation id="4654236001025007561">Deel bestanden met Chromebooks en Android-apparaten om je heen</translation> <translation id="4657914796247705218">TrackPoint-snelheid</translation> <translation id="4658285806588491142">Je scherm privé houden</translation> @@ -4145,6 +4151,7 @@ <translation id="5121130586824819730">Je vaste schijf is vol. Sla op een andere locatie op of maak ruimte vrij op de vaste schijf.</translation> <translation id="5123433949759960244">Basketbal</translation> <translation id="5125751979347152379">Ongeldige URL.</translation> +<translation id="5125967981703109366">Over deze kaart</translation> <translation id="5126611267288187364">Wijzigingen bekijken</translation> <translation id="5127242257756472928">Niet toegestaan dat informatie over je schermen wordt gebruikt om vensters te openen en te plaatsen</translation> <translation id="5127620150973591153">Beveiligde verbindings-ID: <ph name="TOKEN" /></translation> @@ -5131,6 +5138,9 @@ <translation id="6116921718742659598">Taal- en invoerinstellingen wijzigen</translation> <translation id="6119927814891883061">Naam van apparaat wijzigen in <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Deze pagina vastzetten op het startscherm...</translation> +<translation id="6120707837086723438">Je ziet voorgestelde recepten op basis van je recente zoekactiviteit voor recepten. + <ph name="BREAK" /><ph name="BREAK" /> +Je kunt instellingen beheren via het kaartmenu of meer opties bekijken in het gedeelte Chrome aanpassen.</translation> <translation id="6121773125605585883">Wachtwoord met gebruikersnaam <ph name="USERNAME" /> voor <ph name="WEBSITE" /> bekijken</translation> <translation id="6122081475643980456">Je internetverbinding wordt beheerd</translation> <translation id="6122093587541546701">E-mailadres (optioneel):</translation> @@ -6737,6 +6747,9 @@ <translation id="7744192722284567281">Gevonden in een gegevenslek</translation> <translation id="7744649840067671761">Druk op een nieuwe schakelaar of toets op het toetsenbord om de toewijzing te starten. Druk op een toegewezen schakelaar of toets om de toewijzing te verwijderen.</translation> +<translation id="7746739418892731373">Je ziet foto- en videohoogtepunten uit je Google Foto's-bibliotheek. Je kunt op <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" /> bepalen wat er in je hoogtepunten komt te staan. + <ph name="BREAK" /><ph name="BREAK" /> +Je kunt instellingen voor deze kaart beheren via het kaartmenu of meer opties bekijken in het gedeelte Chrome aanpassen.</translation> <translation id="7750228210027921155">Scherm-in-scherm</translation> <translation id="7751260505918304024">Alles bekijken</translation> <translation id="7753735457098489144">De installatie is mislukt als gevolg van onvoldoende opslagruimte. Verwijder bestanden uit de opslag van je apparaat om ruimte vrij te maken.</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 40ac6c1..6c79d36f 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -1269,6 +1269,7 @@ <translation id="2218019600945559112">Mus og styreflate</translation> <translation id="2218320521449013367">Det oppsto en feil mens Chrome fjernet skadelig programvare</translation> <translation id="2218515861914035131">Lim inn som ren tekst</translation> +<translation id="2219658597883514593">Start veiledningen på nytt</translation> <translation id="2220409419896228519">Legg til bokmerker i favorittappene dine fra Google</translation> <translation id="2220529011494928058">Rapportér et problem</translation> <translation id="2220572644011485463">PIN-kode eller passord</translation> @@ -2416,6 +2417,7 @@ <translation id="3378627645871606983">Tillatelser som gis for Steam, gjelder for alle Steam-spill og -apper.</translation> <translation id="337920581046691015"><ph name="PRODUCT_NAME" /> vil bli installert.</translation> <translation id="3380365263193509176">Ukjent feil</translation> +<translation id="3380850890226973980">Spør neste gang</translation> <translation id="3382073616108123819">Beklager. Systemet kunne ikke fastslå enhetsidentifikatorer for denne enheten.</translation> <translation id="3382200254148930874">Avslutter tilsynet …</translation> <translation id="338323348408199233">Blokkér trafikk uten VPN</translation> @@ -3202,6 +3204,10 @@ <translation id="4110490973560452005">Nedlastingen er fullført: <ph name="FILE_NAME" />. Trykk på Shift+F6 for å gå til nedlastingsraden.</translation> <translation id="4110686435123617899">Velg albumet <ph name="TITLE" /> med <ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (uten nett)</translation> +<translation id="4114524937989710624">Du ser forslag til filer, slik at du enkelt kan komme tilbake til den nyligste aktiviteten din i Google Disk. + <ph name="BREAK" /> + <ph name="BREAK" /> + Du kan administrere innstillinger via kortmenyen eller se flere alternativer i Tilpass Chrome.</translation> <translation id="4115002065223188701">Nettverket er utenfor rekkevidde</translation> <translation id="4115378294792113321">Magenta</translation> <translation id="4116704186509653070">Åpne igjen</translation> @@ -3709,6 +3715,10 @@ <translation id="4651484272688821107">Kunne ikke laste inn nettbasert komponent med ressurser for demomodus.</translation> <translation id="4652935475563630866">Endringen i kamerainnstillingen krever omstart av Parallels Desktop. Start Parallels Desktop på nytt for å fortsette.</translation> <translation id="4653405415038586100">Feil under konfigureringen av Linux</translation> +<translation id="465406513924180949">Du ser handlekurver, slik at du enkelt kan komme tilbake til varer du har lagt igjen i handlekurver rundt om på nettet. + <ph name="BREAK" /> + <ph name="BREAK" /> + Du kan administrere innstillinger via kortmenyen eller se flere alternativer i Tilpass Chrome.</translation> <translation id="4654236001025007561">Del filer med Chromebook- og Android-enheter rundt deg</translation> <translation id="4657914796247705218">TrackPoint-hastighet</translation> <translation id="4658285806588491142">Hold skjermen privat</translation> @@ -4151,6 +4161,7 @@ <translation id="5121130586824819730">Harddisken din er full. Lagre på et annet sted, eller frigjør plass på harddisken.</translation> <translation id="5123433949759960244">Basketball</translation> <translation id="5125751979347152379">Ugyldig nettadresse.</translation> +<translation id="5125967981703109366">Om dette kortet</translation> <translation id="5126611267288187364">Se endringene</translation> <translation id="5127242257756472928">Nettsteder som ikke får lov til å bruke informasjon om skjermene dine for å åpne og plassere vinduer</translation> <translation id="5127620150973591153">ID for sikker tilkobling: <ph name="TOKEN" /></translation> @@ -4212,6 +4223,7 @@ <translation id="5185500136143151980">Ingen internettilkobling</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Gjenopplev favorittøyeblikkene dine. For å legge til eller redigere album, gå til <ph name="LINK_BEGIN" />Google Foto<ph name="LINK_END" />.</translation> +<translation id="5190316321948122159">{NUM_APPS,plural, =1{Slett appen nå}other{Slett appene nå}}</translation> <translation id="5190926251776387065">Aktivér porten</translation> <translation id="5191094172448199359">PIN-kodene du skrev inn, er ikke like</translation> <translation id="5191251636205085390">Finn ut om og kontrollér nye teknologier som tar sikte på å erstatte tredjeparts informasjonskapsler</translation> @@ -4384,6 +4396,7 @@ <translation id="5342091991439452114">PIN-koden må inneholde minst <ph name="MINIMUM" /> sifre</translation> <translation id="5344036115151554031">Gjenoppretter Linux</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" /> % (høyre)</translation> +<translation id="534572711507965074">Sett navn på gruppen, velg en farge, og trykk på Enter</translation> <translation id="5345916423802287046">Start appen når du logger på</translation> <translation id="5350293332385664455">Slå av Google-assistenten</translation> <translation id="535123479159372765">Tekst er kopiert fra en annen enhet</translation> @@ -4963,6 +4976,7 @@ <translation id="5946591249682680882">Rapport-ID <ph name="WEBRTC_LOG_REPORT_ID" /></translation> <translation id="5948536763493709626">Koble til et tastatur eller en mus, eller fortsett konfigureringen med berøringsskjermen. Hvis du bruker Bluetooth-enheter, sørg for at enhetene er klare til sammenkobling.</translation> <translation id="5949544233750246342">Kan ikke parse filen</translation> +<translation id="5950039854561387265">Spør neste gang</translation> <translation id="5950819593680344519">Chrome fant ingen skadelig programvare på datamaskinen • sjekket i går</translation> <translation id="5951303645598168883"><ph name="ORIGIN" /> vil bruke lokale skrifttyper</translation> <translation id="5951624318208955736">Skjerm</translation> @@ -5133,6 +5147,10 @@ <translation id="6116921718742659598">Endre språk- og inndatainnstillinger</translation> <translation id="6119927814891883061">Gi enheten navnet <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Fest denne siden til startsiden</translation> +<translation id="6120707837086723438">Du ser forslag til oppskrifter basert på nylig søkeaktivitet knyttet til oppskrifter. + <ph name="BREAK" /> + <ph name="BREAK" /> + Du kan administrere innstillinger via kortmenyen eller se flere alternativer i Tilpass Chrome.</translation> <translation id="6121773125605585883">Vis passord med brukernavnet <ph name="USERNAME" /> for <ph name="WEBSITE" /></translation> <translation id="6122081475643980456">Internett-tilkoblingen din kontrolleres</translation> <translation id="6122093587541546701">E-post (valgfritt):</translation> @@ -5225,6 +5243,7 @@ <translation id="6218058416316985984"><ph name="DEVICE_TYPE" /> er uten nett. Koble til Internett og prøv på nytt.</translation> <translation id="6220413761270491930">Det oppsto en feil under innlastingen av utvidelsen</translation> <translation id="6223447490656896591">Egendefinert bilde:</translation> +<translation id="62236885217374510">{NUM_APPS,plural, =1{Slett appen nå}other{Slett appene nå}}</translation> <translation id="6224481128663248237">Formateringen er fullført!</translation> <translation id="622537739776246443">Profilen blir slettet</translation> <translation id="6225475702458870625">En datatilkobling er tilgjengelig fra <ph name="PHONE_NAME" /></translation> @@ -5857,6 +5876,7 @@ <translation id="6846178040388691741">«<ph name="EXTENSION_NAME" />» vil skrive ut <ph name="FILE_NAME" /> med <ph name="PRINTER_NAME" />.</translation> <translation id="6847125920277401289">Frigjør plass for å fortsette</translation> <translation id="6848388270925200958">Akkurat nå har du noen kort som bare kan brukes på denne enheten</translation> +<translation id="6848425544473873717">{NUM_APPS,plural, =1{1 av appene dine støttes ikke lenger. <ph name="LEARN_MORE" />}other{# av appene dine støttes ikke lenger. <ph name="LEARN_MORE" />}}</translation> <translation id="6848716236260083778">For å konfigurere fingeravtrykk, få barnet ditt til å berøre fingeravtrykkssensoren. Barnets fingeravtrykksdata lagres sikkert og sendes aldri fra <ph name="DEVICE_TYPE" />.</translation> <translation id="6850286078059909152">Tekstfarge</translation> <translation id="6851181413209322061">Send bruks- og diagnostikkdata. Denne enheten sender for øyeblikket diagnostikk-, enhets- og appbruksdata til Google automatisk. Disse dataene brukes ikke til å identifisere barnet ditt, men bidrar til å gjøre systemet og appene bedre og mer stabile. Noen aggregerte data hjelper også Google-apper og -partnere, for eksempel Android-utviklere. Denne innstillingen håndheves av eieren. Hvis du har slått på annen nett- og appaktivitet for barnet ditt, kan disse dataene bli lagret i barnets Google-konto.</translation> @@ -6737,6 +6757,10 @@ <translation id="7744192722284567281">Funnet i databrudd</translation> <translation id="7744649840067671761">Trykk på en ny bryter eller tast for å starte tilordningen. Trykk på en tilordnet bryter eller tast for å fjerne tilordningen.</translation> +<translation id="7746739418892731373">Du ser bilde- og videohøydepunkter fra Google Foto-biblioteket ditt. Du kan styre hva som vises i høydepunktene dine, på <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" />. + <ph name="BREAK" /> + <ph name="BREAK" /> + Du kan administrere innstillinger for dette kortet via kortmenyen eller se flere alternativer i Tilpass Chrome.</translation> <translation id="7750228210027921155">Bilde i bilde</translation> <translation id="7751260505918304024">Vis alle</translation> <translation id="7753735457098489144">Installasjonen mislyktes på grunn av mangel på lagringsplass. For å frigjøre plass, slett filer fra enhetslagringen.</translation> @@ -7119,6 +7143,7 @@ <translation id="8102139037507939978">Fjern personlig identifiserende informasjon fra system_logs.txt.</translation> <translation id="8104088837833760645">Last ned e-SIM-profilen</translation> <translation id="8105368624971345109">Slå av</translation> +<translation id="8105541061909542455">{NUM_APPS,plural, =1{Appen støttes ikke}other{Appene støttes ikke}}</translation> <translation id="8107015733319732394">Installerer Google Play-butikken på <ph name="DEVICE_TYPE" />-enheten din. Dette kan ta noen minutter.</translation> <translation id="810728361871746125">Skjermoppløsning</translation> <translation id="8108526232944491552">{COUNT,plural, =0{Ingen informasjonskapsler fra tredjeparter}=1{1 informasjonskapsel fra en tredjepart er blokkert}other{# informasjonskapsler fra tredjeparter er blokkert}}</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index b1580f7..985b64b8 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -1260,6 +1260,7 @@ <translation id="2218019600945559112">ମାଉସ୍ ଏବଂ ଟଚ୍ପ୍ୟାଡ୍</translation> <translation id="2218320521449013367">Chrome କ୍ଷତିକାରକ ସଫ୍ଟୱେର୍କୁ ବାହାର କରିବା ସମୟରେ ଏକ ସମସ୍ୟା ଦେଖାଦେଲା</translation> <translation id="2218515861914035131">ସାଦା ଟେକ୍ସଟ୍ ଭାବରେ ପେଷ୍ଟ କରନ୍ତୁ</translation> +<translation id="2219658597883514593">ଟ୍ୟୁଟୋରିଆଲ ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ</translation> <translation id="2220409419896228519">ଆପଣଙ୍କ Google ଆପ୍ସରେ ବୁକମାର୍କ ଯୋଗ କରନ୍ତୁ</translation> <translation id="2220529011494928058">କୌଣସି ଏକ ତ୍ରୁଟିର ରିପୋର୍ଟ କରନ୍ତୁ</translation> <translation id="2220572644011485463">ପିନ୍ କିମ୍ବା ପାସ୍ୱର୍ଡ</translation> @@ -2405,6 +2406,7 @@ <translation id="3378627645871606983">Steam ପାଇଁ ଦିଆଯାଇଥିବା ଅନୁମତିଗୁଡ଼ିକ, Steamର ସମସ୍ତ ଗେମ ଏବଂ ଆପରେ ଲାଗୁ ହୋଇଥାଏ।</translation> <translation id="337920581046691015"><ph name="PRODUCT_NAME" />କୁ ଇନ୍ଷ୍ଟଲ୍ କରାଯିବ।</translation> <translation id="3380365263193509176">ଅଜଣା ତୃଟି</translation> +<translation id="3380850890226973980">ପରବର୍ତ୍ତୀ ସମୟରେ ପଚାରନ୍ତୁ</translation> <translation id="3382073616108123819">ଓହୋଃ! ଏହି ଡିଭାଇସ୍ ପାଇଁ ଡିଭାଇସ୍ ଚିହ୍ନଟକାରୀ ସ୍ଥିର କରିବାରେ ସିଷ୍ଟମ୍ ବିଫଳ ହୋଇଛି</translation> <translation id="3382200254148930874">ନିରୀକ୍ଷଣ ବନ୍ଦ କରାଯାଉଛି...</translation> <translation id="338323348408199233">VPN ନଥିବା ଟ୍ରାଫିକକୁ ବ୍ଲକ୍ କରନ୍ତୁ</translation> @@ -4212,6 +4214,7 @@ <translation id="5185500136143151980">ଇଣ୍ଟର୍ନେଟ୍ ସଂଯୋଗ ନାହିଁ</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">ଆପଣଙ୍କର ପ୍ରିୟ ସ୍ମୃତିଗୁଡ଼ିକୁ ପୁନର୍ଜୀବିତ କରନ୍ତୁ। ଆଲବମଗୁଡ଼ିକ ଯୋଗ କରିବା କିମ୍ବା ସେଗୁଡ଼ିକୁ ଏଡିଟ୍ କରିବା ପାଇଁ <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />କୁ ଯାଆନ୍ତୁ।</translation> +<translation id="5190316321948122159">{NUM_APPS,plural, =1{ବର୍ତ୍ତମାନ ଆପକୁ ଡିଲିଟ କରନ୍ତୁ}other{ବର୍ତ୍ତମାନ ଆପ୍ସକୁ ଡିଲିଟ କରନ୍ତୁ}}</translation> <translation id="5190926251776387065">ପୋର୍ଟ ସକ୍ରିୟ କରନ୍ତୁ</translation> <translation id="5191094172448199359">ଆପଣ ଲେଖିଥିବା PINଗୁଡ଼ିକ ମେଳ ହେଉ ନାହିଁ</translation> <translation id="5191251636205085390">ତୃତୀୟ-ପକ୍ଷ କୁକୀଗୁଡ଼ିକୁ ପରିବର୍ତ୍ତନ କରିବାକୁ ଲକ୍ଷ୍ୟ ରଖୁଥିବା ନୂଆ ଟେକ୍ନୋଲୋଜିଗୁଡ଼ିକ ବିଷୟରେ ଜାଣନ୍ତୁ ଏବଂ ସେଗୁଡ଼ିକୁ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ</translation> @@ -4384,6 +4387,7 @@ <translation id="5342091991439452114">PIN ନିଶ୍ଚିତ ରୂପେ ଅତି କମ୍ରେ <ph name="MINIMUM" /> ଅଙ୍କ ବିଶିଷ୍ଟ ହେବା ଦରକାର</translation> <translation id="5344036115151554031">Linuxକୁ ରିଷ୍ଟୋର୍ କରାଯାଉଛି</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (ଡାହାଣ)</translation> +<translation id="534572711507965074">ଆପଣଙ୍କ ଗୋଷ୍ଠୀର ନାମ ଦିଅନ୍ତୁ, ଏକ ରଙ୍ଗ ବାଛନ୍ତୁ ଏବଂ Enter କୀ'ରେ ଟାପ କରନ୍ତୁ</translation> <translation id="5345916423802287046">ଆପଣ ସାଇନ୍ ଇନ୍ କରି ଆପ୍ ଆରମ୍ଭ କରନ୍ତୁ</translation> <translation id="5350293332385664455">Google Assistant ବନ୍ଦ କରନ୍ତୁ</translation> <translation id="535123479159372765">ଅନ୍ୟ ଏକ ଡିଭାଇସରୁ କପି କରାଯାଇଥିବା ଟେକ୍ସଟ୍</translation> @@ -4964,6 +4968,7 @@ <translation id="5946591249682680882">ରିପୋର୍ଟ ID <ph name="WEBRTC_LOG_REPORT_ID" /></translation> <translation id="5948536763493709626">ଏକ କୀବୋର୍ଡ କିମ୍ବା ମାଉସ୍ ସଂଯୋଗ କରନ୍ତୁ କିମ୍ବା ଆପଣଙ୍କ ଟଚସ୍କ୍ରିନ୍ ବ୍ୟବହାର କରି ସେଟଅପ୍ କରିବା ଜାରି ରଖନ୍ତୁ। ଯଦି ଆପଣ ବ୍ଲୁଟୁଥ୍ ଡିଭାଇସଗୁଡ଼ିକ ବ୍ୟବହାର କରୁଛନ୍ତି, ତେବେ ପେୟାର୍ କରିବାକୁ ଆପଣଙ୍କ ଡିଭାଇସଗୁଡ଼ିକ ପ୍ରସ୍ତୁତ ଥିବା ନିଶ୍ଚିତ କରନ୍ତୁ।</translation> <translation id="5949544233750246342">ଫାଇଲ୍କୁ ପାର୍ସ କରିବାରେ ଅକ୍ଷମ</translation> +<translation id="5950039854561387265">ପରବର୍ତ୍ତୀ ସମୟରେ ପଚାରନ୍ତୁ</translation> <translation id="5950819593680344519">Chrome ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟରରେ କ୍ଷତିକାରକ ସଫ୍ଟୱେରକୁ ଖୋଜି ପାଇଲା ନାହିଁ • ଗତକାଲି ଯାଞ୍ଚ କରାଯାଇଛି</translation> <translation id="5951303645598168883"><ph name="ORIGIN" /> ସ୍ଥାନୀୟ ଫଣ୍ଟଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିବାକୁ ଚାହେଁ</translation> <translation id="5951624318208955736">ମନିଟର୍</translation> @@ -5230,6 +5235,7 @@ <translation id="6218058416316985984"><ph name="DEVICE_TYPE" /> ଅଫ୍ଲାଇନ୍ ଅଛି। ଇଣ୍ଟର୍ନେଟ୍କୁ ସଂଯୋଗ କରନ୍ତୁ ଏବଂ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="6220413761270491930">ଏକ୍ସଟେନ୍ସନ୍ ଲୋଡ୍ ହେବା ସମୟରେ ତ୍ରୁଟି</translation> <translation id="6223447490656896591">କଷ୍ଟମ୍ ଛବି:</translation> +<translation id="62236885217374510">{NUM_APPS,plural, =1{ବର୍ତ୍ତମାନ ଆପକୁ ଡିଲିଟ କରନ୍ତୁ}other{ବର୍ତ୍ତମାନ ଆପ୍ସକୁ ଡିଲିଟ କରନ୍ତୁ}}</translation> <translation id="6224481128663248237">ସଫଳତାର ସହ ଫର୍ମାଟିଂ ଶେଷ ହୋଇଛି!</translation> <translation id="622537739776246443">ପ୍ରୋଫାଇଲ୍ ଡିଲିଟ୍ କରିଦିଆଯିବ</translation> <translation id="6225475702458870625">ଆପଣଙ୍କର <ph name="PHONE_NAME" />ରୁ ଡାଟା ସଂଯୋଗ ଉପଲବ୍ଧ ଅଛି</translation> @@ -5864,6 +5870,7 @@ <translation id="6846178040388691741">"<ph name="EXTENSION_NAME" />", <ph name="PRINTER_NAME" /> ବ୍ୟବହାର କରି <ph name="FILE_NAME" /> ପ୍ରିଣ୍ଟ କରିବା ପାଇଁ ଚାହୁଁଛି।</translation> <translation id="6847125920277401289">ଜାରି ରଖିବାକୁ ଜାଗା ଖାଲି କରନ୍ତୁ</translation> <translation id="6848388270925200958">ବର୍ତ୍ତମାନ, ଆପଣଙ୍କ ପାଖରେ କିଛି କାର୍ଡ ଅଛି ଯାହା କେବଳ ଏହି ଡିଭାଇସ୍ରେ ବ୍ୟବହାର କରିପାରିବେ</translation> +<translation id="6848425544473873717">{NUM_APPS,plural, =1{ଆପଣଙ୍କର 1ଟି ଆପ ଆଉ ସମର୍ଥିତ ନୁହେଁ। <ph name="LEARN_MORE" />}other{ଆପଣଙ୍କର #ଟି ଆପ ଆଉ ସମର୍ଥିତ ନୁହେଁ। <ph name="LEARN_MORE" />}}</translation> <translation id="6848716236260083778">ଟିପଚିହ୍ନ ସେଟଅପ୍ କରିବା ପାଇଁ ଆପଣଙ୍କ ପିଲାକୁ ଟିପଚିହ୍ନ ସେନ୍ସର୍ ସ୍ପର୍ଶ କରିବାକୁ ଦିଅନ୍ତୁ। ଆପଣଙ୍କ ପିଲାର ଟିପଚିହ୍ନ ସମ୍ବନ୍ଧିତ ଡାଟା ସୁରକ୍ଷିତ ଭାବେ ଷ୍ଟୋର୍ କରାଯାଇଛି ଏବଂ ଏହା କେବେ ବି ଏହି <ph name="DEVICE_TYPE" />ରୁ କାଢ଼ି ଦିଆଯାଏ ନାହିଁ।</translation> <translation id="6850286078059909152">ଟେକ୍ସଟ୍ ରଙ୍ଗ</translation> <translation id="6851181413209322061">ବ୍ୟବହାର ଏବଂ ଡାଏଗ୍ନୋଷ୍ଟିକ୍ ଡାଟା ପଠାନ୍ତୁ। ଏହି ଡିଭାଇସ୍ ବର୍ତ୍ତମାନ ସ୍ୱଚାଳିତ ରୂପେ ଡାଏଗ୍ନୋଷ୍ଟିକ୍, ଡିଭାଇସ୍ ଏବଂ ଆପ୍ ବ୍ୟବହାର ଡାଟା Googleକୁ ପଠାଉଛି। ଆପଣଙ୍କ ପିଲାକୁ ଚିହ୍ନଟ କରିବାରେ ଏହାକୁ ବ୍ୟବହାର କରାଯିବ ନାହିଁ ଏବଂ ସିଷ୍ଟମ୍ ଓ ଆପର ସ୍ଥିରତା ତଥା ଅନ୍ୟ ଉନ୍ନତିଗୁଡ଼ିକରେ ସାହାଯ୍ୟ କରିବ। କିଛି ଏକତ୍ରିତ ଡାଟା Google ଆପ୍ ଓ Android ଡେଭଲପର୍ ପରି ଏହାର ପାର୍ଟନରଗୁଡ଼ିକୁ ମଧ୍ୟ ସାହାଯ୍ୟ କରିବ। ଏହି ସେଟିଂ ମାଲିକଙ୍କ ଦ୍ୱାରା ଲାଗୁ କରାଯାଇଛି। ଯଦି ଆପଣଙ୍କ ପିଲା ପାଇଁ ଅତିରିକ୍ତ ୱେବ୍ ଏବଂ ଆପ୍ କାର୍ଯ୍ୟକଳାପ ଚାଲୁ ଥାଏ, ତେବେ ଏହି ଡାଟା ତା'ର Google ଆକାଉଣ୍ଟରେ ସେଭ୍ ହୋଇପାରେ।</translation> @@ -7128,6 +7135,7 @@ <translation id="8102139037507939978">System_logs.txtରୁ ବ୍ୟକ୍ତିଗତ ରୂପେ ଚିହ୍ନଟ କରାଯାଇପାରୁଥିବା ସୂଚନାକୁ କାଢ଼ି ଦିଅନ୍ତୁ।</translation> <translation id="8104088837833760645">eSIM ପ୍ରୋଫାଇଲ୍ ଡାଉନଲୋଡ୍ କରନ୍ତୁ</translation> <translation id="8105368624971345109">ବନ୍ଦ କରନ୍ତୁ</translation> +<translation id="8105541061909542455">{NUM_APPS,plural, =1{ଅସମର୍ଥିତ ଆପ}other{ଅସମର୍ଥିତ ଆପ୍ସ}}</translation> <translation id="8107015733319732394">ଆପଣଙ୍କର <ph name="DEVICE_TYPE" />ରେ Google Play Store ଇନ୍ଷ୍ଟଲ୍ ହେଉଛି। ଏଥିରେ କିଛି ସମୟ ଲାଗିପାରେ।</translation> <translation id="810728361871746125">ଡିସପ୍ଲେ ରିଜୋଲ୍ୟୁସନ୍</translation> <translation id="8108526232944491552">{COUNT,plural, =0{କୌଣସି ତୃତୀୟ-ପକ୍ଷ କୁକୀ ନାହିଁ}=1{1ଟି ତୃତୀୟ-ପକ୍ଷ କୁକୀ ବ୍ଲକ୍ କରାଯାଇଛି}other{#ଟି ତୃତୀୟ-ପକ୍ଷ କୁକୀ ବ୍ଲକ୍ କରାଯାଇଛି}}</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 55f9171..4ce0c3ee 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -3210,6 +3210,10 @@ <translation id="4110490973560452005">ਡਾਊਨਲੋਡ ਮੁਕੰਮਲ ਹੋਇਆ: <ph name="FILE_NAME" />. ਡਾਊਨਲੋਡ ਬਾਰ ਖੇਤਰ ਵਿੱਚ ਜਾਣ ਲਈ Shift+F6 ਦਬਾਓ।</translation> <translation id="4110686435123617899">ਐਲਬਮ ਚੁਣੋ <ph name="TITLE" /> <ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (ਆਫ਼ਲਾਈਨ)</translation> +<translation id="4114524937989710624">ਤੁਸੀਂ ਸੁਝਾਈਆਂ ਫ਼ਾਈਲਾਂ ਦੇਖ ਰਹੇ ਹੋ ਤਾਂ ਜੋ ਤੁਸੀਂ Google Drive ਵਿਚਲੀ ਆਪਣੀ ਸਭ ਤੋਂ ਹਾਲੀਆ ਸਰਗਰਮੀ 'ਤੇ ਆਸਾਨੀ ਨਾਲ ਵਾਪਸ ਜਾ ਸਕੋ। + <ph name="BREAK" /> + <ph name="BREAK" /> + ਤੁਸੀਂ ਕਾਰਡ ਮੀਨੂ ਤੋਂ ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦੇ ਹੋ ਜਾਂ 'Chrome ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰੋ' ਵਿੱਚ ਹੋਰ ਵਿਕਲਪਾਂ ਨੂੰ ਦੇਖ ਸਕਦੇ ਹੋ।</translation> <translation id="4115002065223188701">ਨੈੱਟਵਰਕ ਰੇਂਜ ਤੋਂ ਬਾਹਰ ਹੈ</translation> <translation id="4115378294792113321">ਮਜੈਂਟਾ</translation> <translation id="4116704186509653070">ਦੁਬਾਰਾ ਖੋਲ੍ਹੋ</translation> @@ -3718,6 +3722,10 @@ <translation id="4651484272688821107">ਡੈਮੋ ਮੋਡ ਸਰੋਤਾਂ ਨਾਲ ਆਨਲਾਈਨ ਕੰਪੋਨੈਂਟ ਨੂੰ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।</translation> <translation id="4652935475563630866">ਕੈਮਰਾ ਸੈਟਿੰਗ ਵਿੱਚ ਤਬਦੀਲੀ ਲਈ Parallels Desktop ਦਾ ਮੁੜ-ਲਾਂਚ ਹੋਣਾ ਲੋੜੀਂਦਾ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ Parallels Desktop ਨੂੰ ਮੁੜ-ਲਾਂਚ ਕਰੋ।</translation> <translation id="4653405415038586100">Linux ਦਾ ਸੰਰੂਪਣ ਕਰਨ ਵੇਲੇ ਗੜਬੜ ਹੋਈ</translation> +<translation id="465406513924180949">ਤੁਸੀਂ ਉਨ੍ਹਾਂ ਕਾਰਟਾਂ ਨੂੰ ਦੇਖ ਰਹੇ ਹੋ ਜੋ ਵੈੱਬ 'ਤੇ ਖਰੀਦਦਾਰੀ ਕਾਰਟਾਂ ਵਿੱਚ ਤੁਹਾਡੀਆਂ ਬਾਕੀ ਆਈਟਮਾਂ 'ਤੇ ਆਸਾਨੀ ਨਾਲ ਵਾਪਸ ਜਾਣ ਵਿੱਚ ਤੁਹਾਡੀ ਮਦਦ ਕਰਦੇ ਹਨ। + <ph name="BREAK" /> + <ph name="BREAK" /> + ਤੁਸੀਂ ਕਾਰਡ ਮੀਨੂ ਤੋਂ ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦੇ ਹੋ ਜਾਂ 'Chrome ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰੋ' ਵਿੱਚ ਹੋਰ ਵਿਕਲਪਾਂ ਨੂੰ ਦੇਖ ਸਕਦੇ ਹੋ।</translation> <translation id="4654236001025007561">ਆਪਣੇ ਆਲੇ-ਦੁਆਲੇ ਦੇ Chromebook ਅਤੇ Android ਡੀਵਾਈਸਾਂ ਨਾਲ ਫ਼ਾਈਲਾਂ ਨੂੰ ਸਾਂਝਾ ਕਰੋ</translation> <translation id="4657914796247705218">TrackPoint ਗਤੀ</translation> <translation id="4658285806588491142">ਆਪਣੀ ਸਕ੍ਰੀਨ ਨੂੰ ਨਿੱਜੀ ਰੱਖੋ</translation> @@ -4160,6 +4168,7 @@ <translation id="5121130586824819730">ਤੁਹਾਡੀ ਹਾਰਡ ਡਿਸਕ ਪੂਰੀ ਭਰੀ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਕਿਸੇ ਹੋਰ ਟਿਕਾਣੇ 'ਤੇ ਰੱਖਿਅਤ ਕਰੋ ਜਾਂ ਹਾਰਡ ਡਿਸਕ 'ਤੇ ਹੋਰ ਜਗ੍ਹਾ ਬਣਾਓ।</translation> <translation id="5123433949759960244">ਬਾਸਕਟਬਾਲ</translation> <translation id="5125751979347152379">ਅਵੈਧ URL.</translation> +<translation id="5125967981703109366">ਇਸ ਕਾਰਡ ਬਾਰੇ</translation> <translation id="5126611267288187364">ਤਬਦੀਲੀਆਂ ਦੇਖੋ</translation> <translation id="5127242257756472928">ਵਿੰਡੋ ਨੂੰ ਖੋਲ੍ਹਣ ਅਤੇ ਉਸਨੂੰ ਰੱਖਣ ਲਈ ਤੁਹਾਡੀਆਂ ਸਕ੍ਰੀਨਾਂ ਬਾਰੇ ਜਾਣਕਾਰੀ ਵਰਤਣ ਦੀ ਆਗਿਆ ਨਹੀਂ ਹੈ</translation> <translation id="5127620150973591153">ਸੁਰੱਖਿਅਤ ਕਨੈਕਸ਼ਨ ਆਈਡੀ: <ph name="TOKEN" /></translation> @@ -5143,6 +5152,10 @@ <translation id="6116921718742659598">ਭਾਸ਼ਾ ਅਤੇ ਇਨਪੁੱਟ ਸੈਟਿੰਗਾਂ ਬਦਲੋ</translation> <translation id="6119927814891883061"><ph name="DEVICE_NAME" /> ਡੀਵਾਈਸ ਨੂੰ ਨਾਮ ਦਿਓ</translation> <translation id="6120205520491252677">ਸਟਾਰਟ ਸਕ੍ਰੀਨ ਲਈ ਇਹ ਸਫ਼ਾ ਪਿਨ ਕਰੋ...</translation> +<translation id="6120707837086723438">ਤੁਸੀਂ ਪਕਵਾਨ-ਵਿਧੀਆਂ ਲਈ ਆਪਣੀ ਹਾਲੀਆ ਖੋਜ ਸਰਗਰਮੀ ਦੇ ਆਧਾਰ 'ਤੇ ਸੁਝਾਈਆਂ ਗਈਆਂ ਪਕਵਾਨ-ਵਿਧੀਆਂ ਦੇਖ ਰਹੇ ਹੋ। + <ph name="BREAK" /> + <ph name="BREAK" /> + ਤੁਸੀਂ ਕਾਰਡ ਮੀਨੂ ਤੋਂ ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦੇ ਹੋ ਜਾਂ 'Chrome ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰੋ' ਵਿੱਚ ਹੋਰ ਵਿਕਲਪਾਂ ਨੂੰ ਦੇਖ ਸਕਦੇ ਹੋ।</translation> <translation id="6121773125605585883"><ph name="WEBSITE" /> ਲਈ ਵਰਤੋਂਕਾਰ ਨਾਮ <ph name="USERNAME" /> ਨਾਲ ਪਾਸਵਰਡ ਦੇਖੋ</translation> <translation id="6122081475643980456">ਤੁਹਾਡੇ ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਤੇ ਨਿਯੰਤਰਣ ਪਾਇਆ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="6122093587541546701">ਈਮੇਲ (ਚੋਣਵਾਂ):</translation> @@ -6748,6 +6761,10 @@ <translation id="7744192722284567281">ਡਾਟਾ ਉਲੰਘਣਾ ਵਿੱਚ ਮਿਲਿਆ</translation> <translation id="7744649840067671761">ਅਸਾਈਨਮੈਂਟ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਕੋਈ ਨਵਾਂ ਸਵਿੱਚ ਜਾਂ ਕੀ-ਬੋਰਡ ਕੁੰਜੀ ਦਬਾਓ। ਅਸਾਈਨਮੈਂਟ ਹਟਾਉਣ ਲਈ ਕੋਈ ਜ਼ਿੰਮੇ ਲਾਇਆ ਸਵਿੱਚ ਜਾਂ ਕੁੰਜੀ ਦਬਾਓ।</translation> +<translation id="7746739418892731373">ਤੁਸੀਂ ਆਪਣੀ Google Photos ਲਾਇਬ੍ਰੇਰੀ ਤੋਂ ਫ਼ੋਟੋ ਅਤੇ ਵੀਡੀਓ ਦੀਆਂ ਹਾਈਲਾਈਟਾਂ ਦੇਖ ਰਹੇ ਹੋ। ਤੁਸੀਂ <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" /> ਵਿੱਚ ਜਾ ਕੇ ਇਹ ਕੰਟਰੋਲ ਕਰ ਸਕਦੇ ਹੋ ਕਿ ਤੁਹਾਡੀਆਂ ਹਾਈਲਾਈਟਾਂ ਵਿੱਚ ਕੀ ਦਿਖਾਇਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। + <ph name="BREAK" /> + <ph name="BREAK" /> + ਤੁਸੀਂ ਕਾਰਡ ਮੀਨੂ ਤੋਂ ਇਸ ਕਾਰਡ ਦੀਆਂ ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦੇ ਹੋ ਜਾਂ 'Chrome ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰੋ' ਵਿੱਚ ਹੋਰ ਵਿਕਲਪਾਂ ਨੂੰ ਦੇਖ ਸਕਦੇ ਹੋ।</translation> <translation id="7750228210027921155">ਤਸਵੀਰ-ਵਿੱਚ-ਤਸਵੀਰ</translation> <translation id="7751260505918304024">ਸਾਰੇ ਦਿਖਾਓ </translation> <translation id="7753735457098489144">ਸਟੋਰੇਜ ਜਗ੍ਹਾ ਘੱਟ ਹੋਣ ਕਾਰਨ ਸਥਾਪਤ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ। ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਨ ਲਈ, ਡੀਵਾਈਸ ਸਟੋਰੇਜ ਵਿੱਚੋਂ ਫ਼ਾਈਲਾਂ ਮਿਟਾਓ।</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index f79c2f2..1ffe6ff 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -3194,6 +3194,10 @@ <translation id="4110490973560452005">Pobrano plik: <ph name="FILE_NAME" />. Naciśnij Shift+F6, by przejść do obszaru paska pobranych plików.</translation> <translation id="4110686435123617899">Wybierz album <ph name="TITLE" /> <ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (offline)</translation> +<translation id="4114524937989710624">Widzisz sugerowane pliki, aby łatwiej Ci było wrócić do swojej ostatniej aktywności na Dysku Google. + <ph name="BREAK" /> + <ph name="BREAK" /> + Możesz zarządzać ustawieniami w menu karty lub zobaczyć więcej opcji w sekcji dostosowania Chrome.</translation> <translation id="4115002065223188701">Sieć poza zasięgiem</translation> <translation id="4115378294792113321">Magenta</translation> <translation id="4116704186509653070">Otwórz ponownie</translation> @@ -3701,6 +3705,10 @@ <translation id="4651484272688821107">Nie udało się załadować komponentu online z zasobami trybu demonstracyjnego.</translation> <translation id="4652935475563630866">Zmiana ustawienia kamery wymaga ponownego uruchomienia aplikacji Parallels Desktop. Aby kontynuować, uruchom ponownie Parallels Desktop.</translation> <translation id="4653405415038586100">Błąd podczas konfigurowania Linuksa</translation> +<translation id="465406513924180949">Widzisz koszyki, aby łatwiej Ci było wrócić do produktów dodanych do koszyków na zakupy w sklepach internetowych. + <ph name="BREAK" /> + <ph name="BREAK" /> + Możesz zarządzać ustawieniami w menu karty lub zobaczyć więcej opcji w sekcji dostosowania Chrome.</translation> <translation id="4654236001025007561">Udostępniaj pliki Chromebookom i urządzeniom z Androidem w pobliżu</translation> <translation id="4657914796247705218">Szybkość manipulatora punktowego</translation> <translation id="4658285806588491142">Dbaj o prywatność treści na ekranie</translation> @@ -4143,6 +4151,7 @@ <translation id="5121130586824819730">Dysk twardy jest pełny. Zapisz w innej lokalizacji lub zwolnij miejsce na dysku.</translation> <translation id="5123433949759960244">Piłka do koszykówki</translation> <translation id="5125751979347152379">Nieprawidłowy adres URL.</translation> +<translation id="5125967981703109366">Informacje o tej karcie</translation> <translation id="5126611267288187364">Pokaż zmiany</translation> <translation id="5127242257756472928">Bez uprawnień do korzystania z informacji o Twoich ekranach w celu otwierania i rozmieszczania okien</translation> <translation id="5127620150973591153">Identyfikator bezpiecznego połączenia: <ph name="TOKEN" /></translation> @@ -5117,6 +5126,10 @@ <translation id="6116921718742659598">Zmień język i ustawienia wprowadzania</translation> <translation id="6119927814891883061">Nazwij urządzenie dla: <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Przypnij tę stronę do ekranu startowego...</translation> +<translation id="6120707837086723438">Widzisz przepisy sugerowane na podstawie Twojej ostatniej aktywności związanej z ich wyszukiwaniem. + <ph name="BREAK" /> + <ph name="BREAK" /> + Możesz zarządzać ustawieniami w menu karty lub zobaczyć więcej opcji w sekcji dostosowania Chrome.</translation> <translation id="6121773125605585883">Wyświetl hasło powiązane z nazwą użytkownika <ph name="USERNAME" /> do strony <ph name="WEBSITE" />.</translation> <translation id="6122081475643980456">Twoje połączenie internetowe jest kontrolowane</translation> <translation id="6122093587541546701">Adres e-mail (opcjonalnie):</translation> @@ -6723,6 +6736,10 @@ <translation id="7744192722284567281">Doszło do naruszenia bezpieczeństwa danych</translation> <translation id="7744649840067671761">Aby utworzyć przypisanie, naciśnij nowy przełącznik lub klawisz na klawiaturze. Aby usunąć przypisanie, naciśnij przypisany przełącznik lub klawisz.</translation> +<translation id="7746739418892731373">Widzisz najważniejsze zdjęcia i filmy ze swojej biblioteki Zdjęć Google. To, jakie elementy mają się pokazywać, możesz określić na <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" />. + <ph name="BREAK" /> + <ph name="BREAK" /> + Możesz zarządzać ustawieniami tej karty w menu karty lub zobaczyć więcej opcji w sekcji dostosowania Chrome.</translation> <translation id="7750228210027921155">Obraz w obrazie</translation> <translation id="7751260505918304024">Pokaż wszystkie</translation> <translation id="7753735457098489144">Instalacja nie udała się z powodu braku miejsca. Aby zwolnić miejsce, usuń pliki z pamięci urządzenia.</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index 2fa7b07..06eab81 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -1264,6 +1264,7 @@ <translation id="2218019600945559112">මූසිකය සහ ස්පර්ශ පුවරුව</translation> <translation id="2218320521449013367">Chrome විසින් හානිකර මෘදුකාංග ඉවත් කරන අතරේ දෝෂයක් ඇති විය</translation> <translation id="2218515861914035131">සරල පෙළ ලෙස අලවන්න</translation> +<translation id="2219658597883514593">නිබන්ධනය යළි අරඹන්න</translation> <translation id="2220409419896228519">ඔබේ ප්රියතම Google යෙදුම්වලට පිටුසන් එක් කරන්න</translation> <translation id="2220529011494928058">ගැටළුවක් වාර්තා කරන්න...</translation> <translation id="2220572644011485463">PIN අංකය හෝ මුරපදය</translation> @@ -2410,6 +2411,7 @@ <translation id="3378627645871606983">Steam සඳහා ඉඩ දී ඇති අවසර සියලු Steam ක්රීඩා සහ යෙදුම් සඳහා අදාළ වේ.</translation> <translation id="337920581046691015"><ph name="PRODUCT_NAME" /> ස්ථාපනය වනු ඇත.</translation> <translation id="3380365263193509176">නොදන්නා දෝෂය</translation> +<translation id="3380850890226973980">ඊළඟ අවස්ථාවේදී ඉල්ලන්න</translation> <translation id="3382073616108123819">අපොයි! මෙම උපාංගය සඳහා උපාංගයේ හැඳුනුම් තීරණය කිරීමට පද්ධතියට නොහැකි විය.</translation> <translation id="3382200254148930874">අධීක්ෂණය නැවැත්වීම...</translation> <translation id="338323348408199233">VPN රහිත තදබදය අවහිර කරන්න</translation> @@ -3199,6 +3201,10 @@ <translation id="4110490973560452005">බාගැනීම සම්පූර්ණයි: <ph name="FILE_NAME" />. බාගැනීම් තීරු ප්රදේශයට මාරු වීමට Shift+F6 ඔබන්න.</translation> <translation id="4110686435123617899">ඇල්බමය තෝරන්න <ph name="TITLE" /> <ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (නොබැඳි)</translation> +<translation id="4114524937989710624">ඔබට Google Drive හි ඔබගේ වඩාත්ම මෑත ක්රියාකාරකම් වෙත පහසුවෙන් ආපසු යාමට උදවු කිරීමට යෝජිත ගොනු ඔබ දකියි. + <ph name="BREAK" /> + <ph name="BREAK" /> + ඔබට කාඩ්පත් මෙනුවෙන් සැකසීම් කළමනාකරණය කිරීමට හෝ Chrome අභිරුචිකරණය තුළ තවත් විකල්ප බැලීමට හැකිය.</translation> <translation id="4115002065223188701">ජාලය පරාසයෙන් බැහැරය</translation> <translation id="4115378294792113321">මැජෙන්ටා</translation> <translation id="4116704186509653070">නැවත විවෘත කරන්න</translation> @@ -3706,6 +3712,10 @@ <translation id="4651484272688821107">ආදර්ශන ප්රකාර සම්පත් සමඟ සබැඳි අංගය පූරණ කළ නොහැකි විය.</translation> <translation id="4652935475563630866">කැමරා සැකසීම තුළ වෙනස් කිරීමට නැවත දියත් කිරීම සඳහා Parallels Desktop අවශ්ය වේ ඉදිරියට යාමට Parallels Desktop නැවත දියත් කරන්න.</translation> <translation id="4653405415038586100">ලිනක්ස් වින්යාස කිරීමෝ දෝෂයයි</translation> +<translation id="465406513924180949">වෙබය පුරා ඇති සාප්පු කරත්තවල ඔබ දමා ගිය අයිතම වෙත පහසුවෙන් ආපසු යාමට ඔබට උපකාර වන කරත්ත ඔබ දකියි. + <ph name="BREAK" /> + <ph name="BREAK" /> + ඔබට කාඩ්පත් මෙනුවෙන් සැකසීම් කළමනාකරණය කිරීමට හෝ Chrome අභිරුචිකරණය තුළ තවත් විකල්ප බැලීමට හැකිය.</translation> <translation id="4654236001025007561">ඔබ අවට ඇති Chromebooks සහ Android උපාංග සමඟ ගොනු බෙදා ගන්න</translation> <translation id="4657914796247705218">TrackPoint වේගය</translation> <translation id="4658285806588491142">ඔබගේ තිරය පුද්ගලිකව තබා ගන්න</translation> @@ -4148,6 +4158,7 @@ <translation id="5121130586824819730">ඔබේ දෘඩතැටිය පිරී ඇත. කරුණාකර වෙනතව ස්ථානයක් තෝරන්න නැතහොත් දෘඩ තැටිය හිස් කරන්න.</translation> <translation id="5123433949759960244">පැසිපන්දු</translation> <translation id="5125751979347152379">අවලංගු URL.</translation> +<translation id="5125967981703109366">මෙම කාඩ්පත පිළිබඳ</translation> <translation id="5126611267288187364">වෙනස් කිරීම් බලන්න</translation> <translation id="5127242257756472928">කවුළු විවෘත කිරීමට සහ තැබීමට ඔබගේ තිර පිළිබඳ තොරතුරු භාවිත කිරීමට ඉඩ නොදේ</translation> <translation id="5127620150973591153">ආරක්ෂිත සම්බන්ධතා ID: <ph name="TOKEN" /></translation> @@ -4209,6 +4220,7 @@ <translation id="5185500136143151980">අන්තර්ජාලය නැත</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">ඔබගේ ප්රියතම මතක යළි ජීවමාන කරන්න. ඇල්බම එක් කිරීමට හෝ සංස්කරණය කිරීමට, <ph name="LINK_BEGIN" />Google ඡායාරූප<ph name="LINK_END" /> වෙත යන්න.</translation> +<translation id="5190316321948122159">{NUM_APPS,plural, =1{දැන් යෙදුම මකන්න}one{දැන් යෙදුම් මකන්න}other{දැන් යෙදුම් මකන්න}}</translation> <translation id="5190926251776387065">තොට ක්රියාත්මක කරන්න</translation> <translation id="5191094172448199359">ඔබ ඇතුළත් කළ PIN නොගැළපෙයි</translation> <translation id="5191251636205085390">තෙවන පාර්ශ්ව කුකි ප්රතිස්ථාපනය කිරීම අරමුණු කර ගත් නව තාක්ෂණ ගැනදැන ගන්න සහ පාලනය කරන්න</translation> @@ -4381,6 +4393,7 @@ <translation id="5342091991439452114">PIN එකෙහි අඩුම ගණනේ අංක <ph name="MINIMUM" />ක් වත් තිබිය යුතුය</translation> <translation id="5344036115151554031">ලිනක්ස් ප්රතිසාධන කිරීම</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (දකුණ)</translation> +<translation id="534572711507965074">ඔබගේ සමූහය නම් කරන්න, වර්ණයක් තෝරා, Enter තට්ටු කරන්න</translation> <translation id="5345916423802287046">ඔබ පිරූ විට යෙදුම ආරම්භ කරන්න</translation> <translation id="5350293332385664455">Google සහකරු අක්රිය කරන්න</translation> <translation id="535123479159372765">අනෙකුත් උපාංගයෙන් පිටපත් කළ පාඨය</translation> @@ -4962,6 +4975,7 @@ <translation id="5946591249682680882">වාර්ථා අංකය <ph name="WEBRTC_LOG_REPORT_ID" /></translation> <translation id="5948536763493709626">යතුරුපුවරුවක් හෝ මූසිකයක් සම්බන්ධ කරන්න, නැතහොත් ඔබගේ ස්පර්ශ තිරය භාවිතයෙන් පිහිටුවීම දිගටම කරගෙන යන්න. ඔබ බ්ලූටූත් උපාංග භාවිත කරන්නේ නම්, ඔබගේ උපාංග යුගල කිරීමට සූදානම් බව සහතික කර ගන්න.</translation> <translation id="5949544233750246342">ගොනුව විග්රහ කළ නොහැකිය</translation> +<translation id="5950039854561387265">ඊළඟ අවස්ථාවේදී ඉල්ලන්න</translation> <translation id="5950819593680344519">Chrome හට ඔබගේ පරිගණකයේ හානිකර මෘදුකාංග හමු නොවීය • ඊයේ පරීක්ෂා කරන ලදි</translation> <translation id="5951303645598168883"><ph name="ORIGIN" /> හට දේශීය ෆොන්ට භාවිත කිරීමට අවශ්යයි</translation> <translation id="5951624318208955736">නිරීක්ෂණය</translation> @@ -5132,6 +5146,10 @@ <translation id="6116921718742659598">භාශාව හා ආදාන සැකසුම් වෙනස් කරන්න</translation> <translation id="6119927814891883061">උපාංගය <ph name="DEVICE_NAME" /> ලෙස නම් කරන්න</translation> <translation id="6120205520491252677">මෙම පිටුව ආරම්භක තිරයට අමුණන්න...</translation> +<translation id="6120707837086723438">ඔබ වට්ටෝරු සඳහා ඔබගේ මෑත සෙවීම් ක්රියාකාරකම් මත පදනම්ව යෝජිත වට්ටෝරු දකියි. + <ph name="BREAK" /> + <ph name="BREAK" /> + ඔබට කාඩ්පත් මෙනුවෙන් සැකසීම් කළමනාකරණය කිරීමට හෝ Chrome අභිරුචිකරණය තුළ තවත් විකල්ප බැලීමට හැකිය.</translation> <translation id="6121773125605585883"><ph name="WEBSITE" /> සඳහා පරිශීලක නම <ph name="USERNAME" /> සමග මුරපදය බලන්න</translation> <translation id="6122081475643980456">ඔබගේ අන්තර්ජාල සබැඳුම පාලනය කෙරෙමින් ඇත</translation> <translation id="6122093587541546701">ඊතැපැල් (විකල්ප):</translation> @@ -5224,6 +5242,7 @@ <translation id="6218058416316985984"><ph name="DEVICE_TYPE" /> නොබැඳිය. අන්තර්ජාලයට සම්බන්ධ වී නැවත උත්සාහ කරන්න.</translation> <translation id="6220413761270491930">දිගුව ප්රවේශනය කිරීමේ දෝෂය</translation> <translation id="6223447490656896591">රුචි පින්තූරය:</translation> +<translation id="62236885217374510">{NUM_APPS,plural, =1{දැන් යෙදුම මකන්න}one{දැන් යෙදුම් මකන්න}other{දැන් යෙදුම් මකන්න}}</translation> <translation id="6224481128663248237">ආකෘතිගත කිරීම සාර්කව නිමයි!</translation> <translation id="622537739776246443">පැතිකඩ මකනු ලැබේ</translation> <translation id="6225475702458870625">ඔබේ <ph name="PHONE_NAME" /> වෙතින් දත්ත සබැඳුම ලබා ගත හැකිය</translation> @@ -5854,6 +5873,7 @@ <translation id="6846178040388691741">"<ph name="EXTENSION_NAME" />" හට <ph name="FILE_NAME" /> <ph name="PRINTER_NAME" /> මඟින් මුද්රණ කිරීමට අවශ්යයි.</translation> <translation id="6847125920277401289">ඉදිරියට යාමට ඉඩ නිදහස් කරන්න</translation> <translation id="6848388270925200958">මේ දැන්, ඔබට මෙම උපාංගය මත පමණක් භාවිත කළ හැකි සමහර කාඩ්පත් තිබේ</translation> +<translation id="6848425544473873717">{NUM_APPS,plural, =1{ඔබගේ යෙදුම්වලින් 1ක් තවදුරටත් සහාය නොදක්වයි. <ph name="LEARN_MORE" />}one{ඔබගේ යෙදුම්වලින් #ක් තවදුරටත් සහාය නොදක්වයි. <ph name="LEARN_MORE" />}other{ඔබගේ යෙදුම්වලින් #ක් තවදුරටත් සහාය නොදක්වයි. <ph name="LEARN_MORE" />}}</translation> <translation id="6848716236260083778">ඇඟිලි සලකුණ පිහිටුවීමට, ඔබගේ දරුවා ලවා ඇඟිලි සලකුණු සංවේදකය ස්පර්ශ කරවන්න. ඔබගේ දරුවාගේ ඇඟිලි සලකුණු දත්ත ආරක්ෂිතව ගබඩා කරන අතර කිසි විට ඔබගේ <ph name="DEVICE_TYPE" /> හැර නොයයි.</translation> <translation id="6850286078059909152">පාඨ වර්ණය</translation> <translation id="6851181413209322061">භාවිත සහ දෝෂ නිර්ණ දත්ත යවන්න. මෙම උපාංගය ස්වයංක්රියව රෝග විනිශ්චය, උපාංග සහ යෙදුම් භාවිත දත්ත Google වෙත යවයි. මෙය ඔබේ දරුවා හඳුනා ගැනීමට භාවිත නොකෙරෙන අතර, පද්ධති සහ යෙදුම් ස්ථායිතාවට සහ අනෙකුත් වැඩිදියුණු කිරීම්වලට උදවු කරයි. සමහර එකතු කළ දත්ත Google යෙදුම්වලට සහ Android සංවර්ධකයින් වැනි හවුල්කරුවන්ට ද උදවු කරති. මෙම සැකසීම හිමිකරු විසින් බලාත්මක කෙරේ. ඔබේ දරුවා සඳහා අමතර වෙබ් සහ යෙදුම් ක්රියාකාරකම සක්රීය කර තිබේ නම්, මෙම දත්ත ඔවුන්ගේ Google ගිණුමට සුරැකිය හැක.</translation> @@ -6734,6 +6754,10 @@ <translation id="7744192722284567281">දත්ත කඩ කිරීම තුළ හමු විය</translation> <translation id="7744649840067671761">පැවරුම ආරම්භ කිරීමට නව ස්විචයක් හෝ යතුරු පුවරු යතුරක් ඔබන්න. පැවරුම ඉවත් කිරීමට පවරන ලද ස්විචයක් හෝ යතුරක් ඔබන්න.</translation> +<translation id="7746739418892731373">ඔබ ඔබගේ Google ඡායාරූප පුස්තකාලයෙන් ඡායාරූප සහ වීඩියෝ විශේෂ අවස්ථා දකියි. ඔබට <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" /> හිදී ඔබගේ විශේෂ අවස්ථා තුළ පෙන්වන දේ පාලනය කළ හැකිය. + <ph name="BREAK" /> + <ph name="BREAK" /> + ඔබට කාඩ්පත් මෙනුවෙන් මෙම කාඩ්පත සඳහා සැකසීම් කළමනාකරණය කිරීමට හෝ Chrome අභිරුචිකරණය තුළ තවත් විකල්ප බැලීමට හැකිය.</translation> <translation id="7750228210027921155">පින්තූරය-තුළ-පින්තූරය</translation> <translation id="7751260505918304024">සියල්ල පෙන්වන්න</translation> <translation id="7753735457098489144">ආචයන ඉඩ නොමැති වීම නිසා ස්ථාපනය අසාර්ථක විය. ඉඩ හිස් කිරීමට, උපාංග ගබඩාවෙන් ගොනු මකන්න.</translation> @@ -7114,6 +7138,7 @@ <translation id="8102139037507939978">system_logs.txt වෙතින් පුද්ගලිකව හඳුනා ගත හැකි තොරතුරු ඉවත් කරන්න.</translation> <translation id="8104088837833760645">eSIM පැතිකඩ බාගන්න</translation> <translation id="8105368624971345109">ක්රියා විරහිත කරන්න</translation> +<translation id="8105541061909542455">{NUM_APPS,plural, =1{සහාය නොදක්වන යෙදුම}one{සහාය නොදක්වන යෙදුම්}other{සහාය නොදක්වන යෙදුම්}}</translation> <translation id="8107015733319732394">ඔබේ <ph name="DEVICE_TYPE" /> මත Google Play Store ස්ථාපනය කරමින්. මේ සඳහා විනාඩි කිහිපයක් ගත විය හැකිය.</translation> <translation id="810728361871746125">සංදර්ශක විභේදනය</translation> <translation id="8108526232944491552">{COUNT,plural, =0{තෙවන පාර්ශ්ව කුකී නැත}=1{1 තෙවන පාර්ශ්ව කුකීයක් අවහිර කළා}one{තෙවන පාර්ශ්ව කුකී # ක් අවහිර කළා}other{තෙවන පාර්ශ්ව කුකී # ක් අවහිර කළා}}</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index 7332f5f..88dd3c3 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -3199,6 +3199,10 @@ <translation id="4110490973560452005">Dokončilo sa sťahovanie súboru: <ph name="FILE_NAME" />. Stláčaním klávesov Shift+F6 prejdite do oblasti panela so stiahnutými súbormi.</translation> <translation id="4110686435123617899">Vyberte album <ph name="TITLE" /> <ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (offline)</translation> +<translation id="4114524937989710624">Zobrazujú sa navrhované súbory, ktoré vám pomôžu ľahko sa vrátiť k poslednej nedávnej aktivite na Disku Google. + <ph name="BREAK" /> + <ph name="BREAK" /> + Môžete spravovať nastavenia v ponuke karty alebo si zobraziť ďalšie možnosti v sekcii Pripôsobenie Chromu.</translation> <translation id="4115002065223188701">Sieť je mimo dosahu</translation> <translation id="4115378294792113321">Purpurová</translation> <translation id="4116704186509653070">Znova otvoriť</translation> @@ -3706,6 +3710,10 @@ <translation id="4651484272688821107">Nepodarilo sa načítať komponent so zdrojmi režimu ukážky.</translation> <translation id="4652935475563630866">Zmena nastavenia kamery vyžaduje opätovné spustenie aplikácie Parallels Desktop. Pokračujte opätovným spustením aplikácie Parallels Desktop.</translation> <translation id="4653405415038586100">Chyba pri konfigurovaní systému Linux</translation> +<translation id="465406513924180949">Zobrazujú sa karty, ktoré vám pomôžu ľahko sa vrátiť k položkám, ktoré ste zanechali v nákupných košíkoch na internete. + <ph name="BREAK" /> + <ph name="BREAK" /> + Môžete spravovať nastavenia v ponuke karty alebo si zobraziť ďalšie možnosti v sekcii Pripôsobenie Chromu.</translation> <translation id="4654236001025007561">Zdieľajte súbory s Chromebookmi a zariadeniami s Androidom okolo vás</translation> <translation id="4657914796247705218">Rýchlosť TrackPointu</translation> <translation id="4658285806588491142">Uchovajte si obsah obrazovky v súkromí</translation> @@ -4148,6 +4156,7 @@ <translation id="5121130586824819730">Pevný disk je plný. Uložte inde alebo uvoľnite viac miesta na pevnom disku. </translation> <translation id="5123433949759960244">Basketbal</translation> <translation id="5125751979347152379">Neplatná webová adresa.</translation> +<translation id="5125967981703109366">Táto karta</translation> <translation id="5126611267288187364">Zobraziť zmeny</translation> <translation id="5127242257756472928">Weby, ktoré nemajú povolené otvárať a umiestňovať okná pomocou informácií o vašich obrazovkách</translation> <translation id="5127620150973591153">Bezpečný spojovací kód: <ph name="TOKEN" /></translation> @@ -5134,6 +5143,10 @@ <translation id="6116921718742659598">Zmeniť nastavenia jazyka a vstupu</translation> <translation id="6119927814891883061">Pomenovať zariadenie <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Pripnúť túto stránku na Úvodnú obrazovku...</translation> +<translation id="6120707837086723438">Zobrazujú sa navrhované recepty na základe vašej nedávnej aktivity vyhľadávania receptov. + <ph name="BREAK" /> + <ph name="BREAK" /> + Môžete spravovať nastavenia v ponuke karty alebo si zobraziť ďalšie možnosti v sekcii Pripôsobenie Chromu.</translation> <translation id="6121773125605585883">Zobraziť heslo s používateľským menom <ph name="USERNAME" /> pre web <ph name="WEBSITE" /></translation> <translation id="6122081475643980456">Vaše internetové pripojenie je ovládané</translation> <translation id="6122093587541546701">E-mail (nepovinné):</translation> @@ -6740,6 +6753,10 @@ <translation id="7744192722284567281">Nájdené v rámci porušenia ochrany údajov</translation> <translation id="7744649840067671761">Spustite úlohu stlačením nového prepínača alebo klávesa. Odstráňte ju stlačením prideleného prepínača alebo klávesa.</translation> +<translation id="7746739418892731373">Zobrazujú sa výbery fotiek a videí z vašej knižnice Fotiek Google. Na <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" /> môžete ovládať, čo sa má vo výberoch zobrazovať. + <ph name="BREAK" /> + <ph name="BREAK" /> + Môžete spravovať nastavenia tejto karty v jej ponuke alebo si zobraziť ďalšie možnosti v sekcii Pripôsobenie Chromu.</translation> <translation id="7750228210027921155">Obraz v obraze</translation> <translation id="7751260505918304024">Zobraziť všetky</translation> <translation id="7753735457098489144">Nepodarilo sa nainštalovať pre nedostatok priestoru. Uvoľníte ho odstránením súborov z úložiska zariadenia.</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 46144ee..cf980802 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -3213,6 +3213,10 @@ <translation id="4110490973560452005">Prenos je končan: <ph name="FILE_NAME" />. Pritisnite Shift + F6, če želite krožiti do območja vrstice s prenosi.</translation> <translation id="4110686435123617899">Izberite album <ph name="TITLE" /> <ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (brez povezave)</translation> +<translation id="4114524937989710624">Prikazane so predlagane datoteke, s katerimi se boste lažje vrnili k nedavni dejavnosti v Googlu Drive. + <ph name="BREAK" /> + <ph name="BREAK" /> + Lahko upravljate nastavitve v meniju kartice ali si ogledate več možnosti v razdelku za upravljanje Chroma.</translation> <translation id="4115002065223188701">Omrežje zunaj dosega</translation> <translation id="4115378294792113321">Škrlatna</translation> <translation id="4116704186509653070">Znova odpri</translation> @@ -3721,6 +3725,10 @@ <translation id="4651484272688821107">Spletne komponente ni bilo mogoče naložiti s sredstvi predstavitvenega načina.</translation> <translation id="4652935475563630866">Sprememba nastavitve kamere zahteva vnovičen zagon programa Parallels Desktop. Znova zaženite program Parallels Desktop, če želite nadaljevati.</translation> <translation id="4653405415038586100">Napaka pri konfiguriranju Linuxa</translation> +<translation id="465406513924180949">Prikazani so vozički, ki vam bodo pomagali, da se lažje vrnete k izdelkom, ki ste jih pustili v nakupovalnih vozičkih po spletu. + <ph name="BREAK" /> + <ph name="BREAK" /> + Lahko upravljate nastavitve v meniju kartice ali si ogledate več možnosti v razdelku za upravljanje Chroma.</translation> <translation id="4654236001025007561">Delite datoteke s Chromebooki in napravami Android v bližini.</translation> <translation id="4657914796247705218">Hitrost sledilne palčke</translation> <translation id="4658285806588491142">Poskrbite za zasebnost zaslona</translation> @@ -4163,6 +4171,7 @@ <translation id="5121130586824819730">Trdi disk je poln. Shranite na drugo mesto ali sprostite prostor na trdem disku.</translation> <translation id="5123433949759960244">Košarkarska žoga</translation> <translation id="5125751979347152379">Neveljaven spletni naslov.</translation> +<translation id="5125967981703109366">O tej kartici</translation> <translation id="5126611267288187364">Ogled sprememb</translation> <translation id="5127242257756472928">Ni dovoljena uporaba podatkov o zaslonih za odpiranje in postavitev oken.</translation> <translation id="5127620150973591153">ID varne povezave: <ph name="TOKEN" /></translation> @@ -5148,6 +5157,10 @@ <translation id="6116921718742659598">Spreminjanje nastavitev jezika in vnosa</translation> <translation id="6119927814891883061">Poimenovanje naprave v <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Pripnite to stran na začetni zaslon ...</translation> +<translation id="6120707837086723438">Prikazani so predlagani recepti na podlagi nedavne dejavnosti v Iskanju Google glede receptov. + <ph name="BREAK" /> + <ph name="BREAK" /> + Lahko upravljate nastavitve v meniju kartice ali si ogledate več možnosti v razdelku za upravljanje Chroma.</translation> <translation id="6121773125605585883">Ogled gesla z uporabniškim imenom <ph name="USERNAME" /> za spletno mesto <ph name="WEBSITE" /></translation> <translation id="6122081475643980456">Vaša povezava z internetom je nadzorovana</translation> <translation id="6122093587541546701">E-poštni naslov (izbirno):</translation> @@ -6752,6 +6765,10 @@ <translation id="7744192722284567281">Najdeno pri podatkovni kršitvi</translation> <translation id="7744649840067671761">Pritisnite novo stikalo ali tipko na tipkovnici, če želite začeti dodeljevanje. Pritisnite dodeljeno stikalo ali tipko, če želite odstraniti dodelitev.</translation> +<translation id="7746739418892731373">Prikazane so izpostavljene fotografije in videoposnetki iz knjižnice v Googlu Foto. Na <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" /> lahko nadzirate, kaj je prikazano med izpostavljeno vsebino. + <ph name="BREAK" /> + <ph name="BREAK" /> + Lahko upravljate nastavitve za to kartico v meniju kartice ali si ogledate več možnosti v razdelku za upravljanje Chroma.</translation> <translation id="7750228210027921155">Slika v sliki</translation> <translation id="7751260505918304024">Prikaži vse</translation> <translation id="7753735457098489144">Namestitev ni uspela zaradi pomanjkanja prostora za shranjevanje. Če želite sprostiti prostor, izbrišite datoteke iz shrambe v napravi.</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index 15f7390..b919a7f 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -1260,6 +1260,7 @@ <translation id="2218019600945559112">Miu dhe blloku me prekje</translation> <translation id="2218320521449013367">Ndodhi një gabim ndërkohë që Chrome po hiqte softuerin e dëmshëm</translation> <translation id="2218515861914035131">Ngjite si tekst të thjeshtë</translation> +<translation id="2219658597883514593">Rinis udhëzuesin</translation> <translation id="2220409419896228519">Shto faqeshënuesit në "Aplikacionet e Google" që preferon</translation> <translation id="2220529011494928058">Raporto një problem</translation> <translation id="2220572644011485463">Kodi PIN ose fjalëkalimi</translation> @@ -2404,6 +2405,7 @@ <translation id="3378627645871606983">Lejet e dhëna për Steam zbatohen për të gjitha lojërat dhe aplikacionet e Steam.</translation> <translation id="337920581046691015">Do të instalohet <ph name="PRODUCT_NAME" />.</translation> <translation id="3380365263193509176">Gabim i panjohur</translation> +<translation id="3380850890226973980">Pyet herën tjetër</translation> <translation id="3382073616108123819">Mos! Sistemi nuk arriti të përcaktonte identifikuesit e pajisjeve për këtë pajisje.</translation> <translation id="3382200254148930874">Po ndalon mbikëqyrjen...</translation> <translation id="338323348408199233">Blloko trafikun pa rrjetin VPN</translation> @@ -4202,6 +4204,7 @@ <translation id="5185500136143151980">Nuk ka internet</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Rijeto kujtimet e tua të preferuara. Për të shtuar ose modifikuar albume, shko te <ph name="LINK_BEGIN" />Fotografitë e Google<ph name="LINK_END" />.</translation> +<translation id="5190316321948122159">{NUM_APPS,plural, =1{Fshi aplikacionin tani}other{Fshi aplikacionet tani}}</translation> <translation id="5190926251776387065">Aktivizo portën</translation> <translation id="5191094172448199359">Kodet PIN që fute nuk përputhen</translation> <translation id="5191251636205085390">Mëso dhe kontrollo teknologjitë e reja që synojnë të zëvendësojnë kukit e palëve të treta</translation> @@ -4374,6 +4377,7 @@ <translation id="5342091991439452114">Kodi PIN duhet të ketë të paktën <ph name="MINIMUM" /> shifra</translation> <translation id="5344036115151554031">Linux po restaurohet</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (djathtas)</translation> +<translation id="534572711507965074">Emërto grupin tënd, zgjidh një ngjyrë dhe trokit Enter</translation> <translation id="5345916423802287046">Nis aplikacionin kur identifikohesh</translation> <translation id="5350293332385664455">Çaktivizo "Asistentin e Google"</translation> <translation id="535123479159372765">Teksti u kopjua nga pajisja tjetër</translation> @@ -4954,6 +4958,7 @@ <translation id="5946591249682680882">ID-ja e raportimit <ph name="WEBRTC_LOG_REPORT_ID" /></translation> <translation id="5948536763493709626">Lidh një tastierë ose mi, ose vazhdo me konfigurimin duke përdorur ekranin me prekje. Nëse po përdor pajisjet e tua me Bluetooth, sigurohu që pajisjet e tua janë gati për t'u çiftuar.</translation> <translation id="5949544233750246342">Skedari nuk mund të analizohej</translation> +<translation id="5950039854561387265">Pyet herën tjetër</translation> <translation id="5950819593680344519">Chrome nuk gjeti softuerë të dëmshëm në kompjuterin tënd • Kontrolluar dje</translation> <translation id="5951303645598168883"><ph name="ORIGIN" /> dëshiron të përdorë fontet lokale</translation> <translation id="5951624318208955736">Monitori</translation> @@ -5216,6 +5221,7 @@ <translation id="6218058416316985984"><ph name="DEVICE_TYPE" /> është jashtë linje. Lidhu me internetin dhe provo sërish.</translation> <translation id="6220413761270491930">Gabim në ngarkimin e shtesës</translation> <translation id="6223447490656896591">Personalizo imazhin:</translation> +<translation id="62236885217374510">{NUM_APPS,plural, =1{Fshi aplikacionin tani}other{Fshi aplikacionet tani}}</translation> <translation id="6224481128663248237">Formatimi përfundoi me sukses!</translation> <translation id="622537739776246443">Profili do të fshihet</translation> <translation id="6225475702458870625">Lidhja e të dhënave e disponueshme nga pajisja jote <ph name="PHONE_NAME" /></translation> @@ -5848,6 +5854,7 @@ <translation id="6846178040388691741">"<ph name="EXTENSION_NAME" />" dëshiron të printojë <ph name="FILE_NAME" /> me <ph name="PRINTER_NAME" />.</translation> <translation id="6847125920277401289">Liro hapësirë për të vazhduar</translation> <translation id="6848388270925200958">Në këtë moment, ke disa karta që mund të përdoren vetëm në këtë pajisje</translation> +<translation id="6848425544473873717">{NUM_APPS,plural, =1{1 nga aplikacionet e tua nuk mbështetet më. <ph name="LEARN_MORE" />}other{# nga aplikacionet e tua nuk mbështeten më. <ph name="LEARN_MORE" />}}</translation> <translation id="6848716236260083778">Për të konfiguruar gjurmë gishti, vëre fëmijën tënd të prekë sensorin e gjurmës së gishtit. Të dhënat e gjurmës së gishtit të fëmijës tënd ruhen në mënyrë të sigurt dhe nuk largohen kurrë nga ky <ph name="DEVICE_TYPE" />.</translation> <translation id="6850286078059909152">Ngjyra e tekstit</translation> <translation id="6851181413209322061">Dërgo të dhënat e përdorimit dhe të diagnostikimit. Aktualisht kjo pajisje po dërgon automatikisht te Google të dhënat e diagnostikimit dhe të përdorimit të pajisjes dhe të aplikacioneve. Këto nuk do të përdoren për të identifikuar fëmijën tënd dhe do të ndihmojnë për qëndrueshmërinë e sistemit dhe të aplikacioneve dhe për përmirësime të tjera. Disa të dhëna të përmbledhura do të ndihmojnë po ashtu aplikacionet dhe partnerët e Google, si p.sh. zhvilluesit e Android. Ky cilësim zbatohet nga zotëruesi. Nëse "Aktiviteti shtesë i uebit dhe i aplikacioneve" është i aktivizuar për fëmijën tënd, këto të dhëna mund të ruhen në "Llogarinë e Google" të fëmijës.</translation> @@ -7108,6 +7115,7 @@ <translation id="8102139037507939978">Hiq informacionin e idetifikueshëm personalisht nga system_logs.txt.</translation> <translation id="8104088837833760645">Shkarko profilin e kartës eSIM</translation> <translation id="8105368624971345109">Çaktivizo</translation> +<translation id="8105541061909542455">{NUM_APPS,plural, =1{Aplikacion i pambështetur}other{Aplikacione të pambështetura}}</translation> <translation id="8107015733319732394">Po instalon Google Play Store në pajisjen tënde <ph name="DEVICE_TYPE" />. Kjo mund të kërkojë disa minuta kohë.</translation> <translation id="810728361871746125">Rezolucioni i ekranit</translation> <translation id="8108526232944491552">{COUNT,plural, =0{Asnjë kuki e palëve të treta}=1{1 kuki e palëve të treta është bllokuar}other{# kuki të palëve të treta janë bllokuar}}</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 63fda866..ba989f47 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -1343,6 +1343,7 @@ <translation id="2278562042389100163">Öppna webbläsarfönster</translation> <translation id="2278668501808246459">Hanteraren av behållare startas</translation> <translation id="2280486287150724112">Högermarginal</translation> +<translation id="2281863813036651454">Vänsterklick på musen</translation> <translation id="2282146716419988068">GPU-bearbetning</translation> <translation id="2285109769884538519">{COUNT,plural, =0{Öppna alla i en &ny flikgrupp}=1{Öppna i en &ny flikgrupp}other{Öppna alla ({COUNT}) i en &ny flikgrupp}}</translation> <translation id="2285942871162473373">Fingeravtrycket känns inte igen. Försök igen.</translation> @@ -5158,6 +5159,7 @@ <translation id="6129938384427316298">Kommentar för Netscape-certifikat</translation> <translation id="6129953537138746214">Blanksteg</translation> <translation id="6130692320435119637">Lägg till wifi-nätverk</translation> +<translation id="6130887916931372608">Tangent på tangentbordet</translation> <translation id="6136114942382973861">Stäng nedladdningsfältet</translation> <translation id="6136287496450963112">Säkerhetsnyckeln skyddas inte av en pinkod. Skapa en pinkod först om du vill använda fingeravtryck.</translation> <translation id="6138680304137685902">X9.62 ECDSA-signatur med SHA-384</translation> @@ -6770,6 +6772,7 @@ <translation id="7768770796815395237">Ändra</translation> <translation id="7768784765476638775">Textuppläsning</translation> <translation id="7770406201819593386">Kör diagnostiska test av ChromeOS Flex.</translation> +<translation id="7770450735129978837">Högerklick på musen</translation> <translation id="7770612696274572992">Bild kopierad från en annan enhet</translation> <translation id="7771452384635174008">Layout</translation> <translation id="7772032839648071052">Bekräfta lösenfras</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index a633ca2..24ccc09d 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -1339,6 +1339,7 @@ <translation id="2278562042389100163">Fungua dirisha la kivinjari</translation> <translation id="2278668501808246459">Inaanzisha kidhibiti cha metadata</translation> <translation id="2280486287150724112">Pambizo la kulia</translation> +<translation id="2281863813036651454">Kubofya kipanya upande wa kushoto</translation> <translation id="2282146716419988068">Mchakato wa GPU</translation> <translation id="2285109769884538519">{COUNT,plural, =0{Fungua zote katika &kikundi kipya cha vichupo}=1{Fungua katika &kikundi kipya cha vichupo}other{Fungua zote ({COUNT}) katika &kikundi kipya cha vichupo}}</translation> <translation id="2285942871162473373">Imeshindwa kutambua alama yako ya kidole. Jaribu tena.</translation> @@ -3204,6 +3205,10 @@ <translation id="4110490973560452005">Imemaliza kupakua: <ph name="FILE_NAME" />. Bonyeza Shift+F6 ili uende kwenye eneo la upau wa vipakuliwa.</translation> <translation id="4110686435123617899">Chagua albamu ya <ph name="TITLE" /> <ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (haipo mtandaoni)</translation> +<translation id="4114524937989710624">Unapata faili zilizopendekezwa ili kukusaidia urejee kwa urahisi kwenye shughuli za hivi majuzi katika Hifadhi ya Google. + <ph name="BREAK" /> + <ph name="BREAK" /> + Unaweza kudhibiti mipangilio kutokea kwenye menyu ya kadi au uangalie chaguo zaidi kwenye kipengele cha Weka Mipangilio ya Chrome Upendavyo.</translation> <translation id="4115002065223188701">Uko mbali na mtandao huu</translation> <translation id="4115378294792113321">Rangi ya damu ya mzee</translation> <translation id="4116704186509653070">Fungua tena</translation> @@ -3712,6 +3717,10 @@ <translation id="4651484272688821107">Imeshindwa kupakia kipengele cha mtandaoni chenye nyenzo za hali ya onyesho.</translation> <translation id="4652935475563630866">Mabadiliko kwenye mipangilio ya kamera yanahitaji ufungue tena Parallels Desktop. Fungua tena Parallels Desktop ili uendelee.</translation> <translation id="4653405415038586100">Hitilafu ya kuweka mipangilio ya Linux</translation> +<translation id="465406513924180949">Unaona vikapu vinavyokusaidia kurejea kwa urahisi kwenye bidhaa ulizoacha kwenye vikapu vya ununuzi kwenye wavuti. + <ph name="BREAK" /> + <ph name="BREAK" /> + Unaweza kudhibiti mipangilio kutokea kwenye menyu ya kadi au uangalie chaguo zaidi kwenye kipengele cha Weka Mipangilio ya Chrome Upendavyo.</translation> <translation id="4654236001025007561">Shiriki faili na vifaa vya Chromebook na vya Android vilivyo karibu nawe</translation> <translation id="4657914796247705218">Kasi ya TrackPoint</translation> <translation id="4658285806588491142">Ifanye skrini yako iwe ya faragha</translation> @@ -4154,6 +4163,7 @@ <translation id="5121130586824819730">Diski yako kuu imejaa. Tafadhali hifadhi kwenye eneo jingine au utafute nafasi zaidi kwenye diski kuu.</translation> <translation id="5123433949759960244">Mpira wa kikapu</translation> <translation id="5125751979347152379">URL hiyo si sahihi.</translation> +<translation id="5125967981703109366">Kuhusu kadi hii</translation> <translation id="5126611267288187364">Angalia mabadiliko</translation> <translation id="5127242257756472928">Zisizoruhusiwa kutumia maelezo kuhusu skrini zako kwa ajili ya kufungua na kuweka madirisha</translation> <translation id="5127620150973591153">Nambari salama ya kuunganisha: <ph name="TOKEN" /></translation> @@ -5138,6 +5148,10 @@ <translation id="6116921718742659598">Badilisha mipangilio ya lugha na uingizaji</translation> <translation id="6119927814891883061">Kipe kifaa jina la <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Bana ukurasa huu kwenye skirini ya Kuanza...</translation> +<translation id="6120707837086723438">Unaona mapishi yaliyopendekezwa kulingana na shughuli zako za utafutaji za hivi karibuni za utafutaji wa mapishi. + <ph name="BREAK" /> + <ph name="BREAK" /> + Unaweza kudhibiti mipangilio kutokea kwenye menyu ya kadi au uangalie chaguo zaidi kwenye kipengele cha Weka Mipangilio ya Chrome Upendavyo.</translation> <translation id="6121773125605585883">Angalia nenosiri lenye jina la mtumiaji <ph name="USERNAME" /> unalotumia katika <ph name="WEBSITE" /></translation> <translation id="6122081475643980456">Muunganisho wako wa Intaneti unadhibitiwa</translation> <translation id="6122093587541546701">Barua pepe (hiari):</translation> @@ -5154,6 +5168,7 @@ <translation id="6129938384427316298">Kidokezo cha Cheti cha Netscape</translation> <translation id="6129953537138746214">Nafasi</translation> <translation id="6130692320435119637">Weka Wi-Fi</translation> +<translation id="6130887916931372608">Kitufe cha kibodi</translation> <translation id="6136114942382973861">Funga upau wa vipakuliwa</translation> <translation id="6136287496450963112">Ufunguo wako wa usalama haujalindwa kwa PIN. Ili uweze kudhibiti alama za vidole, kwanza weka PIN.</translation> <translation id="6138680304137685902">Sahihi ya X9.62 ECDSA yenye SHA-384</translation> @@ -6741,6 +6756,10 @@ <translation id="7744192722284567281">Limepatikana kwenye tukio la ufichuzi haramu wa data</translation> <translation id="7744649840067671761">Bonyeza swichi au kitufe kipya cha kibodi ili uanze kukabidhi. Bonyeza swichi au kitufe ulichokabidhi ili uondoe kitendo ulichokabidhi.</translation> +<translation id="7746739418892731373">Unaona picha na video zilizoangaziwa kutoka kwenye maktaba yako ya Picha kwenye Google. Unaweza kudhibiti kinachoonekana kwenye mambo yako yanayoangaziwa kupitia <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" />. + <ph name="BREAK" /> + <ph name="BREAK" /> + Unaweza kudhibiti mipangilio ya kadi hii kutokea kwenye menyu au uangalie chaguo zaidi kwenye kipengele cha Weka Mipangilio ya Chrome Upendavyo.</translation> <translation id="7750228210027921155">Picha ndani ya picha</translation> <translation id="7751260505918304024">Onyesha zote</translation> <translation id="7753735457098489144">Imeshindwa kusakinisha kwa sababu nafasi ya hifadhi haitoshi. Ili upate nafasi, futa faili zilizo kwenye hifadhi ya kifaa.</translation> @@ -6766,6 +6785,7 @@ <translation id="7768770796815395237">Badilisha</translation> <translation id="7768784765476638775">Chagua ili izungumze</translation> <translation id="7770406201819593386">Tekeleza majaribio ya uchunguzi wa ChromeOS Flex.</translation> +<translation id="7770450735129978837">Kubofya kipanya upande wa kulia</translation> <translation id="7770612696274572992">Picha imenakiliwa kutoka kwenye kifaa kingine</translation> <translation id="7771452384635174008">Mpangilio</translation> <translation id="7772032839648071052">Thibitisha kaulisiri</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 0a2701a6..74a811a 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -5976,7 +5976,7 @@ <translation id="6995899638241819463">தரவு மீறலினால் கடவுச்சொற்கள் வெளியாகியிருந்தால் அதுகுறித்து எச்சரி</translation> <translation id="6997642619627518301"><ph name="NAME_PH" /> - செயல்பாட்டுப் பதிவு</translation> <translation id="6997707937646349884">உங்கள் சாதனங்களில்:</translation> -<translation id="6998793565256476099">வீடியோ கலந்துரையாடலுக்கு, சாதனத்தைப் பதிவுசெய்</translation> +<translation id="6998793565256476099">வீடியோ கான்ஃபிரன்ஸுக்குச் சாதனத்தைப் பதிவுசெய்</translation> <translation id="6999956497249459195">புதிய குழு</translation> <translation id="7000206553895739324"><ph name="PRINTER_NAME" /> இணைக்கப்பட்டுள்ளது, எனினும் உள்ளமைவு தேவைப்படுகிறது</translation> <translation id="7000347579424117903">Ctrl, Alt அல்லது தேடல் விசையைப் பயன்படுத்தித் தொடங்கவும்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index ed10619d..7c64060 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -3211,6 +3211,10 @@ <translation id="4110490973560452005">డౌన్లోడ్ పూర్తయింది: <ph name="FILE_NAME" />. డౌన్లోడ్ల బార్ ప్రాంతంలోకి వెళ్లడం కోసం Shift+F6 నొక్కండి.</translation> <translation id="4110686435123617899"><ph name="TITLE" /> <ph name="DESC" /> ఆల్బమ్ను ఎంచుకోండి</translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (ఆఫ్లైన్)</translation> +<translation id="4114524937989710624">Google Driveలోని మీ అత్యంత ఇటీవలి యాక్టివిటీకి తిరిగి వెళ్లడంలో మీకు సహాయపడటానికి సూచించబడిన ఫైల్స్ మీకు కనిపిస్తున్నాయి. + <ph name="BREAK" /> + <ph name="BREAK" /> + మీరు కార్డ్ మెనూ నుండి సెట్టింగ్లను మేనేజ్ చేయవచ్చు లేదా, అనుకూలంగా మార్చిన Chromeలో మరిన్ని ఆప్షన్లను చూడండి.</translation> <translation id="4115002065223188701">నెట్వర్క్ అందుబాటులో లేదు</translation> <translation id="4115378294792113321">మెజెంటా</translation> <translation id="4116704186509653070">మళ్లీ తెరవండి</translation> @@ -3719,6 +3723,10 @@ <translation id="4651484272688821107">డెమో మోడ్ వనరులతో ఆన్లైన్ అంతర్భాగాన్ని లోడ్ చేయడం సాధ్యపడలేదు.</translation> <translation id="4652935475563630866">కెమెరా సెట్టింగ్లో మార్చడానికి పారలల్స్ డెస్క్టాప్ను మళ్లీ ప్రారంభించవలసి ఉంటుంది. కొనసాగించడానికి పారలల్స్ డెస్క్టాప్ను మళ్లీ ప్రారంభించండి.</translation> <translation id="4653405415038586100">Linuxను కాన్ఫిగర్ చేయడంలో ఎర్రర్</translation> +<translation id="465406513924180949">వెబ్ అంతటా గల మీ షాపింగ్ కార్ట్లలో ఉన్న ఐటెమ్లకు మీరు తిరిగి వెళ్లడంలో మీకు సహాయపడే కార్ట్లు మీకు కనిపిస్తున్నాయి. + <ph name="BREAK" /> + <ph name="BREAK" /> + మీరు కార్డ్ మెనూ నుండి సెట్టింగ్లను మేనేజ్ చేయవచ్చు లేదా, అనుకూలంగా మార్చిన Chromeలో మరిన్ని ఆప్షన్లను చూడండి.</translation> <translation id="4654236001025007561">మీ చుట్టూ ఉన్న Chromebookలు, అలాగే Android పరికరాలతో ఫైళ్లను షేర్ చేయండి</translation> <translation id="4657914796247705218">TrackPoint వేగం</translation> <translation id="4658285806588491142">మీ స్క్రీన్ను ప్రైవేట్గా ఉంచుకోండి</translation> @@ -4161,6 +4169,7 @@ <translation id="5121130586824819730">మీ హార్డ్ డిస్క్ నిండింది. దయచేసి మరొక స్థానానికి సేవ్ చేయండి లేదా హార్డ్ డిస్క్లోని నిల్వను ఖాళీ చేయండి.</translation> <translation id="5123433949759960244">బాస్కెట్బాల్</translation> <translation id="5125751979347152379">చెల్లని URL.</translation> +<translation id="5125967981703109366">ఈ కార్డ్ గురించి</translation> <translation id="5126611267288187364">మార్పులను చూడండి</translation> <translation id="5127242257756472928">విండోలను తెరిచి, ఉంచడానికి మీ స్క్రీన్లకు సంబంధించిన సమాచారాన్ని ఉపయోగించడానికి అనుమతి లేదు</translation> <translation id="5127620150973591153">సురక్షిత కనెక్షన్ ID: <ph name="TOKEN" /></translation> @@ -5147,6 +5156,10 @@ <translation id="6116921718742659598">భాష మరియు ఇన్పుట్ సెట్టింగ్లను మార్చండి</translation> <translation id="6119927814891883061">పరికరానికి <ph name="DEVICE_NAME" /> అని పేరు పెట్టండి</translation> <translation id="6120205520491252677">ప్రారంభ స్క్రీన్కు ఈ పేజీని పిన్ చేయి...</translation> +<translation id="6120707837086723438">వంటకాల కోసం మీరు చేసిన ఇటీవలి సెర్చ్ యాక్టివిటీ ఆధారంగా సూచించబడిన ఈ వంటకాలు మీకు కనిపిస్తున్నాయి. + <ph name="BREAK" /> + <ph name="BREAK" /> + మీరు కార్డ్ మెనూ నుండి సెట్టింగ్లను మేనేజ్ చేయవచ్చు లేదా, అనుకూలంగా మార్చిన Chromeలో మరిన్ని ఆప్షన్లను చూడండి.</translation> <translation id="6121773125605585883"><ph name="WEBSITE" /> కోసం <ph name="USERNAME" /> యూజర్నేమ్తో పాస్వర్డ్ను చూడండి</translation> <translation id="6122081475643980456">మీ ఇంటర్నెట్ కనెక్షన్ నియంత్రించబడుతోంది</translation> <translation id="6122093587541546701">ఈమెయిల్ (ఐచ్ఛికం):</translation> @@ -6753,6 +6766,10 @@ <translation id="7744192722284567281">డేటా ఉల్లంఘనలో కనుగొనబడింది</translation> <translation id="7744649840067671761">అసైన్మెంట్ను ప్రారంభించడానికి కొత్త స్విచ్ను లేదా కీబోర్డ్ కీని నొక్కండి. అసైన్మెంట్ను తీసివేయడానికి అసైన్ చేయబడిన స్విచ్ను లేదా కీని నొక్కండి.</translation> +<translation id="7746739418892731373">మీ Google Photos లైబ్రరీ నుండి మీకు ఫోటో, వీడియో హైలైట్లు కనిపిస్తున్నాయి. మీ హైలైట్లలో ఏం కనిపించాలి అనే దానిని మీరు <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" /> లో కంట్రోల్ చేయవచ్చు. + <ph name="BREAK" /> + <ph name="BREAK" /> + మీరు కార్డ్ మెనూ నుండి ఈ కార్డ్ సెట్టింగ్లను మేనేజ్ చేయవచ్చు లేదా, అనుకూలంగా మార్చిన Chromeలో మరిన్ని ఆప్షన్లను చూడండి.</translation> <translation id="7750228210027921155">చిత్రంలో చిత్రం</translation> <translation id="7751260505918304024">అన్నీ చూపించు</translation> <translation id="7753735457098489144">స్టోరేజ్ స్పేస్ లేనందున, ఇన్స్టాల్ చేయడం విఫలమైంది. స్పేస్ను ఖాళీ చేయడానికి, పరికర స్టోరేజ్ నుండి ఫైళ్లను తొలగించండి.</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 9c8d7b3..1b2c2e5 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -1329,6 +1329,7 @@ <translation id="2278562042389100163">เปิดหน้าต่างเบราว์เซอร์</translation> <translation id="2278668501808246459">กำลังเริ่มต้นตัวจัดการคอนเทนเนอร์</translation> <translation id="2280486287150724112">ขอบขวา</translation> +<translation id="2281863813036651454">คลิกเมาส์ซ้าย</translation> <translation id="2282146716419988068">การประมวลผลของ GPU</translation> <translation id="2285109769884538519">{COUNT,plural, =0{เปิดทั้งหมดในกลุ่มแท็บใหม่}=1{เปิดในกลุ่มแท็บใหม่}other{เปิดทั้งหมด ({COUNT}) ในกลุ่มแท็บใหม่}}</translation> <translation id="2285942871162473373">จำลายนิ้วมือไม่ได้ โปรดลองอีกครั้ง</translation> @@ -5146,6 +5147,7 @@ <translation id="6129938384427316298">ความคิดเห็นเกี่ยวกับใบรับรองของ Netscape</translation> <translation id="6129953537138746214">ช่องว่าง</translation> <translation id="6130692320435119637">เพิ่ม Wi-Fi</translation> +<translation id="6130887916931372608">ปุ่มบนแป้นพิมพ์</translation> <translation id="6136114942382973861">ปิดแถบดาวน์โหลด</translation> <translation id="6136287496450963112">คีย์ความปลอดภัยไม่มีการป้องกันด้วย PIN โปรดสร้าง PIN ก่อนเพื่อจัดการลายนิ้วมือ</translation> <translation id="6138680304137685902">ลายเซ็น X9.62 ECDSA ที่มี SHA-384</translation> @@ -6760,6 +6762,7 @@ <translation id="7768770796815395237">เปลี่ยน</translation> <translation id="7768784765476638775">เลือกเพื่อให้อ่าน</translation> <translation id="7770406201819593386">เรียกใช้การทดสอบวินิจฉัย Chrome OS Flex</translation> +<translation id="7770450735129978837">คลิกเมาส์ขวา</translation> <translation id="7770612696274572992">รูปภาพคัดลอกมาจากอุปกรณ์อื่น</translation> <translation id="7771452384635174008">รูปแบบ</translation> <translation id="7772032839648071052">ยืนยันข้อความรหัสผ่าน</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 87a8925ac..b8d0fdd 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -1328,6 +1328,7 @@ <translation id="2278562042389100163">Tarayıcı penceresini aç</translation> <translation id="2278668501808246459">Kapsayıcı yöneticisi başlatılıyor</translation> <translation id="2280486287150724112">Sağ kenar boşluğu</translation> +<translation id="2281863813036651454">Sol fare tıklaması</translation> <translation id="2282146716419988068">GPU İşlemi</translation> <translation id="2285109769884538519">{COUNT,plural, =0{Tümünü &yeni sekme grubunda aç}=1{&Yeni sekme grubunda aç}other{Tümünü ({COUNT}) &yeni sekme grubunda aç}}</translation> <translation id="2285942871162473373">Parmak iziniz tanınmadı. Tekrar deneyin.</translation> @@ -5140,6 +5141,7 @@ <translation id="6129938384427316298">Netscape Sertifikası Yorumu</translation> <translation id="6129953537138746214">Boşluk</translation> <translation id="6130692320435119637">Kablosuz ağ ekle</translation> +<translation id="6130887916931372608">Klavye tuşu</translation> <translation id="6136114942382973861">İndirme çubuğunu kapat</translation> <translation id="6136287496450963112">Güvenlik anahtarınız PIN ile korunmuyor. Parmak izlerini yönetmek için önce PIN oluşturun.</translation> <translation id="6138680304137685902">SHA-384 ile X9.62 ECDSA İmzası</translation> @@ -6752,6 +6754,7 @@ <translation id="7768770796815395237">Değiştir</translation> <translation id="7768784765476638775">Seç ve Dinle</translation> <translation id="7770406201819593386">ChromeOS Flex teşhis testlerini çalıştırma.</translation> +<translation id="7770450735129978837">Sağ fare tıklaması</translation> <translation id="7770612696274572992">Resim diğer cihazdan kopyalandı</translation> <translation id="7771452384635174008">Düzen</translation> <translation id="7772032839648071052">Parolayı onayla</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index c7388da..ce326162 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -1346,6 +1346,7 @@ <translation id="2278562042389100163">Відкрити вікно переглядача</translation> <translation id="2278668501808246459">Запуск менеджера контейнера</translation> <translation id="2280486287150724112">Праве поле</translation> +<translation id="2281863813036651454">Клік лівою кнопкою миші</translation> <translation id="2282146716419988068">Процес GPU</translation> <translation id="2285109769884538519">{COUNT,plural, =0{Відкрити всі в &новій групі вкладок}=1{Відкрити в &новій групі вкладок}one{Відкрити всі ({COUNT}) у &новій групі вкладок}few{Відкрити всі ({COUNT}) у &новій групі вкладок}many{Відкрити всі ({COUNT}) у &новій групі вкладок}other{Відкрити всі ({COUNT}) у &новій групі вкладок}}</translation> <translation id="2285942871162473373">Не вдалося розпізнати відбиток пальця. Повторіть спробу.</translation> @@ -5161,6 +5162,7 @@ <translation id="6129938384427316298">Коментар сертифіката Netscape</translation> <translation id="6129953537138746214">Пробіл</translation> <translation id="6130692320435119637">Додати мережу Wi-Fi</translation> +<translation id="6130887916931372608">Клавіша клавіатури</translation> <translation id="6136114942382973861">Закрити панель завантажень</translation> <translation id="6136287496450963112">Ваш ключ безпеки не захищено PIN-кодом. Щоб керувати відбитками пальців, спершу створіть новий PIN-код.</translation> <translation id="6138680304137685902">Алгоритм ECDSA X9.62 з підписом SHA-384</translation> @@ -6773,6 +6775,7 @@ <translation id="7768770796815395237">Змінити</translation> <translation id="7768784765476638775">Читання з екрана</translation> <translation id="7770406201819593386">Виконувати діагностичні перевірки ОС Chrome Flex.</translation> +<translation id="7770450735129978837">Клік правою кнопкою миші</translation> <translation id="7770612696274572992">Зображення скопійовано з іншого пристрою</translation> <translation id="7771452384635174008">Орієнтація</translation> <translation id="7772032839648071052">Підтвердити парольну фразу</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index 95dd0da..abaabed 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -1328,6 +1328,7 @@ <translation id="2278562042389100163">براؤزر ونڈو کھولیں</translation> <translation id="2278668501808246459">کنٹینر مینیجر شروع ہو رہا ہے</translation> <translation id="2280486287150724112">دایاں مارجن</translation> +<translation id="2281863813036651454">ماؤس کی بائیں کلک</translation> <translation id="2282146716419988068">GPU کارروائی</translation> <translation id="2285109769884538519">{COUNT,plural, =0{سبھی کو &نئے ٹیب گروپ میں کھولیں}=1{&نئے ٹیب گروپ میں کھولیں}other{سبھی ({COUNT}) کو &نئے ٹیب گروپ میں کھولیں}}</translation> <translation id="2285942871162473373">آپ کی فنگرپرنٹ کی شناخت نہیں ہو سکی۔ پھر آزمائيں۔</translation> @@ -5142,6 +5143,7 @@ <translation id="6129938384427316298">Netscape سرٹیفیکیٹ کا تبصرہ</translation> <translation id="6129953537138746214">اسپیس</translation> <translation id="6130692320435119637">Wi-Fi شامل کریں</translation> +<translation id="6130887916931372608">کی بورڈ کی کلید</translation> <translation id="6136114942382973861">ڈاؤن لوڈز بار بند کریں</translation> <translation id="6136287496450963112">آپ کی سیکیورٹی کلید PIN کے ذریعے محفوظ نہیں ہے۔ فنگر پرنٹس کا نظم کرنے کیلئے، پہلے ایک PIN تخلیق کریں۔</translation> <translation id="6138680304137685902">SHA-384 کے ساتھ X9.62 ECDSA دستخط</translation> @@ -6754,6 +6756,7 @@ <translation id="7768770796815395237">تبدیل کریں</translation> <translation id="7768784765476638775">سننے کیلئے منتخب کریں</translation> <translation id="7770406201819593386">ChromeOS Flex تشخیصی ٹیسٹس چلائیں۔</translation> +<translation id="7770450735129978837">ماؤس کی دائیں کلک</translation> <translation id="7770612696274572992">دوسرے آلے سے تصویر کاپی کی گئی</translation> <translation id="7771452384635174008">لے آؤٹ</translation> <translation id="7772032839648071052">پاس فریز کی توثیق کریں</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index 9fcab7e..9515475 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -3199,6 +3199,10 @@ <translation id="4110490973560452005">Yuklab olindi: <ph name="FILE_NAME" />. Yuklanmalar paneliga qaytish uchun Shift+F6 tugmalarini bosing.</translation> <translation id="4110686435123617899"><ph name="TITLE" /> <ph name="DESC" /> nomli albomni tanlang</translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (oflayn)</translation> +<translation id="4114524937989710624">Google Drive xizmatidagi oxirgi harakatlarga qaytishni osonlashtirish uchun tavsiya etilgan fayllar chiqyapti. + <ph name="BREAK" /> + <ph name="BREAK" /> + Sozlamalarni kartochka menyusidan boshqarishingiz yoki boshqa sozlamalarnini “Chromeni moslash” orqali koʻrishingiz mumkin.</translation> <translation id="4115002065223188701">Tarmoq diapazondan tashqarida</translation> <translation id="4115378294792113321">Siyohrang</translation> <translation id="4116704186509653070">Qayta ochish</translation> @@ -3707,6 +3711,10 @@ <translation id="4651484272688821107">Demo rejim manbalari bilan onlayn komponent yuklanmadi.</translation> <translation id="4652935475563630866">Kamera sozlamasi oʻzgarishi uchun Parallels Desktopni qaytadan ishga tushiring. Davom etish uchun Parallels Desktopni qayta ishga tushiring.</translation> <translation id="4653405415038586100">Linux tizimini sozlashda xatolik</translation> +<translation id="465406513924180949">Xarid savatchalarida qoldirgan narsalaringizga osongina qaytishingiz uchun internetda xarid savatchasi chiqyapti. + <ph name="BREAK" /> + <ph name="BREAK" /> + Sozlamalarni kartochka menyusidan boshqarishingiz yoki boshqa sozlamalarnini “Chromeni moslash” orqali koʻrishingiz mumkin.</translation> <translation id="4654236001025007561">Atrofdagi Chromebook va Android qurilmalari bilan fayllarni ulashing</translation> <translation id="4657914796247705218">TrackPoint tezligi</translation> <translation id="4658285806588491142">Ekrandagi kontentni maxfiy saqlash</translation> @@ -4149,6 +4157,7 @@ <translation id="5121130586824819730">Diskda yetarli bo‘sh joy qolmadi. Boshqa jildni tanlang yoki diskda joy bo‘shating.</translation> <translation id="5123433949759960244">Basketbol</translation> <translation id="5125751979347152379">Yaroqsiz URL manzil.</translation> +<translation id="5125967981703109366">Bu kartochka haqida</translation> <translation id="5126611267288187364">Oʻzgarishlar</translation> <translation id="5127242257756472928">Oynalarni ochish va joylash uchun ekrandagi axborotdan foydalana olmaydi</translation> <translation id="5127620150973591153">Xavfsiz ulanish identifikatori: <ph name="TOKEN" /></translation> @@ -5135,6 +5144,10 @@ <translation id="6116921718742659598">Til va kiritish usuli sozlamalarini o‘zgartirish</translation> <translation id="6119927814891883061">Qurilmani nomlash: <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Ushbu sahifani bosh ekranga qadab qo‘yish...</translation> +<translation id="6120707837086723438">Tavsiya etilgan retseptlar oxirgi qidiruv tarixi asosida chiqyapti. + <ph name="BREAK" /> + <ph name="BREAK" /> + Sozlamalarni kartochka menyusidan boshqarishingiz yoki boshqa sozlamalarnini “Chromeni moslash” orqali koʻrishingiz mumkin.</translation> <translation id="6121773125605585883"><ph name="WEBSITE" /> saytining <ph name="USERNAME" /> foydalanuvchisi parolini koʻrish</translation> <translation id="6122081475643980456">Internet aloqangiz nazorat qilinmoqda</translation> <translation id="6122093587541546701">Email (ixtiyoriy):</translation> @@ -6742,6 +6755,10 @@ <translation id="7744192722284567281">Oshkor qilingan axborotlarda bor</translation> <translation id="7744649840067671761">Tayinlovni belgilash uchun yangi kalit yoki klaviatura tugmasini bosing. Tayinlovni bekor qilish uchun belgilangan kalit yoki tugmani bosing.</translation> +<translation id="7746739418892731373">Google fotokutubxonasidan rasm va yorqin video sahnalarni koʻryapsiz. <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" /> orqali nima chiqishini boshqarishingiz mumkin. + <ph name="BREAK" /> + <ph name="BREAK" /> + Bu kartochka uchun sozlamalarni kartochka menyusidan boshqarishingiz yoki boshqa sozlamalarnini “Chromeni moslash” orqali koʻrishingiz mumkin.</translation> <translation id="7750228210027921155">Tasvir ustida tasvir</translation> <translation id="7751260505918304024">Hammasi</translation> <translation id="7753735457098489144">Oʻrnatish uchun xotirada joy yetarli emas. Joy ochish uchun qurilma xotirasidan fayllarni oʻchiring.</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index d7235b29..fcf5c0a 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -1275,6 +1275,7 @@ <translation id="2218019600945559112">Chuột và bàn di chuột</translation> <translation id="2218320521449013367">Đã xảy ra lỗi khi Chrome đang xóa phần mềm có hại</translation> <translation id="2218515861914035131">Dán dưới dạng văn bản thuần túy</translation> +<translation id="2219658597883514593">Khởi động lại hướng dẫn</translation> <translation id="2220409419896228519">Thêm dấu trang vào các ứng dụng của Google mà bạn ưa thích</translation> <translation id="2220529011494928058">Báo cáo sự cố</translation> <translation id="2220572644011485463">Mã PIN hoặc mật khẩu</translation> @@ -2422,6 +2423,7 @@ <translation id="3378627645871606983">Quyền cấp cho Steam áp dụng cho tất cả trò chơi và ứng dụng trên Steam.</translation> <translation id="337920581046691015"><ph name="PRODUCT_NAME" /> sẽ được cài đặt.</translation> <translation id="3380365263193509176">Lỗi không xác định</translation> +<translation id="3380850890226973980">Hỏi vào lần tới</translation> <translation id="3382073616108123819">Rất tiếc! Hệ thống không thể xác định số nhận dạng thiết bị cho thiết bị này.</translation> <translation id="3382200254148930874">Ngừng tính năng giám sát...</translation> <translation id="338323348408199233">Chặn lưu lượng truy cập không qua VPN</translation> @@ -3210,6 +3212,10 @@ <translation id="4110490973560452005">Đã tải xuống xong: <ph name="FILE_NAME" />. Nhấn tổ hợp phím Shift + F6 để chuyển tới khu vực thanh Tệp đã tải xuống.</translation> <translation id="4110686435123617899">Chọn album <ph name="TITLE" /> <ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (không kết nối Internet)</translation> +<translation id="4114524937989710624">Bạn đang xem những tệp được đề xuất để giúp bạn dễ dàng trở lại hoạt động gần đây nhất của mình trong Google Drive. + <ph name="BREAK" /> + <ph name="BREAK" /> + Bạn có thể quản lý chế độ cài đặt qua trình đơn thẻ hoặc xem tuỳ chọn khác trong phần Tuỳ chỉnh Chrome.</translation> <translation id="4115002065223188701">Mạng nằm ngoài phạm vi</translation> <translation id="4115378294792113321">Đỏ thẫm</translation> <translation id="4116704186509653070">Mở lại</translation> @@ -3718,6 +3724,10 @@ <translation id="4651484272688821107">Không thể tải thành phần trực tuyến có tài nguyên chế độ minh họa.</translation> <translation id="4652935475563630866">Bạn cần chạy lại ứng dụng Parallels Desktop để thay đổi tùy chọn cài đặt máy ảnh. Hãy chạy lại ứng dụng Parallels Desktop để tiếp tục.</translation> <translation id="4653405415038586100">Lỗi khi định cấu hình Linux</translation> +<translation id="465406513924180949">Bạn đang xem những giỏ hàng giúp bạn dễ dàng tìm lại các mặt hàng mà bạn từng đưa vào các giỏ hàng trên mạng. + <ph name="BREAK" /> + <ph name="BREAK" /> + Bạn có thể quản lý chế độ cài đặt qua trình đơn thẻ hoặc xem tuỳ chọn khác trong phần Tuỳ chỉnh Chrome.</translation> <translation id="4654236001025007561">Chia sẻ tệp với Chromebook và thiết bị Android ở gần bạn</translation> <translation id="4657914796247705218">Tốc độ TrackPoint</translation> <translation id="4658285806588491142">Giữ màn hình của bạn ở chế độ riêng tư</translation> @@ -4160,6 +4170,7 @@ <translation id="5121130586824819730">Đĩa cứng của bạn đã đầy. Hãy lưu vào một vị trí khác hoặc tạo thêm dung lượng trống trên đĩa cứng.</translation> <translation id="5123433949759960244">Bóng rổ</translation> <translation id="5125751979347152379">URL không hợp lệ.</translation> +<translation id="5125967981703109366">Thông tin về thẻ này</translation> <translation id="5126611267288187364">Xem các thay đổi</translation> <translation id="5127242257756472928">Không được phép sử dụng thông tin về màn hình của bạn để mở và đặt cửa sổ vào vị trí nhất định</translation> <translation id="5127620150973591153">Mã kết nối bảo mật: <ph name="TOKEN" /></translation> @@ -4221,6 +4232,7 @@ <translation id="5185500136143151980">Không có Internet</translation> <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Hồi tưởng lại những kỷ niệm đáng nhớ của bạn. Để thêm hoặc chỉnh sửa album, hãy chuyển đến <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />.</translation> +<translation id="5190316321948122159">{NUM_APPS,plural, =1{Xoá ứng dụng ngay}other{Xoá ứng dụng ngay}}</translation> <translation id="5190926251776387065">Kích hoạt cổng</translation> <translation id="5191094172448199359">Mã PIN bạn nhập không khớp</translation> <translation id="5191251636205085390">Tìm hiểu và kiểm soát các công nghệ mới giúp thay thế cookie của bên thứ ba</translation> @@ -4393,6 +4405,7 @@ <translation id="5342091991439452114">Mã PIN phải có ít nhất <ph name="MINIMUM" /> chữ số</translation> <translation id="5344036115151554031">Đang khôi phục Linux</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (Phải)</translation> +<translation id="534572711507965074">Đặt tên cho nhóm, chọn màu rồi nhấn Enter</translation> <translation id="5345916423802287046">Mở ứng dụng khi bạn đăng nhập</translation> <translation id="5350293332385664455">Tắt Trợ lý Google</translation> <translation id="535123479159372765">Văn bản được sao chép từ thiết bị khác</translation> @@ -4973,6 +4986,7 @@ <translation id="5946591249682680882">ID báo cáo <ph name="WEBRTC_LOG_REPORT_ID" /></translation> <translation id="5948536763493709626">Kết nối bàn phím/chuột hoặc tiếp tục thiết lập bằng màn hình cảm ứng. Nếu bạn đang dùng thiết bị Bluetooth, hãy đảm bảo thiết bị đã sẵn sàng ghép nối.</translation> <translation id="5949544233750246342">Không thể phân tích cú pháp tệp</translation> +<translation id="5950039854561387265">Hỏi vào lần tới</translation> <translation id="5950819593680344519">Chrome không tìm thấy phần mềm gây hại trên máy tính của bạn • Đã kiểm tra ngày hôm qua</translation> <translation id="5951303645598168883"><ph name="ORIGIN" /> muốn dùng phông chữ trên máy</translation> <translation id="5951624318208955736">Màn hình</translation> @@ -5143,6 +5157,10 @@ <translation id="6116921718742659598">Thay đổi cài đặt ngôn ngữ và phương thức nhập</translation> <translation id="6119927814891883061">Đặt tên cho thiết bị <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">Ghim trang này vào màn hình Bắt đầu...</translation> +<translation id="6120707837086723438">Bạn đang xem các công thức nấu ăn được đề xuất dựa trên hoạt động Tìm kiếm công thức nấu ăn gần đây của bạn. + <ph name="BREAK" /> + <ph name="BREAK" /> + Bạn có thể quản lý chế độ cài đặt qua trình đơn thẻ hoặc xem tuỳ chọn khác trong phần Tuỳ chỉnh Chrome.</translation> <translation id="6121773125605585883">Xem mật khẩu có tên người dùng <ph name="USERNAME" /> trên <ph name="WEBSITE" /></translation> <translation id="6122081475643980456">Kết nối Internet của bạn đang bị kiểm soát</translation> <translation id="6122093587541546701">Email (không bắt buộc):</translation> @@ -5235,6 +5253,7 @@ <translation id="6218058416316985984"><ph name="DEVICE_TYPE" /> đang ngoại tuyến. Hãy kết nối với Internet rồi thử lại.</translation> <translation id="6220413761270491930">Lỗi khi tải tiện ích</translation> <translation id="6223447490656896591">Hình tùy chỉnh:</translation> +<translation id="62236885217374510">{NUM_APPS,plural, =1{Xoá ứng dụng ngay}other{Xoá ứng dụng ngay}}</translation> <translation id="6224481128663248237">Đã hoàn tất định dạng thành công!</translation> <translation id="622537739776246443">Hồ sơ này sẽ bị xóa</translation> <translation id="6225475702458870625">Kết nối dữ liệu có sẵn từ <ph name="PHONE_NAME" /> của bạn</translation> @@ -5867,6 +5886,7 @@ <translation id="6846178040388691741">"<ph name="EXTENSION_NAME" />" muốn in <ph name="FILE_NAME" /> bằng <ph name="PRINTER_NAME" />.</translation> <translation id="6847125920277401289">Giải phóng dung lượng để tiếp tục</translation> <translation id="6848388270925200958">Bạn hiện có một số thẻ chỉ dùng được trên thiết bị này</translation> +<translation id="6848425544473873717">{NUM_APPS,plural, =1{1 trong số các ứng dụng của bạn không còn được hỗ trợ. <ph name="LEARN_MORE" />}other{# trong số các ứng dụng của bạn không còn được hỗ trợ. <ph name="LEARN_MORE" />}}</translation> <translation id="6848716236260083778">Để thiết lập vân tay, con bạn cần chạm vào cảm biến vân tay. Dữ liệu vân tay của con bạn được lưu trữ an toàn và chỉ có trên chiếc <ph name="DEVICE_TYPE" /> này.</translation> <translation id="6850286078059909152">Màu văn bản</translation> <translation id="6851181413209322061">Gửi dữ liệu chẩn đoán và dữ liệu về mức sử dụng. Thiết bị này hiện tự động gửi dữ liệu chẩn đoán, dữ liệu về thiết bị và mức sử dụng ứng dụng cho Google. Những thông tin này sẽ không dùng để nhận dạng con bạn mà giúp tăng độ ổn định của hệ thống và ứng dụng cũng như cải thiện các mặt khác. Một số dữ liệu tổng hợp cũng sẽ hữu ích cho các ứng dụng và đối tác của Google, chẳng hạn như những nhà phát triển Android. Tùy chọn cài đặt này do chủ sở hữu thực thi. Nếu bạn bật tùy chọn cài đặt Hoạt động trên web và ứng dụng bổ sung cho con mình, thì dữ liệu này có thể được lưu vào Tài khoản Google của con.</translation> @@ -6747,6 +6767,10 @@ <translation id="7744192722284567281">Phát hiện thấy trong một sự cố rò rỉ dữ liệu</translation> <translation id="7744649840067671761">Nhấn vào một công tắc mới hoặc một phím trên bàn phím để bắt đầu gán. Nhấn một công tắc hoặc phím đã gán để xóa.</translation> +<translation id="7746739418892731373">Bạn đang xem các ảnh và video nổi bật trong thư viện Google Photos. Bạn có thể kiểm soát những nội dung sẽ xuất hiện trong thẻ nội dung nổi bật bằng cách truy cập <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" />. + <ph name="BREAK" /> + <ph name="BREAK" /> + Bạn có thể quản lý chế độ cài đặt cho thẻ này qua trình đơn thẻ hoặc xem tuỳ chọn khác trong phần Tuỳ chỉnh Chrome.</translation> <translation id="7750228210027921155">Hình trong hình</translation> <translation id="7751260505918304024">Hiển thị tất cả</translation> <translation id="7753735457098489144">Cài đặt không thành công do thiếu dung lượng bộ nhớ. Để giải phóng dung lượng, hãy xóa bớt tệp khỏi bộ nhớ của thiết bị.</translation> @@ -7130,6 +7154,7 @@ <translation id="8102139037507939978">Xóa thông tin nhận dạng cá nhân khỏi tệp system_logs.txt.</translation> <translation id="8104088837833760645">Tải hồ sơ eSIM xuống</translation> <translation id="8105368624971345109">Tắt</translation> +<translation id="8105541061909542455">{NUM_APPS,plural, =1{Ứng dụng không được hỗ trợ}other{Ứng dụng không được hỗ trợ}}</translation> <translation id="8107015733319732394">Đang cài đặt Cửa hàng Google Play trên <ph name="DEVICE_TYPE" /> của bạn. Quá trình này có thể mất vài phút.</translation> <translation id="810728361871746125">Độ phân giải màn hình</translation> <translation id="8108526232944491552">{COUNT,plural, =0{Không có cookie bên thứ ba}=1{Đã chặn 1 cookie bên thứ ba}other{Đã chặn # cookie bên thứ ba}}</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 6ead827..af65fd5 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -1321,6 +1321,7 @@ <translation id="2278562042389100163">打开浏览器窗口</translation> <translation id="2278668501808246459">正在启动容器管理器</translation> <translation id="2280486287150724112">右侧页边距</translation> +<translation id="2281863813036651454">用鼠标左键点击</translation> <translation id="2282146716419988068">GPU 进程</translation> <translation id="2285109769884538519">{COUNT,plural, =0{在新标签页组中打开全部网址(&N)}=1{在新标签页组中打开 1 个网址(&N)}other{在新标签页组中打开全部({COUNT} 个)网址(&N)}}</translation> <translation id="2285942871162473373">无法识别您的指纹。请重试。</translation> @@ -3184,6 +3185,10 @@ <translation id="4110490973560452005">下载完成:<ph name="FILE_NAME" />。按 Shift+F6 可切换到下载内容栏区域。</translation> <translation id="4110686435123617899">选择影集“<ph name="TITLE" />”,<ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" />(离线)</translation> +<translation id="4114524937989710624">系统会显示推荐的文件,方便您回到最近在 Google 云端硬盘中进行的活动。 + <ph name="BREAK" /> + <ph name="BREAK" /> + 您可以从卡片菜单中管理设置,或者在“自定义 Chrome”中查看更多选项。</translation> <translation id="4115002065223188701">检测不到网络</translation> <translation id="4115378294792113321">洋红色</translation> <translation id="4116704186509653070">重新打开</translation> @@ -3689,6 +3694,10 @@ <translation id="4651484272688821107">无法加载包含演示模式资源的在线组件。</translation> <translation id="4652935475563630866">重新启动 Parallels Desktop 后,对摄像头设置做出的更改才能生效。请重新启动 Parallels Desktop 以继续。</translation> <translation id="4653405415038586100">配置 Linux 时出错</translation> +<translation id="465406513924180949">系统会显示购物车,方便您回来购买网购时留在购物车中的商品。 + <ph name="BREAK" /> + <ph name="BREAK" /> + 您可以从卡片菜单中管理设置,或者在“自定义 Chrome”中查看更多选项。</translation> <translation id="4654236001025007561">与附近的 Chromebook 和 Android 设备分享文件</translation> <translation id="4657914796247705218">TrackPoint 速度</translation> <translation id="4658285806588491142">保护您的屏幕隐私</translation> @@ -4131,6 +4140,7 @@ <translation id="5121130586824819730">您的硬盘已满。请保存到其他位置或在硬盘上腾出更多空间。</translation> <translation id="5123433949759960244">篮球</translation> <translation id="5125751979347152379">网址无效。</translation> +<translation id="5125967981703109366">关于此卡片</translation> <translation id="5126611267288187364">查看更改</translation> <translation id="5127242257756472928">无法使用您的屏幕的相关信息打开并放置窗口</translation> <translation id="5127620150973591153">安全配对号码:<ph name="TOKEN" /></translation> @@ -5114,6 +5124,10 @@ <translation id="6116921718742659598">更改语言和输入设置</translation> <translation id="6119927814891883061">将设备命名为“<ph name="DEVICE_NAME" />”</translation> <translation id="6120205520491252677">将此网页固定到“开始”屏幕...</translation> +<translation id="6120707837086723438">系统会根据您近期的食谱搜索活动显示推荐的食谱。 + <ph name="BREAK" /> + <ph name="BREAK" /> + 您可以从卡片菜单中管理设置,或者在“自定义 Chrome”中查看更多选项。</translation> <translation id="6121773125605585883">查看用户名“<ph name="USERNAME" />”在 <ph name="WEBSITE" /> 上的密码</translation> <translation id="6122081475643980456">您的互联网连接受到控制</translation> <translation id="6122093587541546701">电子邮件(可选):</translation> @@ -5130,6 +5144,7 @@ <translation id="6129938384427316298">Netscape 证书评论</translation> <translation id="6129953537138746214">空格</translation> <translation id="6130692320435119637">添加 Wi-Fi</translation> +<translation id="6130887916931372608">键盘按键</translation> <translation id="6136114942382973861">关闭下载内容栏</translation> <translation id="6136287496450963112">您尚未设置 PIN 码来保护您的安全密钥。若要管理指纹,请先创建一个 PIN 码。</translation> <translation id="6138680304137685902">采用 SHA-384 算法的 X9.62 ECDSA 签名</translation> @@ -6717,6 +6732,10 @@ <translation id="7744192722284567281">遭遇了数据泄露</translation> <translation id="7744649840067671761">按新的开关键或键盘按键即可开始分配。 按已分配的开关键或键盘按键即可撤消分配。</translation> +<translation id="7746739418892731373">系统会显示 Google 相册媒体库中的照片和视频集锦。您可以前往 <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" /> 控制集锦中显示的内容。 + <ph name="BREAK" /> + <ph name="BREAK" /> + 您可以从卡片菜单中管理此卡片的设置,或者在“自定义 Chrome”中查看更多选项。</translation> <translation id="7750228210027921155">画中画</translation> <translation id="7751260505918304024">全部显示</translation> <translation id="7753735457098489144">存储空间不足,安装失败。如需释放空间,请从设备存储空间中删除文件。</translation> @@ -6742,6 +6761,7 @@ <translation id="7768770796815395237">更改</translation> <translation id="7768784765476638775">随选朗读</translation> <translation id="7770406201819593386">运行 ChromeOS Flex 诊断测试。</translation> +<translation id="7770450735129978837">用鼠标右键点击</translation> <translation id="7770612696274572992">从其他设备复制的图片</translation> <translation id="7771452384635174008">布局</translation> <translation id="7772032839648071052">确认密码</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index 7b651e468..338c19e 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -3212,6 +3212,10 @@ <translation id="4110490973560452005">下載完成 :<ph name="FILE_NAME" />。按住 Shift+F6 鍵即可切換至下載內容列的位置。</translation> <translation id="4110686435123617899">揀相簿 <ph name="TITLE" /> <ph name="DESC" /></translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (離線)</translation> +<translation id="4114524937989710624">畫面會顯示建議的檔案,以便您繼續執行最近在「Google 雲端硬碟」中的活動。 + <ph name="BREAK" /> + <ph name="BREAK" /> + 您可透過資訊卡選單管理設定,或前往「自訂 Chrome」查看更多選項。</translation> <translation id="4115002065223188701">網絡超出範圍</translation> <translation id="4115378294792113321">洋紅色</translation> <translation id="4116704186509653070">重新開啟</translation> @@ -3720,6 +3724,10 @@ <translation id="4651484272688821107">無法使用示範模式的資源載入網上組件。</translation> <translation id="4652935475563630866">Parallels Desktop 需要重新啟動,相機設定的變更才會生效。重新啟動 Parallels Desktop 即可繼續。</translation> <translation id="4653405415038586100">設定 Linux 時發生錯誤</translation> +<translation id="465406513924180949">畫面會顯示購物車,以便您在網絡上輕鬆查看購物車中的商品。 + <ph name="BREAK" /> + <ph name="BREAK" /> + 您可透過資訊卡選單管理設定,或前往「自訂 Chrome」查看更多選項。</translation> <translation id="4654236001025007561">與附近的 Chromebook 和 Android 裝置分享檔案</translation> <translation id="4657914796247705218">TrackPoint 速度</translation> <translation id="4658285806588491142">避免螢幕內容外洩</translation> @@ -4162,6 +4170,7 @@ <translation id="5121130586824819730">您的硬碟已滿。請儲存至其他位置或在硬碟上騰出更多空間。</translation> <translation id="5123433949759960244">籃球</translation> <translation id="5125751979347152379">網址無效。</translation> +<translation id="5125967981703109366">關於此資訊卡</translation> <translation id="5126611267288187364">查看變更</translation> <translation id="5127242257756472928">不允許使用螢幕中的資料開啟及放置視窗</translation> <translation id="5127620150973591153">安全連線 ID:<ph name="TOKEN" /></translation> @@ -4396,7 +4405,7 @@ <translation id="5342091991439452114">PIN 必須至少有 <ph name="MINIMUM" /> 位數字</translation> <translation id="5344036115151554031">正在還原 Linux</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (右邊)</translation> -<translation id="534572711507965074">為群組命名、選擇顏色,然後輕觸「Enter 鍵」</translation> +<translation id="534572711507965074">為群組命名、選取顏色,並輕按 Enter</translation> <translation id="5345916423802287046">當您登入時啟動應用程式</translation> <translation id="5350293332385664455">關閉「Google 助理」</translation> <translation id="535123479159372765">從其他裝置複製的文字</translation> @@ -5148,6 +5157,11 @@ <translation id="6116921718742659598">變更語言和輸入設定</translation> <translation id="6119927814891883061">將裝置個名改做 <ph name="DEVICE_NAME" /></translation> <translation id="6120205520491252677">將這個網頁固定到 [開始] 螢幕…</translation> +<translation id="6120707837086723438">系統會根據您最近搜尋的食譜,為您顯示建議的食譜。 + +<ph name="BREAK" /> + <ph name="BREAK" /> + 您可透過資訊卡選單管理設定,或前往「自訂 Chrome」查看更多選項。</translation> <translation id="6121773125605585883">睇下使用者名稱「<ph name="USERNAME" />」喺 <ph name="WEBSITE" /> 嘅密碼</translation> <translation id="6122081475643980456">您的互聯網連線目前受到控制</translation> <translation id="6122093587541546701">電郵 (選擇性):</translation> @@ -5873,7 +5887,7 @@ <translation id="6846178040388691741">「<ph name="EXTENSION_NAME" />」要求使用 <ph name="PRINTER_NAME" /> 列印 <ph name="FILE_NAME" />。</translation> <translation id="6847125920277401289">騰出空間才能繼續</translation> <translation id="6848388270925200958">目前您有部分付款卡只可在此裝置上使用</translation> -<translation id="6848425544473873717">{NUM_APPS,plural, =1{系統已不再支援你其中 1 個應用程式。<ph name="LEARN_MORE" />}other{系統已不再支援你其中 # 個應用程式。<ph name="LEARN_MORE" />}}</translation> +<translation id="6848425544473873717">{NUM_APPS,plural, =1{系統已不再支援您的 1 個應用程式。<ph name="LEARN_MORE" />}other{系統已不再支援您的 # 個應用程式。<ph name="LEARN_MORE" />}}</translation> <translation id="6848716236260083778">如要設定指紋,請讓子女輕觸指紋感應器。系統會妥善地將您子女的指紋資料儲存在此 <ph name="DEVICE_TYPE" /> 上,絕不會外洩。</translation> <translation id="6850286078059909152">文字顏色</translation> <translation id="6851181413209322061">傳送使用情況和診斷資料。此裝置目前會自動將診斷、裝置及應用程式的使用情況資料傳送至 Google。這些資料不會用來識別您子女的身分,而是用於改善系統和應用程式穩定性以及其他效能。部分彙整資料也會用於協助 Google 應用程式與合作夥伴 (例如 Android 開發人員)。擁有者可強制執行此設定。如果您為子女開啟其他「網絡及應用程式活動記錄」設定,此資料可能會儲存在他們的 Google 帳戶中。</translation> @@ -6754,6 +6768,10 @@ <translation id="7744192722284567281">發生資料外洩事件</translation> <translation id="7744649840067671761">按下新的按鈕裝置或鍵盤按鍵,即可開始指派。 按下已指派的按鈕裝置或按鍵,則可移除指派設定。</translation> +<translation id="7746739418892731373">系統正在顯示來自「Google 相片庫」中的精選相片和影片。您可在 <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" /> 控制系統在精選內容中顯示的項目。 + <ph name="BREAK" /> + <ph name="BREAK" /> + 您可透過資訊卡選單管理此資訊卡的設定,或前往「自訂 Chrome」查看更多選項。</translation> <translation id="7750228210027921155">畫中畫</translation> <translation id="7751260505918304024">全部顯示</translation> <translation id="7753735457098489144">儲存空間不足,因此無法完成安裝。如要釋出空間,請刪除裝置儲存空間內的檔案。</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 2431a1b9..1895edfa 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -3194,6 +3194,10 @@ <translation id="4110490973560452005">下載完成:<ph name="FILE_NAME" />。按下 Shift+F6 即可回到下載內容列區域。</translation> <translation id="4110686435123617899">選取相簿「<ph name="TITLE" />,<ph name="DESC" />」</translation> <translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (離線)</translation> +<translation id="4114524937989710624">畫面上會顯示建議的檔案,方便你繼續執行最近在 Google 雲端硬碟中的活動。 + <ph name="BREAK" /> + <ph name="BREAK" /> + 你可以透過資訊卡選單管理設定,或前往「自訂 Chrome」查看更多選項。</translation> <translation id="4115002065223188701">偵測不到網路</translation> <translation id="4115378294792113321">洋紅色</translation> <translation id="4116704186509653070">重新開啟</translation> @@ -3701,6 +3705,10 @@ <translation id="4651484272688821107">無法使用示範模式的資源載入線上元件。</translation> <translation id="4652935475563630866">必須重新啟動 Parallels Desktop,攝影機設定的變更才會生效。請重新啟動 Parallels Desktop 以繼續操作。</translation> <translation id="4653405415038586100">設定 Linux 時發生錯誤</translation> +<translation id="465406513924180949">畫面上會顯示購物車,方便你在網路上輕鬆查看購物車中的商品。 + <ph name="BREAK" /> + <ph name="BREAK" /> + 你可以透過資訊卡選單管理設定,或前往「自訂 Chrome」查看更多選項。</translation> <translation id="4654236001025007561">將檔案分享給附近的 Chromebook 和 Android 裝置</translation> <translation id="4657914796247705218">TrackPoint 速度</translation> <translation id="4658285806588491142">避免螢幕內容外洩</translation> @@ -4143,6 +4151,7 @@ <translation id="5121130586824819730">你的硬碟已滿。請選擇其他儲存位置,或清出足夠的硬碟空間。</translation> <translation id="5123433949759960244">籃球</translation> <translation id="5125751979347152379">網址無效。</translation> +<translation id="5125967981703109366">關於這張資訊卡</translation> <translation id="5126611267288187364">查看變更</translation> <translation id="5127242257756472928">不允許使用畫面中的資訊開啟及放置視窗</translation> <translation id="5127620150973591153">安全連線 ID:<ph name="TOKEN" /></translation> @@ -5129,6 +5138,10 @@ <translation id="6116921718742659598">變更語言和輸入設定</translation> <translation id="6119927814891883061">將裝置命名為「<ph name="DEVICE_NAME" />」</translation> <translation id="6120205520491252677">將這個網頁固定到開始畫面...</translation> +<translation id="6120707837086723438">系統會根據你最近搜尋的食譜,向你顯示推薦食譜。 + <ph name="BREAK" /> + <ph name="BREAK" /> + 你可以透過資訊卡選單管理設定,或前往「自訂 Chrome」查看更多選項。</translation> <translation id="6121773125605585883">檢視使用者名稱「<ph name="USERNAME" />」在「<ph name="WEBSITE" />」的密碼</translation> <translation id="6122081475643980456">你的網際網路連線目前受到控制</translation> <translation id="6122093587541546701">電子郵件地址 (選填):</translation> @@ -6734,6 +6747,10 @@ <translation id="7744192722284567281">發生資料侵害事件</translation> <translation id="7744649840067671761">按下新的外接切換裝置或鍵盤按鍵即可開始指派。 按下已指派的外接切換裝置或按鍵,則可移除指派設定。</translation> +<translation id="7746739418892731373">系統會顯示 Google 相簿相片庫中的精選相片和影片。如要控管精選內容中顯示的項目,請前往 <ph name="BEGIN_LINK" />photos.google.com/settings<ph name="END_LINK" />。 + <ph name="BREAK" /> + <ph name="BREAK" /> + 你可以透過資訊卡選單管理這張資訊卡的設定,或前往「自訂 Chrome」查看更多選項。</translation> <translation id="7750228210027921155">子母畫面</translation> <translation id="7751260505918304024">全部顯示</translation> <translation id="7753735457098489144">儲存空間不足,無法安裝。如要釋出空間,請刪除裝置儲存空間中的檔案。</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index 6b502c03..aa43428 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -613,6 +613,12 @@ <message name="IDS_SETTINGS_PASSWORDS_NOTE" desc="Label for the password note when viewing or editing a password."> Note </message> + <message name="IDS_SETTINGS_PASSWORDS_NOTE_CHARACTER_COUNT" desc="Warning for the password note when the user exceeds or is about to exceed the character limit."> + <ph name="CHARACTER_COUNT">$1<ex>950</ex></ph>/<ph name="CHARACTER_LIMIT">$2<ex>1000</ex></ph> + </message> + <message name="IDS_SETTINGS_PASSWORDS_NOTE_CHARACTER_COUNT_WARNING" desc="Warning for the password note when the user exceeds or is about to exceed the character limit."> + Notes can save up to <ph name="CHARACTER_LIMIT">$1<ex>1000</ex></ph> characters. + </message> <message name="IDS_SETTINGS_ADDRESS_NONE" desc="Placeholder that is shown when there are no addresses in the list of saved addresses."> Saved addresses will appear here </message>
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_NOTE_CHARACTER_COUNT.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_NOTE_CHARACTER_COUNT.png.sha1 new file mode 100644 index 0000000..7acbb14 --- /dev/null +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_NOTE_CHARACTER_COUNT.png.sha1
@@ -0,0 +1 @@ +7f59414986484ada53b6193d915b6dceaf08f8c6 \ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_NOTE_CHARACTER_COUNT_WARNING.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_NOTE_CHARACTER_COUNT_WARNING.png.sha1 new file mode 100644 index 0000000..f21c204a --- /dev/null +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_NOTE_CHARACTER_COUNT_WARNING.png.sha1
@@ -0,0 +1 @@ +95044d51ae188bb96c0b0c3885597b407b4463f2 \ No newline at end of file
diff --git a/chrome/app/theme/chrome_unscaled_resources.grd b/chrome/app/theme/chrome_unscaled_resources.grd index 4db5f81..17dd69d 100644 --- a/chrome/app/theme/chrome_unscaled_resources.grd +++ b/chrome/app/theme/chrome_unscaled_resources.grd
@@ -28,6 +28,7 @@ <include name="IDR_PRODUCT_LOGO_256" file="google_chrome/linux/product_logo_256.png" type="BINDATA" /> </if> <include name="IDR_PRODUCT_LOGO_24PX_1X" file="google_chrome/chrome_24px_1x.svg" type="BINDATA" /> + <include name="IDR_PRODUCT_LOGO_128PX_SVG" file="google_chrome/chrome_128px.svg" type="BINDATA" /> <if expr="chromeos"> <include name="IDR_PRODUCT_LOGO_24PX_2X" file="google_chrome/chrome_24px_2x.svg" type="BINDATA" /> <!-- Used by lacros. -->
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index b490197..bdb3367 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -6178,10 +6178,6 @@ flag_descriptions::kDisplayAlignmentAssistanceDescription, kOsCrOS, FEATURE_VALUE_TYPE(ash::features::kDisplayAlignAssist)}, - {"diagnostics-app", flag_descriptions::kDiagnosticsAppName, - flag_descriptions::kDiagnosticsAppDescription, kOsCrOS, - FEATURE_VALUE_TYPE(chromeos::features::kDiagnosticsApp)}, - {"diagnostics-app-navigation", flag_descriptions::kDiagnosticsAppNavigationName, flag_descriptions::kDiagnosticsAppNavigationDescription, kOsCrOS, @@ -7222,10 +7218,11 @@ FEATURE_VALUE_TYPE(features::kPwaUpdateDialogForName)}, #if BUILDFLAG(IS_ANDROID) - {"sync-android-promos-revamp", - flag_descriptions::kSyncAndroidPromosRevampName, - flag_descriptions::kSyncAndroidPromosRevampDescription, kOsAndroid, - FEATURE_VALUE_TYPE(syncer::kSyncAndroidPromosRevamp)}, + {"sync-android-promos-with-single-button", + flag_descriptions::kSyncAndroidPromosWithSingleButtonName, + flag_descriptions::kSyncAndroidPromosWithSingleButtonDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(syncer::kSyncAndroidPromosWithSingleButton)}, #endif #if BUILDFLAG(ENABLE_OOP_PRINTING)
diff --git a/chrome/browser/android/browserservices/metrics/java/src/org/chromium/chrome/browser/browserservices/metrics/WebApkUmaRecorder.java b/chrome/browser/android/browserservices/metrics/java/src/org/chromium/chrome/browser/browserservices/metrics/WebApkUmaRecorder.java index cbc6dc8..a3fe749 100644 --- a/chrome/browser/android/browserservices/metrics/java/src/org/chromium/chrome/browser/browserservices/metrics/WebApkUmaRecorder.java +++ b/chrome/browser/android/browserservices/metrics/java/src/org/chromium/chrome/browser/browserservices/metrics/WebApkUmaRecorder.java
@@ -172,7 +172,7 @@ // Don't use an enumerated histogram as there are > 30 potential error codes. In practice, // a given client will always get the same error code. RecordHistogram.recordSparseHistogram( - "WebApk.Install.GooglePlayErrorCode", Math.min(errorCode, 1000)); + "WebApk.Install.GooglePlayErrorCode", Math.min(errorCode, 10000)); } /**
diff --git a/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.cc b/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.cc index 5eec7fa..9600bdf 100644 --- a/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.cc +++ b/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.cc
@@ -5,10 +5,13 @@ #include "chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.h" #include "base/android/jni_android.h" +#include "base/feature_list.h" +#include "base/logging.h" #include "cc/resources/scoped_ui_resource.h" #include "chrome/android/chrome_jni_headers/TabStripSceneLayer_jni.h" #include "chrome/browser/android/compositor/layer/tab_handle_layer.h" #include "chrome/browser/android/compositor/layer_title_cache.h" +#include "chrome/browser/flags/android/chrome_feature_list.h" #include "ui/android/resources/nine_patch_resource.h" #include "ui/android/resources/resource_manager_impl.h" #include "ui/gfx/geometry/transform.h" @@ -42,16 +45,23 @@ // while the incognito button and left/ride fade stay fixed. Put the new tab // button and tabs in a separate layer placed visually below the others. scrollable_strip_layer_->SetIsDrawable(true); - scrollable_strip_layer_->AddChild(new_tab_button_); + const bool tab_strip_improvements_enabled = + base::FeatureList::IsEnabled(chrome::android::kTabStripImprovements); + if (!tab_strip_improvements_enabled) { + scrollable_strip_layer_->AddChild(new_tab_button_); + } tab_strip_layer_->SetBackgroundColor(SK_ColorBLACK); tab_strip_layer_->SetIsDrawable(true); tab_strip_layer_->AddChild(scrollable_strip_layer_); - tab_strip_layer_->AddChild(scrim_layer_); tab_strip_layer_->AddChild(left_fade_); tab_strip_layer_->AddChild(right_fade_); tab_strip_layer_->AddChild(model_selector_button_); + if (tab_strip_improvements_enabled) { + tab_strip_layer_->AddChild(new_tab_button_); + } + tab_strip_layer_->AddChild(scrim_layer_); layer()->AddChild(tab_strip_layer_); }
diff --git a/chrome/browser/android/vr/vr_shell.h b/chrome/browser/android/vr/vr_shell.h index 6b3473c..87975bfc 100644 --- a/chrome/browser/android/vr/vr_shell.h +++ b/chrome/browser/android/vr/vr_shell.h
@@ -15,6 +15,7 @@ #include "base/cancelable_callback.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" +#include "base/synchronization/waitable_event.h" #include "base/task/single_thread_task_runner.h" #include "base/timer/timer.h" #include "chrome/browser/ui/toolbar/chrome_location_bar_model_delegate.h"
diff --git a/chrome/browser/app_mode/OWNERS b/chrome/browser/app_mode/OWNERS index 88cc290..014fc26 100644 --- a/chrome/browser/app_mode/OWNERS +++ b/chrome/browser/app_mode/OWNERS
@@ -1,2 +1,5 @@ -apotapchuk@chromium.org +bfranz@chromium.org +edman@chromium.org +jeroendh@chromium.org +pbond@chromium.org xiyuan@chromium.org
diff --git a/chrome/browser/ash/app_mode/OWNERS b/chrome/browser/ash/app_mode/OWNERS index fa78942f..2b5a5ced 100644 --- a/chrome/browser/ash/app_mode/OWNERS +++ b/chrome/browser/ash/app_mode/OWNERS
@@ -1,5 +1,8 @@ # Primary owners bfranz@chromium.org +edman@chromium.org +jeroendh@chromium.org +pbond@chromium.org # Backup owners anqing@chromium.org
diff --git a/chrome/browser/ash/app_restore/app_restore_arc_task_handler.cc b/chrome/browser/ash/app_restore/app_restore_arc_task_handler.cc index 9f0a771..f5717ea 100644 --- a/chrome/browser/ash/app_restore/app_restore_arc_task_handler.cc +++ b/chrome/browser/ash/app_restore/app_restore_arc_task_handler.cc
@@ -18,6 +18,9 @@ namespace app_restore { namespace { +constexpr int kFullRestoreId = -1; +constexpr int kArcWindowPredictorId = -2; + ::app_restore::AppRestoreArcInfo* GetAppRestoreArcInfo() { return ::app_restore::AppRestoreArcInfo::GetInstance(); } @@ -42,22 +45,17 @@ window_handler_ = std::make_unique<full_restore::ArcWindowHandler>(); #endif - if (ash::features::AreDesksTemplatesEnabled()) { - arc_app_launcher_handers_.push_back( - std::make_unique<ArcAppLaunchHandler>()); - desks_templates_arc_app_launch_handler_observer_ = - arc_app_launcher_handers_.back().get(); - } - arc_app_launcher_handers_.push_back(std::make_unique<ArcAppLaunchHandler>()); + arc_app_launch_handlers_[kFullRestoreId] = + std::make_unique<ArcAppLaunchHandler>(); full_restore_arc_app_launch_handler_observer_ = - arc_app_launcher_handers_.back().get(); + arc_app_launch_handlers_[kFullRestoreId].get(); // TODO(sstan): Modify ArcAppLaunchHandler to prevent redundant launch. if (::full_restore::features::IsArcWindowPredictorEnabled()) { - arc_app_launcher_handers_.push_back( - std::make_unique<ArcAppLaunchHandler>()); + arc_app_launch_handlers_[kArcWindowPredictorId] = + std::make_unique<ArcAppLaunchHandler>(); window_predictor_arc_app_launch_handler_observer_ = - arc_app_launcher_handers_.back().get(); + arc_app_launch_handlers_[kArcWindowPredictorId].get(); } arc::ArcSessionManager* arc_session_manager = arc::ArcSessionManager::Get(); // arc::ArcSessionManager might not be set in tests. @@ -65,6 +63,31 @@ arc_session_manager->AddObserver(this); } +ArcAppLaunchHandler* +AppRestoreArcTaskHandler::GetDeskTemplateArcAppLaunchHandler( + int32_t launch_id) { + DCHECK_GT(launch_id, 0); + auto& handler = arc_app_launch_handlers_[launch_id]; + if (!handler) { + // We haven't seen this launch id before. Create a new entry. + handler = std::make_unique<ArcAppLaunchHandler>(); + + handler->OnArcPlayStoreEnabledChanged(arc_play_store_enabled_); + if (app_connection_ready_) + handler->OnAppConnectionReady(); + if (shelf_ready_) + handler->OnShelfReady(); + } + + return handler.get(); +} + +void AppRestoreArcTaskHandler::ClearDeskTemplateArcAppLaunchHandler( + int32_t launch_id) { + DCHECK_GT(launch_id, 0); + arc_app_launch_handlers_.erase(launch_id); +} + AppRestoreArcTaskHandler::~AppRestoreArcTaskHandler() { arc::ArcSessionManager* arc_session_manager = arc::ArcSessionManager::Get(); // arc::ArcSessionManager may be released first. @@ -74,8 +97,8 @@ bool AppRestoreArcTaskHandler::IsAppPendingRestore( const std::string& arc_app_id) const { - for (auto& handler : arc_app_launcher_handers_) { - if (handler && handler->IsAppPendingRestore(arc_app_id)) + for (auto& handler : arc_app_launch_handlers_) { + if (handler.second->IsAppPendingRestore(arc_app_id)) return true; } return false; @@ -105,15 +128,15 @@ } void AppRestoreArcTaskHandler::OnAppConnectionReady() { + app_connection_ready_ = true; + #if BUILDFLAG(ENABLE_WAYLAND_SERVER) if (window_handler_) window_handler_->OnAppInstanceConnected(); #endif - for (auto& handler : arc_app_launcher_handers_) { - if (handler) - handler->OnAppConnectionReady(); - } + for (auto& handler : arc_app_launch_handlers_) + handler.second->OnAppConnectionReady(); GetAppRestoreArcInfo()->NotifyArcConnectionChanged( /*is_connection_ready=*/true); @@ -130,31 +153,36 @@ } void AppRestoreArcTaskHandler::OnArcPlayStoreEnabledChanged(bool enabled) { - for (auto& handler : arc_app_launcher_handers_) { - if (handler) - handler->OnArcPlayStoreEnabledChanged(enabled); - } + arc_play_store_enabled_ = enabled; + + for (auto& handler : arc_app_launch_handlers_) + handler.second->OnArcPlayStoreEnabledChanged(enabled); GetAppRestoreArcInfo()->NotifyPlayStoreEnabledChanged(enabled); } void AppRestoreArcTaskHandler::OnShelfReady() { - for (auto& handler : arc_app_launcher_handers_) { - if (handler) - handler->OnShelfReady(); - } + shelf_ready_ = true; + + for (auto& handler : arc_app_launch_handlers_) + handler.second->OnShelfReady(); } void AppRestoreArcTaskHandler::Shutdown() { - for (auto& handler : arc_app_launcher_handers_) { - handler.reset(); - } - desks_templates_arc_app_launch_handler_observer_ = nullptr; + arc_app_launch_handlers_.clear(); full_restore_arc_app_launch_handler_observer_ = nullptr; window_predictor_arc_app_launch_handler_observer_ = nullptr; window_handler_.reset(); } +void AppRestoreArcTaskHandler::CreateFullRestoreHandlerForTest() { + auto& full_restore_handler = arc_app_launch_handlers_[kFullRestoreId]; + if (!full_restore_handler) { + full_restore_handler = std::make_unique<ArcAppLaunchHandler>(); + full_restore_arc_app_launch_handler_observer_ = full_restore_handler.get(); + } +} + } // namespace app_restore } // namespace ash
diff --git a/chrome/browser/ash/app_restore/app_restore_arc_task_handler.h b/chrome/browser/ash/app_restore/app_restore_arc_task_handler.h index 4b6e6627..ec6888e9 100644 --- a/chrome/browser/ash/app_restore/app_restore_arc_task_handler.h +++ b/chrome/browser/ash/app_restore/app_restore_arc_task_handler.h
@@ -53,9 +53,6 @@ // which window info should be applied. bool IsAppPendingRestore(const std::string& arc_app_id) const; - ArcAppLaunchHandler* desks_templates_arc_app_launch_handler() { - return desks_templates_arc_app_launch_handler_observer_; - } ArcAppLaunchHandler* full_restore_arc_app_launch_handler() { return full_restore_arc_app_launch_handler_observer_; } @@ -63,6 +60,9 @@ return window_predictor_arc_app_launch_handler_observer_; } + ArcAppLaunchHandler* GetDeskTemplateArcAppLaunchHandler(int32_t launch_id); + void ClearDeskTemplateArcAppLaunchHandler(int32_t launch_id); + // ArcAppListPrefs::Observer. void OnTaskCreated(int32_t task_id, const std::string& package_name, @@ -91,6 +91,9 @@ private: friend class ash::full_restore::FullRestoreAppLaunchHandlerArcAppBrowserTest; + // Used for testing to install a handler for full restore. + void CreateFullRestoreHandlerForTest(); + base::ScopedObservation<ArcAppListPrefs, ArcAppListPrefs::Observer> arc_prefs_observer_{this}; @@ -98,14 +101,22 @@ std::unique_ptr<full_restore::ArcWindowHandler> window_handler_; #endif - // The ArcAppLaunchHandlers, one for each feature that wants to launch ARC - // apps. - std::vector<std::unique_ptr<ArcAppLaunchHandler>> arc_app_launcher_handers_; - ArcAppLaunchHandler* desks_templates_arc_app_launch_handler_observer_ = - nullptr; + // Maps launch ids to ArcAppLaunchHandlers. Positive ids are used for desk + // template launches. Negative ids are used for full restore and the window + // predictor. + std::map<int32_t, std::unique_ptr<ArcAppLaunchHandler>> + arc_app_launch_handlers_; + ArcAppLaunchHandler* full_restore_arc_app_launch_handler_observer_ = nullptr; ArcAppLaunchHandler* window_predictor_arc_app_launch_handler_observer_ = nullptr; + + // These cache the readiness status of the subsystems needed to launch ARC + // apps. They are used when new handlers are dynamically created so that the + // handlers can learn the status of these systems. + bool arc_play_store_enabled_ = false; + bool shelf_ready_ = false; + bool app_connection_ready_ = false; }; } // namespace app_restore
diff --git a/chrome/browser/ash/app_restore/arc_app_launch_handler.cc b/chrome/browser/ash/app_restore/arc_app_launch_handler.cc index ac063260..c842a8b6 100644 --- a/chrome/browser/ash/app_restore/arc_app_launch_handler.cc +++ b/chrome/browser/ash/app_restore/arc_app_launch_handler.cc
@@ -420,8 +420,13 @@ DCHECK(data_it.second->event_flag.has_value()); // Set an ARC session id to find the restore window id based on the newly - // created ARC task id. + // created ARC task id. Note that the desk template launch ID must be set + // first, if available. const int32_t arc_session_id = ::app_restore::CreateArcSessionId(); + if (desk_template_launch_id_ != 0) { + ::app_restore::SetDeskTemplateLaunchIdForArcSessionId( + arc_session_id, desk_template_launch_id_); + } ::app_restore::SetArcSessionIdForWindowId(arc_session_id, data_it.first); window_id_to_session_id_[data_it.first] = arc_session_id; session_id_to_window_id_[arc_session_id] = data_it.first;
diff --git a/chrome/browser/ash/app_restore/arc_app_launch_handler.h b/chrome/browser/ash/app_restore/arc_app_launch_handler.h index 00d8d78..6500df7 100644 --- a/chrome/browser/ash/app_restore/arc_app_launch_handler.h +++ b/chrome/browser/ash/app_restore/arc_app_launch_handler.h
@@ -154,6 +154,10 @@ // chromeos::SchedulerConfigurationManagerBase::Observer: void OnConfigurationSet(bool success, size_t num_cores_disabled) override; + void set_desk_template_launch_id(int32_t desk_template_launch_id) { + desk_template_launch_id_ = desk_template_launch_id; + } + private: friend class full_restore::ArcAppLaunchHandlerArcAppBrowserTest; friend class full_restore::FullRestoreAppLaunchHandlerArcAppBrowserTest; @@ -268,6 +272,10 @@ bool is_app_connection_ready_ = false; + // If nonzero, identifies the desk template launch that this handler is used + // for. + int32_t desk_template_launch_id_ = 0; + // A repeating timer to check whether we can restore the ARC apps. std::unique_ptr<base::RepeatingTimer> app_launch_timer_;
diff --git a/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc b/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc index 8628a6bc..ad871bd 100644 --- a/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc +++ b/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc
@@ -1118,18 +1118,15 @@ void Restore() { test_full_restore_info_observer_.Reset(); - auto* arc_task_hanlder = + auto* arc_task_handler = app_restore::AppRestoreArcTaskHandler::GetForProfile(profile()); - if (!arc_task_hanlder->full_restore_arc_app_launch_handler_observer_) { - arc_task_hanlder->full_restore_arc_app_launch_handler_observer_ = - arc_task_hanlder->arc_app_launcher_handers_ - .emplace_back( - std::make_unique<ash::app_restore::ArcAppLaunchHandler>()) - .get(); - } + ASSERT_TRUE(arc_task_handler); + + arc_task_handler->CreateFullRestoreHandlerForTest(); arc_app_launch_handler_ = - arc_task_hanlder->full_restore_arc_app_launch_handler(); + arc_task_handler->full_restore_arc_app_launch_handler(); + DCHECK(arc_app_launch_handler_); arc_app_launch_handler_->is_app_connection_ready_ = false; app_launch_handler_ =
diff --git a/chrome/browser/ash/crosapi/browser_util.cc b/chrome/browser/ash/crosapi/browser_util.cc index 016fe82..f16f497b 100644 --- a/chrome/browser/ash/crosapi/browser_util.cc +++ b/chrome/browser/ash/crosapi/browser_util.cc
@@ -131,20 +131,17 @@ return LacrosAvailability::kUserChoice; } - auto* map_entry = kLacrosAvailabilityMap.find(policy_value); - if (map_entry == kLacrosAvailabilityMap.end()) { - LOG(ERROR) << "Invalid LacrosAvailability policy value: " << policy_value; + auto result = ParseLacrosAvailability(policy_value); + if (!result.has_value()) return LacrosAvailability::kUserChoice; - } - auto result = map_entry->second; if (IsGoogleInternal() && !base::FeatureList::IsEnabled(kLacrosGooglePolicyRollout) && result != LacrosAvailability::kLacrosDisallowed) { return LacrosAvailability::kUserChoice; } - return result; + return result.value(); } // Gets called from IsLacrosAllowedToBeEnabled with primary user or from @@ -800,6 +797,16 @@ : LacrosLaunchSwitchSource::kForcedByPolicy; } +absl::optional<LacrosAvailability> ParseLacrosAvailability( + base::StringPiece value) { + auto* it = kLacrosAvailabilityMap.find(value); + if (it != kLacrosAvailabilityMap.end()) + return it->second; + + LOG(ERROR) << "Unknown LacrosAvailability policy value is passed: " << value; + return absl::nullopt; +} + base::StringPiece GetLacrosAvailabilityPolicyName(LacrosAvailability value) { for (const auto& entry : kLacrosAvailabilityMap) { if (entry.second == value)
diff --git a/chrome/browser/ash/crosapi/browser_util.h b/chrome/browser/ash/crosapi/browser_util.h index ed935f60..8bee71d 100644 --- a/chrome/browser/ash/crosapi/browser_util.h +++ b/chrome/browser/ash/crosapi/browser_util.h
@@ -8,6 +8,7 @@ #include <string> #include "base/feature_list.h" +#include "base/strings/string_piece.h" #include "third_party/abseil-cpp/absl/types/optional.h" class AccountId; @@ -304,6 +305,11 @@ // or another edge case. LacrosLaunchSwitchSource GetLacrosLaunchSwitchSource(); +// Parses the string representation of LacrosAvailability policy value into +// the enum value. Returns nullopt on unknown value. +absl::optional<LacrosAvailability> ParseLacrosAvailability( + base::StringPiece value); + // Returns the policy value name from the given value. base::StringPiece GetLacrosAvailabilityPolicyName(LacrosAvailability value);
diff --git a/chrome/browser/ash/crosapi/browser_util_unittest.cc b/chrome/browser/ash/crosapi/browser_util_unittest.cc index 21ac123..0879f279 100644 --- a/chrome/browser/ash/crosapi/browser_util_unittest.cc +++ b/chrome/browser/ash/crosapi/browser_util_unittest.cc
@@ -33,17 +33,6 @@ namespace crosapi { -// TODO(crbug.com/1293250): Get rid of this map by merging into -// kLacrosAvailabilityMap in browser_util.cc -const auto policy_enum_to_value = - base::MakeFixedFlatMap<LacrosAvailability, std::string>({ - {LacrosAvailability::kUserChoice, "user_choice"}, - {LacrosAvailability::kLacrosDisallowed, "lacros_disallowed"}, - {LacrosAvailability::kSideBySide, "side_by_side"}, - {LacrosAvailability::kLacrosPrimary, "lacros_primary"}, - {LacrosAvailability::kLacrosOnly, "lacros_only"}, - }); - // This implementation of RAII for LacrosAvailability is to make it easy reset // the state between runs. class ScopedLacrosAvailabilityCache { @@ -62,11 +51,11 @@ private: void SetLacrosAvailability(LacrosAvailability lacros_availability) { policy::PolicyMap policy; - base::Value in_value( - policy_enum_to_value.find(lacros_availability)->second); - policy.Set(policy::key::kLacrosAvailability, policy::POLICY_LEVEL_MANDATORY, - policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, - in_value.Clone(), nullptr); + policy.Set( + policy::key::kLacrosAvailability, policy::POLICY_LEVEL_MANDATORY, + policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, + base::Value(GetLacrosAvailabilityPolicyName(lacros_availability)), + /*external_data_fetcher=*/nullptr); browser_util::CacheLacrosAvailability(policy); } };
diff --git a/chrome/browser/ash/crosapi/url_handler_ash.cc b/chrome/browser/ash/crosapi/url_handler_ash.cc index f686ee6..7f7a363 100644 --- a/chrome/browser/ash/crosapi/url_handler_ash.cc +++ b/chrome/browser/ash/crosapi/url_handler_ash.cc
@@ -83,21 +83,11 @@ } bool UrlHandlerAsh::OpenUrlInternal(const GURL& url) { - GURL target_url = crosapi::gurl_os_handler_utils::SanitizeAshURL(url); + GURL target_url = + crosapi::gurl_os_handler_utils::GetTargetURLFromLacrosURL(url); GURL short_target_url = crosapi::gurl_os_handler_utils::SanitizeAshURL( - url, /*include_path=*/false); - // Change os://settings/* into chrome://os-settings/* which will be the long - // term home for our OS-settings. - if (short_target_url == GURL(chrome::kOsUISettingsURL)) { - // This converts the os (GURL lib unusable) address into a chrome - // (GURL lib usable) address. - target_url = - crosapi::gurl_os_handler_utils::GetChromeUrlFromSystemUrl(target_url); - GURL::Replacements replacements; - replacements.SetHostStr(chrome::kChromeUIOSSettingsHost); - target_url = target_url.ReplaceComponents(replacements); - short_target_url = GURL(chrome::kChromeUIOSSettingsURL); - } + target_url, /*include_path=*/false); + // Settings will be handled. if (short_target_url == GURL(chrome::kChromeUIOSSettingsURL)) { chrome::SettingsWindowManager* settings_window_manager =
diff --git a/chrome/browser/ash/login/enrollment/hands_off_enrollment_browsertest.cc b/chrome/browser/ash/login/enrollment/hands_off_enrollment_browsertest.cc index 444be8c..e31675c 100644 --- a/chrome/browser/ash/login/enrollment/hands_off_enrollment_browsertest.cc +++ b/chrome/browser/ash/login/enrollment/hands_off_enrollment_browsertest.cc
@@ -48,6 +48,8 @@ command_line->AppendSwitchASCII( switches::kEnterpriseEnableZeroTouchEnrollment, "hands-off"); command_line->AppendSwitch(switches::kLoginManager); + command_line->AppendSwitch( + switches::kDisableOOBENetworkScreenSkippingForTesting); } void SetUpOnMainThread() override {
diff --git a/chrome/browser/ash/login/login_ui_browsertest.cc b/chrome/browser/ash/login/login_ui_browsertest.cc index 89c9d1288..eefcdb2a 100644 --- a/chrome/browser/ash/login/login_ui_browsertest.cc +++ b/chrome/browser/ash/login/login_ui_browsertest.cc
@@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/constants/ash_features.h" #include "ash/constants/ash_pref_names.h" #include "ash/constants/ash_switches.h" #include "ash/public/cpp/login_screen_test_api.h" @@ -432,9 +431,7 @@ class LoginUIDiagnosticsTest : public LoginUITestBase { public: - LoginUIDiagnosticsTest() : LoginUITestBase() { - scoped_feature_list_.InitWithFeatures({features::kDiagnosticsApp}, {}); - } + LoginUIDiagnosticsTest() = default; ~LoginUIDiagnosticsTest() override = default; static bool IsDiagnosticsDialogVisible() { @@ -445,9 +442,6 @@ protected: DeviceStateMixin device_state_{ &mixin_host_, DeviceStateMixin::State::OOBE_COMPLETED_CLOUD_ENROLLED}; - - private: - base::test::ScopedFeatureList scoped_feature_list_; }; // Checks accelerator can launch diagnostics app
diff --git a/chrome/browser/ash/login/saml/in_session_password_change_manager.cc b/chrome/browser/ash/login/saml/in_session_password_change_manager.cc index 57a06ee4..fae5440 100644 --- a/chrome/browser/ash/login/saml/in_session_password_change_manager.cc +++ b/chrome/browser/ash/login/saml/in_session_password_change_manager.cc
@@ -10,8 +10,6 @@ #include "ash/public/cpp/session/session_controller.h" #include "base/feature_list.h" #include "base/metrics/histogram_macros.h" -#include "base/task/post_task.h" -#include "base/task/task_traits.h" #include "chrome/browser/ash/login/auth/chrome_cryptohome_authenticator.h" #include "chrome/browser/ash/login/login_pref_names.h" #include "chrome/browser/ash/login/saml/password_change_success_notification.h" @@ -105,8 +103,8 @@ // Traits for running RecheckPasswordExpiryTask. // Runs from the UI thread to show notification. -const base::TaskTraits kRecheckTaskTraits = { - content::BrowserThread::UI, base::TaskPriority::BEST_EFFORT, +const content::BrowserTaskTraits kRecheckUITaskTraits = { + base::TaskPriority::BEST_EFFORT, base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}; // A time delta of length one hour. @@ -145,7 +143,8 @@ void RecheckPasswordExpiryTask::RecheckAfter(base::TimeDelta delay) { CancelPendingRecheck(); - base::PostDelayedTask(FROM_HERE, kRecheckTaskTraits, + content::GetUIThreadTaskRunner(kRecheckUITaskTraits) + ->PostDelayedTask(FROM_HERE, base::BindOnce(&RecheckPasswordExpiryTask::Recheck, weak_ptr_factory_.GetWeakPtr()), std::max(delay, kOneHour));
diff --git a/chrome/browser/ash/login/screens/network_screen.cc b/chrome/browser/ash/login/screens/network_screen.cc index fc460db..84982a7 100644 --- a/chrome/browser/ash/login/screens/network_screen.cc +++ b/chrome/browser/ash/login/screens/network_screen.cc
@@ -248,8 +248,10 @@ } bool NetworkScreen::UpdateStatusIfConnectedToEthernet() { - if (!features::IsOobeNetworkScreenSkipEnabled()) + if (!features::IsOobeNetworkScreenSkipEnabled() || + switches::IsOOBENetworkScreenSkippingDisabledForTesting()) { return false; + } if (!first_ethernet_connection_) return false;
diff --git a/chrome/browser/ash/login/screens/network_screen_browsertest.cc b/chrome/browser/ash/login/screens/network_screen_browsertest.cc index 1ac4e2d..6cdb610 100644 --- a/chrome/browser/ash/login/screens/network_screen_browsertest.cc +++ b/chrome/browser/ash/login/screens/network_screen_browsertest.cc
@@ -49,6 +49,7 @@ features::kEnableOobeNetworkScreenSkip, }, {}); + needs_network_screen_skip_check_ = true; } NetworkScreenTest(const NetworkScreenTest&) = delete;
diff --git a/chrome/browser/ash/login/test/oobe_base_test.cc b/chrome/browser/ash/login/test/oobe_base_test.cc index 29e7cafa..d3bcea1 100644 --- a/chrome/browser/ash/login/test/oobe_base_test.cc +++ b/chrome/browser/ash/login/test/oobe_base_test.cc
@@ -106,6 +106,10 @@ switches::kDisableOOBEChromeVoxHintTimerForTesting); if (!needs_background_networking_) command_line->AppendSwitch(::switches::kDisableBackgroundNetworking); + if (!needs_network_screen_skip_check_) { + command_line->AppendSwitch( + switches::kDisableOOBENetworkScreenSkippingForTesting); + } command_line->AppendSwitchASCII(switches::kLoginProfile, "user"); MixinBasedInProcessBrowserTest::SetUpCommandLine(command_line);
diff --git a/chrome/browser/ash/login/test/oobe_base_test.h b/chrome/browser/ash/login/test/oobe_base_test.h index 301a7293..7f2b709b 100644 --- a/chrome/browser/ash/login/test/oobe_base_test.h +++ b/chrome/browser/ash/login/test/oobe_base_test.h
@@ -74,6 +74,10 @@ // is set before SetUpCommandLine is invoked. bool needs_background_networking_ = false; + // Whether to use network screeen skip check or not. Note this is only + // effective when it is set before SetUpCommandLine is invoked. + bool needs_network_screen_skip_check_ = false; + std::string gaia_frame_parent_ = "signin-frame"; std::string authenticator_id_ = "$('gaia-signin').authenticator_"; EmbeddedTestServerSetupMixin embedded_test_server_{&mixin_host_,
diff --git a/chrome/browser/ash/login/ui/captive_portal_window_proxy.cc b/chrome/browser/ash/login/ui/captive_portal_window_proxy.cc index 18deba2..acad9bf 100644 --- a/chrome/browser/ash/login/ui/captive_portal_window_proxy.cc +++ b/chrome/browser/ash/login/ui/captive_portal_window_proxy.cc
@@ -31,7 +31,7 @@ // views::Widget: const ui::ThemeProvider* GetThemeProvider() const override; - ui::ColorProviderManager::InitializerSupplier* GetCustomTheme() + ui::ColorProviderManager::ThemeInitializerSupplier* GetCustomTheme() const override; private: @@ -45,7 +45,7 @@ return &ThemeService::GetThemeProviderForProfile(profile_); } -ui::ColorProviderManager::InitializerSupplier* +ui::ColorProviderManager::ThemeInitializerSupplier* CaptivePortalWidget::GetCustomTheme() const { return ThemeService::GetThemeSupplierForProfile(profile_); }
diff --git a/chrome/browser/ash/login/ui/login_display_host_common.cc b/chrome/browser/ash/login/ui/login_display_host_common.cc index 857065a..39aedebe 100644 --- a/chrome/browser/ash/login/ui/login_display_host_common.cc +++ b/chrome/browser/ash/login/ui/login_display_host_common.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/ash/login/ui/login_display_host_common.h" -#include "ash/constants/ash_features.h" #include "ash/public/cpp/login_accelerators.h" #include "base/bind.h" #include "base/callback.h" @@ -390,8 +389,7 @@ return true; } - if (action == LoginAcceleratorAction::kLaunchDiagnostics && - base::FeatureList::IsEnabled(features::kDiagnosticsApp)) { + if (action == LoginAcceleratorAction::kLaunchDiagnostics) { // Don't handle this action if device is disabled. if (system::DeviceDisablingManager:: IsDeviceDisabledDuringNormalOperation()) {
diff --git a/chrome/browser/ash/login/users/avatar/mock_user_image_manager.cc b/chrome/browser/ash/login/users/avatar/mock_user_image_manager.cc index e0aabb2e..b6569c2 100644 --- a/chrome/browser/ash/login/users/avatar/mock_user_image_manager.cc +++ b/chrome/browser/ash/login/users/avatar/mock_user_image_manager.cc
@@ -9,6 +9,6 @@ MockUserImageManager::MockUserImageManager(const AccountId& account_id) : UserImageManager(account_id) {} -MockUserImageManager::~MockUserImageManager() {} +MockUserImageManager::~MockUserImageManager() = default; } // namespace ash
diff --git a/chrome/browser/ash/login/users/avatar/user_image_manager.h b/chrome/browser/ash/login/users/avatar/user_image_manager.h index 93f490c..453d489 100644 --- a/chrome/browser/ash/login/users/avatar/user_image_manager.h +++ b/chrome/browser/ash/login/users/avatar/user_image_manager.h
@@ -34,9 +34,16 @@ // There is an instance of this class for each user in the system. class UserImageManager { public: + // The name of the histogram that records when a user changes a device image. + inline static constexpr char kUserImageChangedHistogramName[] = + "UserImage.Changed2"; + // Converts `image_index` to UMA histogram value. static int ImageIndexToHistogramIndex(int image_index); + // See histogram values in default_user_images.cc + static void RecordUserImageChanged(int histogram_value); + // Registers user image manager preferences. static void RegisterPrefs(PrefRegistrySimple* registry);
diff --git a/chrome/browser/ash/login/users/avatar/user_image_manager_impl.cc b/chrome/browser/ash/login/users/avatar/user_image_manager_impl.cc index 951bf7c1..e68c773 100644 --- a/chrome/browser/ash/login/users/avatar/user_image_manager_impl.cc +++ b/chrome/browser/ash/login/users/avatar/user_image_manager_impl.cc
@@ -128,6 +128,17 @@ } // static +void UserImageManager::RecordUserImageChanged(int histogram_value) { + // Although |UserImageManager::kUserImageChangedHistogramName| is an + // enumerated histogram, we intentionally use UmaHistogramExactLinear() to + // emit the metric rather than UmaHistogramEnumeration(). This is because the + // enums.xml values correspond to (a) special constants and (b) indexes of an + // array containing resource IDs. + base::UmaHistogramExactLinear(kUserImageChangedHistogramName, histogram_value, + default_user_image::kHistogramImagesCount + 1); +} + +// static void UserImageManager::RegisterPrefs(PrefRegistrySimple* registry) { registry->RegisterDictionaryPref(UserImageManagerImpl::kUserImageProperties); }
diff --git a/chrome/browser/ash/login/users/fake_chrome_user_manager.cc b/chrome/browser/ash/login/users/fake_chrome_user_manager.cc index ff4fa7c..2416df8 100644 --- a/chrome/browser/ash/login/users/fake_chrome_user_manager.cc +++ b/chrome/browser/ash/login/users/fake_chrome_user_manager.cc
@@ -33,6 +33,7 @@ #include "components/user_manager/user_names.h" #include "components/user_manager/user_type.h" #include "google_apis/gaia/gaia_auth_util.h" +#include "testing/gmock/include/gmock/gmock.h" #include "ui/base/resource/resource_bundle.h" #include "ui/chromeos/resources/grit/ui_chromeos_resources.h" #include "ui/gfx/image/image_skia.h" @@ -221,7 +222,8 @@ if (user_image_manager_it != user_image_managers_.end()) return user_image_manager_it->second.get(); if (mock_user_image_manager_enabled_) { - auto mgr = std::make_unique<MockUserImageManager>(account_id); + auto mgr = + std::make_unique<::testing::NiceMock<MockUserImageManager>>(account_id); MockUserImageManager* mgr_raw = mgr.get(); user_image_managers_[account_id] = std::move(mgr); return mgr_raw;
diff --git a/chrome/browser/ash/policy/core/device_policy_decoder.cc b/chrome/browser/ash/policy/core/device_policy_decoder.cc index 6ca3510..a9ead54 100644 --- a/chrome/browser/ash/policy/core/device_policy_decoder.cc +++ b/chrome/browser/ash/policy/core/device_policy_decoder.cc
@@ -237,18 +237,6 @@ POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, std::move(allowlist), nullptr); } - if (policy.has_user_whitelist()) { // nocheck - const em::UserWhitelistProto& container( // nocheck - policy.user_whitelist()); // nocheck - base::Value list(base::Value::Type::LIST); - for (const auto& entry : container.user_whitelist()) // nocheck - list.Append(entry); - policies->Set(key::kDeviceUserWhitelist, POLICY_LEVEL_MANDATORY, // nocheck - POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, std::move(list), - nullptr); - AddDeprecationWarning(key::kDeviceUserWhitelist, // nocheck - key::kDeviceUserAllowlist, policies); - } if (policy.has_family_link_accounts_allowed()) { const em::DeviceFamilyLinkAccountsAllowedProto& container( @@ -1346,7 +1334,6 @@ } } - // Use DevicePrinters policy if present, fallback to DeviceNativePrinters. if (policy.has_device_printers()) { const em::DevicePrintersProto& container(policy.device_printers()); if (container.has_external_policy()) { @@ -1354,14 +1341,6 @@ container.external_policy(), external_data_manager, policies); } - } else if (policy.has_native_device_printers()) { - const em::DeviceNativePrintersProto& container( - policy.native_device_printers()); - if (container.has_external_policy()) { - SetExternalDataDevicePolicy(key::kDevicePrinters, - container.external_policy(), - external_data_manager, policies); - } } if (policy.has_external_print_servers()) { @@ -1551,26 +1530,6 @@ POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, std::move(allowlist), nullptr); } - if (policy.has_usb_detachable_whitelist()) { // nocheck - const em::UsbDetachableWhitelistProto& container( // nocheck - policy.usb_detachable_whitelist()); // nocheck - base::Value list(base::Value::Type::LIST); - for (const auto& entry : container.id()) { - base::Value ids(base::Value::Type::DICTIONARY); - if (entry.has_vendor_id()) { - ids.SetStringKey("vid", base::StringPrintf("%04X", entry.vendor_id())); - } - if (entry.has_product_id()) { - ids.SetStringKey("pid", base::StringPrintf("%04X", entry.product_id())); - } - list.Append(std::move(ids)); - } - policies->Set( - key::kUsbDetachableWhitelist, POLICY_LEVEL_MANDATORY, // nocheck - POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, std::move(list), nullptr); - AddDeprecationWarning(key::kUsbDetachableWhitelist, // nocheck - key::kUsbDetachableAllowlist, policies); - } if (policy.has_quirks_download_enabled()) { const em::DeviceQuirksDownloadEnabledProto& container( @@ -1610,8 +1569,6 @@ base::Value(container.name()), nullptr); } - // Use DevicePrintersAccessMode if present, fallback to - // DeviceNativePrintersAccessMode. if (policy.has_device_printers_access_mode()) { const em::DevicePrintersAccessModeProto& container( policy.device_printers_access_mode()); @@ -1624,18 +1581,6 @@ std::move(*value), nullptr); } } - } else if (policy.has_native_device_printers_access_mode()) { - const em::DeviceNativePrintersAccessModeProto& container( - policy.native_device_printers_access_mode()); - if (container.has_access_mode()) { - std::unique_ptr<base::Value> value( - DecodeIntegerValue(container.access_mode())); - if (value) { - policies->Set(key::kDevicePrintersAccessMode, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, - std::move(*value), nullptr); - } - } } if (policy.has_device_printers_blocklist()) { @@ -1649,19 +1594,6 @@ POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, std::move(blocklist), nullptr); } - if (policy.has_native_device_printers_blacklist()) { // nocheck - const em::DeviceNativePrintersBlacklistProto& container( // nocheck - policy.native_device_printers_blacklist()); // nocheck - base::Value list(base::Value::Type::LIST); - for (const auto& entry : container.blacklist()) // nocheck - list.Append(entry); - - policies->Set( - key::kDeviceNativePrintersBlacklist, POLICY_LEVEL_MANDATORY, // nocheck - POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, std::move(list), nullptr); - AddDeprecationWarning(key::kDeviceNativePrintersBlacklist, // nocheck - key::kDevicePrintersBlocklist, policies); - } if (policy.has_device_printers_allowlist()) { const em::DevicePrintersAllowlistProto& container( @@ -1674,19 +1606,6 @@ POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, std::move(allowlist), nullptr); } - if (policy.has_native_device_printers_whitelist()) { // nocheck - const em::DeviceNativePrintersWhitelistProto& container( // nocheck - policy.native_device_printers_whitelist()); // nocheck - base::Value list(base::Value::Type::LIST); - for (const auto& entry : container.whitelist()) // nocheck - list.Append(entry); - - policies->Set( - key::kDeviceNativePrintersWhitelist, POLICY_LEVEL_MANDATORY, // nocheck - POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, std::move(list), nullptr); - AddDeprecationWarning(key::kDeviceNativePrintersWhitelist, // nocheck - key::kDevicePrintersAllowlist, policies); - } if (policy.has_external_print_servers_allowlist()) { const em::DeviceExternalPrintServersAllowlistProto& container(
diff --git a/chrome/browser/ash/policy/core/device_policy_decoder_unittest.cc b/chrome/browser/ash/policy/core/device_policy_decoder_unittest.cc index 4c2311c..e8014c76 100644 --- a/chrome/browser/ash/policy/core/device_policy_decoder_unittest.cc +++ b/chrome/browser/ash/policy/core/device_policy_decoder_unittest.cc
@@ -44,7 +44,6 @@ "https://example.com/device_wallpaper.jpg"; constexpr char kWallpaperHashPropertyName[] = "hash"; constexpr char kWallpaperHashPropertyValue[] = "examplewallpaperhash"; -const char kUserAllowlist[] = "*@test-domain.com"; constexpr char kValidBluetoothServiceUUID4[] = "0x1124"; constexpr char kValidBluetoothServiceUUID8[] = "0000180F"; constexpr char kValidBluetoothServiceUUID32[] = @@ -180,41 +179,6 @@ EXPECT_TRUE(error.empty()); } -// Test checks that deprecation warning is shown for non-COIL policy. -TEST_F(DevicePolicyDecoderTest, UserWhitelistWarning) { // nocheck - PolicyBundle bundle; - PolicyMap& policies = bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, "")); - - base::WeakPtr<ExternalDataManager> external_data_manager; - - em::ChromeDeviceSettingsProto device_policy; - device_policy - .mutable_user_whitelist() // nocheck - ->add_user_whitelist() // nocheck - ->assign(kUserAllowlist); - - DecodeDevicePolicy(device_policy, external_data_manager, &policies); - - EXPECT_TRUE(policies.GetValue(key::kDeviceUserWhitelist, // nocheck - base::Value::Type::LIST)); - - std::vector<base::Value> list; - list.emplace_back(base::Value(kUserAllowlist)); - EXPECT_EQ(base::ListValue(list), - *policies.GetValue(key::kDeviceUserWhitelist, // nocheck - base::Value::Type::LIST)); - - base::RepeatingCallback<std::u16string(int)> l10nlookup = - base::BindRepeating(&l10n_util::GetStringUTF16); - - // Should have a deprecation warning. - EXPECT_FALSE( - policies - .Get(key::kDeviceUserWhitelist) // nocheck - ->GetLocalizedMessages(PolicyMap::MessageType::kError, l10nlookup) - .empty()); -} - TEST_F(DevicePolicyDecoderTest, ReportDeviceLoginLogout) { em::ChromeDeviceSettingsProto device_policy;
diff --git a/chrome/browser/ash/policy/external_data/device_cloud_external_data_policy_observer_browsertest.cc b/chrome/browser/ash/policy/external_data/device_cloud_external_data_policy_observer_browsertest.cc index bac52ce..77fb52d 100644 --- a/chrome/browser/ash/policy/external_data/device_cloud_external_data_policy_observer_browsertest.cc +++ b/chrome/browser/ash/policy/external_data/device_cloud_external_data_policy_observer_browsertest.cc
@@ -94,17 +94,15 @@ DevicePolicyCrosBrowserTest::TearDownOnMainThread(); } - void SetDeviceNativePrintersExternalData(const std::string& policy) { - device_policy() - ->payload() - .mutable_native_device_printers() - ->set_external_policy(policy); + void SetDevicePrintersExternalData(const std::string& policy) { + device_policy()->payload().mutable_device_printers()->set_external_policy( + policy); RefreshDevicePolicy(); WaitUntilPolicyChanged(); } - void ClearDeviceNativePrintersExternalData() { - device_policy()->payload().clear_native_device_printers(); + void ClearDevicePrintersExternalData() { + device_policy()->payload().clear_device_printers(); RefreshDevicePolicy(); WaitUntilPolicyChanged(); } @@ -144,10 +142,10 @@ EXPECT_CALL(mock_delegate_, OnDeviceExternalDataSet(kPolicyName)); EXPECT_CALL(mock_delegate_, OnDeviceExternalDataCleared(kPolicyName)); - SetDeviceNativePrintersExternalData(test::ConstructExternalDataPolicy( + SetDevicePrintersExternalData(test::ConstructExternalDataPolicy( *embedded_test_server(), kExternalDataPath)); content::RunAllTasksUntilIdle(); - ClearDeviceNativePrintersExternalData(); + ClearDevicePrintersExternalData(); } IN_PROC_BROWSER_TEST_F(DeviceCloudExternalDataPolicyObserverTest, PolicyIsSet) { @@ -164,7 +162,7 @@ run_loop.Quit(); })); - SetDeviceNativePrintersExternalData(test::ConstructExternalDataPolicy( + SetDevicePrintersExternalData(test::ConstructExternalDataPolicy( *embedded_test_server(), kExternalDataPath)); run_loop.Run(); } @@ -184,7 +182,7 @@ run_loop.Quit(); })); - SetDeviceNativePrintersExternalData(test::ConstructExternalDataPolicy( + SetDevicePrintersExternalData(test::ConstructExternalDataPolicy( *embedded_test_server(), kExternalDataPath)); run_loop.Run(); @@ -203,7 +201,7 @@ run_loop_updated.Quit(); })); - SetDeviceNativePrintersExternalData(test::ConstructExternalDataPolicy( + SetDevicePrintersExternalData(test::ConstructExternalDataPolicy( *embedded_test_server(), kExternalDataPathUpdated)); run_loop_updated.Run(); }
diff --git a/chrome/browser/ash/policy/external_data/device_policy_cloud_external_data_manager_browsertest.cc b/chrome/browser/ash/policy/external_data/device_policy_cloud_external_data_manager_browsertest.cc index ab5e4d7..c5d11185 100644 --- a/chrome/browser/ash/policy/external_data/device_policy_cloud_external_data_manager_browsertest.cc +++ b/chrome/browser/ash/policy/external_data/device_policy_cloud_external_data_manager_browsertest.cc
@@ -117,17 +117,15 @@ return base::ComputeDirectorySize(device_policy_external_data_path); } - void SetDeviceNativePrintersExternalData(const std::string& policy) { - device_policy() - ->payload() - .mutable_native_device_printers() - ->set_external_policy(policy); + void SetDevicePrintersExternalData(const std::string& policy) { + device_policy()->payload().mutable_device_printers()->set_external_policy( + policy); RefreshDevicePolicy(); WaitUntilPolicyChanged(); } - void ClearDeviceNativePrintersExternalData() { - device_policy()->payload().clear_native_device_printers(); + void ClearDevicePrintersExternalData() { + device_policy()->payload().clear_device_printers(); RefreshDevicePolicy(); WaitUntilPolicyChanged(); } @@ -162,7 +160,7 @@ IN_PROC_BROWSER_TEST_F(DevicePolicyCloudExternalDataManagerTest, FetchExternalData) { - SetDeviceNativePrintersExternalData(test::ConstructExternalDataPolicy( + SetDevicePrintersExternalData(test::ConstructExternalDataPolicy( *embedded_test_server(), kExternalDataPath)); EXPECT_EQ(ReadExternalDataFile(kExternalDataPath), GetExternalData()); } @@ -176,7 +174,7 @@ // Check that file size is greater than cache limit. ASSERT_GT(base::checked_cast<int64_t>(external_data.size()), kTestCacheMaxSize); - SetDeviceNativePrintersExternalData(test::ConstructExternalDataPolicy( + SetDevicePrintersExternalData(test::ConstructExternalDataPolicy( *embedded_test_server(), kExternalDataPathOverSizeLimit)); EXPECT_EQ(external_data, GetExternalData()); @@ -189,21 +187,21 @@ EXPECT_EQ(0, ComputeExternalDataCacheDirectorySize()); std::string external_data = ReadExternalDataFile(kExternalDataPath); - SetDeviceNativePrintersExternalData(test::ConstructExternalDataPolicy( + SetDevicePrintersExternalData(test::ConstructExternalDataPolicy( *embedded_test_server(), kExternalDataPath)); EXPECT_EQ(external_data, GetExternalData()); EXPECT_EQ(base::checked_cast<int64_t>(external_data.size()), ComputeExternalDataCacheDirectorySize()); external_data = ReadExternalDataFile(kExternalDataPathUpdated); - SetDeviceNativePrintersExternalData(test::ConstructExternalDataPolicy( + SetDevicePrintersExternalData(test::ConstructExternalDataPolicy( *embedded_test_server(), kExternalDataPathUpdated)); EXPECT_EQ(external_data, GetExternalData()); // Check that previous policy data was cleared and replaced by new one. EXPECT_EQ(base::checked_cast<int64_t>(external_data.size()), ComputeExternalDataCacheDirectorySize()); - ClearDeviceNativePrintersExternalData(); + ClearDevicePrintersExternalData(); // We have to wait until // CloudExternalDataManagerBase::Backend::OnMetadataUpdated(), which is // responsible for removing outdated external policy files, is completed.
diff --git a/chrome/browser/ash/policy/handlers/lacros_availability_policy_handler.cc b/chrome/browser/ash/policy/handlers/lacros_availability_policy_handler.cc index 2eaebbb..24eb442 100644 --- a/chrome/browser/ash/policy/handlers/lacros_availability_policy_handler.cc +++ b/chrome/browser/ash/policy/handlers/lacros_availability_policy_handler.cc
@@ -18,19 +18,7 @@ LacrosAvailabilityPolicyHandler::LacrosAvailabilityPolicyHandler() : TypeCheckingPolicyHandler(key::kLacrosAvailability, - base::Value::Type::STRING), - policy_value_to_enum_{ - {"user_choice", - crosapi::browser_util::LacrosAvailability::kUserChoice}, - {"lacros_disallowed", - crosapi::browser_util::LacrosAvailability::kLacrosDisallowed}, - {"side_by_side", - crosapi::browser_util::LacrosAvailability::kSideBySide}, - {"lacros_primary", - crosapi::browser_util::LacrosAvailability::kLacrosPrimary}, - {"lacros_only", - crosapi::browser_util::LacrosAvailability::kLacrosOnly}, - } {} + base::Value::Type::STRING) {} LacrosAvailabilityPolicyHandler::~LacrosAvailabilityPolicyHandler() = default; @@ -55,18 +43,14 @@ PolicyErrorMap* errors) { const base::Value* value; const bool value_found = CheckAndGetValue(policies, errors, &value) && value; - if (!value_found) { + if (!value_found) return absl::nullopt; - } - const auto value_it = policy_value_to_enum_.find(value->GetString()); - if (value_it == policy_value_to_enum_.end()) { - if (errors) - errors->AddError(policy_name(), IDS_POLICY_VALUE_FORMAT_ERROR); - return absl::nullopt; - } - - return value_it->second; + auto parsed = + crosapi::browser_util::ParseLacrosAvailability(value->GetString()); + if (!parsed.has_value() && errors) + errors->AddError(policy_name(), IDS_POLICY_VALUE_FORMAT_ERROR); + return parsed; } } // namespace policy
diff --git a/chrome/browser/ash/policy/handlers/lacros_availability_policy_handler.h b/chrome/browser/ash/policy/handlers/lacros_availability_policy_handler.h index 9ed1014..c74a82f 100644 --- a/chrome/browser/ash/policy/handlers/lacros_availability_policy_handler.h +++ b/chrome/browser/ash/policy/handlers/lacros_availability_policy_handler.h
@@ -5,9 +5,6 @@ #ifndef CHROME_BROWSER_ASH_POLICY_HANDLERS_LACROS_AVAILABILITY_POLICY_HANDLER_H_ #define CHROME_BROWSER_ASH_POLICY_HANDLERS_LACROS_AVAILABILITY_POLICY_HANDLER_H_ -#include <string> - -#include "base/containers/flat_map.h" #include "build/buildflag.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/ash/crosapi/browser_util.h" @@ -41,10 +38,6 @@ absl::optional<crosapi::browser_util::LacrosAvailability> GetValue( const PolicyMap& policies, PolicyErrorMap* errors); - // TODO(crbug.com/1293250): Remove this map by merging into - // kLacrosAvailabilityMap in browser_util.cc - const base::flat_map<std::string, crosapi::browser_util::LacrosAvailability> - policy_value_to_enum_; }; } // namespace policy
diff --git a/chrome/browser/ash/printing/enterprise_printers_provider.cc b/chrome/browser/ash/printing/enterprise_printers_provider.cc index 97514ca1..63db3f7 100644 --- a/chrome/browser/ash/printing/enterprise_printers_provider.cc +++ b/chrome/browser/ash/printing/enterprise_printers_provider.cc
@@ -190,8 +190,7 @@ device_printers_is_complete_ = device_printers_->IsComplete() && (device_printers_->IsDataPolicySet() || - (!PolicyWithDataIsSet(policy::key::kDeviceNativePrinters) && - !PolicyWithDataIsSet(policy::key::kDevicePrinters))); + !PolicyWithDataIsSet(policy::key::kDevicePrinters)); } void RecalculateCurrentPrintersList() {
diff --git a/chrome/browser/ash/settings/device_settings_provider.cc b/chrome/browser/ash/settings/device_settings_provider.cc index 86c577f91..eb91808 100644 --- a/chrome/browser/ash/settings/device_settings_provider.cc +++ b/chrome/browser/ash/settings/device_settings_provider.cc
@@ -1101,13 +1101,6 @@ for (const auto& id : proto.blocklist()) list.Append(id); new_values_cache->SetValue(kDevicePrintersBlocklist, std::move(list)); - } else if (policy.has_native_device_printers_blacklist()) { // nocheck - base::Value list(base::Value::Type::LIST); - const em::DeviceNativePrintersBlacklistProto& proto( // nocheck - policy.native_device_printers_blacklist()); // nocheck - for (const auto& id : proto.blacklist()) // nocheck - list.Append(id); - new_values_cache->SetValue(kDevicePrintersBlocklist, std::move(list)); } // Use Allowlist policy if present, otherwise Whitelist version. // nocheck @@ -1118,13 +1111,6 @@ for (const auto& id : proto.allowlist()) list.Append(id); new_values_cache->SetValue(kDevicePrintersAllowlist, std::move(list)); - } else if (policy.has_native_device_printers_whitelist()) { // nocheck - base::Value list(base::Value::Type::LIST); - const em::DeviceNativePrintersWhitelistProto& proto( // nocheck - policy.native_device_printers_whitelist()); // nocheck - for (const auto& id : proto.whitelist()) // nocheck - list.Append(id); - new_values_cache->SetValue(kDevicePrintersAllowlist, std::move(list)); } if (policy.has_device_reboot_on_user_signout()) { @@ -1213,19 +1199,6 @@ allowlist.Append(std::move(ids)); } new_values_cache->SetValue(kUsbDetachableAllowlist, std::move(allowlist)); - } else if (policy.has_usb_detachable_whitelist()) { // nocheck - const em::UsbDetachableWhitelistProto& container = // nocheck - policy.usb_detachable_whitelist(); // nocheck - base::Value allowlist(base::Value::Type::LIST); - for (const auto& entry : container.id()) { - base::Value ids(base::Value::Type::DICTIONARY); - if (entry.has_vendor_id() && entry.has_product_id()) { - ids.SetIntKey(kUsbDetachableAllowlistKeyVid, entry.vendor_id()); - ids.SetIntKey(kUsbDetachableAllowlistKeyPid, entry.product_id()); - } - allowlist.Append(std::move(ids)); - } - new_values_cache->SetValue(kUsbDetachableAllowlist, std::move(allowlist)); } if (policy.has_device_borealis_allowed()) {
diff --git a/chrome/browser/ash/settings/device_settings_provider_unittest.cc b/chrome/browser/ash/settings/device_settings_provider_unittest.cc index f2ef6f00e..4653102 100644 --- a/chrome/browser/ash/settings/device_settings_provider_unittest.cc +++ b/chrome/browser/ash/settings/device_settings_provider_unittest.cc
@@ -378,13 +378,6 @@ BuildAndInstallDevicePolicy(); } - void SetNativeDevicePrinterAccessMode( - em::DeviceNativePrintersAccessModeProto::AccessMode access_mode) { - em::DeviceNativePrintersAccessModeProto* proto = - device_policy_->payload().mutable_native_device_printers_access_mode(); - proto->set_access_mode(access_mode); - } - void SetDevicePrinterAccessMode( em::DevicePrintersAccessModeProto::AccessMode access_mode) { em::DevicePrintersAccessModeProto* proto = @@ -392,16 +385,6 @@ proto->set_access_mode(access_mode); } - void SetNativeDevicePrintersBlacklist( // nocheck - std::vector<std::string>& values) { - em::DeviceNativePrintersBlacklistProto* proto = // nocheck - device_policy_->payload() - .mutable_native_device_printers_blacklist(); // nocheck - for (auto const& value : values) { - proto->add_blacklist(value); // nocheck - } - } - void SetDevicePrintersBlocklist(std::vector<std::string>& values) { em::DevicePrintersBlocklistProto* proto = device_policy_->payload().mutable_device_printers_blocklist(); @@ -410,16 +393,6 @@ } } - void SetNativeDevicePrintersWhitelist( // nocheck - std::vector<std::string>& values) { - em::DeviceNativePrintersWhitelistProto* proto = // nocheck - device_policy_->payload() - .mutable_native_device_printers_whitelist(); // nocheck - for (auto const& value : values) { - proto->add_whitelist(value); // nocheck - } - } - void SetDevicePrintersAllowlist(std::vector<std::string>& values) { em::DevicePrintersAllowlistProto* proto = device_policy_->payload().mutable_device_printers_allowlist(); @@ -1092,16 +1065,6 @@ VerifyPolicyValue(kDevicePrintersAccessMode, &default_value); } -TEST_F(DeviceSettingsProviderTest, DevicePrintersAccessMode_native) { - // WHITELIST => ALLOWLIST // nocheck - SetNativeDevicePrinterAccessMode(em::DeviceNativePrintersAccessModeProto:: - ACCESS_MODE_WHITELIST); // nocheck - BuildAndInstallDevicePolicy(); - base::Value expected_value( - em::DevicePrintersAccessModeProto::ACCESS_MODE_ALLOWLIST); - VerifyPolicyValue(kDevicePrintersAccessMode, &expected_value); -} - TEST_F(DeviceSettingsProviderTest, DevicePrintersAccessMode_accessmode) { SetDevicePrinterAccessMode( em::DevicePrintersAccessModeProto::ACCESS_MODE_ALLOWLIST); @@ -1111,33 +1074,11 @@ VerifyPolicyValue(kDevicePrintersAccessMode, &expected_value); } -TEST_F(DeviceSettingsProviderTest, DevicePrintersAccessMode_both) { - // If both are set use the DevicePrintersAccessMode - SetNativeDevicePrinterAccessMode(em::DeviceNativePrintersAccessModeProto:: - ACCESS_MODE_BLACKLIST); // nocheck - SetDevicePrinterAccessMode( - em::DevicePrintersAccessModeProto::ACCESS_MODE_ALLOWLIST); - BuildAndInstallDevicePolicy(); - base::Value expected_value( - em::DevicePrintersAccessModeProto::ACCESS_MODE_ALLOWLIST); - VerifyPolicyValue(kDevicePrintersAccessMode, &expected_value); -} - TEST_F(DeviceSettingsProviderTest, DevicePrintersBlocklist_empty) { // Policy should not be set by default VerifyPolicyValue(kDevicePrintersBlocklist, nullptr); } -TEST_F(DeviceSettingsProviderTest, - DevicePrintersBlocklist_blacklist) { // nocheck - std::vector<std::string> values = {"foo", "bar"}; - - // If the blacklist only is set, use that. // nocheck - SetNativeDevicePrintersBlacklist(values); // nocheck - BuildAndInstallDevicePolicy(); - VerifyDevicePrinterList(kDevicePrintersBlocklist, values); -} - TEST_F(DeviceSettingsProviderTest, DevicePrintersBlocklist_blocklist) { std::vector<std::string> values = {"foo", "bar"}; @@ -1147,32 +1088,11 @@ VerifyDevicePrinterList(kDevicePrintersBlocklist, values); } -TEST_F(DeviceSettingsProviderTest, DevicePrintersBlocklist_both) { - std::vector<std::string> values = {"foo", "bar"}; - std::vector<std::string> other_values = {"baz"}; - - // If both are set use the blocklist - SetNativeDevicePrintersBlacklist(other_values); // nocheck - SetDevicePrintersBlocklist(values); - BuildAndInstallDevicePolicy(); - VerifyDevicePrinterList(kDevicePrintersBlocklist, values); -} - TEST_F(DeviceSettingsProviderTest, DevicePrintersAllowlist_empty) { // Policy should not be set by default VerifyPolicyValue(kDevicePrintersAllowlist, nullptr); } -TEST_F(DeviceSettingsProviderTest, - DevicePrintersAllowlist_whitelist) { // nocheck - std::vector<std::string> values = {"foo", "bar"}; - - // If the whitelist only is set, use that. // nocheck - SetNativeDevicePrintersWhitelist(values); // nocheck - BuildAndInstallDevicePolicy(); - VerifyDevicePrinterList(kDevicePrintersAllowlist, values); -} - TEST_F(DeviceSettingsProviderTest, DevicePrintersAllowlist_allowlist) { std::vector<std::string> values = {"foo", "bar"}; @@ -1182,17 +1102,6 @@ VerifyDevicePrinterList(kDevicePrintersAllowlist, values); } -TEST_F(DeviceSettingsProviderTest, DevicePrintersAllowlist_both) { - std::vector<std::string> values = {"foo", "bar"}; - std::vector<std::string> other_values = {"baz"}; - - // If both are set use the allowlist - SetNativeDevicePrintersWhitelist(other_values); // nocheck - SetDevicePrintersAllowlist(values); - BuildAndInstallDevicePolicy(); - VerifyDevicePrinterList(kDevicePrintersAllowlist, values); -} - TEST_F(DeviceSettingsProviderTest, DeviceShowLowDiskSpaceNotificationDefaultTrue) { ClearDeviceShowLowDiskSpaceNotification();
diff --git a/chrome/browser/ash/web_applications/diagnostics_app_integration_browsertest.cc b/chrome/browser/ash/web_applications/diagnostics_app_integration_browsertest.cc index 37d33ea..5070f03 100644 --- a/chrome/browser/ash/web_applications/diagnostics_app_integration_browsertest.cc +++ b/chrome/browser/ash/web_applications/diagnostics_app_integration_browsertest.cc
@@ -35,8 +35,7 @@ public: DiagnosticsAppIntegrationTest() { scoped_feature_list_.InitWithFeatures( - {chromeos::features::kDiagnosticsApp, - ash::features::kDiagnosticsAppNavigation, + {ash::features::kDiagnosticsAppNavigation, ash::features::kEnableNetworkingInDiagnosticsApp}, {}); }
diff --git a/chrome/browser/ash/web_applications/diagnostics_system_web_app_info.cc b/chrome/browser/ash/web_applications/diagnostics_system_web_app_info.cc index 8da3c87..32f41c3d 100644 --- a/chrome/browser/ash/web_applications/diagnostics_system_web_app_info.cc +++ b/chrome/browser/ash/web_applications/diagnostics_system_web_app_info.cc
@@ -6,7 +6,6 @@ #include <memory> -#include "ash/constants/ash_features.h" #include "ash/webui/diagnostics_ui/url_constants.h" #include "ash/webui/grit/ash_diagnostics_app_resources.h" #include "base/strings/utf_string_conversions.h" @@ -57,7 +56,3 @@ gfx::Size DiagnosticsSystemAppDelegate::GetMinimumWindowSize() const { return {600, 390}; } - -bool DiagnosticsSystemAppDelegate::IsAppEnabled() const { - return base::FeatureList::IsEnabled(chromeos::features::kDiagnosticsApp); -}
diff --git a/chrome/browser/ash/web_applications/diagnostics_system_web_app_info.h b/chrome/browser/ash/web_applications/diagnostics_system_web_app_info.h index fd47d498..d32c149 100644 --- a/chrome/browser/ash/web_applications/diagnostics_system_web_app_info.h +++ b/chrome/browser/ash/web_applications/diagnostics_system_web_app_info.h
@@ -21,7 +21,6 @@ std::unique_ptr<WebAppInstallInfo> GetWebAppInfo() const override; bool ShouldShowInLauncher() const override; gfx::Size GetMinimumWindowSize() const override; - bool IsAppEnabled() const override; }; // Returns a WebAppInstallInfo used to install the app.
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_user_provider_impl.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_user_provider_impl.cc index 7aff2e2..e3cd9bb 100644 --- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_user_provider_impl.cc +++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_user_provider_impl.cc
@@ -62,9 +62,27 @@ } // namespace +PersonalizationAppUserProviderImpl::CameraImageDecoder::CameraImageDecoder() = + default; + +PersonalizationAppUserProviderImpl::CameraImageDecoder::~CameraImageDecoder() = + default; + +void PersonalizationAppUserProviderImpl::CameraImageDecoder::DecodeCameraImage( + base::span<const uint8_t> encoded_bytes, + data_decoder::DecodeImageCallback callback) { + data_decoder::DecodeImage( + &data_decoder_, encoded_bytes, data_decoder::mojom::ImageCodec::kPng, + /*shrink_to_fit=*/true, data_decoder::kDefaultMaxSizeInBytes, + /*desired_image_frame_size=*/gfx::Size(), std::move(callback)); +} + PersonalizationAppUserProviderImpl::PersonalizationAppUserProviderImpl( content::WebUI* web_ui) : profile_(Profile::FromWebUI(web_ui)), + camera_image_decoder_( + std::make_unique< + PersonalizationAppUserProviderImpl::CameraImageDecoder>()), image_encoding_task_runner_(base::ThreadPool::CreateSequencedTaskRunner( {base::TaskPriority::USER_VISIBLE, base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN})) { @@ -140,6 +158,11 @@ return; } + if (GetUser(profile_)->image_index() != index) { + ash::UserImageManager::RecordUserImageChanged( + ash::UserImageManager::ImageIndexToHistogramIndex(index)); + } + auto* user_image_manager = ash::ChromeUserManager::Get()->GetUserImageManager( GetAccountId(profile_)); @@ -147,6 +170,12 @@ } void PersonalizationAppUserProviderImpl::SelectProfileImage() { + if (GetUser(profile_)->image_index() != + user_manager::User::USER_IMAGE_PROFILE) { + ash::UserImageManager::RecordUserImageChanged( + ash::default_user_image::kHistogramImageFromProfile); + } + ash::UserImageManager* user_image_manager = ash::ChromeUserManager::Get()->GetUserImageManager( GetAccountId(profile_)); @@ -162,10 +191,8 @@ // Get a view of the same data copied above. auto as_span = base::make_span(ref_counted->front(), ref_counted->size()); - data_decoder::DecodeImageIsolated( - as_span, data_decoder::mojom::ImageCodec::kPng, - /*shrink_to_fit=*/true, data_decoder::kDefaultMaxSizeInBytes, - /*desired_image_frame_size=*/gfx::Size(), + camera_image_decoder_->DecodeCameraImage( + as_span, base::BindOnce(&PersonalizationAppUserProviderImpl::OnCameraImageDecoded, image_decode_weak_ptr_factory_.GetWeakPtr(), std::move(ref_counted))); @@ -177,6 +204,12 @@ return; } + if (GetUser(profile_)->image_index() != + user_manager::User::USER_IMAGE_EXTERNAL) { + ash::UserImageManager::RecordUserImageChanged( + ash::default_user_image::kHistogramImageExternal); + } + ash::UserImageManager* user_image_manager = ash::ChromeUserManager::Get()->GetUserImageManager( GetAccountId(profile_)); @@ -186,6 +219,11 @@ void PersonalizationAppUserProviderImpl::OnFileSelected( const base::FilePath& path) { + // No way to tell if this is a different external image than last time, so + // always record it. + ash::UserImageManager::RecordUserImageChanged( + ash::default_user_image::kHistogramImageExternal); + ash::UserImageManager* user_image_manager = ash::ChromeUserManager::Get()->GetUserImageManager( GetAccountId(profile_)); @@ -286,6 +324,11 @@ return; } + // Every time we decode a camera image it is new, so always record a metric + // here. + ash::UserImageManager::RecordUserImageChanged( + ash::default_user_image::kHistogramImageFromCamera); + auto user_image = std::make_unique<user_manager::UserImage>( gfx::ImageSkia::CreateFrom1xBitmap(decoded_bitmap), std::move(bytes), user_manager::UserImage::ImageFormat::FORMAT_PNG);
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_user_provider_impl.h b/chrome/browser/ash/web_applications/personalization_app/personalization_app_user_provider_impl.h index 9dcd5c7..41468ed 100644 --- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_user_provider_impl.h +++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_user_provider_impl.h
@@ -20,6 +20,8 @@ #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" +#include "services/data_decoder/public/cpp/data_decoder.h" +#include "services/data_decoder/public/cpp/decode_image.h" #include "third_party/skia/include/core/SkBitmap.h" class Profile; @@ -85,6 +87,22 @@ std::unique_ptr<ash::UserImageFileSelector> file_selector); private: + friend class PersonalizationAppUserProviderImplTest; + friend class TestCameraImageDecoder; + + // A class to decode camera images. Mocked out in tests. + class CameraImageDecoder { + public: + CameraImageDecoder(); + virtual ~CameraImageDecoder(); + + virtual void DecodeCameraImage(base::span<const uint8_t> encoded_bytes, + data_decoder::DecodeImageCallback callback); + + private: + data_decoder::DataDecoder data_decoder_; + }; + void OnCameraImageDecoded(scoped_refptr<base::RefCountedBytes> photo_bytes, const SkBitmap& decoded_bitmap); @@ -98,6 +116,8 @@ std::unique_ptr<user_manager::UserImage> last_external_user_image_; + std::unique_ptr<CameraImageDecoder> camera_image_decoder_; + base::ScopedObservation<user_manager::UserManager, user_manager::UserManager::Observer> user_manager_observer_{this};
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_user_provider_impl_unittest.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_user_provider_impl_unittest.cc index a27928a..30fb5431 100644 --- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_user_provider_impl_unittest.cc +++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_user_provider_impl_unittest.cc
@@ -8,11 +8,14 @@ #include "ash/constants/ash_features.h" #include "ash/webui/personalization_app/mojom/personalization_app.mojom.h" +#include "base/bind.h" #include "base/callback_helpers.h" +#include "base/containers/span.h" #include "base/memory/ref_counted_memory.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/test/bind.h" +#include "base/test/metrics/histogram_tester.h" #include "chrome/browser/ash/login/users/avatar/fake_user_image_file_selector.h" #include "chrome/browser/ash/login/users/avatar/mock_user_image_manager.h" #include "chrome/browser/ash/login/users/avatar/user_image_manager.h" @@ -32,6 +35,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/test/browser_task_environment.h" #include "content/public/test/test_web_ui.h" +#include "mojo/public/cpp/base/big_buffer.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" #include "testing/gtest/include/gtest/gtest.h" @@ -62,14 +66,23 @@ user_manager->SwitchActiveUser(account_id); } -gfx::ImageSkia CreateImage(int width, int height) { +SkBitmap CreateBitmap(int width, int height) { SkBitmap bitmap; bitmap.allocN32Pixels(width, height); bitmap.eraseColor(SK_ColorGREEN); - gfx::ImageSkia image = gfx::ImageSkia::CreateFrom1xBitmap(bitmap); + return bitmap; +} + +gfx::ImageSkia CreateImage(int width, int height) { + gfx::ImageSkia image = + gfx::ImageSkia::CreateFrom1xBitmap(CreateBitmap(width, height)); return image; } +mojo_base::BigBuffer FakeEncodedPngBuffer() { + return mojo_base::BigBuffer({0, 1}); +} + class TestUserImageObserver : public ash::personalization_app::mojom::UserImageObserver { public: @@ -112,6 +125,18 @@ } // namespace +class TestCameraImageDecoder + : public PersonalizationAppUserProviderImpl::CameraImageDecoder { + public: + TestCameraImageDecoder() = default; + ~TestCameraImageDecoder() override = default; + + void DecodeCameraImage(base::span<const uint8_t> encoded_bytes, + data_decoder::DecodeImageCallback callback) override { + std::move(callback).Run(CreateBitmap(10, 10)); + } +}; + class PersonalizationAppUserProviderImplTest : public testing::Test { public: PersonalizationAppUserProviderImplTest() @@ -140,6 +165,8 @@ ash::UserImageManagerImpl::SkipProfileImageDownloadForTesting(); user_provider_ = std::make_unique<PersonalizationAppUserProviderImpl>(&web_ui_); + user_provider_->camera_image_decoder_ = + std::make_unique<TestCameraImageDecoder>(); user_provider_->BindInterface( user_provider_remote_.BindNewPipeAndPassReceiver()); @@ -162,6 +189,10 @@ return user_manager::UserManager::Get()->GetActiveUser()->GetImage(); } + int image_index() { + return user_manager::UserManager::Get()->GetActiveUser()->image_index(); + } + ash::UserImageManagerImpl* user_image_manager() { return static_cast<ash::UserImageManagerImpl*>( ash::ChromeUserManager::Get()->GetUserImageManager( @@ -190,6 +221,8 @@ return test_user_image_observer_.current_profile_image(); } + const base::HistogramTester& histogram_tester() { return histogram_tester_; } + private: base::test::ScopedFeatureList scoped_feature_list_; content::BrowserTaskEnvironment task_environment_; @@ -202,6 +235,7 @@ mojo::Remote<ash::personalization_app::mojom::UserProvider> user_provider_remote_; std::unique_ptr<PersonalizationAppUserProviderImpl> user_provider_; + base::HistogramTester histogram_tester_; }; TEST_F(PersonalizationAppUserProviderImplTest, GetsUserInfo) { @@ -258,7 +292,7 @@ SetUserImageObserver(); // Select a profile image. - const gfx::ImageSkia& profile_image = CreateImage(50, 50); + gfx::ImageSkia profile_image = CreateImage(50, 50); user_image_manager()->SetDownloadedProfileImageForTesting(profile_image); user_image_manager()->SaveUserImageFromProfileImage(); @@ -270,7 +304,7 @@ TEST_F(PersonalizationAppUserProviderImplTest, SelectProfileImage) { SetUserImageObserver(); - const gfx::ImageSkia& profile_image = CreateImage(50, 50); + gfx::ImageSkia profile_image = CreateImage(50, 50); user_image_manager()->SetDownloadedProfileImageForTesting(profile_image); user_provider_remote()->get()->SelectProfileImage(); user_provider_remote()->FlushForTesting(); @@ -309,6 +343,121 @@ } } +TEST_F(PersonalizationAppUserProviderImplTest, + RecordsDefaultImageChangeHistogram) { + int image_index = 55; + ASSERT_TRUE(ash::default_user_image::IsInCurrentImageSet(image_index)); + + histogram_tester().ExpectBucketCount( + ash::UserImageManager::kUserImageChangedHistogramName, + ash::UserImageManager::ImageIndexToHistogramIndex(image_index), 0); + + user_provider_remote()->get()->SelectDefaultImage(image_index); + user_provider_remote()->FlushForTesting(); + + // Bucket count is incremented after selecting this default image. + histogram_tester().ExpectBucketCount( + ash::UserImageManager::kUserImageChangedHistogramName, + ash::UserImageManager::ImageIndexToHistogramIndex(image_index), 1); + + // Select the same image again. + user_provider_remote()->get()->SelectDefaultImage(image_index); + user_provider_remote()->FlushForTesting(); + + // Bucket count is not incremented. + histogram_tester().ExpectBucketCount( + ash::UserImageManager::kUserImageChangedHistogramName, + ash::UserImageManager::ImageIndexToHistogramIndex(image_index), 1); +} + +TEST_F(PersonalizationAppUserProviderImplTest, + RecordsCameraImageChangeHistogram) { + // No camera images recorded yet. + histogram_tester().ExpectBucketCount( + ash::UserImageManager::kUserImageChangedHistogramName, + ash::default_user_image::kHistogramImageFromCamera, 0); + + user_provider_remote()->get()->SelectCameraImage(FakeEncodedPngBuffer()); + user_provider_remote()->FlushForTesting(); + + histogram_tester().ExpectBucketCount( + ash::UserImageManager::kUserImageChangedHistogramName, + ash::default_user_image::kHistogramImageFromCamera, 1); + + user_provider_remote()->get()->SelectCameraImage(FakeEncodedPngBuffer()); + user_provider_remote()->FlushForTesting(); + + // Every camera image increments the count. + histogram_tester().ExpectBucketCount( + ash::UserImageManager::kUserImageChangedHistogramName, + ash::default_user_image::kHistogramImageFromCamera, 2); +} + +TEST_F(PersonalizationAppUserProviderImplTest, + RecordsProfileImageChangeHistogram) { + // Set a fake profile image to skip trying to downloading one. + const gfx::ImageSkia& profile_image = CreateImage(50, 50); + user_image_manager()->SetDownloadedProfileImageForTesting(profile_image); + + // No profile image recorded yet. + histogram_tester().ExpectBucketCount( + ash::UserImageManager::kUserImageChangedHistogramName, + ash::default_user_image::kHistogramImageFromProfile, 0); + + // Select a default image first to make sure profile is not selected. + user_provider_remote()->get()->SelectDefaultImage( + ash::default_user_image::GetRandomDefaultImageIndex()); + // Now select profile. + user_provider_remote()->get()->SelectProfileImage(); + user_provider_remote()->FlushForTesting(); + + histogram_tester().ExpectBucketCount( + ash::UserImageManager::kUserImageChangedHistogramName, + ash::default_user_image::kHistogramImageFromProfile, 1); + + // Selecting profile image again is a no-op. + user_provider_remote()->get()->SelectProfileImage(); + user_provider_remote()->FlushForTesting(); + + histogram_tester().ExpectBucketCount( + ash::UserImageManager::kUserImageChangedHistogramName, + ash::default_user_image::kHistogramImageFromProfile, 1); +} + +TEST_F(PersonalizationAppUserProviderImplTest, + RecordsSelectLastExternalUserImageChangeHistogram) { + // No external image recorded yet. + histogram_tester().ExpectBucketCount( + ash::UserImageManager::kUserImageChangedHistogramName, + ash::default_user_image::kHistogramImageExternal, 0); + + SetUserImageObserver(); + + // Set up a camera image as last external and then select a default. + user_provider_remote()->get()->SelectCameraImage(FakeEncodedPngBuffer()); + user_provider_remote()->FlushForTesting(); + EXPECT_TRUE(current_user_image()->is_external_image()); + + user_provider_remote()->get()->SelectDefaultImage( + ash::default_user_image::GetRandomDefaultImageIndex()); + user_provider_remote()->FlushForTesting(); + + histogram_tester().ExpectBucketCount( + ash::UserImageManager::kUserImageChangedHistogramName, + ash::default_user_image::kHistogramImageExternal, 0); + + // A default user image is selected. + ASSERT_TRUE(ash::default_user_image::IsInCurrentImageSet(image_index())); + + user_provider_remote()->get()->SelectLastExternalUserImage(); + user_provider_remote()->FlushForTesting(); + + // Finally records an external image chosen. + histogram_tester().ExpectBucketCount( + ash::UserImageManager::kUserImageChangedHistogramName, + ash::default_user_image::kHistogramImageExternal, 1); +} + class PersonalizationAppUserProviderImplWithMockTest : public PersonalizationAppUserProviderImplTest { protected: @@ -322,13 +471,16 @@ ash::ChromeUserManager::Get()->GetUserImageManager( GetAccountId(profile()))); } + + base::FilePath GetTestFilePath() { + const base::FilePath base_file_path("/this/is/a/test/directory/Base Name"); + const base::FilePath dir_path = base_file_path.AppendASCII("dir1"); + return dir_path.AppendASCII("file1.jpg"); + } }; TEST_F(PersonalizationAppUserProviderImplWithMockTest, SelectImageFromDisk) { - const base::FilePath base_file_path("/this/is/a/test/directory/Base Name"); - const base::FilePath dir_path = base_file_path.AppendASCII("dir1"); - const base::FilePath file_path = dir_path.AppendASCII("file1.txt"); - + base::FilePath file_path = GetTestFilePath(); EXPECT_CALL(*mock_user_image_manager(), SaveUserImageFromFile(file_path)); auto fake_file_selector = @@ -339,3 +491,32 @@ user_provider_remote()->get()->SelectImageFromDisk(); user_provider_remote()->FlushForTesting(); } + +TEST_F(PersonalizationAppUserProviderImplWithMockTest, + RecordsSelectImageFromDiskChangeHistogram) { + // No external image set yet. + histogram_tester().ExpectBucketCount( + ash::UserImageManager::kUserImageChangedHistogramName, + ash::default_user_image::kHistogramImageExternal, 0); + + base::FilePath file_path = GetTestFilePath(); + auto fake_file_selector = + std::make_unique<ash::FakeUserImageFileSelector>(web_ui()); + fake_file_selector->SetFilePath(file_path); + user_provider()->SetUserImageFileSelectorForTesting( + std::move(fake_file_selector)); + user_provider_remote()->get()->SelectImageFromDisk(); + user_provider_remote()->FlushForTesting(); + + histogram_tester().ExpectBucketCount( + ash::UserImageManager::kUserImageChangedHistogramName, + ash::default_user_image::kHistogramImageExternal, 1); + + user_provider_remote()->get()->SelectImageFromDisk(); + user_provider_remote()->FlushForTesting(); + + // Incremented every time a file is selected. + histogram_tester().ExpectBucketCount( + ash::UserImageManager::kUserImageChangedHistogramName, + ash::default_user_image::kHistogramImageExternal, 2); +}
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc index d3aaff8..91ef069 100644 --- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc +++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -19,6 +19,7 @@ #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/user_metrics.h" +#include "base/task/bind_post_task.h" #include "base/task/thread_pool.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h" @@ -194,17 +195,11 @@ // Generic functions but currently only used when ENABLE_NACL. #if BUILDFLAG(ENABLE_NACL) -void UIThreadTrampolineHelper(base::OnceClosure callback) { - content::GetUIThreadTaskRunner({})->PostTask(FROM_HERE, std::move(callback)); -} - // Convenience method to create a callback that can be run on any thread and // will post the given |callback| back to the UI thread. base::OnceClosure UIThreadTrampoline(base::OnceClosure callback) { - // We could directly bind &base::PostTask, but that would require - // evaluating FROM_HERE when this method is called, as opposed to when the - // task is actually posted. - return base::BindOnce(&UIThreadTrampolineHelper, std::move(callback)); + return base::BindPostTask(content::GetUIThreadTaskRunner({}), + std::move(callback)); } #endif // BUILDFLAG(ENABLE_NACL)
diff --git a/chrome/browser/cart/cart_service.cc b/chrome/browser/cart/cart_service.cc index 2129198..261c46b 100644 --- a/chrome/browser/cart/cart_service.cc +++ b/chrome/browser/cart/cart_service.cc
@@ -902,9 +902,18 @@ if (cart_url) { proto.set_merchant_cart_url(cart_url->spec()); } else { - std::string* fallback_url = domain_cart_url_mapping_->FindStringKey(domain); - if (fallback_url) { - proto.set_merchant_cart_url(*fallback_url); + absl::optional<std::string> fallback_url_from_component = + commerce_heuristics::CommerceHeuristicsData::GetInstance() + .GetMerchantCartURL(domain); + std::string* fallback_url_from_resource = + domain_cart_url_mapping_->FindStringKey(domain); + if (fallback_url_from_component.has_value()) { + proto.set_merchant_cart_url(*fallback_url_from_component); + } else if (fallback_url_from_resource) { + proto.set_merchant_cart_url(*fallback_url_from_resource); + // TODO(crbug.com/1300332): Add UMA here to track when component failed to + // feed heuristics. It's going to be a enum of {from component, from + // resource, missing}. } }
diff --git a/chrome/browser/cart/cart_service_unittest.cc b/chrome/browser/cart/cart_service_unittest.cc index 5c7d44cc..dc484ca 100644 --- a/chrome/browser/cart/cart_service_unittest.cc +++ b/chrome/browser/cart/cart_service_unittest.cc
@@ -93,7 +93,8 @@ const char kCommerceHintHeuristicsJSONData[] = R"###( { "foo.com": { - "merchant_name": "Foo" + "merchant_name": "Foo", + "cart_url": "https://foo.com/cart" }, "bar.com": { "merchant_name": "Bar" @@ -990,7 +991,7 @@ CartDB* cart_db_ = service_->GetDB(); base::RunLoop run_loop; cart_db::ChromeCartContentProto merchant_proto = - BuildProto(kMockMerchantA, kMockMerchantURLA); + BuildProto(kMockMerchantA, "https://foo.com/cart"); service_->AddCart(kMockMerchantA, absl::nullopt, merchant_proto); task_environment_.RunUntilIdle();
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc index cce3821e..566535f 100644 --- a/chrome/browser/chrome_browser_main.cc +++ b/chrome/browser/chrome_browser_main.cc
@@ -923,7 +923,7 @@ } #if BUILDFLAG(IS_MAC) if (!master_prefs_->confirm_to_quit) { - local_state->SetBoolean(prefs::kBrowserSuppressDefaultBrowserPrompt, + local_state->SetBoolean(prefs::kConfirmToQuitEnabled, master_prefs_->confirm_to_quit); } #endif // BUILDFLAG(IS_MAC)
diff --git a/chrome/browser/component_updater/DEPS b/chrome/browser/component_updater/DEPS index 3c1251e..c67b033b 100644 --- a/chrome/browser/component_updater/DEPS +++ b/chrome/browser/component_updater/DEPS
@@ -11,3 +11,9 @@ "+third_party/widevine", "+third_party/zxcvbn-cpp" ] +specific_include_rules = { + # The PKI metadata component installer needs to inspect SCT auditing state. + "pki_metadata_component_installer_unittest.cc": [ + "+services/network/sct_auditing/sct_auditing_cache.h", + ], +}
diff --git a/chrome/browser/component_updater/pki_metadata_component_installer_unittest.cc b/chrome/browser/component_updater/pki_metadata_component_installer_unittest.cc index ed67661..a8fa88df 100644 --- a/chrome/browser/component_updater/pki_metadata_component_installer_unittest.cc +++ b/chrome/browser/component_updater/pki_metadata_component_installer_unittest.cc
@@ -4,16 +4,177 @@ #include "chrome/browser/component_updater/pki_metadata_component_installer.h" +#include "services/network/public/cpp/network_service_buildflags.h" + +#if BUILDFLAG(IS_CT_SUPPORTED) + +#include "base/base64.h" +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/files/scoped_temp_dir.h" +#include "base/strings/string_piece_forward.h" +#include "base/test/scoped_feature_list.h" +#include "components/certificate_transparency/certificate_transparency_config.pb.h" +#include "components/certificate_transparency/ct_features.h" +#include "components/certificate_transparency/ct_known_logs.h" +#include "components/component_updater/component_installer.h" +#include "components/component_updater/mock_component_updater_service.h" +#include "content/public/browser/network_service_instance.h" +#include "content/public/test/browser_task_environment.h" +#include "services/network/network_service.h" +#include "services/network/public/mojom/ct_log_info.mojom.h" +#include "services/network/sct_auditing/sct_auditing_cache.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/protobuf/src/google/protobuf/repeated_field.h" -#include "base/logging.h" - namespace component_updater { -class PKIMetadataComponentInstallerTest : public ::testing::Test { +namespace { +// An arbitrary, DER-encoded subjectpublickeyinfo encoded as BASE64. +const char* kLogSPKIBase64 = + "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1+5tMt7sGC0MTw/AloiaTsFbEpW3s" + "g3GCAFY6wRP5Izt+mV/Q9xHb450LppfptaYh94nIkVIhtTkSQ4b2GRxOAcaSkpTsN+PUPaO2D" + "Jd/5M7MFxXeHGYqXIbdD+rgSsU5rcBspFbJkRv+Q34bqNeiwKT+zcYqfAEH3cYvDGF+FIxXrZ" + "YqUAmTQJZtzHfBP/2ZWfkyAHwPJqnz3aWS0MmTLY3JUF/BnSt381U6ZtI+qvmV+aWoDg2X2kx" + "lSR2WsEGPYrO+/7dHmNn3XLqWj+aWe7qoK3wRcxsq081ONsMGKGwm6yY35I+prob1WA4avtli" + "gMjNT0t7SJZoTkHSvgtDuo8Kfb5HrSyoMwIpIyI85XBoL2zM+BTJcCP9gyUnkiq6H9bWv1S20" + "ujMYhssH+UkAvpgSYBbgq8g1ta5cpOb2sm7qqEG7V7Aw1AhXkVAuuuzjQK29feSaZOtrOueo2" + "6tGd154DY2+AzwcrBDSfNw7XZqrFpgl9saW22L+P683b0wV2rlkFmc5O4LlIyk+oCuNoubS/t" + "Iyrq1REXsoc/O0HVCXQXKP1/g6mduco4wA57lH1BSJrSet5Rc8NyR5g7zR8FPzXvav+eErLwd" + "RsVdo4HNxlBlrc50CqkbsNFg2hdU1uCbbzRHKAF5Ih/NGdFkQZ9N+pPbTcpA8z5mWyjo6cCAw" + "EAAQ=="; +const char* kLogIdBase64 = "ASNFZ4mrze8QERITFBUWFxgZGhscHR4f"; +constexpr uint64_t kLogMMDSeconds = 42; +const char* kLogURL = "https://futuregadgetlab.jp"; +const char* kLogName = "FutureGadgetLog2022"; +const char* kLogOperatorName = "Future Gadget Lab"; +const char* kLogOperatorEmail = "kurisu@dmail.com"; +constexpr base::TimeDelta kCurrentOperatorStart = base::Days(3); +const char* kPreviousOperator1Name = "SERN"; +constexpr base::TimeDelta kPreviousOperator1Start = base::Days(2); +const char* kPreviousOperator2Name = "DURPA"; +constexpr base::TimeDelta kPreviousOperator2Start = base::Days(1); +const char* kGoogleLogName = "GoogleLog2022"; +const char* kGoogleLogOperatorName = "Google"; +constexpr base::TimeDelta kGoogleLogDisqualificationDate = base::Days(2); + +// BASE64 encoded fake leaf hashes. +const std::string kPopularSCT1 = "EBESExQVFhcYGRobHB0eHwEjRWeJq83v"; +const std::string kPopularSCT2 = "oKGio6SlpqeoqaqrrK2urwEjRWeJq83v"; + +constexpr uint64_t kMaxSupportedCompatibilityVersion = 2; +} // namespace + +// TODO(crbug.com/1306559): add a test for disabling ct enforcement once +// crbug.com/1306559 is fixed. +class PKIMetadataComponentInstallerTest : public testing::Test { public: - PKIMetadataComponentInstallerTest() = default; + void SetUp() override { + ct_config_.set_disable_ct_enforcement(false); + ct_config_.mutable_log_list()->set_compatibility_version( + kMaxSupportedCompatibilityVersion); + { + auto* log_operator = ct_config_.mutable_log_list()->add_operators(); + log_operator->add_email(kLogOperatorEmail); + log_operator->set_name(kLogOperatorName); + } + { + auto* log_operator = ct_config_.mutable_log_list()->add_operators(); + log_operator->add_email(kLogOperatorEmail); + log_operator->set_name(kGoogleLogOperatorName); + } + { + // Configure a qualified non-google log with an operator history. + auto* ct_log = ct_config_.mutable_log_list()->add_logs(); + ct_log->set_description(kLogName); + ct_log->set_key(kLogSPKIBase64); + ct_log->set_log_id(kLogIdBase64); + ct_log->set_mmd_secs(kLogMMDSeconds); + ct_log->set_url(kLogURL); + + auto* operator_change = ct_log->add_operator_history(); + operator_change->set_name(kLogOperatorName); + operator_change->mutable_operator_start()->set_seconds( + kCurrentOperatorStart.InSeconds()); + operator_change = ct_log->add_operator_history(); + operator_change->set_name(kPreviousOperator1Name); + operator_change->mutable_operator_start()->set_seconds( + kPreviousOperator1Start.InSeconds()); + operator_change = ct_log->add_operator_history(); + operator_change->set_name(kPreviousOperator2Name); + operator_change->mutable_operator_start()->set_seconds( + kPreviousOperator2Start.InSeconds()); + + auto* log_state = ct_log->add_state(); + log_state->set_current_state(chrome_browser_certificate_transparency:: + CTLog_CurrentState_QUALIFIED); + log_state->mutable_state_start()->set_seconds(10); + } + { + // Configure a non-qualified google log without an operator history. + auto* ct_log = ct_config_.mutable_log_list()->add_logs(); + ct_log->set_description(kGoogleLogName); + ct_log->set_key(kLogSPKIBase64); + ct_log->set_log_id(kLogIdBase64); + ct_log->set_mmd_secs(kLogMMDSeconds); + ct_log->set_url(kLogURL); + + auto* operator_change = ct_log->add_operator_history(); + operator_change->set_name(kGoogleLogOperatorName); + operator_change->mutable_operator_start()->set_seconds( + kCurrentOperatorStart.InSeconds()); + + auto* log_state = ct_log->add_state(); + log_state->set_current_state( + chrome_browser_certificate_transparency::CTLog_CurrentState_RETIRED); + log_state->mutable_state_start()->set_seconds( + kGoogleLogDisqualificationDate.InSeconds()); + log_state = ct_log->add_state(); + log_state->set_current_state(chrome_browser_certificate_transparency:: + CTLog_CurrentState_QUALIFIED); + log_state->mutable_state_start()->set_seconds(10); + } + { + // Configure a log with an invalid log id. + auto* ct_log = ct_config_.mutable_log_list()->add_logs(); + ct_log->set_log_id("not base64"); + ct_log->set_key(kLogSPKIBase64); + } + { + // Configure a log with an invalid log key. + auto* ct_log = ct_config_.mutable_log_list()->add_logs(); + ct_log->set_log_id(kLogIdBase64); + ct_log->set_key("not base64"); + } + // Configure some popular SCTs. + ASSERT_TRUE( + base::Base64Decode(kPopularSCT1, ct_config_.add_popular_scts())); + ASSERT_TRUE( + base::Base64Decode(kPopularSCT2, ct_config_.add_popular_scts())); + } + + void WriteCtConfigToFile() { + ASSERT_TRUE(component_install_dir_.CreateUniqueTempDir()); + base::FilePath file_path = component_install_dir_.GetPath().Append( + FILE_PATH_LITERAL("ct_config.pb")); + std::string data; + ASSERT_TRUE(ct_config_.SerializeToString(&data)); + ASSERT_TRUE(base::WriteFile(file_path, data)); + } + + protected: + base::test::ScopedFeatureList scoped_feature_list_{ + certificate_transparency::features:: + kCertificateTransparencyComponentUpdater}; + content::BrowserTaskEnvironment task_environment_; + component_updater::MockComponentUpdateService mock_component_update_; + base::ScopedTempDir component_install_dir_; + + chrome_browser_certificate_transparency::CTConfig ct_config_; + std::unique_ptr<component_updater::ComponentInstallerPolicy> policy_ = + std::make_unique< + component_updater::PKIMetadataComponentInstallerPolicy>(); }; TEST_F(PKIMetadataComponentInstallerTest, TestProtoBytesConversion) { @@ -31,4 +192,153 @@ test_bytes); } +// Tests that the installation is verified iff the component install directory +// exists. +TEST_F(PKIMetadataComponentInstallerTest, VerifyInstallation) { + WriteCtConfigToFile(); + base::FilePath path = component_install_dir_.GetPath(); + EXPECT_TRUE(policy_->VerifyInstallation(base::Value(), path)); + ASSERT_TRUE(component_install_dir_.Delete()); + EXPECT_FALSE(policy_->VerifyInstallation(base::Value(), path)); +} + +// Tests that the PKI Metadata component is registered if the feature is +// enabled. +TEST_F(PKIMetadataComponentInstallerTest, RegisterComponent) { + EXPECT_CALL(mock_component_update_, RegisterComponent) + .Times(1) + .WillOnce(testing::Return(true)); + component_updater::MaybeRegisterPKIMetadataComponent(&mock_component_update_); + task_environment_.RunUntilIdle(); +} + +// Tests that installing the PKI Metadata component updates the network service. +TEST_F(PKIMetadataComponentInstallerTest, InstallComponent) { + // Initialize the network service. + content::GetNetworkService(); + task_environment_.RunUntilIdle(); + + WriteCtConfigToFile(); + policy_->ComponentReady(base::Version("1.2.3.4"), + component_install_dir_.GetPath(), base::Value()); + task_environment_.RunUntilIdle(); + + network::NetworkService* network_service = + network::NetworkService::GetNetworkServiceForTesting(); + ASSERT_TRUE(network_service); + const std::vector<network::mojom::CTLogInfoPtr>& logs = + network_service->log_list(); + ASSERT_EQ(logs.size(), 2u); + std::string expected_log_id; + ASSERT_TRUE(base::Base64Decode(kLogIdBase64, &expected_log_id)); + EXPECT_EQ(logs.at(0)->id, expected_log_id); + std::string expected_public_key; + ASSERT_TRUE(base::Base64Decode(kLogSPKIBase64, &expected_public_key)); + EXPECT_EQ(logs.at(0)->public_key, expected_public_key); + EXPECT_EQ(logs.at(0)->name, kLogName); + EXPECT_FALSE(logs.at(0)->operated_by_google); + EXPECT_FALSE(logs.at(0)->disqualified_at); + EXPECT_EQ(logs.at(0)->mmd, base::Seconds(kLogMMDSeconds)); + EXPECT_EQ(logs.at(0)->current_operator, kLogOperatorName); + + EXPECT_EQ(logs.at(1)->id, expected_log_id); + EXPECT_EQ(logs.at(1)->public_key, expected_public_key); + EXPECT_EQ(logs.at(1)->name, kGoogleLogName); + EXPECT_TRUE(logs.at(1)->operated_by_google); + EXPECT_EQ(*logs.at(1)->disqualified_at, + base::Time::UnixEpoch() + kGoogleLogDisqualificationDate); + EXPECT_EQ(logs.at(1)->mmd, base::Seconds(kLogMMDSeconds)); + EXPECT_EQ(logs.at(1)->current_operator, kGoogleLogOperatorName); + + // Previous operators should be sorted in the opposite order as in the proto. + std::vector<network::mojom::PreviousOperatorEntryPtr>& previous_operators = + logs.at(0)->previous_operators; + ASSERT_EQ(previous_operators.size(), 2u); + EXPECT_EQ(previous_operators.at(0)->name, kPreviousOperator2Name); + EXPECT_EQ(previous_operators.at(0)->end_time, + base::Time::UnixEpoch() + kPreviousOperator1Start); + EXPECT_EQ(previous_operators.at(1)->name, kPreviousOperator1Name); + EXPECT_EQ(previous_operators.at(1)->end_time, + base::Time::UnixEpoch() + kCurrentOperatorStart); + + network::SCTAuditingCache* cache = network_service->sct_auditing_cache(); + EXPECT_TRUE(cache->IsPopularSCT(*base::Base64Decode(kPopularSCT1))); + EXPECT_TRUE(cache->IsPopularSCT(*base::Base64Decode(kPopularSCT2))); + EXPECT_FALSE(cache->IsPopularSCT(std::vector<const uint8_t>{1, 2, 3, 4})); +} + +// Tests that installing the PKI Metadata component bails out if the proto is +// invalid. +TEST_F(PKIMetadataComponentInstallerTest, InstallComponentInvalidProto) { + // Initialize the network service. + content::GetNetworkService(); + task_environment_.RunUntilIdle(); + + // Write an invalid ct_config.pb. + ASSERT_TRUE(component_install_dir_.CreateUniqueTempDir()); + base::FilePath file_path = component_install_dir_.GetPath().Append( + FILE_PATH_LITERAL("ct_config.pb")); + ASSERT_TRUE(base::WriteFile(file_path, "mismatch")); + + policy_->ComponentReady(base::Version("1.2.3.4"), + component_install_dir_.GetPath(), base::Value()); + task_environment_.RunUntilIdle(); + + network::NetworkService* network_service = + network::NetworkService::GetNetworkServiceForTesting(); + ASSERT_TRUE(network_service); + + // The logs should not have been updated. + const std::vector<network::mojom::CTLogInfoPtr>& logs = + network_service->log_list(); + EXPECT_EQ(logs.size(), 0u); +} + +// Tests that installing the PKI Metadata component bails out if the CT +// compatibility version exceeds the value supported. +TEST_F(PKIMetadataComponentInstallerTest, InstallComponentIncompatibleVersion) { + // Initialize the network service. + content::GetNetworkService(); + task_environment_.RunUntilIdle(); + + // Change the version to an unsupported value. + ct_config_.mutable_log_list()->set_compatibility_version( + kMaxSupportedCompatibilityVersion + 1); + WriteCtConfigToFile(); + + policy_->ComponentReady(base::Version("1.2.3.4"), + component_install_dir_.GetPath(), base::Value()); + task_environment_.RunUntilIdle(); + + network::NetworkService* network_service = + network::NetworkService::GetNetworkServiceForTesting(); + ASSERT_TRUE(network_service); + + // The logs should not have been updated. + const std::vector<network::mojom::CTLogInfoPtr>& logs = + network_service->log_list(); + EXPECT_EQ(logs.size(), 0u); +} + +class PKIMetadataComponentInstallerDisabledTest + : public PKIMetadataComponentInstallerTest { + void SetUp() override { + scoped_feature_list_.InitAndDisableFeature( + certificate_transparency::features:: + kCertificateTransparencyComponentUpdater); + } + base::test::ScopedFeatureList scoped_feature_list_; +}; + +// Tests that the PKI Metadata component does not get registered if the feature +// is disabled. +TEST_F(PKIMetadataComponentInstallerDisabledTest, + DoNotRegisterIfFeatureDisabled) { + EXPECT_CALL(mock_component_update_, RegisterComponent).Times(0); + component_updater::MaybeRegisterPKIMetadataComponent(&mock_component_update_); + task_environment_.RunUntilIdle(); +} + } // namespace component_updater + +#endif // BUILDFLAG(IS_CT_SUPPORTED)
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialCoordinatorFactory.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialCoordinatorFactory.java index 167b4674..02e15f2 100644 --- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialCoordinatorFactory.java +++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialCoordinatorFactory.java
@@ -6,22 +6,21 @@ import android.content.Context; +import org.chromium.chrome.browser.download.items.OfflineContentAggregatorFactory; import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManagerProvider; -import org.chromium.components.offline_items_collection.OfflineContentProvider; import org.chromium.ui.base.WindowAndroid; /** Factory class to build a {@link DownloadInterstitialCoordinator} instance. */ public class DownloadInterstitialCoordinatorFactory { /** * @param context The activity context. - * @param provider An {@link OfflineContentProvider} to observe changes to downloads. * @param windowAndroid The {@link WindowAndroid} associated with the activity. * @return A new {@link DownloadInterstitialCoordinatorImpl} instance. */ public static DownloadInterstitialCoordinator create( - Context context, OfflineContentProvider provider, WindowAndroid windowAndroid) { - return new DownloadInterstitialCoordinatorImpl( - context, provider, SnackbarManagerProvider.from(windowAndroid)); + Context context, WindowAndroid windowAndroid) { + return new DownloadInterstitialCoordinatorImpl(context, + OfflineContentAggregatorFactory.get(), SnackbarManagerProvider.from(windowAndroid)); } private DownloadInterstitialCoordinatorFactory() {}
diff --git a/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_apitest_nss.cc b/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_apitest_nss.cc index 3dc23ce8..f75352d 100644 --- a/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_apitest_nss.cc +++ b/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_apitest_nss.cc
@@ -138,8 +138,8 @@ base::FilePath GetExtensionDirName() { return base::PathService::CheckedGet(chrome::DIR_TEST_DATA) - .Append( - FILE_PATH_LITERAL("extensions/api_test/enterprise_platform_keys/")); + .Append(FILE_PATH_LITERAL( + "extensions/api_test/enterprise_platform_keys/basic/")); } base::FilePath GetExtensionPemFileName() { @@ -319,12 +319,11 @@ // chrome.enterprise.platformKeys namespace. IN_PROC_BROWSER_TEST_F(ExtensionApiTest, EnterprisePlatformKeysIsRestrictedToPolicyExtension) { - ASSERT_TRUE(RunExtensionTest("enterprise_platform_keys", - {.page_url = "api_not_available.html"}, + ASSERT_TRUE(RunExtensionTest("enterprise_platform_keys/api_not_available", {}, {.ignore_manifest_warnings = true})); base::FilePath extension_path = - test_data_dir_.AppendASCII("enterprise_platform_keys"); + test_data_dir_.AppendASCII("enterprise_platform_keys/api_not_available"); ExtensionRegistry* registry = ExtensionRegistry::Get(profile()); const Extension* extension = GetExtensionByPath(registry->enabled_extensions(), extension_path);
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc index ce7fabb..ab84cc4 100644 --- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc +++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
@@ -277,7 +277,8 @@ void SafeBrowsingPrivateEventRouter::OnPolicySpecifiedPasswordReuseDetected( const GURL& url, const std::string& user_name, - bool is_phishing_url) { + bool is_phishing_url, + bool warning_shown) { api::safe_browsing_private::PolicySpecifiedPasswordReuse params; params.url = url.spec(); params.user_name = user_name; @@ -309,6 +310,10 @@ event.Set(kKeyUserName, params.user_name); event.Set(kKeyIsPhishingUrl, params.is_phishing_url); event.Set(kKeyProfileUserName, GetProfileUserName()); + event.Set(kKeyEventResult, + safe_browsing::EventResultToString( + warning_shown ? safe_browsing::EventResult::WARNED + : safe_browsing::EventResult::ALLOWED)); ReportRealtimeEvent(kKeyPasswordReuseEvent, std::move(settings.value()), std::move(event));
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h index 7df7c37..04f3ddcf 100644 --- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h +++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h
@@ -122,9 +122,14 @@ ~SafeBrowsingPrivateEventRouter() override; // Notifies listeners that the user reused a protected password. + // - `url` is the URL where the password was reused + // - `user_name` is the user associated with the reused password + // - `is_phising_url` is whether the URL is thought to be a phishing one + // - `warning_shown` is whether a warning dialog was shown to the user void OnPolicySpecifiedPasswordReuseDetected(const GURL& url, const std::string& user_name, - bool is_phishing_url); + bool is_phishing_url, + bool warning_shown); // Notifies listeners that the user changed the password associated with // |user_name|.
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc index 0627571..a6e9308 100644 --- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc +++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
@@ -133,11 +133,11 @@ policy::DMToken::CreateValidTokenForTesting("fake-token")); } - void TriggerOnPolicySpecifiedPasswordReuseDetectedEvent() { + void TriggerOnPolicySpecifiedPasswordReuseDetectedEvent(bool warning_shown) { SafeBrowsingPrivateEventRouterFactory::GetForProfile(profile_) - ->OnPolicySpecifiedPasswordReuseDetected(GURL("https://phishing.com/"), - "user_name_1", - /*is_phishing_url*/ true); + ->OnPolicySpecifiedPasswordReuseDetected( + GURL("https://phishing.com/"), "user_name_1", + /*is_phishing_url*/ true, warning_shown); } void TriggerOnPolicySpecifiedPasswordChangedEvent() { @@ -302,7 +302,7 @@ #endif // BUILDFLAG(IS_CHROMEOS_ASH) }; -TEST_F(SafeBrowsingPrivateEventRouterTest, TestOnReuseDetected) { +TEST_F(SafeBrowsingPrivateEventRouterTest, TestOnReuseDetected_Warned) { SetUpRouters(); SafeBrowsingEventObserver event_observer( api::safe_browsing_private::OnPolicySpecifiedPasswordReuseDetected:: @@ -313,7 +313,7 @@ EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) .WillOnce(CaptureArg(&report)); - TriggerOnPolicySpecifiedPasswordReuseDetectedEvent(); + TriggerOnPolicySpecifiedPasswordReuseDetectedEvent(/*warning_shown*/ true); base::RunLoop().RunUntilIdle(); auto captured_args = @@ -334,6 +334,46 @@ *event->FindString(SafeBrowsingPrivateEventRouter::kKeyUrl)); EXPECT_EQ("user_name_1", *event->FindString(SafeBrowsingPrivateEventRouter::kKeyUserName)); + EXPECT_EQ( + safe_browsing::EventResultToString(safe_browsing::EventResult::WARNED), + *event->FindString(SafeBrowsingPrivateEventRouter::kKeyEventResult)); +} + +TEST_F(SafeBrowsingPrivateEventRouterTest, TestOnReuseDetected_Allowed) { + SetUpRouters(); + SafeBrowsingEventObserver event_observer( + api::safe_browsing_private::OnPolicySpecifiedPasswordReuseDetected:: + kEventName); + event_router_->AddEventObserver(&event_observer); + + base::Value::Dict report; + EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) + .WillOnce(CaptureArg(&report)); + + TriggerOnPolicySpecifiedPasswordReuseDetectedEvent(/*warning_shown*/ false); + base::RunLoop().RunUntilIdle(); + + auto captured_args = + event_observer.PassEventArgs().GetListDeprecated()[0].Clone(); + EXPECT_EQ("https://phishing.com/", captured_args.FindKey("url")->GetString()); + EXPECT_EQ("user_name_1", captured_args.FindKey("userName")->GetString()); + + Mock::VerifyAndClearExpectations(client_.get()); + const base::Value::List* event_list = + report.FindList(policy::RealtimeReportingJobConfiguration::kEventListKey); + ASSERT_NE(nullptr, event_list); + ASSERT_EQ(1u, event_list->size()); + const base::Value::Dict& wrapper = (*event_list)[0].GetDict(); + const base::Value::Dict* event = + wrapper.FindDict(SafeBrowsingPrivateEventRouter::kKeyPasswordReuseEvent); + EXPECT_NE(nullptr, event); + EXPECT_EQ("https://phishing.com/", + *event->FindString(SafeBrowsingPrivateEventRouter::kKeyUrl)); + EXPECT_EQ("user_name_1", + *event->FindString(SafeBrowsingPrivateEventRouter::kKeyUserName)); + EXPECT_EQ( + safe_browsing::EventResultToString(safe_browsing::EventResult::ALLOWED), + *event->FindString(SafeBrowsingPrivateEventRouter::kKeyEventResult)); } TEST_F(SafeBrowsingPrivateEventRouterTest, TestOnPasswordChanged) { @@ -613,7 +653,7 @@ base::Value report; EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)).Times(0); - TriggerOnPolicySpecifiedPasswordReuseDetectedEvent(); + TriggerOnPolicySpecifiedPasswordReuseDetectedEvent(/*warning_shown*/ true); base::RunLoop().RunUntilIdle(); Mock::VerifyAndClearExpectations(client_.get()); @@ -1153,7 +1193,7 @@ event_router_->AddEventObserver(&event_observer); EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)).Times(1); - TriggerOnPolicySpecifiedPasswordReuseDetectedEvent(); + TriggerOnPolicySpecifiedPasswordReuseDetectedEvent(/*warning_shown*/ true); base::RunLoop().RunUntilIdle(); // Assert the event actually did fire. @@ -1426,7 +1466,7 @@ EXPECT_CALL(*client_, UploadSecurityEventReport_(_, _, _, _)) .Times(num_triggers_); TriggerOnPolicySpecifiedPasswordChangedEvent(); - TriggerOnPolicySpecifiedPasswordReuseDetectedEvent(); + TriggerOnPolicySpecifiedPasswordReuseDetectedEvent(/*warning_shown*/ true); TriggerOnDangerousDownloadOpenedEvent(); TriggerOnSecurityInterstitialShownEvent(); TriggerOnSecurityInterstitialProceededEvent();
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 543ec93..15ce5b9 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -1204,11 +1204,6 @@ "expiry_milestone": 100 }, { - "name": "diagnostics-app", - "owners": [ "//ash/webui/diagnostics_ui/OWNERS" ], - "expiry_milestone": 92 - }, - { "name": "diagnostics-app-navigation", "owners": [ "//ash/webui/diagnostics_ui/OWNERS" ], "expiry_milestone": 99 @@ -5635,7 +5630,7 @@ "expiry_milestone": 104 }, { - "name": "sync-android-promos-revamp", + "name": "sync-android-promos-with-single-button", "owners": ["mmrashad@google.com", "chrome-sync-dev@google.com"], "expiry_milestone": 103 },
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index d5b14cf9..11592fe5 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -1120,12 +1120,6 @@ "Show deprecation notifications and disable functionality for Alt based " "six pack deprecations. The Search based versions continue to work."; -const char kDiagnosticsAppName[] = "Diagnostics app"; -const char kDiagnosticsAppDescription[] = - "Enables the Diagnostics app that allows Chrome OS users to be able to " - "view their system telemetric information and run diagnostic tests for " - "their device."; - const char kDiagnosticsAppNavigationName[] = "Diagnostics app navigation"; const char kDiagnosticsAppNavigationDescription[] = "Enables the navigation panel in the Diagnostics app."; @@ -3591,10 +3585,10 @@ "#site-isolation-trial-opt-out for how to disable site isolation for " "testing."; -const char kSyncAndroidPromosRevampName[] = - "Enable the revamped sync promos on Android"; -const char kSyncAndroidPromosRevampDescription[] = - "Improves the visual design of sync promos."; +const char kSyncAndroidPromosWithSingleButtonName[] = + "Enable the single button sync promos on Android"; +const char kSyncAndroidPromosWithSingleButtonDescription[] = + "Hides the \"Choose another account\" button on sync promos."; const char kTabGroupsForTabletsName[] = "Tab groups on tablets"; const char kTabGroupsForTabletsDescription[] = "Enable tab groups on tablets.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index b65df5ec..6a4f2c7 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -597,9 +597,6 @@ extern const char kDeprecateAltBasedSixPackName[]; extern const char kDeprecateAltBasedSixPackDescription[]; -extern const char kDiagnosticsAppName[]; -extern const char kDiagnosticsAppDescription[]; - extern const char kDiagnosticsAppNavigationName[]; extern const char kDiagnosticsAppNavigationDescription[]; @@ -2050,8 +2047,8 @@ extern const char kStrictSiteIsolationName[]; extern const char kStrictSiteIsolationDescription[]; -extern const char kSyncAndroidPromosRevampName[]; -extern const char kSyncAndroidPromosRevampDescription[]; +extern const char kSyncAndroidPromosWithSingleButtonName[]; +extern const char kSyncAndroidPromosWithSingleButtonDescription[]; extern const char kTabGroupsForTabletsName[]; extern const char kTabGroupsForTabletsDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index fa7aaf3e..2970736a 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -371,7 +371,7 @@ &switches::kForceStartupSigninPromo, &switches::kForceDisableExtendedSyncPromos, &syncer::kSyncTrustedVaultPassphraseRecovery, - &syncer::kSyncAndroidPromosRevamp, + &syncer::kSyncAndroidPromosWithSingleButton, &switches::kSyncUseSessionsUnregisterDelay, &subresource_filter::kSafeBrowsingSubresourceFilter, &video_tutorials::features::kVideoTutorials,
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java index b6544adb8..f84f47f8 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -304,7 +304,8 @@ "ContextualTriggersSelectionMenu"; public static final String CONTEXTUAL_TRIGGERS_SELECTION_SIZE = "ContextualTriggersSelectionSize"; - public static final String SYNC_ANDROID_PROMOS_REVAMP = "SyncAndroidPromosRevamp"; + public static final String SYNC_ANDROID_PROMOS_WITH_SINGLE_BUTTON = + "SyncAndroidPromosWithSingleButton"; public static final String CONTINUOUS_SEARCH = "ContinuousSearch"; public static final String CRITICAL_PERSISTED_TAB_DATA = "CriticalPersistedTabData"; public static final String DARKEN_WEBSITES_CHECKBOX_IN_THEMES_SETTING =
diff --git a/chrome/browser/metrics/metrics_service_browsertest.cc b/chrome/browser/metrics/metrics_service_browsertest.cc index 5a2672f1..5392d46 100644 --- a/chrome/browser/metrics/metrics_service_browsertest.cc +++ b/chrome/browser/metrics/metrics_service_browsertest.cc
@@ -199,7 +199,6 @@ #elif BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) VerifyRendererExitCodeIsSignal(histogram_tester, SIGSEGV); #endif - histogram_tester.ExpectUniqueSample("Tabs.SadTab.CrashCreated", 1, 1); } // Test is disabled on Windows AMR64 because @@ -225,7 +224,6 @@ histogram_tester.ExpectUniqueSample( "CrashExitCodes.Renderer", std::abs(static_cast<int32_t>(STATUS_HEAP_CORRUPTION)), 1); - histogram_tester.ExpectUniqueSample("Tabs.SadTab.CrashCreated", 1, 1); LOG(INFO) << histogram_tester.GetAllHistogramsRecorded(); } #endif // BUILDFLAG(IS_WIN) @@ -252,7 +250,6 @@ #elif BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) VerifyRendererExitCodeIsSignal(histogram_tester, SIGTRAP); #endif - histogram_tester.ExpectUniqueSample("Tabs.SadTab.CrashCreated", 1, 1); } // OOM code only works on Windows. @@ -294,8 +291,6 @@ EXPECT_THAT(histogram_tester.GetAllSamples("CrashExitCodes.Renderer"), ::testing::IsSubsetOf(expected_possible_exit_codes)); - - histogram_tester.ExpectUniqueSample("Tabs.SadTab.OomCreated", 1, 1); } #endif // BUILDFLAG(IS_WIN) && !defined(ADDRESS_SANITIZER)
diff --git a/chrome/browser/new_tab_page/modules/photos/photos_handler.cc b/chrome/browser/new_tab_page/modules/photos/photos_handler.cc index 9bb6b58..093ad7f 100644 --- a/chrome/browser/new_tab_page/modules/photos/photos_handler.cc +++ b/chrome/browser/new_tab_page/modules/photos/photos_handler.cc
@@ -6,11 +6,15 @@ #include "chrome/browser/new_tab_page/modules/photos/photos_service.h" #include "chrome/browser/new_tab_page/modules/photos/photos_service_factory.h" +#include "content/public/browser/web_contents.h" PhotosHandler::PhotosHandler( mojo::PendingReceiver<photos::mojom::PhotosHandler> handler, - Profile* profile) - : handler_(this, std::move(handler)), profile_(profile) {} + Profile* profile, + content::WebContents* web_contents) + : handler_(this, std::move(handler)), + profile_(profile), + web_contents_(web_contents) {} PhotosHandler::~PhotosHandler() = default; @@ -34,7 +38,8 @@ } void PhotosHandler::OnUserOptIn(bool accept) { - PhotosServiceFactory::GetForProfile(profile_)->OnUserOptIn(accept); + PhotosServiceFactory::GetForProfile(profile_)->OnUserOptIn( + accept, web_contents_, profile_); } void PhotosHandler::OnMemoryOpen() {
diff --git a/chrome/browser/new_tab_page/modules/photos/photos_handler.h b/chrome/browser/new_tab_page/modules/photos/photos_handler.h index c785cce..039eb78b 100644 --- a/chrome/browser/new_tab_page/modules/photos/photos_handler.h +++ b/chrome/browser/new_tab_page/modules/photos/photos_handler.h
@@ -7,6 +7,7 @@ #include "base/memory/raw_ptr.h" #include "chrome/browser/new_tab_page/modules/photos/photos.mojom.h" +#include "content/public/browser/web_contents.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver.h" @@ -16,7 +17,8 @@ class PhotosHandler : public photos::mojom::PhotosHandler { public: PhotosHandler(mojo::PendingReceiver<photos::mojom::PhotosHandler> handler, - Profile* profile); + Profile* profile, + content::WebContents* web_contents); ~PhotosHandler() override; // photos::mojom::PhotosHandler: @@ -35,6 +37,7 @@ private: mojo::Receiver<photos::mojom::PhotosHandler> handler_; raw_ptr<Profile> profile_; + content::WebContents* web_contents_; }; #endif // CHROME_BROWSER_NEW_TAB_PAGE_MODULES_PHOTOS_PHOTOS_HANDLER_H_
diff --git a/chrome/browser/new_tab_page/modules/photos/photos_service.cc b/chrome/browser/new_tab_page/modules/photos/photos_service.cc index 89f212b3..eafffcc2 100644 --- a/chrome/browser/new_tab_page/modules/photos/photos_service.cc +++ b/chrome/browser/new_tab_page/modules/photos/photos_service.cc
@@ -15,6 +15,8 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" +#include "chrome/browser/ui/hats/hats_service.h" +#include "chrome/browser/ui/hats/hats_service_factory.h" #include "chrome/grit/generated_resources.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" @@ -23,6 +25,7 @@ #include "components/signin/public/identity_manager/primary_account_access_token_fetcher.h" #include "components/signin/public/identity_manager/scope_set.h" #include "components/variations/net/variations_http_headers.h" +#include "content/public/browser/web_contents.h" #include "google_apis/gaia/gaia_constants.h" #include "net/base/load_flags.h" #include "services/network/public/cpp/resource_request.h" @@ -228,8 +231,19 @@ pref_service_->GetInteger(kSoftOptOutCountPrefName) + 1); } -void PhotosService::OnUserOptIn(bool accept) { +void PhotosService::OnUserOptIn(bool accept, + content::WebContents* web_contents, + Profile* profile) { pref_service_->SetBoolean(kOptInAcknowledgedPrefName, accept); + + // Trigger a HaTS survey when user opts-out. + if (!accept && web_contents && profile) { + HatsService* hats_service = HatsServiceFactory::GetForProfile( + profile, /*create_if_necessary=*/true); + CHECK(hats_service); + hats_service->LaunchDelayedSurveyForWebContents( + kHatsSurveyTriggerNtpPhotosModuleOptOut, web_contents, 0); + } } void PhotosService::OnMemoryOpen() {
diff --git a/chrome/browser/new_tab_page/modules/photos/photos_service.h b/chrome/browser/new_tab_page/modules/photos/photos_service.h index 7af2eab..59cfc4a5 100644 --- a/chrome/browser/new_tab_page/modules/photos/photos_service.h +++ b/chrome/browser/new_tab_page/modules/photos/photos_service.h
@@ -11,9 +11,11 @@ #include "base/memory/raw_ptr.h" #include "base/sequence_checker.h" #include "chrome/browser/new_tab_page/modules/photos/photos.mojom.h" +#include "chrome/browser/profiles/profile.h" #include "components/keyed_service/core/keyed_service.h" #include "components/signin/public/identity_manager/access_token_info.h" #include "components/signin/public/identity_manager/identity_manager.h" +#include "content/public/browser/web_contents.h" #include "google_apis/gaia/google_service_auth_error.h" #include "services/data_decoder/public/cpp/data_decoder.h" #include "services/network/public/cpp/shared_url_loader_factory.h" @@ -80,7 +82,9 @@ // Returns whether to show opt-in surface in the module. bool ShouldShowOptInScreen(); // Stores whether the user has opt-in to see the module content. - void OnUserOptIn(bool accept); + void OnUserOptIn(bool accept, + content::WebContents* web_contents, + Profile* profile); // Stores the last time the user opened a memory. void OnMemoryOpen(); // Returns whether to show the soft opt out button.
diff --git a/chrome/browser/new_tab_page/modules/photos/photos_service_unittest.cc b/chrome/browser/new_tab_page/modules/photos/photos_service_unittest.cc index e0e60b2..66285a4 100644 --- a/chrome/browser/new_tab_page/modules/photos/photos_service_unittest.cc +++ b/chrome/browser/new_tab_page/modules/photos/photos_service_unittest.cc
@@ -527,12 +527,12 @@ EXPECT_TRUE(service_->ShouldShowOptInScreen()); // If user does not accept opt-in, we should keep showing screen. - service_->OnUserOptIn(false); + service_->OnUserOptIn(false, NULL, NULL); EXPECT_TRUE(service_->ShouldShowOptInScreen()); EXPECT_FALSE(prefs_.GetBoolean(PhotosService::kOptInAcknowledgedPrefName)); // If user accept opt-in, we should stop showing screen. - service_->OnUserOptIn(true); + service_->OnUserOptIn(true, NULL, NULL); EXPECT_FALSE(service_->ShouldShowOptInScreen()); EXPECT_TRUE(prefs_.GetBoolean(PhotosService::kOptInAcknowledgedPrefName)); } @@ -564,7 +564,7 @@ EXPECT_FALSE(prefs_.GetBoolean(PhotosService::kOptInAcknowledgedPrefName)); // Opt-in current account - service_->OnUserOptIn(true); + service_->OnUserOptIn(true, NULL, NULL); EXPECT_TRUE(prefs_.GetBoolean(PhotosService::kOptInAcknowledgedPrefName)); // Clear primary account which should trigger clearing the pref.
diff --git a/chrome/browser/notifications/BUILD.gn b/chrome/browser/notifications/BUILD.gn index 6e48d03..ffbd09a 100644 --- a/chrome/browser/notifications/BUILD.gn +++ b/chrome/browser/notifications/BUILD.gn
@@ -175,9 +175,7 @@ android_resources("java_resources") { sources = [ - "android/java/res/drawable-ldrtl-night/notification_permission_rationale_dialog_header.xml", "android/java/res/drawable-ldrtl/notification_permission_rationale_dialog_header.xml", - "android/java/res/drawable-night/notification_permission_rationale_dialog_header.xml", "android/java/res/drawable/notification_permission_rationale_dialog_header.xml", "android/java/res/layout/notification_permission_rationale_dialog.xml", "android/java/res/layout/web_notification.xml", @@ -185,7 +183,9 @@ "android/java/res/layout/web_notification_button.xml", "android/java/res/layout/web_notification_icon_frame.xml", "android/java/res/layout/web_notification_small_icon.xml", + "android/java/res/values-night/colors.xml", "android/java/res/values-v21/styles.xml", + "android/java/res/values/colors.xml", "android/java/res/values/styles.xml", ]
diff --git a/chrome/browser/notifications/android/java/res/drawable-ldrtl-night/notification_permission_rationale_dialog_header.xml b/chrome/browser/notifications/android/java/res/drawable-ldrtl-night/notification_permission_rationale_dialog_header.xml deleted file mode 100644 index 0ce4e8b..0000000 --- a/chrome/browser/notifications/android/java/res/drawable-ldrtl-night/notification_permission_rationale_dialog_header.xml +++ /dev/null
@@ -1,104 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Copyright 2022 The Chromium Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.--> -<!--VectorRaster is ignored because: The image should be shown rarely enough to prioritize binary size over inflation time.--> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - tools:ignore="VectorRaster" - android:width="261dp" - android:height="271dp" - android:viewportWidth="261" - android:viewportHeight="271"> - <group> - <clip-path - android:pathData="M260.063,0l-260.063,0l-0,271L260.063,271z"/> - <group> - <clip-path - android:pathData="M237.78,2.43L22.284,2.43A19.853,19.853 0,0 0,2.431 22.283L2.431,510.396A19.853,19.853 0,0 0,22.284 530.249L237.78,530.249A19.853,19.853 45,0 0,257.633 510.396L257.633,22.283A19.853,19.853 135,0 0,237.78 2.43z"/> - <path - android:pathData="M237.78,2.43L22.284,2.43A19.853,19.853 0,0 0,2.431 22.283L2.431,510.396A19.853,19.853 0,0 0,22.284 530.249L237.78,530.249A19.853,19.853 45,0 0,257.633 510.396L257.633,22.283A19.853,19.853 135,0 0,237.78 2.43z" - android:fillColor="#1F1F1F"/> - <path - android:pathData="M237.78,2.43L22.284,2.43A19.853,19.853 0,0 0,2.431 22.283L2.431,510.396A19.853,19.853 0,0 0,22.284 530.249L237.78,530.249A19.853,19.853 45,0 0,257.633 510.396L257.633,22.283A19.853,19.853 135,0 0,237.78 2.43z" - android:fillColor="#C7C7C7" - android:fillAlpha="0.11"/> - <path - android:pathData="M237.78,2.43L22.284,2.43A19.853,19.853 0,0 0,2.431 22.283L2.431,510.396A19.853,19.853 0,0 0,22.284 530.249L237.78,530.249A19.853,19.853 45,0 0,257.633 510.396L257.633,22.283A19.853,19.853 135,0 0,237.78 2.43z" - android:fillColor="#A8C7FA" - android:fillAlpha="0.02"/> - <path - android:pathData="M40.863,17.873c2.066,0 3.874,0.903 5.165,2.324l-5.165,6.284 -5.165,-6.284c1.291,-1.42 3.1,-2.324 5.165,-2.324zM26.837,17.873l8.608,8.608h-8.608v-8.608z" - android:fillColor="#707473"/> - <path - android:pathData="M20.672,18.738v-0.86L18.52,17.878v0.86h-0.934a0.575,0.575 0,0 0,-0.572 0.573v6.602c0,0.314 0.258,0.572 0.577,0.572h4.015a0.575,0.575 0,0 0,0.573 -0.572L22.179,19.31a0.575,0.575 0,0 0,-0.573 -0.573h-0.934zM21.318,23.474v2.152h-3.444v-6.025h3.444v3.873z" - android:fillColor="#707473" - android:fillType="evenOdd"/> - <path - android:pathData="M17.586,26.484h4.02a0.575,0.575 0,0 0,0.573 -0.573V19.31a0.575,0.575 0,0 0,-0.573 -0.572h-4.02a0.575,0.575 0,0 0,-0.572 0.572v6.602c0,0.314 0.258,0.573 0.572,0.573z" - android:fillColor="#707473"/> - <path - android:pathData="M196.821,60.155L143.447,60.155A2.479,2.479 0,0 0,140.968 62.634L140.968,64.967A2.479,2.479 0,0 0,143.447 67.446L196.821,67.446A2.479,2.479 0,0 0,199.3 64.967L199.3,62.634A2.479,2.479 0,0 0,196.821 60.155z" - android:fillColor="#707473"/> - <path - android:pathData="M196.821,95.397L104.559,95.397A2.479,2.479 0,0 0,102.08 97.876L102.08,102.64A2.479,2.479 0,0 0,104.559 105.119L196.821,105.119A2.479,2.479 0,0 0,199.3 102.64L199.3,97.876A2.479,2.479 0,0 0,196.821 95.397z" - android:fillColor="#707473"/> - <path - android:pathData="M196.821,77.168L158.03,77.168A2.479,2.479 0,0 0,155.551 79.647L155.551,84.411A2.479,2.479 0,0 0,158.03 86.89L196.821,86.89A2.479,2.479 0,0 0,199.3 84.411L199.3,79.647A2.479,2.479 0,0 0,196.821 77.168z" - android:fillColor="#707473"/> - <path - android:pathData="M209.022,63.8c0,6.712 5.441,12.153 12.153,12.153 6.712,0 12.152,-5.441 12.152,-12.153 0,-6.711 -5.44,-12.152 -12.152,-12.152 -6.712,0 -12.153,5.44 -12.153,12.152z" - android:fillColor="#3982F8"/> - <path - android:pathData="M213.579,66.334v-5.063h3.376l4.219,-4.22v13.503l-4.219,-4.22h-3.376zM224.972,63.799c0,1.49 -0.861,2.777 -2.11,3.397v-6.798a3.803,3.803 0,0 1,2.11 3.401zM222.862,71.203L222.862,69.46a5.907,5.907 0,0 0,4.22 -5.659,5.907 5.907,0 0,0 -4.22,-5.658L222.862,56.4c3.38,0.768 5.907,3.785 5.907,7.401 0,3.617 -2.527,6.633 -5.907,7.401z" - android:fillColor="#E3E3E3" - android:fillType="evenOdd"/> - <path - android:pathData="M230.654,43.141L29.409,43.141A11.18,11.18 0,0 0,18.229 54.321L18.229,102.445A11.18,11.18 0,0 0,29.409 113.625L230.654,113.625A11.18,11.18 0,0 0,241.834 102.445L241.834,54.321A11.18,11.18 0,0 0,230.654 43.141z" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#707473"/> - <path - android:pathData="M196.821,137.93L177.474,137.93A2.479,2.479 0,0 0,174.995 140.409L174.995,142.742A2.479,2.479 0,0 0,177.474 145.221L196.821,145.221A2.479,2.479 0,0 0,199.3 142.742L199.3,140.409A2.479,2.479 0,0 0,196.821 137.93z" - android:fillColor="#707473"/> - <path - android:pathData="M196.821,173.173L128.864,173.173A2.479,2.479 135,0 0,126.385 175.652L126.385,180.416A2.479,2.479 135,0 0,128.864 182.895L196.821,182.895A2.479,2.479 0,0 0,199.3 180.416L199.3,175.652A2.479,2.479 0,0 0,196.821 173.173z" - android:fillColor="#707473"/> - <path - android:pathData="M196.821,154.944L43.797,154.944A2.479,2.479 0,0 0,41.318 157.423L41.318,162.187A2.479,2.479 135,0 0,43.797 164.666L196.821,164.666A2.479,2.479 0,0 0,199.3 162.187L199.3,157.423A2.479,2.479 0,0 0,196.821 154.944z" - android:fillColor="#707473"/> - <path - android:pathData="M233.327,141.576c0,-6.711 -5.441,-12.152 -12.152,-12.152 -6.712,0 -12.153,5.441 -12.153,12.152 0,6.712 5.441,12.153 12.153,12.153 6.711,0 12.152,-5.441 12.152,-12.153z" - android:fillColor="#34A853"/> - <path - android:pathData="M213.58,140.735h15.191v0.844L213.58,141.579v-0.844zM216.432,139.891l1.933,-5.148a0.845,0.845 0,0 1,1.055 -0.506l1.755,0.59 1.764,-0.59a0.845,0.845 0,0 1,1.055 0.506l1.924,5.148h-9.486zM217.378,142.423c1.4,0 2.565,0.979 2.869,2.287a2.317,2.317 0,0 1,1.857 -0.009,2.955 2.955,0 0,1 2.869,-2.278 2.957,2.957 0,0 1,2.954 2.953,2.957 2.957,0 0,1 -2.954,2.954 2.939,2.939 0,0 1,-2.929 -2.717c-0.253,-0.177 -0.919,-0.507 -1.738,0.017 -0.135,1.51 -1.384,2.7 -2.928,2.7a2.957,2.957 0,0 1,-2.954 -2.954,2.957 2.957,0 0,1 2.954,-2.953zM224.973,147.486c1.164,0 2.11,-0.945 2.11,-2.11a2.11,2.11 0,0 0,-4.22 0,2.11 2.11,0 0,0 2.11,2.11zM217.378,147.486a2.11,2.11 0,1 0,-0.002 -4.22,2.11 2.11,0 0,0 0.002,4.22z" - android:fillColor="#E3E3E3"/> - <path - android:pathData="M230.654,120.917L29.409,120.917A11.18,11.18 0,0 0,18.229 132.097L18.229,180.221A11.18,11.18 0,0 0,29.409 191.401L230.654,191.401A11.18,11.18 0,0 0,241.834 180.221L241.834,132.097A11.18,11.18 0,0 0,230.654 120.917z" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#707473"/> - <path - android:pathData="M196.821,216.314L162.891,216.314A2.479,2.479 0,0 0,160.412 218.793L160.412,221.126A2.479,2.479 0,0 0,162.891 223.605L196.821,223.605A2.479,2.479 0,0 0,199.3 221.126L199.3,218.793A2.479,2.479 0,0 0,196.821 216.314z" - android:fillColor="#707473"/> - <path - android:pathData="M233.327,219.96c0,-6.712 -5.441,-12.153 -12.152,-12.153 -6.712,0 -12.153,5.441 -12.153,12.153 0,6.711 5.441,12.152 12.153,12.152 6.711,0 12.152,-5.441 12.152,-12.152z" - android:fillColor="#FBBC04"/> - <group> - <clip-path - android:pathData="M231.302,209.833l-20.254,0l-0,20.254L231.302,230.087z"/> - <path - android:pathData="M215.267,217.428h3.376v-5.064h5.063v5.064h3.376l-5.907,5.907 -5.908,-5.907zM227.082,225.023v1.688h-11.815v-1.688h11.815z" - android:fillColor="#E3E3E3"/> - </group> - <path - android:pathData="M230.654,199.3L29.409,199.3A11.18,11.18 0,0 0,18.229 210.48L18.229,229.438A11.18,11.18 45,0 0,29.409 240.618L230.654,240.618A11.18,11.18 0,0 0,241.834 229.438L241.834,210.48A11.18,11.18 0,0 0,230.654 199.3z" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#707473"/> - </group> - <path - android:pathData="M237.78,2.43L22.284,2.43A19.853,19.853 0,0 0,2.431 22.283L2.431,510.396A19.853,19.853 0,0 0,22.284 530.249L237.78,530.249A19.853,19.853 45,0 0,257.633 510.396L257.633,22.283A19.853,19.853 135,0 0,237.78 2.43z" - android:strokeWidth="4.861" - android:fillColor="#00000000" - android:strokeColor="#808483"/> - </group> -</vector>
diff --git a/chrome/browser/notifications/android/java/res/drawable-ldrtl/notification_permission_rationale_dialog_header.xml b/chrome/browser/notifications/android/java/res/drawable-ldrtl/notification_permission_rationale_dialog_header.xml index 74b2888..e6c046d 100644 --- a/chrome/browser/notifications/android/java/res/drawable-ldrtl/notification_permission_rationale_dialog_header.xml +++ b/chrome/browser/notifications/android/java/res/drawable-ldrtl/notification_permission_rationale_dialog_header.xml
@@ -4,187 +4,95 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:ignore="VectorRaster" - android:width="261dp" - android:height="271dp" - android:viewportWidth="261" - android:viewportHeight="271"> + android:width="224dp" + android:height="245dp" + android:viewportWidth="224" + android:viewportHeight="245"> <group> <clip-path - android:pathData="M260.063,0l-260.063,0l-0,271L260.063,271z"/> + android:pathData="M0,0h224v245h-224z"/> + <path + android:pathData="M41,16.832C43,16.832 44.75,17.707 46,19.082L41,25.165L36,19.082C37.25,17.707 39,16.832 41,16.832Z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M27.328,16.832L35.661,25.165H27.328V16.832Z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M21.543,17.671V16.838H19.459V17.671H18.555C18.251,17.671 18.001,17.921 18.001,18.226V22.255V24.617C18.001,24.921 18.251,25.171 18.559,25.171H22.447C22.751,25.171 23.001,24.921 23.001,24.617V22.255V18.226C23.001,17.921 22.751,17.671 22.447,17.671H21.543ZM22.169,22.256V24.34H18.836V22.256V18.506H22.169V22.256Z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline" + android:fillType="evenOdd"/> + <path + android:pathData="M18.554,25.169H22.446C22.75,25.169 23,24.919 23,24.615V18.223C23,17.919 22.75,17.669 22.446,17.669H18.554C18.25,17.669 18,17.919 18,18.223V24.615C18,24.919 18.25,25.169 18.554,25.169Z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M164.2,55L119.8,55A1.8,1.8 0,0 0,118 56.8L118,59.2A1.8,1.8 0,0 0,119.8 61L164.2,61A1.8,1.8 0,0 0,166 59.2L166,56.8A1.8,1.8 0,0 0,164.2 55z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M164,83L88,83A2,2 0,0 0,86 85L86,89A2,2 0,0 0,88 91L164,91A2,2 0,0 0,166 89L166,85A2,2 0,0 0,164 83z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M164,69L132,69A2,2 0,0 0,130 71L130,75A2,2 0,0 0,132 77L164,77A2,2 0,0 0,166 75L166,71A2,2 0,0 0,164 69z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M174,58C174,64.627 179.373,70 186,70V70C192.627,70 198,64.627 198,58V58C198,51.373 192.627,46 186,46V46C179.373,46 174,51.373 174,58V58Z" + android:fillColor="#3982F8"/> + <path + android:pathData="M178.5,60.502V55.502H181.833L186,51.335V64.669L181.833,60.502H178.5V60.502ZM189.749,57.999C189.749,59.469 188.899,60.74 187.666,61.353V54.64C188.899,55.257 189.749,56.528 189.749,57.999V57.999ZM187.666,65.309V63.588C190.074,62.872 191.833,60.643 191.833,58.001C191.833,55.359 190.074,53.13 187.666,52.413V50.693C191.003,51.451 193.499,54.43 193.499,58.001C193.499,61.572 191.003,64.551 187.666,65.309V65.309Z" + android:fillColor="#ffffff" + android:fillType="evenOdd"/> + <path + android:pathData="M195.695,38L28.305,38A10.305,10.305 0,0 0,18 48.305L18,88.695A10.305,10.305 0,0 0,28.305 99L195.695,99A10.305,10.305 0,0 0,206 88.695L206,48.305A10.305,10.305 0,0 0,195.695 38z" + android:strokeWidth="4" + android:fillColor="#00000000" + android:strokeColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M164.2,126L147.8,126A1.8,1.8 45,0 0,146 127.8L146,130.2A1.8,1.8 0,0 0,147.8 132L164.2,132A1.8,1.8 0,0 0,166 130.2L166,127.8A1.8,1.8 135,0 0,164.2 126z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M164,154L108,154A2,2 0,0 0,106 156L106,160A2,2 0,0 0,108 162L164,162A2,2 0,0 0,166 160L166,156A2,2 0,0 0,164 154z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M164,140L36,140A2,2 0,0 0,34 142L34,146A2,2 0,0 0,36 148L164,148A2,2 0,0 0,166 146L166,142A2,2 0,0 0,164 140z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M198,129C198,122.373 192.627,117 186,117C179.373,117 174,122.373 174,129C174,135.627 179.373,141 186,141C192.627,141 198,135.627 198,129Z" + android:fillColor="#34A853"/> + <path + android:pathData="M178.5,128.169H193.5V129.003H178.5V128.169Z" + android:fillColor="#ffffff"/> + <path + android:pathData="M181.317,127.336L183.225,122.253C183.383,121.836 183.842,121.611 184.267,121.753L186,122.336L187.742,121.753C188.167,121.611 188.625,121.836 188.783,122.253L190.683,127.336H181.317Z" + android:fillColor="#ffffff"/> + <path + android:pathData="M182.25,129.836C183.633,129.836 184.783,130.803 185.083,132.094C185.783,131.794 186.433,131.878 186.917,132.086C187.225,130.794 188.375,129.836 189.75,129.836C191.358,129.836 192.667,131.144 192.667,132.753C192.667,134.361 191.358,135.669 189.75,135.669C188.217,135.669 186.975,134.486 186.858,132.986C186.608,132.811 185.95,132.486 185.142,133.003C185.008,134.494 183.775,135.669 182.25,135.669C180.642,135.669 179.333,134.361 179.333,132.753C179.333,131.144 180.642,129.836 182.25,129.836ZM189.75,134.836C190.9,134.836 191.833,133.903 191.833,132.753C191.833,131.603 190.9,130.669 189.75,130.669C188.6,130.669 187.667,131.603 187.667,132.753C187.667,133.903 188.6,134.836 189.75,134.836ZM182.25,134.836C183.4,134.836 184.333,133.903 184.333,132.753C184.333,131.603 183.4,130.669 182.25,130.669C181.1,130.669 180.167,131.603 180.167,132.753C180.167,133.903 181.1,134.836 182.25,134.836Z" + android:fillColor="#ffffff"/> + <path + android:pathData="M195.695,109L28.305,109A10.305,10.305 0,0 0,18 119.305L18,159.695A10.305,10.305 0,0 0,28.305 170L195.695,170A10.305,10.305 0,0 0,206 159.695L206,119.305A10.305,10.305 135,0 0,195.695 109z" + android:strokeWidth="4" + android:fillColor="#00000000" + android:strokeColor="@color/permission_rationale_illustration_inner_border_baseline"/> <group> <clip-path - android:pathData="M237.779,2.43L22.283,2.43A19.853,19.853 0,0 0,2.43 22.283L2.43,510.396A19.853,19.853 0,0 0,22.283 530.249L237.779,530.249A19.853,19.853 45,0 0,257.632 510.396L257.632,22.283A19.853,19.853 135,0 0,237.779 2.43z"/> + android:pathData="M195.695,180L28.305,180A10.305,10.305 0,0 0,18 190.305L18,209.695A10.305,10.305 0,0 0,28.305 220L195.695,220A10.305,10.305 135,0 0,206 209.695L206,190.305A10.305,10.305 0,0 0,195.695 180z"/> <path - android:pathData="M237.779,2.43L22.283,2.43A19.853,19.853 0,0 0,2.43 22.283L2.43,510.396A19.853,19.853 0,0 0,22.283 530.249L237.779,530.249A19.853,19.853 45,0 0,257.632 510.396L257.632,22.283A19.853,19.853 135,0 0,237.779 2.43z" - android:fillColor="#fff"/> + android:pathData="M164.2,197L135.8,197A1.8,1.8 45,0 0,134 198.8L134,201.2A1.8,1.8 0,0 0,135.8 203L164.2,203A1.8,1.8 0,0 0,166 201.2L166,198.8A1.8,1.8 0,0 0,164.2 197z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline"/> <path - android:pathData="M40.862,17.873c2.066,0 3.874,0.904 5.165,2.324l-5.165,6.284 -5.164,-6.284c1.29,-1.42 3.099,-2.324 5.164,-2.324zM26.836,17.873l8.608,8.608h-8.608v-8.608z" - android:fillColor="#1F1F1F" - android:fillAlpha="0.16"/> - <path - android:pathData="M20.672,18.74v-0.86L18.52,17.88v0.86h-0.934a0.575,0.575 0,0 0,-0.573 0.572v6.602c0,0.315 0.259,0.573 0.577,0.573h4.016a0.575,0.575 0,0 0,0.572 -0.572v-6.603a0.575,0.575 0,0 0,-0.572 -0.572h-0.934zM21.317,23.476v2.152h-3.443v-6.026h3.444v3.874z" - android:fillColor="#DBDBDB" - android:fillType="evenOdd"/> - <path - android:pathData="M17.586,26.485h4.02a0.575,0.575 0,0 0,0.572 -0.573V19.31a0.575,0.575 0,0 0,-0.572 -0.572h-4.02a0.575,0.575 0,0 0,-0.573 0.572v6.602c0,0.314 0.259,0.573 0.573,0.573z" - android:fillColor="#DBDBDB"/> - <path - android:pathData="M196.822,60.156L143.448,60.156A2.479,2.479 0,0 0,140.969 62.635L140.969,64.968A2.479,2.479 0,0 0,143.448 67.447L196.822,67.447A2.479,2.479 0,0 0,199.301 64.968L199.301,62.635A2.479,2.479 0,0 0,196.822 60.156z" - android:fillColor="#fff"/> - <path - android:pathData="M196.822,60.156L143.448,60.156A2.479,2.479 0,0 0,140.969 62.635L140.969,64.968A2.479,2.479 0,0 0,143.448 67.447L196.822,67.447A2.479,2.479 0,0 0,199.301 64.968L199.301,62.635A2.479,2.479 0,0 0,196.822 60.156z" - android:fillColor="#5E5E5E" - android:fillAlpha="0.11"/> - <path - android:pathData="M196.822,60.156L143.448,60.156A2.479,2.479 0,0 0,140.969 62.635L140.969,64.968A2.479,2.479 0,0 0,143.448 67.447L196.822,67.447A2.479,2.479 0,0 0,199.301 64.968L199.301,62.635A2.479,2.479 0,0 0,196.822 60.156z" - android:fillColor="#0B57D0" - android:fillAlpha="0.02"/> - <path - android:pathData="M196.822,95.398L104.56,95.398A2.479,2.479 0,0 0,102.081 97.877L102.081,102.641A2.479,2.479 0,0 0,104.56 105.12L196.822,105.12A2.479,2.479 0,0 0,199.301 102.641L199.301,97.877A2.479,2.479 0,0 0,196.822 95.398z" - android:fillColor="#fff"/> - <path - android:pathData="M196.822,95.398L104.56,95.398A2.479,2.479 0,0 0,102.081 97.877L102.081,102.641A2.479,2.479 0,0 0,104.56 105.12L196.822,105.12A2.479,2.479 0,0 0,199.301 102.641L199.301,97.877A2.479,2.479 0,0 0,196.822 95.398z" - android:fillColor="#5E5E5E" - android:fillAlpha="0.11"/> - <path - android:pathData="M196.822,95.398L104.56,95.398A2.479,2.479 0,0 0,102.081 97.877L102.081,102.641A2.479,2.479 0,0 0,104.56 105.12L196.822,105.12A2.479,2.479 0,0 0,199.301 102.641L199.301,97.877A2.479,2.479 0,0 0,196.822 95.398z" - android:fillColor="#0B57D0" - android:fillAlpha="0.02"/> - <path - android:pathData="M196.822,77.17L158.031,77.17A2.479,2.479 0,0 0,155.552 79.649L155.552,84.413A2.479,2.479 0,0 0,158.031 86.892L196.822,86.892A2.479,2.479 0,0 0,199.301 84.413L199.301,79.649A2.479,2.479 0,0 0,196.822 77.17z" - android:fillColor="#fff"/> - <path - android:pathData="M196.822,77.17L158.031,77.17A2.479,2.479 0,0 0,155.552 79.649L155.552,84.413A2.479,2.479 0,0 0,158.031 86.892L196.822,86.892A2.479,2.479 0,0 0,199.301 84.413L199.301,79.649A2.479,2.479 0,0 0,196.822 77.17z" - android:fillColor="#5E5E5E" - android:fillAlpha="0.11"/> - <path - android:pathData="M196.822,77.17L158.031,77.17A2.479,2.479 0,0 0,155.552 79.649L155.552,84.413A2.479,2.479 0,0 0,158.031 86.892L196.822,86.892A2.479,2.479 0,0 0,199.301 84.413L199.301,79.649A2.479,2.479 0,0 0,196.822 77.17z" - android:fillColor="#0B57D0" - android:fillAlpha="0.02"/> - <path - android:pathData="M209.022,63.802c0,6.712 5.441,12.152 12.153,12.152 6.712,0 12.152,-5.44 12.152,-12.152 0,-6.712 -5.44,-12.152 -12.152,-12.152 -6.712,0 -12.153,5.44 -12.153,12.152z" - android:fillColor="#3982F8"/> - <path - android:pathData="M213.579,66.336v-5.063h3.376l4.219,-4.22v13.503l-4.219,-4.22h-3.376zM224.972,63.801c0,1.49 -0.861,2.776 -2.11,3.396L222.862,60.4a3.803,3.803 0,0 1,2.11 3.4zM222.862,71.204v-1.743a5.907,5.907 0,0 0,4.22 -5.658,5.907 5.907,0 0,0 -4.22,-5.659v-1.742c3.38,0.768 5.907,3.785 5.907,7.4 0,3.617 -2.527,6.634 -5.907,7.402z" - android:fillColor="#fff" - android:fillType="evenOdd"/> - <path - android:pathData="M230.654,43.142L29.409,43.142A11.18,11.18 0,0 0,18.229 54.322L18.229,102.446A11.18,11.18 0,0 0,29.409 113.626L230.654,113.626A11.18,11.18 0,0 0,241.834 102.446L241.834,54.322A11.18,11.18 0,0 0,230.654 43.142z" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#fff"/> - <path - android:pathData="M230.654,43.142L29.409,43.142A11.18,11.18 0,0 0,18.229 54.322L18.229,102.446A11.18,11.18 0,0 0,29.409 113.626L230.654,113.626A11.18,11.18 0,0 0,241.834 102.446L241.834,54.322A11.18,11.18 0,0 0,230.654 43.142z" - android:strokeAlpha="0.11" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#5E5E5E"/> - <path - android:pathData="M230.654,43.142L29.409,43.142A11.18,11.18 0,0 0,18.229 54.322L18.229,102.446A11.18,11.18 0,0 0,29.409 113.626L230.654,113.626A11.18,11.18 0,0 0,241.834 102.446L241.834,54.322A11.18,11.18 0,0 0,230.654 43.142z" - android:strokeAlpha="0.02" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#0B57D0"/> - <path - android:pathData="M196.822,137.932L177.475,137.932A2.479,2.479 0,0 0,174.996 140.411L174.996,142.744A2.479,2.479 0,0 0,177.475 145.223L196.822,145.223A2.479,2.479 0,0 0,199.301 142.744L199.301,140.411A2.479,2.479 0,0 0,196.822 137.932z" - android:fillColor="#fff"/> - <path - android:pathData="M196.822,137.932L177.475,137.932A2.479,2.479 0,0 0,174.996 140.411L174.996,142.744A2.479,2.479 0,0 0,177.475 145.223L196.822,145.223A2.479,2.479 0,0 0,199.301 142.744L199.301,140.411A2.479,2.479 0,0 0,196.822 137.932z" - android:fillColor="#5E5E5E" - android:fillAlpha="0.11"/> - <path - android:pathData="M196.822,137.932L177.475,137.932A2.479,2.479 0,0 0,174.996 140.411L174.996,142.744A2.479,2.479 0,0 0,177.475 145.223L196.822,145.223A2.479,2.479 0,0 0,199.301 142.744L199.301,140.411A2.479,2.479 0,0 0,196.822 137.932z" - android:fillColor="#0B57D0" - android:fillAlpha="0.02"/> - <path - android:pathData="M196.822,173.174L128.865,173.174A2.479,2.479 135,0 0,126.386 175.653L126.386,180.417A2.479,2.479 135,0 0,128.865 182.896L196.822,182.896A2.479,2.479 0,0 0,199.301 180.417L199.301,175.653A2.479,2.479 0,0 0,196.822 173.174z" - android:fillColor="#fff"/> - <path - android:pathData="M196.822,173.174L128.865,173.174A2.479,2.479 135,0 0,126.386 175.653L126.386,180.417A2.479,2.479 135,0 0,128.865 182.896L196.822,182.896A2.479,2.479 0,0 0,199.301 180.417L199.301,175.653A2.479,2.479 0,0 0,196.822 173.174z" - android:fillColor="#5E5E5E" - android:fillAlpha="0.11"/> - <path - android:pathData="M196.822,173.174L128.865,173.174A2.479,2.479 135,0 0,126.386 175.653L126.386,180.417A2.479,2.479 135,0 0,128.865 182.896L196.822,182.896A2.479,2.479 0,0 0,199.301 180.417L199.301,175.653A2.479,2.479 0,0 0,196.822 173.174z" - android:fillColor="#0B57D0" - android:fillAlpha="0.02"/> - <path - android:pathData="M196.822,154.945L43.798,154.945A2.479,2.479 0,0 0,41.319 157.424L41.319,162.188A2.479,2.479 135,0 0,43.798 164.667L196.822,164.667A2.479,2.479 0,0 0,199.301 162.188L199.301,157.424A2.479,2.479 0,0 0,196.822 154.945z" - android:fillColor="#fff"/> - <path - android:pathData="M196.822,154.945L43.798,154.945A2.479,2.479 0,0 0,41.319 157.424L41.319,162.188A2.479,2.479 135,0 0,43.798 164.667L196.822,164.667A2.479,2.479 0,0 0,199.301 162.188L199.301,157.424A2.479,2.479 0,0 0,196.822 154.945z" - android:fillColor="#5E5E5E" - android:fillAlpha="0.11"/> - <path - android:pathData="M196.822,154.945L43.798,154.945A2.479,2.479 0,0 0,41.319 157.424L41.319,162.188A2.479,2.479 135,0 0,43.798 164.667L196.822,164.667A2.479,2.479 0,0 0,199.301 162.188L199.301,157.424A2.479,2.479 0,0 0,196.822 154.945z" - android:fillColor="#0B57D0" - android:fillAlpha="0.02"/> - <path - android:pathData="M233.328,141.578c0,-6.712 -5.441,-12.153 -12.153,-12.153 -6.711,0 -12.152,5.441 -12.152,12.153 0,6.711 5.441,12.152 12.152,12.152 6.712,0 12.153,-5.441 12.153,-12.152z" - android:fillColor="#34A853"/> - <path - android:pathData="M213.58,140.736h15.191v0.844L213.58,141.58v-0.844zM216.433,139.892l1.932,-5.147a0.847,0.847 0,0 1,1.055 -0.507l1.756,0.591 1.763,-0.591a0.846,0.846 0,0 1,1.055 0.507l1.925,5.147h-9.486zM217.378,142.424c1.401,0 2.566,0.979 2.869,2.287a2.316,2.316 0,0 1,1.857 -0.008,2.957 2.957,0 0,1 2.869,-2.279 2.957,2.957 0,0 1,2.954 2.954,2.957 2.957,0 0,1 -2.954,2.954 2.939,2.939 0,0 1,-2.928 -2.718c-0.253,-0.177 -0.92,-0.506 -1.739,0.017 -0.135,1.511 -1.384,2.701 -2.928,2.701a2.957,2.957 0,0 1,-2.954 -2.954,2.957 2.957,0 0,1 2.954,-2.954zM224.973,147.488a2.11,2.11 0,1 0,0 -4.22,2.11 2.11,0 0,0 0,4.22zM217.378,147.488a2.11,2.11 0,1 0,0 -4.22,2.11 2.11,0 0,0 0,4.22z" - android:fillColor="#fff"/> - <path - android:pathData="M230.654,120.918L29.409,120.918A11.18,11.18 0,0 0,18.229 132.098L18.229,180.222A11.18,11.18 0,0 0,29.409 191.402L230.654,191.402A11.18,11.18 0,0 0,241.834 180.222L241.834,132.098A11.18,11.18 0,0 0,230.654 120.918z" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#fff"/> - <path - android:pathData="M230.654,120.918L29.409,120.918A11.18,11.18 0,0 0,18.229 132.098L18.229,180.222A11.18,11.18 0,0 0,29.409 191.402L230.654,191.402A11.18,11.18 0,0 0,241.834 180.222L241.834,132.098A11.18,11.18 0,0 0,230.654 120.918z" - android:strokeAlpha="0.11" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#5E5E5E"/> - <path - android:pathData="M230.654,120.918L29.409,120.918A11.18,11.18 0,0 0,18.229 132.098L18.229,180.222A11.18,11.18 0,0 0,29.409 191.402L230.654,191.402A11.18,11.18 0,0 0,241.834 180.222L241.834,132.098A11.18,11.18 0,0 0,230.654 120.918z" - android:strokeAlpha="0.02" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#0B57D0"/> - <path - android:pathData="M196.822,216.314L162.892,216.314A2.479,2.479 0,0 0,160.413 218.793L160.413,221.126A2.479,2.479 0,0 0,162.892 223.605L196.822,223.605A2.479,2.479 0,0 0,199.301 221.126L199.301,218.793A2.479,2.479 0,0 0,196.822 216.314z" - android:fillColor="#fff"/> - <path - android:pathData="M196.822,216.314L162.892,216.314A2.479,2.479 0,0 0,160.413 218.793L160.413,221.126A2.479,2.479 0,0 0,162.892 223.605L196.822,223.605A2.479,2.479 0,0 0,199.301 221.126L199.301,218.793A2.479,2.479 0,0 0,196.822 216.314z" - android:fillColor="#5E5E5E" - android:fillAlpha="0.11"/> - <path - android:pathData="M196.822,216.314L162.892,216.314A2.479,2.479 0,0 0,160.413 218.793L160.413,221.126A2.479,2.479 0,0 0,162.892 223.605L196.822,223.605A2.479,2.479 0,0 0,199.301 221.126L199.301,218.793A2.479,2.479 0,0 0,196.822 216.314z" - android:fillColor="#0B57D0" - android:fillAlpha="0.02"/> - <path - android:pathData="M233.328,219.959c0,-6.711 -5.441,-12.152 -12.153,-12.152 -6.711,0 -12.152,5.441 -12.152,12.152 0,6.712 5.441,12.153 12.152,12.153 6.712,0 12.153,-5.441 12.153,-12.153z" + android:pathData="M198,200C198,193.373 192.627,188 186,188C179.373,188 174,193.373 174,200C174,206.627 179.373,212 186,212C192.627,212 198,206.627 198,200Z" android:fillColor="#FBBC04"/> - <group> - <clip-path - android:pathData="M231.302,209.832l-20.254,0l-0,20.254L231.302,230.086z"/> - <path - android:pathData="M215.268,217.427h3.375v-5.063h5.064v5.063h3.376l-5.908,5.908 -5.907,-5.908zM227.083,225.023v1.687h-11.815v-1.687h11.815z" - android:fillColor="#fff"/> - </group> <path - android:pathData="M230.654,199.301L29.409,199.301A11.18,11.18 0,0 0,18.229 210.481L18.229,229.439A11.18,11.18 45,0 0,29.409 240.619L230.654,240.619A11.18,11.18 0,0 0,241.834 229.439L241.834,210.481A11.18,11.18 0,0 0,230.654 199.301z" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#fff"/> - <path - android:pathData="M230.654,199.301L29.409,199.301A11.18,11.18 0,0 0,18.229 210.481L18.229,229.439A11.18,11.18 45,0 0,29.409 240.619L230.654,240.619A11.18,11.18 0,0 0,241.834 229.439L241.834,210.481A11.18,11.18 0,0 0,230.654 199.301z" - android:strokeAlpha="0.11" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#5E5E5E"/> - <path - android:pathData="M230.654,199.301L29.409,199.301A11.18,11.18 0,0 0,18.229 210.481L18.229,229.439A11.18,11.18 45,0 0,29.409 240.619L230.654,240.619A11.18,11.18 0,0 0,241.834 229.439L241.834,210.481A11.18,11.18 0,0 0,230.654 199.301z" - android:strokeAlpha="0.02" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#0B57D0"/> + android:pathData="M180.166,197.5H183.5V192.5H188.5V197.5H191.833L186,203.333L180.166,197.5ZM191.833,205V206.667H180.166V205H191.833Z" + android:fillColor="#ffffff"/> </group> <path - android:pathData="M237.779,2.43L22.283,2.43A19.853,19.853 0,0 0,2.43 22.283L2.43,510.396A19.853,19.853 0,0 0,22.283 530.249L237.779,530.249A19.853,19.853 45,0 0,257.632 510.396L257.632,22.283A19.853,19.853 135,0 0,237.779 2.43z" - android:strokeAlpha="0.16" - android:strokeWidth="4.861" + android:pathData="M195.695,180L28.305,180A10.305,10.305 0,0 0,18 190.305L18,209.695A10.305,10.305 0,0 0,28.305 220L195.695,220A10.305,10.305 135,0 0,206 209.695L206,190.305A10.305,10.305 0,0 0,195.695 180z" + android:strokeWidth="4" android:fillColor="#00000000" - android:strokeColor="#1F1F1F"/> + android:strokeColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M201.495,3L22.505,3A19.505,19.505 45,0 0,3 22.505L3,297.934A19.505,19.505 0,0 0,22.505 317.439L201.495,317.439A19.505,19.505 0,0 0,221 297.934L221,22.505A19.505,19.505 0,0 0,201.495 3z" + android:strokeWidth="6" + android:fillColor="#00000000" + android:strokeColor="@color/permission_rationale_illustration_outer_border_baseline"/> </group> </vector>
diff --git a/chrome/browser/notifications/android/java/res/drawable-night/notification_permission_rationale_dialog_header.xml b/chrome/browser/notifications/android/java/res/drawable-night/notification_permission_rationale_dialog_header.xml deleted file mode 100644 index 7bba1a01..0000000 --- a/chrome/browser/notifications/android/java/res/drawable-night/notification_permission_rationale_dialog_header.xml +++ /dev/null
@@ -1,104 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Copyright 2022 The Chromium Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.--> -<!--VectorRaster is ignored because: The image should be shown rarely enough to prioritize binary size over inflation time.--> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - tools:ignore="VectorRaster" - android:width="261dp" - android:height="271dp" - android:viewportWidth="261" - android:viewportHeight="271"> - <group> - <clip-path - android:pathData="M0,0h260.063v271H0z"/> - <group> - <clip-path - android:pathData="M22.283,2.43L237.779,2.43A19.853,19.853 0,0 1,257.632 22.283L257.632,510.396A19.853,19.853 0,0 1,237.779 530.249L22.283,530.249A19.853,19.853 0,0 1,2.43 510.396L2.43,22.283A19.853,19.853 0,0 1,22.283 2.43z"/> - <path - android:pathData="M22.283,2.43L237.779,2.43A19.853,19.853 0,0 1,257.632 22.283L257.632,510.396A19.853,19.853 0,0 1,237.779 530.249L22.283,530.249A19.853,19.853 0,0 1,2.43 510.396L2.43,22.283A19.853,19.853 0,0 1,22.283 2.43z" - android:fillColor="#1F1F1F"/> - <path - android:pathData="M22.283,2.43L237.779,2.43A19.853,19.853 0,0 1,257.632 22.283L257.632,510.396A19.853,19.853 0,0 1,237.779 530.249L22.283,530.249A19.853,19.853 0,0 1,2.43 510.396L2.43,22.283A19.853,19.853 0,0 1,22.283 2.43z" - android:fillColor="#C7C7C7" - android:fillAlpha="0.11"/> - <path - android:pathData="M22.283,2.43L237.779,2.43A19.853,19.853 0,0 1,257.632 22.283L257.632,510.396A19.853,19.853 0,0 1,237.779 530.249L22.283,530.249A19.853,19.853 0,0 1,2.43 510.396L2.43,22.283A19.853,19.853 0,0 1,22.283 2.43z" - android:fillColor="#A8C7FA" - android:fillAlpha="0.02"/> - <path - android:pathData="M219.2,17.873c-2.066,0 -3.874,0.904 -5.165,2.324l5.165,6.284 5.165,-6.284c-1.291,-1.42 -3.099,-2.324 -5.165,-2.324zM233.226,17.873l-8.608,8.608h8.608v-8.608z" - android:fillColor="#707473"/> - <path - android:pathData="M239.391,18.738v-0.86h2.152v0.86h0.934c0.314,0 0.572,0.258 0.572,0.573v6.602a0.576,0.576 0,0 1,-0.577 0.572h-4.015a0.576,0.576 0,0 1,-0.573 -0.572v-6.602c0,-0.315 0.259,-0.573 0.573,-0.573h0.934zM238.745,23.474v2.152h3.443v-6.025h-3.443v3.873z" - android:fillColor="#707473" - android:fillType="evenOdd"/> - <path - android:pathData="M242.477,26.484h-4.02a0.576,0.576 0,0 1,-0.573 -0.573V19.31c0,-0.314 0.259,-0.572 0.573,-0.572h4.02c0.314,0 0.572,0.258 0.572,0.572v6.602a0.575,0.575 0,0 1,-0.572 0.573z" - android:fillColor="#707473"/> - <path - android:pathData="M63.242,60.155L116.616,60.155A2.479,2.479 0,0 1,119.095 62.634L119.095,64.967A2.479,2.479 0,0 1,116.616 67.446L63.242,67.446A2.479,2.479 0,0 1,60.763 64.967L60.763,62.634A2.479,2.479 0,0 1,63.242 60.155z" - android:fillColor="#707473"/> - <path - android:pathData="M63.242,95.397L155.504,95.397A2.479,2.479 0,0 1,157.983 97.876L157.983,102.64A2.479,2.479 0,0 1,155.504 105.119L63.242,105.119A2.479,2.479 0,0 1,60.763 102.64L60.763,97.876A2.479,2.479 0,0 1,63.242 95.397z" - android:fillColor="#707473"/> - <path - android:pathData="M63.242,77.168L102.033,77.168A2.479,2.479 0,0 1,104.512 79.647L104.512,84.411A2.479,2.479 0,0 1,102.033 86.89L63.242,86.89A2.479,2.479 0,0 1,60.763 84.411L60.763,79.647A2.479,2.479 0,0 1,63.242 77.168z" - android:fillColor="#707473"/> - <path - android:pathData="M26.736,63.8c0,-6.711 5.44,-12.152 12.152,-12.152 6.712,0 12.153,5.44 12.153,12.152 0,6.712 -5.441,12.153 -12.153,12.153 -6.711,0 -12.152,-5.44 -12.152,-12.153z" - android:fillColor="#3982F8"/> - <path - android:pathData="M31.293,61.266v5.064h3.375l4.22,4.22L38.888,57.047l-4.22,4.22h-3.375zM42.685,63.802a3.79,3.79 0,0 0,-2.11 -3.397v6.798a3.803,3.803 0,0 0,2.11 -3.401zM40.575,56.398v1.743a5.907,5.907 0,0 1,4.22 5.659,5.907 5.907,0 0,1 -4.22,5.658v1.743c3.38,-0.768 5.908,-3.785 5.908,-7.401 0,-3.617 -2.528,-6.634 -5.908,-7.402z" - android:fillColor="#E3E3E3" - android:fillType="evenOdd"/> - <path - android:pathData="M29.409,43.141L230.654,43.141A11.18,11.18 0,0 1,241.834 54.321L241.834,102.445A11.18,11.18 0,0 1,230.654 113.625L29.409,113.625A11.18,11.18 0,0 1,18.229 102.445L18.229,54.321A11.18,11.18 0,0 1,29.409 43.141z" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#707473"/> - <path - android:pathData="M63.242,137.931L82.589,137.931A2.479,2.479 0,0 1,85.068 140.41L85.068,142.743A2.479,2.479 0,0 1,82.589 145.222L63.242,145.222A2.479,2.479 0,0 1,60.763 142.743L60.763,140.41A2.479,2.479 0,0 1,63.242 137.931z" - android:fillColor="#707473"/> - <path - android:pathData="M63.242,173.173L131.199,173.173A2.479,2.479 0,0 1,133.678 175.652L133.678,180.416A2.479,2.479 0,0 1,131.199 182.895L63.242,182.895A2.479,2.479 0,0 1,60.763 180.416L60.763,175.652A2.479,2.479 0,0 1,63.242 173.173z" - android:fillColor="#707473"/> - <path - android:pathData="M63.242,154.944L216.266,154.944A2.479,2.479 0,0 1,218.745 157.423L218.745,162.187A2.479,2.479 0,0 1,216.266 164.666L63.242,164.666A2.479,2.479 0,0 1,60.763 162.187L60.763,157.423A2.479,2.479 0,0 1,63.242 154.944z" - android:fillColor="#707473"/> - <path - android:pathData="M26.736,141.576c0,-6.711 5.44,-12.152 12.152,-12.152 6.712,0 12.153,5.441 12.153,12.152 0,6.712 -5.441,12.153 -12.153,12.153 -6.711,0 -12.152,-5.441 -12.152,-12.153z" - android:fillColor="#34A853"/> - <path - android:pathData="M46.483,140.735h-15.19v0.844h15.19v-0.844zM43.63,139.891l-1.932,-5.148a0.845,0.845 0,0 0,-1.055 -0.506l-1.755,0.591 -1.764,-0.591a0.845,0.845 0,0 0,-1.055 0.506l-1.924,5.148h9.486zM42.685,142.423a2.95,2.95 0,0 0,-2.869 2.287,2.316 2.316,0 0,0 -1.857,-0.009 2.956,2.956 0,0 0,-2.869 -2.278,2.957 2.957,0 0,0 -2.954,2.954 2.957,2.957 0,0 0,2.954 2.953,2.938 2.938,0 0,0 2.928,-2.717c0.254,-0.177 0.92,-0.507 1.739,0.017 0.135,1.51 1.384,2.7 2.928,2.7a2.957,2.957 0,0 0,2.954 -2.953,2.957 2.957,0 0,0 -2.954,-2.954zM35.09,147.486a2.11,2.11 0,1 1,0.001 -4.22,2.11 2.11,0 0,1 0,4.22zM42.685,147.486a2.11,2.11 0,1 1,0.001 -4.22,2.11 2.11,0 0,1 0,4.22z" - android:fillColor="#E3E3E3"/> - <path - android:pathData="M29.409,120.917L230.654,120.917A11.18,11.18 0,0 1,241.834 132.097L241.834,180.221A11.18,11.18 0,0 1,230.654 191.401L29.409,191.401A11.18,11.18 0,0 1,18.229 180.221L18.229,132.097A11.18,11.18 0,0 1,29.409 120.917z" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#707473"/> - <path - android:pathData="M63.242,216.314L97.172,216.314A2.479,2.479 0,0 1,99.651 218.793L99.651,221.126A2.479,2.479 0,0 1,97.172 223.605L63.242,223.605A2.479,2.479 0,0 1,60.763 221.126L60.763,218.793A2.479,2.479 0,0 1,63.242 216.314z" - android:fillColor="#707473"/> - <path - android:pathData="M26.736,219.96c0,-6.712 5.44,-12.153 12.152,-12.153 6.712,0 12.153,5.441 12.153,12.153 0,6.711 -5.441,12.152 -12.153,12.152 -6.711,0 -12.152,-5.441 -12.152,-12.152z" - android:fillColor="#FBBC04"/> - <group> - <clip-path - android:pathData="M28.761,209.833h20.254v20.254L28.761,230.087z"/> - <path - android:pathData="M44.796,217.428L41.42,217.428v-5.064h-5.063v5.064L32.98,217.428l5.907,5.907 5.908,-5.907zM32.981,225.023v1.688h11.815v-1.688L32.98,225.023z" - android:fillColor="#E3E3E3"/> - </group> - <path - android:pathData="M29.409,199.3L230.654,199.3A11.18,11.18 0,0 1,241.834 210.48L241.834,229.438A11.18,11.18 0,0 1,230.654 240.618L29.409,240.618A11.18,11.18 0,0 1,18.229 229.438L18.229,210.48A11.18,11.18 0,0 1,29.409 199.3z" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#707473"/> - </group> - <path - android:pathData="M22.283,2.43L237.779,2.43A19.853,19.853 0,0 1,257.632 22.283L257.632,510.396A19.853,19.853 0,0 1,237.779 530.249L22.283,530.249A19.853,19.853 0,0 1,2.43 510.396L2.43,22.283A19.853,19.853 0,0 1,22.283 2.43z" - android:strokeWidth="4.861" - android:fillColor="#00000000" - android:strokeColor="#808483"/> - </group> -</vector>
diff --git a/chrome/browser/notifications/android/java/res/drawable/notification_permission_rationale_dialog_header.xml b/chrome/browser/notifications/android/java/res/drawable/notification_permission_rationale_dialog_header.xml index bc4390e..8404185 100644 --- a/chrome/browser/notifications/android/java/res/drawable/notification_permission_rationale_dialog_header.xml +++ b/chrome/browser/notifications/android/java/res/drawable/notification_permission_rationale_dialog_header.xml
@@ -4,187 +4,95 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:ignore="VectorRaster" - android:width="261dp" - android:height="271dp" - android:viewportWidth="261" - android:viewportHeight="271"> + android:width="224dp" + android:height="245dp" + android:viewportWidth="224" + android:viewportHeight="245"> <group> <clip-path - android:pathData="M0,0h260.063v271H0z"/> + android:pathData="M0,0h224v245h-224z"/> + <path + android:pathData="M183,16.832C181,16.832 179.25,17.707 178,19.082L183,25.165L188,19.082C186.75,17.707 185,16.832 183,16.832Z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M196.672,16.832L188.339,25.165H196.672V16.832Z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M202.457,17.671V16.838H204.541V17.671H205.445C205.749,17.671 205.999,17.921 205.999,18.226V22.255V24.617C205.999,24.921 205.749,25.171 205.441,25.171H201.553C201.249,25.171 200.999,24.921 200.999,24.617V22.255V18.226C200.999,17.921 201.249,17.671 201.553,17.671H202.457ZM201.831,22.256V24.34H205.164V22.256V18.506H201.831V22.256Z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline" + android:fillType="evenOdd"/> + <path + android:pathData="M205.446,25.169H201.554C201.25,25.169 201,24.919 201,24.615V18.223C201,17.919 201.25,17.669 201.554,17.669H205.446C205.75,17.669 206,17.919 206,18.223V24.615C206,24.919 205.75,25.169 205.446,25.169Z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M59.8,55L104.2,55A1.8,1.8 0,0 1,106 56.8L106,59.2A1.8,1.8 0,0 1,104.2 61L59.8,61A1.8,1.8 0,0 1,58 59.2L58,56.8A1.8,1.8 0,0 1,59.8 55z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M60,83L136,83A2,2 0,0 1,138 85L138,89A2,2 0,0 1,136 91L60,91A2,2 0,0 1,58 89L58,85A2,2 0,0 1,60 83z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M60,69L92,69A2,2 0,0 1,94 71L94,75A2,2 0,0 1,92 77L60,77A2,2 0,0 1,58 75L58,71A2,2 0,0 1,60 69z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M26,58C26,51.373 31.373,46 38,46C44.627,46 50,51.373 50,58C50,64.627 44.627,70 38,70C31.373,70 26,64.627 26,58Z" + android:fillColor="#3982F8"/> + <path + android:pathData="M30.5,55.498V60.498H33.833L38,64.664V51.331L33.833,55.498H30.5ZM41.749,58.001C41.749,56.53 40.899,55.26 39.666,54.647V61.36C40.899,60.743 41.749,59.472 41.749,58.001ZM39.666,50.691V52.412C42.074,53.128 43.833,55.357 43.833,57.999C43.833,60.641 42.074,62.87 39.666,63.587V65.307C43.003,64.549 45.499,61.57 45.499,57.999C45.499,54.428 43.003,51.449 39.666,50.691Z" + android:fillColor="#ffffff" + android:fillType="evenOdd"/> + <path + android:pathData="M28.305,38L195.695,38A10.305,10.305 0,0 1,206 48.305L206,88.695A10.305,10.305 0,0 1,195.695 99L28.305,99A10.305,10.305 0,0 1,18 88.695L18,48.305A10.305,10.305 0,0 1,28.305 38z" + android:strokeWidth="4" + android:fillColor="#00000000" + android:strokeColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M59.8,126L76.2,126A1.8,1.8 0,0 1,78 127.8L78,130.2A1.8,1.8 0,0 1,76.2 132L59.8,132A1.8,1.8 0,0 1,58 130.2L58,127.8A1.8,1.8 0,0 1,59.8 126z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M60,154L116,154A2,2 0,0 1,118 156L118,160A2,2 0,0 1,116 162L60,162A2,2 0,0 1,58 160L58,156A2,2 0,0 1,60 154z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M60,140L188,140A2,2 0,0 1,190 142L190,146A2,2 0,0 1,188 148L60,148A2,2 0,0 1,58 146L58,142A2,2 0,0 1,60 140z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M26,129C26,122.373 31.373,117 38,117C44.627,117 50,122.373 50,129C50,135.627 44.627,141 38,141C31.373,141 26,135.627 26,129Z" + android:fillColor="#34A853"/> + <path + android:pathData="M45.5,128.169H30.5V129.003H45.5V128.169Z" + android:fillColor="#ffffff"/> + <path + android:pathData="M42.683,127.336L40.775,122.253C40.617,121.836 40.158,121.611 39.733,121.753L38,122.336L36.258,121.753C35.833,121.611 35.375,121.836 35.217,122.253L33.317,127.336H42.683Z" + android:fillColor="#ffffff"/> + <path + android:pathData="M41.75,129.836C40.367,129.836 39.217,130.803 38.917,132.094C38.217,131.794 37.567,131.878 37.083,132.086C36.775,130.794 35.625,129.836 34.25,129.836C32.642,129.836 31.333,131.144 31.333,132.753C31.333,134.361 32.642,135.669 34.25,135.669C35.783,135.669 37.025,134.486 37.142,132.986C37.392,132.811 38.05,132.486 38.858,133.003C38.992,134.494 40.225,135.669 41.75,135.669C43.358,135.669 44.667,134.361 44.667,132.753C44.667,131.144 43.358,129.836 41.75,129.836ZM34.25,134.836C33.1,134.836 32.167,133.903 32.167,132.753C32.167,131.603 33.1,130.669 34.25,130.669C35.4,130.669 36.333,131.603 36.333,132.753C36.333,133.903 35.4,134.836 34.25,134.836ZM41.75,134.836C40.6,134.836 39.667,133.903 39.667,132.753C39.667,131.603 40.6,130.669 41.75,130.669C42.9,130.669 43.833,131.603 43.833,132.753C43.833,133.903 42.9,134.836 41.75,134.836Z" + android:fillColor="#ffffff"/> + <path + android:pathData="M28.305,109L195.695,109A10.305,10.305 0,0 1,206 119.305L206,159.695A10.305,10.305 0,0 1,195.695 170L28.305,170A10.305,10.305 0,0 1,18 159.695L18,119.305A10.305,10.305 0,0 1,28.305 109z" + android:strokeWidth="4" + android:fillColor="#00000000" + android:strokeColor="@color/permission_rationale_illustration_inner_border_baseline"/> <group> <clip-path - android:pathData="M22.284,2.43L237.78,2.43A19.853,19.853 0,0 1,257.633 22.283L257.633,510.396A19.853,19.853 0,0 1,237.78 530.249L22.284,530.249A19.853,19.853 0,0 1,2.431 510.396L2.431,22.283A19.853,19.853 0,0 1,22.284 2.43z"/> + android:pathData="M28.305,180L195.695,180A10.305,10.305 0,0 1,206 190.305L206,209.695A10.305,10.305 0,0 1,195.695 220L28.305,220A10.305,10.305 0,0 1,18 209.695L18,190.305A10.305,10.305 0,0 1,28.305 180z"/> <path - android:pathData="M22.284,2.43L237.78,2.43A19.853,19.853 0,0 1,257.633 22.283L257.633,510.396A19.853,19.853 0,0 1,237.78 530.249L22.284,530.249A19.853,19.853 0,0 1,2.431 510.396L2.431,22.283A19.853,19.853 0,0 1,22.284 2.43z" - android:fillColor="#fff"/> + android:pathData="M59.8,197L88.2,197A1.8,1.8 0,0 1,90 198.8L90,201.2A1.8,1.8 0,0 1,88.2 203L59.8,203A1.8,1.8 0,0 1,58 201.2L58,198.8A1.8,1.8 0,0 1,59.8 197z" + android:fillColor="@color/permission_rationale_illustration_inner_border_baseline"/> <path - android:pathData="M219.2,17.873c-2.065,0 -3.873,0.904 -5.164,2.324l5.164,6.284 5.165,-6.284c-1.291,-1.42 -3.099,-2.324 -5.165,-2.324zM233.227,17.873l-8.608,8.608h8.608v-8.608z" - android:fillColor="#1F1F1F" - android:fillAlpha="0.16"/> - <path - android:pathData="M239.391,18.74v-0.86h2.152v0.86h0.934c0.314,0 0.573,0.258 0.573,0.572v6.602a0.576,0.576 0,0 1,-0.577 0.573h-4.016a0.575,0.575 0,0 1,-0.572 -0.572v-6.603c0,-0.314 0.258,-0.572 0.572,-0.572h0.934zM238.745,23.476v2.152h3.444v-6.026h-3.444v3.874z" - android:fillColor="#DBDBDB" - android:fillType="evenOdd"/> - <path - android:pathData="M242.477,26.485h-4.02a0.575,0.575 0,0 1,-0.572 -0.573V19.31c0,-0.314 0.258,-0.572 0.572,-0.572h4.02c0.314,0 0.573,0.258 0.573,0.572v6.602a0.576,0.576 0,0 1,-0.573 0.573z" - android:fillColor="#DBDBDB"/> - <path - android:pathData="M63.241,60.156L116.615,60.156A2.479,2.479 0,0 1,119.094 62.635L119.094,64.968A2.479,2.479 0,0 1,116.615 67.447L63.241,67.447A2.479,2.479 0,0 1,60.762 64.968L60.762,62.635A2.479,2.479 0,0 1,63.241 60.156z" - android:fillColor="#fff"/> - <path - android:pathData="M63.241,60.156L116.615,60.156A2.479,2.479 0,0 1,119.094 62.635L119.094,64.968A2.479,2.479 0,0 1,116.615 67.447L63.241,67.447A2.479,2.479 0,0 1,60.762 64.968L60.762,62.635A2.479,2.479 0,0 1,63.241 60.156z" - android:fillColor="#5E5E5E" - android:fillAlpha="0.11"/> - <path - android:pathData="M63.241,60.156L116.615,60.156A2.479,2.479 0,0 1,119.094 62.635L119.094,64.968A2.479,2.479 0,0 1,116.615 67.447L63.241,67.447A2.479,2.479 0,0 1,60.762 64.968L60.762,62.635A2.479,2.479 0,0 1,63.241 60.156z" - android:fillColor="#0B57D0" - android:fillAlpha="0.02"/> - <path - android:pathData="M63.241,95.398L155.503,95.398A2.479,2.479 0,0 1,157.982 97.877L157.982,102.641A2.479,2.479 0,0 1,155.503 105.12L63.241,105.12A2.479,2.479 0,0 1,60.762 102.641L60.762,97.877A2.479,2.479 0,0 1,63.241 95.398z" - android:fillColor="#fff"/> - <path - android:pathData="M63.241,95.398L155.503,95.398A2.479,2.479 0,0 1,157.982 97.877L157.982,102.641A2.479,2.479 0,0 1,155.503 105.12L63.241,105.12A2.479,2.479 0,0 1,60.762 102.641L60.762,97.877A2.479,2.479 0,0 1,63.241 95.398z" - android:fillColor="#5E5E5E" - android:fillAlpha="0.11"/> - <path - android:pathData="M63.241,95.398L155.503,95.398A2.479,2.479 0,0 1,157.982 97.877L157.982,102.641A2.479,2.479 0,0 1,155.503 105.12L63.241,105.12A2.479,2.479 0,0 1,60.762 102.641L60.762,97.877A2.479,2.479 0,0 1,63.241 95.398z" - android:fillColor="#0B57D0" - android:fillAlpha="0.02"/> - <path - android:pathData="M63.241,77.169L102.032,77.169A2.479,2.479 0,0 1,104.511 79.648L104.511,84.412A2.479,2.479 0,0 1,102.032 86.891L63.241,86.891A2.479,2.479 0,0 1,60.762 84.412L60.762,79.648A2.479,2.479 0,0 1,63.241 77.169z" - android:fillColor="#fff"/> - <path - android:pathData="M63.241,77.169L102.032,77.169A2.479,2.479 0,0 1,104.511 79.648L104.511,84.412A2.479,2.479 0,0 1,102.032 86.891L63.241,86.891A2.479,2.479 0,0 1,60.762 84.412L60.762,79.648A2.479,2.479 0,0 1,63.241 77.169z" - android:fillColor="#5E5E5E" - android:fillAlpha="0.11"/> - <path - android:pathData="M63.241,77.169L102.032,77.169A2.479,2.479 0,0 1,104.511 79.648L104.511,84.412A2.479,2.479 0,0 1,102.032 86.891L63.241,86.891A2.479,2.479 0,0 1,60.762 84.412L60.762,79.648A2.479,2.479 0,0 1,63.241 77.169z" - android:fillColor="#0B57D0" - android:fillAlpha="0.02"/> - <path - android:pathData="M26.735,63.802c0,-6.712 5.441,-12.152 12.153,-12.152 6.711,0 12.152,5.44 12.152,12.152 0,6.712 -5.44,12.152 -12.152,12.152 -6.712,0 -12.153,-5.44 -12.153,-12.152z" - android:fillColor="#3982F8"/> - <path - android:pathData="M31.292,61.268v5.064h3.376l4.22,4.22L38.888,57.047l-4.22,4.22h-3.376zM42.685,63.803c0,-1.49 -0.861,-2.776 -2.11,-3.396v6.797a3.803,3.803 0,0 0,2.11 -3.4zM40.575,56.4v1.742a5.907,5.907 0,0 1,4.22 5.659,5.907 5.907,0 0,1 -4.22,5.659v1.742c3.38,-0.768 5.907,-3.785 5.907,-7.401 0,-3.616 -2.527,-6.633 -5.907,-7.401z" - android:fillColor="#fff" - android:fillType="evenOdd"/> - <path - android:pathData="M29.409,43.142L230.654,43.142A11.18,11.18 0,0 1,241.834 54.322L241.834,102.446A11.18,11.18 0,0 1,230.654 113.626L29.409,113.626A11.18,11.18 0,0 1,18.229 102.446L18.229,54.322A11.18,11.18 0,0 1,29.409 43.142z" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#fff"/> - <path - android:pathData="M29.409,43.142L230.654,43.142A11.18,11.18 0,0 1,241.834 54.322L241.834,102.446A11.18,11.18 0,0 1,230.654 113.626L29.409,113.626A11.18,11.18 0,0 1,18.229 102.446L18.229,54.322A11.18,11.18 0,0 1,29.409 43.142z" - android:strokeAlpha="0.11" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#5E5E5E"/> - <path - android:pathData="M29.409,43.142L230.654,43.142A11.18,11.18 0,0 1,241.834 54.322L241.834,102.446A11.18,11.18 0,0 1,230.654 113.626L29.409,113.626A11.18,11.18 0,0 1,18.229 102.446L18.229,54.322A11.18,11.18 0,0 1,29.409 43.142z" - android:strokeAlpha="0.02" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#0B57D0"/> - <path - android:pathData="M63.241,137.932L82.588,137.932A2.479,2.479 0,0 1,85.067 140.411L85.067,142.744A2.479,2.479 0,0 1,82.588 145.223L63.241,145.223A2.479,2.479 0,0 1,60.762 142.744L60.762,140.411A2.479,2.479 0,0 1,63.241 137.932z" - android:fillColor="#fff"/> - <path - android:pathData="M63.241,137.932L82.588,137.932A2.479,2.479 0,0 1,85.067 140.411L85.067,142.744A2.479,2.479 0,0 1,82.588 145.223L63.241,145.223A2.479,2.479 0,0 1,60.762 142.744L60.762,140.411A2.479,2.479 0,0 1,63.241 137.932z" - android:fillColor="#5E5E5E" - android:fillAlpha="0.11"/> - <path - android:pathData="M63.241,137.932L82.588,137.932A2.479,2.479 0,0 1,85.067 140.411L85.067,142.744A2.479,2.479 0,0 1,82.588 145.223L63.241,145.223A2.479,2.479 0,0 1,60.762 142.744L60.762,140.411A2.479,2.479 0,0 1,63.241 137.932z" - android:fillColor="#0B57D0" - android:fillAlpha="0.02"/> - <path - android:pathData="M63.241,173.174L131.198,173.174A2.479,2.479 0,0 1,133.677 175.653L133.677,180.417A2.479,2.479 0,0 1,131.198 182.896L63.241,182.896A2.479,2.479 0,0 1,60.762 180.417L60.762,175.653A2.479,2.479 0,0 1,63.241 173.174z" - android:fillColor="#fff"/> - <path - android:pathData="M63.241,173.174L131.198,173.174A2.479,2.479 0,0 1,133.677 175.653L133.677,180.417A2.479,2.479 0,0 1,131.198 182.896L63.241,182.896A2.479,2.479 0,0 1,60.762 180.417L60.762,175.653A2.479,2.479 0,0 1,63.241 173.174z" - android:fillColor="#5E5E5E" - android:fillAlpha="0.11"/> - <path - android:pathData="M63.241,173.174L131.198,173.174A2.479,2.479 0,0 1,133.677 175.653L133.677,180.417A2.479,2.479 0,0 1,131.198 182.896L63.241,182.896A2.479,2.479 0,0 1,60.762 180.417L60.762,175.653A2.479,2.479 0,0 1,63.241 173.174z" - android:fillColor="#0B57D0" - android:fillAlpha="0.02"/> - <path - android:pathData="M63.241,154.945L216.265,154.945A2.479,2.479 0,0 1,218.744 157.424L218.744,162.188A2.479,2.479 0,0 1,216.265 164.667L63.241,164.667A2.479,2.479 0,0 1,60.762 162.188L60.762,157.424A2.479,2.479 0,0 1,63.241 154.945z" - android:fillColor="#fff"/> - <path - android:pathData="M63.241,154.945L216.265,154.945A2.479,2.479 0,0 1,218.744 157.424L218.744,162.188A2.479,2.479 0,0 1,216.265 164.667L63.241,164.667A2.479,2.479 0,0 1,60.762 162.188L60.762,157.424A2.479,2.479 0,0 1,63.241 154.945z" - android:fillColor="#5E5E5E" - android:fillAlpha="0.11"/> - <path - android:pathData="M63.241,154.945L216.265,154.945A2.479,2.479 0,0 1,218.744 157.424L218.744,162.188A2.479,2.479 0,0 1,216.265 164.667L63.241,164.667A2.479,2.479 0,0 1,60.762 162.188L60.762,157.424A2.479,2.479 0,0 1,63.241 154.945z" - android:fillColor="#0B57D0" - android:fillAlpha="0.02"/> - <path - android:pathData="M26.735,141.578c0,-6.712 5.441,-12.153 12.153,-12.153 6.711,0 12.152,5.441 12.152,12.153 0,6.711 -5.44,12.152 -12.152,12.152 -6.712,0 -12.153,-5.441 -12.153,-12.152z" - android:fillColor="#34A853"/> - <path - android:pathData="M46.483,140.736L31.292,140.736v0.844h15.19v-0.844zM43.63,139.893l-1.933,-5.148a0.847,0.847 0,0 0,-1.054 -0.507l-1.756,0.591 -1.764,-0.591a0.847,0.847 0,0 0,-1.054 0.507l-1.925,5.148h9.486zM42.685,142.424a2.95,2.95 0,0 0,-2.87 2.287,2.32 2.32,0 0,0 -1.856,-0.008 2.957,2.957 0,0 0,-2.87 -2.279,2.957 2.957,0 0,0 -2.953,2.954 2.957,2.957 0,0 0,2.954 2.954,2.938 2.938,0 0,0 2.928,-2.718c0.253,-0.177 0.92,-0.506 1.739,0.017 0.135,1.511 1.384,2.701 2.928,2.701a2.957,2.957 0,0 0,2.954 -2.954,2.957 2.957,0 0,0 -2.954,-2.954zM35.09,147.488a2.11,2.11 0,1 1,0.001 -4.221,2.11 2.11,0 0,1 -0.001,4.221zM42.685,147.488a2.11,2.11 0,1 1,0.001 -4.221,2.11 2.11,0 0,1 -0.001,4.221z" - android:fillColor="#fff"/> - <path - android:pathData="M29.409,120.918L230.654,120.918A11.18,11.18 0,0 1,241.834 132.098L241.834,180.222A11.18,11.18 0,0 1,230.654 191.402L29.409,191.402A11.18,11.18 0,0 1,18.229 180.222L18.229,132.098A11.18,11.18 0,0 1,29.409 120.918z" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#fff"/> - <path - android:pathData="M29.409,120.918L230.654,120.918A11.18,11.18 0,0 1,241.834 132.098L241.834,180.222A11.18,11.18 0,0 1,230.654 191.402L29.409,191.402A11.18,11.18 0,0 1,18.229 180.222L18.229,132.098A11.18,11.18 0,0 1,29.409 120.918z" - android:strokeAlpha="0.11" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#5E5E5E"/> - <path - android:pathData="M29.409,120.918L230.654,120.918A11.18,11.18 0,0 1,241.834 132.098L241.834,180.222A11.18,11.18 0,0 1,230.654 191.402L29.409,191.402A11.18,11.18 0,0 1,18.229 180.222L18.229,132.098A11.18,11.18 0,0 1,29.409 120.918z" - android:strokeAlpha="0.02" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#0B57D0"/> - <path - android:pathData="M63.241,216.314L97.171,216.314A2.479,2.479 0,0 1,99.65 218.793L99.65,221.126A2.479,2.479 0,0 1,97.171 223.605L63.241,223.605A2.479,2.479 0,0 1,60.762 221.126L60.762,218.793A2.479,2.479 0,0 1,63.241 216.314z" - android:fillColor="#fff"/> - <path - android:pathData="M63.241,216.314L97.171,216.314A2.479,2.479 0,0 1,99.65 218.793L99.65,221.126A2.479,2.479 0,0 1,97.171 223.605L63.241,223.605A2.479,2.479 0,0 1,60.762 221.126L60.762,218.793A2.479,2.479 0,0 1,63.241 216.314z" - android:fillColor="#5E5E5E" - android:fillAlpha="0.11"/> - <path - android:pathData="M63.241,216.314L97.171,216.314A2.479,2.479 0,0 1,99.65 218.793L99.65,221.126A2.479,2.479 0,0 1,97.171 223.605L63.241,223.605A2.479,2.479 0,0 1,60.762 221.126L60.762,218.793A2.479,2.479 0,0 1,63.241 216.314z" - android:fillColor="#0B57D0" - android:fillAlpha="0.02"/> - <path - android:pathData="M26.735,219.959c0,-6.711 5.441,-12.152 12.153,-12.152 6.711,0 12.152,5.441 12.152,12.152 0,6.712 -5.44,12.153 -12.152,12.153 -6.712,0 -12.153,-5.441 -12.153,-12.153z" + android:pathData="M26,200C26,193.373 31.373,188 38,188C44.627,188 50,193.373 50,200C50,206.627 44.627,212 38,212C31.373,212 26,206.627 26,200Z" android:fillColor="#FBBC04"/> - <group> - <clip-path - android:pathData="M28.76,209.832h20.254v20.254L28.76,230.086z"/> - <path - android:pathData="M44.795,217.427L41.42,217.427v-5.063h-5.064v5.063L32.98,217.427l5.908,5.908 5.907,-5.908zM32.98,225.023v1.688h11.815v-1.688L32.98,225.023z" - android:fillColor="#fff"/> - </group> <path - android:pathData="M29.409,199.301L230.654,199.301A11.18,11.18 0,0 1,241.834 210.481L241.834,229.439A11.18,11.18 0,0 1,230.654 240.619L29.409,240.619A11.18,11.18 0,0 1,18.229 229.439L18.229,210.481A11.18,11.18 0,0 1,29.409 199.301z" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#fff"/> - <path - android:pathData="M29.409,199.301L230.654,199.301A11.18,11.18 0,0 1,241.834 210.481L241.834,229.439A11.18,11.18 0,0 1,230.654 240.619L29.409,240.619A11.18,11.18 0,0 1,18.229 229.439L18.229,210.481A11.18,11.18 0,0 1,29.409 199.301z" - android:strokeAlpha="0.11" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#5E5E5E"/> - <path - android:pathData="M29.409,199.301L230.654,199.301A11.18,11.18 0,0 1,241.834 210.481L241.834,229.439A11.18,11.18 0,0 1,230.654 240.619L29.409,240.619A11.18,11.18 0,0 1,18.229 229.439L18.229,210.481A11.18,11.18 0,0 1,29.409 199.301z" - android:strokeAlpha="0.02" - android:strokeWidth="2.43" - android:fillColor="#00000000" - android:strokeColor="#0B57D0"/> + android:pathData="M43.834,197.5H40.5V192.5H35.5V197.5H32.167L38,203.333L43.834,197.5ZM32.167,205V206.667H43.834V205H32.167Z" + android:fillColor="#ffffff"/> </group> <path - android:pathData="M22.284,2.43L237.78,2.43A19.853,19.853 0,0 1,257.633 22.283L257.633,510.396A19.853,19.853 0,0 1,237.78 530.249L22.284,530.249A19.853,19.853 0,0 1,2.431 510.396L2.431,22.283A19.853,19.853 0,0 1,22.284 2.43z" - android:strokeAlpha="0.16" - android:strokeWidth="4.861" + android:pathData="M28.305,180L195.695,180A10.305,10.305 0,0 1,206 190.305L206,209.695A10.305,10.305 0,0 1,195.695 220L28.305,220A10.305,10.305 0,0 1,18 209.695L18,190.305A10.305,10.305 0,0 1,28.305 180z" + android:strokeWidth="4" android:fillColor="#00000000" - android:strokeColor="#1F1F1F"/> + android:strokeColor="@color/permission_rationale_illustration_inner_border_baseline"/> + <path + android:pathData="M22.505,3L201.495,3A19.505,19.505 0,0 1,221 22.505L221,297.934A19.505,19.505 0,0 1,201.495 317.439L22.505,317.439A19.505,19.505 0,0 1,3 297.934L3,22.505A19.505,19.505 0,0 1,22.505 3z" + android:strokeWidth="6" + android:fillColor="#00000000" + android:strokeColor="@color/permission_rationale_illustration_outer_border_baseline"/> </group> </vector>
diff --git a/chrome/browser/notifications/android/java/res/values-night/colors.xml b/chrome/browser/notifications/android/java/res/values-night/colors.xml new file mode 100644 index 0000000..21e8df6b --- /dev/null +++ b/chrome/browser/notifications/android/java/res/values-night/colors.xml
@@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2022 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. --> +<resources> + <color name="permission_rationale_illustration_outer_border_baseline">@color/baseline_neutral_variant_400</color> + <color name="permission_rationale_illustration_inner_border_baseline">@color/baseline_neutral_variant_400</color> +</resources> \ No newline at end of file
diff --git a/chrome/browser/notifications/android/java/res/values/colors.xml b/chrome/browser/notifications/android/java/res/values/colors.xml new file mode 100644 index 0000000..5f3ae12 --- /dev/null +++ b/chrome/browser/notifications/android/java/res/values/colors.xml
@@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2022 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. --> +<resources> + <color name="permission_rationale_illustration_outer_border_baseline">@color/default_bg_color_light_elev_4_baseline</color> + <color name="permission_rationale_illustration_inner_border_baseline">@color/default_bg_color_light_elev_2_baseline</color> +</resources> \ No newline at end of file
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionController.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionController.java index 6ecadf7..efd5895 100644 --- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionController.java +++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionController.java
@@ -33,6 +33,9 @@ /** Field trial param controlling rationale behavior. */ public static final String FIELD_TRIAL_ALWAYS_SHOW_RATIONALE_BEFORE_REQUESTING_PERMISSION = "always_show_rationale_before_requesting_permission"; + /** Field trial param controlling number of days between permission requests. */ + public static final String FIELD_TRIAL_PERMISSION_REQUEST_INTERVAL_DAYS = + "permission_request_interval_days"; /** Refers to what type of permission UI should be shown. */ @IntDef({PermissionRequestMode.DO_NOT_REQUEST, PermissionRequestMode.REQUEST_ANDROID_PERMISSION, @@ -61,8 +64,6 @@ void showRationaleUi(Callback<Boolean> callback); } - private static final long PERMISSION_REQUEST_RETRIGGER_INTERVAL = TimeUnit.DAYS.toMillis(7); - private static final UnownedUserDataKey<NotificationPermissionController> KEY = new UnownedUserDataKey<>(NotificationPermissionController.class); @@ -248,7 +249,19 @@ if (lastRequestTimestamp == 0) return false; long elapsedTime = System.currentTimeMillis() - lastRequestTimestamp; - return elapsedTime > PERMISSION_REQUEST_RETRIGGER_INTERVAL; + return elapsedTime > getPermissionRequestRetriggerIntervalMs(); + } + + /** + * Gets the amount of time to wait between permission requests in milliseconds. + */ + private static long getPermissionRequestRetriggerIntervalMs() { + // Get number of days from param, or use 7 days as default. + int retriggerIntervalDays = ChromeFeatureList.getFieldTrialParamByFeatureAsInt( + ChromeFeatureList.NOTIFICATION_PERMISSION_VARIANT, + FIELD_TRIAL_PERMISSION_REQUEST_INTERVAL_DAYS, /* defaultValue = */ 7); + + return TimeUnit.DAYS.toMillis(retriggerIntervalDays); } private static boolean shouldAlwaysShowRationaleFirst() {
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionControllerTest.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionControllerTest.java index b4869f943..18c9ea1 100644 --- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionControllerTest.java +++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionControllerTest.java
@@ -711,4 +711,49 @@ /* expectedTimes= */ 1); }); } + + @Test + public void testNotificationPrompt_usesWaitIntervalFromFieldTrialParams() { + ShadowBuildInfo.setIsAtLeastT(true); + mActivityScenarios.getScenario().onActivity(activity -> { + TestRationaleDelegate rationaleDelegate = new TestRationaleDelegate(); + NotificationPermissionController notificationPermissionController = + createNotificationPermissionController(rationaleDelegate, activity); + + // Set field trial params to wait 14 days. + FeatureList.TestValues testValues = new FeatureList.TestValues(); + testValues.addFieldTrialParamOverride(ChromeFeatureList.NOTIFICATION_PERMISSION_VARIANT, + NotificationPermissionController.FIELD_TRIAL_PERMISSION_REQUEST_INTERVAL_DAYS, + "14"); + FeatureList.setTestValues(testValues); + + // Show and reject OS prompt for the first time. + setShouldShowRequestPermissionRationale(activity, false); + notificationPermissionController.requestPermissionIfNeeded(); + setShouldShowRequestPermissionRationale(activity, true); + long requestTimestampAfterFirstStartup = + PermissionPrefs.getAndroidNotificationPermissionRequestTimestamp(); + + // Wait 10 days, nothing should happen yet. + ShadowSystemClock.advanceBy(Duration.ofDays(10)); + notificationPermissionController.requestPermissionIfNeeded(); + + long requestTimestampAfterSecondStartup = + PermissionPrefs.getAndroidNotificationPermissionRequestTimestamp(); + int rationaleCallCountAfterSecondStartup = rationaleDelegate.getCallCount(); + + // Wait 5 more days, now we should show the rationale. + ShadowSystemClock.advanceBy(Duration.ofDays(5)); + rationaleDelegate.setDialogAction(DialogDismissalCause.NEGATIVE_BUTTON_CLICKED); + notificationPermissionController.requestPermissionIfNeeded(); + int rationaleCallCountAfterThirdStartup = rationaleDelegate.getCallCount(); + + // The second call to requestPermissionIfNeeded shouldn't show a rationale or OS prompt. + assertEquals(requestTimestampAfterFirstStartup, requestTimestampAfterSecondStartup); + assertEquals(0, rationaleCallCountAfterSecondStartup); + + // The third call should have shown the rationale. + assertEquals(1, rationaleCallCountAfterThirdStartup); + }); + } }
diff --git a/chrome/browser/optimization_guide/page_content_annotations_service_browsertest.cc b/chrome/browser/optimization_guide/page_content_annotations_service_browsertest.cc index 4bf2462..db08205 100644 --- a/chrome/browser/optimization_guide/page_content_annotations_service_browsertest.cc +++ b/chrome/browser/optimization_guide/page_content_annotations_service_browsertest.cc
@@ -215,8 +215,14 @@ base::test::ScopedFeatureList scoped_feature_list_; }; +// TODO(crbug.com/1307251): Failing on Win 7 and also on Mac 11. +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) +#define MAYBE_E2EWithGoldenTestData DISABLED_E2EWithGoldenTestData +#else +#define MAYBE_E2EWithGoldenTestData E2EWithGoldenTestData +#endif IN_PROC_BROWSER_TEST_F(PageContentAnnotationsServicePageTopicsBrowserTest, - E2EWithGoldenTestData) { + MAYBE_E2EWithGoldenTestData) { PageContentAnnotationsService* service = PageContentAnnotationsServiceFactory::GetForProfile(browser()->profile()); ASSERT_TRUE(service);
diff --git a/chrome/browser/permissions/prediction_based_permission_ui_selector.cc b/chrome/browser/permissions/prediction_based_permission_ui_selector.cc index 7f3ae4d..4a7a648 100644 --- a/chrome/browser/permissions/prediction_based_permission_ui_selector.cc +++ b/chrome/browser/permissions/prediction_based_permission_ui_selector.cc
@@ -135,7 +135,7 @@ if (ShouldPredictionTriggerQuietUi( likelihood_override_for_testing_.value())) { std::move(callback_).Run( - Decision(QuietUiReason::kPredictedVeryUnlikelyGrant, + Decision(QuietUiReason::kServicePredictedVeryUnlikelyGrant, Decision::ShowNoWarning())); } else { std::move(callback_).Run(Decision::UseNormalUiAndShowNoWarning()); @@ -242,14 +242,13 @@ bool response_from_cache, const absl::optional<permissions::GeneratePredictionsResponse>& response) { request_.reset(); - if (!lookup_succesful || !response || response->prediction_size() == 0) { - VLOG(1) << "[CPSS] Prediction service request failed"; - std::move(callback_).Run(Decision::UseNormalUiAndShowNoWarning()); + if (!callback_) { + VLOG(1) << "[CPSS] Prediction service response ignored as the request is " + "canceled"; return; } - - if (ShouldHoldBack(is_on_device, request_type)) { - VLOG(1) << "[CPSS] Prediction service response held back"; + if (!lookup_succesful || !response || response->prediction_size() == 0) { + VLOG(1) << "[CPSS] Prediction service request failed"; std::move(callback_).Run(Decision::UseNormalUiAndShowNoWarning()); return; } @@ -257,17 +256,27 @@ last_request_grant_likelihood_ = response->prediction(0).grant_likelihood().discretized_likelihood(); + if (ShouldHoldBack(is_on_device, request_type)) { + VLOG(1) << "[CPSS] Prediction service decision held back"; + std::move(callback_).Run( + Decision(Decision::UseNormalUi(), Decision::ShowNoWarning(), true)); + return; + } + VLOG(1) << "[CPSS] Prediction service request succeeded and received likelihood: " << last_request_grant_likelihood_.value(); if (ShouldPredictionTriggerQuietUi(last_request_grant_likelihood_.value())) { std::move(callback_).Run(Decision( - QuietUiReason::kPredictedVeryUnlikelyGrant, Decision::ShowNoWarning())); + is_on_device ? QuietUiReason::kOnDevicePredictedVeryUnlikelyGrant + : QuietUiReason::kServicePredictedVeryUnlikelyGrant, + Decision::ShowNoWarning(), false)); return; } - std::move(callback_).Run(Decision::UseNormalUiAndShowNoWarning()); + std::move(callback_).Run( + Decision(Decision::UseNormalUi(), Decision::ShowNoWarning(), false)); } bool PredictionBasedPermissionUiSelector::ShouldHoldBack(
diff --git a/chrome/browser/permissions/prediction_based_permission_ui_selector.h b/chrome/browser/permissions/prediction_based_permission_ui_selector.h index 41ce6110..3419a8ca 100644 --- a/chrome/browser/permissions/prediction_based_permission_ui_selector.h +++ b/chrome/browser/permissions/prediction_based_permission_ui_selector.h
@@ -61,6 +61,8 @@ GetPredictionTypeToUse); FRIEND_TEST_ALL_PREFIXES(PredictionBasedPermissionUiSelectorTest, HoldbackHistogramTest); + FRIEND_TEST_ALL_PREFIXES(PredictionBasedPermissionUiSelectorTest, + HoldbackDecisionTest); permissions::PredictionRequestFeatures BuildPredictionRequestFeatures( permissions::PermissionRequest* request); void LookupResponseReceived(
diff --git a/chrome/browser/permissions/prediction_based_permission_ui_selector_unittest.cc b/chrome/browser/permissions/prediction_based_permission_ui_selector_unittest.cc index b3c99e9..04a37067 100644 --- a/chrome/browser/permissions/prediction_based_permission_ui_selector_unittest.cc +++ b/chrome/browser/permissions/prediction_based_permission_ui_selector_unittest.cc
@@ -98,9 +98,10 @@ const char* command_line_value; const Decision expected_decision; } const kTests[] = { - {"very-unlikely", Decision(PredictionBasedPermissionUiSelector:: - QuietUiReason::kPredictedVeryUnlikelyGrant, - Decision::ShowNoWarning())}, + {"very-unlikely", + Decision(PredictionBasedPermissionUiSelector::QuietUiReason:: + kServicePredictedVeryUnlikelyGrant, + Decision::ShowNoWarning())}, {"unlikely", Decision::UseNormalUiAndShowNoWarning()}, {"neutral", Decision::UseNormalUiAndShowNoWarning()}, {"likely", Decision::UseNormalUiAndShowNoWarning()}, @@ -151,7 +152,7 @@ } // Since there are 4 previous prompts, the prediction service request will be - // made and will return a "kPredictedVeryUnlikelyGrant" quiet reason. + // made and will return a "kServicePredictedVeryUnlikelyGrant" quiet reason. Decision notification_decision = SelectUiToUseAndGetDecision( &prediction_selector, permissions::RequestType::kNotifications); @@ -159,11 +160,11 @@ &prediction_selector, permissions::RequestType::kGeolocation); EXPECT_EQ(PredictionBasedPermissionUiSelector::QuietUiReason:: - kPredictedVeryUnlikelyGrant, + kServicePredictedVeryUnlikelyGrant, notification_decision.quiet_ui_reason); EXPECT_EQ(PredictionBasedPermissionUiSelector::QuietUiReason:: - kPredictedVeryUnlikelyGrant, + kServicePredictedVeryUnlikelyGrant, geolocation_decision.quiet_ui_reason); } @@ -212,7 +213,7 @@ notification_decision = SelectUiToUseAndGetDecision( &prediction_selector, permissions::RequestType::kNotifications); EXPECT_EQ(PredictionBasedPermissionUiSelector::QuietUiReason:: - kPredictedVeryUnlikelyGrant, + kServicePredictedVeryUnlikelyGrant, notification_decision.quiet_ui_reason); // Geolocation still has too few actions. @@ -226,13 +227,13 @@ notification_decision = SelectUiToUseAndGetDecision( &prediction_selector, permissions::RequestType::kNotifications); EXPECT_EQ(PredictionBasedPermissionUiSelector::QuietUiReason:: - kPredictedVeryUnlikelyGrant, + kServicePredictedVeryUnlikelyGrant, notification_decision.quiet_ui_reason); geolocation_decision = SelectUiToUseAndGetDecision( &prediction_selector, permissions::RequestType::kGeolocation); EXPECT_EQ(PredictionBasedPermissionUiSelector::QuietUiReason:: - kPredictedVeryUnlikelyGrant, + kServicePredictedVeryUnlikelyGrant, geolocation_decision.quiet_ui_reason); } @@ -399,14 +400,14 @@ feature_list_->InitWithFeaturesAndParameters( { {features::kPermissionPredictions, - {{features::kPermissionPredictionsHoldbackChance.name, "1.1"}}}, + {{features::kPermissionPredictionsHoldbackChance.name, "1"}}}, {features::kPermissionGeolocationPredictions, {{features::kPermissionGeolocationPredictionsHoldbackChance.name, - "1.1"}}}, + "1"}}}, {permissions::features::kPermissionOnDeviceNotificationPredictions, {{permissions::feature_params:: kPermissionOnDeviceNotificationPredictionsHoldbackChance.name, - "1.1"}}}, + "1"}}}, }, {}); @@ -476,3 +477,100 @@ "Permissions.PredictionService.Response.Geolocation", /*count=*/2); } + +TEST_F(PredictionBasedPermissionUiSelectorTest, HoldbackDecisionTest) { + permissions::GeneratePredictionsResponse mock_response_very_unlikely; + auto* very_unlikely_prediction = + mock_response_very_unlikely.mutable_prediction()->Add(); + very_unlikely_prediction->mutable_grant_likelihood()->set_discretized_likelihood( + permissions:: + PermissionPrediction_Likelihood_DiscretizedLikelihood_VERY_UNLIKELY); + + permissions::GeneratePredictionsResponse mock_response_likely; + auto* likely_prediction = mock_response_likely.mutable_prediction()->Add(); + likely_prediction->mutable_grant_likelihood()->set_discretized_likelihood( + permissions:: + PermissionPrediction_Likelihood_DiscretizedLikelihood_LIKELY); + + PredictionBasedPermissionUiSelector prediction_selector(profile()); + // No holdback. + feature_list_->Reset(); + feature_list_->InitWithFeaturesAndParameters( + { + {features::kPermissionPredictions, + {{features::kPermissionPredictionsHoldbackChance.name, "0"}}}, + {features::kPermissionGeolocationPredictions, + {{features::kPermissionGeolocationPredictionsHoldbackChance.name, + "0"}}}, + {permissions::features::kPermissionOnDeviceNotificationPredictions, + {{permissions::feature_params:: + kPermissionOnDeviceNotificationPredictionsHoldbackChance.name, + "0"}}}, + }, + {}); + + absl::optional<Decision> actual_decision; + prediction_selector.callback_ = base::BindLambdaForTesting( + [&](const Decision& decision) { actual_decision = decision; }); + + prediction_selector.LookupResponseReceived( + false, permissions::RequestType::kNotifications, false, false, + absl::nullopt); + EXPECT_EQ(actual_decision->decision_held_back, absl::nullopt); + + prediction_selector.callback_ = base::BindLambdaForTesting( + [&](const Decision& decision) { actual_decision = decision; }); + + prediction_selector.LookupResponseReceived( + false, permissions::RequestType::kNotifications, true, false, + mock_response_very_unlikely); + EXPECT_EQ(actual_decision->decision_held_back, false); + + prediction_selector.callback_ = base::BindLambdaForTesting( + [&](const Decision& decision) { actual_decision = decision; }); + + prediction_selector.LookupResponseReceived( + false, permissions::RequestType::kNotifications, true, false, + mock_response_likely); + EXPECT_EQ(actual_decision->decision_held_back, false); + + // 100% Holdback chance. + feature_list_->Reset(); + feature_list_->InitWithFeaturesAndParameters( + { + {features::kPermissionPredictions, + {{features::kPermissionPredictionsHoldbackChance.name, "1"}}}, + {features::kPermissionGeolocationPredictions, + {{features::kPermissionGeolocationPredictionsHoldbackChance.name, + "1"}}}, + {permissions::features::kPermissionOnDeviceNotificationPredictions, + {{permissions::feature_params:: + kPermissionOnDeviceNotificationPredictionsHoldbackChance.name, + "1"}}}, + }, + {}); + + prediction_selector.callback_ = base::BindLambdaForTesting( + [&](const Decision& decision) { actual_decision = decision; }); + + prediction_selector.LookupResponseReceived( + false, permissions::RequestType::kNotifications, false, false, + absl::nullopt); + EXPECT_EQ(actual_decision->decision_held_back, absl::nullopt); + + prediction_selector.callback_ = base::BindLambdaForTesting( + [&](const Decision& decision) { actual_decision = decision; }); + + prediction_selector.LookupResponseReceived( + false, permissions::RequestType::kNotifications, true, false, + mock_response_very_unlikely); + EXPECT_EQ(actual_decision->decision_held_back, true); + + prediction_selector.callback_ = base::BindLambdaForTesting( + [&](const Decision& decision) { actual_decision = decision; }); + + prediction_selector.LookupResponseReceived( + false, permissions::RequestType::kNotifications, true, false, + mock_response_likely); + EXPECT_EQ(actual_decision->decision_held_back, true); +}
diff --git a/chrome/browser/permissions/quiet_permission_prompt_model_android.cc b/chrome/browser/permissions/quiet_permission_prompt_model_android.cc index e13c80116..ccf306e5 100644 --- a/chrome/browser/permissions/quiet_permission_prompt_model_android.cc +++ b/chrome/browser/permissions/quiet_permission_prompt_model_android.cc
@@ -27,7 +27,8 @@ case QuietUiReason::kTriggeredDueToAbusiveContent: return l10n_util::GetStringUTF16( IDS_NOTIFICATION_QUIET_PERMISSION_INFOBAR_ABUSIVE_MESSAGE); - case QuietUiReason::kPredictedVeryUnlikelyGrant: + case QuietUiReason::kServicePredictedVeryUnlikelyGrant: + case QuietUiReason::kOnDevicePredictedVeryUnlikelyGrant: return l10n_util::GetStringUTF16( IDS_NOTIFICATION_QUIET_PERMISSION_INFOBAR_PREDICTION_SERVICE_MESSAGE); } @@ -54,7 +55,8 @@ switch (reason) { case QuietUiReason::kEnabledInPrefs: - case QuietUiReason::kPredictedVeryUnlikelyGrant: + case QuietUiReason::kServicePredictedVeryUnlikelyGrant: + case QuietUiReason::kOnDevicePredictedVeryUnlikelyGrant: case QuietUiReason::kTriggeredByCrowdDeny: model.primary_button_label = l10n_util::GetStringUTF16( IDS_NOTIFICATIONS_QUIET_PERMISSION_BUBBLE_ALLOW_BUTTON);
diff --git a/chrome/browser/policy/profile_policy_connector.cc b/chrome/browser/policy/profile_policy_connector.cc index 3cb5e55..0c6bb44 100644 --- a/chrome/browser/policy/profile_policy_connector.cc +++ b/chrome/browser/policy/profile_policy_connector.cc
@@ -230,8 +230,6 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) migrators.push_back(std::make_unique<LegacyChromePolicyMigrator>( - policy::key::kDeviceNativePrinters, policy::key::kDevicePrinters)); - migrators.push_back(std::make_unique<LegacyChromePolicyMigrator>( policy::key::kDeviceUserWhitelist, // nocheck policy::key::kDeviceUserAllowlist)); migrators.push_back(std::make_unique<LegacyChromePolicyMigrator>(
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc index 8236eb4..a6a34e1 100644 --- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc
@@ -2827,11 +2827,6 @@ /*expect_successful_tls_probe=*/false, /*expected_status=*/1, /*expect_probe=*/true); - - histogram_tester().ExpectTotalCount( - "PrefetchProxy.CanaryChecker.FinalState.DNS", 1); - histogram_tester().ExpectTotalCount( - "PrefetchProxy.CanaryChecker.FinalState.TLS", 1); } IN_PROC_BROWSER_TEST_F(
diff --git a/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_consent.xml b/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_consent.xml index ee756d0..40c9d688 100644 --- a/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_consent.xml +++ b/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_consent.xml
@@ -131,7 +131,7 @@ android:layout_height="wrap_content" android:layout_marginEnd="@dimen/privacy_sandbox_consent_button_margin_between" android:text="@string/privacy_sandbox_dialog_no_button" - style="@style/FilledButton.Flat" /> + style="@style/OutlinedButton" /> <org.chromium.ui.widget.ButtonCompat android:id="@+id/yes_button" @@ -141,7 +141,7 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/privacy_sandbox_consent_button_margin_between" android:text="@string/privacy_sandbox_dialog_yes_button" - style="@style/FilledButton.Flat" /> + style="@style/OutlinedButton" /> </LinearLayout> </LinearLayout>
diff --git a/chrome/browser/profiles/profile_metrics.cc b/chrome/browser/profiles/profile_metrics.cc index b64cba65..df16d679 100644 --- a/chrome/browser/profiles/profile_metrics.cc +++ b/chrome/browser/profiles/profile_metrics.cc
@@ -216,10 +216,17 @@ // static void ProfileMetrics::LogProfileAddSignInFlowOutcome( - ProfileAddSignInFlowOutcome outcome) { + ProfileSignedInFlowOutcome outcome) { base::UmaHistogramEnumeration("Profile.AddSignInFlowOutcome", outcome); } +// static +void ProfileMetrics::LogLacrosPrimaryProfileFirstRunOutcome( + ProfileSignedInFlowOutcome outcome) { + base::UmaHistogramEnumeration("Profile.LacrosPrimaryProfileFirstRunOutcome", + outcome); +} + void ProfileMetrics::LogProfileAvatarSelection(size_t icon_index) { ProfileAvatar icon_name = AVATAR_UNKNOWN; switch (icon_index) {
diff --git a/chrome/browser/profiles/profile_metrics.h b/chrome/browser/profiles/profile_metrics.h index 52e1cec..92af418d8 100644 --- a/chrome/browser/profiles/profile_metrics.h +++ b/chrome/browser/profiles/profile_metrics.h
@@ -55,7 +55,7 @@ // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. - enum class ProfileAddSignInFlowOutcome { + enum class ProfileSignedInFlowOutcome { kConsumerSync = 0, kConsumerSigninOnly = 1, kConsumerSyncSettings = 2, @@ -176,7 +176,9 @@ static void LogNumberOfProfiles(ProfileAttributesStorage* storage); static void LogProfileAddNewUser(ProfileAdd metric); static void LogProfileAddSignInFlowOutcome( - ProfileAddSignInFlowOutcome outcome); + ProfileSignedInFlowOutcome outcome); + static void LogLacrosPrimaryProfileFirstRunOutcome( + ProfileSignedInFlowOutcome outcome); static void LogProfileAvatarSelection(size_t icon_index); static void LogProfileDeleteUser(ProfileDelete metric); static void LogProfileSwitchGaia(ProfileGaia metric);
diff --git a/chrome/browser/resources/chromeos/login/screens/common/smart_privacy_protection.html b/chrome/browser/resources/chromeos/login/screens/common/smart_privacy_protection.html index 7a75a00..2cf7ea0b 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/smart_privacy_protection.html +++ b/chrome/browser/resources/chromeos/login/screens/common/smart_privacy_protection.html
@@ -44,6 +44,10 @@ .content-footer { padding-top: 16px; } + + .subtitle-illustration { + max-height: 250px; + } </style> <oobe-adaptive-dialog role="dialog" aria-label$="[[i18nDynamic(locale, @@ -53,7 +57,7 @@ [[i18nDynamic(locale, 'smartPrivacyProtectionScreenTitle')]] </h1> <img slot="subtitle" src="images/smart_privacy.svg" - class="oobe-illustration" aria-hidden="true"> + class="oobe-illustration subtitle-illustration" aria-hidden="true"> <div slot="content" class="landscape-header-aligned"> <div id="quickDimSection" class="overview-list-item layout horizontal" hidden="[[!isQuickDimEnabled_]]">
diff --git a/chrome/browser/resources/gaia_auth_host/PRESUBMIT.py b/chrome/browser/resources/gaia_auth_host/PRESUBMIT.py new file mode 100644 index 0000000..a467894 --- /dev/null +++ b/chrome/browser/resources/gaia_auth_host/PRESUBMIT.py
@@ -0,0 +1,46 @@ +# Copyright 2022 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Presubmit script for gaia_auth_host + +See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts +for more details about the presubmit API built into depot_tools. +""" + +USE_PYTHON3 = True + +import re + +def _FilterFile(affected_file): + """Returns true if the file could contain code requiring a presubmit check. + """ + return affected_file.LocalPath().endswith(('.js')) + +def _CountOccurences(matcher, contents): + return sum(matcher.search(line) != None for line in contents) + +def _CheckSamlHandlerApiCallErrors(input_api, output_api): + """Checks that the number of "console.error('SamlHandler.onAPICall_" + statements stays the same. + """ + matcher = input_api.re.compile(r'console\.error\(\'SamlHandler\.onAPICall_') + for f in input_api.AffectedFiles(_FilterFile): + new_occurences = _CountOccurences(matcher, f.NewContents()) + old_occurences = _CountOccurences(matcher, f.OldContents()) + if new_occurences < old_occurences: + return [output_api.PresubmitPromptWarning( + 'Seems that you\'re modifiying an error log ' + '\'SamlHandler\.onAPICall_\' which is used as a signal for a ' + 'tast test. Please make sure the `login.ChromeGaiaAPI` test and' + ' this presubmit check stays functional') ] + return [] + +def _CommonCheck(input_api, output_api): + return _CheckSamlHandlerApiCallErrors(input_api, output_api) + +def CheckChangeOnUpload(input_api, output_api): + return _CommonCheck(input_api, output_api) + +def CheckChangeOnCommit(input_api, output_api): + return _CommonCheck(input_api, output_api)
diff --git a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog.html b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog.html index 05ad0b1..2ea4b1e 100644 --- a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog.html +++ b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog.html
@@ -5,7 +5,7 @@ <meta name="color-scheme" content="light dark"> <meta name="viewport" content="width=device-width initial-scale=1.0, user-scalable=no"> - <title>Lorum Ipsum</title> + <title>$i18n{privacySandboxTitle}</title> <link rel="stylesheet" href="chrome://resources/css/md_colors.css"> <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css"> <style>
diff --git a/chrome/browser/resources/settings/autofill_page/password_edit_dialog.html b/chrome/browser/resources/settings/autofill_page/password_edit_dialog.html index 6a71dfb..b2bf6e45 100644 --- a/chrome/browser/resources/settings/autofill_page/password_edit_dialog.html +++ b/chrome/browser/resources/settings/autofill_page/password_edit_dialog.html
@@ -49,6 +49,7 @@ :host([dialog-mode='password_view']) settings-textarea { --cr-input-background-color: transparent; --cr-input-readonly-opacity: 1; + --cr-input-underline-display: none; } </style> <cr-dialog id="dialog" close-text="$i18n{close}" show-on-attach> @@ -139,8 +140,9 @@ value="{{note_}}" id="note" readonly$="[[isInViewMode_]]" - on-value-changed="onNoteChanged_" - maxlength="1000" + first-footer="[[noteFirstFooter_]]" + second-footer="[[noteSecondFooter_]]" + invalid="[[noteInvalid_]]" autogrow> </settings-textarea> </template>
diff --git a/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts b/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts index f374d27..54c2b6ae 100644 --- a/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts +++ b/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts
@@ -53,6 +53,18 @@ const PasswordEditDialogElementBase = I18nMixin(PolymerElement); /** + * When user enters more than or equal to 900 characters in the note field, a + * footer will be displayed below the note to warn the user. + */ +const PASSWORD_NOTE_WARNING_CHARACTER_COUNT = 900; + +/** + * When user enters more than 1000 characters, the note will become invalid and + * save button will be disabled. + */ +const PASSWORD_NOTE_MAX_CHARACTER_COUNT = 1000; + +/** * Contains the possible modes for 'password-edit-dialog'. * FEDERATED_VIEW: entry is an existing federated credential * PASSWORD_VIEW: entry is an existing password and in view mode @@ -199,6 +211,34 @@ note_: {type: String, value: ''}, /** + * Password note can be at most PASSWORD_NOTE_MAX_CHARACTER_COUNT + * characters long. Warns users when they start having more than or equal + * to PASSWORD_NOTE_WARNING_CHARACTER_COUNT characters. + */ + noteFirstFooter_: { + type: String, + computed: 'computeNoteFirstFooter_(dialogMode, note_)', + }, + + /** + * Informs the user about the note's character count and the character + * limit. + */ + noteSecondFooter_: { + type: String, + computed: 'computeNoteSecondFooter_(dialogMode, note_)', + }, + + /** + * Whether the note is longer than PASSWORD_NOTE_MAX_CHARACTER_COUNT + * characters. + */ + noteInvalid_: { + type: Boolean, + computed: 'computeNoteInvalid_(dialogMode, note_)', + }, + + /** * Whether the username input is invalid. */ usernameInputInvalid_: { @@ -220,7 +260,8 @@ type: Boolean, computed: 'computeIsSaveButtonDisabled_(websiteUrls_, websiteInputInvalid_, ' + - 'usernameInputInvalid_, password_)' + 'usernameInputInvalid_, password_, noteInvalid_, ' + + 'isPasswordNotesEnabled_)', }, /** * Whether the flag notes feature for passwords is enabled. @@ -255,6 +296,9 @@ private websiteInputErrorMessage_: string|null; private username_: string; private note_: string; + private noteFirstFooter_: string; + private noteSecondFooter_: string; + private noteInvalid_: boolean; private usernameInputInvalid_: boolean; private password_: string; private isSaveButtonDisabled_: boolean; @@ -319,7 +363,8 @@ private computeIsSaveButtonDisabled_(): boolean { return !this.websiteUrls_ || this.websiteInputInvalid_ || - this.usernameInputInvalid_ || !this.password_.length; + this.usernameInputInvalid_ || !this.password_.length || + (this.isPasswordNotesEnabled_ && this.noteInvalid_); } private shouldShowNote_(): boolean { @@ -328,6 +373,34 @@ this.dialogMode === PasswordDialogMode.EDIT); } + private isNoteLongerThanOrEqualTo_(characterCount: number): boolean { + return this.dialogMode === PasswordDialogMode.EDIT && + this.note_.length >= characterCount; + } + + private computeNoteFirstFooter_(): string { + return this.isNoteLongerThanOrEqualTo_( + PASSWORD_NOTE_WARNING_CHARACTER_COUNT) ? + this.i18n( + 'passwordNoteCharacterCountWarning', + PASSWORD_NOTE_MAX_CHARACTER_COUNT) : + ''; + } + + private computeNoteSecondFooter_(): string { + return this.isNoteLongerThanOrEqualTo_( + PASSWORD_NOTE_WARNING_CHARACTER_COUNT) ? + this.i18n( + 'passwordNoteCharacterCount', this.note_.length, + PASSWORD_NOTE_MAX_CHARACTER_COUNT) : + ''; + } + + private computeNoteInvalid_(): boolean { + return this.isNoteLongerThanOrEqualTo_( + PASSWORD_NOTE_MAX_CHARACTER_COUNT + 1); + } + /** * Handler for tapping the 'cancel' button. Should just dismiss the dialog. */ @@ -729,11 +802,6 @@ return usernamesByOrigin; }, new Map()); } - - private onNoteChanged_(): void { - // TODO(crbug.com/1297513): Implement the logic and resize the textfield - // with the input. - } } declare global {
diff --git a/chrome/browser/resources/settings/autofill_page/payments_section.ts b/chrome/browser/resources/settings/autofill_page/payments_section.ts index a802d86..b79392a 100644 --- a/chrome/browser/resources/settings/autofill_page/payments_section.ts +++ b/chrome/browser/resources/settings/autofill_page/payments_section.ts
@@ -397,8 +397,7 @@ private shouldShowAddVirtualCardButton_(): boolean { if (!this.virtualCardEnrollmentEnabled_ || - this.activeCreditCard_ === null || - this.activeCreditCard_.metadata === null) { + this.activeCreditCard_ === null || !this.activeCreditCard_!.metadata) { return false; } return !!this.activeCreditCard_!.metadata! @@ -408,8 +407,7 @@ private shouldShowRemoveVirtualCardButton_(): boolean { if (!this.virtualCardEnrollmentEnabled_ || - this.activeCreditCard_ === null || - this.activeCreditCard_.metadata === null) { + this.activeCreditCard_ === null || !this.activeCreditCard_!.metadata) { return false; } return !!this.activeCreditCard_!.metadata!
diff --git a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html index 206cd6b6..aacaf49 100644 --- a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html +++ b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html
@@ -162,7 +162,6 @@ </if> <cr-link-row class="hr" id="diagnostics" on-click="onDiagnosticsClick_" - hidden$="[[!showDiagnosticsApp_]]" label="$i18n{aboutDiagnostics}" external deep-link-focus-id$="[[Setting.kDiagnostics]]"> </cr-link-row>
diff --git a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js index 746a7da..2932c9f 100644 --- a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js +++ b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js
@@ -171,14 +171,6 @@ 'currentUpdateStatusEvent_, hasCheckedForUpdates_, hasEndOfLife_)', }, - /** @private */ - showDiagnosticsApp_: { - type: Boolean, - value: function() { - return loadTimeData.getBoolean('diagnosticsAppEnabled'); - } - }, - /** @protected */ showFirmwareUpdatesApp_: { type: Boolean, @@ -367,7 +359,6 @@ /** @private */ onDiagnosticsClick_() { - assert(this.showDiagnosticsApp_); this.aboutBrowserProxy_.openDiagnostics(); recordSettingChange(chromeos.settings.mojom.Setting.kDiagnostics); },
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service.cc b/chrome/browser/safe_browsing/chrome_password_protection_service.cc index 711a790..75b6cd5 100644 --- a/chrome/browser/safe_browsing/chrome_password_protection_service.cc +++ b/chrome/browser/safe_browsing/chrome_password_protection_service.cc
@@ -1168,7 +1168,8 @@ PasswordProtectionRequest* request, const std::string& username, PasswordType password_type, - bool is_phishing_url) { + bool is_phishing_url, + bool warning_shown) { auto reused_password_account_type = GetPasswordProtectionReusedPasswordAccountType(password_type, username); if (reused_password_account_type.account_type() == @@ -1198,7 +1199,7 @@ static_cast<PasswordProtectionRequestContent*>(request); router->OnPolicySpecifiedPasswordReuseDetected( request_content->web_contents()->GetLastCommittedURL(), - username_or_email, is_phishing_url); + username_or_email, is_phishing_url, warning_shown); } } }
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service.h b/chrome/browser/safe_browsing/chrome_password_protection_service.h index 31dba57..6834350 100644 --- a/chrome/browser/safe_browsing/chrome_password_protection_service.h +++ b/chrome/browser/safe_browsing/chrome_password_protection_service.h
@@ -197,7 +197,8 @@ void MaybeReportPasswordReuseDetected(PasswordProtectionRequest* request, const std::string& username, PasswordType password_type, - bool is_phishing_url) override; + bool is_phishing_url, + bool warning_shown) override; // Triggers "safeBrowsingPrivate.OnPolicySpecifiedPasswordChanged" API. void ReportPasswordChanged() override;
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc index 05ea924..30ed0745 100644 --- a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc +++ b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
@@ -1224,7 +1224,8 @@ /*is_warning_showing=*/false); service_->MaybeReportPasswordReuseDetected(request_.get(), kUserName, PasswordType::ENTERPRISE_PASSWORD, - /*is_phishing_url =*/true); + /*is_phishing_url =*/true, + /*warning_shown =*/true); base::RunLoop().RunUntilIdle(); ASSERT_EQ(1, test_event_router_->GetEventCount( @@ -1241,7 +1242,8 @@ service_->SetIsAccountSignedIn(true); service_->MaybeReportPasswordReuseDetected(request_.get(), kUserName, PasswordType::OTHER_GAIA_PASSWORD, - /*is_phishing_url =*/true); + /*is_phishing_url =*/true, + /*warning_shown =*/true); base::RunLoop().RunUntilIdle(); ASSERT_EQ(2, test_event_router_->GetEventCount( @@ -1250,7 +1252,7 @@ // If no password is used , no event should be sent. service_->MaybeReportPasswordReuseDetected( request_.get(), kUserName, PasswordType::PASSWORD_TYPE_UNKNOWN, - /*is_phishing_url =*/true); + /*is_phishing_url =*/true, /*warning_shown =*/true); base::RunLoop().RunUntilIdle(); EXPECT_EQ(2, test_event_router_->GetEventCount( OnPolicySpecifiedPasswordReuseDetected::kEventName)); @@ -1259,7 +1261,8 @@ service_->ConfigService(true /*incognito*/, false /*SBER*/); service_->MaybeReportPasswordReuseDetected(request_.get(), kUserName, PasswordType::ENTERPRISE_PASSWORD, - /*is_phishing_url =*/true); + /*is_phishing_url =*/true, + /*warning_shown =*/true); base::RunLoop().RunUntilIdle(); EXPECT_EQ(2, test_event_router_->GetEventCount( OnPolicySpecifiedPasswordReuseDetected::kEventName)); @@ -1282,7 +1285,8 @@ /*is_warning_showing=*/false); service_->MaybeReportPasswordReuseDetected(request_.get(), kUserName, PasswordType::ENTERPRISE_PASSWORD, - /*is_phishing_url =*/true); + /*is_phishing_url =*/true, + /*warning_shown =*/true); base::RunLoop().RunUntilIdle(); EXPECT_EQ(1, test_event_router_->GetEventCount( OnPolicySpecifiedPasswordReuseDetected::kEventName)); @@ -1291,7 +1295,8 @@ // should be sent. service_->MaybeReportPasswordReuseDetected(request_.get(), kUserName, PasswordType::OTHER_GAIA_PASSWORD, - /*is_phishing_url =*/true); + /*is_phishing_url =*/true, + /*warning_shown =*/true); base::RunLoop().RunUntilIdle(); EXPECT_EQ(1, test_event_router_->GetEventCount( OnPolicySpecifiedPasswordReuseDetected::kEventName)); @@ -1299,7 +1304,7 @@ // If user is a Gmail user and no password is used , no event should be sent. service_->MaybeReportPasswordReuseDetected( request_.get(), kUserName, PasswordType::PASSWORD_TYPE_UNKNOWN, - /*is_phishing_url =*/true); + /*is_phishing_url =*/true, /*warning_shown*/ true); base::RunLoop().RunUntilIdle(); EXPECT_EQ(1, test_event_router_->GetEventCount( OnPolicySpecifiedPasswordReuseDetected::kEventName));
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/SaveBitmapDelegate.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/SaveBitmapDelegate.java index 78ff403c..8f801ab 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/SaveBitmapDelegate.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/SaveBitmapDelegate.java
@@ -19,7 +19,7 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.download.FileAccessPermissionHelper; -import org.chromium.ui.permissions.AndroidPermissionDelegate; +import org.chromium.ui.base.WindowAndroid; import java.text.DateFormat; import java.util.Date; @@ -31,7 +31,7 @@ private final Context mContext; private final Bitmap mBitmap; private final int mFileNameResource; - private final AndroidPermissionDelegate mPermissionDelegate; + private final WindowAndroid mWindowAndroid; private final Runnable mCallback; private Dialog mDialog; @@ -44,11 +44,11 @@ * @param permissionDelegate The permission delegate for requesting storage permissions. */ public SaveBitmapDelegate(Context context, Bitmap bitmap, int fileNameResource, - Runnable callback, AndroidPermissionDelegate permissionDelegate) { + Runnable callback, WindowAndroid windowAndroid) { mContext = context; mBitmap = bitmap; mFileNameResource = fileNameResource; - mPermissionDelegate = permissionDelegate; + mWindowAndroid = windowAndroid; mCallback = callback; } @@ -60,8 +60,8 @@ return; } - if (!mPermissionDelegate.hasPermission(permission.WRITE_EXTERNAL_STORAGE) - && !mPermissionDelegate.canRequestPermission(permission.WRITE_EXTERNAL_STORAGE)) { + if (!mWindowAndroid.hasPermission(permission.WRITE_EXTERNAL_STORAGE) + && !mWindowAndroid.canRequestPermission(permission.WRITE_EXTERNAL_STORAGE)) { AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.Theme_Chromium_AlertDialog); builder.setMessage(R.string.sharing_hub_storage_disabled_text) @@ -92,7 +92,7 @@ } FileAccessPermissionHelper.requestFileAccessPermission( - mPermissionDelegate, this::finishDownloadWithPermission); + mWindowAndroid, this::finishDownloadWithPermission); } @VisibleForTesting
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QrCodeCoordinator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QrCodeCoordinator.java index 5787c7b..992a82e 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QrCodeCoordinator.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QrCodeCoordinator.java
@@ -7,7 +7,7 @@ import android.app.Activity; import android.app.FragmentManager; -import org.chromium.ui.permissions.AndroidPermissionDelegate; +import org.chromium.ui.base.WindowAndroid; /** * Creates and represents the QrCode main UI. @@ -20,10 +20,9 @@ * Constructor. * @param activity The android activity. * @param url the url to be shared. - * @param windowAndroid the AndroidPermissionDelegate to access system permissions. + * @param windowAndroid the WindowAndroid to access system permissions. */ - public QrCodeCoordinator( - Activity activity, String url, AndroidPermissionDelegate windowAndroid) { + public QrCodeCoordinator(Activity activity, String url, WindowAndroid windowAndroid) { mDialog = QrCodeDialog.newInstance(url, windowAndroid); mFragmentManager = activity.getFragmentManager(); @@ -42,4 +41,4 @@ public void dismiss() { mDialog.dismiss(); } -} \ No newline at end of file +}
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QrCodeDialog.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QrCodeDialog.java index b57dd21..9df663a 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QrCodeDialog.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QrCodeDialog.java
@@ -19,7 +19,7 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.share.qrcode.scan_tab.QrCodeScanCoordinator; import org.chromium.chrome.browser.share.qrcode.share_tab.QrCodeShareCoordinator; -import org.chromium.ui.permissions.AndroidPermissionDelegate; +import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.widget.ChromeImageButton; import java.util.ArrayList; @@ -31,7 +31,7 @@ // Used to pass the URL in the bundle. public static String URL_KEY = "url_key"; - private AndroidPermissionDelegate mWindowAndroid; + private WindowAndroid mWindowAndroid; private ArrayList<QrCodeDialogTab> mTabs; private TabLayoutPageListener mTabLayoutPageListener; @@ -39,13 +39,13 @@ * Create a new instance of {@link QrCodeDialog} and set the URL. * @param windowAndroid The AndroidPermissionDelegate to be query for download permissions. */ - static QrCodeDialog newInstance(String url, AndroidPermissionDelegate windowAndroid) { + static QrCodeDialog newInstance(String url, WindowAndroid windowAndroid) { assert windowAndroid != null; QrCodeDialog qrCodeDialog = new QrCodeDialog(); Bundle args = new Bundle(); args.putString(URL_KEY, url); qrCodeDialog.setArguments(args); - qrCodeDialog.setAndroidPermissionDelegate(windowAndroid); + qrCodeDialog.setWindowAndroid(windowAndroid); return qrCodeDialog; } @@ -94,7 +94,7 @@ * Setter for the current WindowAndroid. * @param windowAndroid The windowAndroid to set. */ - public void setAndroidPermissionDelegate(AndroidPermissionDelegate windowAndroid) { + public void setWindowAndroid(WindowAndroid windowAndroid) { mWindowAndroid = windowAndroid; if (mTabLayoutPageListener != null) { mTabLayoutPageListener.updatePermissions(mWindowAndroid);
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QrCodeDialogTab.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QrCodeDialogTab.java index bc99ea51..b08c030 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QrCodeDialogTab.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/QrCodeDialogTab.java
@@ -6,7 +6,7 @@ import android.view.View; -import org.chromium.ui.permissions.AndroidPermissionDelegate; +import org.chromium.ui.base.WindowAndroid; /** * Common interface for all the tab components in QrCodeDialog. @@ -33,5 +33,5 @@ /** * Called when the permissions delegate is reset. */ - public void updatePermissions(AndroidPermissionDelegate windowAndroid); -} \ No newline at end of file + public void updatePermissions(WindowAndroid windowAndroid); +}
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/TabLayoutPageListener.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/TabLayoutPageListener.java index e7f5993..4484b78f 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/TabLayoutPageListener.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/TabLayoutPageListener.java
@@ -6,7 +6,7 @@ import com.google.android.material.tabs.TabLayout; -import org.chromium.ui.permissions.AndroidPermissionDelegate; +import org.chromium.ui.base.WindowAndroid; import java.util.ArrayList; @@ -60,9 +60,9 @@ /** * Called when the fragment's underlying AndroidPermissionDelegate is updated. * Propagates the given AndroidPermissionDelegate to all of the tabs. - * @param windowAndroid The updated AndroidPermissionDelegate. + * @param windowAndroid The updated WindowAndroid. */ - public void updatePermissions(AndroidPermissionDelegate windowAndroid) { + public void updatePermissions(WindowAndroid windowAndroid) { for (QrCodeDialogTab tab : mTabs) { tab.updatePermissions(windowAndroid); }
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/scan_tab/QrCodeScanCoordinator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/scan_tab/QrCodeScanCoordinator.java index 5d62e48d..ee1ec7de 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/scan_tab/QrCodeScanCoordinator.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/scan_tab/QrCodeScanCoordinator.java
@@ -9,9 +9,9 @@ import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.browser.share.qrcode.QrCodeDialogTab; +import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModelChangeProcessor; -import org.chromium.ui.permissions.AndroidPermissionDelegate; /** * Creates and represents the QrCode scan panel UI. @@ -56,5 +56,5 @@ mScanView.stopCamera(); } @Override - public void updatePermissions(AndroidPermissionDelegate windowAndroid) {} + public void updatePermissions(WindowAndroid windowAndroid) {} }
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/share_tab/QrCodeShareCoordinator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/share_tab/QrCodeShareCoordinator.java index 1ce847d..84ea3c1 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/share_tab/QrCodeShareCoordinator.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/share_tab/QrCodeShareCoordinator.java
@@ -9,9 +9,9 @@ import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.browser.share.qrcode.QrCodeDialogTab; +import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModelChangeProcessor; -import org.chromium.ui.permissions.AndroidPermissionDelegate; /** * Creates and represents the QrCode share panel UI. @@ -20,8 +20,8 @@ private final QrCodeShareView mShareView; private final QrCodeShareMediator mMediator; - public QrCodeShareCoordinator(Context context, Runnable closeDialog, String url, - AndroidPermissionDelegate windowAndroid) { + public QrCodeShareCoordinator( + Context context, Runnable closeDialog, String url, WindowAndroid windowAndroid) { PropertyModel shareViewModel = new PropertyModel(QrCodeShareViewProperties.ALL_KEYS); mMediator = new QrCodeShareMediator(context, shareViewModel, closeDialog, url, windowAndroid); @@ -51,7 +51,7 @@ public void onDestroy() {} @Override - public void updatePermissions(AndroidPermissionDelegate windowAndroid) { + public void updatePermissions(WindowAndroid windowAndroid) { if (mMediator != null) { mMediator.updatePermissions(windowAndroid); }
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/share_tab/QrCodeShareMediator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/share_tab/QrCodeShareMediator.java index a75aa4f..00c9076 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/share_tab/QrCodeShareMediator.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/share_tab/QrCodeShareMediator.java
@@ -23,8 +23,8 @@ import org.chromium.chrome.browser.init.ChromeBrowserInitializer; import org.chromium.chrome.browser.share.BitmapDownloadRequest; import org.chromium.chrome.browser.share.qrcode.QRCodeGenerationRequest; +import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modelutil.PropertyModel; -import org.chromium.ui.permissions.AndroidPermissionDelegate; /** * QrCodeShareMediator is in charge of calculating and setting values for QrCodeShareViewProperties. @@ -34,7 +34,7 @@ private final Context mContext; private final PropertyModel mPropertyModel; - private AndroidPermissionDelegate mPermissionDelegate; + private WindowAndroid mWindowAndroid; // The number of times the user has attempted to download the QR code in this dialog. private int mNumDownloads; @@ -52,14 +52,14 @@ * @param permissionDelegate The delegate to help with downloading QRCode. */ QrCodeShareMediator(Context context, PropertyModel propertyModel, Runnable closeDialog, - String url, AndroidPermissionDelegate permissionDelegate) { + String url, WindowAndroid windowAndroid) { mContext = context; mPropertyModel = propertyModel; mCloseDialog = closeDialog; mUrl = url; ChromeBrowserInitializer.getInstance().runNowOrAfterFullBrowserStarted( () -> refreshQrCode(mUrl)); - mPermissionDelegate = permissionDelegate; + mWindowAndroid = windowAndroid; updatePermissionSettings(); } @@ -100,9 +100,9 @@ protected void downloadQrCode(View view) { logDownload(); Bitmap qrcodeBitmap = mPropertyModel.get(QrCodeShareViewProperties.QRCODE_BITMAP); - if (qrcodeBitmap != null && !mIsDownloadInProgress && mPermissionDelegate != null) { + if (qrcodeBitmap != null && !mIsDownloadInProgress && mWindowAndroid != null) { FileAccessPermissionHelper.requestFileAccessPermission( - mPermissionDelegate, this::finishDownloadWithPermission); + mWindowAndroid, this::finishDownloadWithPermission); return; } } @@ -128,8 +128,8 @@ /** Returns whether the user can be prompted for storage permissions. */ private Boolean canPromptForPermission() { - if (mPermissionDelegate == null) return false; - return mPermissionDelegate.canRequestPermission(permission.WRITE_EXTERNAL_STORAGE); + if (mWindowAndroid == null) return false; + return mWindowAndroid.canRequestPermission(permission.WRITE_EXTERNAL_STORAGE); } /** Updates the permission settings with the latest values. */ @@ -140,8 +140,8 @@ QrCodeShareViewProperties.HAS_STORAGE_PERMISSION, hasStoragePermission()); } - public void updatePermissions(AndroidPermissionDelegate windowAndroid) { - mPermissionDelegate = windowAndroid; + public void updatePermissions(WindowAndroid windowAndroid) { + mWindowAndroid = windowAndroid; updatePermissionSettings(); } /**
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetSaveDelegate.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetSaveDelegate.java index 98296e72..dfdf46d4 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetSaveDelegate.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetSaveDelegate.java
@@ -9,8 +9,8 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.share.SaveBitmapDelegate; +import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modelutil.PropertyModel; -import org.chromium.ui.permissions.AndroidPermissionDelegate; /** * ScreenshotShareSheetSaveDelegate is in charge of download the current bitmap. @@ -18,7 +18,7 @@ class ScreenshotShareSheetSaveDelegate { private final PropertyModel mModel; private final Context mContext; - private final AndroidPermissionDelegate mPermissionDelegate; + private final WindowAndroid mWindowAndroid; private final Runnable mCloseDialogRunnable; /** @@ -27,10 +27,10 @@ * @param propertyModel The property model to use to communicate with views. */ ScreenshotShareSheetSaveDelegate(Context context, PropertyModel propertyModel, - Runnable closeDialogRunnable, AndroidPermissionDelegate permissionDelegate) { + Runnable closeDialogRunnable, WindowAndroid windowAndroid) { mContext = context; mModel = propertyModel; - mPermissionDelegate = permissionDelegate; + mWindowAndroid = windowAndroid; mCloseDialogRunnable = closeDialogRunnable; } @@ -44,7 +44,7 @@ } SaveBitmapDelegate saveBitmapDelegate = new SaveBitmapDelegate(mContext, bitmap, - R.string.screenshot_filename_prefix, mCloseDialogRunnable, mPermissionDelegate); + R.string.screenshot_filename_prefix, mCloseDialogRunnable, mWindowAndroid); saveBitmapDelegate.save(); }
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/SaveBitmapDelegateTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/SaveBitmapDelegateTest.java index 4361d724..3086317f 100644 --- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/SaveBitmapDelegateTest.java +++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/SaveBitmapDelegateTest.java
@@ -5,11 +5,13 @@ package org.chromium.chrome.browser.share; import android.app.Activity; +import android.content.Context; import android.content.pm.PackageManager; import android.graphics.Bitmap; import androidx.test.filters.MediumTest; +import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; @@ -22,7 +24,8 @@ import org.chromium.base.test.UiThreadTest; import org.chromium.chrome.R; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; -import org.chromium.ui.permissions.AndroidPermissionDelegate; +import org.chromium.content_public.browser.test.util.TestThreadUtils; +import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.permissions.PermissionCallback; import org.chromium.ui.test.util.BlankUiTestActivity; @@ -40,7 +43,7 @@ @Mock private Runnable mCloseDialogRunnable; - private TestAndroidPermissionDelegate mPermissionDelegate; + private TestWindowAndroid mPermissionDelegate; private boolean mBitmapSaved; @@ -50,7 +53,8 @@ mActivityTestRule.launchActivity(null); Activity activity = mActivityTestRule.getActivity(); - mPermissionDelegate = new TestAndroidPermissionDelegate(); + mPermissionDelegate = + TestThreadUtils.runOnUiThreadBlocking(() -> new TestWindowAndroid(activity)); Bitmap bitmap = Bitmap.createBitmap(10, 10, Bitmap.Config.ALPHA_8); mSaveBitmapDelegate = new SaveBitmapDelegate(activity, bitmap, R.string.screenshot_filename_prefix, mCloseDialogRunnable, mPermissionDelegate) { @@ -61,6 +65,11 @@ }; } + @After + public void tearDown() { + TestThreadUtils.runOnUiThreadBlocking(() -> mPermissionDelegate.destroy()); + } + @Test @MediumTest @UiThreadTest @@ -88,9 +97,9 @@ } /** - * Test implementation of {@link AndroidPermissionDelegate}. + * Test implementation of {@link WindowAndroid}. */ - private class TestAndroidPermissionDelegate implements AndroidPermissionDelegate { + private class TestWindowAndroid extends WindowAndroid { private boolean mHasPermission; private boolean mCanRequestPermission; @@ -98,6 +107,10 @@ private boolean mCalledCanRequestPermission; private int mPermissionResult = PackageManager.PERMISSION_GRANTED; + public TestWindowAndroid(Context context) { + super(context); + } + public void setPermissionResults(int result) { mPermissionResult = result; }
diff --git a/chrome/browser/signin/dice_browsertest.cc b/chrome/browser/signin/dice_browsertest.cc index 3ab8f44..1cbf136 100644 --- a/chrome/browser/signin/dice_browsertest.cc +++ b/chrome/browser/signin/dice_browsertest.cc
@@ -16,6 +16,7 @@ #include "base/command_line.h" #include "base/location.h" #include "base/run_loop.h" +#include "base/scoped_observation.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/test/scoped_feature_list.h" @@ -73,6 +74,7 @@ #include "content/public/browser/notification_types.h" #include "content/public/common/content_switches.h" #include "content/public/test/browser_test.h" +#include "content/public/test/test_navigation_observer.h" #include "google_apis/gaia/gaia_switches.h" #include "google_apis/gaia/gaia_urls.h" #include "net/test/embedded_test_server/embedded_test_server.h" @@ -463,7 +465,7 @@ InProcessBrowserTest::SetUpOnMainThread(); https_server_.StartAcceptingConnections(); - GetIdentityManager()->AddObserver(this); + identity_manager_observation_.Observe(GetIdentityManager()); // Wait for the token service to be ready. if (!GetIdentityManager()->AreRefreshTokensLoaded()) { WaitForClosure(&tokens_loaded_quit_closure_); @@ -479,13 +481,12 @@ reconcilor->AbortReconcile(); reconcilor->SetState( signin_metrics::AccountReconcilorState::ACCOUNT_RECONCILOR_OK); - reconcilor->AddObserver(this); + account_reconcilor_observation_.Observe(reconcilor); } void TearDownOnMainThread() override { - GetIdentityManager()->RemoveObserver(this); - AccountReconcilorFactory::GetForProfile(browser()->profile()) - ->RemoveObserver(this); + identity_manager_observation_.Reset(); + account_reconcilor_observation_.Reset(); } // Calls |closure| if it is not null and resets it after. @@ -641,6 +642,12 @@ return DiceResponseHandler::GetForProfile(browser()->profile()); } + void CloseBrowser() { + identity_manager_observation_.Reset(); + account_reconcilor_observation_.Reset(); + CloseBrowserSynchronously(browser()); + } + const std::string main_email_; net::EmbeddedTestServer https_server_; bool enable_sync_requested_; @@ -654,6 +661,12 @@ std::string dice_request_header_; base::test::ScopedFeatureList feature_list_; + base::ScopedObservation<signin::IdentityManager, + signin::IdentityManager::Observer> + identity_manager_observation_{this}; + base::ScopedObservation<AccountReconcilor, AccountReconcilor::Observer> + account_reconcilor_observation_{this}; + // Unblocks the server responses. base::OnceClosure unblock_token_exchange_response_closure_; base::OnceClosure unblock_enable_sync_response_closure_; @@ -1038,6 +1051,38 @@ EXPECT_TRUE(login_ui_test_utils::ConfirmSyncConfirmationDialog(browser())); } +// Verifies that Chrome doesn't crash on browser window close when the sync +// confirmation dialog is waiting for its size. +// Regression test for https://crbug.com/1304055. +IN_PROC_BROWSER_TEST_F(DiceBrowserTest, + CloseBrowserWhileInitializingSyncConfirmation) { + // Signin using the Chrome Sync endpoint. + browser()->signin_view_controller()->ShowSignin( + profiles::BUBBLE_VIEW_MODE_GAIA_SIGNIN, + signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS); + + content::TestNavigationObserver sync_confirmation_url_observer( + GURL("chrome://sync-confirmation")); + sync_confirmation_url_observer.StartWatchingNewWebContents(); + + // Receive token. + SendRefreshTokenResponse(); + // Receive ENABLE_SYNC. + SendEnableSyncResponse(); + + WaitForSigninSucceeded(); + EXPECT_EQ(GetMainAccountID(), GetIdentityManager()->GetPrimaryAccountId( + signin::ConsentLevel::kSync)); + + // Wait until the sync confirmation webUI is created but not fully loaded + // yet. The native dialog is not displayed yet since it waits until the webUI + // passes the dialog height back to native. + sync_confirmation_url_observer.WaitForNavigationFinished(); + + // This should not crash. + CloseBrowser(); +} + // Tests that turning off Dice via preferences works when singed out. IN_PROC_BROWSER_TEST_F(DiceBrowserTest, PRE_TurnOffDice_SignedOut) { ASSERT_FALSE(
diff --git a/chrome/browser/signin/signin_ui_util.cc b/chrome/browser/signin/signin_ui_util.cc index b951b53..2c7cd6b 100644 --- a/chrome/browser/signin/signin_ui_util.cc +++ b/chrome/browser/signin/signin_ui_util.cc
@@ -351,6 +351,37 @@ #endif } +std::vector<AccountInfo> GetOrderedAccountsForDisplay( + Profile* profile, + bool restrict_to_accounts_eligible_for_sync) { + // Fetch account ids for accounts that have a token. + signin::IdentityManager* identity_manager = + IdentityManagerFactory::GetForProfile(profile); + std::vector<AccountInfo> accounts_with_tokens = + identity_manager->GetExtendedAccountInfoForAccountsWithRefreshToken(); + + // Compute the default account. + CoreAccountId default_account_id = + identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin); + + // Fetch account information for each id and make sure that the first account + // in the list matches the unconsented primary account (if available). + std::vector<AccountInfo> accounts; + for (auto& account_info : accounts_with_tokens) { + DCHECK(!account_info.IsEmpty()); + if (restrict_to_accounts_eligible_for_sync && + !signin::IsUsernameAllowedByPatternFromPrefs( + g_browser_process->local_state(), account_info.email)) { + continue; + } + if (account_info.account_id == default_account_id) + accounts.insert(accounts.begin(), std::move(account_info)); + else + accounts.push_back(std::move(account_info)); + } + return accounts; +} + #if BUILDFLAG(ENABLE_DICE_SUPPORT) namespace internal { void EnableSyncFromPromo( @@ -415,36 +446,9 @@ } } // namespace internal -std::vector<AccountInfo> GetAccountsForDicePromos(Profile* profile) { - // Fetch account ids for accounts that have a token. - signin::IdentityManager* identity_manager = - IdentityManagerFactory::GetForProfile(profile); - std::vector<AccountInfo> accounts_with_tokens = - identity_manager->GetExtendedAccountInfoForAccountsWithRefreshToken(); - - // Compute the default account. - CoreAccountId default_account_id = - identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin); - - // Fetch account information for each id and make sure that the first account - // in the list matches the unconsented primary account (if available). - std::vector<AccountInfo> accounts; - for (auto& account_info : accounts_with_tokens) { - DCHECK(!account_info.IsEmpty()); - if (!signin::IsUsernameAllowedByPatternFromPrefs( - g_browser_process->local_state(), account_info.email)) { - continue; - } - if (account_info.account_id == default_account_id) - accounts.insert(accounts.begin(), std::move(account_info)); - else - accounts.push_back(std::move(account_info)); - } - return accounts; -} - AccountInfo GetSingleAccountForDicePromos(Profile* profile) { - std::vector<AccountInfo> accounts = GetAccountsForDicePromos(profile); + std::vector<AccountInfo> accounts = GetOrderedAccountsForDisplay( + profile, /*restrict_to_accounts_eligible_for_sync=*/true); if (!accounts.empty()) return accounts[0]; return AccountInfo();
diff --git a/chrome/browser/signin/signin_ui_util.h b/chrome/browser/signin/signin_ui_util.h index f943ae17..9430e15e 100644 --- a/chrome/browser/signin/signin_ui_util.h +++ b/chrome/browser/signin/signin_ui_util.h
@@ -105,11 +105,15 @@ signin_metrics::AccessPoint access_point, bool is_default_promo_account); -#if BUILDFLAG(ENABLE_DICE_SUPPORT) // Returns the list of all accounts that have a token. The unconsented primary -// account will be the first account in the list. -std::vector<AccountInfo> GetAccountsForDicePromos(Profile* profile); +// account will be the first account in the list. If +// |restrict_to_accounts_eligible_for_sync| is true, removes the account that +// are not suitable for sync promos. +std::vector<AccountInfo> GetOrderedAccountsForDisplay( + Profile* profile, + bool restrict_to_accounts_eligible_for_sync); +#if BUILDFLAG(ENABLE_DICE_SUPPORT) // Returns single account to use in Dice promos. AccountInfo GetSingleAccountForDicePromos(Profile* profile);
diff --git a/chrome/browser/signin/signin_ui_util_unittest.cc b/chrome/browser/signin/signin_ui_util_unittest.cc index ae28e52..30d4a59 100644 --- a/chrome/browser/signin/signin_ui_util_unittest.cc +++ b/chrome/browser/signin/signin_ui_util_unittest.cc
@@ -447,9 +447,10 @@ active_contents->GetVisibleURL()); } -TEST_F(DiceSigninUiUtilTest, GetAccountsForDicePromos) { +TEST_F(DiceSigninUiUtilTest, GetOrderedAccountsForDisplay) { // Should start off with no accounts. - std::vector<AccountInfo> accounts = GetAccountsForDicePromos(profile()); + std::vector<AccountInfo> accounts = GetOrderedAccountsForDisplay( + profile(), /*restrict_to_accounts_eligible_for_sync=*/true); EXPECT_TRUE(accounts.empty()); // TODO(tangltom): Flesh out this test.
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TrustedCdn.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TrustedCdn.java index 55ff6f8..39d509aa 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TrustedCdn.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TrustedCdn.java
@@ -12,6 +12,7 @@ import org.chromium.base.UnownedUserDataKey; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.NativeMethods; +import org.chromium.components.embedder_support.util.UrlUtilities; import org.chromium.components.security_state.ConnectionSecurityLevel; import org.chromium.components.security_state.SecurityStateModel; import org.chromium.content_public.browser.WebContents; @@ -84,6 +85,22 @@ return cdn != null ? cdn.getPublisherUrl() : null; } + /** + * @param tab Tab object currently being shown. + * @return The name of the publisher of the content if it can be reliably extracted, or null + * otherwise. + */ + public static String getContentPublisher(Tab tab) { + if (tab == null) return null; + + String publisherUrl = TrustedCdn.getPublisherUrl(tab); + if (publisherUrl != null) { + return UrlUtilities.extractPublisherFromPublisherUrl(publisherUrl); + } + + return null; + } + static TrustedCdn from(@NonNull Tab tab) { TrustedCdn trustedCdn = get(tab); if (trustedCdn == null) {
diff --git a/chrome/browser/themes/custom_theme_supplier.h b/chrome/browser/themes/custom_theme_supplier.h index c9c7ae60..4274b7a 100644 --- a/chrome/browser/themes/custom_theme_supplier.h +++ b/chrome/browser/themes/custom_theme_supplier.h
@@ -31,7 +31,7 @@ // public methods. Subclasses are expected to override all methods which should // provide non-default values. class CustomThemeSupplier - : public ui::ColorProviderManager::InitializerSupplier { + : public ui::ColorProviderManager::ThemeInitializerSupplier { public: enum ThemeType { EXTENSION, @@ -86,7 +86,7 @@ // doesn't supply all the colors it should (http://crbug.com/1045630). virtual bool CanUseIncognitoColors() const; - // ui::ColorProviderManager::InitializerSupplier: + // ui::ColorProviderManager::ThemeInitializerSupplier: void AddColorMixers(ui::ColorProvider* provider, const ui::ColorProviderManager::Key& key) const override { // TODO(pkasting): All classes that override GetColor() should override
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_az.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_az.xtb index 7825bc3..840864d 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_az.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_az.xtb
@@ -7,6 +7,7 @@ <translation id="2359808026110333948">Davam edin</translation> <translation id="2410754283952462441">Hesab seçin</translation> <translation id="3399357656427473483">Toxunuşla doldurulacaq kredensialların siyahısı.</translation> +<translation id="3653689374478248324"><ph name="SITE_NAME" /> saytına daxil olacaqsınız</translation> <translation id="3950820424414687140">Giriş</translation> <translation id="5441504010984421144">Tam hündürlükdə açılan toxunuşla doldurulacaq kredensialların siyahısı.</translation> <translation id="5624120631404540903">Parolları idarə edin</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_bn.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_bn.xtb index 6c9f09d..e3901611 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_bn.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_bn.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="bn"> +<translation id="1220509181886849806">সেভ করা পাসওয়ার্ড ব্যবহার করবেন?</translation> <translation id="1717486229951421299">টাচ করে পূরণ করা যাবে এমন ক্রেডেনশিয়ালের তালিকা হাফ স্ক্রিন জুড়ে খুলেছে।</translation> <translation id="207576718733492531">টাচ করে পূরণ করা যাবে এমন ক্রেডেনশিয়ালের তালিকা বন্ধ রয়েছে।</translation> <translation id="2359808026110333948">চালিয়ে যান</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ca.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ca.xtb index 2c3cfea..ac45c8ad 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ca.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ca.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ca"> +<translation id="1220509181886849806">Vols utilitzar la contrasenya desada?</translation> <translation id="1717486229951421299">La llista de credencials que s'emplenaran amb un toc s'ha obert a mitja alçada.</translation> <translation id="207576718733492531">La llista de credencials que s'emplenaran amb un toc està tancada.</translation> <translation id="2359808026110333948">Continua</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_en-GB.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_en-GB.xtb index eb2e709..f27a129 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_en-GB.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_en-GB.xtb
@@ -7,6 +7,7 @@ <translation id="2359808026110333948">Continue</translation> <translation id="2410754283952462441">Choose an account</translation> <translation id="3399357656427473483">List of credentials to be filled in on touch.</translation> +<translation id="3653689374478248324">You'll sign in to <ph name="SITE_NAME" /></translation> <translation id="3950820424414687140">Sign in</translation> <translation id="5441504010984421144">List of credentials to be filled in on touch opened at full height.</translation> <translation id="5624120631404540903">Manage passwords</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fa.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fa.xtb index 0d9b251a..f5d5c13 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fa.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fa.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fa"> +<translation id="1220509181886849806">از گذرواژه ذخیرهشده استفاده شود؟</translation> <translation id="1717486229951421299">فهرست اطلاعات کاربری که باید با لمس کردن تکمیل شود، بهصورت نیمه باز شده است.</translation> <translation id="207576718733492531">فهرست اطلاعات کاربری که باید با لمس کردن تکمیل شود بسته شده است.</translation> <translation id="2359808026110333948">ادامه</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fil.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fil.xtb index 609144a9..a08112b 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fil.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fil.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="fil"> +<translation id="1220509181886849806">Gamitin ang naka-save na password?</translation> <translation id="1717486229951421299">Nakabukas nang kalahati ang taas ang listahan ng mga kredensyal na pupunan kapag pinindot.</translation> <translation id="207576718733492531">Nakasara ang listahan ng mga kredensyal na pupunan kapag pinindot.</translation> <translation id="2359808026110333948">Magpatuloy</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hy.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hy.xtb index 7432b10..f7dd4844 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hy.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hy.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="hy"> +<translation id="1220509181886849806">Օգտագործե՞լ պահված գաղտնաբառը</translation> <translation id="1717486229951421299">Մուտքի տվյալները, որոնք պետք է լրացվեն հպումով, ցուցադրված են էկրանի կեսով:</translation> <translation id="207576718733492531">Մուտքի տվյալները, որոնք պետք է լրացվեն հպումով, ցուցադրված չեն։</translation> <translation id="2359808026110333948">Շարունակել</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_id.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_id.xtb index d25a421..6e6057d 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_id.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_id.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="id"> +<translation id="1220509181886849806">Gunakan sandi tersimpan?</translation> <translation id="1717486229951421299">Daftar kredensial yang terisi dengan gestur sentuhan sedang terbuka setengah.</translation> <translation id="207576718733492531">Daftar kredensial yang terisi dengan gestur sentuhan sedang tertutup.</translation> <translation id="2359808026110333948">Lanjutkan</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_is.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_is.xtb index 00413b919..d943df3 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_is.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_is.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="is"> +<translation id="1220509181886849806">Nota vistað aðgangsorð?</translation> <translation id="1717486229951421299">Listi yfir innskráningarupplýsingar sem eru færðar inn við snertingu opinn í hálfri hæð.</translation> <translation id="207576718733492531">Listi yfir innskráningarupplýsingar sem eru færðar inn við snertingu er lokaður.</translation> <translation id="2359808026110333948">Halda áfram</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_it.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_it.xtb index c30b249e..fd609e4 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_it.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_it.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="it"> +<translation id="1220509181886849806">Vuoi usare la password salvata?</translation> <translation id="1717486229951421299">Elenco di credenziali da compilare con il tocco aperte nella metà inferiore dello schermo.</translation> <translation id="207576718733492531">L'elenco di credenziali da compilare con il tocco è chiuso.</translation> <translation id="2359808026110333948">Continua</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ka.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ka.xtb index fbfe5d0..2fb7a736 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ka.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ka.xtb
@@ -7,6 +7,7 @@ <translation id="2359808026110333948">გაგრძელება</translation> <translation id="2410754283952462441">აირჩიეთ ანგარიში</translation> <translation id="3399357656427473483">შეხებისას შესავსები ავტორიზაციის მონაცემების სია.</translation> +<translation id="3653689374478248324">თქვენ შეხვალთ <ph name="SITE_NAME" />-ში</translation> <translation id="3950820424414687140">შესვლა</translation> <translation id="5441504010984421144">შეხებისას შესავსები ავტორიზაციის მონაცემების სია გახსნილია სრულ სიმაღლეზე.</translation> <translation id="5624120631404540903">პაროლების მართვა</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_kk.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_kk.xtb index edd342a..afcb4922 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_kk.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_kk.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="kk"> +<translation id="1220509181886849806">Сақталған құпия сөз қолданылсын ба?</translation> <translation id="1717486229951421299">Түрту арқылы толтырылатын тіркелу деректерінің тізімі жарты экранға ашылған.</translation> <translation id="207576718733492531">Түрту арқылы толтырылатын тіркелу деректерінің тізімі жабық.</translation> <translation id="2359808026110333948">Жалғастыру</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ko.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ko.xtb index 331ec21..4f4aac319 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ko.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ko.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ko"> +<translation id="1220509181886849806">저장된 비밀번호를 사용하시겠습니까?</translation> <translation id="1717486229951421299">터치 시 작성되는 사용자 인증 정보 목록이 절반 높이로 열렸습니다.</translation> <translation id="207576718733492531">터치 시 작성되는 사용자 인증 정보 목록이 닫혔습니다.</translation> <translation id="2359808026110333948">계속</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lt.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lt.xtb index 7b92d57f..c85e265 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lt.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lt.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="lt"> +<translation id="1220509181886849806">Naudoti išsaugotą slaptažodį?</translation> <translation id="1717486229951421299">Prisijungimo duomenų, kuriuos galima užpildyti palietus, sąrašas atidarytas per pusę ekrano aukščio.</translation> <translation id="207576718733492531">Prisijungimo duomenų, kuriuos galima užpildyti palietus, sąrašas uždarytas.</translation> <translation id="2359808026110333948">Tęskite</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_my.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_my.xtb index 1fea225..b535d72 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_my.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_my.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="my"> +<translation id="1220509181886849806">သိမ်းထားသောစကားဝှက် သုံးမလား။</translation> <translation id="1717486229951421299">ထိလိုက်သည့်အခါ ဖြည့်ရန်အတွက် အထောက်အထားများ၏ စာရင်းကို မြင်ကွင်းတစ်ဝက်ဖြင့်ထားသည်။</translation> <translation id="207576718733492531">ထိတွေ့သည့်အခါ ဖြည့်ရန် အထောက်အထားစာရင်းကို ပိတ်ထားသည်။</translation> <translation id="2359808026110333948">ဆက်လုပ်ရန်</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_no.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_no.xtb index 98723668..7c3d891 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_no.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_no.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="no"> +<translation id="1220509181886849806">Vil du bruke det lagrede passordet?</translation> <translation id="1717486229951421299">Listen over legitimasjon som kan fylles ut ved å trykke, er åpnet i halv høyde.</translation> <translation id="207576718733492531">Listen over legitimasjon som kan fylles ut ved å trykke, er lukket.</translation> <translation id="2359808026110333948">Fortsett</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_or.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_or.xtb index 5018979e..6ebf0b50 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_or.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_or.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="or"> +<translation id="1220509181886849806">ସେଭ କରାଯାଇଥିବା ପାସୱାର୍ଡକୁ ବ୍ୟବହାର କରିବେ?</translation> <translation id="1717486229951421299">ଅଧା ସ୍କ୍ରିନ୍ରେ ଖୋଲିଥିବା Touchରେ ପୂରଣ ହେବାକୁ ଥିବା କ୍ରେଡେନ୍ସିଆଲ୍ଗୁଡ଼ିକର ତାଲିକା।</translation> <translation id="207576718733492531">Touchରେ ପୂରଣ ହେବାକୁ ଥିବା କ୍ରେଡେନ୍ସିଆଲ୍ଗୁଡ଼ିକର ତାଲିକାକୁ ବନ୍ଦ କରିଦିଆଯାଇଛି।</translation> <translation id="2359808026110333948">ଜାରି ରଖନ୍ତୁ</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_si.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_si.xtb index 732d2178..39118b7 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_si.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_si.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="si"> +<translation id="1220509181886849806">සුරැකි මුරපදය භාවිත කරන්නද?</translation> <translation id="1717486229951421299">ස්පර්ශය මත පිරවිය යුතු අක්තපත්ර ලැයිස්තුව අඩ උසින් විවෘත වී ඇත.</translation> <translation id="207576718733492531">ස්පර්ශය මත පිරවිය යුතු අක්තපත්ර ලැයිස්තුව වසා ඇත.</translation> <translation id="2359808026110333948">කරගෙන යන්න</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sq.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sq.xtb index 394649a1..de90145f 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sq.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sq.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sq"> +<translation id="1220509181886849806">Të përdoret fjalëkalimi i ruajtur?</translation> <translation id="1717486229951421299">Lista e kredencialeve për t'u plotësuar me prekje është hapur në gjysmë lartësi.</translation> <translation id="207576718733492531">Lista e kredencialeve për t'u plotësuar me prekje është mbyllur.</translation> <translation id="2359808026110333948">Vazhdo</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_vi.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_vi.xtb index 14b6ced..e86b8724 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_vi.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_vi.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="vi"> +<translation id="1220509181886849806">Sử dụng mật khẩu đã lưu?</translation> <translation id="1717486229951421299">Danh sách thông tin đăng nhập mà bạn có thể chạm để điền đã được mở ở nửa dưới của màn hình.</translation> <translation id="207576718733492531">Danh sách thông tin đăng nhập mà bạn có thể chạm để điền đã bị đóng.</translation> <translation id="2359808026110333948">Tiếp tục</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zh-HK.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zh-HK.xtb index cef37dd..942b8691 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zh-HK.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zh-HK.xtb
@@ -1,7 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="zh-HK"> -<translation id="1220509181886849806">使用已儲存的密碼?</translation> +<translation id="1220509181886849806">要使用已儲存的密碼嗎?</translation> <translation id="1717486229951421299">㩒一下先可以填嘅憑證清單宜家顯示喺畫面下半部。</translation> <translation id="207576718733492531">㩒一下先可以填嘅憑證清單閂咗。</translation> <translation id="2359808026110333948">繼續</translation>
diff --git a/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml b/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml index ec1a2f7..53b783901 100644 --- a/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml +++ b/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml
@@ -56,6 +56,7 @@ <dimen name="omnibox_carousel_icon_rounding_radius">4dp</dimen> <dimen name="omnibox_pedal_suggestion_pedal_height">48dp</dimen> <dimen name="omnibox_pedal_suggestion_icon_size">18dp</dimen> + <dimen name="omnibox_pedal_suggestion_text_vertical_padding">6dp</dimen> <dimen name="omnibox_suggestion_36dp_icon_size">36dp</dimen> <dimen name="omnibox_suggestion_24dp_icon_size">24dp</dimen>
diff --git a/chrome/browser/ui/android/omnibox/java/res/values/styles.xml b/chrome/browser/ui/android/omnibox/java/res/values/styles.xml index 12576ce8..3675404 100644 --- a/chrome/browser/ui/android/omnibox/java/res/values/styles.xml +++ b/chrome/browser/ui/android/omnibox/java/res/values/styles.xml
@@ -39,6 +39,8 @@ <style name="OmniboxPedalChip" parent="SuggestionChip"> <item name="iconWidth">@dimen/omnibox_pedal_suggestion_icon_size</item> <item name="iconHeight">@dimen/omnibox_pedal_suggestion_icon_size</item> + <item name="allowMultipleLines">true</item> + <item name="multiLineVerticalPadding">@dimen/omnibox_pedal_suggestion_text_vertical_padding</item> <item name="textAlignStart">true</item> </style>
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/pedal/PedalSuggestionViewBinder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/pedal/PedalSuggestionViewBinder.java index 8b47902..c04b5e6 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/pedal/PedalSuggestionViewBinder.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/pedal/PedalSuggestionViewBinder.java
@@ -49,9 +49,6 @@ view.getContext().getString(R.string.accessibility_omnibox_pedal, hint); view.getPedalTextView().setText(hint); view.getPedalTextView().setContentDescription(contentDescription); - // NOTE: we avoid using ChipView's allowMultiLine, because it inflates vertical paddings - // in the single-line case, which we don't want. - view.getPedalTextView().setSingleLine(false); final @BrandedColorScheme int brandedColorScheme = model.get(SuggestionCommonProperties.COLOR_SCHEME); view.getPedalTextView().setTextColor(
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb index feb85b1..59a529f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -10,6 +10,7 @@ <translation id="1045899828449635435">Bu saytlardan da data silinsin?</translation> <translation id="1049743911850919806">Gizli Rejim</translation> <translation id="10614374240317010">Heç vaxt saxlanılmır</translation> +<translation id="1062628064301375934">Daha şəxsi veb yaratmağımıza kömək edin</translation> <translation id="107147699690128016">Fayl artırmasını dəyişsəniz, fayl başqa tətbiqdə açıla bilər və cihaz üçün potensial zərərli ola bilər.</translation> <translation id="1089606299949659462">Nəzərdən keçirmə tamamlandı!</translation> <translation id="1095761715416917775">Sinxronlaşdırma datasına həmişə girişinizin olduğuna əmin olun</translation> @@ -106,7 +107,13 @@ <translation id="1554532453982918912">Chrome'u sizin kimi istifadə edən insanlar üçün təkmilləşdirməyə kömək edin</translation> <translation id="1558391695376153246">Anonim tabları qapadın</translation> <translation id="1571304935088121812">İstifadəçi adını kopyalayın</translation> +<translation id="1573632872794824374">Saytlara məlumatlarınızdan daha az istifadə etməklə eyni baxış təcrübəsi təqdim etməyə imkan verən yeni funksiyaları araşdırırıq</translation> <translation id="1592864538817356322">Standart qoruma:</translation> +<translation id="161647866166517041">Spam və dələduzluğun azaldılması saytlara dələduzluqla mübarizə aparmağa və botları insanlardan ayırmağa kömək etmək üçün güvən nişanlarına əsaslanır. + +Müntəzəm olaraq hesaba daxil olmaq kimi saytla qarşılıqlı əlaqəniz əsasında həmin sayt brauzerinizə güvən nişanı verə bilər. Daha sonra ziyarət etdiyiniz digər saytlar keçərli güvən nişanını yoxlayıb tapsalar, onlar sizə bot deyil, insan kimi yanaşacaqlar. + +Güvən nişanları internetdə məxfiliyi yaxşılaşdırır və kim olduğunuzu öyrənmək üçün istifadə edilə bilməz.</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{Seçilmiş 1 elementi silin}other{Seçilmiş # elementi silin}}</translation> <translation id="1633659023549081553">Chrome'un əsas səhifəsində yeni məzmunu kəşf edin</translation> <translation id="1641113438599504367">Təhlükəsiz Axtarış</translation> @@ -167,6 +174,7 @@ <translation id="200114059308480249">Google axtarışlarına ətrafdakı mətn daxil edilsin?</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# Fayl}other{# Fayl}}</translation> <translation id="2015836039326522978"><ph name="APP_NAME" /> Chrome'da açılacaq. Davam etməklə, <ph name="BEGIN_LINK1" />Google Xidmət Şərtləri<ph name="END_LINK1" /> və <ph name="BEGIN_LINK2" />Google Chrome və Chrome ƏS Əlavə Xidmət Şərtləri<ph name="END_LINK2" /> ilə razılaşırsınız. <ph name="BEGIN_LINK3" />Məxfilik Siyasəti<ph name="END_LINK3" /> də tətbiq edilir.</translation> +<translation id="2019145049163614359">Maraq silinsin?</translation> <translation id="2020309681647789787">Bütün sinxronlaşdırılmış cihazlarınızda tarixçəniz olacaq, beləliklə, gördüyünüz işə davam edə bilərsiniz</translation> <translation id="2021896219286479412">Tam ekran sayt nəzarətləri</translation> <translation id="2038563949887743358">Əsas Versiya Sorğusunu aktiv edin</translation> @@ -203,6 +211,7 @@ <translation id="2175927920773552910">QR Kod</translation> <translation id="2176767904800337188">Virtual kart sizi potensial dələduzluqdan qorumaq üçün faktiki kartınızı gizlədir. <ph name="BEGIN_LINK1" />Virtual kartlar haqqında ətraflı məlumat<ph name="END_LINK1" /></translation> <translation id="218608176142494674">Paylaşım</translation> +<translation id="2189903024544168260">Maraq silinib</translation> <translation id="2194856509914051091">Nəzərə alınmalı amillər</translation> <translation id="2200113223741723867">İstifadə datasının paylaşılmasını idarə edin</translation> <translation id="2218567645332692482">Naviqasiyaları HTTPS-ə yüksəltmək və dəstəkləməyən saytları yükləmədən əvvəl sizi xəbərdar etmək</translation> @@ -266,6 +275,7 @@ <translation id="2536728043171574184">Bu səhifənin oflayn nüsxəsinə baxılır</translation> <translation id="2546283357679194313">Kukilər və sayt datası</translation> <translation id="2549516196460093976">Bu QR kodunu göstərən kompüterə daxil olmaq üçün bu planşetdən istifadə edə bilərsiniz.</translation> +<translation id="2558569818338050235">Baxış tarixçəniz gördüyünüz reklamlara təsir edir</translation> <translation id="2561519700418191927">Video önizləmələri</translation> <translation id="2567385386134582609">ŞƏKİL</translation> <translation id="2567545343356994513">Təhlükəli veb saytlar, endirmələr və artırmalara qarşı daha sürətli, fəal qoruma</translation> @@ -277,6 +287,7 @@ <translation id="2604446170045642109">Ayarlarınızda saytlar üçün tünd temanı deaktiv edə bilərsiniz.</translation> <translation id="2612676031748830579">Kart nömrəsi</translation> <translation id="2625189173221582860">Parol kopyalandı</translation> +<translation id="2642087927315268160">Giriş alt vərəqi bağlanıb.</translation> <translation id="2645657967708199252"><ph name="CONNECTION_TYPE" /> bağlantınız endirmənizi yavaşlada bilər</translation> <translation id="2647434099613338025">Dil əlavə edin</translation> <translation id="2649068648233607930">Brauzeriniz <ph name="DOMAIN" /> tərəfindən idarə edilir</translation> @@ -289,11 +300,13 @@ <translation id="2704606927547763573">Kopyalandı</translation> <translation id="2707726405694321444">Səhifəni yeniləyin</translation> <translation id="271033894570825754">Yeni</translation> +<translation id="2711073837061989559">Sınaqlar</translation> <translation id="2718352093833049315">Yalnız Wi-Fi üzərindən</translation> <translation id="2718846868787000099">Tərcih etdiyiniz dillərdə məzmunu göstərmək üçün ziyarət etdiyiniz saytlar tərcihlərinizi görə bilər</translation> <translation id="2723001399770238859">audio</translation> <translation id="2732063072010454421">Daha yaxşı səs təcrübəsi əldə edin</translation> <translation id="2739256783402597439">2G</translation> +<translation id="2746842245914314523">Chrome ayarlarında bu funksiyalar haqqında ətraflı öyrənə bilərsiniz. Sınaqlar zamanı saytlarla qarşılıqlı əlaqəniz bu yeni funksiyaların olmadığı zamandan daha məxfi olmaya bilər.</translation> <translation id="2760989362628427051">Cihazın tünd tema və ya Enerjiyə Qənaət rejimi aktiv olduqda tünd temanı aktiv edin</translation> <translation id="2762000892062317888">indicə</translation> <translation id="276969039800130567"><ph name="USER_EMAIL_ADDRESS" /> olaraq hesaba girdi.</translation> @@ -362,6 +375,7 @@ <translation id="3037177537145227281">Qiymət izlənilir</translation> <translation id="3037517125981011456">Chrome'a giriş tələblərini göstərir</translation> <translation id="3046945242843292318">Növbəti dəfə bu sayta daha tez daxil olun</translation> +<translation id="3055113921564083271">Sildiyiniz maraqlar</translation> <translation id="3055259925215945098">Əlfəcin köçürülüb</translation> <translation id="3055841435094910999">Chrome istifadəniz haqqında məlumat Google'a göndərilir, lakin sizinlə əlaqələndirilmir\n\nChrome'da xəta olarsa, xəta ilə bağlı təfərrüatlar bəzi şəxsi məlumatları ehtiva edə bilər\n\nSinxronizasiyanı aktiv etsəniz, göstəricilərə daxil olduunuz keçidlər haqqında məlumat da daxil ola bilər</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> əlfəcin}other{<ph name="BOOKMARKS_COUNT_MANY" /> əlfəcin}}</translation> @@ -378,6 +392,7 @@ <translation id="3166827708714933426">Panel və pəncərə qısayolları</translation> <translation id="316694332262407393">Chrome artıq burada işləyir.</translation> <translation id="3169472444629675720">Discover</translation> +<translation id="3187472288455401631">Reklam ölçülməsi</translation> <translation id="3207960819495026254">Əlfəcinlənib</translation> <translation id="3208584281581115441">İndi yoxlayın</translation> <translation id="3211426585530211793">Silinmiş <ph name="ITEM_TITLE" /></translation> @@ -408,6 +423,7 @@ <translation id="3290991969712132877">Bura daha cəld giriş üçün bu səhifəni Daha çox seçim düyməsi ilə Əsas ekrana əlavə edin</translation> <translation id="3297344142967351106">Səsli yardım</translation> <translation id="3303414029551471755">Kontentin endirilməsinə davam etmək istəyirsiniz?</translation> +<translation id="3321367458490630980">Maraq əlavə edilib</translation> <translation id="3334729583274622784">Fayl artırması dəyişdirilsin?</translation> <translation id="3341262203274374114">İzləmədən çıxarmaq olmur. Xəta baş verdi.</translation> <translation id="3359667936385849800">Cari xidmət təminatçınızı istifadə edin</translation> @@ -429,8 +445,10 @@ <translation id="3444179773590444986">Saytlar üçün tünd tema barədə rəy paylaşılsın?</translation> <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 endirmə planlanıb}other{# endirmə planlanıb}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> olaraq davam edin</translation> +<translation id="3475207952017699209">Fərdiləşdirilmiş reklamlar haqqında</translation> <translation id="3478363558367712427">Axtarış maşınını seçə bilərsiniz</translation> <translation id="3493531032208478708">Təklif məzmunu haqqında <ph name="BEGIN_LINK" />daha ətraflı<ph name="END_LINK" /></translation> +<translation id="3495219333887281978">Giriş alt vərəqi yarı hündürlükdə açılıb.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="3502647154914451322">Chrome'u istifadə etməklə, <ph name="BEGIN_TOS_LINK" />Google Xidmət Şərtləri<ph name="END_TOS_LINK" /> və <ph name="BEGIN_ATOS_LINK" />Google Chrome və Chrome ƏS Əlavə Xidmət Şərtləri<ph name="END_ATOS_LINK" /> ilə razılaşırsınız.</translation> <translation id="3507132249039706973">Standart Qoruma aktivdir</translation> @@ -449,6 +467,7 @@ <translation id="3568688522516854065">Tabları digər cihazlarınızdan əldə etmək üçün daxil olun və sinxronizasiyanı aktiv edin</translation> <translation id="357465026686164600">Təhlükəsizlik açarı kimi telefon</translation> <translation id="3577473026931028326">Xəta baş verdi. Yenidən cəhd edin.</translation> +<translation id="3578874072190212775">Saytlara dələduzluqla mübarizə aparmağa və botları insanlardan ayırmağa kömək edin</translation> <translation id="3587482841069643663">Hamısı</translation> <translation id="3587596251841506391">Vebdə güvənliyi artırmağa yardım edin</translation> <translation id="3602290021589620013">Önizləmə</translation> @@ -459,6 +478,7 @@ <translation id="363596933471559332">Saxlanmış kredensialları istifadə edərək vebsaytlara avtomatik daxil olun. Funksiya deaktiv olanda sayta hər dəfə girdiyinizdə doğrulama tələb olunacaq.</translation> <translation id="3653111872753786013"><ph name="WEBSITE_TITLE" />: <ph name="WEBSITE_URL" /></translation> <translation id="3677911431265050325">Mobil saytı tələb edin</translation> +<translation id="3678391608108111420">Baxış tarixçəniz gördüyünüz reklamlara və aşağıda təxmin edilən maraqlara təsir edir. Chrome məxfiliyinizi qorumaq üçün bir neçə həftədən bir maraqlarınızı avtomatik silir. Silmədiyiniz təqdirdə maraqlar yenilənir.</translation> <translation id="3685860403008476208">Bu cihazdan istifadə edən hər kəs Anonim rejimdə endirdiyiniz faylları görə bilər</translation> <translation id="3687645719033307815">Bu səhifənin önizləməsinə baxırsınız</translation> <translation id="3690369331356918524">Data pozulması halında parolların ələ keçirilib-keçirilmədiyini Sizə bildirir</translation> @@ -490,6 +510,7 @@ <translation id="3856096718352044181">Bunun etibarlı təminatçı olduğunu doğrulayın, ya da daha sonra təkrar cəhd edin</translation> <translation id="3858860766373142691">Ad</translation> <translation id="3861633093716975811">Populyar videolar</translation> +<translation id="3862592757180800623">İstənilən vaxt Chrome ayarlarında fikrinizi dəyişə bilərsiniz. Sınaqlar zamanı saytlarla qarşılıqlı əlaqəniz bu yeni funksiyaların olmadığı zamandan daha məxfi olmaya bilər.</translation> <translation id="3892148308691398805">Mətni kopyalayın</translation> <translation id="3894427358181296146">Qovluq əlavə edin</translation> <translation id="3899682235662194879">Bütün Anonim Tabları qapadın</translation> @@ -498,6 +519,7 @@ <translation id="3924911262913579434"><ph name="SAFE_BROWSING_MODE" /> aktivdir</translation> <translation id="3927692899758076493">Sans Serif</translation> <translation id="3928666092801078803">Datamı birləşdirin</translation> +<translation id="3932390316856284148">Giriş alt vərəqi tam hündürlükdə açılıb.</translation> <translation id="3934366560681368531">“</translation> <translation id="393697183122708255">Aktiv səsli axtarış əlçatan deyil</translation> <translation id="395377504920307820">Hesab olmadan istifadə edin</translation> @@ -509,6 +531,7 @@ <translation id="3969863827134279083">Yuxarı Köçürün</translation> <translation id="397583555483684758">Sinxronizasiya işləmir</translation> <translation id="3976396876660209797">Bu qısayolu silin və yenidən yaradın</translation> +<translation id="3981902534690264083">Reklamçılar reklamların necə işlədiyini başa düşə bilər</translation> <translation id="3985215325736559418"><ph name="FILE_NAME" /> faylını yenidən endirmək istəyirsiniz?</translation> <translation id="3987993985790029246">Linki kopyalayın</translation> <translation id="4000212216660919741">Ev oflayndır</translation> @@ -526,6 +549,7 @@ <translation id="4096227151372679484">Əlfəcin saxlama prosesi yarım hündürlükdə açılıb</translation> <translation id="4099578267706723511">İstifadə statistikası və qəza raportlarını Google'a göndərməklə Chrome'un gəlişməsini sağlayın.</translation> <translation id="410351446219883937">Avtomatik oxutma</translation> +<translation id="4106587138345390261">Chrome saytlara məlumatlarınızdan daha az istifadə etməklə eyni baxış təcrübəsi təqdim etməyə imkan verən yeni funksiyaları araşdırır</translation> <translation id="4108314971463891922">İzləyin</translation> <translation id="4108998448622696017">Təhlükəli hadisələr baş verdikdə onları aşkarlayır və sizə xəbərdarlıq edir.</translation> <translation id="4116038641877404294">Oflayn istifadə etmək üçün səhifələri endirin</translation> @@ -546,6 +570,7 @@ <translation id="4248098802131000011">Data pozuntuları və digər güvənlik məsələlərinə qarşı parollarınızı qoruyun</translation> <translation id="4250229828105606438">Skrinşot</translation> <translation id="4256782883801055595">Açıq mənbə lisenziyaları</translation> +<translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Hansı data istifadə olunur:<ph name="END_BOLD" /> Baxış tarixçəniz, bu cihazda Chrome istifadə edərək ziyarət etdiyiniz saytların qeydi.</translation> <translation id="4263656433980196874">Assistentin səsli axtarış razılıq UI-si tam hündürlükdə açılıb</translation> <translation id="4269820728363426813">Link ünvanını kopyalayın</translation> <translation id="4290281343757112331">Daha sonra endirilsin?</translation> @@ -556,6 +581,7 @@ <translation id="4307992518367153382">Əsaslar</translation> <translation id="4320177379694898372">İnternet bağlantısı yoxdur</translation> <translation id="4321739720395210191">Kameranı açmaq olmur. Cihazı yenidən başladıb təkrar cəhd edin.</translation> +<translation id="4324158606177867698">Sildiyiniz maraq burada görünəcək</translation> <translation id="433213510553688132">İzlənilir...</translation> <translation id="4335835283689002019">Təhlükəsiz Baxış deaktivdir</translation> <translation id="4351244548802238354">Dialoqu qapadın</translation> @@ -643,6 +669,7 @@ <translation id="4807098396393229769">Kart Adı</translation> <translation id="481574578487123132">Əlaqələndirilmiş cihazlar</translation> <translation id="4818017973810341238">Rəqəmsal aktiv keçidlərinin doğrulanması <ph name="VIOLATED_URL" /> ünvanında alınmadı</translation> +<translation id="4826163340425232009">Giriş alt vərəqi.</translation> <translation id="4831037795716408498">Məzmunu endirin</translation> <translation id="4834007576107377210">Axtarış tarixçənizi silmək üçün axtarış sisteminizin təlimatlarına (təmin edilibsə) baxın</translation> <translation id="4834250788637067901">Google Pay istifadə edən ödəniş metodları, təkliflər və ünvanlar</translation> @@ -697,6 +724,7 @@ <translation id="5091199029769593641">Tezliklə yeni tab açdığınız zaman <ph name="SITE_NAME" /> saytından hekayələri görəcəksiniz. İzlədiyiniz saytlar Google hesabınızda saxlanılır. Onları Təkliflər ayarlarında idarə edə bilərsiniz.</translation> <translation id="5091249083535528968">Artırılmış istifadə datası</translation> <translation id="509429900233858213">Xəta baş verdi.</translation> +<translation id="5098190077610408701">Maraq əlavə edilsin?</translation> <translation id="5102401324271069229">Sayt parolunuzu oğurlamağa çalışdıqda və ya zərərli fayl endirdiyinizdə Chrome səhifə məzmunundan kiçik nümunələr də daxil olmaqla, URL'ləri Təhlükəsiz Baxışa göndərə bilər</translation> <translation id="510275257476243843">1 saat qaldı</translation> <translation id="5115811374190515607"><ph name="PRODUCT_NAME" /> məkanına</translation> @@ -704,6 +732,7 @@ <translation id="5123685120097942451">Aanonim tab</translation> <translation id="5126510351761255129">Kartı təsdiq edin</translation> <translation id="5132942445612118989">Bütün cihazlarda parol, tarixçə və s. sinxronizasiya edin</translation> +<translation id="5136889366284282380">Təcrübə zamanı Chrome son baxış tarixçənizə əsasən maraqlana biləcəyiniz mövzuları təxmin edəcək. Sonra kim olduğunuzu öyrənmədən, ziyarət etdiyiniz bəzi saytlar bu məlumatı sizə uyğun reklamlar göstərmək üçün istifadə edəcək.</translation> <translation id="5139940364318403933">Google Diskdən istifadə etməyi öyrənin</translation> <translation id="5142281402488957685">Yeni hekayələr üçün aşağı çəkərək yeniləyin</translation> <translation id="5152843274749979095">Heç bir dəstəklənən tətbiq quraşdırılmayıb</translation> @@ -776,6 +805,7 @@ <translation id="5578795271662203820">Bu şəkil üçün <ph name="SEARCH_ENGINE" /> axtarın</translation> <translation id="5581519193887989363">Sinxronizasiya seçimlərini <ph name="BEGIN_LINK1" />ayarlarda<ph name="END_LINK1" /> edə bilərsiniz.</translation> <translation id="5590372121997663538">Bu kompüteri yadda saxlayın</translation> +<translation id="559871659088672663">Bu funksiya hazırda inkişaf mərhələsindədir</translation> <translation id="5599455543593328020">Anonim rejim</translation> <translation id="5599941490345670218">Google Assistent sizin üçün vebsaytlarda əməliyyatlar icra edə bilər</translation> <translation id="5620163320393916465">Yadda saxlanmış parol yoxdur</translation> @@ -785,6 +815,9 @@ <translation id="5628604359369369630">Oxunmayıb - Oflayn əlçatandır</translation> <translation id="5639724618331995626">Bütün saytlara icazə verin</translation> <translation id="5648166631817621825">Son 7 gün</translation> +<translation id="5655245063036102919">Reklamın ölçülməsi ziyarət etdiyiniz saytlara Chrome'dan sayta reklamlarının performansını ölçməyə kömək edən məlumat tələb etməyə imkan verir. Reklamın ölçülməsi saytlar arasında mümkün qədər az məlumat ötürməklə saytlararası izləməni məhdudlaşdırır. + +<ph name="BEGIN_LINK" />Baxış tarixçənizə<ph name="END_LINK" /> giriş edərək sizinlə əlaqəli ölçmə məlumatlarına nəzarət edə bilərsiniz.</translation> <translation id="5655963694829536461">Endirmələri axtarın</translation> <translation id="5659593005791499971">E-poçt</translation> <translation id="5665379678064389456"><ph name="APP_NAME" /> tətbiqində tədbir yaradın</translation> @@ -870,6 +903,7 @@ <translation id="6069177176307973611">Məxfilik və təhlükəsizlik ayarlarını nəzərdən keçirin</translation> <translation id="6070730414166672373">Bankınız əlaqə saxlanılır\u2026</translation> <translation id="6085886413119427067">Güvənli bağlantı vasitəsilə vebsaytlara necə qoşulmağı müəyyən edir</translation> +<translation id="6091413777268123602">Məxfilik Sendboksu sınaqları ilə saytlar datanızdan daha az istifadə etməklə eyni baxış təcrübəsi təqdim edə bilər. Bu, məxfiliyi artırır və saytlararası izləməni azaldır. Hazır olduqda yeni sınaqlar əlavə edəcəyik.</translation> <translation id="60923314841986378"><ph name="HOURS" /> saat qaldı</translation> <translation id="6095578583683628124">Google həm də defolt axtarış sisteminizdirsə daha yaxşı, kontekstə uyğun təkliflər görəcəksiniz</translation> <translation id="6108923351542677676">Quraşdırma icra olunur...</translation> @@ -994,11 +1028,13 @@ <translation id="671481426037969117"><ph name="FQDN" /> taymerinin vaxtı bitir. Sabah yenidən başlayacaq.</translation> <translation id="6715020873764921614">Hər halda <ph name="FILE_NAME" /> (<ph name="FILE_SIZE" />) faylını endirmək istəyirsiniz?</translation> <translation id="6719634564325948108">QR Kodu ilə qoşulun?</translation> +<translation id="6737612727720318154">Elementlə əlaqəli reklamların sizin üçün faydalı olacağını düşünürsünüzsə, marağa və ya sayta icazə verin</translation> <translation id="6738516213925468394">Data <ph name="TIME" /> tarixində <ph name="BEGIN_LINK" />sinxronizasiya parolu<ph name="END_LINK" /> ilə şifrələnib. Sinxronizasiyanı başlatmaq üçün klikləyin.</translation> <translation id="6738867403308150051">Endirilir...</translation> <translation id="6751521182688001123">Cəld yeni tab açın. Bu qısayolu redaktə etmək üçün toxunub saxlayın.</translation> <translation id="6756507620369789050">Rəy paylaşın</translation> <translation id="6767294960381293877">Yarı hündürlükdə açılan tabı paylaşa biləcəyiniz cihazların siyahısı.</translation> +<translation id="6770042910635026163">Maraqlarınızı müəyyən edən ziyarət etdiyiniz saytlar</translation> <translation id="6770602306803890733">Siz və vebdəki hər kəs üçün təhlükəsizliyi artırır</translation> <translation id="6783942555455976443">Bu səhifəyə daha sonra baxmaq üçün yadda saxlayın və xatırladıcı qəbul edin</translation> <translation id="6795633245022906657">Cəld yeni tab açın. Bu qısayolu redaktə etmək üçün Ayarlara keçin.</translation> @@ -1059,6 +1095,7 @@ <translation id="7093803425429738190">Emosiya əlavə edin</translation> <translation id="7105047059074518658">Cihazlar arasında asan baxış üçün daxil olun</translation> <translation id="7106762743910369165">Təşkilatınız brauzerinizi idarə edir</translation> +<translation id="7130504491556983216">Vebdə axtarış etdiyiniz zaman maraqların siyahısı burada görünəcək</translation> <translation id="7138678301420049075">Digər</translation> <translation id="7143462160780459030">Skrinşot çəkmək olmur. Yenə cəhd edin.</translation> <translation id="7146622961999026732">Bu saytlar və tətbiqlər sizə vacib görünür:</translation> @@ -1093,6 +1130,7 @@ <translation id="7339898014177206373">Yeni pəncərə</translation> <translation id="7340958967809483333">"Kəşf edin" üçün seçimlər</translation> <translation id="7352339641508007922">Uzun skrinşot çəkmək üçün sürüşdürün</translation> +<translation id="7352531447904559593">Brauzer əsaslı reklam fərdiləşdirməsi haqqında ətraflı məlumat əldə edin</translation> <translation id="7352651011704765696">Xəta oldu</translation> <translation id="7352939065658542140">VİDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Seçilmiş 1 elementi paylaşın}other{Seçilmiş # elementi paylaşın}}</translation> @@ -1148,6 +1186,7 @@ <translation id="7619072057915878432">Şəbəkə problemi səbəbi ilə <ph name="FILE_NAME" /> faylının yüklənməsi uğursuz oldu.</translation> <translation id="7626032353295482388">Chrome'a xoş gəlmisiniz</translation> <translation id="7630202231528827509">Provayder URL-i</translation> +<translation id="7634280112532283638">Spam və dələduzluğun azaldılması</translation> <translation id="7638584964844754484">Yanlış parol</translation> <translation id="7641339528570811325">Brauzinq datasını təmizləyin...</translation> <translation id="7646772052135772216">Parol sinxronizasiyası işləmir</translation> @@ -1181,6 +1220,7 @@ <translation id="7805768142964895445">Status</translation> <translation id="7808889146555843082">Bu parolu sildikdə <ph name="SITE" /> saytında hesabınız silinməyəcək. Hesabınızı digərlərindən qorumaq üçün parolunuzu dəyişin, ya da onu <ph name="SITE" /> saytından silin.</translation> <translation id="7810647596859435254">Bununla açın...</translation> +<translation id="7814332119093857963"><ph name="BEGIN_BOLD" />Datanızı necə idarə edə bilərsiniz:<ph name="END_BOLD" /> Maraqlarınız hər həftə silinir və yenilənir. İstənilən vaxt marağı bloklaya bilərsiniz.</translation> <translation id="7815484226266492798">Uzun Skrinşot</translation> <translation id="78270725016672455">Kompüteriniz bu cihazı sayta daxil olmaq üçün qeydiyyatdan keçirmək istəyir</translation> <translation id="7844171778363018843">Sinxronizasiya etmək üçün data seçilməyib</translation> @@ -1207,6 +1247,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> köhnədir.</translation> <translation id="7944772052836377867">Sinxronizasiya kimliyinizi təsdiqləməlidir</translation> <translation id="7947953824732555851">Qəbul edin və daxil olun</translation> +<translation id="7959157064403954786">Daha şəffaf reklamları sınayın</translation> <translation id="7961015016161918242">Heç vaxt</translation> <translation id="7961926449547174351">Yaddaş girişini deaktiv etmisiniz, aktiv etmək üçün Ayarlara keçin.</translation> <translation id="7963646190083259054">Vendor:</translation> @@ -1286,6 +1327,7 @@ <translation id="835847953965672673"><ph name="NUMBER_OF_DOWNLOADS" /> endirmə bərpa edilib</translation> <translation id="8364299278605033898">Populyar veb saytlara baxın</translation> <translation id="8368001212524806591">Qiyməti izləyin</translation> +<translation id="8383226135083126309"><ph name="BEGIN_BOLD" />Bu datanı necə istifadə edirik:<ph name="END_BOLD" /> Chrome maraqlarınızı təxmin edə bilər. Daha sonra ziyarət etdiyiniz sayt gördüyünüz reklamları fərdiləşdirmək üçün Chrome'dan maraqlarınızı görməyi tələb edə bilər.</translation> <translation id="8387617938027387193">Kimliyinizi doğrulayın</translation> <translation id="8393700583063109961">Mesaj göndərin</translation> <translation id="8394720698884623075">URL'ləri Chrome'da saxlanılan təhlükəli saytların siyahısı ilə yoxlayır</translation> @@ -1323,6 +1365,7 @@ <translation id="8505766168025405649">Endirmə statusu üçün bildirişə baxın</translation> <translation id="8514477925623180633">Chrome'da saxlanılan parolları eksport edin</translation> <translation id="8516012719330875537">Şəkil Redaktoru</translation> +<translation id="8516431725144212809">Chrome tərəfindən təxmin edilən maraqlarınız</translation> <translation id="8523928698583292556">Yadda saxlanmış parolu silin</translation> <translation id="8540136935098276800">Düzgün formatlanmış URL daxil edin</translation> <translation id="854522910157234410">Bu səhifəni açın</translation> @@ -1354,6 +1397,7 @@ <translation id="8659579665266920523">Chrome ilə necə axtarış etməli</translation> <translation id="8662811608048051533">Bununla əksər saytlardan çıxacaqsınız.</translation> <translation id="8664979001105139458">Fayl adı artıq mövcuddur</translation> +<translation id="8667760277771450375">Saytlara reklam spamını və dələduzluğu dayandırmağa imkan verərkən saytlararası izləməni məhdudlaşdırmağın yollarını araşdırırıq.</translation> <translation id="8676789164135894283">Giriş doğrulamaları</translation> <translation id="867767487203716855">Növbəti güncəlləmə</translation> <translation id="8683039184091909753">şəkil</translation> @@ -1462,6 +1506,7 @@ <translation id="962979164594783469">Bu tətbiqi quraşdırın</translation> <translation id="96681097142096641">Sadələşdirilmiş səhifəyə baxmaq istəyirsiniz?</translation> <translation id="968900484120156207">Girdiyiniz səhifələr burada görünəcək</translation> +<translation id="969573236494556070">Saytlar arasında paylaşımı məhdudlaşdırın</translation> <translation id="970715775301869095"><ph name="MINUTES" /> dəqiqə qaldı</translation> <translation id="981121421437150478">Oflayn</translation> <translation id="983192555821071799">Bütün panelləri bağlayın</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb index cf09192..32d0774 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
@@ -685,6 +685,7 @@ <translation id="4988526792673242964">Старонкі</translation> <translation id="5001388021414335527">Падпісацца на сайт можна тут</translation> <translation id="5004416275253351869">Параметры дзейнасці Google</translation> +<translation id="5005141133360250920">Рэакцыя выдалена</translation> <translation id="5005498671520578047">Капіраваць пароль</translation> <translation id="5011311129201317034"><ph name="SITE" /> хоча падключыцца</translation> <translation id="5016205925109358554">З засечкамі</translation> @@ -740,6 +741,7 @@ <translation id="5368227114232678694">Для прыватнага прагляду вэб-старонак на гэтай прыладзе выкарыстоўвайце рэжым інкогніта</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> адкрытая ўкладка. Націсніце, каб пераключыцца паміж укладкамі.}one{<ph name="OPEN_TABS_MANY" /> адкрытая ўкладка. Націсніце, каб пераключыцца паміж укладкамі.}few{<ph name="OPEN_TABS_MANY" /> адкрытыя ўкладкі. Націсніце, каб пераключыцца паміж укладкамі.}many{<ph name="OPEN_TABS_MANY" /> адкрытых укладак. Націсніце, каб пераключыцца паміж укладкамі.}other{<ph name="OPEN_TABS_MANY" /> адкрытай укладкі. Націсніце, каб пераключыцца паміж укладкамі.}}</translation> <translation id="5375577065097716013">Шукаць праз Аб'ектыў <ph name="BEGIN_NEW" />Навінка<ph name="END_NEW" /></translation> +<translation id="5376898820269806588">Рэакцыя зменена</translation> <translation id="5403644198645076998">Дазваляць толькі пэўныя сайты</translation> <translation id="5409881200985013443">Адправіць код <ph name="ONE_TIME_CODE" /> на прыладу "<ph name="CLIENT_NAME" />"?</translation> <translation id="5414836363063783498">Ідзе праверка…</translation> @@ -1072,6 +1074,7 @@ <translation id="718926126787620637">Спіс папак з закладкамі разгорнуты на ўвесь экран</translation> <translation id="7191430249889272776">Укладка адкрыта ў фоне.</translation> <translation id="7196215469483532480">Тлумачэнні адносна дапаможніка па прыватнасці разгорнуты на ўвесь экран</translation> +<translation id="7208109991155904980">Рэакцыя перамешчана</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{Чакаецца 1 спампоўка}one{Чакаецца # спампоўка}few{Чакаецца # спампоўкі}many{Чакаецца # спамповак}other{Чакаецца # спампоўкі}}</translation> <translation id="7237045078887540010">Выкарыстоўваючы Chrome, вы згаджаецеся з <ph name="BEGIN_TOS_LINK" />Умовамі выкарыстання Google<ph name="END_TOS_LINK" /> і <ph name="BEGIN_ATOS_LINK" />Дадатковымі ўмовамі выкарыстання Google Chrome і Chrome OS<ph name="END_ATOS_LINK" />. Прымяняецца таксама <ph name="BEGIN_PRIVACY_LINK" />Палітыка прыватнасці<ph name="END_PRIVACY_LINK" />.</translation> <translation id="7242755609445462077">Стылізаванае вылучанае змесціва (<ph name="CURRENT_DATE" />)</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb index 45c052dd..e54f689 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
@@ -687,6 +687,7 @@ <translation id="4988526792673242964">পৃষ্ঠাসমূহ</translation> <translation id="5001388021414335527">এই সাইট এখানে ফলো করুন</translation> <translation id="5004416275253351869">Google অ্যাক্টিভিটির নিয়ন্ত্রণ</translation> +<translation id="5005141133360250920">প্রতিক্রিয়া মুছে ফেলা হয়েছে</translation> <translation id="5005498671520578047">পাসওয়ার্ড কপি করুন</translation> <translation id="5011311129201317034"><ph name="SITE" /> এদের সঙ্গে সংযুক্ত হতে চায়</translation> <translation id="5016205925109358554">Serif</translation> @@ -742,6 +743,7 @@ <translation id="5368227114232678694">এই ডিভাইসে ব্যক্তিগতভাবে ব্রাউজ করতে, ছদ্মবেশী মোড ব্যবহার করুন</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" />টি খোলা ট্যাব, এক ট্যাব থেকে অন্য ট্যাবে যেতে ট্যাপ করুন}one{<ph name="OPEN_TABS_MANY" />টি খোলা ট্যাব, এক ট্যাব থেকে অন্য ট্যাবে যেতে ট্যাপ করুন}other{<ph name="OPEN_TABS_MANY" />টি খোলা ট্যাব, এক ট্যাব থেকে অন্য ট্যাবে যেতে ট্যাপ করুন}}</translation> <translation id="5375577065097716013">Google Lens-এর <ph name="BEGIN_NEW" />নতুন<ph name="END_NEW" /> ভার্সন দিয়ে ছবি সার্চ করুন</translation> +<translation id="5376898820269806588">প্রতিক্রিয়া পরিবর্তন করা হয়েছে</translation> <translation id="5403644198645076998">শুধুমাত্র নির্দিষ্ট কিছু সাইটকে অনুমতি দিন</translation> <translation id="5409881200985013443"><ph name="CLIENT_NAME" />-এ <ph name="ONE_TIME_CODE" /> জমা দিতে চান?</translation> <translation id="5414836363063783498">যাচাই করা হচ্ছে...</translation> @@ -1074,6 +1076,7 @@ <translation id="718926126787620637">সম্পূর্ণ খোলা বুকমার্ক ফোল্ডারের তালিকা</translation> <translation id="7191430249889272776">পটভূমিতে ট্যাব খোলা হয়েছে।</translation> <translation id="7196215469483532480">গোপনীয়তা সম্পর্কিত গাইডের ব্যাখ্যা সম্পূর্ণ স্ক্রিন জুড়ে খুলেছে</translation> +<translation id="7208109991155904980">প্রতিক্রিয়া সরানো হয়েছে</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{১টি ডাউনলোড বাকি আছে}one{#টি ডাউনলোড বাকি আছে}other{#টি ডাউনলোড বাকি আছে}}</translation> <translation id="7237045078887540010">Chrome ব্যবহার করার মাধ্যমে, আপনি <ph name="BEGIN_TOS_LINK" />Google পরিষেবার শর্তাবলী<ph name="END_TOS_LINK" /> এবং <ph name="BEGIN_ATOS_LINK" />Google Chrome ও Chrome OS-এর পরিষেবার অতিরিক্ত শর্তাবলী<ph name="END_ATOS_LINK" /> মেনে নিচ্ছেন। এছাড়াও <ph name="BEGIN_PRIVACY_LINK" />গোপনীয়তা নীতি<ph name="END_PRIVACY_LINK" /> প্রযোজ্য।</translation> <translation id="7242755609445462077">স্টাইলযুক্ত হাইলাইট <ph name="CURRENT_DATE" /></translation> @@ -1388,6 +1391,7 @@ <translation id="8881973373982641723">ইতিহাস মুছে ফেলে। এর মধ্যে সার্চ বক্সের ব্রাউজিং ইতিহাসও থাকে।</translation> <translation id="889338405075704026">Chrome সেটিংসে যান</translation> <translation id="8898822736010347272">আপনার দেখা কিছু পৃষ্ঠার ইউআরএল, সীমিত সিস্টেম সম্পর্কিত তথ্য এবং কিছু পৃষ্ঠার কন্টেন্ট Google-এর কাছে পাঠান যাতে নতুন ঝুঁকি চিহ্নিত করে ওয়েব ব্যবহারকারীর প্রত্যেককে সুরক্ষিত রাখা যায়।</translation> +<translation id="8906502871739599113">প্রতিক্রিয়া ডুপ্লিকেট করা হয়েছে</translation> <translation id="8909135823018751308">শেয়ার করুন...</translation> <translation id="8912362522468806198">Google অ্যাকাউন্ট</translation> <translation id="8920114477895755567">অভিভাবকের বিশদ বিবরণের জন্য অপেক্ষা করা হচ্ছে৷</translation> @@ -1407,6 +1411,7 @@ <translation id="8970887620466824814">কিছু সমস্যা হয়েছে।</translation> <translation id="8972098258593396643">ডিফল্ট ফোল্ডারে ডাউনলোড করবেন?</translation> <translation id="8987641763863173640">ভিডিও প্রিভিউ সেটিংস ম্যানেজ করুন</translation> +<translation id="898854820045159673">প্রতিক্রিয়া যোগ করা হয়েছে</translation> <translation id="8993760627012879038">ছদ্মবেশী মোডে একটি নতুন ট্যাব খুলুন</translation> <translation id="8996847606757455498">অন্য একটি পরিষেবা প্রদানকারী বেছে নিন</translation> <translation id="8998729206196772491">আপনি <ph name="MANAGED_DOMAIN" /> দ্বারা পরিচালিত একটি অ্যাকাউন্টের মাধ্যমে সাইন-ইন করছেন এবং এর অ্যাডমিনিস্ট্রেটরকে আপনার Chrome ডেটা নিয়ন্ত্রণ করতে দিচ্ছেন৷ আপনার ডেটা এই অ্যাকাউন্টের সাথে স্থায়ীভাবে আবদ্ধ হবে৷ Chrome থেকে সাইন-আউট করলে এই ডিভাইস থেকে আপনার ডেটা মুছে ফেলা হবে, কিন্তু এটা আপনার Google অ্যাকাউন্টে সঞ্চিত থাকবে।</translation> @@ -1441,6 +1446,7 @@ <translation id="9158770349521403363">শুধুমাত্র কন্টেন্ট শেয়ার করুন</translation> <translation id="916446198114569890">আপনি যেসব URL ভিজিট করেন তা আপনার Google অ্যাকাউন্টে সেভ করা হয়</translation> <translation id="9169507124922466868">নেভিগেশনের ইতিহাস অর্ধেক খোলা রয়েছে</translation> +<translation id="9187955620966010988">প্রতিক্রিয়া অ্যাডজাস্ট করা হয়েছে</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{১ মিনিট আগে চেক করা হয়েছে}one{# মিনিট আগে চেক করা হয়েছে}other{# মিনিট আগে চেক করা হয়েছে}}</translation> <translation id="9204836675896933765">১টি ফাইল বাকি</translation> <translation id="9205933215779845960">এই পৃষ্ঠাটি খুঁজে পাওয়া যাচ্ছে না। আপনার লেখা বানান চেক করুন বা <ph name="SEARCH_ENGINE" />-এ সার্চ করে দেখুন।</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb index c5a0fc1..647b302a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
@@ -629,7 +629,7 @@ <translation id="4736934858538408121">Targeta virtual</translation> <translation id="4738836084190194332">Última sincronització: <ph name="WHEN" /></translation> <translation id="4741753828624614066">Obtindrás suggeriments millorats a la barra d'adreces</translation> -<translation id="4742970037960872810">Suprimeix el marcatge</translation> +<translation id="4742970037960872810">Suprimeix les marques</translation> <translation id="4749960740855309258">Obre una pestanya nova</translation> <translation id="4758061975920522644">Comparteix només la imatge</translation> <translation id="4759238208242260848">Baixades</translation> @@ -685,6 +685,7 @@ <translation id="4988526792673242964">Pàgines</translation> <translation id="5001388021414335527">Segueix aquest lloc web aquí</translation> <translation id="5004416275253351869">Controls d'activitat de Google</translation> +<translation id="5005141133360250920">La reacció s'ha suprimit</translation> <translation id="5005498671520578047">Copia la contrasenya</translation> <translation id="5011311129201317034"><ph name="SITE" /> es vol connectar</translation> <translation id="5016205925109358554">Serif</translation> @@ -740,6 +741,7 @@ <translation id="5368227114232678694">Per navegar de manera privada en aquest dispositiu, prova el mode d'incògnit</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> pestanya oberta; toca per canviar de pestanya}other{<ph name="OPEN_TABS_MANY" /> pestanyes obertes; toca per canviar de pestanya}}</translation> <translation id="5375577065097716013">Cerca la imatge amb Lens <ph name="BEGIN_NEW" />Novetat<ph name="END_NEW" /></translation> +<translation id="5376898820269806588">La reacció s'ha canviat</translation> <translation id="5403644198645076998">Permet només certs llocs web</translation> <translation id="5409881200985013443">Vols enviar <ph name="ONE_TIME_CODE" /> a <ph name="CLIENT_NAME" />?</translation> <translation id="5414836363063783498">S'està verificant...</translation> @@ -1072,6 +1074,7 @@ <translation id="718926126787620637">La llista de carpetes d'adreces d'interès s'ha obert a alçada completa</translation> <translation id="7191430249889272776">Pestanya oberta en segon pla</translation> <translation id="7196215469483532480">L'explicació de la guia de privadesa s'ha obert a alçada completa</translation> +<translation id="7208109991155904980">La reacció s'ha mogut</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{1 baixada pendent}other{# baixades pendents}}</translation> <translation id="7237045078887540010">En utilitzar Chrome, acceptes les <ph name="BEGIN_TOS_LINK" />condicions del servei de Google<ph name="END_TOS_LINK" /> i les <ph name="BEGIN_ATOS_LINK" />condicions del servei addicionals de Google Chrome i Chrome OS<ph name="END_ATOS_LINK" />. També s'aplica la <ph name="BEGIN_PRIVACY_LINK" />política de privadesa<ph name="END_PRIVACY_LINK" />.</translation> <translation id="7242755609445462077">Marca estilitzada el dia <ph name="CURRENT_DATE" /></translation> @@ -1386,6 +1389,7 @@ <translation id="8881973373982641723">Esborra l'historial, inclòs el del quadre de cerca.</translation> <translation id="889338405075704026">Ves a la configuració de Chrome</translation> <translation id="8898822736010347272">Envia a Google els URL d'algunes pàgines que visites, informació limitada del sistema i part del contingut de les pàgines per ajudar a detectar amenaces noves i protegir tothom al web.</translation> +<translation id="8906502871739599113">Reacció duplicada</translation> <translation id="8909135823018751308">Comparteix...</translation> <translation id="8912362522468806198">Compte de Google</translation> <translation id="8920114477895755567">S'està esperant la informació parental.</translation> @@ -1405,6 +1409,7 @@ <translation id="8970887620466824814">S'ha produït un error.</translation> <translation id="8972098258593396643">Vols baixar el fitxer a la carpeta predeterminada?</translation> <translation id="8987641763863173640">Gestiona la configuració de la previsualització de vídeos</translation> +<translation id="898854820045159673">Reacció afegida</translation> <translation id="8993760627012879038">Obre una pestanya nova en mode d'incògnit</translation> <translation id="8996847606757455498">Tria un altre proveïdor</translation> <translation id="8998729206196772491">Estàs iniciant la sessió amb un compte gestionat per <ph name="MANAGED_DOMAIN" /> i estàs donant a l'administrador el control de les teves dades de Chrome. Les dades passaran a estar vinculades a aquest compte permanentment. Si tanques la sessió de Chrome, se suprimiran les teves dades d'aquest dispositiu, però continuaran emmagatzemades al teu compte de Google.</translation> @@ -1439,6 +1444,7 @@ <translation id="9158770349521403363">Comparteix només el contingut</translation> <translation id="916446198114569890">Els URL que visites es desen al teu Compte de Google</translation> <translation id="9169507124922466868">L'historial de navegació està obert fins a la meitat</translation> +<translation id="9187955620966010988">Reacció ajustada</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{S'ha comprovat fa 1 minut}other{S'ha comprovat fa # minuts}}</translation> <translation id="9204836675896933765">Queda 1 fitxer</translation> <translation id="9205933215779845960">No es troba aquesta pàgina. Comprova'n l'ortografia o prova de fer una cerca a <ph name="SEARCH_ENGINE" />.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb index a7323970..b31e94de 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
@@ -685,6 +685,7 @@ <translation id="4988526792673242964">Stránky</translation> <translation id="5001388021414335527">Zde můžete web sledovat</translation> <translation id="5004416275253351869">Ovládací prvky aktivity Google</translation> +<translation id="5005141133360250920">Reakce byla smazána</translation> <translation id="5005498671520578047">Kopírování hesla</translation> <translation id="5011311129201317034">Web <ph name="SITE" /> žádá o připojení</translation> <translation id="5016205925109358554">Patková</translation> @@ -740,6 +741,7 @@ <translation id="5368227114232678694">Pokud na tomto zařízení chcete procházet internet v soukromí, vyzkoušejte anonymní režim</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{Je otevřená <ph name="OPEN_TABS_ONE" /> karta, můžete mezi nimi přepínat klepnutím}few{Je otevřených <ph name="OPEN_TABS_MANY" /> karet, můžete mezi nimi přepínat klepnutím}many{Je otevřených <ph name="OPEN_TABS_MANY" /> karty, můžete mezi nimi přepínat klepnutím}other{Je otevřených <ph name="OPEN_TABS_MANY" /> karet, můžete mezi nimi přepínat klepnutím}}</translation> <translation id="5375577065097716013">Vyhledat obrázek pomocí Google Lens <ph name="BEGIN_NEW" />Novinka<ph name="END_NEW" /></translation> +<translation id="5376898820269806588">Reakce byla změněna</translation> <translation id="5403644198645076998">Povolit pouze určité weby</translation> <translation id="5409881200985013443">Odeslat v klientu <ph name="CLIENT_NAME" /> kód <ph name="ONE_TIME_CODE" />?</translation> <translation id="5414836363063783498">Ověřování…</translation> @@ -1072,6 +1074,7 @@ <translation id="718926126787620637">Seznam složek se záložkami otevřený na celou výšku</translation> <translation id="7191430249889272776">Karta je otevřena na pozadí.</translation> <translation id="7196215469483532480">Vysvětlení průvodce ochranou soukromí otevřené na plnou výšku</translation> +<translation id="7208109991155904980">Reakce byla přesunuta</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{1 nevyřízené stahování}few{# nevyřízená stahování}many{# nevyřízeného stahování}other{# nevyřízených stahování}}</translation> <translation id="7237045078887540010">Používáním Chromu vyjadřujete souhlas se <ph name="BEGIN_TOS_LINK" />smluvními podmínkami společnosti Google<ph name="END_TOS_LINK" /> a <ph name="BEGIN_ATOS_LINK" />dodatečnými smluvními podmínkami prohlížeče Chrome a systému Chrome OS<ph name="END_ATOS_LINK" />. Platí také <ph name="BEGIN_PRIVACY_LINK" />zásady ochrany soukromí<ph name="END_PRIVACY_LINK" />.</translation> <translation id="7242755609445462077">Stylizované zvýraznění <ph name="CURRENT_DATE" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb index 905aacc..782233d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
@@ -685,6 +685,7 @@ <translation id="4988526792673242964">Sider</translation> <translation id="5001388021414335527">Følg dette website her</translation> <translation id="5004416275253351869">Aktivitetsadministration på Google</translation> +<translation id="5005141133360250920">Reaktionen er slettet</translation> <translation id="5005498671520578047">Kopiér adgangskode</translation> <translation id="5011311129201317034"><ph name="SITE" /> vil gerne oprette forbindelse</translation> <translation id="5016205925109358554">Serif</translation> @@ -740,6 +741,7 @@ <translation id="5368227114232678694">Hvis du vil bruge nettet privat på denne enhed, kan du prøve at bruge inkognitotilstand</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> åben fane – tryk for at skifte fane}one{<ph name="OPEN_TABS_MANY" /> åben fane – tryk for at skifte fane}other{<ph name="OPEN_TABS_MANY" /> åbne faner – tryk for at skifte fane}}</translation> <translation id="5375577065097716013">Søg efter billedet med Google Lens <ph name="BEGIN_NEW" />Nyhed<ph name="END_NEW" /></translation> +<translation id="5376898820269806588">Reaktionen er ændret</translation> <translation id="5403644198645076998">Tillad kun bestemte websites</translation> <translation id="5409881200985013443">Vil du angive <ph name="ONE_TIME_CODE" /> på <ph name="CLIENT_NAME" />?</translation> <translation id="5414836363063783498">Bekræfter...</translation> @@ -1072,6 +1074,7 @@ <translation id="718926126787620637">Listen over bogmærkemapper er åbnet i fuld højde</translation> <translation id="7191430249889272776">Fanen blev åbnet i baggrunden.</translation> <translation id="7196215469483532480">Beskrivelsen af Privatlivsguide er åbnet i fuld højde</translation> +<translation id="7208109991155904980">Reaktionen er flyttet</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{1 download afventer}one{# download afventer}other{# downloads afventer}}</translation> <translation id="7237045078887540010">Når du bruger Chrome, accepterer du <ph name="BEGIN_TOS_LINK" />Googles servicevilkår<ph name="END_TOS_LINK" /> og de <ph name="BEGIN_ATOS_LINK" />yderligere servicevilkår for Google Chrome og Chrome OS<ph name="END_ATOS_LINK" />. <ph name="BEGIN_PRIVACY_LINK" />Privatlivspolitikken<ph name="END_PRIVACY_LINK" /> er også gældende.</translation> <translation id="7242755609445462077">Stiliseret note <ph name="CURRENT_DATE" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb index dc0eaed..1a6cc9e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
@@ -10,6 +10,7 @@ <translation id="1045899828449635435">Also clear data from these sites?</translation> <translation id="1049743911850919806">Incognito</translation> <translation id="10614374240317010">Never saved</translation> +<translation id="1062628064301375934">Help us build a more private web</translation> <translation id="107147699690128016">If you change the file extension, the file may open in a different application and potentially be a hazard to your device.</translation> <translation id="1089606299949659462">Review complete!</translation> <translation id="1095761715416917775">Make sure that you can always access your sync data</translation> @@ -106,7 +107,13 @@ <translation id="1554532453982918912">Help make Chrome better for people who use it the way that you do</translation> <translation id="1558391695376153246">Close Incognito tabs</translation> <translation id="1571304935088121812">Copy username</translation> +<translation id="1573632872794824374">We’re exploring new features that allow sites to deliver the same browsing experience using less of your info</translation> <translation id="1592864538817356322">Standard protection:</translation> +<translation id="161647866166517041">Spam and fraud reduction relies on trust tokens to help sites fight fraud and distinguish bots from people. + +Based on your interaction with a site, like regularly signing in to an account, that site can issue a trust token to your browser. Later, if other sites that you visit check for and find a valid trust token, they’re more likely to treat you like a person and not a bot. + +Trust tokens improve privacy on the web and can’t be used to find out who you are.</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{Remove 1 selected item}other{Remove # selected items}}</translation> <translation id="1633659023549081553">Discover new content on Chrome’s homepage</translation> <translation id="1641113438599504367">Safe Browsing</translation> @@ -167,6 +174,7 @@ <translation id="200114059308480249">Include surrounding text in Google searches?</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# File}other{# Files}}</translation> <translation id="2015836039326522978"><ph name="APP_NAME" /> will open in Chrome. By continuing, you agree to the <ph name="BEGIN_LINK1" />Google Terms of Service<ph name="END_LINK1" />, and the <ph name="BEGIN_LINK2" />Google Chrome and Chrome OS additional Terms of Service<ph name="END_LINK2" />. The <ph name="BEGIN_LINK3" />Privacy Policy<ph name="END_LINK3" /> also applies.</translation> +<translation id="2019145049163614359">Remove interest?</translation> <translation id="2020309681647789787">You’ll have your history on all your synced devices, so you can continue what you were doing</translation> <translation id="2021896219286479412">Full screen site controls</translation> <translation id="2038563949887743358">Turn on Request desktop site</translation> @@ -203,6 +211,7 @@ <translation id="2175927920773552910">QR code</translation> <translation id="2176767904800337188">A virtual card disguises your actual card to help protect you from potential fraud. <ph name="BEGIN_LINK1" />Learn more about virtual cards<ph name="END_LINK1" /></translation> <translation id="218608176142494674">Sharing</translation> +<translation id="2189903024544168260">Interest removed</translation> <translation id="2194856509914051091">Things to consider</translation> <translation id="2200113223741723867">Manage usage data sharing</translation> <translation id="2218567645332692482">Upgrade navigations to HTTPS and warn you before loading sites that don’t support it</translation> @@ -266,6 +275,7 @@ <translation id="2536728043171574184">Viewing an offline copy of this page</translation> <translation id="2546283357679194313">Cookies and site data</translation> <translation id="2549516196460093976">You can use this tablet to sign in on the computer that’s displaying this QR code.</translation> +<translation id="2558569818338050235">Your browsing history affects the ads that you see</translation> <translation id="2561519700418191927">Video previews</translation> <translation id="2567385386134582609">IMAGE</translation> <translation id="2567545343356994513">Faster, proactive protection against dangerous websites, downloads and extensions</translation> @@ -277,6 +287,7 @@ <translation id="2604446170045642109">You can turn off Dark theme for sites in your settings.</translation> <translation id="2612676031748830579">Card number</translation> <translation id="2625189173221582860">Password copied</translation> +<translation id="2642087927315268160">Sign-in bottom sheet is closed.</translation> <translation id="2645657967708199252">Your <ph name="CONNECTION_TYPE" /> connection might slow down your download</translation> <translation id="2647434099613338025">Add language</translation> <translation id="2649068648233607930">Your browser is managed by <ph name="DOMAIN" /></translation> @@ -289,11 +300,13 @@ <translation id="2704606927547763573">Copied</translation> <translation id="2707726405694321444">Refresh page</translation> <translation id="271033894570825754">New</translation> +<translation id="2711073837061989559">Trials</translation> <translation id="2718352093833049315">Only on Wi-Fi</translation> <translation id="2718846868787000099">To show content in your preferred languages, the sites that you visit can see your preferences</translation> <translation id="2723001399770238859">audio</translation> <translation id="2732063072010454421">Get a better voice experience</translation> <translation id="2739256783402597439">2G</translation> +<translation id="2746842245914314523">You can learn more about these features in Chrome settings. During trials, your interaction with sites may not be more private than it is without these new features.</translation> <translation id="2760989362628427051">Turn on dark theme when your device's dark theme or Battery Saver is on</translation> <translation id="2762000892062317888">just now</translation> <translation id="276969039800130567">Signed in as <ph name="USER_EMAIL_ADDRESS" />.</translation> @@ -362,6 +375,7 @@ <translation id="3037177537145227281">Tracking price</translation> <translation id="3037517125981011456">Shows prompts to sign in to Chrome</translation> <translation id="3046945242843292318">Get to this site quicker next time</translation> +<translation id="3055113921564083271">Interests that you removed</translation> <translation id="3055259925215945098">Bookmark moved</translation> <translation id="3055841435094910999">Info is sent to Google about your Chrome usage, but it isn\u2019t tied to you\n\nIf Chrome crashes, details about the crash may include some personal info\n\nIf you turn on sync, metrics may also include info about URLs that you visit</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> bookmark}other{<ph name="BOOKMARKS_COUNT_MANY" /> bookmarks}}</translation> @@ -378,6 +392,7 @@ <translation id="3166827708714933426">Tab and window shortcuts</translation> <translation id="316694332262407393">Chrome is already running here.</translation> <translation id="3169472444629675720">Discover</translation> +<translation id="3187472288455401631">Ad measurement</translation> <translation id="3207960819495026254">Bookmarked</translation> <translation id="3208584281581115441">Check now</translation> <translation id="3211426585530211793">Deleted <ph name="ITEM_TITLE" /></translation> @@ -408,6 +423,7 @@ <translation id="3290991969712132877">To get here quicker, add this page to your home screen from the 'More options' button</translation> <translation id="3297344142967351106">Voice assistance</translation> <translation id="3303414029551471755">Proceed to download the content?</translation> +<translation id="3321367458490630980">Interest added</translation> <translation id="3334729583274622784">Change file extension?</translation> <translation id="3341262203274374114">Can’t unfollow. Something went wrong.</translation> <translation id="3359667936385849800">Use your current service provider</translation> @@ -429,8 +445,10 @@ <translation id="3444179773590444986">Share feedback on Dark theme for sites?</translation> <translation id="3469665409713263828">{FILE_COUNT,plural, =1{1 download scheduled}other{# downloads scheduled}}</translation> <translation id="3474624961160222204">Continue as <ph name="NAME" /></translation> +<translation id="3475207952017699209">About personalised ads</translation> <translation id="3478363558367712427">You can choose your search engine</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Find out more<ph name="END_LINK" /> about suggested content</translation> +<translation id="3495219333887281978">Sign-in bottom sheet opened at half height.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="3502647154914451322">By using Chrome, you agree to the <ph name="BEGIN_TOS_LINK" />Google Terms of Service<ph name="END_TOS_LINK" />, and the <ph name="BEGIN_ATOS_LINK" />Google Chrome and Chrome OS Additional Terms of Service<ph name="END_ATOS_LINK" />.</translation> <translation id="3507132249039706973">Standard protection is on</translation> @@ -449,6 +467,7 @@ <translation id="3568688522516854065">To get your tabs from your other devices, sign in and turn on sync</translation> <translation id="357465026686164600">Phone as a security key</translation> <translation id="3577473026931028326">Something went wrong. Try again.</translation> +<translation id="3578874072190212775">Help sites fight fraud and distinguish bots from people</translation> <translation id="3587482841069643663">All</translation> <translation id="3587596251841506391">Help improve security on the web</translation> <translation id="3602290021589620013">Preview</translation> @@ -459,6 +478,7 @@ <translation id="363596933471559332">Automatically sign in to websites using stored credentials. When the feature is off, you’ll be asked for verification every time before signing in to a website.</translation> <translation id="3653111872753786013"><ph name="WEBSITE_TITLE" />: <ph name="WEBSITE_URL" /></translation> <translation id="3677911431265050325">Request mobile site</translation> +<translation id="3678391608108111420">Your browsing history affects the ads that you see and the interests as estimated below. Chrome auto-deletes your interests every few weeks to protect your privacy. Interests refresh unless you remove them.</translation> <translation id="3685860403008476208">Anyone using this device can see files that you download in Incognito</translation> <translation id="3687645719033307815">You are viewing a preview of this page</translation> <translation id="3690369331356918524">Warns you if passwords are exposed in a data breach</translation> @@ -490,6 +510,7 @@ <translation id="3856096718352044181">Please verify that this is a valid provider or try again later</translation> <translation id="3858860766373142691">Name</translation> <translation id="3861633093716975811">Popular videos</translation> +<translation id="3862592757180800623">You can change your mind at any time in Chrome settings. During trials, your interaction with sites may not be more private than it is without these new features.</translation> <translation id="3892148308691398805">Copy text</translation> <translation id="3894427358181296146">Add folder</translation> <translation id="3899682235662194879">Close all Incognito tabs</translation> @@ -498,6 +519,7 @@ <translation id="3924911262913579434"><ph name="SAFE_BROWSING_MODE" /> is on</translation> <translation id="3927692899758076493">Sans Serif</translation> <translation id="3928666092801078803">Combine my data</translation> +<translation id="3932390316856284148">Sign-in bottom sheet opened at full height.</translation> <translation id="3934366560681368531">'</translation> <translation id="393697183122708255">No enabled voice search available</translation> <translation id="395377504920307820">Use without an account</translation> @@ -509,6 +531,7 @@ <translation id="3969863827134279083">Move Up</translation> <translation id="397583555483684758">Sync has stopped working</translation> <translation id="3976396876660209797">Remove and recreate this shortcut</translation> +<translation id="3981902534690264083">Advertisers can understand how ads perform</translation> <translation id="3985215325736559418">Do you want to download <ph name="FILE_NAME" /> again?</translation> <translation id="3987993985790029246">Copy link</translation> <translation id="4000212216660919741">Offline Home</translation> @@ -526,6 +549,7 @@ <translation id="4096227151372679484">Bookmark save flow opened at half height</translation> <translation id="4099578267706723511">Help make Chrome better by sending usage statistics and crash reports to Google.</translation> <translation id="410351446219883937">Auto-play</translation> +<translation id="4106587138345390261">Chrome is exploring new features that allow sites to deliver the same browsing experience using less of your info</translation> <translation id="4108314971463891922">Follow</translation> <translation id="4108998448622696017">Detects and warns you about dangerous events when they happen.</translation> <translation id="4116038641877404294">Download pages to use them offline</translation> @@ -546,6 +570,7 @@ <translation id="4248098802131000011">Keep your passwords safe from data breaches and other security issues</translation> <translation id="4250229828105606438">Screenshot</translation> <translation id="4256782883801055595">Open-source licences</translation> +<translation id="4262915912852657291"><ph name="BEGIN_BOLD" />What data is used:<ph name="END_BOLD" /> Your browsing history, a record of sites that you’ve visited using Chrome on this device.</translation> <translation id="4263656433980196874">Assistant voice search consent UI opened at full height</translation> <translation id="4269820728363426813">Copy link address</translation> <translation id="4290281343757112331">Download later instead?</translation> @@ -556,6 +581,7 @@ <translation id="4307992518367153382">Basics</translation> <translation id="4320177379694898372">No internet connection</translation> <translation id="4321739720395210191">Can't open your camera. Restart your device and try again.</translation> +<translation id="4324158606177867698">Interest that you removed will appear here</translation> <translation id="433213510553688132">Following…</translation> <translation id="4335835283689002019">Safe Browsing is off</translation> <translation id="4351244548802238354">Close dialogue</translation> @@ -643,6 +669,7 @@ <translation id="4807098396393229769">Name on card</translation> <translation id="481574578487123132">Linked devices</translation> <translation id="4818017973810341238">Digital Asset Links verification failed on <ph name="VIOLATED_URL" /></translation> +<translation id="4826163340425232009">Sign-in bottom sheet.</translation> <translation id="4831037795716408498">Download content</translation> <translation id="4834007576107377210">See your search engine’s instructions for deleting your search history, if applicable</translation> <translation id="4834250788637067901">Payment methods, offers and addresses using Google Pay</translation> @@ -697,6 +724,7 @@ <translation id="5091199029769593641">Soon, you’ll see stories from <ph name="SITE_NAME" /> when you open a new tab. The sites that you follow are saved in your Google Account. You can manage them in Discover settings.</translation> <translation id="5091249083535528968">Extended usage data</translation> <translation id="509429900233858213">An error occurred.</translation> +<translation id="5098190077610408701">Add interest?</translation> <translation id="5102401324271069229">If a site tries to steal your password, or when you download a harmful file, Chrome may also send URLs, including bits of page content, to Safe Browsing</translation> <translation id="510275257476243843">1 hour left</translation> <translation id="5115811374190515607">to <ph name="PRODUCT_NAME" /></translation> @@ -704,6 +732,7 @@ <translation id="5123685120097942451">Incognito tab</translation> <translation id="5126510351761255129">Verify your card</translation> <translation id="5132942445612118989">Sync your passwords, history and more on all devices</translation> +<translation id="5136889366284282380">During the experiment, Chrome will estimate topics that you may be interested in, based on your recent browsing history. Then, without learning who you are, some sites that you visit will use this info to show you relevant ads.</translation> <translation id="5139940364318403933">Learn how to use Google Drive</translation> <translation id="5142281402488957685">For new stories, pull down to refresh</translation> <translation id="5152843274749979095">No supported apps installed</translation> @@ -776,6 +805,7 @@ <translation id="5578795271662203820">Search <ph name="SEARCH_ENGINE" /> for this image</translation> <translation id="5581519193887989363">You can always choose what to sync in <ph name="BEGIN_LINK1" />settings<ph name="END_LINK1" />.</translation> <translation id="5590372121997663538">Remember this computer</translation> +<translation id="559871659088672663">This feature is currently under development</translation> <translation id="5599455543593328020">Incognito mode</translation> <translation id="5599941490345670218">Google Assistant can complete actions across websites for you</translation> <translation id="5620163320393916465">No saved passwords</translation> @@ -785,6 +815,9 @@ <translation id="5628604359369369630">Unread – available offline</translation> <translation id="5639724618331995626">Allow all sites</translation> <translation id="5648166631817621825">Last 7 days</translation> +<translation id="5655245063036102919">Ad measurement allows sites that you visit to request information from Chrome that helps the site measure the performance of their ads. Ad measurement restricts cross-site tracking by transferring as little information as possible between sites. + +You can control measurement information associated with you by accessing <ph name="BEGIN_LINK" />your browsing history.<ph name="END_LINK" /></translation> <translation id="5655963694829536461">Search your downloads</translation> <translation id="5659593005791499971">Email</translation> <translation id="5665379678064389456">Create event in <ph name="APP_NAME" /></translation> @@ -870,6 +903,7 @@ <translation id="6069177176307973611">Review privacy and security settings</translation> <translation id="6070730414166672373">Contacting your bank\u2026</translation> <translation id="6085886413119427067">Determines how to connect to websites over a secure connection</translation> +<translation id="6091413777268123602">With Privacy Sandbox trials, sites can deliver the same browsing experience using less of your data. That means more privacy for you and less cross-site tracking. We’ll add new trials as they’re ready to test.</translation> <translation id="60923314841986378"><ph name="HOURS" /> hours left</translation> <translation id="6095578583683628124">If Google is also your default search engine, you’ll see better, contextually relevant suggestions</translation> <translation id="6108923351542677676">Setup in progress…</translation> @@ -996,11 +1030,13 @@ <translation id="671481426037969117">Your <ph name="FQDN" /> timer ran out. It will start again tomorrow.</translation> <translation id="6715020873764921614">Do you want to download <ph name="FILE_NAME" /> (<ph name="FILE_SIZE" />) anyway?</translation> <translation id="6719634564325948108">Connect with QR code?</translation> +<translation id="6737612727720318154">Allow an interest or site if you think that ads related to the item would be useful to you</translation> <translation id="6738516213925468394">Your data was encrypted with your <ph name="BEGIN_LINK" />sync passphrase<ph name="END_LINK" /> on <ph name="TIME" />. Enter it to start sync.</translation> <translation id="6738867403308150051">Downloading…</translation> <translation id="6751521182688001123">Quickly open a new tab. To edit this shortcut, touch and hold.</translation> <translation id="6756507620369789050">Share feedback</translation> <translation id="6767294960381293877">List of devices to share a tab with, opened at half height.</translation> +<translation id="6770042910635026163">Sites you visit that define your interests</translation> <translation id="6770602306803890733">Improves security for you and everyone on the web</translation> <translation id="6783942555455976443">Save this page for later and get a reminder</translation> <translation id="6795633245022906657">Quickly open a new tab. To edit this shortcut, go to Settings.</translation> @@ -1061,6 +1097,7 @@ <translation id="7093803425429738190">Add emotion</translation> <translation id="7105047059074518658">Sign in to browse across devices more easily.</translation> <translation id="7106762743910369165">Your browser is managed by your organisation</translation> +<translation id="7130504491556983216">A list of interests will appear here as you browse the web</translation> <translation id="7138678301420049075">Other</translation> <translation id="7143462160780459030">Can’t take a screenshot. Try again.</translation> <translation id="7146622961999026732">These sites and apps seem important to you:</translation> @@ -1095,6 +1132,7 @@ <translation id="7339898014177206373">New window</translation> <translation id="7340958967809483333">Options for Discover</translation> <translation id="7352339641508007922">Drag to take a long screenshot</translation> +<translation id="7352531447904559593">Learn more about browser-based ad personalisation</translation> <translation id="7352651011704765696">Something went wrong</translation> <translation id="7352939065658542140">VIDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Share 1 selected item}other{Share # selected items}}</translation> @@ -1150,6 +1188,7 @@ <translation id="7619072057915878432"><ph name="FILE_NAME" /> download failed due to network failures.</translation> <translation id="7626032353295482388">Welcome to Chrome</translation> <translation id="7630202231528827509">Provider URL</translation> +<translation id="7634280112532283638">Spam and fraud reduction</translation> <translation id="7638584964844754484">Incorrect passphrase</translation> <translation id="7641339528570811325">Clear browsing data…</translation> <translation id="7646772052135772216">Password sync isn't working</translation> @@ -1183,6 +1222,7 @@ <translation id="7805768142964895445">Status</translation> <translation id="7808889146555843082">Deleting this password will not delete your account on <ph name="SITE" />. Change your password or delete your account on <ph name="SITE" /> to keep it safe from others.</translation> <translation id="7810647596859435254">Open with…</translation> +<translation id="7814332119093857963"><ph name="BEGIN_BOLD" />How you can manage your data:<ph name="END_BOLD" /> Your interests are deleted and refreshed each week. You can also block an interest at any time.</translation> <translation id="7815484226266492798">Long screenshot</translation> <translation id="78270725016672455">Your computer wants to register this device for signing in to a site</translation> <translation id="7844171778363018843">No data selected to sync</translation> @@ -1209,6 +1249,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> is out of date.</translation> <translation id="7944772052836377867">Sync needs to verify that it's you</translation> <translation id="7947953824732555851">Accept and sign in</translation> +<translation id="7959157064403954786">Try more transparent ads</translation> <translation id="7961015016161918242">Never</translation> <translation id="7961926449547174351">You have disabled storage access. Please go to settings to enable it.</translation> <translation id="7963646190083259054">Vendor:</translation> @@ -1288,6 +1329,7 @@ <translation id="835847953965672673"><ph name="NUMBER_OF_DOWNLOADS" /> downloads restored</translation> <translation id="8364299278605033898">See popular websites</translation> <translation id="8368001212524806591">Track price</translation> +<translation id="8383226135083126309"><ph name="BEGIN_BOLD" />How we use this data:<ph name="END_BOLD" /> Chrome can estimate your interests. Later, a site that you visit can ask Chrome to see your interests in order to personalise the ads that you see.</translation> <translation id="8387617938027387193">Verify that it’s you</translation> <translation id="8393700583063109961">Send message</translation> <translation id="8394720698884623075">Checks URLs with a list of unsafe sites stored in Chrome</translation> @@ -1325,6 +1367,7 @@ <translation id="8505766168025405649">See notification for download status</translation> <translation id="8514477925623180633">Export passwords stored with Chrome</translation> <translation id="8516012719330875537">Image editor</translation> +<translation id="8516431725144212809">Your interests as estimated by Chrome</translation> <translation id="8523928698583292556">Delete stored password</translation> <translation id="8540136935098276800">Enter a correctly formatted URL</translation> <translation id="854522910157234410">Open this page:</translation> @@ -1356,6 +1399,7 @@ <translation id="8659579665266920523">How to search with Chrome</translation> <translation id="8662811608048051533">Signs you out of most sites.</translation> <translation id="8664979001105139458">File name already exists</translation> +<translation id="8667760277771450375">We’re exploring ways to restrict cross-site tracking while enabling sites to stop ad spam and fraud.</translation> <translation id="8676789164135894283">Sign-in verifications</translation> <translation id="867767487203716855">Next update</translation> <translation id="8683039184091909753">image</translation> @@ -1464,6 +1508,7 @@ <translation id="962979164594783469">Install this app</translation> <translation id="96681097142096641">View simplified page?</translation> <translation id="968900484120156207">Pages that you visit appear here</translation> +<translation id="969573236494556070">Limit sharing between sites</translation> <translation id="970715775301869095"><ph name="MINUTES" /> mins left</translation> <translation id="981121421437150478">Offline</translation> <translation id="983192555821071799">Close all tabs</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb index 11f9a04..41523802 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
@@ -685,6 +685,7 @@ <translation id="4988526792673242964">Páginas</translation> <translation id="5001388021414335527">Sigue este sitio aquí</translation> <translation id="5004416275253351869">Controles de actividad de Google</translation> +<translation id="5005141133360250920">Se borró la reacción</translation> <translation id="5005498671520578047">Copiar contraseña</translation> <translation id="5011311129201317034"><ph name="SITE" /> desea conectarse</translation> <translation id="5016205925109358554">Serif</translation> @@ -740,6 +741,7 @@ <translation id="5368227114232678694">Para navegar de forma privada en este dispositivo, prueba el modo Incógnito</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> pestaña abierta; presiona para cambiar de pestaña}other{<ph name="OPEN_TABS_MANY" /> pestañas abiertas; presiona para cambiar de pestaña}}</translation> <translation id="5375577065097716013">Buscar imagen con Lens <ph name="BEGIN_NEW" />Nuevo<ph name="END_NEW" /></translation> +<translation id="5376898820269806588">Se modificó la reacción</translation> <translation id="5403644198645076998">Permitir solo algunos sitios</translation> <translation id="5409881200985013443">¿Deseas enviar <ph name="ONE_TIME_CODE" /> a <ph name="CLIENT_NAME" />?</translation> <translation id="5414836363063783498">Verificando…</translation> @@ -1072,6 +1074,7 @@ <translation id="718926126787620637">La lista de carpetas de favoritos está totalmente abierta</translation> <translation id="7191430249889272776">Pestaña abierta en segundo plano</translation> <translation id="7196215469483532480">La explicación de la guía sobre privacidad está totalmente abierta.</translation> +<translation id="7208109991155904980">Se movió la reacción</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{1 descarga pendiente}other{# descargas pendientes}}</translation> <translation id="7237045078887540010">Si usas Chrome, aceptas las <ph name="BEGIN_TOS_LINK" />Condiciones del Servicio de Google<ph name="END_TOS_LINK" /> y las <ph name="BEGIN_ATOS_LINK" />Condiciones del Servicio Adicionales de Google Chrome y Chrome OS<ph name="END_ATOS_LINK" />. También se aplica la <ph name="BEGIN_PRIVACY_LINK" />Política de Privacidad<ph name="END_PRIVACY_LINK" />.</translation> <translation id="7242755609445462077">Nota estilizada con contenido destacado (<ph name="CURRENT_DATE" />)</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb index 01667932..89f233b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
@@ -685,6 +685,7 @@ <translation id="4988526792673242964">Páginas</translation> <translation id="5001388021414335527">Seguir a este sitio aquí</translation> <translation id="5004416275253351869">Controles de actividad de Google</translation> +<translation id="5005141133360250920">Reacción eliminada</translation> <translation id="5005498671520578047">Copiar contraseña</translation> <translation id="5011311129201317034"><ph name="SITE" /> quiere conectarse</translation> <translation id="5016205925109358554">Serif</translation> @@ -740,6 +741,7 @@ <translation id="5368227114232678694">Para navegar de forma privada en este dispositivo, prueba incógnito</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> pestaña abierta, toca para cambiar de una a otra}other{<ph name="OPEN_TABS_MANY" /> pestañas abiertas, toca para cambiar de una a otra}}</translation> <translation id="5375577065097716013">Buscar imagen con Lens <ph name="BEGIN_NEW" />Nuevo<ph name="END_NEW" /></translation> +<translation id="5376898820269806588">Reacción cambiada</translation> <translation id="5403644198645076998">Permitir solo determinados sitios</translation> <translation id="5409881200985013443">¿Enviar el código <ph name="ONE_TIME_CODE" /> a <ph name="CLIENT_NAME" />?</translation> <translation id="5414836363063783498">Verificando…</translation> @@ -1072,6 +1074,7 @@ <translation id="718926126787620637">Lista con carpetas de marcadores abierta a altura completa</translation> <translation id="7191430249889272776">Pestaña abierta en segundo plano.</translation> <translation id="7196215469483532480">Explicación de la guía de privacidad abierta a altura completa</translation> +<translation id="7208109991155904980">Reacción movida</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{1 descarga pendiente}other{# descargas pendientes}}</translation> <translation id="7237045078887540010">Al utilizar Chrome, aceptas los <ph name="BEGIN_TOS_LINK" />Términos del Servicio de Google<ph name="END_TOS_LINK" /> y los <ph name="BEGIN_ATOS_LINK" />Términos del Servicio Adicionales de Google Chrome y Chrome OS<ph name="END_ATOS_LINK" />. También se aplica la <ph name="BEGIN_PRIVACY_LINK" />Política de Privacidad<ph name="END_PRIVACY_LINK" />.</translation> <translation id="7242755609445462077">Estilizado resaltado el <ph name="CURRENT_DATE" /></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 b0f26899..738d1d35 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
@@ -1389,6 +1389,7 @@ <translation id="8881973373982641723">سابقهها، ازجمله سابقه موجود در چارگوش جستجو پاک میشود.</translation> <translation id="889338405075704026">به تنظیمات Chrome بروید</translation> <translation id="8898822736010347272">نشانیهای وب بعضی از صفحههایی که بازدید میکنید، اطلاعات محدودی از سیستم، و برخی از محتوای صفحه را به Google ارسال میکند تا به کشف تهدیدهای جدید و محافظت از همه افراد در وب کمک کند.</translation> +<translation id="8906502871739599113">واکنش کپی شد</translation> <translation id="8909135823018751308">اشتراکگذاری...</translation> <translation id="8912362522468806198">حساب Google</translation> <translation id="8920114477895755567">در انتظار اطلاعات والدین.</translation> @@ -1408,6 +1409,7 @@ <translation id="8970887620466824814">مشکلی پیش آمد.</translation> <translation id="8972098258593396643">در پوشه پیشفرض بارگیری شود؟</translation> <translation id="8987641763863173640">مدیریت تنظیمات پیشدید ویدیو</translation> +<translation id="898854820045159673">واکنش اضافه شد</translation> <translation id="8993760627012879038">باز کردن برگه جدیدی در حالت ناشناس</translation> <translation id="8996847606757455498">انتخاب ارائهدهنده دیگر</translation> <translation id="8998729206196772491">هماکنون درحال ورود به سیستم با یک حساب مدیریتشده توسط <ph name="MANAGED_DOMAIN" /> و ارائه کنترل دادههای Chrome خودتان به سرپرست این حساب هستید. دادههایتان بهطور دائم به این حساب مرتبط میشوند. با خروج از Chrome، دادههایتان از این دستگاه حذف میشوند اما همچنان در حساب Google شما باقی میماند.</translation> @@ -1442,6 +1444,7 @@ <translation id="9158770349521403363">فقط همرسانی محتوا</translation> <translation id="916446198114569890">نشانیهای وبی که بازدید میکنید در حساب Google شما ذخیره میشود</translation> <translation id="9169507124922466868">سابقه «پیمایش» نیمهباز است</translation> +<translation id="9187955620966010988">واکنش تنظیم شد</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{آخرین بررسی: ۱ دقیقه قبل}one{آخرین بررسی: # دقیقه قبل}other{آخرین بررسی: # دقیقه قبل}}</translation> <translation id="9204836675896933765">۱ فایل باقی مانده است</translation> <translation id="9205933215779845960">صفحه پیدا نشد. املای واژههای تایپشده را بررسی کنید یا در <ph name="SEARCH_ENGINE" /> جستجو کنید.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb index d531db0..dee2fb6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
@@ -1389,6 +1389,7 @@ <translation id="8881973373982641723">Kini-clear ang history, kasama ang nasa box para sa paghahanap.</translation> <translation id="889338405075704026">Pumunta sa mga setting ng Chrome</translation> <translation id="8898822736010347272">Nagpapadala ng mga URL ng ilang page na binibisita mo, limitadong impormasyon ng system, at ilang content ng page sa Google, para makatulong na tumuklas ng mga bagong banta at protektahan ang lahat ng nasa web.</translation> +<translation id="8906502871739599113">Na-duplicate ang reaksyon</translation> <translation id="8909135823018751308">Ibahagi…</translation> <translation id="8912362522468806198">Google Account</translation> <translation id="8920114477895755567">Hinihintay ang mga detalye ng mga magulang.</translation> @@ -1408,6 +1409,7 @@ <translation id="8970887620466824814">Nagkaproblema.</translation> <translation id="8972098258593396643">I-download sa default na folder?</translation> <translation id="8987641763863173640">Pamahalaan ang Mga Setting ng Preview ng Video</translation> +<translation id="898854820045159673">Naidagdag ang reaksyon</translation> <translation id="8993760627012879038">Magbukas ng bagong tab sa Incognito mode</translation> <translation id="8996847606757455498">Pumili ng ibang provider</translation> <translation id="8998729206196772491">Nagsa-sign in ka gamit ang isang account na pinamamahalaan ng <ph name="MANAGED_DOMAIN" /> at binibigyan mo ang administrator nito ng kontrol sa iyong data sa Chrome. Permanenteng mauugnay ang iyong data sa account na ito. Made-delete ang data mo sa device na ito kapag nag-sign out ka sa Chrome, ngunit mananatili itong naka-store sa iyong Google Account.</translation> @@ -1442,6 +1444,7 @@ <translation id="9158770349521403363">Ibahagi lang ang content</translation> <translation id="916446198114569890">Naka-save sa iyong Google account ang mga URL na binibisita mo</translation> <translation id="9169507124922466868">Nakabukas nang kalahati ang history ng pag-navigate</translation> +<translation id="9187955620966010988">Naisaayos ang reaksyon</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{Nagsuri 1 minuto ang nakalipas}one{Nagsuri # minuto ang nakalipas}other{Nagsuri # na minuto ang nakalipas}}</translation> <translation id="9204836675896933765">1 file ang natitira</translation> <translation id="9205933215779845960">Hindi makita ang page na iyon. Suriin ang iyong spelling o subukang maghanap sa <ph name="SEARCH_ENGINE" />.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb index f65152f..e422990 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
@@ -685,6 +685,7 @@ <translation id="4988526792673242964">Pages</translation> <translation id="5001388021414335527">Suivez ce site ici</translation> <translation id="5004416275253351869">Commandes d'activité Google</translation> +<translation id="5005141133360250920">Réaction supprimée</translation> <translation id="5005498671520578047">Copier mot de passe</translation> <translation id="5011311129201317034"><ph name="SITE" /> veut se connecter</translation> <translation id="5016205925109358554">Avec empattement</translation> @@ -740,6 +741,7 @@ <translation id="5368227114232678694">Pour naviguer en privé sur cet appareil, essayez la navigation privée</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> onglet ouvert, touchez pour basculer vers un autre onglet}one{<ph name="OPEN_TABS_MANY" /> onglet ouvert, touchez pour basculer vers un autre onglet}other{<ph name="OPEN_TABS_MANY" /> onglets ouverts, touchez pour basculer vers un autre onglet}}</translation> <translation id="5375577065097716013">Rechercher l'image avec Lentille Google <ph name="BEGIN_NEW" />Nouv.<ph name="END_NEW" /></translation> +<translation id="5376898820269806588">Réaction changée</translation> <translation id="5403644198645076998">Autoriser uniquement certains sites</translation> <translation id="5409881200985013443">Envoyez <ph name="ONE_TIME_CODE" /> à <ph name="CLIENT_NAME" />?</translation> <translation id="5414836363063783498">Vérification...</translation> @@ -1072,6 +1074,7 @@ <translation id="718926126787620637">Liste des dossiers de favoris ouverte à pleine hauteur</translation> <translation id="7191430249889272776">Onglet ouvert en arrière-plan.</translation> <translation id="7196215469483532480">Explication du guide sur la confidentialité ouverte à pleine hauteur</translation> +<translation id="7208109991155904980">Réaction déplacée</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{1 téléchargement en attente}one{# téléchargement en attente}other{# téléchargements en attente}}</translation> <translation id="7237045078887540010">Par votre utilisation de Chrome, vous acceptez les <ph name="BEGIN_TOS_LINK" />conditions d'utilisation de Google<ph name="END_TOS_LINK" /> et les <ph name="BEGIN_ATOS_LINK" />conditions d'utilisation supplémentaires de Google Chrome et de Chrome OS<ph name="END_ATOS_LINK" />. La <ph name="BEGIN_PRIVACY_LINK" />politique de confidentialité<ph name="END_PRIVACY_LINK" /> s'applique également.</translation> <translation id="7242755609445462077">Mise en évidence stylisée <ph name="CURRENT_DATE" /></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 d3a23b2c..8ff57e12 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
@@ -685,6 +685,7 @@ <translation id="4988526792673242964">Pages</translation> <translation id="5001388021414335527">Suivre ce site ici</translation> <translation id="5004416275253351869">Commandes Google relatives à l'activité</translation> +<translation id="5005141133360250920">Réaction supprimée</translation> <translation id="5005498671520578047">Copier mot de passe</translation> <translation id="5011311129201317034"><ph name="SITE" /> tente de se connecter</translation> <translation id="5016205925109358554">Serif</translation> @@ -740,6 +741,7 @@ <translation id="5368227114232678694">Pour naviguer en privé sur cet appareil, essayez la navigation privée</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> onglet ouvert, appuyez pour changer d'onglet}one{<ph name="OPEN_TABS_MANY" /> onglet ouvert, appuyez pour changer d'onglet}other{<ph name="OPEN_TABS_MANY" /> onglets ouverts, appuyez pour changer d'onglet}}</translation> <translation id="5375577065097716013">Rechercher image avec Google Lens <ph name="BEGIN_NEW" />Nouvelle<ph name="END_NEW" /></translation> +<translation id="5376898820269806588">Réaction modifiée</translation> <translation id="5403644198645076998">N'autoriser que certains sites</translation> <translation id="5409881200985013443">Envoyer <ph name="ONE_TIME_CODE" /> sur <ph name="CLIENT_NAME" /> ?</translation> <translation id="5414836363063783498">Validation en cours…</translation> @@ -1072,6 +1074,7 @@ <translation id="718926126787620637">Liste des dossiers de favoris ouverte à pleine hauteur</translation> <translation id="7191430249889272776">L'onglet a été ouvert en arrière-plan.</translation> <translation id="7196215469483532480">Explications du Guide sur la confidentialité ouvertes à pleine hauteur</translation> +<translation id="7208109991155904980">Réaction déplacée</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{1 téléchargement en attente}one{# téléchargement en attente}other{# téléchargements en attente}}</translation> <translation id="7237045078887540010">En utilisant Chrome, vous acceptez les <ph name="BEGIN_TOS_LINK" />Conditions d'utilisation de Google<ph name="END_TOS_LINK" /> et les <ph name="BEGIN_ATOS_LINK" />Conditions d'utilisation supplémentaires de Google Chrome et Chrome OS<ph name="END_ATOS_LINK" />. Les <ph name="BEGIN_PRIVACY_LINK" />Règles de confidentialité<ph name="END_PRIVACY_LINK" /> s'appliquent également.</translation> <translation id="7242755609445462077">En surbrillance et stylisé, <ph name="CURRENT_DATE" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb index 3f481d6..f83f070 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb
@@ -685,6 +685,7 @@ <translation id="4988526792673242964">Páxinas</translation> <translation id="5001388021414335527">Seguir este sitio aquí</translation> <translation id="5004416275253351869">Controis de actividade de Google</translation> +<translation id="5005141133360250920">Reacción eliminada</translation> <translation id="5005498671520578047">Copiar contrasinal</translation> <translation id="5011311129201317034"><ph name="SITE" /> quere conectarse</translation> <translation id="5016205925109358554">Serif</translation> @@ -740,6 +741,7 @@ <translation id="5368227114232678694">Se queres navegar de forma privada neste dispositivo, proba o modo de incógnito</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> pestana aberta, toca para cambiar de pestana}other{<ph name="OPEN_TABS_MANY" /> pestanas abertas, toca para cambiar de pestana}}</translation> <translation id="5375577065097716013">Buscar imaxe con Google Lens <ph name="BEGIN_NEW" />Novo<ph name="END_NEW" /></translation> +<translation id="5376898820269806588">Reacción modificada</translation> <translation id="5403644198645076998">Permitir só determinados sitios</translation> <translation id="5409881200985013443">Queres enviar o código <ph name="ONE_TIME_CODE" /> a <ph name="CLIENT_NAME" />?</translation> <translation id="5414836363063783498">Verificando...</translation> @@ -1072,6 +1074,7 @@ <translation id="718926126787620637">A lista de cartafoles de marcadores está aberta completamente</translation> <translation id="7191430249889272776">Abriuse a pestana en segundo plano.</translation> <translation id="7196215469483532480">A explicación sobre a Guía de privacidade está aberta a pantalla completa</translation> +<translation id="7208109991155904980">Reacción movida</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{1 descarga pendente}other{# descargas pendentes}}</translation> <translation id="7237045078887540010">Ao utilizar Chrome, aceptas as <ph name="BEGIN_TOS_LINK" />Condicións de servizo de Google<ph name="END_TOS_LINK" /> e as <ph name="BEGIN_ATOS_LINK" />Condicións de servizo adicionais de Google Chrome e Chrome OS<ph name="END_ATOS_LINK" />. Tamén é aplicable a <ph name="BEGIN_PRIVACY_LINK" />Política de privacidade<ph name="END_PRIVACY_LINK" />.</translation> <translation id="7242755609445462077">Nota estilizada (<ph name="CURRENT_DATE" />)</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb index 5f6f8f17..f559458 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
@@ -685,6 +685,7 @@ <translation id="4988526792673242964">પેજ</translation> <translation id="5001388021414335527">આ સાઇટને અહીં ફૉલો કરો</translation> <translation id="5004416275253351869">Google પ્રવૃત્તિ નિયંત્રણો</translation> +<translation id="5005141133360250920">પ્રતિક્રિયા ડિલીટ કરી</translation> <translation id="5005498671520578047">પાસવર્ડની કૉપિ કરો</translation> <translation id="5011311129201317034"><ph name="SITE" />, કનેક્ટ કરવા માગે છે</translation> <translation id="5016205925109358554">Serif</translation> @@ -740,6 +741,7 @@ <translation id="5368227114232678694">આ ડિવાઇસ પર ખાનગી રીતે બ્રાઉઝ કરવા માટે, છૂપો મોડ અજમાવી જુઓ</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> ખુલ્લી ટૅબ, ટૅબને સ્વિચ કરવા માટે ટૅપ કરો}one{<ph name="OPEN_TABS_MANY" /> ખુલ્લી ટૅબ, ટૅબને સ્વિચ કરવા માટે ટૅપ કરો}other{<ph name="OPEN_TABS_MANY" /> ખુલ્લી ટૅબ, ટૅબને સ્વિચ કરવા માટે ટૅપ કરો}}</translation> <translation id="5375577065097716013">Google Lens વડે છબી શોધો <ph name="BEGIN_NEW" />નવું<ph name="END_NEW" /></translation> +<translation id="5376898820269806588">પ્રતિક્રિયા બદલાઈ ગઈ</translation> <translation id="5403644198645076998">ફક્ત અમુક સાઇટની મંજૂરી આપો</translation> <translation id="5409881200985013443"><ph name="CLIENT_NAME" /> પર <ph name="ONE_TIME_CODE" /> સબમિટ કરીએ?</translation> <translation id="5414836363063783498">ચકાસી રહ્યું છે...</translation> @@ -1072,6 +1074,7 @@ <translation id="718926126787620637">બુકમાર્ક ફોલ્ડરોની સૂચિ સંપૂર્ણ ઊંચાઈએ ખોલી</translation> <translation id="7191430249889272776">ટૅબ બૅકગ્રાઉન્ડમાં ખોલવામાં આવી છે.</translation> <translation id="7196215469483532480">પ્રાઇવસી સંબંધિત માર્ગદર્શિકાની સમજૂતી પૂરી ઊંચાઈ સુધી ખોલી છે</translation> +<translation id="7208109991155904980">પ્રતિક્રિયા ખસેડવામાં આવી</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{1 ડાઉનલોડ બાકી}one{# ડાઉનલોડ બાકી}other{# ડાઉનલોડ બાકી}}</translation> <translation id="7237045078887540010">Chromeનો ઉપયોગ કરીને, તમે <ph name="BEGIN_TOS_LINK" />Google સેવાની શરતો<ph name="END_TOS_LINK" /> અને <ph name="BEGIN_ATOS_LINK" />Google Chrome તથા Chrome OSની વધારાની સેવાની શરતો<ph name="END_ATOS_LINK" /> સાથે સંમત થાઓ છો. <ph name="BEGIN_PRIVACY_LINK" />પ્રાઇવસી પૉલિસી<ph name="END_PRIVACY_LINK" /> પણ લાગુ થાય છે.</translation> <translation id="7242755609445462077">સ્ટાઇલિશ હાઇલાઇટ <ph name="CURRENT_DATE" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb index d66f133..e8fcba8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
@@ -1389,6 +1389,7 @@ <translation id="8881973373982641723">Մաքրում է պատմությունը, այդ թվում որոնման դաշտում։</translation> <translation id="889338405075704026">Անցնել Chrome-ի կարգավորումներ</translation> <translation id="8898822736010347272">Ուղարկում է Google-ին ձեր այցելած որոշ էջերի URL-ներն ու դրանց բովանդակությունը և համակարգի մասին որոշակի տեղեկություններ, որոնք օգնում են հայտնաբերել համացանցում օգտատերերին սպառնացող նոր վտանգներ։</translation> +<translation id="8906502871739599113">Արձագանքը կրկնօրինակվեց</translation> <translation id="8909135823018751308">Կիսվել…</translation> <translation id="8912362522468806198">Google հաշիվ</translation> <translation id="8920114477895755567">Ծնողների տվյալները սպասվում են:</translation> @@ -1408,6 +1409,7 @@ <translation id="8970887620466824814">Սխալ առաջացավ:</translation> <translation id="8972098258593396643">Ներբեռնե՞լ կանխադրված պանակ</translation> <translation id="8987641763863173640">Կառավարել տեսանյութերի նախադիտման կարգավորումները</translation> +<translation id="898854820045159673">Արձագանքն ավելացվեց</translation> <translation id="8993760627012879038">Բացել նոր ներդիր ինկոգնիտո ռեժիմում</translation> <translation id="8996847606757455498">Ընտրել մեկ այլ մատակարար</translation> <translation id="8998729206196772491">Դուք մուտք եք գործում <ph name="MANAGED_DOMAIN" /> տիրույթի կողմից կառավարվող հաշիվ` դրա ադմինիստրատորին թույլ տալով վերահսկել ձեր Chrome-ի տվյալները: Ձեր տվյալները մշտապես կկապվեն այս հաշվի հետ: Եթե դուրս գաք Chrome-ից, այս սարքում պահված տվյալները կջնջվեն, սակայն կպահպանվեն ձեր Google հաշվում:</translation> @@ -1442,6 +1444,7 @@ <translation id="9158770349521403363">Կիսվել միայն բովանդակությամբ</translation> <translation id="916446198114569890">Ձեր այցելած կայքերի URL-ները պահվում են ձեր Google հաշվում</translation> <translation id="9169507124922466868">Նավիգացիայի պատմության թերթը կիսաբացված է</translation> +<translation id="9187955620966010988">Արձագանքը ճշգրտվեց</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{Ստուգվել է 1 րոպե առաջ}one{Ստուգվել է # րոպե առաջ}other{Ստուգվել է # րոպե առաջ}}</translation> <translation id="9204836675896933765">Մնաց 1 ֆայլ</translation> <translation id="9205933215779845960">Չի հաջողվում գտնել էջը։ Եթե վստահ եք, որ հարցումը ճիշտ եք մուտքագրել, փորձեք որոնել <ph name="SEARCH_ENGINE" />-ում։</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb index 46c4f5b..f993e93 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -1389,6 +1389,7 @@ <translation id="8881973373982641723">Menghapus histori, termasuk di kotak penelusuran.</translation> <translation id="889338405075704026">Buka setelan Chrome</translation> <translation id="8898822736010347272">Kirim URL beberapa halaman yang Anda kunjungi, informasi sistem terbatas, dan beberapa konten halaman ke Google untuk membantu menemukan ancaman baru dan melindungi semua orang di web.</translation> +<translation id="8906502871739599113">Reaksi diduplikasi</translation> <translation id="8909135823018751308">Bagikan...</translation> <translation id="8912362522468806198">Akun Google</translation> <translation id="8920114477895755567">Menunggu detail orang tua.</translation> @@ -1408,6 +1409,7 @@ <translation id="8970887620466824814">Terjadi error.</translation> <translation id="8972098258593396643">Download ke folder default?</translation> <translation id="8987641763863173640">Mengelola Setelan Pratinjau Video</translation> +<translation id="898854820045159673">Reaksi ditambahkan</translation> <translation id="8993760627012879038">Membuka tab baru dalam mode Samaran</translation> <translation id="8996847606757455498">Pilih penyedia lain</translation> <translation id="8998729206196772491">Anda akan login dengan akun yang dikelola oleh <ph name="MANAGED_DOMAIN" /> dan memberikan kontrol data Chrome kepada administratornya. Data akan terikat dengan akun ini secara permanen. Bila Anda logout dari Chrome, data akan dihapus dari perangkat ini, tetapi data tetap tersimpan di Akun Google.</translation> @@ -1442,6 +1444,7 @@ <translation id="9158770349521403363">Hanya bagikan konten</translation> <translation id="916446198114569890">URL yang Anda buka disimpan ke akun Google Anda</translation> <translation id="9169507124922466868">Histori navigasi terbuka setengah</translation> +<translation id="9187955620966010988">Reaksi disesuaikan</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{Diperiksa 1 menit yang lalu}other{Diperiksa # menit yang lalu}}</translation> <translation id="9204836675896933765">1 file tersisa</translation> <translation id="9205933215779845960">Tidak dapat menemukan halaman tersebut. Periksa ejaan Anda atau coba telusuri di <ph name="SEARCH_ENGINE" />.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb index 926ed31..8b347e9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
@@ -685,6 +685,7 @@ <translation id="4988526792673242964">Síður</translation> <translation id="5001388021414335527">Fylgja þessu vefsvæði hér</translation> <translation id="5004416275253351869">Virknistýringar Google</translation> +<translation id="5005141133360250920">Viðbrögðum eytt</translation> <translation id="5005498671520578047">Afrita aðgangsorð</translation> <translation id="5011311129201317034"><ph name="SITE" /> vill tengjast</translation> <translation id="5016205925109358554">Serif</translation> @@ -740,6 +741,7 @@ <translation id="5368227114232678694">Prófaðu huliðsstillingu til að vafra í næði í þessu tæki</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> opinn flipi, ýttu til að skipta á milli flipa}one{<ph name="OPEN_TABS_MANY" /> opinn flipi, ýttu til að skipta á milli flipa}other{<ph name="OPEN_TABS_MANY" /> opnir flipar, ýttu til að skipta á milli flipa}}</translation> <translation id="5375577065097716013">Leita að mynd með Google linsu <ph name="BEGIN_NEW" />Nýtt<ph name="END_NEW" /></translation> +<translation id="5376898820269806588">Viðbrögðum breytt</translation> <translation id="5403644198645076998">Leyfa aðeins tiltekin vefsvæði</translation> <translation id="5409881200985013443">Senda <ph name="ONE_TIME_CODE" /> á <ph name="CLIENT_NAME" />?</translation> <translation id="5414836363063783498">Staðfestir…</translation> @@ -1072,6 +1074,7 @@ <translation id="718926126787620637">Listi bókamerkjamappa opinn í fullri hæð</translation> <translation id="7191430249889272776">Flipi opnaður í bakgrunni.</translation> <translation id="7196215469483532480">Útskýring á leiðbeiningum um persónuvernd opnuð á öllum skjánum</translation> +<translation id="7208109991155904980">Viðbrögð færð</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{Ein skrá bíður niðurhals}one{# skrá bíður niðurhals}other{# skrár bíða niðurhals}}</translation> <translation id="7237045078887540010">Með því að nota Chrome samþykkir þú <ph name="BEGIN_TOS_LINK" />þjónustuskilmála Google<ph name="END_TOS_LINK" />og <ph name="BEGIN_ATOS_LINK" />viðbótarskilmála Google Chrome og Chrome OS<ph name="END_ATOS_LINK" />. <ph name="BEGIN_PRIVACY_LINK" />Persónuverndarstefnan<ph name="END_PRIVACY_LINK" /> gildir einnig.</translation> <translation id="7242755609445462077">Áhersluatriði stílfært <ph name="CURRENT_DATE" /></translation> @@ -1386,6 +1389,7 @@ <translation id="8881973373982641723">Hreinsar feril, einnig í leitarreitnum.</translation> <translation id="889338405075704026">Fara í stillingar Chrome</translation> <translation id="8898822736010347272">Sendir vefslóðir sumra vefsíðna sem þú skoðar, takmarkaðar kerfisupplýsingar og tiltekið innihald síðna til Google til að hjálpa til við að finna og loka á nýjar ógnir og vernda alla vefnotendur.</translation> +<translation id="8906502871739599113">Viðbrögð afrituð</translation> <translation id="8909135823018751308">Deila…</translation> <translation id="8912362522468806198">Google reikningur</translation> <translation id="8920114477895755567">Bíður eftir upplýsingum um foreldra.</translation> @@ -1405,6 +1409,7 @@ <translation id="8970887620466824814">Eitthvað fór úrskeiðis.</translation> <translation id="8972098258593396643">Hlaða niður í sjálfgefna möppu?</translation> <translation id="8987641763863173640">Stjórna stillingum forskoðunar myndskeiða</translation> +<translation id="898854820045159673">Viðbrögðum bætt við</translation> <translation id="8993760627012879038">Opna nýjan flipa í huliðsstillingu</translation> <translation id="8996847606757455498">Velja aðra veitu</translation> <translation id="8998729206196772491">Þú ert að skrá þig út af reikningi sem <ph name="MANAGED_DOMAIN" /> stýrir og veitir í leiðinni stjórnanda lénsins umsjón með Chrome gögnunum þínum. Gögnin þín verða tengd við þennan reikning til frambúðar. Ef þú skráir þig út af Chrome verður gögnunum þínum á þessu tæki eytt, en þau verða áfram geymd á Google reikningnum þínum.</translation> @@ -1439,6 +1444,7 @@ <translation id="9158770349521403363">Aðeins deila efni</translation> <translation id="916446198114569890">Vefslóðirnar sem þú opnar eru vistaðar á Google reikningnum þínum</translation> <translation id="9169507124922466868">Ferill er hálfopinn</translation> +<translation id="9187955620966010988">Viðbrögðum breytt</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{Athugað fyrir 1 mínútu}one{Athugað fyrir # mínútu}other{Athugað fyrir # mínútum}}</translation> <translation id="9204836675896933765">Ein skrá eftir</translation> <translation id="9205933215779845960">Finn ekki síðuna. Athugaðu stafsetninguna eða prófaðu að leita á <ph name="SEARCH_ENGINE" />.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb index a663538..610781a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb
@@ -1389,6 +1389,7 @@ <translation id="8881973373982641723">Viene cancellata la cronologia, anche nella casella di ricerca.</translation> <translation id="889338405075704026">Apri le impostazioni di Chrome</translation> <translation id="8898822736010347272">Invia a Google gli URL di alcune pagine visitate, informazioni limitate sul sistema e alcuni contenuti delle pagine per contribuire a scoprire le nuove minacce e proteggere tutti gli utenti del Web.</translation> +<translation id="8906502871739599113">Reazione duplicata</translation> <translation id="8909135823018751308">Condividi…</translation> <translation id="8912362522468806198">Google Account</translation> <translation id="8920114477895755567">In attesa dei dettagli sui genitori.</translation> @@ -1408,6 +1409,7 @@ <translation id="8970887620466824814">C'è stato un problema.</translation> <translation id="8972098258593396643">Scaricare nella cartella predefinita?</translation> <translation id="8987641763863173640">Gestisci le impostazioni di anteprima video</translation> +<translation id="898854820045159673">Reazione aggiunta</translation> <translation id="8993760627012879038">Apri nuova scheda in mod. di navigaz. in incognito</translation> <translation id="8996847606757455498">Scegli un altro fornitore</translation> <translation id="8998729206196772491">Stai per eseguire l'accesso con un account gestito da <ph name="MANAGED_DOMAIN" /> e consentire al relativo amministratore di avere il controllo dei tuoi dati di Chrome. I tuoi dati verranno associati definitivamente a questo account. Se esci da Chrome, i dati verranno eliminati da questo dispositivo, ma rimarranno memorizzati nel tuo Account Google.</translation> @@ -1442,6 +1444,7 @@ <translation id="9158770349521403363">Condividi solo contenuti</translation> <translation id="916446198114569890">Gli URL che visiti vengono salvati nel tuo Account Google</translation> <translation id="9169507124922466868">La cronologia di navigazione è aperta fino a metà</translation> +<translation id="9187955620966010988">Reazione modificata</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{Eseguito 1 minuto fa}other{Eseguito # minuti fa}}</translation> <translation id="9204836675896933765">1 file rimanente</translation> <translation id="9205933215779845960">Impossibile trovare la pagina. Controlla l'ortografia o prova a effettuare una ricerca su <ph name="SEARCH_ENGINE" />.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb index fef16cf4..2eeb5d2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
@@ -685,6 +685,7 @@ <translation id="4988526792673242964">דפים</translation> <translation id="5001388021414335527">כאן ניתן לעקוב אחר האתר הזה</translation> <translation id="5004416275253351869">בקרת הפעילות בחשבון Google</translation> +<translation id="5005141133360250920">התגובה נמחקה</translation> <translation id="5005498671520578047">העתקת הסיסמה</translation> <translation id="5011311129201317034"><ph name="SITE" /> מבקש להתחבר אל</translation> <translation id="5016205925109358554">Serif</translation> @@ -740,6 +741,7 @@ <translation id="5368227114232678694">כדי לגלוש בפרטיות במכשיר, כדאי לנסות את המצב הפרטי</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{כרטיסייה פתוחה אחת (<ph name="OPEN_TABS_ONE" />), יש להקיש כדי להחליף כרטיסיות}two{<ph name="OPEN_TABS_MANY" /> כרטיסיות פתוחות, יש להקיש כדי להחליף כרטיסיות}many{<ph name="OPEN_TABS_MANY" /> כרטיסיות פתוחות, יש להקיש כדי להחליף כרטיסיות}other{<ph name="OPEN_TABS_MANY" /> כרטיסיות פתוחות, יש להקיש כדי להחליף כרטיסיות}}</translation> <translation id="5375577065097716013">חיפוש תמונה בעזרת Google Lens <ph name="BEGIN_NEW" />חדש<ph name="END_NEW" /></translation> +<translation id="5376898820269806588">התגובה שונתה</translation> <translation id="5403644198645076998">גישה רק לאתרים ספציפיים</translation> <translation id="5409881200985013443">לשלוח את <ph name="ONE_TIME_CODE" /> באמצעות <ph name="CLIENT_NAME" />?</translation> <translation id="5414836363063783498">בתהליך אימות…</translation> @@ -1072,6 +1074,7 @@ <translation id="718926126787620637">רשימת תיקיות הסימניות שפתוחות בגובה מלא</translation> <translation id="7191430249889272776">הכרטיסייה נפתחה ברקע.</translation> <translation id="7196215469483532480">ההסבר על המדריך בנושא פרטיות נפתח בגובה מלא</translation> +<translation id="7208109991155904980">התגובה הוזזה</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{הורדה אחת בהמתנה}two{# הורדות בהמתנה}many{# הורדות בהמתנה}other{# הורדות בהמתנה}}</translation> <translation id="7237045078887540010">השימוש ב-Chrome מבטא הסכמה <ph name="BEGIN_TOS_LINK" />לתנאים ולהגבלות של Google<ph name="END_TOS_LINK" /> ו<ph name="BEGIN_ATOS_LINK" />לתנאים ולהגבלות הנוספים של Google Chrome ו-Chrome OS<ph name="END_ATOS_LINK" />. גם <ph name="BEGIN_PRIVACY_LINK" />מדיניות הפרטיות<ph name="END_PRIVACY_LINK" /> חלה.</translation> <translation id="7242755609445462077">הדגשה מסוגננת <ph name="CURRENT_DATE" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb index 4ad88cfb..d3c2977b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
@@ -10,6 +10,7 @@ <translation id="1045899828449635435">ამ საიტების მონაცემთა გასუფთავებაც გსურთ?</translation> <translation id="1049743911850919806">ინკოგნიტო</translation> <translation id="10614374240317010">არასოდეს შენახული</translation> +<translation id="1062628064301375934">დაგვეხმარეთ, უზრუნველვყოთ მეტი კონფიდენციალურობა ვებში</translation> <translation id="107147699690128016">ფაილის გაფართოების შეცვლის შემთხვევაში, ფაილი შეიძლება გაიხსნას სხვა აპლიკაციაში და პოტენციურად შეუქმნას საფრთხე თქვენს მოწყობილობას.</translation> <translation id="1089606299949659462">გადახედვა დასრულდა!</translation> <translation id="1095761715416917775">ყოველთვის იქონიეთ წვდომა თქვენს სინქრონიზებულ მონაცემებზე</translation> @@ -106,7 +107,13 @@ <translation id="1554532453982918912">ხელი შეუწყვეთ Chrome-ის გაუმჯობესებას მათთვის, ვინც მას თქვენსავით იყენებს</translation> <translation id="1558391695376153246">ინკოგნ. ჩანართების დახურვა</translation> <translation id="1571304935088121812">მომხმარებლის სახელის კოპირება</translation> +<translation id="1573632872794824374">ჩვენ ვმუშაობთ ახალ ფუნქციებზე, რომელთა მეშვეობითაც საიტებს იგივე ფუნქციონალი შეუნარჩუნდება თქვენი ნაკლები ინფორმაციის გამოყენებით</translation> <translation id="1592864538817356322">სტანდარტული დაცვა:</translation> +<translation id="161647866166517041">სპამისა და თაღლითობისგან დაცვა ფუნქციონირებს ნდობის ჟეტონების საფუძველზე და ეხმარება საიტებს თაღლითობასთან ბრძოლაში, ასევე, ბოტების ადამიანებისგან გარჩევაში. + +ამა თუ იმ საიტთან თქვენი ინტერაქციის (მაგალითად, თქვენს ანგარიშში რეგულარულად შესვლის) მიხედვით, შესაბამის საიტს შეეძლება ნდობის ჟეტონის გაცემა თქვენი ბრაუზერისთვის. თუ მოგვიანებით თქვენ მიერ მონახულებული სხვა საიტები შეამოწმებს ნდობის მართებულ ჟეტონების არსებობას და იპოვის მათი, ისინი უფრო დიდი ალბათობით ჩათვლიან, რომ ადამიანი ხართ და არა ბოტი. + +ნდობის ჟეტონები ვებში კონფიდენციალურობის დაცვას უწყობს ხელს, ხოლო მათი მეშვეობით თქვენი ვინაობის დადგენა ვერ მოხერხდება.</translation> <translation id="1628019612362412531">{NUM_SELECTED,plural, =1{1 არჩეული ერთეულის ამოშლა}other{# არჩეული ერთეულის ამოშლა}}</translation> <translation id="1633659023549081553">აღმოაჩინეთ ახალი კონტენტი Chrome-ის მთავარ გვერდზე</translation> <translation id="1641113438599504367">Safe Browsing</translation> @@ -167,6 +174,7 @@ <translation id="200114059308480249">გსურთ, დაურთოთ გარშემო ტექსტი Google ძიებებს?</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# ფაილი}other{# ფაილი}}</translation> <translation id="2015836039326522978"><ph name="APP_NAME" /> გაიხსნება Chrome-ში. გაგრძელებით ეთანხმებით <ph name="BEGIN_LINK1" />Google-ის მომსახურების პირობებს<ph name="END_LINK1" />, ასევე, <ph name="BEGIN_LINK2" />Google Chrome-ისა და Chrome OS-ის მომსახურების დამატებით პირობებს<ph name="END_LINK2" />. გარდა ამისა, მოქმედებს <ph name="BEGIN_LINK3" />კონფიდენციალურობის დებულება<ph name="END_LINK3" />.</translation> +<translation id="2019145049163614359">გსურთ, წაშალოთ ინტერესი?</translation> <translation id="2020309681647789787">ისტორია თქვენს ყველა სინქრონიზებულ მოწყობილობაზე გაქვთ ჩართული, ამიტომ შეგიძლიათ გააგრძელოთ ის, რასაც აკეთებდით</translation> <translation id="2021896219286479412">სრულეკრანიანი რეჟიმის მართვა</translation> <translation id="2038563949887743358">საიტის დესკტოპის ვერსიის მოთხოვნის ჩართვა</translation> @@ -203,6 +211,7 @@ <translation id="2175927920773552910">QR კოდი</translation> <translation id="2176767904800337188">ვირტუალური ბარათი შენიღბავს თქვენს რეალურ ბარათს, რაც დაგიცავთ თაღლითობის პოტენციური შემთხვევებისგან. <ph name="BEGIN_LINK1" />შეიტყვეთ მეტი ვირტუალური ბარათების შესახებ<ph name="END_LINK1" /></translation> <translation id="218608176142494674">გაზიარება</translation> +<translation id="2189903024544168260">ინტერესი წაიშალა</translation> <translation id="2194856509914051091">გასათვალისწინებელი საკითხები</translation> <translation id="2200113223741723867">გამოყენების მონაცემების გაზიარების მართვა</translation> <translation id="2218567645332692482">ნავიგაცია გადავა HTTPS-ზე, ხოლო ისეთი საიტების ჩატვირთვისას, რომელთა მიერაც აღნიშნული პროტოკოლი მხარდაუჭერელია, გაფრთხილებას მიიღებთ</translation> @@ -266,6 +275,7 @@ <translation id="2536728043171574184">თქვენ ამ გვერდის ხაზგარეშე ასლს ნახულობთ</translation> <translation id="2546283357679194313">ქუქი-ფაილები და საიტის მონაცემები</translation> <translation id="2549516196460093976">ამ ტაბლეტის მეშვეობით შეგიძლიათ შეხვიდეთ კომპიუტერში, რომელზეც ნაჩვენებია ეს QR კოდი.</translation> +<translation id="2558569818338050235">თქვენ მიერ ვების დათვალიერების ისტორია აისახება თქვენთვის ხილულ რეკლამაზე</translation> <translation id="2561519700418191927">ვიდეოების გადასახედი ვერსიები</translation> <translation id="2567385386134582609">სურათი</translation> <translation id="2567545343356994513">უფრო სწრაფი, პროაქტიული დაცვა სახიფათო ვებსაიტებისგან, ჩამოტვირთვებისა და გაფართოებებისგან</translation> @@ -277,6 +287,7 @@ <translation id="2604446170045642109">საიტებისთვის მუქი თემის გამორთვა შეგიძლიათ პარამეტრებიდან.</translation> <translation id="2612676031748830579">ბარათის ნომერი</translation> <translation id="2625189173221582860">პაროლი დაკოპირდა</translation> +<translation id="2642087927315268160">სისტემაში შესვლის ქვედა ფურცელი დახურულია.</translation> <translation id="2645657967708199252">თქვენმა <ph name="CONNECTION_TYPE" /> კავშირმა, შესაძლოა, შეანელოს ჩამოტვირთვა</translation> <translation id="2647434099613338025">დაამატე ენა</translation> <translation id="2649068648233607930">თქვენს ბრაუზერს მართავს <ph name="DOMAIN" /></translation> @@ -289,11 +300,13 @@ <translation id="2704606927547763573">დაკოპირდა</translation> <translation id="2707726405694321444">გვერდის განახლება</translation> <translation id="271033894570825754">ახალი</translation> +<translation id="2711073837061989559">ცდები</translation> <translation id="2718352093833049315">მხოლოდ Wi-Fi-ით</translation> <translation id="2718846868787000099">კონტენტის თქვენთვის სასურველ ენებზე რომ გამოჩნდეს, თქვენ მიერ მონახულებული საიტებისთვის ხელმისაწვდომი იქნება თქვენი უპირატესი პარამეტრები</translation> <translation id="2723001399770238859">აუდიო</translation> <translation id="2732063072010454421">ისარგებლეთ უკეთესი ხმოვანი ფუნქციებით</translation> <translation id="2739256783402597439">2G</translation> +<translation id="2746842245914314523">ამ ფუნქციების შესახებ დამატებითი ინფორმაციის მიღება შეგიძლიათ Chrome-ის პარამეტრებიდან. ცდების პერიოდში საიტებთან თქვენ ურთიერთქმედება, შესაძლოა, არ იყოს იმაზე უფრო კონფიდენციალური, ვიდრე ამ ახალი ფუნქციების გარეშეა.</translation> <translation id="2760989362628427051">მუქი თემის ჩართვა მოწყობილობაზე მუქი თემის ან ბატარეის დამზოგის გააქტიურებისას</translation> <translation id="2762000892062317888">ახლახან</translation> <translation id="276969039800130567">შესულია, როგორც <ph name="USER_EMAIL_ADDRESS" />.</translation> @@ -362,6 +375,7 @@ <translation id="3037177537145227281">ფასისთვის თვალის მიდევნება</translation> <translation id="3037517125981011456">გამოაჩენს Chrome-ში შესვლის მოთხოვნებს</translation> <translation id="3046945242843292318">შემდეგში ეწვიეთ ამ საიტს უფრო სწრაფად</translation> +<translation id="3055113921564083271">თქვენ მიერ წაშლილი ინტერესები</translation> <translation id="3055259925215945098">სანიშნე გადატანილია</translation> <translation id="3055841435094910999">Google-ს ეგზავნება ინფორმაცია თქვენ მიერ Chrome-ის გამოყენების შესახებ, თუმცა ის უშუალოდ თქვენთან დაკავშირებული არ არის\n\nChrome-ის ავარიულად გათიშვის შემთხვევაში, ავარიული გათიშვის დეტალები შეიძლება მოიცავდეს თქვენს ზოგიერთ პერსონალურ მონაცემს\n\nსინქრონიზაციის ჩართვის შემთხვევაში, მეტრიკა შეიძლება მოიცავდეს ინფორმაციას თქვენ მიერ მონახულებული URL-ების შესახებ</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> სანიშნე}other{<ph name="BOOKMARKS_COUNT_MANY" /> სანიშნე}}</translation> @@ -378,6 +392,7 @@ <translation id="3166827708714933426">ჩანართებისა და ფანჯრების მალსახმობები</translation> <translation id="316694332262407393">Chrome აქ უკვე გაშვებულია.</translation> <translation id="3169472444629675720">Discover</translation> +<translation id="3187472288455401631">რეკლამის ეფექტურობის გაზომვა</translation> <translation id="3207960819495026254">ჩანიშნულია</translation> <translation id="3208584281581115441">ახლავე შემოწმება</translation> <translation id="3211426585530211793"><ph name="ITEM_TITLE" /> წაშლილია</translation> @@ -408,6 +423,7 @@ <translation id="3290991969712132877">აქ სწრაფად რომ დაბრუნდეთ ხოლმე, დაამატეთ ეს გვერდი თქვენს მთავარ ეკრანს „სხვა ვარიანტების“ ღილაკის მეშვეობით</translation> <translation id="3297344142967351106">ხმოვანი დახმარება</translation> <translation id="3303414029551471755">გაგრძელდეს შინაარსის ჩამოტვირთვა?</translation> +<translation id="3321367458490630980">ინტერესი დაემატა</translation> <translation id="3334729583274622784">გსურთ ფაილის გაფართოების შეცვლა?</translation> <translation id="3341262203274374114">თვალის მიდევნების გაუქმება ვერ მოხერხდა. წარმოიქმნა შეფერხება.</translation> <translation id="3359667936385849800">სერვისის ამჟამინდელი პროვაიდერის გამოყენება</translation> @@ -429,8 +445,10 @@ <translation id="3444179773590444986">გსურთ, გამოგვეხმაუროთ საიტებისთვის განკუთვნილი მუქი თემის შესახებ?</translation> <translation id="3469665409713263828">{FILE_COUNT,plural, =1{დაგეგმილია 1 ჩამოტვირთვა}other{დაგეგმილია # ჩამოტვირთვა}}</translation> <translation id="3474624961160222204">გაგრძელება, როგორც <ph name="NAME" /></translation> +<translation id="3475207952017699209">პერსონალიზებული რეკლამის შესახებ</translation> <translation id="3478363558367712427">შეგიძლიათ აირჩიოთ საძიებო სისტემა</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />შეიტყვეთ მეტი<ph name="END_LINK" /> შემოთავაზებული კონტენტის შესახებ</translation> +<translation id="3495219333887281978">სისტემაში შესვლის ქვედა ფურცელი გახსნილია ნახევარ სიმაღლეზე.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="3502647154914451322">Chrome-ის გამოყენებით ეთანხმებით <ph name="BEGIN_TOS_LINK" />Google-ის მომსახურების პირობებს<ph name="END_TOS_LINK" />, ასევე, <ph name="BEGIN_ATOS_LINK" />Google Chrome-ისა და Chrome OS-ის მომსახურების დამატებით პირობებს<ph name="END_ATOS_LINK" />.</translation> <translation id="3507132249039706973">სტანდარტული დაცვა ჩართულია</translation> @@ -449,6 +467,7 @@ <translation id="3568688522516854065">თქვენს სხვა მოწყობილობაზე არსებულ ჩანართებზე წვდომისთვის შედით სისტემაში და ჩართეთ სინქრონიზაცია</translation> <translation id="357465026686164600">ტელეფონი უსაფრთხოების გასაღების სახით</translation> <translation id="3577473026931028326">წარმოიქმნა შეფერხება. ცადეთ ხელახლა.</translation> +<translation id="3578874072190212775">შეუწყვეთ ხელი საიტებს თაღლითობასთან ბრძოლასა და ბოტების ადამიანებისგან გარჩევაში</translation> <translation id="3587482841069643663">ყველა</translation> <translation id="3587596251841506391">გააუმჯობესეთ ვების უსაფრთხოება</translation> <translation id="3602290021589620013">გადახედვა</translation> @@ -459,6 +478,7 @@ <translation id="363596933471559332">ავტორიზაციის შენახული მონაცემების მეშვეობით ვებსაიტებში ავტომატური შესვლა. ამ ფუნქციის გამორთვის შემთხვევაში, ვებსაიტში შესვლის ყოველი მცდელობისას დადასტურება მოგიწევთ.</translation> <translation id="3653111872753786013"><ph name="WEBSITE_TITLE" />: <ph name="WEBSITE_URL" /></translation> <translation id="3677911431265050325">მობილური საიტის მოთხოვნა</translation> +<translation id="3678391608108111420">თქვენ მიერ ვების დათვალიერების ისტორია აისახება თქვენთვის ხილულ რეკლამასა და თქვენს ინტერესებზე, ქვემოთ პროგნოზირებულის შესაბამისად. თქვენი კონფიდენციალურობის დაცვის მიზნით, Chrome ავტომატურად წაშლის თქვენს ინტერესებს რამდენიმე კვირაში ერთხელ. ინტერესები გაახლდება, თუ რომელიმე მათგანს არ წაშლით.</translation> <translation id="3685860403008476208">თქვენ მიერ ინკოგნიტო რეჟიმში ჩამოტვირთული ფაილების ნახვას შეძლებს ამ მოწყობილობის ნებისმიერი მომხმარებელი.</translation> <translation id="3687645719033307815">თქვენ ამ გვერდის გადასახედ ვერსიას ათვალიერებთ</translation> <translation id="3690369331356918524">გაგაფრთხილებთ მონაცემთა გაჟონვისას პაროლების გამოაშკარავების შემთხვევაში</translation> @@ -490,6 +510,7 @@ <translation id="3856096718352044181">დაადასტურეთ პროვაიდერის სისწორე ან ცადეთ მოგვიანებით</translation> <translation id="3858860766373142691">სახელი</translation> <translation id="3861633093716975811">პოპულარული ვიდეოები</translation> +<translation id="3862592757180800623">აზრის შეცვლას ნებისმიერ დროს შეძლებთ Chrome-ის პარამეტრებიდან. ცდების პერიოდში საიტებთან თქვენ ურთიერთქმედება, შესაძლოა, არ იყოს იმაზე უფრო კონფიდენციალური, ვიდრე ამ ახალი ფუნქციების გარეშეა.</translation> <translation id="3892148308691398805">ტექსტის კოპირება</translation> <translation id="3894427358181296146">საქაღალდის დამატება</translation> <translation id="3899682235662194879">ყველა ინკოგნიტო ჩანართის დახურვა</translation> @@ -498,6 +519,7 @@ <translation id="3924911262913579434">„<ph name="SAFE_BROWSING_MODE" />“ ჩართულია</translation> <translation id="3927692899758076493">Sans Serif</translation> <translation id="3928666092801078803">ჩემი მონაცემების კომბინირება</translation> +<translation id="3932390316856284148">სისტემაში შესვლის ქვედა ფურცელი გახსნილია სრულ სიმაღლეზე.</translation> <translation id="3934366560681368531">„</translation> <translation id="393697183122708255">ჩართული ხმოვანი ძიება მიუწვდომელია</translation> <translation id="395377504920307820">ანგარიშის გარეშე გამოყენება</translation> @@ -509,6 +531,7 @@ <translation id="3969863827134279083">გადაადგილება ზემოთ</translation> <translation id="397583555483684758">სინქრონიზაციის პროცესი შეწყდა</translation> <translation id="3976396876660209797">ამოშალეთ და ხელახლა შექმენით ეს მალსახმობი</translation> +<translation id="3981902534690264083">რეკლამის განმთავსებლებს საშუალება აქვთ, გაერკვნენ, რამდენად ეფექტურია რეკლამა</translation> <translation id="3985215325736559418">გსურთ, ხელახლა ჩამოტვირთოთ <ph name="FILE_NAME" />?</translation> <translation id="3987993985790029246">ბმულის კოპირება</translation> <translation id="4000212216660919741">ხაზგარეშე მთავარი გვერდი</translation> @@ -526,6 +549,7 @@ <translation id="4096227151372679484">სანიშნეების შენახვის ნაკადი გახსნილია ნახევარ სიმაღლეზე</translation> <translation id="4099578267706723511">დაგვეხმარეთ Chrome-ის გაუმჯობესებაში, გამოყენების სტატისტიკისა და შეცდომების შესახებ მოხსენებების Google-ში გაგზავნით.</translation> <translation id="410351446219883937">ავტომატური დაკვრა</translation> +<translation id="4106587138345390261">Chrome მუშაობს ახალ ფუნქციებზე, რომელთა მეშვეობითაც საიტებს იგივე ფუნქციონალი შეუნარჩუნდება თქვენი ნაკლები ინფორმაციის გამოყენებით</translation> <translation id="4108314971463891922">თვალის დევნება</translation> <translation id="4108998448622696017">აღმოაჩენს სახიფათო მოვლენებს და გაგაფრთხილებთ მათ შესახებ.</translation> <translation id="4116038641877404294">ჩამოტვირთეთ გვერდები ხაზგარეშე რეჟიმში გამოსაყენებლად</translation> @@ -546,6 +570,7 @@ <translation id="4248098802131000011">დაიცავით პაროლები პერსონალურ მონაცემთა გაჟონვის შემთხვევებისა და უსაფრთხოებასთან დაკავშირებული სხვა პრობლემებისგან</translation> <translation id="4250229828105606438">ეკრანის ანაბეჭდი</translation> <translation id="4256782883801055595">ღია წყაროს ლიცენზიები</translation> +<translation id="4262915912852657291"><ph name="BEGIN_BOLD" />გამოყენებული მონაცემების ტიპები:<ph name="END_BOLD" /> თქვენ მიერ ვების დათვალიერების ისტორია, ამ მოწყობილობაზე თქვენ მიერ Chrome-ის მეშვეობით მონახულებული საიტების ჩანაწერი.</translation> <translation id="4263656433980196874">ასისტენტში ხმოვან ძიებაზე თანხმობის სამომხმარებლო ინტერფეისი გახსნილია სრულ სიმაღლეზე</translation> <translation id="4269820728363426813">ბმულის მისამართის კოპირება</translation> <translation id="4290281343757112331">გსურთ, მოგვიანებით ჩამოტვირთოთ?</translation> @@ -556,6 +581,7 @@ <translation id="4307992518367153382">ძირითადი</translation> <translation id="4320177379694898372">ინტერნეტთან კავშირი არ არის</translation> <translation id="4321739720395210191">კამერის გახსნა ვერ მოხერხდა. გადატვირთეთ მოწყობილობა და ცადეთ ხელახლა.</translation> +<translation id="4324158606177867698">აქ გამოჩნდება თქვენ მიერ წაშლილი ინტერესები</translation> <translation id="433213510553688132">მიმდინარეობს თვალის მიდევნება...</translation> <translation id="4335835283689002019">Safe Browsing გამორთულია</translation> <translation id="4351244548802238354">დიალოგის დახურვა</translation> @@ -643,6 +669,7 @@ <translation id="4807098396393229769">სახელი ბარათზე</translation> <translation id="481574578487123132">მიბმული მოწყობილობები</translation> <translation id="4818017973810341238"><ph name="VIOLATED_URL" />-ისთვის ციფრულ ობიექტებზე ბმულების შემოწმება ვერ მოხერხდა</translation> +<translation id="4826163340425232009">სისტემაში შესვლის ქვედა ფურცელი.</translation> <translation id="4831037795716408498">კონტენტის ჩამოტვირთვა</translation> <translation id="4834007576107377210">გაეცანით თქვენი საძიებო სისტემის ინსტრუქციას იმის თაობაზე, როგორ წაშალოთ თქვენი ძიების ისტორია, თუ ეს შესაძლებელია</translation> <translation id="4834250788637067901">გადახდის მეთოდები, შემოთავაზებები და მისამართები Google Pay-დან</translation> @@ -697,6 +724,7 @@ <translation id="5091199029769593641">მალე, ახალი ჩანართის გახსნისას, იხილავთ ამბებს <ph name="SITE_NAME" />-დან. თქვენ მიერ თვალმიდევნებული საიტები შეინახება თქვენს Google ანგარიშში. მათი მართვა Discover-ის პარამეტრებიდან შეგიძლიათ.</translation> <translation id="5091249083535528968">გამოყენების გაფართოებული მონაცემები</translation> <translation id="509429900233858213">შეცდომა მოხდა.</translation> +<translation id="5098190077610408701">გსურთ, დაამატოთ ინტერესი?</translation> <translation id="5102401324271069229">საიტის მიერ პაროლის მოპარვის მცდელობის ან თქვენ მიერ საზიანო ფაილის ჩამოტვირთვის შემთხვევაში, Chrome-ის მიერ Safe Browsing-ს გაეგზავნება URL-ები და შესაბამისი გვერდის კონტენტის გარკვეული ნაწილი</translation> <translation id="510275257476243843">დარჩენილია 1 საათი</translation> <translation id="5115811374190515607">აქ: <ph name="PRODUCT_NAME" /></translation> @@ -704,6 +732,7 @@ <translation id="5123685120097942451">ინკოგნიტო ჩანართი</translation> <translation id="5126510351761255129">დაადასტურეთ თქვენი ბარათი</translation> <translation id="5132942445612118989">მოახდინეთ თქვენი პაროლების, ისტორიისა და სხვა კონტენტის სინქრონიზაცია თქვენს ყველა მოწყობილობაზე</translation> +<translation id="5136889366284282380">ექსპერიმენტის მსვლელობისას, თქვენ მიერ ვების დათვალიერების ბოლოდროინდელი ისტორიის საფუძველზე, Chrome ვარაუდით დაადგენს თემებს, რომლებიც, შესაძლოა, გაინტერესებდეთ. შემდეგ, თქვენი ვინაობის დადგენის გარეშე, თქვენ მიერ მონახულებული ზოგიერთი საიტი გამოიყენებს აღნიშნულ ინფორმაციას, შესაფერისი რეკლამა რომ გაჩვენოთ.</translation> <translation id="5139940364318403933">ისწავლეთ Google Drive-ის გამოყენება</translation> <translation id="5142281402488957685">ახალი ამბების გასაცნობად ჩამოსწიეთ განახლებისთვის</translation> <translation id="5152843274749979095">მხარდაჭერილი აპები დაინსტალირებული არ არის</translation> @@ -776,6 +805,7 @@ <translation id="5578795271662203820">ამ გამოსახულების ძიება <ph name="SEARCH_ENGINE" />-ში</translation> <translation id="5581519193887989363"><ph name="BEGIN_LINK1" />პარამეტრებიდან<ph name="END_LINK1" /> ნებისმიერ დროს შეგიძლიათ აირჩიოთ, რისი სინქრონიზაცია გსურთ.</translation> <translation id="5590372121997663538">ამ კომპიუტერის დამახსოვრება</translation> +<translation id="559871659088672663">ეს ფუნქცია ამჟამად შემუშავების ეტაპზეა</translation> <translation id="5599455543593328020">ინკოგნიტო რეჟიმი</translation> <translation id="5599941490345670218">Google ასისტენტს შეუძლია გარკვეული მოქმედების შესრულება თქვენ ნაცვლად სხვადასხვა ვებსაიტზე</translation> <translation id="5620163320393916465">შენახული პაროლები არ არის</translation> @@ -785,6 +815,9 @@ <translation id="5628604359369369630">წაუკითხავი — ხაზგარეშე რეჟიმში ხელმისაწვდომი</translation> <translation id="5639724618331995626">ყველა საიტის დაშვება</translation> <translation id="5648166631817621825">ბოლო 7 დღე</translation> +<translation id="5655245063036102919">რეკლამის ეფექტურობის გაზომვის მეშვეობით, თქვენ მიერ მონახულებულ საიტებს საშუალება ექნება, Chrome-ისგან მოითხოვონ გარკვეული ინფორმაცია, რომელიც ამა თუ იმ საიტს თავისი რეკლამის ეფექტურობის განსაზღვრაში დაეხმარება. რეკლამის ეფექტურობის გაზომვისას საიტებს შორის თვალის მიდევნების მექანიზმები შეზღუდულია, რაც ნიშნავს, რომ საიტებს შორის მინიმალური ინფორმაცია გადაიცემა. + +ზემოაღნიშნული კუთხით თქვენთან დაკავშირებული ინფორმაციის გაკონტროლება შეგიძლიათ <ph name="BEGIN_LINK" />თქვენი დათვალიერების ისტორიიდან<ph name="END_LINK" />.</translation> <translation id="5655963694829536461">თქვენს ჩამოტვირთვებში ძიება</translation> <translation id="5659593005791499971">ელფოსტა</translation> <translation id="5665379678064389456">მოვლენის <ph name="APP_NAME" />-ში შექმნა</translation> @@ -870,6 +903,7 @@ <translation id="6069177176307973611">გაეცანით კონფიდენციალურობისა და უსაფრთხოების პარამეტრებს</translation> <translation id="6070730414166672373">მიმდინარეობს თქვენს ბანკთან დაკავშირება\u2026</translation> <translation id="6085886413119427067">განსაზღვრავს დაცული კავშირით ვებსაიტებთან დაკავშირების ხერხს</translation> +<translation id="6091413777268123602">Privacy Sandbox-თან დაკავშირებული ცდების ფარგლებში, საიტები ვების დათვალიერებისას იმავე ფუნქციებს შემოგთავაზებენ, თუმცა ნაკლებად გამოიყენებენ თქვენს მონაცემებს. ეს ნიშნავს, რომ თქვენი კონფიდენციალურობა მეტად დაცული იქნება, ხოლო საიტებს შორის თვალის მიდევნების მექანიზმები შეიზღუდება. ჩვენ პერიოდულად დავამატებთ ახალ ცდებს, როცა ისინი ტესტირებისთვის მზად იქნება.</translation> <translation id="60923314841986378">დარჩენილია <ph name="HOURS" /> საათი</translation> <translation id="6095578583683628124">თუ Google თქვენი ნაგულისხმევი საძიებო სისტემაცაა, უკეთეს, კონტექსტური თვალსაზრისით შესაფერის შემოთავაზებებს იხილავთ</translation> <translation id="6108923351542677676">მიმდინარეობს დაყენება…</translation> @@ -996,11 +1030,13 @@ <translation id="671481426037969117">თქვენი <ph name="FQDN" />-ის ტაიმერი ამოიწურა. ხვალ ის ხელახლა დაიწყება.</translation> <translation id="6715020873764921614">მაინც გსურთ, ჩამოტვირთოთ <ph name="FILE_NAME" /> (<ph name="FILE_SIZE" />)?</translation> <translation id="6719634564325948108">გსურთ QR კოდით დაკავშირება?</translation> +<translation id="6737612727720318154">დაუშვით ინტერესი ან საიტი, თუ თვლით, რომ კონკრეტულ ერთეულთან დაკავშირებული რეკლამა თქვენთვის სასარგებლო იქნება</translation> <translation id="6738516213925468394"><ph name="TIME" />-დან თქვენი მონაცემები დაშიფრულია <ph name="BEGIN_LINK" />სინქრონიზაციის საიდუმლო ფრაზით<ph name="END_LINK" />. შეიყვანეთ ის სინქრონიზაციის დასაწყებად.</translation> <translation id="6738867403308150051">ჩამოტვირთვა…</translation> <translation id="6751521182688001123">სწრაფად გახსენით ახალი ჩანართი. ამ მალსახმობის რედაქტირებისთვის შეეხეთ ხანგრძლივად.</translation> <translation id="6756507620369789050">გამოხმაურება</translation> <translation id="6767294960381293877">მოწყობილობების სია, რომლებთანაც უნდა გაზიარდეს ჩანართი, გახსნილია ნახევარ სიმაღლეზე.</translation> +<translation id="6770042910635026163">თქვენ მიერ მონახულებული ის საიტები, რომლებიც განაპირობებს თქვენს ინტერესებს</translation> <translation id="6770602306803890733">უსაფრთხოების გაუმჯობესება თქვენთვის და ვების ყველა მომხმარებლისთვის</translation> <translation id="6783942555455976443">შეინახეთ ეს გვერდი მოგვიანებით წასაკითხად და მიიღეთ შეხსენება</translation> <translation id="6795633245022906657">სწრაფად გახსენით ახალი ჩანართი. ამ მალსახმობის რედაქტირებისთვის გადადით პარამეტრებზე.</translation> @@ -1061,6 +1097,7 @@ <translation id="7093803425429738190">ემოციის დამატება</translation> <translation id="7105047059074518658">სხვადასხვა მოწყობილობიდან ვები მარტივად რომ დაათვალიეროთ, შედით სისტემაში</translation> <translation id="7106762743910369165">თქვენს ბრაუზერს მართავს თქვენი ორგანიზაცია</translation> +<translation id="7130504491556983216">აქ გამოჩნდება ინტერესების სია ვების დათვალიერების პარალელურად</translation> <translation id="7138678301420049075">სხვა</translation> <translation id="7143462160780459030">ეკრანის აღბეჭდვა ვერ მოხერხდა. ცადეთ ხელახლა.</translation> <translation id="7146622961999026732">როგორც ჩანს, თქვენთვის მნიშვნელოვანია შემდეგი აპები და საიტები:</translation> @@ -1095,6 +1132,7 @@ <translation id="7339898014177206373">ახალი ფანჯარა</translation> <translation id="7340958967809483333">Discover-ის ვარიანტები</translation> <translation id="7352339641508007922">ეკრანის გრძელი ანაბეჭდის გადასაღებად გადაიტანეთ ჩავლებით</translation> +<translation id="7352531447904559593">შეიტყვეთ მეტი ბრაუზერზე დაფუძნებული რეკლამის პერსონალიზების შესახებ</translation> <translation id="7352651011704765696">რაღაც არასწორად წარიმართა</translation> <translation id="7352939065658542140">ვიდეო</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{1 არჩეული ერთეულის გაზიარება}other{# არჩეული ერთეულის გაზიარება}}</translation> @@ -1150,6 +1188,7 @@ <translation id="7619072057915878432"><ph name="FILE_NAME" /> ვერ ჩამოიტვირთა ქსელთან დაკავშირებული პრობლემების გამო.</translation> <translation id="7626032353295482388">მოგესალმებათ Chrome!</translation> <translation id="7630202231528827509">მიუთითეთ URL</translation> +<translation id="7634280112532283638">სმაპისა და თაღლითობის შემცირება</translation> <translation id="7638584964844754484">საიდუმლო ფრაზა არასწორია</translation> <translation id="7641339528570811325">დათვალიერების მონაცემების გასუფთავება…</translation> <translation id="7646772052135772216">პაროლების სინქრონიზაცია არ მუშაობს</translation> @@ -1183,6 +1222,7 @@ <translation id="7805768142964895445">სტატუსი</translation> <translation id="7808889146555843082">ამ პაროლის წაშლის შემთხვევაში თქვენი ანგარიში <ph name="SITE" />-ზე არ წაიშლება. თქვენი პაროლი სხვის ხელში რომ არ აღმოჩნდეს, შეცვალეთ ან წაშალეთ ის <ph name="SITE" />-ზე.</translation> <translation id="7810647596859435254">გახსნა აპით…</translation> +<translation id="7814332119093857963"><ph name="BEGIN_BOLD" />თქვენი მონაცემების მართვის ხერხები:<ph name="END_BOLD" /> თქვენი ინტერესები ყოველკვირეულად წაიშლება და განახლდება. ამასთან, ამა თუ იმ ინტერესის დაბლოკვაც შეგიძლიათ ნებისმიერ დროს.</translation> <translation id="7815484226266492798">ეკრანის გრძელი ანაბეჭდი</translation> <translation id="78270725016672455">თქვენს კომპიუტერი ითხოვს ამ მოწყობილობის დარეგისტრირებას ვებსაიტზე შესვლის მიზნით</translation> <translation id="7844171778363018843">სინქრონიზაციისთვის მონაცემები არჩეული არ არის</translation> @@ -1209,6 +1249,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> მოძველდა.</translation> <translation id="7944772052836377867">სინქრონიზაციის ფუნქციას სჭირდება თქვენი ვინაობის დადასტურება</translation> <translation id="7947953824732555851">მიღება და შესვლა</translation> +<translation id="7959157064403954786">გამოცადეთ უფრო გამჭვირვალე რეკლამა</translation> <translation id="7961015016161918242">არასოდეს</translation> <translation id="7961926449547174351">მეხსიერებაზე წვდომა გათიშული გაქვთ. ჩასართავად გადადით პარამეტრებზე.</translation> <translation id="7963646190083259054">მომწოდებელი:</translation> @@ -1288,6 +1329,7 @@ <translation id="835847953965672673">აღდგენილია <ph name="NUMBER_OF_DOWNLOADS" /> ჩამოტვირთვა</translation> <translation id="8364299278605033898">იხილეთ პოპულარული ვებსაიტები</translation> <translation id="8368001212524806591">ფასებისთვის თვალის მიდევნება</translation> +<translation id="8383226135083126309"><ph name="BEGIN_BOLD" />ამ მონაცემთა გამოყენების წესი:<ph name="END_BOLD" /> Chrome-ს შეუძლია თქვენი ინტერესების პროგნოზირება. მოგვიანებით, თქვენ მიერ მონახულებულ საიტს საშუალება ექნება, Chrome-ს სთხოვოს თქვენი ინტერესების ჩვენება, თქვენთვის ხილული რეკლამის პერსონალიზების მიზნით.</translation> <translation id="8387617938027387193">დაადასტურეთ ვინაობა</translation> <translation id="8393700583063109961">შეტყობინების გაგზავნა</translation> <translation id="8394720698884623075">შეამოწმებს URL-ების თანხვედრას Chrome-ში შენახულ არაუსაფრთხო საიტების სიასთან</translation> @@ -1325,6 +1367,7 @@ <translation id="8505766168025405649">ჩამოტვირთვის სტატუსი ხელმისაწვდომია შეტყობინებაში</translation> <translation id="8514477925623180633">Chrome-ში შენახული პაროლების ექსპორტი</translation> <translation id="8516012719330875537">სურათების რედაქტორი</translation> +<translation id="8516431725144212809">Chrome-ის მიერ პროგნოზირებული თქვენი ინტერესები</translation> <translation id="8523928698583292556">შენახული პაროლის წაშლა</translation> <translation id="8540136935098276800">შეიყვანეთ URL სწორი ფორმატით</translation> <translation id="854522910157234410">ამ გვერდის გახსნა</translation> @@ -1356,6 +1399,7 @@ <translation id="8659579665266920523">Chrome-ით ძიების წესი</translation> <translation id="8662811608048051533">თქვენ გამოხვალთ სისტემიდან საიტების უმეტესობაზე.</translation> <translation id="8664979001105139458">ამ სახელის მქონე ფაილი უკვე არსებობს</translation> +<translation id="8667760277771450375">ჩვენ ვმუშაობთ ახალ ხერხებზე, რომელთა მეშვეობითაც შეიზღუდება საიტებს შორის თვალის მიდევნების მექანიზმები, საიტებს კი მაინც ექნება სარეკლამო სპამისა და თაღლითობის აღკვეთის შესაძლებლობა.</translation> <translation id="8676789164135894283">დადასტურება შესვლისთვის</translation> <translation id="867767487203716855">შემდეგი განახლება</translation> <translation id="8683039184091909753">სურათი</translation> @@ -1464,6 +1508,7 @@ <translation id="962979164594783469">ამ აპის ინსტალაცია</translation> <translation id="96681097142096641">გსურთ, იხილოთ გამარტივებული გვერდი?</translation> <translation id="968900484120156207">აქ გამოჩნდება თქვენ მიერ მონახულებული გვერდები</translation> +<translation id="969573236494556070">შეზღუდეთ საიტებს შორის გაზიარება</translation> <translation id="970715775301869095">დარჩენილია <ph name="MINUTES" /> წთ</translation> <translation id="981121421437150478">ოფლაინი</translation> <translation id="983192555821071799">ყველა ჩანართის დახურვა</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb index 9b288f7..58a833e0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
@@ -1389,6 +1389,7 @@ <translation id="8881973373982641723">Тарих және іздеу өрісіндегі дерек өшіріледі.</translation> <translation id="889338405075704026">Chrome параметрлеріне өту</translation> <translation id="8898822736010347272">Жаңа қауіптерді анықтап, интернетте барлығын қорғауға көмектесу үшін кірген кейбір беттердің URL мекенжайларын, шектеулі жүйе ақпаратын және кейбір беттердің мазмұнын Google-ға жібереді.</translation> +<translation id="8906502871739599113">Эмоция қайталанды.</translation> <translation id="8909135823018751308">Бөлісу…</translation> <translation id="8912362522468806198">Google аккаунты</translation> <translation id="8920114477895755567">Ата-аналар туралы толық ақпаратты қажет.</translation> @@ -1408,6 +1409,7 @@ <translation id="8970887620466824814">Бірдеңе дұрыс болмады.</translation> <translation id="8972098258593396643">Әдепкі қалтаға жүктеп алынсын ба?</translation> <translation id="8987641763863173640">Бейнені алдын ала қарау параметрлерін басқару</translation> +<translation id="898854820045159673">Эмоция қосылды.</translation> <translation id="8993760627012879038">Жаңа қойындыны инкогнито режимінде ашу</translation> <translation id="8996847606757455498">Басқа провайдер таңдау</translation> <translation id="8998729206196772491"><ph name="MANAGED_DOMAIN" /> басқаратын аккаунтпен кірдіңіз және оның әкімшісіне Chrome дерегін басқару құқығы берілді. Дерек осы аккаунтпен байланыстырылады. Chrome жүйесінен шыққанда, дерек бұл құрылғыдан жойылғанымен, Google аккаунтында сақталады.</translation> @@ -1442,6 +1444,7 @@ <translation id="9158770349521403363">Тек мазмұн бөлісу</translation> <translation id="916446198114569890">Кірген URL мекенжайларыңыз Google аккаунтыңызға сақталады.</translation> <translation id="9169507124922466868">Навигация тарихы жартылай ашық.</translation> +<translation id="9187955620966010988">Эмоция реттелді.</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{1 минут бұрын тексерілді.}other{# минут бұрын тексерілді.}}</translation> <translation id="9204836675896933765">1 файл қалды</translation> <translation id="9205933215779845960">Бет табылмады. Емлені тексеріңіз немесе <ph name="SEARCH_ENGINE" /> арқылы іздеп көріңіз.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb index 3777908..e81788e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
@@ -1389,6 +1389,7 @@ <translation id="8881973373982641723">검색창에 입력한 내용을 비롯한 기록 삭제</translation> <translation id="889338405075704026">Chrome 설정으로 이동</translation> <translation id="8898822736010347272">모든 웹 사용자에게 영향을 주는 새로운 위협을 발견하고 사용자를 보호하는 데 도움을 주기 위해 방문한 일부 페이지의 URL, 제한된 시스템 정보, 일부 페이지 콘텐츠를 Google로 전송합니다.</translation> +<translation id="8906502871739599113">반응 복사됨</translation> <translation id="8909135823018751308">공유…</translation> <translation id="8912362522468806198">Google 계정</translation> <translation id="8920114477895755567">부모님의 세부정보를 기다리는 중</translation> @@ -1408,6 +1409,7 @@ <translation id="8970887620466824814">문제 발생</translation> <translation id="8972098258593396643">기본 폴더에 다운로드하시겠습니까?</translation> <translation id="8987641763863173640">동영상 미리보기 설정 관리</translation> +<translation id="898854820045159673">반응 추가됨</translation> <translation id="8993760627012879038">시크릿 모드로 새 탭 열기</translation> <translation id="8996847606757455498">다른 제공업체 선택</translation> <translation id="8998729206196772491"><ph name="MANAGED_DOMAIN" />에서 관리하는 계정으로 로그인합니다. 계정 관리자가 내 Chrome 데이터를 관리하게 되며 데이터는 이 계정에 영구적으로 연결됩니다. Chrome에서 로그아웃하면 데이터가 이 기기에서 삭제되지만 Google 계정에는 그대로 유지됩니다.</translation> @@ -1442,6 +1444,7 @@ <translation id="9158770349521403363">콘텐츠만 공유</translation> <translation id="916446198114569890">방문한 URL이 Google 계정에 저장됩니다.</translation> <translation id="9169507124922466868">탐색 기록이 절반 높이로 열림</translation> +<translation id="9187955620966010988">반응 조정됨</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{1분 전에 확인됨}other{#분 전에 확인됨}}</translation> <translation id="9204836675896933765">파일 1개가 남았습니다.</translation> <translation id="9205933215779845960">페이지를 찾을 수 없습니다. 철자를 확인하거나 <ph name="SEARCH_ENGINE" />에서 검색해 보세요.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb index c4adea2..e49299e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
@@ -685,6 +685,7 @@ <translation id="4988526792673242964">Psl.</translation> <translation id="5001388021414335527">Stebėkite šią svetainę čia</translation> <translation id="5004416275253351869">„Google“ veiklos valdikliai</translation> +<translation id="5005141133360250920">Reakcija ištrinta</translation> <translation id="5005498671520578047">Kopijuoti slaptažodį</translation> <translation id="5011311129201317034"><ph name="SITE" /> nori prisijungti</translation> <translation id="5016205925109358554">Su užraitais</translation> @@ -740,6 +741,7 @@ <translation id="5368227114232678694">Jei norite naršyti privačiai šiame įrenginyje, išbandykite inkognito režimą</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> atidarytas skirtukas; palieskite, kad perjungtumėte skirtukus}one{<ph name="OPEN_TABS_MANY" /> atidarytas skirtukas; palieskite, kad perjungtumėte skirtukus}few{<ph name="OPEN_TABS_MANY" /> atidaryti skirtukai; palieskite, kad perjungtumėte skirtukus}many{<ph name="OPEN_TABS_MANY" /> atidaryto skirtuko; palieskite, kad perjungtumėte skirtukus}other{<ph name="OPEN_TABS_MANY" /> atidarytų skirtukų; palieskite, kad perjungtumėte skirtukus}}</translation> <translation id="5375577065097716013">Ieškoti vaizdo su „Google Lens“ <ph name="BEGIN_NEW" />Nauja<ph name="END_NEW" /></translation> +<translation id="5376898820269806588">Reakcija pakeista</translation> <translation id="5403644198645076998">Leisti tik konkrečias svetaines</translation> <translation id="5409881200985013443">Pateikti <ph name="ONE_TIME_CODE" /> įrenginyje (<ph name="CLIENT_NAME" />)?</translation> <translation id="5414836363063783498">Patvirtinama…</translation> @@ -1072,6 +1074,7 @@ <translation id="718926126787620637">Žymių aplankų sąrašas, atidarytas per visą ekrano aukštį</translation> <translation id="7191430249889272776">Skirtuko lapas atidarytas fone.</translation> <translation id="7196215469483532480">Privatumo vadovo paaiškinimas atidarytas per visą ekrano aukštį</translation> +<translation id="7208109991155904980">Reakcija perkelta</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{Laukiama 1 atsisiuntimo}one{Laukiama # atsisiuntimo}few{Laukiama # atsisiuntimų}many{Laukiama # atsisiuntimo}other{Laukiama # atsisiuntimų}}</translation> <translation id="7237045078887540010">Naudodami „Chrome“ sutinkate su <ph name="BEGIN_TOS_LINK" />„Google“ paslaugų teikimo sąlygomis<ph name="END_TOS_LINK" /> ir <ph name="BEGIN_ATOS_LINK" />„Google Chrome“ bei „Chrome“ OS papildomomis paslaugų teikimo sąlygomis<ph name="END_ATOS_LINK" />. Taip pat taikoma <ph name="BEGIN_PRIVACY_LINK" />privatumo politika<ph name="END_PRIVACY_LINK" />.</translation> <translation id="7242755609445462077">Stilizuotas paryškinimas: <ph name="CURRENT_DATE" /></translation> @@ -1386,6 +1389,7 @@ <translation id="8881973373982641723">Išvaloma istorija, įskaitant paieškos laukelį.</translation> <translation id="889338405075704026">Eiti į „Chrome“ nustatymus</translation> <translation id="8898822736010347272">„Google“ siunčiami kai kurių lankomų puslapių URL, ribota sistemos informacija ir kai kurių puslapių turinys, kad būtų galima aptikti naujas grėsmes ir apsaugoti visus žiniatinklio naudotojus.</translation> +<translation id="8906502871739599113">Pateikta tiksli reakcijos kopija</translation> <translation id="8909135823018751308">Bendrinti…</translation> <translation id="8912362522468806198">„Google“ paskyra</translation> <translation id="8920114477895755567">Laukiama išsamios tėvų informacijos.</translation> @@ -1405,6 +1409,7 @@ <translation id="8970887620466824814">Kažkas ne taip.</translation> <translation id="8972098258593396643">Atsisiųsti į numatytąjį aplanką?</translation> <translation id="8987641763863173640">Tvarkykite vaizdo įrašų peržiūros nustatymus</translation> +<translation id="898854820045159673">Reakcija pridėta</translation> <translation id="8993760627012879038">Atidaryti naują skirtuką inkognito režimu</translation> <translation id="8996847606757455498">Pasirinkti kitą teikėją</translation> <translation id="8998729206196772491">Prisijungiate naudodami „<ph name="MANAGED_DOMAIN" />“ tvarkomą paskyrą ir suteikiate jos administratoriui galimybę valdyti jūsų „Chrome“ duomenis. Duomenys bus visam laikui susieti su šia paskyra. Atsijungę nuo „Chrome“ ištrinsite duomenis iš šio įrenginio, bet jie ir toliau bus saugomi „Google“ paskyroje.</translation> @@ -1439,6 +1444,7 @@ <translation id="9158770349521403363">Bendrinti tik turinį</translation> <translation id="916446198114569890">URL, kuriais lankotės, išsaugomi jūsų „Google“ paskyroje</translation> <translation id="9169507124922466868">Naršymo istorija atidaryta puse aukščio</translation> +<translation id="9187955620966010988">Reakcija pakoreguota</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{Tikrinta prieš 1 minutę}one{Tikrinta prieš # minutę}few{Tikrinta prieš # minutes}many{Tikrinta prieš # minutės}other{Tikrinta prieš # minučių}}</translation> <translation id="9204836675896933765">Liko failų: 1</translation> <translation id="9205933215779845960">Nepavyko rasti šio puslapio. Patikrinkite rašybą arba pabandykite ieškoti sistemoje „<ph name="SEARCH_ENGINE" />“.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb index 31e5a75c..ac93308 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
@@ -685,6 +685,7 @@ <translation id="4988526792673242964">Lapas</translation> <translation id="5001388021414335527">Šeit varat sekot šai vietnei</translation> <translation id="5004416275253351869">Google aktivitātes vadīklas</translation> +<translation id="5005141133360250920">Reakcija ir izdzēsta</translation> <translation id="5005498671520578047">Paroles kopēšana</translation> <translation id="5011311129201317034"><ph name="SITE" /> vēlas izveidot savienojumu</translation> <translation id="5016205925109358554">Serif</translation> @@ -740,6 +741,7 @@ <translation id="5368227114232678694">Lai pārlūkotu tīmekli privāti šajā ierīcē, izmēģiniet inkognito režīmu.</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> atvērta cilne. Pieskarieties, lai pārslēgtu cilnes.}zero{<ph name="OPEN_TABS_MANY" /> atvērtu ciļņu. Pieskarieties, lai pārslēgtu cilnes.}one{<ph name="OPEN_TABS_MANY" /> atvērta cilne. Pieskarieties, lai pārslēgtu cilnes.}other{<ph name="OPEN_TABS_MANY" /> atvērtas cilnes. Pieskarieties, lai pārslēgtu cilnes.}}</translation> <translation id="5375577065097716013">Meklēt attēlu ar Google Lens <ph name="BEGIN_NEW" />Jaunums<ph name="END_NEW" /></translation> +<translation id="5376898820269806588">Reakcija ir mainīta</translation> <translation id="5403644198645076998">Atļaut apmeklēt tikai konkrētas vietnes</translation> <translation id="5409881200985013443">Vai iesniegt kodu “<ph name="ONE_TIME_CODE" />” ierīcē “<ph name="CLIENT_NAME" />”?</translation> <translation id="5414836363063783498">Notiek verifikācija...</translation> @@ -1072,6 +1074,7 @@ <translation id="718926126787620637">Grāmatzīmju mapju saraksts atvērts pilna ekrāna augstumā</translation> <translation id="7191430249889272776">Cilne tika atvērta fonā.</translation> <translation id="7196215469483532480">Paskaidrojums par konfidencialitātes ceļvedi ir atvērts pilna ekrāna augstumā</translation> +<translation id="7208109991155904980">Reakcija ir noņemta</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{Tiek gaidīta 1 lejupielāde}zero{Tiek gaidītas # lejupielādes}one{Tiek gaidīta # lejupielāde}other{Tiek gaidītas # lejupielādes}}</translation> <translation id="7237045078887540010">Izmantojot pārlūku Chrome, jūs piekrītat <ph name="BEGIN_TOS_LINK" />Google pakalpojumu sniegšanas noteikumiem<ph name="END_TOS_LINK" /> un <ph name="BEGIN_ATOS_LINK" />Google Chrome un Chrome OS pakalpojumu sniegšanas papildu noteikumiem<ph name="END_ATOS_LINK" />. Ir spēkā arī <ph name="BEGIN_PRIVACY_LINK" />konfidencialitātes politika<ph name="END_PRIVACY_LINK" />.</translation> <translation id="7242755609445462077">Stilizēts izcēlums: <ph name="CURRENT_DATE" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb index 616c69c..e1ba12c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
@@ -1388,6 +1388,7 @@ <translation id="8881973373982641723">ရှာဖွေစာလုံးဖြည့်ကွက်လပ် အပါအဝင် မှတ်တမ်းကို ရှင်းပေးသည်။</translation> <translation id="889338405075704026">Chrome ဆက်တင်များသို့ သွားရန်</translation> <translation id="8898822736010347272">အန္တရာယ်အသစ်များ ရှာဖွေရာ၌ အထောက်အကူဖြစ်စေရန်နှင့် ဝဘ်ပေါ်ရှိလူတိုင်းကို ကာကွယ်ရန် သင်ဝင်ကြည့်သည့် အချို့ဝဘ်ဆိုက်များ၏ URL များ၊ ကန့်သတ်ထားသည့် စနစ်အချက်အလက်များနှင့် အချို့သော ဝဘ်ဆိုက်ပါအကြောင်းအရာတို့ကို Google သို့ ပို့သည်။</translation> +<translation id="8906502871739599113">တုံ့ပြန်မှု ထပ်နေသည်</translation> <translation id="8909135823018751308">ၐေမျှရန်...</translation> <translation id="8912362522468806198">Google အကောင့်</translation> <translation id="8920114477895755567">မိဘများ၏ အသေးစိတ်အား စောင့်ဆိုင်းနေသည်။</translation> @@ -1407,6 +1408,7 @@ <translation id="8970887620466824814">တစ်ခုခု မှားသွားပါသည်။</translation> <translation id="8972098258593396643">မူရင်းဖိုင်တွဲသို့ ဒေါင်းလုဒ်လုပ်လိုပါသလား။</translation> <translation id="8987641763863173640">ဗီဒီယိုအစမ်းကြည့်ရှုခြင်း ဆက်တင်များကို စီမံရန်</translation> +<translation id="898854820045159673">တုံ့ပြန်မှု ထည့်လိုက်သည်</translation> <translation id="8993760627012879038">တဘ်အသစ်ကို ရုပ်ဖျက်မုဒ်တွင် ဖွင့်ရန်</translation> <translation id="8996847606757455498">ဝန်ဆောင်မှုပေးသူ နောက်တစ်ခု ရွေးရန်</translation> <translation id="8998729206196772491"><ph name="MANAGED_DOMAIN" /> က စီမံထားသည့် အကောင့်ဖြင့် သင်လက်မှတ်ထိုးဝင်ထားခြင်းဖြစ်ပြီး ၎င်း၏စီမံခန့်ခွဲသူကို သင့် Chrome ဒေတာများအား ထိန်းချုပ်ခွင့်ပေးထားပါသည်။ သင့်ဒေတာများသည် ဤအကောင့်နှင့် အပြီးအပိုင်ချိတ်ဆက်ထားပါသည်။ Chrome မှ ထွက်လိုက်ခြင်းဖြင့် ဤစက်ပစ္စည်းမှ ဒေတာများကို ဖျက်လိုက်မည်ဖြစ်သော်လည်း သင့် Google အကောင့်တွင် သိမ်းဆည်းထားဦးမည်ဖြစ်သည်။</translation> @@ -1441,6 +1443,7 @@ <translation id="9158770349521403363">အကြောင်းအရာသီးသန့် မျှဝေပါ</translation> <translation id="916446198114569890">သင်ဝင်ကြည့်သည့် URL များကို သင့် Google Account တွင်သိမ်းထားသည်</translation> <translation id="9169507124922466868">လမ်းညွှန်မှု မှတ်တမ်း တစ်ဝက်ဖွင့်ထားသည်</translation> +<translation id="9187955620966010988">တုံ့ပြန်မှု ပြင်ဆင်လိုက်သည်</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{လွန်ခဲ့သော ၁ မိနစ်က စစ်ဆေးခဲ့သည်}other{လွန်ခဲ့သော # မိနစ်က စစ်ဆေးခဲ့သည်}}</translation> <translation id="9204836675896933765">ဖိုင် ၁ ဖိုင် ကျန်ပါသည်</translation> <translation id="9205933215779845960">၎င်းစာမျက်နှာ ရှာမတွေ့ပါ။ စာလုံးပေါင်းစစ်ဆေးပါ (သို့) <ph name="SEARCH_ENGINE" /> တွင် ရှာကြည့်ပါ။</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb index bb90fbb..f77c010 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
@@ -1389,6 +1389,7 @@ <translation id="8881973373982641723">Tømmer loggen, inkludert loggen i søkefeltet.</translation> <translation id="889338405075704026">Gå til Chrome-innstillingene</translation> <translation id="8898822736010347272">Sender nettadresser for noen av sidene du besøker, begrenset systeminformasjon og noe sideinnhold til Google for å bidra til å oppdage nye trusler og beskytte alle på nettet.</translation> +<translation id="8906502871739599113">Reaksjonen er duplisert</translation> <translation id="8909135823018751308">Del</translation> <translation id="8912362522468806198">Google-konto</translation> <translation id="8920114477895755567">Venter på informasjon om foreldre.</translation> @@ -1408,6 +1409,7 @@ <translation id="8970887620466824814">Noe gikk galt.</translation> <translation id="8972098258593396643">Vil du laste ned til standardmappen?</translation> <translation id="8987641763863173640">Administrer innstillinger for videoforhåndsvisning</translation> +<translation id="898854820045159673">Reaksjonen er lagt til</translation> <translation id="8993760627012879038">Åpne en ny fane i inkognitomodus</translation> <translation id="8996847606757455498">Velg en annen leverandør</translation> <translation id="8998729206196772491">Du logger på med en konto som administreres av <ph name="MANAGED_DOMAIN" />, og du gir administratoren for dette domenet kontroll over Chrome-dataene dine. Dataene dine blir permanent knyttet til denne kontoen. Når du logger av Chrome, slettes dataene dine fra denne enheten, men de fortsetter å være lagret i Google-kontoen din.</translation> @@ -1442,6 +1444,7 @@ <translation id="9158770349521403363">Del kun innhold</translation> <translation id="916446198114569890">Nettadressene du besøker, lagres i Google-kontoen din</translation> <translation id="9169507124922466868">Navigasjonshistorikken er halvveis åpnet</translation> +<translation id="9187955620966010988">Reaksjonen er justert</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{Sjekket for ett minutt siden}other{Sjekket for # minutter siden}}</translation> <translation id="9204836675896933765">1 fil gjenstår</translation> <translation id="9205933215779845960">Finner ikke den siden. Kontroller stavemåten, eller prøv et søk på <ph name="SEARCH_ENGINE" />.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb index 3e26b49..fb0f45e2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
@@ -1389,6 +1389,7 @@ <translation id="8881973373982641723">ସନ୍ଧାନ ବାକ୍ସରେ ଥିବା ଇତିହାସ ସମେତ, ବ୍ରାଉଜିଂ ଇତିହାସକୁ ଖାଲି କରେ।</translation> <translation id="889338405075704026">Chrome ସେଟିଂସ୍କୁ ଯାଆନ୍ତୁ</translation> <translation id="8898822736010347272">ନୂଆ ବିପଦଗୁଡ଼ିକୁ ଖୋଜି ପାଇବାରେ ଏବଂ ୱେବରେ ସମସ୍ତଙ୍କୁ ସୁରକ୍ଷା ଦେବାରେ ସାହାଯ୍ୟ କରିବାକୁ, ଆପଣ ଭିଜିଟ୍ କରୁଥିବା କିଛି ୱେବପୃଷ୍ଠାର URLଗୁଡ଼ିକ, ସୀମିତ ସିଷ୍ଟମ୍ ସୂଚନା ଏବଂ କିଛି ୱେବପୃଷ୍ଠାର ବିଷୟବସ୍ତୁ Googleକୁ ପଠାଏ।</translation> +<translation id="8906502871739599113">ପ୍ରତିକ୍ରିୟାକୁ ଡୁପ୍ଲିକେଟ କରାଯାଇଛି</translation> <translation id="8909135823018751308">ସେୟାର୍ କରନ୍ତୁ…</translation> <translation id="8912362522468806198">Google ଆକାଉଣ୍ଟ</translation> <translation id="8920114477895755567">ଅଭିଭାବକଙ୍କ ବିବରଣୀ ପାଇଁ ଅପେକ୍ଷାରତ।</translation> @@ -1408,6 +1409,7 @@ <translation id="8970887620466824814">କିଛି ଭୁଲ ହୋଇଗଲା।</translation> <translation id="8972098258593396643">ଡିଫଲ୍ଟ ଫୋଲ୍ଡର୍କୁ ଡାଉନ୍ଲୋଡ୍ କରିବେ କି?</translation> <translation id="8987641763863173640">ଭିଡିଓ ପ୍ରିଭ୍ୟୁ ସେଟିଂସକୁ ପରିଚାଳନା କରନ୍ତୁ</translation> +<translation id="898854820045159673">ପ୍ରତିକ୍ରିୟାକୁ ଯୋଗ କରାଯାଇଛି</translation> <translation id="8993760627012879038">ଇନ୍କଗ୍ନିଟୋ ମୋଡ୍ରେ ଏକ ନୂଆ ଟାବ୍ ଖୋଲନ୍ତୁ</translation> <translation id="8996847606757455498">ଅନ୍ୟ ଏକ ପ୍ରଦାନକାରୀ ବାଛନ୍ତୁ</translation> <translation id="8998729206196772491"><ph name="MANAGED_DOMAIN" />ଙ୍କ ଦ୍ୱାରା ପରିଚାଳିତ ଏକ ଆକାଉଣ୍ଟ ମାଧ୍ୟମରେ ଆପଣ ସାଇନ୍ ଇନ୍ କରିଛନ୍ତି ଏବଂ ଏହାର ଆଡ୍ମିନିଷ୍ଟ୍ରେଟର୍ଙ୍କୁ ଆପଣଙ୍କ Chrome ଡାଟାର ନିୟନ୍ତ୍ରଣ ଦେଇଛନ୍ତି। ଆପଣଙ୍କର ଡାଟା ସ୍ଥାୟୀ ରୂପେ ଏହି ଆକାଉଣ୍ଟ ସହିତ ଯୋଡ଼ି ହୋଇଯିବ। Chromeରୁ ସାଇନ୍-ଆଉଟ୍ କରିବା ଦ୍ଵାରା ଏହି ଡିଭାଇସ୍ରୁ ଆପଣଙ୍କ ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ କିନ୍ତୁ ଏହା ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟରେ ଷ୍ଟୋର୍ ହୋଇ ରହିଥିବ।</translation> @@ -1442,6 +1444,7 @@ <translation id="9158770349521403363">କେବଳ ବିଷୟବସ୍ତୁ ସେୟାର୍ କରନ୍ତୁ</translation> <translation id="916446198114569890">ଆପଣ ଭିଜିଟ କରିଥିବା URLଗୁଡ଼ିକ ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟରେ ସେଭ ହୋଇଥାଏ</translation> <translation id="9169507124922466868">ନାଭିଗେସନ୍ ଇତିହାସ ଅଧା ଖୋଲା ଅଛି</translation> +<translation id="9187955620966010988">ପ୍ରତିକ୍ରିୟାକୁ ଆଡଜଷ୍ଟ କରାଯାଇଛି</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{1 ମିନିଟ୍ ପୂର୍ବେ ଯାଞ୍ଚ କରାଯାଇଛି}other{# ମିନିଟ୍ ପୂର୍ବେ ଯାଞ୍ଚ କରାଯାଇଛି}}</translation> <translation id="9204836675896933765">1 ଫାଇଲ୍ ବାକି ଅଛି</translation> <translation id="9205933215779845960">ସେହି ପୃଷ୍ଠାଟି ମିଳୁନାହିଁ। ଆପଣଙ୍କର ବନାନ ଯାଞ୍ଚ କରନ୍ତୁ କିମ୍ବା <ph name="SEARCH_ENGINE" />ରେ ଏକ ସନ୍ଧାନ ପାଇଁ ଚେଷ୍ଟା କରନ୍ତୁ।</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb index 385a6c2..1096a1b8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
@@ -1389,6 +1389,7 @@ <translation id="8881973373982641723">සෙවීම් කොටුවේ ඇතුළුව, ඉතිහාසය හිස් කරයි</translation> <translation id="889338405075704026">Chrome සැකසීම් වෙත යන්න</translation> <translation id="8898822736010347272">වෙබය මත නව තර්ජන සොයා ගෙන සියලු දෙනා ආරක්ෂා කිරීමට උදවු කිරීමට Google වෙත ඔබ පැමිණෙන සමහර පිටුවල URL, සීමිත පද්ධති තොරතුරු, සහ යම් පිටු අන්තර්ගතය යවයි.</translation> +<translation id="8906502871739599113">ප්රතිචාරය අනුපිටපත් කර ඇත</translation> <translation id="8909135823018751308">බෙදාගන්න…</translation> <translation id="8912362522468806198">Google ගිණුම</translation> <translation id="8920114477895755567">මාපියන්ගේ විස්තර සඳහා පොරොත්තු වෙමින්</translation> @@ -1408,6 +1409,7 @@ <translation id="8970887620466824814">යම් දෙයක් වැරදිණි</translation> <translation id="8972098258593396643">පෙරනිමි ෆෝල්ඩරයට බාන්නද?</translation> <translation id="8987641763863173640">වීඩියෝ පෙරදසුන් සැකසීම් කළමනාකරණය කරන්න</translation> +<translation id="898854820045159673">ප්රතිචාරය එක් කර ඇත</translation> <translation id="8993760627012879038">අප්රකට ප්රකාරය තුළ නව ටැබයක් විවෘත කරන්න</translation> <translation id="8996847606757455498">වෙනත් සැපයුම්කරුවකු තෝරන්න</translation> <translation id="8998729206196772491">ඔබ <ph name="MANAGED_DOMAIN" /> මගින් කළමනාකරණය කරන ගිණුමක් සමගින් පුරමින් සහ එහි පරිපාලකට ඔබේ Chrome දත්තවල පාලනය දෙමින් සිටී. ඔබේ දත්ත මෙම ගිණුමට ස්ථිරව බැඳෙනු ඇත. Chrome වෙතින් වැරීම ඔබේ දත්ත මෙම උපාංගය වෙතින් මකනු ඇති නමුත්, ඔබේ දත්ත Google ගිණුම තුළ ගබඩා වී තිබෙනු ඇත.</translation> @@ -1442,6 +1444,7 @@ <translation id="9158770349521403363">අන්තර්ගතය පමණක් බෙදා ගන්න</translation> <translation id="916446198114569890">ඔබ පිවිසෙන URL ඔබගේ Google ගිණුමට සුරැකේ</translation> <translation id="9169507124922466868">සංචලන ඉතිහාසය අඩක් විවෘතයි</translation> +<translation id="9187955620966010988">ප්රතිචාරය සීරුමාරු කර ඇත</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{මිනිත්තු 1කට පෙර පරීක්ෂා කරන ලදි}one{මිනිත්තු #කට පෙර පරීක්ෂා කරන ලදි}other{මිනිත්තු #කට පෙර පරීක්ෂා කරන ලදි}}</translation> <translation id="9204836675896933765">ගොනු 1ක් ඉතිරියි</translation> <translation id="9205933215779845960">එම පිටුව සොයා ගත නොහැකිය. ඔබගේ අක්ෂර වින්යාසය පරීක්ෂා කරන්න හෝ <ph name="SEARCH_ENGINE" /> හි සෙවීමක් උත්සාහ කරන්න.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb index 1830dc9d..678bc8cf1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
@@ -1389,6 +1389,7 @@ <translation id="8881973373982641723">Pastron historikun, duke përfshirë dhe në kutinë e kërkimit.</translation> <translation id="889338405075704026">Shko te "Cilësimet" e Chrome</translation> <translation id="8898822736010347272">Dërgon te Google URL-të e disa faqeve që viziton, informacione të kufizuara të sistemit, si dhe disa përmbajtje faqeje për të ndihmuar në zbulimin e kërcënimeve të reja dhe për t'i mbrojtur të gjithë në ueb.</translation> +<translation id="8906502871739599113">Reagimi u dublikua</translation> <translation id="8909135823018751308">Ndaj…</translation> <translation id="8912362522468806198">Llogaria e Google</translation> <translation id="8920114477895755567">Po pret detajet e prindërve.</translation> @@ -1408,6 +1409,7 @@ <translation id="8970887620466824814">Ndodhi një gabim.</translation> <translation id="8972098258593396643">Të shkarkohet në dosjen e parazgjedhur?</translation> <translation id="8987641763863173640">Menaxho cilësimet e pamjes paraprake të videos</translation> +<translation id="898854820045159673">Reagimi u shtua</translation> <translation id="8993760627012879038">Hap një skedë të re në "Modalitetin e fshehtë"</translation> <translation id="8996847606757455498">Zgjidh një ofrues tjetër</translation> <translation id="8998729206196772491">Po identifikohesh me një llogari të menaxhuar nga <ph name="MANAGED_DOMAIN" /> dhe po i jep administratorit të saj kontroll mbi të dhënat e tua të Chrome. Duke dalë nga Chrome do të fshihen të dhënat e tua nga kjo pajisje, por do të mbeten të ruajtura në llogarinë tënde të Google.</translation> @@ -1442,6 +1444,7 @@ <translation id="9158770349521403363">Ndaj vetëm përmbajtjen</translation> <translation id="916446198114569890">URL-të që viziton ruhen në llogarinë tënde të Google</translation> <translation id="9169507124922466868">Historiku i navigimit është gjysmë i hapur</translation> +<translation id="9187955620966010988">Reagimi u rregullua</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{Kontrolluar 1 minutë më parë}other{Kontrolluar # minuta më parë}}</translation> <translation id="9204836675896933765">1 skedar i mbetur</translation> <translation id="9205933215779845960">Faqja nuk mund të gjendet. Kontrollo drejtshkrimin ose provo të kërkosh në <ph name="SEARCH_ENGINE" />.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb index 3f1d38a..2b85df62a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
@@ -686,6 +686,7 @@ <translation id="4988526792673242964">Sidor</translation> <translation id="5001388021414335527">Följ denna webbplats här</translation> <translation id="5004416275253351869">Googles aktivitetsinställningar</translation> +<translation id="5005141133360250920">Reaktionen har tagits bort</translation> <translation id="5005498671520578047">Kopiera lösenord</translation> <translation id="5011311129201317034"><ph name="SITE" /> vill ansluta</translation> <translation id="5016205925109358554">Serif</translation> @@ -741,6 +742,7 @@ <translation id="5368227114232678694">Testa inkognitoläget om du vill surfa privat på enheten</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> flik öppen, tryck här om du vill byta flik}other{<ph name="OPEN_TABS_MANY" /> flikar öppna, tryck här om du vill byta flik}}</translation> <translation id="5375577065097716013">Bildsökning med Google Lens <ph name="BEGIN_NEW" />Ny<ph name="END_NEW" /></translation> +<translation id="5376898820269806588">Reaktionen har ändrats</translation> <translation id="5403644198645076998">Tillåt endast vissa webbplatser</translation> <translation id="5409881200985013443">Vill du skicka <ph name="ONE_TIME_CODE" /> på <ph name="CLIENT_NAME" />?</translation> <translation id="5414836363063783498">Verifierar ...</translation> @@ -1073,6 +1075,7 @@ <translation id="718926126787620637">Lista över bokmärkesmappar som har öppnats över hela skärmen</translation> <translation id="7191430249889272776">Fliken öppnades i bakgrunden.</translation> <translation id="7196215469483532480">Förklaringen till integritetsguiden har öppnats över hela skärmen</translation> +<translation id="7208109991155904980">Reaktionen har flyttats</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{1 nedladdning väntar}other{# nedladdningar väntar}}</translation> <translation id="7237045078887540010">Genom att använda Chrome godkänner du <ph name="BEGIN_TOS_LINK" />Googles användarvillkor<ph name="END_TOS_LINK" /> och <ph name="BEGIN_ATOS_LINK" />de ytterligare användarvillkoren för Google Chrome och Chrome OS<ph name="END_ATOS_LINK" />. <ph name="BEGIN_PRIVACY_LINK" />Integritetspolicyn<ph name="END_PRIVACY_LINK" /> gäller också.</translation> <translation id="7242755609445462077">Stiliserad markering <ph name="CURRENT_DATE" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb index 709fcc4..4965a0e1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
@@ -685,6 +685,7 @@ <translation id="4988526792673242964">Kurasa</translation> <translation id="5001388021414335527">Fuatilia tovuti hii hapa</translation> <translation id="5004416275253351869">Vidhibiti vya shughuli za Google</translation> +<translation id="5005141133360250920">Maoni yamefutwa</translation> <translation id="5005498671520578047">Nakili nenosiri</translation> <translation id="5011311129201317034"><ph name="SITE" /> inataka kuunganisha</translation> <translation id="5016205925109358554">Serif</translation> @@ -740,6 +741,7 @@ <translation id="5368227114232678694">Ili uvinjari kwa faragha kwenye kifaa hiki, jaribu kutumia hali fiche</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{Umefungua kichupo <ph name="OPEN_TABS_ONE" />, gusa ili ubadilishe vichupo}other{Umefungua vichupo <ph name="OPEN_TABS_MANY" />, gusa ili ubadilishe vichupo}}</translation> <translation id="5375577065097716013">Tafuta picha ukitumia Lenzi ya Google <ph name="BEGIN_NEW" />Mpya<ph name="END_NEW" /></translation> +<translation id="5376898820269806588">Maoni yamebadilishwa</translation> <translation id="5403644198645076998">Ruhusu tovuti maalum pekee</translation> <translation id="5409881200985013443">Ungependa kutuma <ph name="ONE_TIME_CODE" /> kwenye <ph name="CLIENT_NAME" />?</translation> <translation id="5414836363063783498">Inathibitisha...</translation> @@ -1072,6 +1074,7 @@ <translation id="718926126787620637">Orodha ya folda za alamisho imefunguliwa kwenye skrini nzima</translation> <translation id="7191430249889272776">Kichupo kimefunguliwa chini chini.</translation> <translation id="7196215469483532480">Maelezo kuhusu mwongozo wa faragha yamefunguliwa kwenye skrini nzima</translation> +<translation id="7208109991155904980">Maoni yamehamishwa</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{Inasubiri kupakua faili 1}other{Inasubri kupakua faili #}}</translation> <translation id="7237045078887540010">Kwa kutumia Chrome, unakubali <ph name="BEGIN_TOS_LINK" />Sheria na Masharti ya Google<ph name="END_TOS_LINK" /> na <ph name="BEGIN_ATOS_LINK" />Sheria na Masharti ya Ziada ya Google Chrome na Mfumo wa Uendeshaji wa Chrome<ph name="END_ATOS_LINK" />. <ph name="BEGIN_PRIVACY_LINK" />Sera ya Faragha<ph name="END_PRIVACY_LINK" /> pia inatumika.</translation> <translation id="7242755609445462077">Maandishi yaliyoangaziwa yenye mitindo <ph name="CURRENT_DATE" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb index 79b26fd9..89afea11 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -685,6 +685,7 @@ <translation id="4988526792673242964">หน้า</translation> <translation id="5001388021414335527">ติดตามเว็บไซต์นี้ได้ที่นี่</translation> <translation id="5004416275253351869">ส่วนควบคุมกิจกรรมของ Google</translation> +<translation id="5005141133360250920">ลบความรู้สึกแล้ว</translation> <translation id="5005498671520578047">คัดลอกรหัสผ่าน</translation> <translation id="5011311129201317034"><ph name="SITE" /> ต้องการเชื่อมต่อ</translation> <translation id="5016205925109358554">Serif</translation> @@ -740,6 +741,7 @@ <translation id="5368227114232678694">ลองใช้โหมดไม่ระบุตัวตนเพื่อท่องเว็บอย่างเป็นส่วนตัวในอุปกรณ์นี้</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{เปิดแท็บไว้ <ph name="OPEN_TABS_ONE" /> แท็บ แตะเพื่อเปลี่ยนแท็บ}other{เปิดแท็บไว้ <ph name="OPEN_TABS_MANY" /> แท็บ แตะเพื่อเปลี่ยนแท็บ}}</translation> <translation id="5375577065097716013">ค้นหาภาพด้วย Google Lens <ph name="BEGIN_NEW" />ใหม่<ph name="END_NEW" /></translation> +<translation id="5376898820269806588">เปลี่ยนความรู้สึกแล้ว</translation> <translation id="5403644198645076998">อนุญาตเฉพาะบางไซต์</translation> <translation id="5409881200985013443">ส่ง <ph name="ONE_TIME_CODE" /> ใน <ph name="CLIENT_NAME" /> ไหม</translation> <translation id="5414836363063783498">กำลังยืนยัน…</translation> @@ -1072,6 +1074,7 @@ <translation id="718926126787620637">รายการโฟลเดอร์บุ๊กมาร์กเปิดอยู่ที่ระดับเต็มความสูงของหน้าจอ</translation> <translation id="7191430249889272776">แท็บเปิดในพื้นหลัง</translation> <translation id="7196215469483532480">คำอธิบายคู่มือความเป็นส่วนตัวเปิดแบบเต็มหน้า</translation> +<translation id="7208109991155904980">ย้ายความรู้สึกแล้ว</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{ดาวน์โหลดรอดำเนินการ 1 รายการ}other{ดาวน์โหลดรอดำเนินการ # รายการ}}</translation> <translation id="7237045078887540010">การใช้ Chrome หมายความว่า คุณยอมรับ<ph name="BEGIN_TOS_LINK" />ข้อกำหนดในการให้บริการของ Google<ph name="END_TOS_LINK" /> และ<ph name="BEGIN_ATOS_LINK" />ข้อกำหนดในการให้บริการเพิ่มเติมของ Google Chrome และ Chrome OS<ph name="END_ATOS_LINK" /> <ph name="BEGIN_PRIVACY_LINK" />นโยบายความเป็นส่วนตัว<ph name="END_PRIVACY_LINK" />จะมีผลด้วย</translation> <translation id="7242755609445462077">ทำสไตไลซ์ไฮไลต์วันที่ <ph name="CURRENT_DATE" /></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 f0c70a6..9a0ed69 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
@@ -685,6 +685,7 @@ <translation id="4988526792673242964">Sayfalar</translation> <translation id="5001388021414335527">Siteyi buradan takip edin</translation> <translation id="5004416275253351869">Google etkinlik kontrolleri</translation> +<translation id="5005141133360250920">Tepki silindi</translation> <translation id="5005498671520578047">Şifreyi kopyalayın</translation> <translation id="5011311129201317034"><ph name="SITE" /> bağlanmak istiyor</translation> <translation id="5016205925109358554">Serif</translation> @@ -740,6 +741,7 @@ <translation id="5368227114232678694">Bu cihazda gizli olarak göz atmak için Gizli modu deneyin</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> açık sekme, sekmeler arasında geçiş yapmak için dokunun}other{<ph name="OPEN_TABS_MANY" /> açık sekme, sekmeler arasında geçiş yapmak için dokunun}}</translation> <translation id="5375577065097716013">Google Lens ile görsel ara <ph name="BEGIN_NEW" />Yeni<ph name="END_NEW" /></translation> +<translation id="5376898820269806588">Tepki değiştirildi</translation> <translation id="5403644198645076998">Yalnızca belirli sitelere izin ver</translation> <translation id="5409881200985013443"><ph name="CLIENT_NAME" /> üzerinde <ph name="ONE_TIME_CODE" /> gönderilsin mi?</translation> <translation id="5414836363063783498">Doğrulanıyor…</translation> @@ -1072,6 +1074,7 @@ <translation id="718926126787620637">Yer işareti klasörlerinin listesi tam ekranda açıldı</translation> <translation id="7191430249889272776">Sekme arka planda açıldı.</translation> <translation id="7196215469483532480">Gizlilik kılavuzu açıklaması tam ekranda açıldı</translation> +<translation id="7208109991155904980">Tepki taşındı</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{1 indirme işlemi beklemede}other{# indirme işlemi beklemede}}</translation> <translation id="7237045078887540010">Chrome'u kullanarak <ph name="BEGIN_TOS_LINK" />Google Hizmet Şartları<ph name="END_TOS_LINK" /> ile <ph name="BEGIN_ATOS_LINK" />Google Chrome ve Chrome OS Ek Hizmet Şartları<ph name="END_ATOS_LINK" />'nı kabul etmiş olursunuz. Ayrıca <ph name="BEGIN_PRIVACY_LINK" />Gizlilik Politikası<ph name="END_PRIVACY_LINK" /> da geçerli olur.</translation> <translation id="7242755609445462077">Stil eklenmiş vurgu <ph name="CURRENT_DATE" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb index 657a3c0e..9feb5f65 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
@@ -685,6 +685,7 @@ <translation id="4988526792673242964">Сторінки</translation> <translation id="5001388021414335527">Підпишіться на цей сайт</translation> <translation id="5004416275253351869">Керування активністю в Google</translation> +<translation id="5005141133360250920">Реакцію видалено</translation> <translation id="5005498671520578047">Копіювати пароль</translation> <translation id="5011311129201317034">Сайт <ph name="SITE" /> хоче підключитися</translation> <translation id="5016205925109358554">Serif</translation> @@ -740,6 +741,7 @@ <translation id="5368227114232678694">Щоб працювати на цьому пристрої в Інтернеті приватно, спробуйте анонімний режим</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> відкрита вкладка: натисніть, щоб перейти на іншу вкладку}one{<ph name="OPEN_TABS_MANY" /> відкрита вкладка: натисніть, щоб перейти на іншу вкладку}few{<ph name="OPEN_TABS_MANY" /> відкриті вкладки: натисніть, щоб перейти на іншу вкладку}many{<ph name="OPEN_TABS_MANY" /> відкритих вкладок: натисніть, щоб перейти на іншу вкладку}other{<ph name="OPEN_TABS_MANY" /> відкритої вкладки: натисніть, щоб перейти на іншу вкладку}}</translation> <translation id="5375577065097716013">Шукати через Об'єктив <ph name="BEGIN_NEW" />Нове<ph name="END_NEW" /></translation> +<translation id="5376898820269806588">Реакцію змінено</translation> <translation id="5403644198645076998">Дозволити лише певні сайти</translation> <translation id="5409881200985013443">Надіслати код <ph name="ONE_TIME_CODE" /> на пристрій "<ph name="CLIENT_NAME" />"?</translation> <translation id="5414836363063783498">Підтвердження…</translation> @@ -1072,6 +1074,7 @@ <translation id="718926126787620637">Список папок із закладками відкрито на всю висоту</translation> <translation id="7191430249889272776">Вкладку відкрито у фоновому режимі.</translation> <translation id="7196215469483532480">Пояснення про посібник щодо конфіденційності відкрито на всю висоту</translation> +<translation id="7208109991155904980">Реакцію вилучено</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{Очікується 1 завантаження}one{Очікується # завантаження}few{Очікується # завантаження}many{Очікується # завантажень}other{Очікується # завантаження}}</translation> <translation id="7237045078887540010">Використовуючи Chrome, ви приймаєте <ph name="BEGIN_TOS_LINK" />Загальні положення та умови Google<ph name="END_TOS_LINK" /> і <ph name="BEGIN_ATOS_LINK" />Додаткові умови використання Google Chrome та ОС Chrome<ph name="END_ATOS_LINK" />. Також застосовується <ph name="BEGIN_PRIVACY_LINK" />Політика конфіденційності<ph name="END_PRIVACY_LINK" />.</translation> <translation id="7242755609445462077">Стилізований виділений текст: <ph name="CURRENT_DATE" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb index 5600709..e67d0025 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
@@ -685,6 +685,7 @@ <translation id="4988526792673242964">صفحات</translation> <translation id="5001388021414335527">یہاں اس سائٹ کی پیروی کریں</translation> <translation id="5004416275253351869">Google سرگرمی کنٹرولز</translation> +<translation id="5005141133360250920">ردعمل کو حذف کر دیا گیا</translation> <translation id="5005498671520578047">پاس ورڈ کاپی کریں</translation> <translation id="5011311129201317034"><ph name="SITE" /> منسلک ہونا چاہتی ہے</translation> <translation id="5016205925109358554">Serif</translation> @@ -740,6 +741,7 @@ <translation id="5368227114232678694">اس آلے پر نجی طور پر براؤز کرنے کے لیے پوشیدگی آزمائیں</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> کھلا ہوا ٹیب، ٹیبز پر سوئچ کرنے کے لیے تھپتھپائيں}other{<ph name="OPEN_TABS_MANY" /> کھلے ہوئے ٹیبز، ٹیبز پر سوئچ کرنے کے لیے تھپتھپائيں}}</translation> <translation id="5375577065097716013">Google لینز سے تصویر تلاش کریں <ph name="BEGIN_NEW" />نیا<ph name="END_NEW" /></translation> +<translation id="5376898820269806588">ردعمل کو تبدیل کیا گیا</translation> <translation id="5403644198645076998">صرف کچھ سائٹس کو اجازت دیں</translation> <translation id="5409881200985013443"><ph name="CLIENT_NAME" /> پر <ph name="ONE_TIME_CODE" /> جمع کروائیں؟</translation> <translation id="5414836363063783498">توثیق ہو رہی ہے…</translation> @@ -1072,6 +1074,7 @@ <translation id="718926126787620637">ان بُک مارک فولڈرز کی فہرست جو مکمل اونچائی پر کھلی ہوئی ہے۔</translation> <translation id="7191430249889272776">ٹیب پس منظر میں کھلا ہے۔</translation> <translation id="7196215469483532480">رازداری کی گائیڈ کی وضاحت سے متعلق معلومات مکمل اونچائی پر کھلی ہوئی ہے</translation> +<translation id="7208109991155904980">ردعمل کو منتقل کیا گیا</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{1 ڈاؤن لوڈ زير التوا ہے}other{# ڈاؤن لوڈز زير التوا ہیں}}</translation> <translation id="7237045078887540010">Chrome کا استعمال کر کے، آپ <ph name="BEGIN_TOS_LINK" />Google کی سروس کی شرائط<ph name="END_TOS_LINK" /> اور <ph name="BEGIN_ATOS_LINK" />Chrome OS کی اضافی سروس کی شرائط<ph name="END_ATOS_LINK" />سے اتفاق کرتے ہیں۔ <ph name="BEGIN_PRIVACY_LINK" />رازداری کی پالیسی<ph name="END_PRIVACY_LINK" /> بھی لاگو ہوتی ہے۔</translation> <translation id="7242755609445462077">اسٹائلائزڈ ہائی لائٹ <ph name="CURRENT_DATE" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb index 5d4d5a4..84619b3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
@@ -1389,6 +1389,7 @@ <translation id="8881973373982641723">Xóa nhật ký, kể cả dữ liệu trong hộp tìm kiếm.</translation> <translation id="889338405075704026">Chuyển đến phần Cài đặt của Chrome</translation> <translation id="8898822736010347272">Gửi URL của một số trang bạn truy cập, thông tin về hệ thống (có giới hạn) và một số nội dung trang cho Google, nhằm phát hiện các mối đe dọa mới và bảo vệ mọi người khi dùng web.</translation> +<translation id="8906502871739599113">Đã lặp lại phản ứng</translation> <translation id="8909135823018751308">Chia sẻ...</translation> <translation id="8912362522468806198">Tài khoản Google</translation> <translation id="8920114477895755567">Đang đợi thông tin chi tiết của phụ huynh.</translation> @@ -1408,6 +1409,7 @@ <translation id="8970887620466824814">Đã xảy ra lỗi.</translation> <translation id="8972098258593396643">Tải xuống thư mục mặc định?</translation> <translation id="8987641763863173640">Quản lý chế độ cài đặt Xem trước video</translation> +<translation id="898854820045159673">Đã thêm phản ứng</translation> <translation id="8993760627012879038">Mở thẻ mới trong chế độ Ẩn danh</translation> <translation id="8996847606757455498">Chọn nhà cung cấp khác</translation> <translation id="8998729206196772491">Bạn đang đăng nhập bằng tài khoản do <ph name="MANAGED_DOMAIN" /> quản lý và cấp cho quản trị viên quyền kiểm soát dữ liệu Chrome của bạn. Dữ liệu của bạn sẽ được liên kết vĩnh viễn với tài khoản này. Việc đăng xuất khỏi Chrome sẽ xóa dữ liệu của bạn khỏi thiết bị này nhưng dữ liệu sẽ vẫn được lưu trữ trong Tài khoản Google.</translation> @@ -1442,6 +1444,7 @@ <translation id="9158770349521403363">Chỉ chia sẻ nội dung</translation> <translation id="916446198114569890">Các URL bạn truy cập sẽ được lưu vào tài khoản Google của bạn</translation> <translation id="9169507124922466868">Lịch sử di chuyển đang mở ở nửa dưới màn hình</translation> +<translation id="9187955620966010988">Đã điều chỉnh phản ứng</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{Đã kiểm tra 1 phút trước}other{Đã kiểm tra # phút trước}}</translation> <translation id="9204836675896933765">Còn lại 1 tệp</translation> <translation id="9205933215779845960">Không tìm được trang đó. Hãy kiểm tra lỗi chính tả hoặc thử tìm kiếm trên <ph name="SEARCH_ENGINE" />.</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 dbc541f..2b74d10a 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
@@ -685,6 +685,7 @@ <translation id="4988526792673242964">页面</translation> <translation id="5001388021414335527">点击此处关注此网站</translation> <translation id="5004416275253351869">Google 活动控件</translation> +<translation id="5005141133360250920">已删除回应</translation> <translation id="5005498671520578047">复制密码</translation> <translation id="5011311129201317034"><ph name="SITE" /> 希望连接到以下所选设备:</translation> <translation id="5016205925109358554">Serif</translation> @@ -740,6 +741,7 @@ <translation id="5368227114232678694">若要在此设备上私密地浏览网页,请试试无痕模式</translation> <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> 个打开的标签页,点按即可切换标签页}other{<ph name="OPEN_TABS_MANY" /> 个打开的标签页,点按即可切换标签页}}</translation> <translation id="5375577065097716013">使用 Google 智能镜头搜索图片<ph name="BEGIN_NEW" />新<ph name="END_NEW" /></translation> +<translation id="5376898820269806588">已更改回应</translation> <translation id="5403644198645076998">只允许访问某些网站</translation> <translation id="5409881200985013443">将“<ph name="ONE_TIME_CODE" />”提交至“<ph name="CLIENT_NAME" />”?</translation> <translation id="5414836363063783498">正在验证…</translation> @@ -1072,6 +1074,7 @@ <translation id="718926126787620637">书签文件夹列表已全屏打开</translation> <translation id="7191430249889272776">标签页已在后台打开。</translation> <translation id="7196215469483532480">隐私保护指南说明已全屏打开</translation> +<translation id="7208109991155904980">已移动回应</translation> <translation id="7227218174981371415">{FILE_COUNT,plural, =1{有 1 项下载尚待处理}other{有 # 项下载尚待处理}}</translation> <translation id="7237045078887540010">使用 Chrome 即表示您同意接受 <ph name="BEGIN_TOS_LINK" />Google 服务条款<ph name="END_TOS_LINK" />以及 <ph name="BEGIN_ATOS_LINK" />Google Chrome 和 Chrome 操作系统附加服务条款<ph name="END_ATOS_LINK" />。您也必须遵守<ph name="BEGIN_PRIVACY_LINK" />隐私权政策<ph name="END_PRIVACY_LINK" />。</translation> <translation id="7242755609445462077">已为突出显示的内容添加样式,日期为:<ph name="CURRENT_DATE" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb index 256d76f..9d34053 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -1389,7 +1389,7 @@ <translation id="8881973373982641723">清除記錄 (包括搜尋框中的記錄)。</translation> <translation id="889338405075704026">前往 Chrome 設定</translation> <translation id="8898822736010347272">向 Google 傳送部分您瀏覽網頁的網址、特定的系統資料及部分網頁內容,以協助探索新威脅,並保護所有網絡使用者。</translation> -<translation id="8906502871739599113">已複製回應</translation> +<translation id="8906502871739599113">複製咗反應</translation> <translation id="8909135823018751308">共用…</translation> <translation id="8912362522468806198">Google 帳戶</translation> <translation id="8920114477895755567">正在等候家長的詳細資訊。</translation> @@ -1409,7 +1409,7 @@ <translation id="8970887620466824814">發生錯誤。</translation> <translation id="8972098258593396643">要下載至預設資料夾嗎?</translation> <translation id="8987641763863173640">管理影片預覽設定</translation> -<translation id="898854820045159673">已新增回應</translation> +<translation id="898854820045159673">加咗反應</translation> <translation id="8993760627012879038">在無痕模式中開啟新分頁</translation> <translation id="8996847606757455498">選擇其他供應商</translation> <translation id="8998729206196772491">您即將登入由 <ph name="MANAGED_DOMAIN" /> 管理的帳戶,並讓帳戶管理員控制您的 Chrome 資料。您的資料將與這個帳戶建立永久連結。如果您登出 Chrome,系統將刪除此裝置上的資料,但這些資料仍會保留在您的 Google 帳戶中。</translation> @@ -1444,7 +1444,7 @@ <translation id="9158770349521403363">只分享內容</translation> <translation id="916446198114569890">系統會將您瀏覽的網址儲存至 Google 帳戶</translation> <translation id="9169507124922466868">導覽記錄喺畫面下半部分顯示</translation> -<translation id="9187955620966010988">已調整回應</translation> +<translation id="9187955620966010988">調整咗反應</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{曾在 1 分鐘前檢查}other{曾在 # 分鐘前檢查}}</translation> <translation id="9204836675896933765">尚餘 1 個檔案</translation> <translation id="9205933215779845960">找不到該頁面。請檢查拼字,或嘗試在 <ph name="SEARCH_ENGINE" /> 上搜尋。</translation>
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherModeTopToolbar.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherModeTopToolbar.java index dbb5716..698f9f0 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherModeTopToolbar.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherModeTopToolbar.java
@@ -137,6 +137,10 @@ * @param inTabSwitcherMode Whether or not tab switcher mode should be shown or hidden. */ void setTabSwitcherMode(boolean inTabSwitcherMode) { + // Skip the animations and visibility logic when Tablet GTS polish param is enabled, since + // they will instead be handled by the container view. + if (isTabletGridTabSwitcherPolishEnabled()) return; + if (mVisiblityAnimator != null) mVisiblityAnimator.cancel(); setVisibility(View.VISIBLE);
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java index ae08c57..17718e0 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java
@@ -474,15 +474,6 @@ protected void setUrlBarHidden(boolean hide) {} /** - * @return The name of the publisher of the content if it can be reliably extracted, or null - * otherwise. - */ - @Nullable - protected String getContentPublisher() { - return null; - } - - /** * Tells the Toolbar to update what buttons it is currently displaying. */ void updateButtonVisibility() {}
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java index 18833f9..5438f05 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
@@ -376,14 +376,6 @@ } /** - * @return The name of the publisher of the content if it can be reliably extracted, or null - * otherwise. - */ - public String getContentPublisher() { - return mToolbarLayout.getContentPublisher(); - } - - /** * Tells the Toolbar to update what buttons it is currently displaying. */ public void updateButtonVisibility() {
diff --git a/chrome/browser/ui/ash/chrome_new_window_client.cc b/chrome/browser/ui/ash/chrome_new_window_client.cc index 21dbad9..be16a8e 100644 --- a/chrome/browser/ui/ash/chrome_new_window_client.cc +++ b/chrome/browser/ui/ash/chrome_new_window_client.cc
@@ -494,8 +494,7 @@ } void ChromeNewWindowClient::OpenDiagnostics() { - if (base::FeatureList::IsEnabled(chromeos::features::kDiagnosticsApp)) - chrome::ShowDiagnosticsApp(ProfileManager::GetActiveUserProfile()); + chrome::ShowDiagnosticsApp(ProfileManager::GetActiveUserProfile()); } void ChromeNewWindowClient::OpenFeedbackPage(
diff --git a/chrome/browser/ui/ash/desks_templates/desks_templates_app_launch_handler.cc b/chrome/browser/ui/ash/desks_templates/desks_templates_app_launch_handler.cc index 055152c0..18be6dfb 100644 --- a/chrome/browser/ui/ash/desks_templates/desks_templates_app_launch_handler.cc +++ b/chrome/browser/ui/ash/desks_templates/desks_templates_app_launch_handler.cc
@@ -7,6 +7,7 @@ #include <string> #include "ash/constants/ash_features.h" +#include "ash/public/cpp/desk_template.h" #include "ash/wm/desks/desks_controller.h" #include "base/metrics/histogram_macros.h" #include "base/notreached.h" @@ -33,48 +34,39 @@ #include "components/services/app_service/public/cpp/app_types.h" #include "extensions/common/extension.h" -namespace { - -// The restore data owned by this class will clear after being set. This is a -// temporary estimate of how long it takes to launch apps. -constexpr base::TimeDelta kClearRestoreDataDuration = base::Seconds(5); - -} // namespace - DesksTemplatesAppLaunchHandler::DesksTemplatesAppLaunchHandler(Profile* profile) : ash::AppLaunchHandler(profile), read_handler_(app_restore::DeskTemplateReadHandler::Get()) {} -DesksTemplatesAppLaunchHandler::~DesksTemplatesAppLaunchHandler() = default; +DesksTemplatesAppLaunchHandler::~DesksTemplatesAppLaunchHandler() { + if (launch_id_) { + read_handler_->ClearRestoreData(launch_id_); -void DesksTemplatesAppLaunchHandler::SetRestoreDataAndLaunch( - std::unique_ptr<app_restore::RestoreData> new_restore_data) { - // Another desk template is underway. - // TODO(sammiequon): Checking the read handler for restore data is temporary. - // We will want to use a better check of whether a desk template is underway. - // Perhaps removing entries from read handler's restore data of launched apps - // and/or using individual shorter timeouts. - if (read_handler_->restore_data()) - return; + if (auto* arc_task_handler = + ash::app_restore::AppRestoreArcTaskHandler::GetForProfile( + profile())) { + arc_task_handler->ClearDeskTemplateArcAppLaunchHandler(launch_id_); + } + } +} - set_restore_data(std::move(new_restore_data)); +void DesksTemplatesAppLaunchHandler::LaunchTemplate( + const ash::DeskTemplate& desk_template) { + // Ensure that the handler isn't re-used. + DCHECK_EQ(launch_id_, 0); + launch_id_ = desk_template.launch_id(); - if (!HasRestoreData()) - return; + DCHECK(desk_template.desk_restore_data()); + auto restore_data = desk_template.desk_restore_data()->Clone(); + DCHECK(!restore_data->app_id_to_launch_list().empty()); - read_handler_->SetRestoreData(restore_data()->Clone()); + read_handler_->SetRestoreData(launch_id_, restore_data->Clone()); + set_restore_data(std::move(restore_data)); // Launch the different types of apps. They can be done in any order. MaybeLaunchArcApps(); LaunchApps(); LaunchBrowsers(); - - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( - FROM_HERE, - base::BindOnce(&DesksTemplatesAppLaunchHandler:: - ClearDeskTemplateReadHandlerRestoreData, - weak_ptr_factory_.GetWeakPtr()), - kClearRestoreDataDuration); } bool DesksTemplatesAppLaunchHandler::ShouldLaunchSystemWebAppOrChromeApp( @@ -266,15 +258,12 @@ return; if (auto* launch_handler = - arc_task_handler->desks_templates_arc_app_launch_handler()) { + arc_task_handler->GetDeskTemplateArcAppLaunchHandler(launch_id_)) { + launch_handler->set_desk_template_launch_id(launch_id_); launch_handler->RestoreArcApps(this); } } -void DesksTemplatesAppLaunchHandler::ClearDeskTemplateReadHandlerRestoreData() { - read_handler_->SetRestoreData(nullptr); -} - void DesksTemplatesAppLaunchHandler::RecordRestoredAppLaunch( apps::AppTypeName app_type_name) { // TODO: Add UMA Histogram.
diff --git a/chrome/browser/ui/ash/desks_templates/desks_templates_app_launch_handler.h b/chrome/browser/ui/ash/desks_templates/desks_templates_app_launch_handler.h index cb435c3..f5f4be52 100644 --- a/chrome/browser/ui/ash/desks_templates/desks_templates_app_launch_handler.h +++ b/chrome/browser/ui/ash/desks_templates/desks_templates_app_launch_handler.h
@@ -18,12 +18,15 @@ namespace app_restore { class DeskTemplateReadHandler; -class RestoreData; } // namespace app_restore -// The DesksTemplatesAppLaunchHandler class is passed in the desk template -// restore data and profile, and will launch apps and web pages based on the -// template. +namespace ash { +class DeskTemplate; +} // namespace ash + +// The DesksTemplatesAppLaunchHandler class is passed a profile, and will launch +// apps and web pages based on the template. Note that a new handler should be +// created for each template launch. class DesksTemplatesAppLaunchHandler : public ash::AppLaunchHandler { public: explicit DesksTemplatesAppLaunchHandler(Profile* profile); @@ -33,8 +36,8 @@ const DesksTemplatesAppLaunchHandler&) = delete; ~DesksTemplatesAppLaunchHandler() override; - void SetRestoreDataAndLaunch( - std::unique_ptr<app_restore::RestoreData> restore_data); + // Launch the given template. + void LaunchTemplate(const ash::DeskTemplate& desk_template); protected: // chromeos::AppLaunchHandler: @@ -65,6 +68,9 @@ // Cached convenience pointer to the desk template read handler. app_restore::DeskTemplateReadHandler* const read_handler_; + // The ID of the specific launch this handler deals with. + int32_t launch_id_ = 0; + base::WeakPtrFactory<DesksTemplatesAppLaunchHandler> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/ui/ash/desks_templates/desks_templates_client.cc b/chrome/browser/ui/ash/desks_templates/desks_templates_client.cc index dc0505c9..5f4a5ec 100644 --- a/chrome/browser/ui/ash/desks_templates/desks_templates_client.cc +++ b/chrome/browser/ui/ash/desks_templates/desks_templates_client.cc
@@ -63,6 +63,9 @@ // Timeout time used in LaunchPerformanceTracker constexpr base::TimeDelta kLaunchPerformanceTimeout = base::Minutes(3); +// Launch data is cleared after this time. +constexpr base::TimeDelta kClearLaunchDataDuration = base::Seconds(20); + // Returns true if `profile` is a supported profile in desk template feature. bool IsSupportedProfile(Profile* profile) { // Public users & guest users are not supported. @@ -289,9 +292,6 @@ return; } - MaybeCreateAppLaunchHandler(); - DCHECK(app_launch_handler_); - if (launch_template_for_test_) { OnGetTemplateForDeskLaunch( std::move(callback), base::Time(), @@ -312,21 +312,44 @@ base::Time time_launch_started, base::TimeDelta delay) { DCHECK(desk_template); - const app_restore::RestoreData* restore_data = - desk_template->desk_restore_data(); + DCHECK_GT(desk_template->launch_id(), 0); + + app_restore::RestoreData* restore_data = + desk_template->mutable_desk_restore_data(); if (!restore_data) return; + if (restore_data->app_id_to_launch_list().empty()) + return; - MaybeCreateAppLaunchHandler(); - DCHECK(app_launch_handler_); + // Make window IDs of the template unique. This is a requirement for launching + // templates concurrently since the contained window IDs are used as lookup + // keys in many places. We must also do this *before* creating the performance + // tracker below. + restore_data->MakeWindowIdsUniqueForDeskTemplate(); template_ids_to_launch_performance_trackers_[desk_template->uuid()] = std::make_unique<LaunchPerformanceTracker>( time_launch_started, GetWindowIDSetFromTemplate(desk_template.get()), desk_template->uuid(), this); - app_launch_handler_->set_delay(delay); - app_launch_handler_->SetRestoreDataAndLaunch(restore_data->Clone()); + DCHECK(active_profile_); + const int32_t launch_id = desk_template->launch_id(); + + auto& handler = app_launch_handlers_[launch_id]; + // Some tests reach into this class and install a handler ahead of time. In + // all other cases, we create a handler for the launch here. + if (!handler) + handler = std::make_unique<DesksTemplatesAppLaunchHandler>(active_profile_); + + handler->set_delay(delay); + handler->LaunchTemplate(*desk_template); + + // Install a timer that will clear the launch handler after a given duration. + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, + base::BindOnce(&DesksTemplatesClient::OnLaunchComplete, + weak_ptr_factory_.GetWeakPtr(), launch_id), + kClearLaunchDataDuration); } desks_storage::DeskModel* DesksTemplatesClient::GetDeskModel() { @@ -379,17 +402,6 @@ id_to_tracker.second->OnMovedSingleInstanceApp(window_id); } -void DesksTemplatesClient::MaybeCreateAppLaunchHandler() { - if (app_launch_handler_ && - app_launch_handler_->profile() == active_profile_) { - return; - } - - DCHECK(active_profile_); - app_launch_handler_ = - std::make_unique<DesksTemplatesAppLaunchHandler>(active_profile_); -} - void DesksTemplatesClient::RecordWindowAndTabCountHistogram( ash::DeskTemplate* desk_template) { const app_restore::RestoreData* restore_data = @@ -566,6 +578,10 @@ : "")); } +void DesksTemplatesClient::OnLaunchComplete(int32_t launch_id) { + app_launch_handlers_.erase(launch_id); +} + void DesksTemplatesClient::RemoveLaunchPerformanceTracker( base::GUID tracker_uuid) { template_ids_to_launch_performance_trackers_.erase(tracker_uuid);
diff --git a/chrome/browser/ui/ash/desks_templates/desks_templates_client.h b/chrome/browser/ui/ash/desks_templates/desks_templates_client.h index 27f4414..93cce67 100644 --- a/chrome/browser/ui/ash/desks_templates/desks_templates_client.h +++ b/chrome/browser/ui/ash/desks_templates/desks_templates_client.h
@@ -138,9 +138,6 @@ friend class DesksTemplatesClientTest; friend class ScopedDesksTemplatesAppLaunchHandlerSetter; - // Attempts to create `app_launch_handler_` if it doesn't already exist. - void MaybeCreateAppLaunchHandler(); - void RecordWindowAndTabCountHistogram(ash::DeskTemplate* desk_template); void RecordLaunchFromTemplateHistogram(); void RecordTemplateCountHistogram(); @@ -204,6 +201,9 @@ desks_storage::DeskModel::GetTemplateJsonStatus status, const std::string& json_representation); + // Callback function that clears the data associated with a specific launch. + void OnLaunchComplete(int32_t launch_id); + // Called by a launch performance tracker when it has completed monitoring the // launch of a template. void RemoveLaunchPerformanceTracker(base::GUID tracker_uuid); @@ -214,8 +214,9 @@ Profile* active_profile_ = nullptr; - // The object that handles launching apps. - std::unique_ptr<DesksTemplatesAppLaunchHandler> app_launch_handler_; + // Maps launch id to a launch handler. + std::map<int32_t, std::unique_ptr<DesksTemplatesAppLaunchHandler>> + app_launch_handlers_; // A test only template for testing `LaunchDeskTemplate`. std::unique_ptr<ash::DeskTemplate> launch_template_for_test_;
diff --git a/chrome/browser/ui/ash/desks_templates/desks_templates_client_browsertest.cc b/chrome/browser/ui/ash/desks_templates/desks_templates_client_browsertest.cc index 3a6efb96..cc291db 100644 --- a/chrome/browser/ui/ash/desks_templates/desks_templates_client_browsertest.cc +++ b/chrome/browser/ui/ash/desks_templates/desks_templates_client_browsertest.cc
@@ -90,10 +90,13 @@ constexpr int32_t kSettingsWindowId = 100; constexpr int32_t kHelpWindowId = 200; +constexpr int32_t kLaunchedWindowIdBase = 1000000000; constexpr char kExampleUrl1[] = "https://examples1.com"; constexpr char kExampleUrl2[] = "https://examples2.com"; constexpr char kExampleUrl3[] = "https://examples3.com"; +constexpr char kAboutBlankUrl[] = "about:blank"; +constexpr char kNewTabPageUrl[] = "chrome://newtab/"; constexpr char kYoutubeUrl[] = "https://www.youtube.com/"; constexpr char kTestAdminTemplateUuid[] = "1f4ec992-0fa9-415d-a136-4b7c292c39dc"; @@ -124,6 +127,19 @@ return urls; } +// Locate a browser launched from a template whose URLs match `urls`. +Browser* FindLaunchedBrowserByURLs(const std::vector<GURL>& urls) { + for (auto* browser : *BrowserList::GetInstance()) { + aura::Window* window = browser->window()->GetNativeWindow(); + if (window->GetProperty(app_restore::kRestoreWindowIdKey) >= + kLaunchedWindowIdBase && + GetURLsForBrowserWindow(browser) == urls) { + return browser; + } + } + return nullptr; +} + // TODO(crbug.com/1286515): Remove this. Tests should navigate to overview and // click the button using an event generator. std::unique_ptr<ash::DeskTemplate> CaptureActiveDeskAndSaveTemplate() { @@ -314,40 +330,38 @@ // purposes. class ScopedDesksTemplatesAppLaunchHandlerSetter { public: - explicit ScopedDesksTemplatesAppLaunchHandlerSetter( - std::unique_ptr<DesksTemplatesAppLaunchHandler> launch_handler) { - DCHECK_EQ(0, instance_count_); - ++instance_count_; + ScopedDesksTemplatesAppLaunchHandlerSetter( + std::unique_ptr<DesksTemplatesAppLaunchHandler> launch_handler, + int launch_id) + : launch_id_(launch_id) { + DCHECK(!instance_active_); + instance_active_ = true; DesksTemplatesClient* desks_client = DesksTemplatesClient::Get(); DCHECK(desks_client); - old_app_launch_handler_ = std::move(desks_client->app_launch_handler_); - desks_client->app_launch_handler_ = std::move(launch_handler); + desks_client->app_launch_handlers_[launch_id_] = std::move(launch_handler); } ScopedDesksTemplatesAppLaunchHandlerSetter( const ScopedDesksTemplatesAppLaunchHandlerSetter&) = delete; ScopedDesksTemplatesAppLaunchHandlerSetter& operator=( const ScopedDesksTemplatesAppLaunchHandlerSetter&) = delete; ~ScopedDesksTemplatesAppLaunchHandlerSetter() { - DCHECK_EQ(1, instance_count_); - --instance_count_; + DCHECK(instance_active_); + instance_active_ = false; DesksTemplatesClient* desks_client = DesksTemplatesClient::Get(); DCHECK(desks_client); - desks_client->app_launch_handler_ = std::move(old_app_launch_handler_); + desks_client->app_launch_handlers_[launch_id_] = nullptr; } private: // Variable to ensure we never have more than one instance of this object. - static int instance_count_; + inline static bool instance_active_ = false; - // The old app launch handler prior to the object being created. May be - // nullptr. - std::unique_ptr<DesksTemplatesAppLaunchHandler> old_app_launch_handler_; + // The id of the launch used for testing. + int launch_id_; }; -int ScopedDesksTemplatesAppLaunchHandlerSetter::instance_count_ = 0; - class DesksTemplatesClientTest : public extensions::PlatformAppBrowserTest { public: DesksTemplatesClientTest() { @@ -363,6 +377,8 @@ // extension. Avoid further uses of this method and create or launch templates // by mocking clicks on the system UI. void SetTemplate(std::unique_ptr<ash::DeskTemplate> launch_template) { + if (launch_template->launch_id() == 0) + launch_template->set_launch_id(1); DesksTemplatesClient::Get()->launch_template_for_test_ = std::move(launch_template); } @@ -738,6 +754,7 @@ std::unique_ptr<ash::DeskTemplate> desk_template = CaptureActiveDeskAndSaveTemplate(); ASSERT_TRUE(desk_template); + desk_template->set_launch_id(1); // Close the chrome app window. We'll need to verify if it reopens later. views::Widget* app_widget = @@ -757,7 +774,7 @@ MockDesksTemplatesAppLaunchHandler* mock_app_launch_handler_ptr = mock_app_launch_handler.get(); ScopedDesksTemplatesAppLaunchHandlerSetter scoped_launch_handler( - std::move(mock_app_launch_handler)); + std::move(mock_app_launch_handler), desk_template->launch_id()); EXPECT_CALL(*mock_app_launch_handler_ptr, LaunchSystemWebAppOrChromeApp(_, extension_id, _)); @@ -783,9 +800,6 @@ EXPECT_EQ(static_cast<int>(browser_active_index), browser->tab_strip_model()->active_index()); - aura::Window* window = browser->window()->GetNativeWindow(); - const int32_t browser_window_id = - window->GetProperty(app_restore::kWindowIdKey); // Get current tabs from browser. const std::vector<GURL> urls = GetURLsForBrowserWindow(browser); @@ -803,9 +817,8 @@ content::RunAllTasksUntilIdle(); // Verify that the browser was launched with the correct urls and active tab. - Browser* new_browser = FindBrowser(browser_window_id); + Browser* new_browser = FindLaunchedBrowserByURLs(urls); ASSERT_TRUE(new_browser); - EXPECT_EQ(urls, GetURLsForBrowserWindow(new_browser)); EXPECT_EQ(static_cast<int>(browser_active_index), new_browser->tab_strip_model()->active_index()); @@ -839,9 +852,6 @@ chrome::AddTabAt(browser(), GURL(kExampleUrl2), /*index=*/-1, /*foreground=*/true); EXPECT_EQ(expected_tab_count, browser()->tab_strip_model()->count()); - const int32_t browser_window_id = - browser()->window()->GetNativeWindow()->GetProperty( - app_restore::kWindowIdKey); std::unique_ptr<ash::DeskTemplate> desk_template = CaptureActiveDeskAndSaveTemplate(); @@ -856,10 +866,9 @@ // Verify that the browser was launched with the correct number of tabs, and // that browser session restore did not restore any windows/tabs. - Browser* new_browser = FindBrowser(browser_window_id); + Browser* new_browser = + FindLaunchedBrowserByURLs({GURL(kAboutBlankUrl), GURL(kNewTabPageUrl)}); ASSERT_TRUE(new_browser); - EXPECT_EQ(1u * expected_tab_count, - GetURLsForBrowserWindow(new_browser).size()); EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); } @@ -912,13 +921,12 @@ CaptureActiveDeskAndSaveTemplate(); ASSERT_TRUE(desk_template); - // Set the template we created as the template we want to launch. - ash::DeskTemplate* desk_template_ptr = desk_template.get(); - SetTemplate(std::move(desk_template)); - - int launches = 5; - for (int i = 0; i < launches; i++) - LaunchTemplate(desk_template_ptr->uuid()); + const int launches = 5; + for (int i = 0; i < launches; i++) { + auto launch_template = desk_template->Clone(); + launch_template->set_launch_id(i + 1); + SetAndLaunchTemplate(std::move(launch_template)); + } constexpr char kLaunchFromTemplateHistogramName[] = "Ash.DeskTemplate.LaunchFromTemplate"; @@ -953,13 +961,15 @@ ASSERT_TRUE(DesksTemplatesClient::Get()); // Create a new browser and set its bounds. - Browser* browser_1 = CreateBrowser({GURL(kExampleUrl1), GURL(kExampleUrl2)}); + std::vector<GURL> browser_urls_1 = {GURL(kExampleUrl1), GURL(kExampleUrl2)}; + Browser* browser_1 = CreateBrowser(browser_urls_1); const gfx::Rect browser_bounds_1 = gfx::Rect(100, 100, 600, 200); aura::Window* window_1 = browser_1->window()->GetNativeWindow(); window_1->SetBounds(browser_bounds_1); // Create a new minimized browser. - Browser* browser_2 = CreateBrowser({GURL(kExampleUrl1)}); + std::vector<GURL> browser_urls_2 = {GURL(kExampleUrl1)}; + Browser* browser_2 = CreateBrowser(browser_urls_2); const gfx::Rect browser_bounds_2 = gfx::Rect(150, 150, 500, 300); aura::Window* window_2 = browser_2->window()->GetNativeWindow(); window_2->SetBounds(browser_bounds_2); @@ -967,7 +977,8 @@ browser_2->window()->Minimize(); // Create a new maximized browser. - Browser* browser_3 = CreateBrowser({GURL(kExampleUrl1)}); + std::vector<GURL> browser_urls_3 = {GURL(kExampleUrl2)}; + Browser* browser_3 = CreateBrowser(browser_urls_3); browser_3->window()->Maximize(); EXPECT_EQ(browser_bounds_1, window_1->bounds()); @@ -975,14 +986,6 @@ ASSERT_TRUE(browser_2->window()->IsMinimized()); ASSERT_TRUE(browser_3->window()->IsMaximized()); - const int32_t browser_window_id_1 = - window_1->GetProperty(app_restore::kWindowIdKey); - const int32_t browser_window_id_2 = - window_2->GetProperty(app_restore::kWindowIdKey); - const int32_t browser_window_id_3 = - browser_3->window()->GetNativeWindow()->GetProperty( - app_restore::kWindowIdKey); - // Capture the active desk, which contains the two browser windows. std::unique_ptr<ash::DeskTemplate> desk_template = CaptureActiveDeskAndSaveTemplate(); @@ -991,20 +994,20 @@ SetAndLaunchTemplate(std::move(desk_template)); // Verify that the browser was launched with the correct bounds. - Browser* new_browser_1 = FindBrowser(browser_window_id_1); + Browser* new_browser_1 = FindLaunchedBrowserByURLs(browser_urls_1); ASSERT_TRUE(new_browser_1); EXPECT_EQ(browser_bounds_1, new_browser_1->window()->GetNativeWindow()->bounds()); // Verify that the browser was launched and minimized. - Browser* new_browser_2 = FindBrowser(browser_window_id_2); + Browser* new_browser_2 = FindLaunchedBrowserByURLs(browser_urls_2); ASSERT_TRUE(new_browser_2); ASSERT_TRUE(new_browser_2->window()->IsMinimized()); EXPECT_EQ(browser_bounds_2, new_browser_2->window()->GetNativeWindow()->bounds()); // Verify that the browser was launched and maximized. - Browser* new_browser_3 = FindBrowser(browser_window_id_3); + Browser* new_browser_3 = FindLaunchedBrowserByURLs(browser_urls_3); ASSERT_TRUE(new_browser_3); ASSERT_TRUE(new_browser_3->window()->IsMaximized()); } @@ -1051,7 +1054,7 @@ SetAndLaunchTemplate(std::move(desk_template)); // Verify that the PWA was launched correctly. - Browser* new_pwa_browser = FindBrowser(pwa_window_id); + Browser* new_pwa_browser = FindLaunchedBrowserByURLs({GURL(kExampleUrl1)}); ASSERT_TRUE(new_pwa_browser); ASSERT_TRUE(new_pwa_browser->is_type_app()); aura::Window* new_browser_window = @@ -1186,9 +1189,6 @@ EXPECT_EQ(static_cast<int>(browser_active_index), browser->tab_strip_model()->active_index()); - aura::Window* window = browser->window()->GetNativeWindow(); - const int32_t browser_window_id = - window->GetProperty(app_restore::kWindowIdKey); // Get current tabs from browser. const std::vector<GURL> urls = GetURLsForBrowserWindow(browser); @@ -1212,9 +1212,8 @@ EXPECT_EQ(4u, BrowserList::GetInstance()->size()); // Test that the created browser has the same tabs and the same active tab. - Browser* new_browser = FindBrowser(browser_window_id); + Browser* new_browser = FindLaunchedBrowserByURLs(urls); ASSERT_TRUE(new_browser); - EXPECT_EQ(urls, GetURLsForBrowserWindow(new_browser)); EXPECT_EQ(static_cast<int>(browser_active_index), new_browser->tab_strip_model()->active_index()); @@ -1454,13 +1453,15 @@ IN_PROC_BROWSER_TEST_F(DesksTemplatesClientTest, SystemUIBrowserWindowRestorationTest) { // Create a new browser and set its bounds. - Browser* browser_1 = CreateBrowser({GURL(kExampleUrl1), GURL(kExampleUrl2)}); + std::vector<GURL> browser_urls_1 = {GURL(kExampleUrl1), GURL(kExampleUrl2)}; + Browser* browser_1 = CreateBrowser(browser_urls_1); const gfx::Rect browser_bounds_1 = gfx::Rect(100, 100, 600, 200); aura::Window* window_1 = browser_1->window()->GetNativeWindow(); window_1->SetBounds(browser_bounds_1); // Create a new minimized browser. - Browser* browser_2 = CreateBrowser({GURL(kExampleUrl1)}); + std::vector<GURL> browser_urls_2 = {GURL(kExampleUrl1)}; + Browser* browser_2 = CreateBrowser(browser_urls_2); const gfx::Rect browser_bounds_2 = gfx::Rect(150, 150, 500, 300); aura::Window* window_2 = browser_2->window()->GetNativeWindow(); window_2->SetBounds(browser_bounds_2); @@ -1468,7 +1469,8 @@ browser_2->window()->Minimize(); // Create a new maximized browser. - Browser* browser_3 = CreateBrowser({GURL(kExampleUrl1)}); + std::vector<GURL> browser_urls_3 = {GURL(kExampleUrl2)}; + Browser* browser_3 = CreateBrowser(browser_urls_3); browser_3->window()->Maximize(); EXPECT_EQ(browser_bounds_1, window_1->bounds()); @@ -1476,14 +1478,6 @@ ASSERT_TRUE(browser_2->window()->IsMinimized()); ASSERT_TRUE(browser_3->window()->IsMaximized()); - const int32_t browser_window_id_1 = - window_1->GetProperty(app_restore::kWindowIdKey); - const int32_t browser_window_id_2 = - window_2->GetProperty(app_restore::kWindowIdKey); - const int32_t browser_window_id_3 = - browser_3->window()->GetNativeWindow()->GetProperty( - app_restore::kWindowIdKey); - // Capture the active desk, which contains the three browser windows. ash::ToggleOverview(); ash::WaitForOverviewEnterAnimation(); @@ -1495,20 +1489,20 @@ content::RunAllTasksUntilIdle(); // Verify that the browser was launched with the correct bounds. - Browser* new_browser_1 = FindBrowser(browser_window_id_1); + Browser* new_browser_1 = FindLaunchedBrowserByURLs(browser_urls_1); ASSERT_TRUE(new_browser_1); EXPECT_EQ(browser_bounds_1, new_browser_1->window()->GetNativeWindow()->bounds()); // Verify that the browser was launched and minimized. - Browser* new_browser_2 = FindBrowser(browser_window_id_2); + Browser* new_browser_2 = FindLaunchedBrowserByURLs(browser_urls_2); ASSERT_TRUE(new_browser_2); ASSERT_TRUE(new_browser_2->window()->IsMinimized()); EXPECT_EQ(browser_bounds_2, new_browser_2->window()->GetNativeWindow()->bounds()); // Verify that the browser was launched and maximized. - Browser* new_browser_3 = FindBrowser(browser_window_id_3); + Browser* new_browser_3 = FindLaunchedBrowserByURLs(browser_urls_3); ASSERT_TRUE(new_browser_3); ASSERT_TRUE(new_browser_3->window()->IsMaximized()); } @@ -1559,7 +1553,7 @@ ClickFirstTemplateItem(); // Verify that the PWA was launched correctly. - Browser* new_pwa_browser = FindBrowser(pwa_window_id); + Browser* new_pwa_browser = FindLaunchedBrowserByURLs({GURL(kExampleUrl1)}); ASSERT_TRUE(new_pwa_browser); ASSERT_TRUE(new_pwa_browser->is_type_app()); aura::Window* new_browser_window = @@ -1743,7 +1737,7 @@ MockDesksTemplatesAppLaunchHandler* mock_app_launch_handler_ptr = mock_app_launch_handler.get(); ScopedDesksTemplatesAppLaunchHandlerSetter scoped_launch_handler( - std::move(mock_app_launch_handler)); + std::move(mock_app_launch_handler), /*launch_id=*/1); EXPECT_CALL(*mock_app_launch_handler_ptr, LaunchSystemWebAppOrChromeApp(_, extension_id, _)); @@ -1861,9 +1855,6 @@ chrome::AddTabAt(browser(), GURL(kExampleUrl2), /*index=*/-1, /*foreground=*/true); EXPECT_EQ(expected_tab_count, browser()->tab_strip_model()->count()); - const int32_t browser_window_id = - browser()->window()->GetNativeWindow()->GetProperty( - app_restore::kWindowIdKey); // Enter overview and save the current desk as a template. ash::ToggleOverview(); @@ -1887,9 +1878,9 @@ // Verify that the browser was launched with the correct number of tabs, and // that browser session restore did not restore any windows/tabs. - Browser* new_browser = FindBrowser(browser_window_id); + Browser* new_browser = + FindLaunchedBrowserByURLs({GURL(kAboutBlankUrl), GURL(kExampleUrl2)}); ASSERT_TRUE(new_browser); - EXPECT_EQ(expected_tab_count, GetURLsForBrowserWindow(new_browser).size()); EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); }
diff --git a/chrome/browser/ui/chrome_pages.cc b/chrome/browser/ui/chrome_pages.cc index d7a0fe7..caaa6b8 100644 --- a/chrome/browser/ui/chrome_pages.cc +++ b/chrome/browser/ui/chrome_pages.cc
@@ -485,8 +485,6 @@ } void ShowDiagnosticsApp(Profile* profile) { - DCHECK(base::FeatureList::IsEnabled(chromeos::features::kDiagnosticsApp)); - LaunchSystemWebAppAsync(profile, web_app::SystemAppType::DIAGNOSTICS); }
diff --git a/chrome/browser/ui/color/chrome_color_mixers.cc b/chrome/browser/ui/color/chrome_color_mixers.cc index 8560f1c5..89441cf 100644 --- a/chrome/browser/ui/color/chrome_color_mixers.cc +++ b/chrome/browser/ui/color/chrome_color_mixers.cc
@@ -59,5 +59,9 @@ key.custom_theme->AddColorMixers(provider, key); } + if (key.app_controller) { + key.app_controller->AddColorMixers(provider, key); + } + AddNativeChromeColorMixer(provider, key); }
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc index e66d40d..5a36120 100644 --- a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc +++ b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
@@ -1598,7 +1598,8 @@ base::RecordAction( base::UserMetricsAction("Notifications.Quiet.StaticIconClicked")); break; - case QuietUiReason::kPredictedVeryUnlikelyGrant: + case QuietUiReason::kServicePredictedVeryUnlikelyGrant: + case QuietUiReason::kOnDevicePredictedVeryUnlikelyGrant: int bubble_message_string_id = 0; int bubble_done_button_string_id = 0; switch (request_type) { @@ -1703,7 +1704,8 @@ switch (*quiet_ui_reason) { case QuietUiReason::kEnabledInPrefs: case QuietUiReason::kTriggeredByCrowdDeny: - case QuietUiReason::kPredictedVeryUnlikelyGrant: + case QuietUiReason::kServicePredictedVeryUnlikelyGrant: + case QuietUiReason::kOnDevicePredictedVeryUnlikelyGrant: manager->Accept(); base::RecordAction(base::UserMetricsAction( request_type == permissions::RequestType::kNotifications @@ -1729,7 +1731,8 @@ switch (*quiet_ui_reason) { case QuietUiReason::kEnabledInPrefs: case QuietUiReason::kTriggeredByCrowdDeny: - case QuietUiReason::kPredictedVeryUnlikelyGrant: + case QuietUiReason::kServicePredictedVeryUnlikelyGrant: + case QuietUiReason::kOnDevicePredictedVeryUnlikelyGrant: // No-op. break; case QuietUiReason::kTriggeredDueToAbusiveRequests:
diff --git a/chrome/browser/ui/hats/hats_service.cc b/chrome/browser/ui/hats/hats_service.cc index 94d4b3b..571597f 100644 --- a/chrome/browser/ui/hats/hats_service.cc +++ b/chrome/browser/ui/hats/hats_service.cc
@@ -38,6 +38,8 @@ constexpr char kHatsSurveyTriggerAutofillCard[] = "autofill-card"; constexpr char kHatsSurveyTriggerAutofillPassword[] = "autofill-password"; constexpr char kHatsSurveyTriggerNtpModules[] = "ntp-modules"; +constexpr char kHatsSurveyTriggerNtpPhotosModuleOptOut[] = + "ntp-photos-module-opt-out"; constexpr char kHatsSurveyTriggerPrivacyGuide[] = "privacy-guide"; constexpr char kHatsSurveyTriggerPrivacySandbox[] = "privacy-sandbox"; constexpr char kHatsSurveyTriggerSettings[] = "settings"; @@ -157,6 +159,10 @@ survey_configs.emplace_back( &features::kHappinessTrackingSurveysForDesktopNtpModules, kHatsSurveyTriggerNtpModules); + // NTP Photos module opt-out survey. + survey_configs.emplace_back( + &features::kHappinessTrackingSurveysForNtpPhotosOptOut, + kHatsSurveyTriggerNtpPhotosModuleOptOut); // Trust & Safety Sentiment surveys. survey_configs.emplace_back(
diff --git a/chrome/browser/ui/hats/hats_service.h b/chrome/browser/ui/hats/hats_service.h index 8af4f9c..27a79df 100644 --- a/chrome/browser/ui/hats/hats_service.h +++ b/chrome/browser/ui/hats/hats_service.h
@@ -46,6 +46,7 @@ extern const char kHatsSurveyTriggerDevToolsIssuesHeavyAd[]; extern const char kHatsSurveyTriggerDevToolsIssuesCSP[]; extern const char kHatsSurveyTriggerNtpModules[]; +extern const char kHatsSurveyTriggerNtpPhotosModuleOptOut[]; extern const char kHatsSurveyTriggerPrivacyGuide[]; extern const char kHatsSurveyTriggerPrivacySandbox[]; extern const char kHatsSurveyTriggerSettings[];
diff --git a/chrome/browser/ui/sad_tab.cc b/chrome/browser/ui/sad_tab.cc index 070761c5..8d07906 100644 --- a/chrome/browser/ui/sad_tab.cc +++ b/chrome/browser/ui/sad_tab.cc
@@ -31,19 +31,6 @@ namespace { -// These stats should use the same counting approach and bucket size as tab -// discard events in memory::OomPriorityManager so they can be directly -// compared. - -// This macro uses a static counter to track how many times it's hit in a -// session. See Tabs.SadTab.CrashCreated in histograms.xml for details. -#define UMA_SAD_TAB_COUNTER(histogram_name) \ - { \ - static int count = 0; \ - ++count; \ - UMA_HISTOGRAM_COUNTS_1000(histogram_name, count); \ - } - void RecordEvent(bool feedback, ui_metrics::SadTabEvent event) { if (feedback) { UMA_HISTOGRAM_ENUMERATION(ui_metrics::kSadTabFeedbackHistogramKey, event, @@ -210,23 +197,6 @@ DCHECK(!recorded_paint_); recorded_paint_ = true; - switch (kind_) { - case SAD_TAB_KIND_CRASHED: - UMA_SAD_TAB_COUNTER("Tabs.SadTab.CrashDisplayed"); - break; - case SAD_TAB_KIND_OOM: - UMA_SAD_TAB_COUNTER("Tabs.SadTab.OomDisplayed"); - break; -#if BUILDFLAG(IS_CHROMEOS) - case SAD_TAB_KIND_KILLED_BY_OOM: - UMA_SAD_TAB_COUNTER("Tabs.SadTab.KillDisplayed.OOM"); - [[fallthrough]]; -#endif - case SAD_TAB_KIND_KILLED: - UMA_SAD_TAB_COUNTER("Tabs.SadTab.KillDisplayed"); - break; - } - RecordEvent(show_feedback_button_, ui_metrics::SadTabEvent::DISPLAYED); } @@ -274,24 +244,18 @@ switch (kind) { case SAD_TAB_KIND_CRASHED: - UMA_SAD_TAB_COUNTER("Tabs.SadTab.CrashCreated"); - break; case SAD_TAB_KIND_OOM: - UMA_SAD_TAB_COUNTER("Tabs.SadTab.OomCreated"); break; #if BUILDFLAG(IS_CHROMEOS) - case SAD_TAB_KIND_KILLED_BY_OOM: - UMA_SAD_TAB_COUNTER("Tabs.SadTab.KillCreated.OOM"); - { - const std::string spec = - web_contents->GetURL().DeprecatedGetOriginAsURL().spec(); - memory::OomMemoryDetails::Log("Tab OOM-Killed Memory details: " + spec + - ", "); - } + case SAD_TAB_KIND_KILLED_BY_OOM: { + const std::string spec = + web_contents->GetURL().DeprecatedGetOriginAsURL().spec(); + memory::OomMemoryDetails::Log("Tab OOM-Killed Memory details: " + spec + + ", "); [[fallthrough]]; + } #endif case SAD_TAB_KIND_KILLED: - UMA_SAD_TAB_COUNTER("Tabs.SadTab.KillCreated"); LOG(WARNING) << "Tab Killed: " << web_contents->GetURL().DeprecatedGetOriginAsURL().spec(); break;
diff --git a/chrome/browser/ui/views/frame/browser_frame.cc b/chrome/browser/ui/views/frame/browser_frame.cc index 6b644bf..42ce84a 100644 --- a/chrome/browser/ui/views/frame/browser_frame.cc +++ b/chrome/browser/ui/views/frame/browser_frame.cc
@@ -244,8 +244,8 @@ return &ThemeService::GetThemeProviderForProfile(browser->profile()); } -ui::ColorProviderManager::InitializerSupplier* BrowserFrame::GetCustomTheme() - const { +ui::ColorProviderManager::ThemeInitializerSupplier* +BrowserFrame::GetCustomTheme() const { Browser* browser = browser_view_->browser(); // If this is an incognito profile, there should never be a custom theme. if (browser->profile()->IsIncognitoProfile()) @@ -350,6 +350,14 @@ tab_drag_kind_ = tab_drag_kind; } +ui::ColorProviderManager::Key BrowserFrame::GetColorProviderKey() const { + auto key = Widget::GetColorProviderKey(); + auto* app_controller = browser_view_->browser()->app_controller(); + key.app_controller = + app_controller ? app_controller->get_weak_ref() : nullptr; + return key; +} + void BrowserFrame::OnMenuClosed() { menu_runner_.reset(); }
diff --git a/chrome/browser/ui/views/frame/browser_frame.h b/chrome/browser/ui/views/frame/browser_frame.h index 67496d7..d42661a6 100644 --- a/chrome/browser/ui/views/frame/browser_frame.h +++ b/chrome/browser/ui/views/frame/browser_frame.h
@@ -126,7 +126,7 @@ bool GetAccelerator(int command_id, ui::Accelerator* accelerator) const override; const ui::ThemeProvider* GetThemeProvider() const override; - ui::ColorProviderManager::InitializerSupplier* GetCustomTheme() + ui::ColorProviderManager::ThemeInitializerSupplier* GetCustomTheme() const override; void OnNativeWidgetWorkspaceChanged() override; @@ -151,6 +151,10 @@ void SetTabDragKind(TabDragKind tab_drag_kind); TabDragKind tab_drag_kind() const { return tab_drag_kind_; } + protected: + // views::Widget: + ui::ColorProviderManager::Key GetColorProviderKey() const override; + private: void OnTouchUiChanged();
diff --git a/chrome/browser/ui/views/location_bar/content_setting_bubble_dialog_browsertest.cc b/chrome/browser/ui/views/location_bar/content_setting_bubble_dialog_browsertest.cc index b1d7b0f..ba88d0b1 100644 --- a/chrome/browser/ui/views/location_bar/content_setting_bubble_dialog_browsertest.cc +++ b/chrome/browser/ui/views/location_bar/content_setting_bubble_dialog_browsertest.cc
@@ -223,7 +223,7 @@ else if (name == "notifications_quiet_abusive_content") reason = QuietUiReason::kTriggeredDueToAbusiveContent; else if (name == "notifications_quiet_predicted_very_unlikely") - reason = QuietUiReason::kPredictedVeryUnlikelyGrant; + reason = QuietUiReason::kServicePredictedVeryUnlikelyGrant; TriggerQuietNotificationPermissionRequest(reason); ShowDialogBubble(ImageType::NOTIFICATIONS_QUIET_PROMPT); return;
diff --git a/chrome/browser/ui/views/media_router/presentation_receiver_window_frame.cc b/chrome/browser/ui/views/media_router/presentation_receiver_window_frame.cc index 0fa6858..8a304c50 100644 --- a/chrome/browser/ui/views/media_router/presentation_receiver_window_frame.cc +++ b/chrome/browser/ui/views/media_router/presentation_receiver_window_frame.cc
@@ -28,7 +28,7 @@ return &ThemeService::GetThemeProviderForProfile(profile_); } -ui::ColorProviderManager::InitializerSupplier* +ui::ColorProviderManager::ThemeInitializerSupplier* PresentationReceiverWindowFrame::GetCustomTheme() const { return ThemeService::GetThemeSupplierForProfile(profile_); }
diff --git a/chrome/browser/ui/views/media_router/presentation_receiver_window_frame.h b/chrome/browser/ui/views/media_router/presentation_receiver_window_frame.h index e3f8b3f..8e032d3 100644 --- a/chrome/browser/ui/views/media_router/presentation_receiver_window_frame.h +++ b/chrome/browser/ui/views/media_router/presentation_receiver_window_frame.h
@@ -43,7 +43,8 @@ private: const ui::ThemeProvider* GetThemeProvider() const final; - ui::ColorProviderManager::InitializerSupplier* GetCustomTheme() const final; + ui::ColorProviderManager::ThemeInitializerSupplier* GetCustomTheme() + const final; // The profile from which we get the theme. const raw_ptr<Profile> profile_;
diff --git a/chrome/browser/ui/views/permission_bubble/permission_chip_interactive_test.cc b/chrome/browser/ui/views/permission_bubble/permission_chip_interactive_test.cc index 180f8ed..d433a42 100644 --- a/chrome/browser/ui/views/permission_bubble/permission_chip_interactive_test.cc +++ b/chrome/browser/ui/views/permission_bubble/permission_chip_interactive_test.cc
@@ -450,8 +450,9 @@ QuietChipNonAbusiveUmaTest) { base::HistogramTester histograms; - for (QuietUiReason reason : {QuietUiReason::kEnabledInPrefs, - QuietUiReason::kPredictedVeryUnlikelyGrant}) { + for (QuietUiReason reason : + {QuietUiReason::kEnabledInPrefs, + QuietUiReason::kServicePredictedVeryUnlikelyGrant}) { SetCannedUiDecision(reason, absl::nullopt); RequestPermission(permissions::RequestType::kNotifications); @@ -482,8 +483,9 @@ QuietChipNonAbusiveClickManageUmaTest) { base::HistogramTester histograms; - for (QuietUiReason reason : {QuietUiReason::kEnabledInPrefs, - QuietUiReason::kPredictedVeryUnlikelyGrant}) { + for (QuietUiReason reason : + {QuietUiReason::kEnabledInPrefs, + QuietUiReason::kServicePredictedVeryUnlikelyGrant}) { SetCannedUiDecision(reason, absl::nullopt); RequestPermission(permissions::RequestType::kNotifications); @@ -995,8 +997,9 @@ IN_PROC_BROWSER_TEST_F(QuietChipPermissionPromptBubbleViewInteractiveTest, AnimatedQuietChipIsShownForNonAbusiveRequests) { - for (QuietUiReason reason : {QuietUiReason::kEnabledInPrefs, - QuietUiReason::kPredictedVeryUnlikelyGrant}) { + for (QuietUiReason reason : + {QuietUiReason::kEnabledInPrefs, + QuietUiReason::kServicePredictedVeryUnlikelyGrant}) { SetCannedUiDecision(reason, absl::nullopt); ContentSettingImageView& quiet_ui_icon = GetContentSettingImageView( @@ -1090,7 +1093,7 @@ IN_PROC_BROWSER_TEST_F(QuietChipPermissionPromptBubbleViewInteractiveTest, DispositionPredictedVeryUnlikelyGrantTest) { - SetCannedUiDecision(QuietUiReason::kPredictedVeryUnlikelyGrant, + SetCannedUiDecision(QuietUiReason::kServicePredictedVeryUnlikelyGrant, absl::nullopt); RequestPermission(permissions::RequestType::kGeolocation);
diff --git a/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view_browsertest.cc b/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view_browsertest.cc index 804d7ab..64fda4d4 100644 --- a/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view_browsertest.cc
@@ -776,11 +776,11 @@ static_cast<int>(permissions::PermissionAction::GRANTED), 1); } -// For `QuietUiReason::kPredictedVeryUnlikelyGrant` reputation we show an +// For `QuietUiReason::kServicePredictedVeryUnlikelyGrant` reputation we show an // animated quiet UI icon. IN_PROC_BROWSER_TEST_P(PermissionPromptBubbleViewQuietUiBrowserTest, DispositionPredictedVeryUnlikelyGrantTest) { - SetCannedUiDecision(QuietUiReason::kPredictedVeryUnlikelyGrant, + SetCannedUiDecision(QuietUiReason::kServicePredictedVeryUnlikelyGrant, absl::nullopt); ShowUi("geolocation");
diff --git a/chrome/browser/ui/views/profiles/profile_creation_signed_in_flow_controller.cc b/chrome/browser/ui/views/profiles/profile_creation_signed_in_flow_controller.cc index 3704ffe..b197523 100644 --- a/chrome/browser/ui/views/profiles/profile_creation_signed_in_flow_controller.cc +++ b/chrome/browser/ui/views/profiles/profile_creation_signed_in_flow_controller.cc
@@ -70,7 +70,7 @@ browser->tab_strip_model()->ReplaceWebContentsAt(0, std::move(saml_wc)); ProfileMetrics::LogProfileAddSignInFlowOutcome( - ProfileMetrics::ProfileAddSignInFlowOutcome::kSAML); + ProfileMetrics::ProfileSignedInFlowOutcome::kSAML); } } // namespace @@ -100,7 +100,7 @@ // TODO(crbug.com/1300109): Consider moving this recording into // ProfilePickerTurnSyncOnDelegate and unify this code with Cancel(). ProfileMetrics::LogProfileAddSignInFlowOutcome( - ProfileMetrics::ProfileAddSignInFlowOutcome::kAbortedAfterSignIn); + ProfileMetrics::ProfileSignedInFlowOutcome::kAbortedAfterSignIn); } }
diff --git a/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider.cc b/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider.cc index 59e7ae3..a92fd37e 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider.cc
@@ -72,7 +72,7 @@ } ProfileMetrics::LogProfileAddSignInFlowOutcome( - ProfileMetrics::ProfileAddSignInFlowOutcome::kAbortedBeforeSignIn); + ProfileMetrics::ProfileSignedInFlowOutcome::kAbortedBeforeSignIn); } } @@ -128,7 +128,7 @@ toolbar_->SetVisible(false); } -ui::ColorProviderManager::InitializerSupplier* +ui::ColorProviderManager::ThemeInitializerSupplier* ProfilePickerDiceSignInProvider::GetCustomTheme() const { if (!IsInitialized()) return nullptr;
diff --git a/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider.h b/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider.h index d5e7448..53cbc25 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider.h +++ b/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider.h
@@ -68,7 +68,7 @@ // Navigates back in the sign-in flow if applicable. void NavigateBack(); - ui::ColorProviderManager::InitializerSupplier* GetCustomTheme() const; + ui::ColorProviderManager::ThemeInitializerSupplier* GetCustomTheme() const; // Returns nullptr if profile_ has not been created yet. Profile* GetInitializedProfile();
diff --git a/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.cc b/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.cc index 9dc47745..f9a4134 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.cc
@@ -5,6 +5,8 @@ #include "chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.h" #include "base/logging.h" +#include "build/chromeos_buildflags.h" +#include "chrome/browser/profiles/profile.h" #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" @@ -17,28 +19,28 @@ namespace { -absl::optional<ProfileMetrics::ProfileAddSignInFlowOutcome> GetSyncOutcome( +absl::optional<ProfileMetrics::ProfileSignedInFlowOutcome> GetSyncOutcome( bool enterprise_account, bool sync_disabled, LoginUIService::SyncConfirmationUIClosedResult result) { // The decision of the user is not relevant for the metric. if (sync_disabled) - return ProfileMetrics::ProfileAddSignInFlowOutcome::kEnterpriseSyncDisabled; + return ProfileMetrics::ProfileSignedInFlowOutcome::kEnterpriseSyncDisabled; switch (result) { case LoginUIService::SYNC_WITH_DEFAULT_SETTINGS: return enterprise_account - ? ProfileMetrics::ProfileAddSignInFlowOutcome::kEnterpriseSync - : ProfileMetrics::ProfileAddSignInFlowOutcome::kConsumerSync; + ? ProfileMetrics::ProfileSignedInFlowOutcome::kEnterpriseSync + : ProfileMetrics::ProfileSignedInFlowOutcome::kConsumerSync; case LoginUIService::CONFIGURE_SYNC_FIRST: - return enterprise_account ? ProfileMetrics::ProfileAddSignInFlowOutcome:: + return enterprise_account ? ProfileMetrics::ProfileSignedInFlowOutcome:: kEnterpriseSyncSettings - : ProfileMetrics::ProfileAddSignInFlowOutcome:: + : ProfileMetrics::ProfileSignedInFlowOutcome:: kConsumerSyncSettings; case LoginUIService::ABORT_SYNC: - return enterprise_account ? ProfileMetrics::ProfileAddSignInFlowOutcome:: + return enterprise_account ? ProfileMetrics::ProfileSignedInFlowOutcome:: kEnterpriseSigninOnly - : ProfileMetrics::ProfileAddSignInFlowOutcome:: + : ProfileMetrics::ProfileSignedInFlowOutcome:: kConsumerSigninOnly; case LoginUIService::UI_CLOSED: // The metric is recorded elsewhere. @@ -50,6 +52,17 @@ chrome::ShowSettingsSubPage(browser, chrome::kSyncSetupSubPage); } +bool IsLacrosPrimaryProfileFirstRun(Profile* profile) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + DCHECK(profile); + // The primary profile can never get _created_ through profile creation flow + // so if it's the primary (main) profile, it must be onboarding. + return profile->IsMainProfile(); +#else + return false; +#endif +} + } // namespace ProfilePickerTurnSyncOnDelegate::ProfilePickerTurnSyncOnDelegate( @@ -61,8 +74,14 @@ void ProfilePickerTurnSyncOnDelegate::ShowLoginError( const SigninUIError& error) { - ProfileMetrics::LogProfileAddSignInFlowOutcome( - ProfileMetrics::ProfileAddSignInFlowOutcome::kLoginError); + LogOutcome(ProfileMetrics::ProfileSignedInFlowOutcome::kLoginError); + + if (IsLacrosPrimaryProfileFirstRun(profile_)) { + // The primary profile onboarding is silently skipped if there's any error. + if (controller_) + controller_->FinishAndOpenBrowser(ProfilePicker::BrowserOpenedCallback()); + return; + } // Show the profile switch confirmation screen inside of the profile picker if // the user cannot sign in because the account already used by another @@ -109,7 +128,9 @@ DCHECK(callback); sync_confirmation_callback_ = std::move(callback); - if (enterprise_account_) { + if (enterprise_account_ || IsLacrosPrimaryProfileFirstRun(profile_)) { + // TODO(crbug.com/1300109): Add separate screen types for the enterprise and + // non-enterprise first run experience and implement those screen types. // First show the enterprise welcome screen and only after that (if the user // proceeds with the flow) the sync consent. ShowEnterpriseWelcome( @@ -125,6 +146,15 @@ base::OnceCallback<void(LoginUIService::SyncConfirmationUIClosedResult)> callback) { DCHECK(callback); + if (IsLacrosPrimaryProfileFirstRun(profile_)) { + // The primary profile first run experience is silently skipped if sync is + // disabled (there's no point to promo a feature that cannot get enabled). + // TODO (crbug.com/1141341): SYNC_WITH_DEFAULT_SETTINGS encodes to stay + // signed-in. Split the enum for sync disabled / rename the entries to + // better match the situation. + std::move(callback).Run(LoginUIService::SYNC_WITH_DEFAULT_SETTINGS); + return; + } sync_confirmation_callback_ = std::move(callback); sync_disabled_ = true; ShowEnterpriseWelcome(is_managed_account @@ -154,8 +184,12 @@ LoginUIServiceFactory::GetForProfile(profile_))); scoped_login_ui_service_observation_.Reset(); - FinishSyncConfirmation( - result, GetSyncOutcome(enterprise_account_, sync_disabled_, result)); + absl::optional<ProfileMetrics::ProfileSignedInFlowOutcome> outcome = + GetSyncOutcome(enterprise_account_, sync_disabled_, result); + if (outcome) + LogOutcome(*outcome); + + FinishSyncConfirmation(result); } void ProfilePickerTurnSyncOnDelegate::ShowSyncConfirmationScreen() { @@ -169,11 +203,8 @@ } void ProfilePickerTurnSyncOnDelegate::FinishSyncConfirmation( - LoginUIService::SyncConfirmationUIClosedResult result, - absl::optional<ProfileMetrics::ProfileAddSignInFlowOutcome> outcome) { + LoginUIService::SyncConfirmationUIClosedResult result) { DCHECK(sync_confirmation_callback_); - if (outcome) - ProfileMetrics::LogProfileAddSignInFlowOutcome(*outcome); std::move(sync_confirmation_callback_).Run(result); } @@ -194,13 +225,13 @@ EnterpriseProfileWelcomeUI::ScreenType type, bool proceed) { if (!proceed) { + LogOutcome(ProfileMetrics::ProfileSignedInFlowOutcome:: + kAbortedOnEnterpriseWelcome); // The callback provided by TurnSyncOnHelper must be called, UI_CLOSED // makes sure the final callback does not get called. It does not matter // what happens to sync as the signed-in profile creation gets cancelled // right after. - FinishSyncConfirmation(LoginUIService::UI_CLOSED, - ProfileMetrics::ProfileAddSignInFlowOutcome:: - kAbortedOnEnterpriseWelcome); + FinishSyncConfirmation(LoginUIService::UI_CLOSED); ProfilePicker::CancelSignedInFlow(); return; } @@ -211,19 +242,28 @@ return; case EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncDisabled: case EnterpriseProfileWelcomeUI::ScreenType::kConsumerAccountSyncDisabled: + // Logging kEnterpriseSyncDisabled for consumer accounts on managed + // devices is a pre-existing minor imprecision in reporting of this metric + // that's not worth fixing. + LogOutcome( + ProfileMetrics::ProfileSignedInFlowOutcome::kEnterpriseSyncDisabled); // SYNC_WITH_DEFAULT_SETTINGS encodes that the user wants to continue // (despite sync being disabled). // TODO (crbug.com/1141341): Split the enum for sync disabled / rename the // entries to better match the situation. - // Logging kEnterpriseSyncDisabled for consumer accounts on managed - // devices is a pre-existing minor imprecision in reporting of this metric - // that's not worth fixing. - FinishSyncConfirmation( - LoginUIService::SYNC_WITH_DEFAULT_SETTINGS, - ProfileMetrics::ProfileAddSignInFlowOutcome::kEnterpriseSyncDisabled); + FinishSyncConfirmation(LoginUIService::SYNC_WITH_DEFAULT_SETTINGS); break; case EnterpriseProfileWelcomeUI::ScreenType::kEnterpriseAccountCreation: NOTREACHED() << "The profile picker should not show an enterprise " "welcome that prompts for profile creation"; } } + +void ProfilePickerTurnSyncOnDelegate::LogOutcome( + ProfileMetrics::ProfileSignedInFlowOutcome outcome) { + if (IsLacrosPrimaryProfileFirstRun(profile_)) { + ProfileMetrics::LogLacrosPrimaryProfileFirstRunOutcome(outcome); + } else { + ProfileMetrics::LogProfileAddSignInFlowOutcome(outcome); + } +}
diff --git a/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.h b/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.h index edcf209..f4a37cff 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.h +++ b/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.h
@@ -60,17 +60,18 @@ void ShowSyncConfirmationScreen(); // When ShowSync(Disabled)Confirmation() gets called, this must eventually get - // called exactly once in all code branches. Handles the callback and reports - // the metrics. + // called exactly once in all code branches. Handles the callback. void FinishSyncConfirmation( - LoginUIService::SyncConfirmationUIClosedResult result, - absl::optional<ProfileMetrics::ProfileAddSignInFlowOutcome> outcome); + LoginUIService::SyncConfirmationUIClosedResult result); // Shows the enterprise welcome screen. void ShowEnterpriseWelcome(EnterpriseProfileWelcomeUI::ScreenType type); void OnEnterpriseWelcomeClosed(EnterpriseProfileWelcomeUI::ScreenType type, bool proceed); + // Reports metric with the outcome of the turn-sync-on flow. + void LogOutcome(ProfileMetrics::ProfileSignedInFlowOutcome outcome); + // Controls the sign-in flow. Is not guaranteed to outlive this object (gets // destroyed when the flow window closes). base::WeakPtr<ProfilePickerSignedInFlowController> controller_;
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view.cc b/chrome/browser/ui/views/profiles/profile_picker_view.cc index dc83f86..c4a362d 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_view.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_view.cc
@@ -117,7 +117,7 @@ return &ThemeService::GetThemeProviderForProfile(profile); return nullptr; } - ui::ColorProviderManager::InitializerSupplier* GetCustomTheme() + ui::ColorProviderManager::ThemeInitializerSupplier* GetCustomTheme() const override { return profile_picker_view_->GetCustomThemeForProfileBeingCreated(); } @@ -360,7 +360,7 @@ return nullptr; } -ui::ColorProviderManager::InitializerSupplier* +ui::ColorProviderManager::ThemeInitializerSupplier* ProfilePickerView::GetCustomThemeForProfileBeingCreated() const { #if BUILDFLAG(ENABLE_DICE_SUPPORT) // Custom theme is only needed for the dice flow.
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view.h b/chrome/browser/ui/views/profiles/profile_picker_view.h index 4559b1c8..40ef87c 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_view.h +++ b/chrome/browser/ui/views/profiles/profile_picker_view.h
@@ -57,7 +57,7 @@ ProfilePickerView& operator=(const ProfilePickerView&) = delete; Profile* GetProfileBeingCreated() const; - ui::ColorProviderManager::InitializerSupplier* + ui::ColorProviderManager::ThemeInitializerSupplier* GetCustomThemeForProfileBeingCreated() const; // Displays sign in error message that is created by Chrome but not GAIA
diff --git a/chrome/browser/ui/views/theme_copying_widget.cc b/chrome/browser/ui/views/theme_copying_widget.cc index 02343f7..8f00613 100644 --- a/chrome/browser/ui/views/theme_copying_widget.cc +++ b/chrome/browser/ui/views/theme_copying_widget.cc
@@ -16,7 +16,7 @@ : Widget::GetThemeProvider(); } -ui::ColorProviderManager::InitializerSupplier* +ui::ColorProviderManager::ThemeInitializerSupplier* ThemeCopyingWidget::GetCustomTheme() const { return observed_widget_.IsObserving() ? role_model_->GetCustomTheme() : Widget::GetCustomTheme();
diff --git a/chrome/browser/ui/views/theme_copying_widget.h b/chrome/browser/ui/views/theme_copying_widget.h index 4086130..4af3184 100644 --- a/chrome/browser/ui/views/theme_copying_widget.h +++ b/chrome/browser/ui/views/theme_copying_widget.h
@@ -21,7 +21,7 @@ // views::Widget: const ui::ThemeProvider* GetThemeProvider() const override; - ui::ColorProviderManager::InitializerSupplier* GetCustomTheme() + ui::ColorProviderManager::ThemeInitializerSupplier* GetCustomTheme() const override; const ui::NativeTheme* GetNativeTheme() const override;
diff --git a/chrome/browser/ui/web_applications/app_browser_controller.cc b/chrome/browser/ui/web_applications/app_browser_controller.cc index cd59f93..8585711 100644 --- a/chrome/browser/ui/web_applications/app_browser_controller.cc +++ b/chrome/browser/ui/web_applications/app_browser_controller.cc
@@ -387,6 +387,10 @@ #endif } +void AppBrowserController::AddColorMixers( + ui::ColorProvider* provider, + const ui::ColorProviderManager::Key& key) const {} + void AppBrowserController::OnReceivedInitialURL() { UpdateCustomTabBarVisibility(/*animate=*/false);
diff --git a/chrome/browser/ui/web_applications/app_browser_controller.h b/chrome/browser/ui/web_applications/app_browser_controller.h index dbc33c9..f6470fc7 100644 --- a/chrome/browser/ui/web_applications/app_browser_controller.h +++ b/chrome/browser/ui/web_applications/app_browser_controller.h
@@ -20,6 +20,8 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/skia/include/core/SkColor.h" #include "third_party/skia/include/core/SkRegion.h" +#include "ui/color/color_provider.h" +#include "ui/color/color_provider_manager.h" class Browser; class BrowserThemePack; @@ -46,9 +48,11 @@ bool IsSameHostAndPort(const GURL& app_url, const GURL& page_url); // Class to encapsulate logic to control the browser UI for web apps. -class AppBrowserController : public TabStripModelObserver, - public content::WebContentsObserver, - public BrowserThemeProviderDelegate { +class AppBrowserController + : public ui::ColorProviderManager::InitializerSupplier, + public TabStripModelObserver, + public content::WebContentsObserver, + public BrowserThemeProviderDelegate { public: AppBrowserController(const AppBrowserController&) = delete; AppBrowserController& operator=(const AppBrowserController&) = delete; @@ -201,6 +205,10 @@ CustomThemeSupplier* GetThemeSupplier() const override; bool ShouldUseCustomFrame() const override; + // ui::ColorProviderManager::InitializerSupplier + void AddColorMixers(ui::ColorProvider* provider, + const ui::ColorProviderManager::Key& key) const override; + void UpdateDraggableRegion(const SkRegion& region); const absl::optional<SkRegion>& draggable_region() const { return draggable_region_;
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc index bb2804b..3fcb95a 100644 --- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc +++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -979,8 +979,7 @@ return &NewWebUI<chromeos::settings::OSSettingsUI>; if (url.host_piece() == chrome::kChromeUIPowerHost) return &NewWebUI<chromeos::PowerUI>; - if (base::FeatureList::IsEnabled(chromeos::features::kDiagnosticsApp) && - url.host_piece() == ash::kChromeUIDiagnosticsAppHost) { + if (url.host_piece() == ash::kChromeUIDiagnosticsAppHost) { return &NewWebUI<ash::DiagnosticsDialogUI>; } if (url.host_piece() == ash::kChromeUIPrintManagementHost)
diff --git a/chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_handler.cc b/chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_handler.cc index e06c481a..f0b2f94b 100644 --- a/chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_handler.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_handler.h" #include "ash/constants/ash_features.h" +#include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/check.h" #include "base/logging.h" @@ -45,9 +46,11 @@ void OobeTestAPIHandler::GetAdditionalParameters(base::DictionaryValue* dict) { login::NetworkStateHelper helper_; - dict->SetBoolKey("testapi_shouldSkipNetworkFirstShow", - features::IsOobeNetworkScreenSkipEnabled() && - helper_.IsConnectedToEthernet()); + dict->SetBoolKey( + "testapi_shouldSkipNetworkFirstShow", + features::IsOobeNetworkScreenSkipEnabled() && + !ash::switches::IsOOBENetworkScreenSkippingDisabledForTesting() && + helper_.IsConnectedToEthernet()); dict->SetBoolKey( "testapi_shouldSkipEula", policy::EnrollmentRequisitionManager::IsRemoraRequisition() ||
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler_unittest.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler_unittest.cc index dfe338d..a03b155 100644 --- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler_unittest.cc +++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler_unittest.cc
@@ -100,6 +100,11 @@ color_provider_.SetColorForTesting(id, color); } + protected: + ui::ColorProviderManager::Key GetColorProviderKey() const override { + return ui::ColorProviderManager::Key(); + } + private: ui::ColorProvider color_provider_; };
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc index 938c855..857696a 100644 --- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc +++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
@@ -634,8 +634,8 @@ void NewTabPageUI::BindInterface( mojo::PendingReceiver<photos::mojom::PhotosHandler> pending_receiver) { - photos_handler_ = - std::make_unique<PhotosHandler>(std::move(pending_receiver), profile_); + photos_handler_ = std::make_unique<PhotosHandler>(std::move(pending_receiver), + profile_, web_contents_); } #if !defined(OFFICIAL_BUILD)
diff --git a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.cc b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.cc index c7df4cc..2c4238c53 100644 --- a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.cc +++ b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.cc
@@ -29,6 +29,7 @@ IDR_PRIVACY_SANDBOX_PRIVACY_SANDBOX_DIALOG_HTML); static constexpr webui::LocalizedString kStrings[] = { + {"privacySandboxTitle", IDS_SETTINGS_PRIVACY_SANDBOX_TITLE}, {"consentTitle", IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_TITLE}, {"consentSubtitle", IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_SUBTITLE}, {"consentBodyHeader1", IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_BODY_HEADER_1},
diff --git a/chrome/browser/ui/webui/settings/chromeos/about_section.cc b/chrome/browser/ui/webui/settings/chromeos/about_section.cc index f676a04f..ae21496 100644 --- a/chrome/browser/ui/webui/settings/chromeos/about_section.cc +++ b/chrome/browser/ui/webui/settings/chromeos/about_section.cc
@@ -218,9 +218,7 @@ SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate(); updater.AddSearchTags(GetAboutSearchConcepts()); - if (base::FeatureList::IsEnabled(chromeos::features::kDiagnosticsApp)) { - updater.AddSearchTags(GetDiagnosticsAppSearchConcepts()); - } + updater.AddSearchTags(GetDiagnosticsAppSearchConcepts()); if (base::FeatureList::IsEnabled(chromeos::features::kFirmwareUpdaterApp)) { updater.AddSearchTags(GetFirmwareUpdatesAppSearchConcepts()); @@ -416,10 +414,6 @@ html_source->AddBoolean("shouldShowSafetyInfo", !safetyInfoLink.empty()); html_source->AddBoolean( - "diagnosticsAppEnabled", - base::FeatureList::IsEnabled(chromeos::features::kDiagnosticsApp)); - - html_source->AddBoolean( "isFirmwareUpdaterAppEnabled", base::FeatureList::IsEnabled(chromeos::features::kFirmwareUpdaterApp));
diff --git a/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.cc b/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.cc index 66160bc0..0a04204 100644 --- a/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.cc +++ b/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.cc
@@ -57,22 +57,8 @@ using ::ash::PlaySoundOption; using ::content::BrowserThread; -void RecordUserImageChanged(int sample) { - // Although |ChangePictureHandler::kUserImageChangedHistogramName| is an - // enumerated histogram, we intentionally use UmaHistogramExactLinear() to - // emit the metric rather than UmaHistogramEnumeration(). This is because the - // enums.xml values correspond to (a) special constants and (b) indexes of an - // array containing resource IDs. - base::UmaHistogramExactLinear( - ChangePictureHandler::kUserImageChangedHistogramName, sample, - default_user_image::kHistogramImagesCount + 1); -} - } // namespace -const char ChangePictureHandler::kUserImageChangedHistogramName[] = - "UserImage.Changed2"; - ChangePictureHandler::ChangePictureHandler() : previous_image_index_(user_manager::User::USER_IMAGE_INVALID) { ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); @@ -336,8 +322,8 @@ // `previous_image_index` is used instead of `previous_image_index_` as the // latter has the same value of `image_index` after new image is selected. if (previous_image_index != image_index) { - RecordUserImageChanged( - user_image_manager->ImageIndexToHistogramIndex(image_index)); + ash::UserImageManager::RecordUserImageChanged( + ash::UserImageManager::ImageIndexToHistogramIndex(image_index)); } // Ignore the result of the previous decoding if it's no longer needed. @@ -355,8 +341,9 @@ ChromeUserManager::Get()->GetUserImageManager(GetUser()->GetAccountId()); // Log an impression if image is selected from a file. - RecordUserImageChanged(user_image_manager->ImageIndexToHistogramIndex( - user_manager::User::USER_IMAGE_EXTERNAL)); + ash::UserImageManager::RecordUserImageChanged( + default_user_image::kHistogramImageExternal); + user_image_manager->SaveUserImageFromFile(path); VLOG(1) << "Selected image from file"; } @@ -377,7 +364,8 @@ ->SaveUserImage(std::move(user_image)); // Log an impression if image is taken from photo. - RecordUserImageChanged(default_user_image::kHistogramImageFromCamera); + ash::UserImageManager::RecordUserImageChanged( + default_user_image::kHistogramImageFromCamera); VLOG(1) << "Selected camera photo"; }
diff --git a/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.h b/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.h index 5d00e852..7653e91 100644 --- a/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.h +++ b/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.h
@@ -35,9 +35,6 @@ ~ChangePictureHandler() override; - // The name of the histogram that records when a user changes a device image. - static const char kUserImageChangedHistogramName[]; - // WebUIMessageHandler implementation. void RegisterMessages() override; void OnJavascriptAllowed() override;
diff --git a/chrome/browser/ui/webui/settings/chromeos/change_picture_handler_unittest.cc b/chrome/browser/ui/webui/settings/chromeos/change_picture_handler_unittest.cc index 0f78bcb..085a5310 100644 --- a/chrome/browser/ui/webui/settings/chromeos/change_picture_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/chromeos/change_picture_handler_unittest.cc
@@ -149,7 +149,7 @@ auto* user_image_manager = GetUserImageManager(); histogram_tester().ExpectBucketCount( - ChangePictureHandler::kUserImageChangedHistogramName, + ash::UserImageManager::kUserImageChangedHistogramName, user_image_manager->ImageIndexToHistogramIndex(default_image_index), 1); } @@ -161,13 +161,13 @@ SelectNewDefaultImage(default_image_index); histogram_tester().ExpectBucketCount( - ChangePictureHandler::kUserImageChangedHistogramName, + ash::UserImageManager::kUserImageChangedHistogramName, user_image_manager->ImageIndexToHistogramIndex(default_image_index), 1); // Selecting the same default image should not log another impression. SelectNewDefaultImage(default_image_index); histogram_tester().ExpectBucketCount( - ChangePictureHandler::kUserImageChangedHistogramName, + ash::UserImageManager::kUserImageChangedHistogramName, user_image_manager->ImageIndexToHistogramIndex(default_image_index), 1); } @@ -179,13 +179,13 @@ // User selects a new default image. SelectNewDefaultImage(default_image_index); histogram_tester().ExpectBucketCount( - ChangePictureHandler::kUserImageChangedHistogramName, + ash::UserImageManager::kUserImageChangedHistogramName, user_image_manager->ImageIndexToHistogramIndex(default_image_index), 1); // User selects the profile image. SelectProfileImage(); histogram_tester().ExpectBucketCount( - ChangePictureHandler::kUserImageChangedHistogramName, + ash::UserImageManager::kUserImageChangedHistogramName, user_image_manager->ImageIndexToHistogramIndex( user_manager::User::USER_IMAGE_PROFILE), 1); @@ -198,7 +198,7 @@ // impression SelectProfileImage(); histogram_tester().ExpectBucketCount( - ChangePictureHandler::kUserImageChangedHistogramName, + ash::UserImageManager::kUserImageChangedHistogramName, user_image_manager->ImageIndexToHistogramIndex( user_manager::User::USER_IMAGE_PROFILE), 0); @@ -214,7 +214,7 @@ SelectImageFromFile(file_path); histogram_tester().ExpectBucketCount( - ChangePictureHandler::kUserImageChangedHistogramName, + ash::UserImageManager::kUserImageChangedHistogramName, user_image_manager->ImageIndexToHistogramIndex( user_manager::User::USER_IMAGE_EXTERNAL), 1); @@ -224,7 +224,7 @@ // Camera image is decoded OnCameraImageDecoded(); histogram_tester().ExpectBucketCount( - ChangePictureHandler::kUserImageChangedHistogramName, + ash::UserImageManager::kUserImageChangedHistogramName, default_user_image::kHistogramImageFromCamera, 1); }
diff --git a/chrome/browser/ui/webui/settings/people_handler.cc b/chrome/browser/ui/webui/settings/people_handler.cc index 9b7ce4a..36c4f5d1 100644 --- a/chrome/browser/ui/webui/settings/people_handler.cc +++ b/chrome/browser/ui/webui/settings/people_handler.cc
@@ -446,8 +446,8 @@ #if BUILDFLAG(ENABLE_DICE_SUPPORT) if (AccountConsistencyModeManager::IsDiceEnabledForProfile(profile_)) { // If dice is enabled, show all the accounts. - for (const auto& account : - signin_ui_util::GetAccountsForDicePromos(profile_)) { + for (const auto& account : signin_ui_util::GetOrderedAccountsForDisplay( + profile_, /*restrict_to_accounts_eligible_for_sync=*/true)) { accounts.Append(GetAccountValue(account)); } return accounts;
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 e114cc00..b21d364 100644 --- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -1031,6 +1031,10 @@ {"editPasswordUsernameLabel", IDS_SETTINGS_PASSWORDS_USERNAME}, {"editPasswordPasswordLabel", IDS_SETTINGS_PASSWORDS_PASSWORD}, {"passwordNoteLabel", IDS_SETTINGS_PASSWORDS_NOTE}, + {"passwordNoteCharacterCount", + IDS_SETTINGS_PASSWORDS_NOTE_CHARACTER_COUNT}, + {"passwordNoteCharacterCountWarning", + IDS_SETTINGS_PASSWORDS_NOTE_CHARACTER_COUNT_WARNING}, {"noAddressesFound", IDS_SETTINGS_ADDRESS_NONE}, {"noPasswordsFound", IDS_SETTINGS_PASSWORDS_NONE}, {"noExceptionsFound", IDS_SETTINGS_PASSWORDS_EXCEPTIONS_NONE}, @@ -1540,7 +1544,14 @@ base::FeatureList::IsEnabled(omnibox::kDocumentProvider)); html_source->AddBoolean( "consolidatedSiteStorageControlsEnabled", - base::FeatureList::IsEnabled(features::kConsolidatedSiteStorageControls)); + base::FeatureList::IsEnabled( + features::kConsolidatedSiteStorageControls) || + // The third release of Privacy Sandbox settings depends on the + // simplified control structure. Ideally simplified controls will + // launch to 100% in advance of the Privacy Sandbox, but the Sandbox + // cannot launch without this simplification enabled. + base::FeatureList::IsEnabled( + privacy_sandbox::kPrivacySandboxSettings3)); bool show_secure_dns = IsSecureDnsAvailable(); bool link_secure_dns = ShouldLinkSecureDnsOsSettings();
diff --git a/chrome/browser/ui/webui/signin/turn_sync_on_helper_delegate_impl.cc b/chrome/browser/ui/webui/signin/turn_sync_on_helper_delegate_impl.cc index 162be7c..b3250fd 100644 --- a/chrome/browser/ui/webui/signin/turn_sync_on_helper_delegate_impl.cc +++ b/chrome/browser/ui/webui/signin/turn_sync_on_helper_delegate_impl.cc
@@ -179,7 +179,8 @@ // Treat closing the ui as an implicit ABORT_SYNC action. if (result == LoginUIService::UI_CLOSED) result = LoginUIService::ABORT_SYNC; - browser_->signin_view_controller()->CloseModalSignin(); + if (browser_) + browser_->signin_view_controller()->CloseModalSignin(); std::move(sync_confirmation_callback_).Run(result); }
diff --git a/chrome/browser/ui/webui/support_tool/support_tool_ui.cc b/chrome/browser/ui/webui/support_tool/support_tool_ui.cc index 2c641c55..ae9e0d58b 100644 --- a/chrome/browser/ui/webui/support_tool/support_tool_ui.cc +++ b/chrome/browser/ui/webui/support_tool/support_tool_ui.cc
@@ -9,8 +9,6 @@ #include "base/values.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/signin/account_consistency_mode_manager.h" -#include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/signin/signin_ui_util.h" #include "chrome/browser/ui/webui/webui_util.h" #include "chrome/common/url_constants.h" @@ -18,7 +16,6 @@ #include "chrome/grit/support_tool_resources_map.h" #include "components/signin/public/base/consent_level.h" #include "components/signin/public/identity_manager/account_info.h" -#include "components/signin/public/identity_manager/identity_manager.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" #include "content/public/browser/web_ui_data_source.h" @@ -94,30 +91,15 @@ Profile* profile = Profile::FromWebUI(web_ui()); base::Value::List account_list; -#if BUILDFLAG(ENABLE_DICE_SUPPORT) - if (AccountConsistencyModeManager::IsDiceEnabledForProfile(profile)) { - // If dice is enabled, show all the accounts. - for (const auto& account : - signin_ui_util::GetAccountsForDicePromos(profile)) { - if (!account.IsEmpty()) - account_list.Append(base::Value(account.email)); - } - return account_list; - } -#endif - // Guest mode does not have a primary account (or an IdentityManager). if (profile->IsGuestSession()) return account_list; - // If DICE is disabled for this profile or unsupported on this platform (e.g. - // Chrome OS), then show only the primary account, whether or not that account - // has consented to sync. - auto* identity_manager = IdentityManagerFactory::GetForProfile(profile); - AccountInfo primary_account_info = identity_manager->FindExtendedAccountInfo( - identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)); - if (!primary_account_info.IsEmpty()) - account_list.Append(base::Value(primary_account_info.email)); + for (const auto& account : signin_ui_util::GetOrderedAccountsForDisplay( + profile, /*restrict_to_accounts_eligible_for_sync=*/false)) { + if (!account.IsEmpty()) + account_list.Append(base::Value(account.email)); + } return account_list; }
diff --git a/chrome/browser/ui/webui/welcome/welcome_ui.cc b/chrome/browser/ui/webui/welcome/welcome_ui.cc index 47deb10e..edd858a7 100644 --- a/chrome/browser/ui/webui/welcome/welcome_ui.cc +++ b/chrome/browser/ui/webui/welcome/welcome_ui.cc
@@ -138,7 +138,7 @@ #if BUILDFLAG(GOOGLE_CHROME_BRANDING) html_source->AddResourcePath("images/background_svgs/logo.svg", - IDR_PRODUCT_LOGO_24PX_1X); + IDR_PRODUCT_LOGO_128PX_SVG); #endif #if BUILDFLAG(IS_WIN)
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.cc b/chrome/browser/webauthn/authenticator_request_dialog_model.cc index 428f330d..09da779 100644 --- a/chrome/browser/webauthn/authenticator_request_dialog_model.cc +++ b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
@@ -10,7 +10,7 @@ #include "base/bind.h" #include "base/containers/contains.h" -#include "base/metrics/histogram_macros.h" +#include "base/metrics/histogram_functions.h" #include "base/observer_list.h" #include "base/strings/utf_string_conversions.h" #include "base/threading/sequenced_task_runner_handle.h" @@ -27,6 +27,17 @@ namespace { +// BleEvent enumerates user-visible BLE events. +enum class BleEvent { + kAlreadyPowered = 0, // BLE was already powered. + kNeedsPowerAuto = 1, // BLE was not powered and so we asked the user. + kNeedsPowerManual = 2, // BLE was not powered and so we asked the user, but + // they have to do it manually. + kNewlyPowered = 3, // BLE wasn't powered, but the user turned it on. + + kMaxValue = kNewlyPowered, +}; + constexpr int GetMessageIdForTransportDescription( AuthenticatorTransport transport) { switch (transport) { @@ -249,7 +260,10 @@ current_step() == Step::kAndroidAccessory || current_step() == Step::kOffTheRecordInterstitial || current_step() == Step::kNotStarted); + if (ble_adapter_is_powered()) { + base::UmaHistogramEnumeration("WebAuthentication.BLEUserEvents", + BleEvent::kAlreadyPowered); SetCurrentStep(step); return; } @@ -257,15 +271,25 @@ after_ble_adapter_powered_ = base::BindOnce(&AuthenticatorRequestDialogModel::SetCurrentStep, weak_factory_.GetWeakPtr(), step); - SetCurrentStep(transport_availability()->can_power_on_ble_adapter - ? Step::kBlePowerOnAutomatic - : Step::kBlePowerOnManual); + + BleEvent event; + if (transport_availability()->can_power_on_ble_adapter) { + event = BleEvent::kNeedsPowerAuto; + SetCurrentStep(Step::kBlePowerOnAutomatic); + } else { + event = BleEvent::kNeedsPowerManual; + SetCurrentStep(Step::kBlePowerOnManual); + } + + base::UmaHistogramEnumeration("WebAuthentication.BLEUserEvents", event); } void AuthenticatorRequestDialogModel::ContinueWithFlowAfterBleAdapterPowered() { DCHECK(current_step() == Step::kBlePowerOnManual || current_step() == Step::kBlePowerOnAutomatic); DCHECK(ble_adapter_is_powered()); + base::UmaHistogramEnumeration("WebAuthentication.BLEUserEvents", + BleEvent::kNewlyPowered); std::move(after_ble_adapter_powered_).Run(); } @@ -814,12 +838,21 @@ after_ble_adapter_powered_ = base::BindOnce( &AuthenticatorRequestDialogModel::ContactPhoneAfterBleIsPowered, weak_factory_.GetWeakPtr(), std::move(name)); - SetCurrentStep(transport_availability()->can_power_on_ble_adapter - ? Step::kBlePowerOnAutomatic - : Step::kBlePowerOnManual); + + BleEvent event; + if (transport_availability()->can_power_on_ble_adapter) { + event = BleEvent::kNeedsPowerAuto; + SetCurrentStep(Step::kBlePowerOnAutomatic); + } else { + event = BleEvent::kNeedsPowerManual; + SetCurrentStep(Step::kBlePowerOnManual); + } + base::UmaHistogramEnumeration("WebAuthentication.BLEUserEvents", event); return; } + base::UmaHistogramEnumeration("WebAuthentication.BLEUserEvents", + BleEvent::kAlreadyPowered); ContactPhoneAfterBleIsPowered(std::move(name)); }
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 8178d0b..222d329 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1647496284-a27d2357c01b807a1c206f1ee388c6da62f1735d.profdata +chrome-linux-main-1647539747-03593157d39498fa2c27de59ce8a69f2ad2dc181.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 873dbd9..072a88e 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1647496284-778d46d09eb79694746daf68581202e8bfc29ca9.profdata +chrome-mac-arm-main-1647518309-2f3a06193beb03804c4ef7e2b1de409100653ccf.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index bca4297..b9b1ccd0 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1647496284-8d2d28083bfff7c130fc6b9981e3f3c399e68e15.profdata +chrome-mac-main-1647518309-3ba1408f248e578199edd78d33c40ef3480f390a.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 9e0df20d..d75b41d 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1647507485-ba8a20187da66621e7aa7425966ba4194328eae9.profdata +chrome-win32-main-1647529177-0c0f4c7a803ac1e2ee193e2ed924338211e72623.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index c2b4c7c..4fd3b21a 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1647507485-c107af4c274b5cdaf648aff86d0576f39e44db49.profdata +chrome-win64-main-1647529177-8d2c74d53e6f0c6ecd578ad9eab3ddf9d6e0bb1f.profdata
diff --git a/chrome/chrome_cleaner/os/task_scheduler_unittest.cc b/chrome/chrome_cleaner/os/task_scheduler_unittest.cc index caca5d8..b0b8e1fd 100644 --- a/chrome/chrome_cleaner/os/task_scheduler_unittest.cc +++ b/chrome/chrome_cleaner/os/task_scheduler_unittest.cc
@@ -27,6 +27,10 @@ #include "chrome/chrome_cleaner/test/test_strings.h" #include "testing/gtest/include/gtest/gtest.h" +#if BUILDFLAG(IS_WIN) +#include "base/win/windows_version.h" +#endif + namespace chrome_cleaner { namespace { @@ -94,6 +98,13 @@ } TEST_F(TaskSchedulerTests, RunAProgramNow) { +#if BUILDFLAG(IS_WIN) + // TODO(crbug.com/1307401): Failing on Windows7. + if (base::win::GetVersion() <= base::win::Version::WIN7) { + return; + } +#endif + base::FilePath executable_path; ASSERT_TRUE(base::PathService::Get(base::DIR_EXE, &executable_path)); base::CommandLine command_line(
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index 399f20ea..b3f10c3 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -534,6 +534,10 @@ "HappinessTrackingSurveysForDesktopNtpModules", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kHappinessTrackingSurveysForNtpPhotosOptOut{ + "HappinessTrackingSurveysForrNtpPhotosOptOut", + base::FEATURE_DISABLED_BY_DEFAULT}; + // Enables or disables the Happiness Tracking System for Chrome What's New. const base::Feature kHappinessTrackingSurveysForDesktopWhatsNew{ "HappinessTrackingSurveysForDesktopWhatsNew",
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h index 982fe31c..6baaf07 100644 --- a/chrome/common/chrome_features.h +++ b/chrome/common/chrome_features.h
@@ -341,6 +341,8 @@ COMPONENT_EXPORT(CHROME_FEATURES) extern const base::Feature kHappinessTrackingSurveysForDesktopNtpModules; +COMPONENT_EXPORT(CHROME_FEATURES) +extern const base::Feature kHappinessTrackingSurveysForNtpPhotosOptOut; COMPONENT_EXPORT(CHROME_FEATURES) extern const base::Feature kHappinessTrackingSurveysForDesktopWhatsNew;
diff --git a/chrome/services/file_util/public/cpp/sandboxed_document_analyzer.cc b/chrome/services/file_util/public/cpp/sandboxed_document_analyzer.cc index 56ab450d..8104596 100644 --- a/chrome/services/file_util/public/cpp/sandboxed_document_analyzer.cc +++ b/chrome/services/file_util/public/cpp/sandboxed_document_analyzer.cc
@@ -87,14 +87,16 @@ } void SandboxedDocumentAnalyzer::ReportFileFailure(const std::string msg) { - struct safe_browsing::DocumentAnalyzerResults failure_results = - safe_browsing::DocumentAnalyzerResults(); - failure_results.success = false; - failure_results.has_macros = false; - failure_results.error_message = msg; - failure_results.error_code = - safe_browsing::ClientDownloadRequest::DocumentProcessingInfo::INTERNAL; + if (callback_) { + struct safe_browsing::DocumentAnalyzerResults failure_results = + safe_browsing::DocumentAnalyzerResults(); + failure_results.success = false; + failure_results.has_macros = false; + failure_results.error_message = msg; + failure_results.error_code = + safe_browsing::ClientDownloadRequest::DocumentProcessingInfo::INTERNAL; - content::GetUIThreadTaskRunner({})->PostTask( - FROM_HERE, base::BindOnce(std::move(callback_), failure_results)); + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(std::move(callback_), failure_results)); + } }
diff --git a/chrome/services/file_util/public/cpp/sandboxed_rar_analyzer.cc b/chrome/services/file_util/public/cpp/sandboxed_rar_analyzer.cc index 84d4a2f..de512b0 100644 --- a/chrome/services/file_util/public/cpp/sandboxed_rar_analyzer.cc +++ b/chrome/services/file_util/public/cpp/sandboxed_rar_analyzer.cc
@@ -104,9 +104,11 @@ } void SandboxedRarAnalyzer::ReportFileFailure() { - content::GetUIThreadTaskRunner({})->PostTask( - FROM_HERE, base::BindOnce(std::move(callback_), - safe_browsing::ArchiveAnalyzerResults())); + if (callback_) { + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(std::move(callback_), + safe_browsing::ArchiveAnalyzerResults())); + } } std::string SandboxedRarAnalyzer::DebugString() const {
diff --git a/chrome/services/file_util/public/cpp/sandboxed_zip_analyzer.cc b/chrome/services/file_util/public/cpp/sandboxed_zip_analyzer.cc index cc2b9fb..a91fc35 100644 --- a/chrome/services/file_util/public/cpp/sandboxed_zip_analyzer.cc +++ b/chrome/services/file_util/public/cpp/sandboxed_zip_analyzer.cc
@@ -73,9 +73,11 @@ } void SandboxedZipAnalyzer::ReportFileFailure() { - content::GetUIThreadTaskRunner({})->PostTask( - FROM_HERE, base::BindOnce(std::move(callback_), - safe_browsing::ArchiveAnalyzerResults())); + if (callback_) { + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(std::move(callback_), + safe_browsing::ArchiveAnalyzerResults())); + } } void SandboxedZipAnalyzer::AnalyzeFile(base::File file, base::File temp_file) {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index a22b68a..c9e0a66c 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -5567,6 +5567,8 @@ "//components/captive_portal/core:buildflags", "//components/cast_channel:cast_channel", "//components/cast_channel:test_support", + "//components/certificate_transparency", + "//components/certificate_transparency:proto", "//components/commerce/core:feature_list", "//components/component_updater:test_support", "//components/content_settings/browser",
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/AccountManagerTestRule.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/AccountManagerTestRule.java index 9255474d..4d171c8 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/AccountManagerTestRule.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/AccountManagerTestRule.java
@@ -217,15 +217,14 @@ } /** - * Adds and signs in a child account with the default name and enables sync. + * Adds a child account, and waits for auto-signin to complete. * * This method invokes native code. It shouldn't be called in a Robolectric test. * * @param syncService SyncService object to set up sync, if null, sync won't * start. */ - public CoreAccountInfo addChildTestAccountThenSigninAndEnableSync( - @Nullable SyncService syncService) { + public CoreAccountInfo addChildTestAccountThenWaitForSignin() { assert !mIsSignedIn : "An account is already signed in!"; CoreAccountInfo coreAccountInfo = addAccountAndWaitForSeeding(generateChildEmail(TEST_ACCOUNT_EMAIL)); @@ -240,6 +239,20 @@ }); mIsSignedIn = true; + return coreAccountInfo; + } + + /** + * Adds a child account, waits for auto-signin to complete, and enables sync. + * + * This method invokes native code. It shouldn't be called in a Robolectric test. + * + * @param syncService SyncService object to set up sync, if null, sync won't + * start. + */ + public CoreAccountInfo addChildTestAccountThenEnableSync(@Nullable SyncService syncService) { + CoreAccountInfo coreAccountInfo = addChildTestAccountThenWaitForSignin(); + if (ChromeFeatureList.isEnabled(ChromeFeatureList.ALLOW_SYNC_OFF_FOR_CHILD_ACCOUNTS)) { // The auto sign-in should leave the user in signed-in, non-syncing state - check this // and enable sync. @@ -275,7 +288,7 @@ */ public CoreAccountInfo addTestAccountThenSigninAndEnableSync( @Nullable SyncService syncService, boolean isChild) { - return isChild ? addChildTestAccountThenSigninAndEnableSync(syncService) + return isChild ? addChildTestAccountThenEnableSync(syncService) : addTestAccountThenSigninAndEnableSync(syncService); }
diff --git a/chrome/test/data/android/cookie.html b/chrome/test/data/android/cookie.html index 8ae27cc3..a0e2358 100644 --- a/chrome/test/data/android/cookie.html +++ b/chrome/test/data/android/cookie.html
@@ -13,7 +13,10 @@ } function getCookie() { - return document.cookie; + if (document.cookie) + return document.cookie; + + return ''; } </script> <body>Test for setting and getting cookies.</body>
diff --git a/chrome/test/data/extensions/api_test/enterprise_platform_keys/api_not_available.html b/chrome/test/data/extensions/api_test/enterprise_platform_keys/api_not_available.html deleted file mode 100644 index 70059ea..0000000 --- a/chrome/test/data/extensions/api_test/enterprise_platform_keys/api_not_available.html +++ /dev/null
@@ -1,7 +0,0 @@ -<!-- - * Copyright 2014 The Chromium Authors. All rights reserved. Use of this - * source code is governed by a BSD-style license that can be found in the - * LICENSE file. ---> -<script src="api_not_available.js"></script> -
diff --git a/chrome/test/data/extensions/api_test/enterprise_platform_keys/api_not_available.js b/chrome/test/data/extensions/api_test/enterprise_platform_keys/api_not_available/api_not_available.js similarity index 100% rename from chrome/test/data/extensions/api_test/enterprise_platform_keys/api_not_available.js rename to chrome/test/data/extensions/api_test/enterprise_platform_keys/api_not_available/api_not_available.js
diff --git a/chrome/test/data/extensions/api_test/enterprise_platform_keys/api_not_available/manifest.json b/chrome/test/data/extensions/api_test/enterprise_platform_keys/api_not_available/manifest.json new file mode 100644 index 0000000..1414da2 --- /dev/null +++ b/chrome/test/data/extensions/api_test/enterprise_platform_keys/api_not_available/manifest.json
@@ -0,0 +1,14 @@ +{ + // chrome-extension://aecpbnckhoppanpmefllkdkohionpmig + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtnAqVJvUof3ub8XQKnA8XUWxjcvnmsQD0z8JIuPzjXpaF07A1r52GT+O8m1b/8LS1iz9N8lqjT88tSUVPjrHIaRVt1En2bwOUnNqICxGCPSv+TGzqZOn2mompNKnnKR4b//xBDTcwgJ/QkVWh1l5iVXx2jJcZmXiQfuHRcmhT/lyfr4FD9puhfnt2l+OEJWBVMJgvesDTF0WPAzwdhsPrXemfv1FFbWINkriuWFCeYx03xx5szN83xsJxKf7xQ5hfh4PcsSSA/Q8oaEOXH6/QOFoDNdqYrjmpf4proilRvhoGEgeT+XSrIErRh6y1ZUatqb9VpMKRcw9rOA1epxA0wIDAQAB", + "name": "API not available test.", + "version": "0.1", + "manifest_version": 2, + "background": { + "scripts": ["api_not_available.js"], + "persistent": true + }, + "permissions": [ + "enterprise.platformKeys" + ] +}
diff --git a/chrome/test/data/extensions/api_test/enterprise_platform_keys/background.js b/chrome/test/data/extensions/api_test/enterprise_platform_keys/basic/background.js similarity index 100% rename from chrome/test/data/extensions/api_test/enterprise_platform_keys/background.js rename to chrome/test/data/extensions/api_test/enterprise_platform_keys/basic/background.js
diff --git a/chrome/test/data/extensions/api_test/enterprise_platform_keys/manifest.json b/chrome/test/data/extensions/api_test/enterprise_platform_keys/basic/manifest.json similarity index 100% rename from chrome/test/data/extensions/api_test/enterprise_platform_keys/manifest.json rename to chrome/test/data/extensions/api_test/enterprise_platform_keys/basic/manifest.json
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json index 4c30f58..859137c 100644 --- a/chrome/test/data/policy/policy_test_cases.json +++ b/chrome/test/data/policy/policy_test_cases.json
@@ -11704,7 +11704,7 @@ "reason_for_missing_test": "Maps into CrosSettings" }, "DeviceUserWhitelist": { - "reason_for_missing_test": "Maps into CrosSettings" + "reason_for_missing_test": "Policy was removed" }, "DeviceUserAllowlist": { "reason_for_missing_test": "Maps into CrosSettings" @@ -12138,7 +12138,7 @@ "reason_for_missing_test": "Maps into CrosSettings" }, "UsbDetachableWhitelist": { - "reason_for_missing_test": "Maps into CrosSettings" + "reason_for_missing_test": "Policy was removed" }, "UsbDetachableAllowlist": { "reason_for_missing_test": "Maps into CrosSettings" @@ -12310,16 +12310,16 @@ "reason_for_missing_test": "Maps into CrosSettings" }, "DeviceNativePrinters": { - "reason_for_missing_test": "TODO(crbug.com/1213475) external data policy not supported yet" + "reason_for_missing_test": "Policy was removed" }, "DeviceNativePrintersAccessMode": { - "reason_for_missing_test": "Maps into CrosSettings" + "reason_for_missing_test": "Policy was removed" }, "DeviceNativePrintersBlacklist": { - "reason_for_missing_test": "Maps into CrosSettings" + "reason_for_missing_test": "Policy was removed" }, "DeviceNativePrintersWhitelist": { - "reason_for_missing_test": "Maps into CrosSettings" + "reason_for_missing_test": "Policy was removed" }, "DeviceExternalPrintServers": { "reason_for_missing_test": "TODO(crbug.com/1213475) external data policy not supported yet"
diff --git a/chrome/test/data/webui/chromeos/diagnostics/diagnostics_browsertest.js b/chrome/test/data/webui/chromeos/diagnostics/diagnostics_browsertest.js index daefd124..30924bb 100644 --- a/chrome/test/data/webui/chromeos/diagnostics/diagnostics_browsertest.js +++ b/chrome/test/data/webui/chromeos/diagnostics/diagnostics_browsertest.js
@@ -32,13 +32,7 @@ } /** @override */ - get featureList() { - return { - enabled: [ - 'chromeos::features::kDiagnosticsApp', - ], - }; - } + get featureList() {} }; this.DiagnosticsAppWithNetwork = class extends PolymerTest { @@ -51,7 +45,6 @@ get featureList() { return { enabled: [ - 'chromeos::features::kDiagnosticsApp', 'chromeos::features::kEnableNetworkingInDiagnosticsApp', 'chromeos::features::kDiagnosticsAppNavigation', ], @@ -69,7 +62,6 @@ get featureList() { return { enabled: [ - 'chromeos::features::kDiagnosticsApp', 'chromeos::features::kEnableInputInDiagnosticsApp', ], };
diff --git a/chrome/test/data/webui/chromeos/personalization_app/google_photos_albums_element_test.ts b/chrome/test/data/webui/chromeos/personalization_app/google_photos_albums_element_test.ts index 24ed1ab..c701cfc 100644 --- a/chrome/test/data/webui/chromeos/personalization_app/google_photos_albums_element_test.ts +++ b/chrome/test/data/webui/chromeos/personalization_app/google_photos_albums_element_test.ts
@@ -2,14 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {GooglePhotosAlbums} from 'chrome://personalization/trusted/wallpaper/google_photos_albums_element.js'; - import {getCountText} from 'chrome://personalization/common/utils.js'; import {GooglePhotosAlbum} from 'chrome://personalization/trusted/personalization_app.mojom-webui.js'; +import {GooglePhotosAlbums} from 'chrome://personalization/trusted/wallpaper/google_photos_albums_element.js'; import {initializeGooglePhotosData} from 'chrome://personalization/trusted/wallpaper/wallpaper_controller.js'; import {WallpaperGridItem} from 'chrome://personalization/trusted/wallpaper/wallpaper_grid_item_element.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {assertEquals} from 'chrome://webui-test/chai_assert.js'; +import {assertEquals, assertNotReached} from 'chrome://webui-test/chai_assert.js'; import {waitAfterNextRender} from 'chrome://webui-test/test_util.js'; import {baseSetup, initElement, teardownElement} from './personalization_app_test_utils.js'; @@ -31,6 +30,19 @@ return matches ? [...matches] : null; } + /** Scrolls the specified |element| until |predicate| returns true. */ + async function scrollElementUntil( + element: HTMLElement, predicate: () => boolean) { + const timeout = +new Date() + 1000; + while (!predicate()) { + element.scrollBy(0, 500); + await waitAfterNextRender(googlePhotosAlbumsElement!); + if (+new Date() > timeout) { + assertNotReached('Timed out while scrolling.'); + } + } + } + setup(() => { loadTimeData.overrideValues({'isGooglePhotosIntegrationEnabled': true}); @@ -101,4 +113,104 @@ assertEquals(albumEl.secondaryText, getCountText(albums[i]!.photoCount)); }); }); + + // TODO(dmblack): Re-enable after branch. + test.skip('incrementally loads albums', async () => { + // Set photos count returned by |wallpaperProvider|. + const photosCount = 200; + wallpaperProvider.setGooglePhotosCount(photosCount); + + // Set initial list of albums returned by |wallpaperProvider|. + const albumsCount = 200; + let nextAlbumId = 1; + wallpaperProvider.setGooglePhotosAlbums( + Array.from({length: albumsCount / 2}).map(() => { + return { + id: `id-${nextAlbumId}`, + title: `title-${nextAlbumId}`, + photoCount: photosCount / albumsCount, + preview: {url: `url-${nextAlbumId++}`} + }; + })); + + // Set initial albums resume token returned by |wallpaperProvider|. When + // resume token is defined, it indicates additional albums exist. + const resumeToken = 'resumeToken'; + wallpaperProvider.setGooglePhotosAlbumsResumeToken(resumeToken); + + // Initialize Google Photos data in |personalizationStore|. + await initializeGooglePhotosData(wallpaperProvider, personalizationStore); + assertEquals( + await wallpaperProvider.whenCalled('fetchGooglePhotosAlbums'), + /*resumeToken=*/ null); + + // Reset |wallpaperProvider| expectations. + wallpaperProvider.resetResolver('fetchGooglePhotosAlbums'); + + // Set the next list of albums returned by |wallpaperProvider|. + wallpaperProvider.setGooglePhotosAlbums( + Array.from({length: albumsCount / 2}).map(() => { + return { + id: `id-${nextAlbumId}`, + title: `title-${nextAlbumId}`, + photoCount: photosCount / albumsCount, + preview: {url: `url-${nextAlbumId++}`} + }; + })); + + // Set the next albums resume token returned by |wallpaperProvider|. When + // resume token is undefined, it indicates no additional albums exist. + wallpaperProvider.setGooglePhotosAlbumsResumeToken(undefined); + + // Restrict the viewport so that |googlePhotosAlbumsElement| will lazily + // create albums instead of creating them all at once. + const style = document.createElement('style'); + style.appendChild(document.createTextNode(` + html, + body { + height: 100%; + width: 100%; + } + `)); + document.head.appendChild(style); + + // Initialize |googlePhotosAlbumsElement|. + googlePhotosAlbumsElement = + initElement(GooglePhotosAlbums, {hidden: false}); + await waitAfterNextRender(googlePhotosAlbumsElement); + + // Register an event listener to cache whether the |gridScrollThreshold| has + // been reached. + let gridScrollThresholdReached = false; + const gridScrollThreshold = googlePhotosAlbumsElement.$.gridScrollThreshold; + gridScrollThreshold.addEventListener('lower-threshold', () => { + gridScrollThresholdReached = true; + }); + + // Scroll until the |gridScrollThreshold| is reached. + await scrollElementUntil(gridScrollThreshold, () => { + return gridScrollThresholdReached; + }); + + // Wait for and verify that the next batch of albums has been + // requested. + assertEquals( + await wallpaperProvider.whenCalled('fetchGooglePhotosAlbums'), + resumeToken); + await waitAfterNextRender(googlePhotosAlbumsElement); + + // Reset |wallpaperProvider| expectations. + wallpaperProvider.resetResolver('fetchGooglePhotosAlbums'); + + // Scroll until the bottom of the grid is reached. + let scrollTop = -1; + await scrollElementUntil(gridScrollThreshold, () => { + const oldScrollTop = scrollTop; + scrollTop = gridScrollThreshold.scrollTop; + return scrollTop === oldScrollTop; + }); + + // Verify that no next batch of albums has been requested. + assertEquals(wallpaperProvider.getCallCount('fetchGooglePhotosAlbums'), 0); + }); }
diff --git a/chrome/test/data/webui/chromeos/personalization_app/google_photos_photos_element_test.ts b/chrome/test/data/webui/chromeos/personalization_app/google_photos_photos_element_test.ts index ee8e5338..61a0a91 100644 --- a/chrome/test/data/webui/chromeos/personalization_app/google_photos_photos_element_test.ts +++ b/chrome/test/data/webui/chromeos/personalization_app/google_photos_photos_element_test.ts
@@ -313,7 +313,8 @@ assertEquals(photoEls[1]!.selected, false); }); - test('incrementally loads photos', async () => { + // TODO(dmblack): Re-enable after branch. + test.skip('incrementally loads photos', async () => { // Set photos count returned by |wallpaperProvider|. const photosCount = 200; wallpaperProvider.setGooglePhotosCount(photosCount);
diff --git a/chrome/test/data/webui/chromeos/personalization_app/personalization_app_controller_test.ts b/chrome/test/data/webui/chromeos/personalization_app/personalization_app_controller_test.ts index 476877b..0f1e202 100644 --- a/chrome/test/data/webui/chromeos/personalization_app/personalization_app_controller_test.ts +++ b/chrome/test/data/webui/chromeos/personalization_app/personalization_app_controller_test.ts
@@ -81,8 +81,9 @@ name: 'begin_load_google_photos_photos', }, { - name: 'set_google_photos_albums', + name: 'append_google_photos_albums', albums: expectedAlbums, + resumeToken: null, }, { name: 'append_google_photos_photos', @@ -107,7 +108,7 @@ albums: undefined, photos: undefined, photosByAlbumId: {}, - resumeTokens: {photos: null}, + resumeTokens: {albums: null, photos: null}, }, }, // SET_GOOGLE_PHOTOS_COUNT. @@ -123,7 +124,7 @@ albums: undefined, photos: undefined, photosByAlbumId: {}, - resumeTokens: {photos: null}, + resumeTokens: {albums: null, photos: null}, }, }, // BEGIN_LOAD_GOOGLE_PHOTOS_ALBUMS. @@ -139,7 +140,7 @@ albums: undefined, photos: undefined, photosByAlbumId: {}, - resumeTokens: {photos: null}, + resumeTokens: {albums: null, photos: null}, }, }, // BEGIN_LOAD_GOOGLE_PHOTOS_PHOTOS. @@ -155,10 +156,10 @@ albums: undefined, photos: undefined, photosByAlbumId: {}, - resumeTokens: {photos: null}, + resumeTokens: {albums: null, photos: null}, }, }, - // SET_GOOGLE_PHOTOS_ALBUMS. + // APPEND_GOOGLE_PHOTOS_ALBUMS. { 'wallpaper.loading.googlePhotos': { count: false, @@ -171,7 +172,7 @@ albums: expectedAlbums, photos: undefined, photosByAlbumId: {}, - resumeTokens: {photos: null}, + resumeTokens: {albums: null, photos: null}, }, }, // APPEND_GOOGLE_PHOTOS_PHOTOS. @@ -187,7 +188,7 @@ albums: expectedAlbums, photos: expectedPhotos, photosByAlbumId: {}, - resumeTokens: {photos: null}, + resumeTokens: {albums: null, photos: null}, }, }, ], @@ -216,7 +217,8 @@ personalizationStore.dispatch( wallpaperAction.beginLoadGooglePhotosAlbumsAction()); personalizationStore.dispatch( - wallpaperAction.setGooglePhotosAlbumsAction([album])); + wallpaperAction.appendGooglePhotosAlbumsAction( + [album], /*resumeToken=*/ null)); personalizationStore.reset(personalizationStore.data); await fetchGooglePhotosAlbum( @@ -260,7 +262,7 @@ ], photos: undefined, photosByAlbumId: {}, - resumeTokens: {photos: null}, + resumeTokens: {albums: null, photos: null}, }, }, // SET_GOOGLE_PHOTOS_ALBUM @@ -284,7 +286,7 @@ photosByAlbumId: { [album.id]: photos, }, - resumeTokens: {photos: null}, + resumeTokens: {albums: null, photos: null}, }, }, ],
diff --git a/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts b/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts index 26ac5b8..2159b6f 100644 --- a/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts +++ b/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts
@@ -97,6 +97,7 @@ private collections_: WallpaperCollection[]|null; private images_: WallpaperImage[]|null; private googlePhotosAlbums_: GooglePhotosAlbum[]|undefined = []; + private googlePhotosAlbumsResumeToken_: string|undefined; private googlePhotosCount_: number = 0; private googlePhotosEnabled_: GooglePhotosEnablementState = GooglePhotosEnablementState.kError; @@ -141,14 +142,14 @@ return Promise.resolve({images: this.images_}); } - fetchGooglePhotosAlbums() { - this.methodCalled('fetchGooglePhotosAlbums'); + fetchGooglePhotosAlbums(resumeToken: string|null) { + this.methodCalled('fetchGooglePhotosAlbums', resumeToken); const response = new FetchGooglePhotosAlbumsResponse(); response.albums = loadTimeData.getBoolean('isGooglePhotosIntegrationEnabled') ? this.googlePhotosAlbums_ : undefined; - response.resumeToken = undefined; + response.resumeToken = this.googlePhotosAlbumsResumeToken_; return Promise.resolve({response}); } @@ -259,6 +260,11 @@ this.googlePhotosAlbums_ = googlePhotosAlbums; } + setGooglePhotosAlbumsResumeToken(googlePhotosAlbumsResumeToken: string| + undefined) { + this.googlePhotosAlbumsResumeToken_ = googlePhotosAlbumsResumeToken; + } + setGooglePhotosCount(googlePhotosCount: number) { this.googlePhotosCount_ = googlePhotosCount; } @@ -271,8 +277,9 @@ this.googlePhotosPhotos_ = googlePhotosPhotos; } - setGooglePhotosPhotosResumeToken(resumeToken: string|undefined) { - this.googlePhotosPhotosResumeToken_ = resumeToken; + setGooglePhotosPhotosResumeToken(googlePhotosPhotosResumeToken: string| + undefined) { + this.googlePhotosPhotosResumeToken_ = googlePhotosPhotosResumeToken; } setGooglePhotosPhotosByAlbumId(
diff --git a/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js b/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js index 5e032c5..fd3c826 100644 --- a/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js +++ b/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
@@ -571,7 +571,6 @@ test('LaunchDiagnostics', async function() { loadTimeData.overrideValues({ isDeepLinkingEnabled: true, - diagnosticsAppEnabled: true, }); await initNewPage(); @@ -585,7 +584,6 @@ test('Deep link to diagnostics', async () => { loadTimeData.overrideValues({ isDeepLinkingEnabled: true, - diagnosticsAppEnabled: true, }); await initNewPage();
diff --git a/chrome/test/data/webui/settings/password_edit_dialog_test.ts b/chrome/test/data/webui/settings/password_edit_dialog_test.ts index 014b788..9e816f98 100644 --- a/chrome/test/data/webui/settings/password_edit_dialog_test.ts +++ b/chrome/test/data/webui/settings/password_edit_dialog_test.ts
@@ -745,6 +745,91 @@ assertFalse(!!addDialog.shadowRoot!.querySelector('#note')); }); + test('showNoteWarningInEditModeWhen900Characters', async function() { + loadTimeData.overrideValues({enablePasswordNotes: true}); + const commonEntry = createMultiStorePasswordEntry({ + url: 'goo.gl', + username: 'bart', + accountId: 42, + note: 'a'.repeat(900), + }); + const passwordDialog = elementFactory.createPasswordEditDialog( + commonEntry, [], false, PasswordDialogMode.EDIT); + + assertEditDialogParts(passwordDialog); + const noteElement = + passwordDialog.shadowRoot!.querySelector<SettingsTextareaElement>( + '#note'); + assertEquals( + passwordDialog.i18n('passwordNoteCharacterCountWarning', 1000), + noteElement!.$.firstFooter.textContent!.trim()); + assertEquals( + passwordDialog.i18n('passwordNoteCharacterCount', 900, 1000), + noteElement!.$.secondFooter.textContent!.trim()); + assertFalse(noteElement!.invalid); + }); + + test('doNotShowNoteWarningInViewModeWhen999Characters', async function() { + loadTimeData.overrideValues({enablePasswordNotes: true}); + const commonEntry = createMultiStorePasswordEntry({ + url: 'goo.gl', + username: 'bart', + accountId: 42, + note: 'a'.repeat(999), + }); + const passwordDialog = elementFactory.createPasswordEditDialog( + commonEntry, [], false, PasswordDialogMode.PASSWORD_VIEW); + + const noteElement = + passwordDialog.shadowRoot!.querySelector<SettingsTextareaElement>( + '#note'); + assertEquals('', noteElement!.$.firstFooter.textContent!.trim()); + assertEquals('', noteElement!.$.secondFooter.textContent!.trim()); + }); + + test('disableActionButtonWhenNoteIsLargerThan1000Chars', async function() { + loadTimeData.overrideValues({enablePasswordNotes: true}); + const commonEntry = createMultiStorePasswordEntry({ + url: 'goo.gl', + username: 'bart', + accountId: 42, + note: 'a'.repeat(1001), + }); + const passwordDialog = elementFactory.createPasswordEditDialog( + commonEntry, [], false, PasswordDialogMode.EDIT); + + assertTrue(passwordDialog.$.actionButton.disabled); + assertTrue(passwordDialog.shadowRoot! + .querySelector<SettingsTextareaElement>('#note')!.invalid); + }); + + test('changingTheTextInTextareaChangesActionButtonStatus', async function() { + loadTimeData.overrideValues({enablePasswordNotes: true}); + const commonEntry = createMultiStorePasswordEntry({ + url: 'goo.gl', + username: 'bart', + accountId: 42, + note: 'a'.repeat(1000), + }); + const passwordDialog = elementFactory.createPasswordEditDialog( + commonEntry, [], false, PasswordDialogMode.EDIT); + const noteElement = + passwordDialog.shadowRoot!.querySelector<SettingsTextareaElement>( + '#note'); + + assertFalse(passwordDialog.$.actionButton.disabled); + + noteElement!.value += 'a'; + flush(); + + assertTrue(passwordDialog.$.actionButton.disabled); + + noteElement!.value = noteElement!.value.slice(0, -5); + flush(); + + assertFalse(passwordDialog.$.actionButton.disabled); + }); + // <if expr="not chromeos_ash and not chromeos_lacros"> // On ChromeOS/Lacros the behavior is different (on failure we request token // and retry).
diff --git a/chromecast/cast_core/BUILD.gn b/chromecast/cast_core/BUILD.gn index 8ef9c5e..839e9a8 100644 --- a/chromecast/cast_core/BUILD.gn +++ b/chromecast/cast_core/BUILD.gn
@@ -47,3 +47,9 @@ "//mojo/core/test:run_all_unittests", ] } + +group("cast_core_integration_test") { + testonly = true + data = [ "//chromecast/cast_core/test/" ] + data_deps = [ "//tools/perf/chrome_telemetry_build:telemetry_chrome_test" ] +}
diff --git a/chromecast/cast_core/test/__init__.py b/chromecast/cast_core/test/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chromecast/cast_core/test/__init__.py
diff --git a/chromecast/cast_core/test/cast_core_base_test.py b/chromecast/cast_core/test/cast_core_base_test.py new file mode 100644 index 0000000..975d8d7 --- /dev/null +++ b/chromecast/cast_core/test/cast_core_base_test.py
@@ -0,0 +1,176 @@ +# Copyright 2022 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import os +import sys + +from telemetry.internal.backends.chrome import cast_browser_finder +from telemetry.internal.browser import browser_finder +from telemetry.internal.platform import cast_device +from telemetry.testing import serially_executed_browser_test_case + + +class InfoCollectionTestArgs(): + """Struct-like class for passing args to an InfoCollection test.""" + + def __init__(self, expected_vendor_id_str=None, expected_device_id_strs=None): + self.gpu = None + self.expected_vendor_id_str = expected_vendor_id_str + self.expected_device_id_strs = expected_device_id_strs + + +class InfoCollectionTest( + serially_executed_browser_test_case.SeriallyExecutedBrowserTestCase): + @classmethod + def Name(cls): + return 'info_collection' + + @classmethod + def AddCommandlineArgs(cls, parser): + super(InfoCollectionTest, cls).AddCommandlineArgs(parser) + parser.add_option( + '--expected-device-id', + action='append', + dest='expected_device_ids', + default=[], + help='The expected device id. Can be specified multiple times.') + parser.add_option('--expected-vendor-id', help='The expected vendor id') + + @classmethod + def GenerateCastTests(cls, options): + yield ('InfoCollection_basic', '_', + ('_RunBasicTest', + InfoCollectionTestArgs( + expected_vendor_id_str=options.expected_vendor_id, + expected_device_id_strs=options.expected_device_ids))) + + @classmethod + def GenerateTestCases__RunCastTest(cls, options): + for test_name, url, args in cls.GenerateCastTests(options): + yield test_name, (url, test_name, args) + + @classmethod + def SetUpProcess(cls): + super(cls, InfoCollectionTest).SetUpProcess() + cls.SetBrowserOptions(cls._finder_options) + cls.StartBrowser() + cls.tab = cls.browser.tabs[0] + cls._cast_receiver_to_create.SetCastSender(cls.tab) + cls.StartCastReceiver() + cls.receiver_tab = cls.cast_receiver.tabs[0] + + @classmethod + def StartCastReceiver(cls): + try: + # TODO(crbug.com/803104): Note cls._browser_options actually is a + # FinderOptions object, and we need to access the real browser_option's + # contained inside. + cls._cast_receiver_to_create.SetUpEnvironment( + cls._browser_options.browser_options) + cls.cast_receiver = cls._cast_receiver_to_create.Create() + except Exception: + cls._cast_receiver_to_create.CleanUpEnvironment() + raise + + @classmethod + def SetBrowserOptions(cls, browser_options): + """Sets the browser option for the browser to create. + + Args: + browser_options: Browser options object for the browser we want to test. + """ + cls._browser_options = browser_options + cls._cast_receiver_to_create = browser_finder.FindBrowser(browser_options) + cls._browser_to_create = browser_finder.FindBrowser(browser_options) + cast_devices = cast_device.FindAllAvailableDevices(browser_options) + cast_browsers = [] + for device in cast_devices: + cast_browsers.extend( + cast_browser_finder.FindAllAvailableBrowsers( + browser_options, device)) + cls._cast_receiver_to_create = \ + cast_browser_finder.SelectDefaultBrowser(cast_browsers) + if not cls._browser_to_create: + raise browser_finder_exceptions.BrowserFinderException( + 'Cannot find browser of type %s. \n\nAvailable browsers:\n%s\n' % ( + browser_options.browser_options.browser_type, + '\n'.join(browser_finder.GetAllAvailableBrowserTypes( + browser_options)))) + if not cls.platform: + cls.platform = cls._browser_to_create.platform + assert cls.platform == cls._browser_to_create.platform, ( + 'All browser launches within same test suite must use browsers on ' + 'the same platform') + + @classmethod + def TearDownProcess(cls): + """ Tear down the testing logic after running the test cases. + This is guaranteed to be called only once for all the tests after the test + suite finishes running. + """ + + if cls.browser: + cls.StopBrowser() + + if cls.cast_receiver: + cls.StopCastReceiver() + + @classmethod + def StopCastReceiver(cls): + assert cls.cast_receiver, 'Cast receiver is not started' + try: + cls.cast_receiver.Close() + cls.cast_receiver = None + finally: + cls._cast_receiver_to_create.CleanUpEnvironment() + + def _RunCastTest(self, test_path, *args): + del test_path # Unused in this particular test. + + # Gather the IDs detected by the GPU process + system_info = self.cast_receiver.GetSystemInfo() + if not system_info: + self.fail("Browser doesn't support GetSystemInfo") + assert len(args[1]) == 2 + test_func = args[1][0] + test_args = args[1][1] + assert test_args.gpu is None + test_args.gpu = system_info.gpu + getattr(self, test_func)(test_args) + + ###################################### + # Helper functions for the tests below + + def _RunBasicTest(self, test_args): + device = test_args.gpu.devices[0] + if not device: + self.fail("System Info doesn't have a gpu") + + detected_vendor_id = device.vendor_id + detected_device_id = device.device_id + + # Gather the expected IDs passed on the command line + if (not test_args.expected_vendor_id_str + or not test_args.expected_device_id_strs): + self.fail('Missing --expected-[vendor|device]-id command line args') + + expected_vendor_id = int(test_args.expected_vendor_id_str, 16) + expected_device_ids = [ + int(id_str, 16) for id_str in test_args.expected_device_id_strs + ] + + # Check expected and detected GPUs match + if detected_vendor_id != expected_vendor_id: + self.fail('Vendor ID mismatch, expected %s but got %s.' % + (expected_vendor_id, detected_vendor_id)) + + if detected_device_id not in expected_device_ids: + self.fail('Device ID mismatch, expected %s but got %s.' % + (expected_device_ids, detected_device_id)) + + +def load_tests(loader, tests, pattern): + del loader, tests, pattern # Unused. + return serially_executed_browser_test_case \ + .LoadAllTestsInModule(sys.modules[__name__]) \ No newline at end of file
diff --git a/chromecast/cast_core/test/cast_project_config.py b/chromecast/cast_core/test/cast_project_config.py new file mode 100644 index 0000000..12e1aa2 --- /dev/null +++ b/chromecast/cast_core/test/cast_project_config.py
@@ -0,0 +1,16 @@ +# Copyright 2022 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import os +import sys + +CHROMIUM_SRC_DIR = os.path.realpath( + os.path.join(os.path.dirname(__file__), '..', '..')) + +sys.path.append(os.path.join(CHROMIUM_SRC_DIR, 'tools', 'perf')) +from chrome_telemetry_build import chromium_config + +CAST_TEST_DIR = os.path.join(CHROMIUM_SRC_DIR, 'chromecast', 'test') +CONFIG = chromium_config.ChromiumConfig(top_level_dir=CAST_TEST_DIR, + benchmark_dirs=[CAST_TEST_DIR]) \ No newline at end of file
diff --git a/chromecast/cast_core/test/run_cast_integration_test.py b/chromecast/cast_core/test/run_cast_integration_test.py new file mode 100755 index 0000000..2d93cfd7 --- /dev/null +++ b/chromecast/cast_core/test/run_cast_integration_test.py
@@ -0,0 +1,17 @@ +#!/usr/bin/env vpython3 +# Copyright 2022 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import cast_project_config +import sys + +from telemetry.testing import browser_test_runner + +def main(): + retval = browser_test_runner.Run(cast_project_config.CONFIG, sys.argv) + return retval + + +if __name__ == '__main__': + sys.exit(main()) \ No newline at end of file
diff --git a/chromeos/crosapi/cpp/gurl_os_handler_unittest.cc b/chromeos/crosapi/cpp/gurl_os_handler_unittest.cc index d6f5610f..6ea66f1 100644 --- a/chromeos/crosapi/cpp/gurl_os_handler_unittest.cc +++ b/chromeos/crosapi/cpp/gurl_os_handler_unittest.cc
@@ -167,6 +167,25 @@ EXPECT_EQ(GetChromeUrlFromSystemUrl(GURL("os://foo")), GURL("chrome://foo")); } +TEST(GurlOsHandlerUtilsTest, GetAshUrlFromLacrosUrl) { + // To allow the "chrome" schemer, we need to add it to the registry. + url::ScopedSchemeRegistryForTests scoped_registry; + url::AddStandardScheme("chrome", url::SCHEME_WITH_HOST); + + // os://settings need to be converted to chrome://os-settings + EXPECT_EQ(GetTargetURLFromLacrosURL(GURL("os://settings/foo")), + GURL("chrome://os-settings/foo")); + // os-settings should not be changed + EXPECT_EQ(GetTargetURLFromLacrosURL(GURL("os://os-settings")), + GURL("os://os-settings")); + // chrome://settings should also not be touched. + EXPECT_EQ(GetTargetURLFromLacrosURL(GURL("chrome://settings/foo")), + GURL("chrome://settings/foo")); + // Needs to be sanitized. + EXPECT_EQ(GetTargetURLFromLacrosURL(GURL("chrome://settings/foo#bar")), + GURL("chrome://settings/foo")); +} + } // namespace gurl_os_handler_utils } // namespace crosapi
diff --git a/chromeos/crosapi/cpp/gurl_os_handler_utils.cc b/chromeos/crosapi/cpp/gurl_os_handler_utils.cc index ba14fca..911e0fc 100644 --- a/chromeos/crosapi/cpp/gurl_os_handler_utils.cc +++ b/chromeos/crosapi/cpp/gurl_os_handler_utils.cc
@@ -16,6 +16,8 @@ const char kOsUrlPrefix[] = "os://"; const char kChromeUIScheme[] = "chrome"; const char kChromeUrlPrefix[] = "chrome://"; +const char kOsUISettingsURL[] = "os://settings"; +const char kChromeUIOSSettingsHost[] = "os-settings"; // The start of the host portion of a GURL which starts with the os scheme. const size_t kHostStart = sizeof(kOsUrlPrefix) - 1; @@ -88,6 +90,25 @@ GetValidHostAndSubhostFromOsUrl(url, include_path)); } +GURL GetTargetURLFromLacrosURL(const GURL& url) { + GURL target_url = crosapi::gurl_os_handler_utils::SanitizeAshURL(url); + GURL short_target_url = crosapi::gurl_os_handler_utils::SanitizeAshURL( + url, /*include_path=*/false); + + if (short_target_url != GURL(kOsUISettingsURL)) + return target_url; + // Change os://settings/* into chrome://os-settings/* which will be the long + // term home for our OS-settings. + + // This converts the os (GURL lib unusable) address into a chrome + // (GURL lib usable) address. + target_url = + crosapi::gurl_os_handler_utils::GetChromeUrlFromSystemUrl(target_url); + GURL::Replacements replacements; + replacements.SetHostStr(kChromeUIOSSettingsHost); + return target_url.ReplaceComponents(replacements); +} + bool IsUrlInList(const GURL& test_url, std::vector<GURL> list) { // It is assumed that the provided URL is sanitized as requested by // security at this point.
diff --git a/chromeos/crosapi/cpp/gurl_os_handler_utils.h b/chromeos/crosapi/cpp/gurl_os_handler_utils.h index 89915f5..1f7cbd5 100644 --- a/chromeos/crosapi/cpp/gurl_os_handler_utils.h +++ b/chromeos/crosapi/cpp/gurl_os_handler_utils.h
@@ -38,6 +38,10 @@ COMPONENT_EXPORT(CROSAPI) GURL SanitizeAshURL(const GURL& url, bool include_path = true); +// Get the URL which should be used by Ash from a URL passed in by Lacros. +COMPONENT_EXPORT(CROSAPI) +GURL GetTargetURLFromLacrosURL(const GURL& url); + // Determines if a given URL matches any of the given URLs in the list. // Note that the provided |url| needs to be sanitized. // Note furthermore that the passed |list| is expected to be lower case for
diff --git a/chromeos/profiles/orderfile.newest.txt b/chromeos/profiles/orderfile.newest.txt index 0c9881f..b45c2a35 100644 --- a/chromeos/profiles/orderfile.newest.txt +++ b/chromeos/profiles/orderfile.newest.txt
@@ -1 +1 @@ -chromeos-chrome-orderfile-field-101-4918.0-1646651687-benchmark-101.0.4937.0-r1.orderfile.xz +chromeos-chrome-orderfile-field-101-4928.0-1647252934-benchmark-101.0.4943.0-r1.orderfile.xz
diff --git a/chromeos/strings/chromeos_strings_az.xtb b/chromeos/strings/chromeos_strings_az.xtb index ed8e5ab..bde0bc3b 100644 --- a/chromeos/strings/chromeos_strings_az.xtb +++ b/chromeos/strings/chromeos_strings_az.xtb
@@ -52,6 +52,7 @@ <translation id="1468664791493211953">Təkliflər</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> bu cihazı idarə edir və fəaliyyətinizə nəzarət edə bilər.</translation> <translation id="1478594628797167447">Skaner</translation> +<translation id="1486019694341708158">Ekran qoruyucu seçimlərini etmək üçün keçiricini aktiv edin</translation> <translation id="1491076385728777984"><ph name="DEVICE_NAME" /> cihazında proqram güncəllənir</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> bu istifadəçini idarə edir və ayarları məsafədən idarə edə və istifadəçinin fəaliyyətini izləyə bilər.</translation> <translation id="150962533380566081">Yanlış PUK.</translation> @@ -106,6 +107,7 @@ <translation id="2105810540595158374">Cihaz oyun nizamlayıcısıdır.</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, versiya <ph name="MILESTONE_VERSION" /></translation> <translation id="2126937207024182736"><ph name="AVAILABLE_MEMORY" />/<ph name="TOTAL_MEMORY" /> GB əlçatandır</translation> +<translation id="2138109643290557664">Üzmə</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> foto</translation> <translation id="2157959690810728433">NÖVBƏDƏDİR</translation> @@ -268,6 +270,7 @@ <translation id="4271957103967917607">Tam Ekranda BAxın</translation> <translation id="4275799948641988986">Təmirdən sonra cihazdan kim istifadə edəcək?</translation> <translation id="4289540628985791613">Baxış</translation> +<translation id="4289849978083912975">Slayd şou</translation> <translation id="4297501883039923494">Dayanıb - Naməlum xəta</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> şəkil</translation> <translation id="4333390807948134856"><ph name="KEY_NAME" /> düyməsi basılıb</translation> @@ -538,10 +541,12 @@ <translation id="7175037578838465313"><ph name="NAME" /> ünvanını konfiqurasiya edin</translation> <translation id="7177485034254901881">Bu <ph name="DEVICE_TYPE" /> <ph name="MANAGER" /> tərəfindən idarə olunur. Administratorlar cihazı məsafədən konfiqurasiya edə bilər.</translation> <translation id="7180611975245234373">Yeniləyin</translation> +<translation id="7191009787982536050">Ekran qoruyucu animasiyası</translation> <translation id="7212734716605298123">Xarici cihazlar üçün proqram güncəlləmələri</translation> <translation id="7216409898977639127">Mobil provayder</translation> <translation id="7271040990581020067">Skaner hazırda istifadə olunur. Sonra cəhd edin.</translation> <translation id="7274587244503383581"><ph name="PRINTED_PAGES_NUMBER" />/<ph name="TOTAL_PAGES_NUMBER" /></translation> +<translation id="7281657306185710294">Mehi hiss edin</translation> <translation id="7287310195820267359">Divar kağızı kolleksiyaları</translation> <translation id="7297226631177386107">Alov divarı aktiv olduqda HTTPS vebsaytlarına qoşulmaq olmur</translation> <translation id="7302860742311162920">ICCID</translation>
diff --git a/chromeos/strings/chromeos_strings_be.xtb b/chromeos/strings/chromeos_strings_be.xtb index 61645f8..80c3903 100644 --- a/chromeos/strings/chromeos_strings_be.xtb +++ b/chromeos/strings/chromeos_strings_be.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">Выдаліць</translation> <translation id="1195447618553298278">Невядомая памылка.</translation> <translation id="1196959502276349371">Версія <ph name="VERSION" /></translation> +<translation id="1199355487114804640">Прайграць (прыпыніць)</translation> <translation id="1201402288615127009">Далей</translation> <translation id="1204296502688602597">Затрымка DNS</translation> <translation id="123124571410524056">Магчыма, выяўлены партал</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">Збой: фільтр не працуе</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">У мяне ёсць пара ключоў</translation> +<translation id="1423591390236870726">Клавіша "<ph name="KEY_NAME" />" не націснута</translation> <translation id="1435763214710588005">Аўтаматычна скідвае выкарыстанне трафіка штомесяц у выбраны дзень</translation> <translation id="1442433966118452622">Крыніца відарыса</translation> <translation id="1451536289672181509">Гэта клавіятура.</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">Мастацкая галерэя</translation> <translation id="1851218745569890714">Відэаканферэнцыі</translation> <translation id="1852934301711881861">Усталяваць Chrome OS Flex</translation> +<translation id="1856388568474281774">Стрэлка ўніз</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">Версія апаратнага забеспячэння</translation> <translation id="1905710495812624430">Перавышана максімальная колькасць спроб.</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">Паспрабуйце знайсці і выправіць непаладку</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">Іншыя налады</translation> +<translation id="2085089206770112532">Паменшыць яркасць дысплэя</translation> <translation id="2104796393919810494">Выпраўленне завершана</translation> <translation id="2105810540595158374">Гэта гульнявы кантролер.</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, версія <ph name="MILESTONE_VERSION" /></translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">Неабходна выбраць у мастацкай галерэі як мінімум адзін альбом</translation> <translation id="2230005943220647148">Шкала Цэльсія</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">Пераключэнне раскладкі</translation> <translation id="225692081236532131">Стан актывацыі</translation> <translation id="2287186687001756809">Відарыс недаступны. Дадаць фота можна з сайта <ph name="LINK" /></translation> <translation id="2307344026739914387">Выкарыстанне бягучай пары ключоў</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">Wi-Fi з улікам трафіка</translation> <translation id="3583278742022654445">Нізкая магутнасць сігналу. Перамясціцеся бліжэй да крыніцы сігналу Wi-Fi.</translation> <translation id="3595596368722241419">Акумулятар поўнасцю зараджаны</translation> +<translation id="3600339377155080675">Адлюстраваць экран</translation> <translation id="3603829704940252505">Аватар</translation> <translation id="360565022852130722">Сетка Wi-Fi абаронена слабым пратаколам WEP 802.1x</translation> <translation id="3606583719724308068">Высокая затрымка на вэб-сайтах HTTPS</translation> +<translation id="3632579075709132555">Пераключэнне экрана прыватнасці</translation> <translation id="3689839747745352263"><ph name="TEST_NAME" /> (праверка)</translation> <translation id="370665806235115550">Загрузка…</translation> <translation id="3708186454126126312">Падключаныя раней прылады</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">Агляд</translation> <translation id="4297501883039923494">Спынена: невядомая памылка</translation> <translation id="4300073214558989">Відарысаў: <ph name="IMAGE_COUNT" /></translation> +<translation id="4333390807948134856">Клавіша "<ph name="KEY_NAME" />" націснута</translation> <translation id="4378373042927530923">Паслядоўнасць дзеянняў не запускалася</translation> <translation id="4378551569595875038">Падключэнне...</translation> <translation id="4382484599443659549">PDF</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Не ўдалося праверыць сувязь з нестандартным сеткавым шлюзам</translation> <translation id="4485626319513081846">Выберыце гэты параметр, калі прылада адпраўляецца на склад або на аднаўленне для продажу новаму кліенту.</translation> +<translation id="4503223151711056411">Стрэлка ўлева</translation> <translation id="4511264077854731334">Партал</translation> <translation id="4521826082652183069">Супадзенне па альтэрнатыўным імені суб'екта</translation> <translation id="4536864596629708641">Канфігурацыя IP-адраса</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">Не абслугоўваецца</translation> <translation id="458794348635939462">Не ўдалося супаставіць усе хосты</translation> <translation id="4593212453765072419">Патрабуецца аўтэнтыфікацыя проксі-сервера</translation> +<translation id="4609350030397390689">Паменшыць яркасць клавіятуры</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> з <ph name="TOTAL_PAGE_NUMBER" />. Каб скасаваць заданне друку, націсніце Enter.</translation> <translation id="4627645661474370390">Аддаленае пасведчанне</translation> <translation id="463791356324567266">Сканіраванне скасоўваецца…</translation> <translation id="4646949265910132906">Бяспечнае падключэнне да сеткі Wi-Fi</translation> +<translation id="4650608062294027130">Shift справа</translation> <translation id="4654549501020883054">Змяняць штодня</translation> <translation id="4665014895760275686">Вытворца</translation> <translation id="467510802200863975">Паролі не супадаюць</translation> @@ -391,8 +402,10 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Сканіраваць паўторна</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5600027863942488546">Клавіша "<ph name="KEY_NAME" />" праверана</translation> <translation id="5620281292257375798">Для ўнутранага карыстання</translation> <translation id="5649768706273821470">Праслухаць</translation> +<translation id="5655283760733841251">Павялічыць яркасць клавіятуры</translation> <translation id="5669267381087807207">Ідзе актывацыя</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">Сям'я</translation> @@ -400,6 +413,7 @@ <translation id="5707900041990977207"><ph name="CURRENT_PAGE" /> з <ph name="TOTAL_PAGES" /></translation> <translation id="5733298426544876109">Абнавіць убудаванае ПЗ прылады "<ph name="DEVICE_NAME" />"</translation> <translation id="5760715441271661976">Стан партала</translation> +<translation id="576835345334454681">Павялічыць яркасць дысплэя</translation> <translation id="57838592816432529">Выключыць</translation> <translation id="5784136236926853061">Вялікая затрымка HTTP-запытаў</translation> <translation id="5832805196449965646">Дадаць карыстальніка</translation> @@ -430,6 +444,7 @@ <translation id="6104112872696127344">Сканіраванне скасавана</translation> <translation id="6106186594183574873">Каб закончыць, увядзіце стары пароль</translation> <translation id="6108689792487843350">Шлюз недаступны</translation> +<translation id="6113701710518389813">Стрэлка ўверх</translation> <translation id="6122191549521593678">У інтэрнэце</translation> <translation id="6137767437444130246">Сертыфікат карыстальніка</translation> <translation id="6146993107019042706">Каб закончыць, увядзіце новы пароль</translation> @@ -443,6 +458,7 @@ <translation id="6232017090690406397">Акумулятар</translation> <translation id="6235460611964961764">Скідваць выкарыстанне трафіка ўручную</translation> <translation id="6243280677745499710">Цяпер зададзеныя</translation> +<translation id="6275224645089671689">Стрэлка ўправа</translation> <translation id="6278428485366576908">Тэма</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515"><ph name="TEST_NAME" />: тэст скасаваны</translation> @@ -478,6 +494,7 @@ <translation id="6620487321149975369">Заданні друку будуць паказвацца ў гісторыі, пакуль яны не будуць выдалены ўручную</translation> <translation id="6643016212128521049">Ачысціць</translation> <translation id="6647510110698214773">Алгарытм шыфравання</translation> +<translation id="6650062777702288430">Пераключэнне паміж канай і літарна-лічбавымі сімваламі</translation> <translation id="6657585470893396449">Пароль</translation> <translation id="6659594942844771486">Укладка</translation> <translation id="6692996468359469499">Атрыманне інфармацыі, звязанай з вылучаным вамі</translation> @@ -690,6 +707,7 @@ <translation id="9122602430962285795">Каб зноў падключыцца да сеткі, перайдзіце ў Налады</translation> <translation id="9126720536733509015">Захаваць некалькі старонак у адзін PDF-файл</translation> <translation id="9137526406337347448">Сэрвісы Google</translation> +<translation id="9138630967333032450">Shift злева</translation> <translation id="9149391708638971077">Выканаць праверку памяці</translation> <translation id="9173638680043580060">Застаецца менш за хвіліну</translation> <translation id="917720651393141712">Праверыць</translation>
diff --git a/chromeos/strings/chromeos_strings_bn.xtb b/chromeos/strings/chromeos_strings_bn.xtb index 6d05e4fa4..defc61b4 100644 --- a/chromeos/strings/chromeos_strings_bn.xtb +++ b/chromeos/strings/chromeos_strings_bn.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">সরান</translation> <translation id="1195447618553298278">অজানা ত্রুটি৷</translation> <translation id="1196959502276349371">ভার্সন <ph name="VERSION" /></translation> +<translation id="1199355487114804640">প্লে/পজ করুন</translation> <translation id="1201402288615127009">পরের</translation> <translation id="1204296502688602597">ডিএনএস লেটেন্সি</translation> <translation id="123124571410524056">পোর্টাল হতে পারে</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">প্রিন্ট করা যায়নি - ফিল্টার কাজ করছে না</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">আমার কী পেয়ার আছে</translation> +<translation id="1423591390236870726"><ph name="KEY_NAME" /> কী প্রেস করা হয়নি</translation> <translation id="1435763214710588005">প্রতি মাসে বেছে নেওয়া তারিখে অটোমেটিক ডেটার ব্যবহার রিসেট করে</translation> <translation id="1442433966118452622">ছবির সোর্স</translation> <translation id="1451536289672181509">ডিভাইস একটি কীবোর্ড।</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">আর্ট গ্যালারি</translation> <translation id="1851218745569890714">ভিডিও কনফারেন্সিং</translation> <translation id="1852934301711881861">ChromeOS Flex ইনস্টল করুন</translation> +<translation id="1856388568474281774">নিম্নমুখী তীরচিহ্ন</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">হার্ডওয়্যার পুনর্বিবেচনাগুলি</translation> <translation id="1905710495812624430">সর্বোচ্চ অনুমোদিত প্রচেষ্টা ছাড়িয়ে গেছে।</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">সমস্যার সমাধান করার বিভিন্ন ধাপ অনুসরণ করে দেখুন</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">আরও সেটিংস</translation> +<translation id="2085089206770112532">ডিসপ্লে উজ্জ্বলতা কমান</translation> <translation id="2104796393919810494">রিপেয়ার হয়ে গেছে</translation> <translation id="2105810540595158374">ডিভাইস একটি গেম কন্ট্রোলার।</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, ভার্সন <ph name="MILESTONE_VERSION" /></translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">কমপক্ষে একটি আর্ট গ্যালারি অ্যালবাম বেছে নিতে হবে</translation> <translation id="2230005943220647148">সেলসিয়াস</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">লেআউট সুইচ করার বোতাম</translation> <translation id="225692081236532131">সক্রিয়করণ স্থিতি</translation> <translation id="2287186687001756809">কোনও ছবি নেই। ছবি যোগ করতে, <ph name="LINK" /> লিঙ্কে যান</translation> <translation id="2307344026739914387">বর্তমান কী পেয়ার ব্যবহার করুন</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">মিটার্ড ওয়াই-ফাই</translation> <translation id="3583278742022654445">দুর্বল সিগন্যাল। ওয়াই-ফাই সিগন্যাল সোর্সের কাছাকাছি যাওয়ার চেষ্টা করুন।</translation> <translation id="3595596368722241419">ব্যাটারি পুরো চার্জ</translation> +<translation id="3600339377155080675">স্ক্রিন শেয়ার করার বোতাম</translation> <translation id="3603829704940252505">অবতার</translation> <translation id="360565022852130722">দুর্বল WEP 802.1x প্রোটোকল ব্যবহার করে ওয়াই-ফাই নেটওয়ার্ক সুরক্ষিত করা হয়েছে</translation> <translation id="3606583719724308068">HTTPS ওয়েবসাইটে হাই লেটেন্সি</translation> +<translation id="3632579075709132555">প্রাইভেসি স্ক্রিন টগল করার বোতাম</translation> <translation id="3689839747745352263"><ph name="TEST_NAME" /> টেস্ট</translation> <translation id="370665806235115550">লোড হচ্ছে...</translation> <translation id="3708186454126126312">আগে কানেক্ট করা ছিল</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">ওভারভিউ</translation> <translation id="4297501883039923494">বন্ধ হয়ে গেছে - অজানা সমস্যা</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" />টি ছবি</translation> +<translation id="4333390807948134856"><ph name="KEY_NAME" /> কী প্রেস করা হয়েছে</translation> <translation id="4378373042927530923">চালানো যায়নি</translation> <translation id="4378551569595875038">সংযুক্ত হচ্ছে...</translation> <translation id="4382484599443659549">পিডিএফ</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">ইথারনেট</translation> <translation id="4483049906298469269">ডিফল্ট অবস্থায় নেই এমন নেটওয়ার্ক গেটওয়েতে পিং করা যায়নি</translation> <translation id="4485626319513081846">নতুন গ্রাহককে ডেলিভারি করার জন্য ডিভাইস রিস্টক বা রিফারবিশ করা হলে, এই বিকল্পটি বেছে নিন।</translation> +<translation id="4503223151711056411">বাঁদিকে তীরচিহ্ন</translation> <translation id="4511264077854731334">পোর্টাল</translation> <translation id="4521826082652183069">সাবজেক্টের বিকল্প নামের সাথে মিল আছে</translation> <translation id="4536864596629708641">IP কনফিগারেশন</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">কোনও পরিষেবা নেই</translation> <translation id="458794348635939462">সব হোস্ট নেম যাচাই করা ব্যর্থ হয়েছে</translation> <translation id="4593212453765072419">প্রক্সি প্রমাণীকরণের প্রয়োজন</translation> +<translation id="4609350030397390689">কীবোর্ড উজ্জ্বলতা কমান</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="TOTAL_PAGE_NUMBER" />টির মধ্যে <ph name="PRINTED_PAGE_NUMBER" /> নম্বর পৃষ্ঠা। প্রিন্ট করা বাতিল করতে এন্টার প্রেস করুন।</translation> <translation id="4627645661474370390">রিমোট আইডেন্টিটি</translation> <translation id="463791356324567266">স্ক্যানিং বাতিল করা হচ্ছে...</translation> <translation id="4646949265910132906">নিরাপদ ওয়াই-ফাই কানেকশন</translation> +<translation id="4650608062294027130">ডানদিকের shift কী</translation> <translation id="4654549501020883054">রোজ পরিবর্তন করুন</translation> <translation id="4665014895760275686">প্রস্তুতকর্তা</translation> <translation id="467510802200863975">পাসওয়ার্ড মিলছে না</translation> @@ -390,8 +401,10 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">আবার স্ক্যান করুন</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5600027863942488546"><ph name="KEY_NAME" /> কী পরীক্ষা করা হয়েছে</translation> <translation id="5620281292257375798">শুধুমাত্র ইন্টার্নাল</translation> <translation id="5649768706273821470">শুনুন</translation> +<translation id="5655283760733841251">কীবোর্ডের উজ্জ্বলতা বাড়ান</translation> <translation id="5669267381087807207">সক্রিয় করা হচ্ছে</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">পরিবারিক</translation> @@ -399,6 +412,7 @@ <translation id="5707900041990977207"><ph name="TOTAL_PAGES" />টির মধ্যে <ph name="CURRENT_PAGE" />নম্বর</translation> <translation id="5733298426544876109"><ph name="DEVICE_NAME" /> আপডেট করুন</translation> <translation id="5760715441271661976">পোর্টালের স্থিতি</translation> +<translation id="576835345334454681">ডিসপ্লের উজ্জ্বলতা বাড়ানোর বোতাম</translation> <translation id="57838592816432529">মিউট করুন</translation> <translation id="5784136236926853061">HTTP লেটেন্সি বেশি</translation> <translation id="5832805196449965646">একজন ব্যক্তিকে যোগ করুন</translation> @@ -429,6 +443,7 @@ <translation id="6104112872696127344">স্ক্যানিং বাতিল করা হয়েছে</translation> <translation id="6106186594183574873">সম্পূর্ণ করতে, আপনার পুরনো পাসওয়ার্ড লিখুন</translation> <translation id="6108689792487843350">নেটওয়ার্ক গেটওয়ে অ্যাক্সেস করা যাচ্ছে না</translation> +<translation id="6113701710518389813">উপরের তীরচিহ্ন</translation> <translation id="6122191549521593678">অনলাইন</translation> <translation id="6137767437444130246">ব্যবহারকারীর সার্টিফিকেট</translation> <translation id="6146993107019042706">সম্পূর্ণ করতে, আপনার নতুন পাসওয়ার্ড লিখুন</translation> @@ -442,6 +457,7 @@ <translation id="6232017090690406397">ব্যাটারি: %</translation> <translation id="6235460611964961764">ম্যানুয়ালি ডেটার ব্যবহার রিসেট করুন</translation> <translation id="6243280677745499710">বর্তমানে সেট করা রয়েছে</translation> +<translation id="6275224645089671689">ডানদিকের তীরচিহ্ন</translation> <translation id="6278428485366576908">থীম</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515"><ph name="TEST_NAME" /> পরীক্ষা বাতিল করা হয়েছে</translation> @@ -477,6 +493,7 @@ <translation id="6620487321149975369">ম্যানুয়ালি সরিয়ে না দেওয়া পর্যন্ত প্রিন্ট হওয়া কাজগুলি ইতিহাসে দেখা যাবে</translation> <translation id="6643016212128521049">সাফ করুন</translation> <translation id="6647510110698214773">এনক্রিপশন অ্যালগরিদম</translation> +<translation id="6650062777702288430">কানা/আলফানিউমেরিক সুইচ</translation> <translation id="6657585470893396449">পাসওয়ার্ড</translation> <translation id="6659594942844771486">ট্যাব</translation> <translation id="6692996468359469499">আপনার বেছে নেওয়া প্রশ্ন সম্পর্কিত উত্তর পান</translation> @@ -689,6 +706,7 @@ <translation id="9122602430962285795">আবার কানেক্ট করতে, সেটিংস বিকল্পে যান</translation> <translation id="9126720536733509015">একাধিক পৃষ্ঠা সেভ করে একটি পিডিএফ ফাইল তৈরি করুন</translation> <translation id="9137526406337347448">Google পরিসেবাসমূহ</translation> +<translation id="9138630967333032450">বাঁদিকের shift কী</translation> <translation id="9149391708638971077">মেমরি টেস্ট করুন</translation> <translation id="9173638680043580060">এক মিনিটেরও কম সময় বাকি আছে</translation> <translation id="917720651393141712">পরীক্ষা করুন</translation>
diff --git a/chromeos/strings/chromeos_strings_ca.xtb b/chromeos/strings/chromeos_strings_ca.xtb index 5ca2929b..6847fad3 100644 --- a/chromeos/strings/chromeos_strings_ca.xtb +++ b/chromeos/strings/chromeos_strings_ca.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">Suprimeix</translation> <translation id="1195447618553298278">Error desconegut.</translation> <translation id="1196959502276349371">Versió <ph name="VERSION" /></translation> +<translation id="1199355487114804640">Reprodueix / Posa en pausa</translation> <translation id="1201402288615127009">Següent</translation> <translation id="1204296502688602597">Latència de DNS</translation> <translation id="123124571410524056">Possible portal</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">Error: error en el filtre</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">Tinc un parell de claus</translation> +<translation id="1423591390236870726">No s'ha premut la tecla <ph name="KEY_NAME" /></translation> <translation id="1435763214710588005">Restableix l'ús de dades automàticament cada mes en un dia seleccionat</translation> <translation id="1442433966118452622">Font de la imatge</translation> <translation id="1451536289672181509">El dispositiu és un teclat.</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">Galeria d'art</translation> <translation id="1851218745569890714">Videoconferències</translation> <translation id="1852934301711881861">Instal·la ChromeOS Flex</translation> +<translation id="1856388568474281774">Fletxa avall</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">Revisió de maquinari</translation> <translation id="1905710495812624430">S'ha superat el nombre màxim d'intents permesos.</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">Prova els passos de resolució de problemes</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">Més opcions de configuració</translation> +<translation id="2085089206770112532">Disminueix la brillantor de la pantalla</translation> <translation id="2104796393919810494">Reparació completada</translation> <translation id="2105810540595158374">El dispositiu és un comandament de joc.</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, versió <ph name="MILESTONE_VERSION" /></translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">S'ha de seleccionar un àlbum de la galeria d'art com a mínim</translation> <translation id="2230005943220647148">Celsius</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">Canvi de disseny</translation> <translation id="225692081236532131">Estat d'activació</translation> <translation id="2287186687001756809">No hi ha cap imatge disponible. Per afegir fotos, ves a <ph name="LINK" />.</translation> <translation id="2307344026739914387">Utilitza el parell de claus actual</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">Wi‑Fi d'ús mesurat</translation> <translation id="3583278742022654445">Intensitat del senyal fluixa. Prova d'apropar-te a la font de senyal de la Wi-Fi.</translation> <translation id="3595596368722241419">Bateria carregada.</translation> +<translation id="3600339377155080675">Projecta la pantalla</translation> <translation id="3603829704940252505">Avatar</translation> <translation id="360565022852130722">La xarxa Wi-Fi està protegida amb el protocol dèbil WEP 802.1x</translation> <translation id="3606583719724308068">Latència alta als llocs web HTTPS</translation> +<translation id="3632579075709132555">Commutador de la pantalla de privadesa</translation> <translation id="3689839747745352263">Prova <ph name="TEST_NAME" /></translation> <translation id="370665806235115550">S'està carregant...</translation> <translation id="3708186454126126312">Connectats anteriorment</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">Visió general</translation> <translation id="4297501883039923494">S'ha aturat: error desconegut</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> imatges</translation> +<translation id="4333390807948134856">S'ha premut la tecla <ph name="KEY_NAME" /></translation> <translation id="4378373042927530923">No s'ha executat</translation> <translation id="4378551569595875038">Connectant...</translation> <translation id="4382484599443659549">PDF</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">No s'ha pogut fer ping a la passarel·la de xarxa no predeterminada</translation> <translation id="4485626319513081846">Selecciona aquesta opció si el dispositiu es tornarà a posar a la venda o es restaurarà per enviar-lo a un client nou.</translation> +<translation id="4503223151711056411">Fletxa esquerra</translation> <translation id="4511264077854731334">Portal</translation> <translation id="4521826082652183069">Nom alternatiu d'assumpte coincident</translation> <translation id="4536864596629708641">Configuració de la IP</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">Sense servei</translation> <translation id="458794348635939462">No s'han pogut resoldre tots els amfitrions</translation> <translation id="4593212453765072419">Cal l'autenticació del servidor intermediari</translation> +<translation id="4609350030397390689">Disminueix la brillantor del teclat</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> de <ph name="TOTAL_PAGE_NUMBER" />. Prem Retorn per cancel·lar la tasca d'impressió.</translation> <translation id="4627645661474370390">Identitat remota</translation> <translation id="463791356324567266">S'està cancel·lant l'escaneig...</translation> <translation id="4646949265910132906">Connexió Wi‑Fi segura</translation> +<translation id="4650608062294027130">Maj dreta</translation> <translation id="4654549501020883054">Canvia cada dia</translation> <translation id="4665014895760275686">Fabricant</translation> <translation id="467510802200863975">Les contrasenyes no coincideixen</translation> @@ -391,8 +402,10 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Torna a escanejar</translation> <translation id="5583640892426849032">Retrocés</translation> +<translation id="5600027863942488546">S'ha provat la tecla <ph name="KEY_NAME" /></translation> <translation id="5620281292257375798">Només intern</translation> <translation id="5649768706273821470">Escolta</translation> +<translation id="5655283760733841251">Augmenta la brillantor del teclat</translation> <translation id="5669267381087807207">Activant</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">Família</translation> @@ -400,6 +413,7 @@ <translation id="5707900041990977207"><ph name="CURRENT_PAGE" /> de <ph name="TOTAL_PAGES" /></translation> <translation id="5733298426544876109">Actualitza <ph name="DEVICE_NAME" /></translation> <translation id="5760715441271661976">Estat del portal</translation> +<translation id="576835345334454681">Augmenta la brillantor de la pantalla</translation> <translation id="57838592816432529">Silencia</translation> <translation id="5784136236926853061">La latència d'HTTP és alta</translation> <translation id="5832805196449965646">Afegeix una persona</translation> @@ -430,6 +444,7 @@ <translation id="6104112872696127344">L'escaneig s'ha cancel·lat</translation> <translation id="6106186594183574873">Per acabar, introdueix la contrasenya antiga</translation> <translation id="6108689792487843350">No es pot accedir a la passarel·la</translation> +<translation id="6113701710518389813">Fletxa amunt</translation> <translation id="6122191549521593678">En línia</translation> <translation id="6137767437444130246">Certificat d'usuari</translation> <translation id="6146993107019042706">Per acabar, introdueix la contrasenya nova</translation> @@ -443,6 +458,7 @@ <translation id="6232017090690406397">Bateria</translation> <translation id="6235460611964961764">Restableix l'ús de dades manualment</translation> <translation id="6243280677745499710">Establert actualment</translation> +<translation id="6275224645089671689">Fletxa dreta</translation> <translation id="6278428485366576908">Tema</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515">La prova <ph name="TEST_NAME" /> s'ha cancel·lat</translation> @@ -478,6 +494,7 @@ <translation id="6620487321149975369">Les tasques d'impressió es mostraran a l'historial tret que se suprimeixin manualment</translation> <translation id="6643016212128521049">Esborra</translation> <translation id="6647510110698214773">Algoritme d'encriptació</translation> +<translation id="6650062777702288430">Interruptor de caràcters kana/alfanumèrics</translation> <translation id="6657585470893396449">Contrasenya</translation> <translation id="6659594942844771486">Pestanya</translation> <translation id="6692996468359469499">Obtén informació relacionada amb la teva selecció</translation> @@ -690,6 +707,7 @@ <translation id="9122602430962285795">Per tornar-te a connectar, ves a Configuració</translation> <translation id="9126720536733509015">Desa múltiples pàgines en un PDF</translation> <translation id="9137526406337347448">Serveis de Google</translation> +<translation id="9138630967333032450">Maj esquerra</translation> <translation id="9149391708638971077">Executa la prova de memòria</translation> <translation id="9173638680043580060">Queda menys d'un minut</translation> <translation id="917720651393141712">Prova</translation>
diff --git a/chromeos/strings/chromeos_strings_cs.xtb b/chromeos/strings/chromeos_strings_cs.xtb index 76f7242..e34ccedd 100644 --- a/chromeos/strings/chromeos_strings_cs.xtb +++ b/chromeos/strings/chromeos_strings_cs.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">Odebrat</translation> <translation id="1195447618553298278">Neznámá chyba.</translation> <translation id="1196959502276349371">Verze <ph name="VERSION" /></translation> +<translation id="1199355487114804640">Přehrát/Pozastavit</translation> <translation id="1201402288615127009">Další</translation> <translation id="1204296502688602597">Latence DNS</translation> <translation id="123124571410524056">Podezření na portál</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">Tisk selhal – selhal filtr</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">Mám dvojici klíčů</translation> +<translation id="1423591390236870726">Klávesa <ph name="KEY_NAME" /> nebyla stisknuta</translation> <translation id="1435763214710588005">Automaticky resetovat využití dat každý měsíc ve vybraný den</translation> <translation id="1442433966118452622">Zdroj obrázku</translation> <translation id="1451536289672181509">Zařízení je klávesnice.</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">Galerie umění</translation> <translation id="1851218745569890714">Videokonference</translation> <translation id="1852934301711881861">Nainstalovat ChromeOS Flex</translation> +<translation id="1856388568474281774">Šipka dolů</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">Revize hardwaru</translation> <translation id="1905710495812624430">Byl překročen maximální povolený počet pokusů.</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">Vyzkoušet postup odstraňování problémů</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">Další nastavení</translation> +<translation id="2085089206770112532">Snížit jas displeje</translation> <translation id="2104796393919810494">Oprava dokončena</translation> <translation id="2105810540595158374">Zařízení je herní ovladač.</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, verze <ph name="MILESTONE_VERSION" /></translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">Je potřeba vybrat alespoň jedno album v Galerii umění</translation> <translation id="2230005943220647148">Stupně Celsia</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">Přepnout rozvržení</translation> <translation id="225692081236532131">Stav aktivace</translation> <translation id="2287186687001756809">Žádné snímky. Fotky můžete přidat na adrese <ph name="LINK" />.</translation> <translation id="2307344026739914387">Použít aktuální dvojici klíčů</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">měřená Wi-Fi</translation> <translation id="3583278742022654445">Signál je slabý. Zkuste se přesunout blíže ke zdroji signálu Wi-Fi.</translation> <translation id="3595596368722241419">Baterie je nabitá</translation> +<translation id="3600339377155080675">Zrcadlení obrazovky</translation> <translation id="3603829704940252505">Avatar</translation> <translation id="360565022852130722">Síť Wi-Fi je zabezpečena slabým protokolem WEP 802.1x</translation> <translation id="3606583719724308068">Vysoká latence připojení k webům HTTPS</translation> +<translation id="3632579075709132555">Přepínač obrazovky s ochranou soukromí</translation> <translation id="3689839747745352263">Test <ph name="TEST_NAME" /></translation> <translation id="370665806235115550">Načítání...</translation> <translation id="3708186454126126312">Dříve připojeno</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">Přehled</translation> <translation id="4297501883039923494">Zastaveno – neznámá chyba</translation> <translation id="4300073214558989">Počet obrázků: <ph name="IMAGE_COUNT" /></translation> +<translation id="4333390807948134856">Klávesa <ph name="KEY_NAME" /> byla stisknuta</translation> <translation id="4378373042927530923">Nespuštěno</translation> <translation id="4378551569595875038">Připojování...</translation> <translation id="4382484599443659549">PDF</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Nepodařilo se pingnout bránu jiné než výchozí sítě</translation> <translation id="4485626319513081846">Tuto možnost vyberte, pokud toto zařízení bude znovu nabídnuto k prodeji nebo je repasováno k distribuci novému zákazníkovi.</translation> +<translation id="4503223151711056411">Šipka vlevo</translation> <translation id="4511264077854731334">Portál</translation> <translation id="4521826082652183069">Shoda alternativních názvů subjektu</translation> <translation id="4536864596629708641">Konfigurace IP adresy</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">Žádný signál</translation> <translation id="458794348635939462">Všechny hostitele se nepodařilo vyřešit</translation> <translation id="4593212453765072419">Vyžadováno ověření proxy serveru</translation> +<translation id="4609350030397390689">Snížit jas</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> z <ph name="TOTAL_PAGE_NUMBER" />. Tiskovou úlohu zrušíte stisknutím klávesy Enter.</translation> <translation id="4627645661474370390">Vzdálená identita</translation> <translation id="463791356324567266">Rušení skenování…</translation> <translation id="4646949265910132906">Zabezpečené připojení k Wi-Fi</translation> +<translation id="4650608062294027130">Pravý Shift</translation> <translation id="4654549501020883054">Měnit denně</translation> <translation id="4665014895760275686">Výrobce</translation> <translation id="467510802200863975">Hesla se neshodují</translation> @@ -391,8 +402,10 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Naskenovat znovu</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5600027863942488546">Klávesa <ph name="KEY_NAME" /> byla vyzkoušena</translation> <translation id="5620281292257375798">Pouze pro interní použití</translation> <translation id="5649768706273821470">Poslechnout si</translation> +<translation id="5655283760733841251">Zvýšit jas</translation> <translation id="5669267381087807207">Aktivování</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">Rodina</translation> @@ -400,6 +413,7 @@ <translation id="5707900041990977207"><ph name="CURRENT_PAGE" /> z <ph name="TOTAL_PAGES" /></translation> <translation id="5733298426544876109">Aktualizovat <ph name="DEVICE_NAME" /></translation> <translation id="5760715441271661976">Stav portálu</translation> +<translation id="576835345334454681">Zvýšit jas displeje</translation> <translation id="57838592816432529">Ztlumit</translation> <translation id="5784136236926853061">Vysoká latence požadavků HTTP</translation> <translation id="5832805196449965646">Přidat uživatele</translation> @@ -430,6 +444,7 @@ <translation id="6104112872696127344">Skenování bylo zrušeno</translation> <translation id="6106186594183574873">Chcete-li akci dokončit, zadejte své staré heslo</translation> <translation id="6108689792487843350">Brána není dostupná</translation> +<translation id="6113701710518389813">Šipka nahoru</translation> <translation id="6122191549521593678">Online</translation> <translation id="6137767437444130246">Certifikát uživatele</translation> <translation id="6146993107019042706">Chcete-li akci dokončit, zadejte své nové heslo</translation> @@ -443,6 +458,7 @@ <translation id="6232017090690406397">Baterie</translation> <translation id="6235460611964961764">Využití dat resetovat ručně</translation> <translation id="6243280677745499710">Aktuálně nastaveno</translation> +<translation id="6275224645089671689">Šipka vpravo</translation> <translation id="6278428485366576908">Motiv</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515">Test <ph name="TEST_NAME" /> byl zrušen</translation> @@ -478,6 +494,7 @@ <translation id="6620487321149975369">Tiskové úlohy se budou zobrazovat v historii, pokud je ručně neodstraníte</translation> <translation id="6643016212128521049">Vymazat</translation> <translation id="6647510110698214773">Šifrovací algoritmus</translation> +<translation id="6650062777702288430">Přepínač kany/alfanumerických znaků</translation> <translation id="6657585470893396449">Heslo</translation> <translation id="6659594942844771486">Karta</translation> <translation id="6692996468359469499">Získejte informace týkající se vybraného obsahu</translation> @@ -690,6 +707,7 @@ <translation id="9122602430962285795">Pokud se chcete znovu připojit, přejděte do Nastavení</translation> <translation id="9126720536733509015">Uložit více stránek do jednoho PDF</translation> <translation id="9137526406337347448">Služby Google</translation> +<translation id="9138630967333032450">Levý Shift</translation> <translation id="9149391708638971077">Spustit test paměti</translation> <translation id="9173638680043580060">Zbývá méně než minuta</translation> <translation id="917720651393141712">Test</translation>
diff --git a/chromeos/strings/chromeos_strings_da.xtb b/chromeos/strings/chromeos_strings_da.xtb index 50fcdb6..9325bdae 100644 --- a/chromeos/strings/chromeos_strings_da.xtb +++ b/chromeos/strings/chromeos_strings_da.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">Fjern</translation> <translation id="1195447618553298278">Ukendt fejl.</translation> <translation id="1196959502276349371">Version <ph name="VERSION" /></translation> +<translation id="1199355487114804640">Afspil/sæt på pause</translation> <translation id="1201402288615127009">Næste</translation> <translation id="1204296502688602597">DNS-forsinkelse</translation> <translation id="123124571410524056">Der er muligvis en portal</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">Handlingen mislykkedes – Filterfejl</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">Jeg har et nøglepar</translation> +<translation id="1423591390236870726">Du har ikke trykket på tasten <ph name="KEY_NAME" /></translation> <translation id="1435763214710588005">Nulstiller automatisk dataforbruget hver måned på en angivet dag</translation> <translation id="1442433966118452622">Billedkilde</translation> <translation id="1451536289672181509">Enheden er et tastatur.</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">Kunstgalleri</translation> <translation id="1851218745569890714">Videomøder</translation> <translation id="1852934301711881861">Installer ChromeOS Flex</translation> +<translation id="1856388568474281774">Pil ned</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">Hardwarerevision</translation> <translation id="1905710495812624430">Det maksimale antal forsøg er overskredet.</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">Prøv fejlfindingstrinnene</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">Flere indstillinger</translation> +<translation id="2085089206770112532">Reducer skærmens lysstyrke</translation> <translation id="2104796393919810494">Reparation er fuldført</translation> <translation id="2105810540595158374">Enheden er en spilcontroller.</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, version <ph name="MILESTONE_VERSION" /></translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">Der skal vælges mindst ét album i kunstgalleriet</translation> <translation id="2230005943220647148">Celsius</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">Layoutskift</translation> <translation id="225692081236532131">Aktiveringsstatus</translation> <translation id="2287186687001756809">Der er ingen tilgængelige billeder. Du kan tilføje billeder ved at gå til <ph name="LINK" /></translation> <translation id="2307344026739914387">Brug aktuelt nøglepar</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">forbrugsafregnet Wi-Fi</translation> <translation id="3583278742022654445">Svag signalstyrke. Prøv at rykke tættere på kilden til Wi-Fi-signalet.</translation> <translation id="3595596368722241419">Batteri helt opladet</translation> +<translation id="3600339377155080675">Spejling af skærm</translation> <translation id="3603829704940252505">Avatar</translation> <translation id="360565022852130722">Wi-Fi-netværket er beskyttet med den svage protokol WEP 802.1x</translation> <translation id="3606583719724308068">Stor forsinkelse til HTTPS-websites</translation> +<translation id="3632579075709132555">Slå Privatlivsskærm til/fra</translation> <translation id="3689839747745352263">Testen <ph name="TEST_NAME" /></translation> <translation id="370665806235115550">Indlæser...</translation> <translation id="3708186454126126312">Tidligere forbundne enheder</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">Oversigt</translation> <translation id="4297501883039923494">Stoppet – Ukendt fejl</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> billeder</translation> +<translation id="4333390807948134856">Du har trykket på tasten <ph name="KEY_NAME" /></translation> <translation id="4378373042927530923">Kørte ikke</translation> <translation id="4378551569595875038">Tilslutter...</translation> <translation id="4382484599443659549">PDF</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Kunne ikke pinge gatewayen for det netværk, der ikke er angivet som standardnetværk</translation> <translation id="4485626319513081846">Vælg denne mulighed, hvis enheden sendes tilbage til lageret eller renoveres med henblik på levering til en ny kunde.</translation> +<translation id="4503223151711056411">Venstrepil</translation> <translation id="4511264077854731334">Portal</translation> <translation id="4521826082652183069">Match af alternativt emnenavn</translation> <translation id="4536864596629708641">IP-konfiguration</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">Ingen dækning</translation> <translation id="458794348635939462">Ikke alle hosts kunne identificeres</translation> <translation id="4593212453765072419">Proxygodkendelse påkrævet</translation> +<translation id="4609350030397390689">Reducer tastaturets lysstyrke</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> ud af <ph name="TOTAL_PAGE_NUMBER" />. Tryk på Enter for at annullere udskriftsjobbet.</translation> <translation id="4627645661474370390">Identitet ved fjernadgang</translation> <translation id="463791356324567266">Annullerer scanning...</translation> <translation id="4646949265910132906">Sikker Wi-Fi-forbindelse</translation> +<translation id="4650608062294027130">Shift i højre side</translation> <translation id="4654549501020883054">Skift på daglig basis</translation> <translation id="4665014895760275686">Producent</translation> <translation id="467510802200863975">Adgangskoderne stemmer ikke overens</translation> @@ -390,8 +401,10 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Scan igen</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5600027863942488546">Du har testet tasten <ph name="KEY_NAME" /></translation> <translation id="5620281292257375798">Kun internt</translation> <translation id="5649768706273821470">Lyt</translation> +<translation id="5655283760733841251">Øg tastaturets lysstyrke</translation> <translation id="5669267381087807207">Aktiverer</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">Familie</translation> @@ -399,6 +412,7 @@ <translation id="5707900041990977207"><ph name="CURRENT_PAGE" /> af <ph name="TOTAL_PAGES" /></translation> <translation id="5733298426544876109">Opdater <ph name="DEVICE_NAME" /></translation> <translation id="5760715441271661976">Tilstand for portal</translation> +<translation id="576835345334454681">Øg skærmens lysstyrke</translation> <translation id="57838592816432529">Slå lyden fra</translation> <translation id="5784136236926853061">Stor HTTP-forsinkelse</translation> <translation id="5832805196449965646">Tilføj person</translation> @@ -429,6 +443,7 @@ <translation id="6104112872696127344">Scanningen blev annulleret</translation> <translation id="6106186594183574873">Angiv din gamle adgangskode for at afslutte</translation> <translation id="6108689792487843350">Denne gateway kan ikke nås</translation> +<translation id="6113701710518389813">Pil op</translation> <translation id="6122191549521593678">Online</translation> <translation id="6137767437444130246">Brugercertifikat</translation> <translation id="6146993107019042706">Angiv din nye adgangskode for at afslutte</translation> @@ -442,6 +457,7 @@ <translation id="6232017090690406397">Batteri</translation> <translation id="6235460611964961764">Nulstil dataforbrug manuelt</translation> <translation id="6243280677745499710">Nuværende</translation> +<translation id="6275224645089671689">Højrepil</translation> <translation id="6278428485366576908">Tema</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515"><ph name="TEST_NAME" />-testen er annulleret</translation> @@ -477,6 +493,7 @@ <translation id="6620487321149975369">Udskriftsjobs vises i historikken, medmindre de fjernes manuelt</translation> <translation id="6643016212128521049">Ryd</translation> <translation id="6647510110698214773">Algoritme til kryptering</translation> +<translation id="6650062777702288430">Skift mellem kana og alfanumerisk</translation> <translation id="6657585470893396449">Adgangskode</translation> <translation id="6659594942844771486">Fane</translation> <translation id="6692996468359469499">Få oplysninger om det, du har markeret</translation> @@ -689,6 +706,7 @@ <translation id="9122602430962285795">Gå til indstillinger for at genoprette forbindelsen</translation> <translation id="9126720536733509015">Gem flere sider i én PDF-fil</translation> <translation id="9137526406337347448">Google-tjenester</translation> +<translation id="9138630967333032450">Shift i venstre side</translation> <translation id="9149391708638971077">Kør hukommelsestest</translation> <translation id="9173638680043580060">Mindre end ét minut tilbage</translation> <translation id="917720651393141712">Test</translation>
diff --git a/chromeos/strings/chromeos_strings_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb index 07eefff..3b4c13a 100644 --- a/chromeos/strings/chromeos_strings_en-GB.xtb +++ b/chromeos/strings/chromeos_strings_en-GB.xtb
@@ -52,6 +52,7 @@ <translation id="1468664791493211953">Offers</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> manages this device and may be able to monitor your activity.</translation> <translation id="1478594628797167447">Scanner</translation> +<translation id="1486019694341708158">Turn on the toggle to select the screensaver options</translation> <translation id="1491076385728777984">Updating firmware on <ph name="DEVICE_NAME" /></translation> <translation id="1499900233129743732"><ph name="MANAGER" /> manages this user and may remotely manage settings and monitor user activity.</translation> <translation id="150962533380566081">Invalid PUK.</translation> @@ -106,6 +107,7 @@ <translation id="2105810540595158374">Device is a game controller.</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, version <ph name="MILESTONE_VERSION" /></translation> <translation id="2126937207024182736"><ph name="AVAILABLE_MEMORY" /> GB of <ph name="TOTAL_MEMORY" /> GB available</translation> +<translation id="2138109643290557664">Float on by</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> photos</translation> <translation id="2157959690810728433">QUEUED</translation> @@ -268,6 +270,7 @@ <translation id="4271957103967917607">View full screen</translation> <translation id="4275799948641988986">After repair, who will be using the device?</translation> <translation id="4289540628985791613">Overview</translation> +<translation id="4289849978083912975">Slideshow</translation> <translation id="4297501883039923494">Stopped – unknown error</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> images</translation> <translation id="4333390807948134856"><ph name="KEY_NAME" /> key pressed</translation> @@ -539,10 +542,12 @@ <translation id="7175037578838465313">Configure <ph name="NAME" /></translation> <translation id="7177485034254901881">This <ph name="DEVICE_TYPE" /> is managed by <ph name="MANAGER" />. Administrators may remotely configure the device.</translation> <translation id="7180611975245234373">Refresh</translation> +<translation id="7191009787982536050">Screensaver animation</translation> <translation id="7212734716605298123">Firmware updates for external devices</translation> <translation id="7216409898977639127">Mobile provider</translation> <translation id="7271040990581020067">Scanner is currently in use. Try again later.</translation> <translation id="7274587244503383581"><ph name="PRINTED_PAGES_NUMBER" />/<ph name="TOTAL_PAGES_NUMBER" /></translation> +<translation id="7281657306185710294">Feel the breeze</translation> <translation id="7287310195820267359">Wallpaper collections</translation> <translation id="7297226631177386107">Can't connect through firewall to HTTPS websites</translation> <translation id="7302860742311162920">ICCID</translation>
diff --git a/chromeos/strings/chromeos_strings_es-419.xtb b/chromeos/strings/chromeos_strings_es-419.xtb index 0a78e9d..b86e8c56 100644 --- a/chromeos/strings/chromeos_strings_es-419.xtb +++ b/chromeos/strings/chromeos_strings_es-419.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">Quitar</translation> <translation id="1195447618553298278">Error desconocido.</translation> <translation id="1196959502276349371">Versión <ph name="VERSION" /></translation> +<translation id="1199355487114804640">Reproducir/pausar</translation> <translation id="1201402288615127009">Siguiente</translation> <translation id="1204296502688602597">Latencia de DNS</translation> <translation id="123124571410524056">Posible portal</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">Error: Problema en el filtro</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">Tengo un par de claves</translation> +<translation id="1423591390236870726">La tecla <ph name="KEY_NAME" /> no se presionó</translation> <translation id="1435763214710588005">Restablece automáticamente el uso de datos todos los meses en el día que escojas</translation> <translation id="1442433966118452622">Fuente de la imagen</translation> <translation id="1451536289672181509">El dispositivo es un teclado.</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">Galería de arte</translation> <translation id="1851218745569890714">Videoconferencias</translation> <translation id="1852934301711881861">Instalar Chrome OS Flex</translation> +<translation id="1856388568474281774">Flecha hacia abajo</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">Revisión de hardware</translation> <translation id="1905710495812624430">Se superó la cantidad máxima de intentos permitidos.</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">Probar los pasos para solucionar el problema</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">Más opciones de configuración</translation> +<translation id="2085089206770112532">Disminuir el brillo de la pantalla</translation> <translation id="2104796393919810494">Se completó la reparación</translation> <translation id="2105810540595158374">El dispositivo es un control de juegos.</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, versión <ph name="MILESTONE_VERSION" /></translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">Debes seleccionar al menos un álbum de Galería de arte.</translation> <translation id="2230005943220647148">Celsius</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">Cambiar diseño</translation> <translation id="225692081236532131">Estado de activación</translation> <translation id="2287186687001756809">No hay imágenes disponibles. Para agregar fotos, ve a <ph name="LINK" />.</translation> <translation id="2307344026739914387">Usar el par de claves actual</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">Wi-Fi de uso medido</translation> <translation id="3583278742022654445">La intensidad de la señal es débil. Intenta acercarte a la fuente de la señal Wi-Fi.</translation> <translation id="3595596368722241419">Batería completa</translation> +<translation id="3600339377155080675">Espejo de pantalla</translation> <translation id="3603829704940252505">Avatar</translation> <translation id="360565022852130722">la red Wi-Fi está protegida con el protocolo WEP 802.1x (poco seguro)</translation> <translation id="3606583719724308068">Alta latencia de los sitios web HTTPS</translation> +<translation id="3632579075709132555">Activar o desactivar la Pantalla de privacidad</translation> <translation id="3689839747745352263">Prueba de <ph name="TEST_NAME" /></translation> <translation id="370665806235115550">Cargando...</translation> <translation id="3708186454126126312">Conectados anteriormente</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">Descripción general</translation> <translation id="4297501883039923494">Se detuvo: error desconocido</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> Imágenes</translation> +<translation id="4333390807948134856">La tecla <ph name="KEY_NAME" /> está presionada</translation> <translation id="4378373042927530923">No se ejecutó la rutina</translation> <translation id="4378551569595875038">Conectando…</translation> <translation id="4382484599443659549">PDF</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">no se pudo hacer ping en la puerta de enlace de la red no predeterminada</translation> <translation id="4485626319513081846">Selecciona esta opción si el dispositivo es parte de una reposición o se reacondicionó para distribuirse a un cliente nuevo.</translation> +<translation id="4503223151711056411">Flecha hacia la izquierda</translation> <translation id="4511264077854731334">Portal</translation> <translation id="4521826082652183069">Coincidencia del nombre alternativo del sujeto</translation> <translation id="4536864596629708641">Configuración de IP</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">Sin servicio</translation> <translation id="458794348635939462">no se pudieron resolver todos los hosts</translation> <translation id="4593212453765072419">Se requiere autenticación proxy.</translation> +<translation id="4609350030397390689">Disminuir el brillo del teclado</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> de un total de <ph name="TOTAL_PAGE_NUMBER" />. Presiona Intro para cancelar el trabajo de impresión.</translation> <translation id="4627645661474370390">Identidad remota</translation> <translation id="463791356324567266">Cancelando el escaneo…</translation> <translation id="4646949265910132906">Conexión Wi-Fi segura</translation> +<translation id="4650608062294027130">Mayúsculas derecha</translation> <translation id="4654549501020883054">Cambiar a diario</translation> <translation id="4665014895760275686">Fabricante</translation> <translation id="467510802200863975">Las contraseñas no coinciden</translation> @@ -391,8 +402,10 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Volver a escanear</translation> <translation id="5583640892426849032">Tecla de retroceso</translation> +<translation id="5600027863942488546">Se probó la tecla <ph name="KEY_NAME" /></translation> <translation id="5620281292257375798">Solo para uso interno</translation> <translation id="5649768706273821470">Escuchar</translation> +<translation id="5655283760733841251">Aumentar el brillo del teclado</translation> <translation id="5669267381087807207">Activando</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">Familia</translation> @@ -400,6 +413,7 @@ <translation id="5707900041990977207"><ph name="CURRENT_PAGE" /> de <ph name="TOTAL_PAGES" /></translation> <translation id="5733298426544876109">Actualizar <ph name="DEVICE_NAME" /></translation> <translation id="5760715441271661976">Estado del portal</translation> +<translation id="576835345334454681">Aumentar el brillo de la pantalla</translation> <translation id="57838592816432529">Silenciar</translation> <translation id="5784136236926853061">Latencia de HTTP alta</translation> <translation id="5832805196449965646">Agregar a una persona</translation> @@ -430,6 +444,7 @@ <translation id="6104112872696127344">Se canceló el escaneo</translation> <translation id="6106186594183574873">Para finalizar, ingresa tu contraseña anterior</translation> <translation id="6108689792487843350">no se puede acceder a la puerta de enlace</translation> +<translation id="6113701710518389813">Flecha hacia arriba</translation> <translation id="6122191549521593678">En línea</translation> <translation id="6137767437444130246">Certificado del usuario</translation> <translation id="6146993107019042706">Para finalizar, ingresa tu nueva contraseña</translation> @@ -443,6 +458,7 @@ <translation id="6232017090690406397">Batería</translation> <translation id="6235460611964961764">Restablecer el uso de datos manualmente</translation> <translation id="6243280677745499710">Establecido actualmente</translation> +<translation id="6275224645089671689">Flecha hacia la derecha</translation> <translation id="6278428485366576908">Tema</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515">Se canceló la prueba de <ph name="TEST_NAME" /></translation> @@ -478,6 +494,7 @@ <translation id="6620487321149975369">Los trabajos de impresión aparecerán en el historial, a menos que se quiten manualmente</translation> <translation id="6643016212128521049">Borrar</translation> <translation id="6647510110698214773">Algoritmo de encriptación</translation> +<translation id="6650062777702288430">Alternar entre teclados kana y alfanumérico</translation> <translation id="6657585470893396449">Contraseña</translation> <translation id="6659594942844771486">Pestaña</translation> <translation id="6692996468359469499">Obtén información relacionada con tu selección</translation> @@ -690,6 +707,7 @@ <translation id="9122602430962285795">Para restablecer la conexión, ve a Configuración</translation> <translation id="9126720536733509015">Guardar varias páginas en un PDF</translation> <translation id="9137526406337347448">Servicios de Google</translation> +<translation id="9138630967333032450">Mayúsculas izquierda</translation> <translation id="9149391708638971077">Ejecutar prueba de memoria</translation> <translation id="9173638680043580060">Queda menos de un minuto</translation> <translation id="917720651393141712">Probar</translation>
diff --git a/chromeos/strings/chromeos_strings_es.xtb b/chromeos/strings/chromeos_strings_es.xtb index 74abf3a0..91d28a7 100644 --- a/chromeos/strings/chromeos_strings_es.xtb +++ b/chromeos/strings/chromeos_strings_es.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">Quitar</translation> <translation id="1195447618553298278">Error desconocido.</translation> <translation id="1196959502276349371">Versión <ph name="VERSION" /></translation> +<translation id="1199355487114804640">Reproducir/Pausar</translation> <translation id="1201402288615127009">Siguiente</translation> <translation id="1204296502688602597">Latencia de DNS</translation> <translation id="123124571410524056">Posible portal</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">No se ha podido imprimir - Error de filtro</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">Tengo un par de claves</translation> +<translation id="1423591390236870726">Tecla <ph name="KEY_NAME" /> no pulsada</translation> <translation id="1435763214710588005">Reinicia automáticamente el uso de datos cada mes en el día seleccionado</translation> <translation id="1442433966118452622">Fuente de la imagen</translation> <translation id="1451536289672181509">El dispositivo es un teclado.</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">Galería de arte</translation> <translation id="1851218745569890714">Videoconferencias</translation> <translation id="1852934301711881861">Instalar ChromeOS Flex</translation> +<translation id="1856388568474281774">Flecha hacia abajo</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">Revisión de hardware</translation> <translation id="1905710495812624430">Se ha superado el máximo de intentos permitidos.</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">Sigue los pasos para solucionar el problema</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">Más ajustes</translation> +<translation id="2085089206770112532">Reducir el brillo de la pantalla</translation> <translation id="2104796393919810494">Reparación completada</translation> <translation id="2105810540595158374">El dispositivo es un mando de juegos.</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, versión <ph name="MILESTONE_VERSION" /></translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">Debes seleccionar al menos un álbum de la galería de arte</translation> <translation id="2230005943220647148">Celsius</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">Cambiar diseño</translation> <translation id="225692081236532131">Estado de la activación</translation> <translation id="2287186687001756809">No hay imágenes disponibles. Para añadir fotos, accede a <ph name="LINK" /></translation> <translation id="2307344026739914387">Usar par de claves actual</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">Wi‑Fi de uso medido</translation> <translation id="3583278742022654445">Intensidad de la señal débil. Acércate a la fuente de la señal Wi-Fi.</translation> <translation id="3595596368722241419">Batería al máximo</translation> +<translation id="3600339377155080675">Proyectar pantalla</translation> <translation id="3603829704940252505">Avatar</translation> <translation id="360565022852130722">La red Wi-Fi está protegida con un protocolo poco seguro WEP 802.1x</translation> <translation id="3606583719724308068">Latencia alta a sitios web HTTPS</translation> +<translation id="3632579075709132555">Activar o desactivar Pantalla de privacidad</translation> <translation id="3689839747745352263">Prueba <ph name="TEST_NAME" /></translation> <translation id="370665806235115550">Cargando...</translation> <translation id="3708186454126126312">Conectados anteriormente</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">Vista general</translation> <translation id="4297501883039923494">Detenido: error desconocido</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> imágenes</translation> +<translation id="4333390807948134856">Tecla <ph name="KEY_NAME" /> pulsada</translation> <translation id="4378373042927530923">Sin ejecutar</translation> <translation id="4378551569595875038">Conectando...</translation> <translation id="4382484599443659549">PDF</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Se ha producido un error al hacer ping en la puerta de enlace de red no predeterminada</translation> <translation id="4485626319513081846">Selecciona esta opción si el dispositivo se va a aprovisionar o a reacondicionar para entregárselo a un nuevo cliente.</translation> +<translation id="4503223151711056411">Flecha hacia la izquierda</translation> <translation id="4511264077854731334">Portal</translation> <translation id="4521826082652183069">Coincidencia de nombre alternativo del sujeto</translation> <translation id="4536864596629708641">Configuración de IP</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">Sin servicio</translation> <translation id="458794348635939462">No se han podido resolver todos los hosts</translation> <translation id="4593212453765072419">Se requiere autenticación de proxy</translation> +<translation id="4609350030397390689">Reducir el brillo del teclado</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> de <ph name="TOTAL_PAGE_NUMBER" />. Pulsa Intro para cancelar el trabajo de impresión.</translation> <translation id="4627645661474370390">Identidad remota</translation> <translation id="463791356324567266">Cancelando escaneado...</translation> <translation id="4646949265910132906">Conexión Wi‑Fi segura</translation> +<translation id="4650608062294027130">Mayús derecha</translation> <translation id="4654549501020883054">Cambiar a diario</translation> <translation id="4665014895760275686">Fabricante</translation> <translation id="467510802200863975">Las contraseñas no coinciden</translation> @@ -390,8 +401,10 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Escanear de nuevo</translation> <translation id="5583640892426849032">Tecla de retroceso</translation> +<translation id="5600027863942488546">Tecla <ph name="KEY_NAME" /> probada</translation> <translation id="5620281292257375798">Solo para uso interno</translation> <translation id="5649768706273821470">Escuchar</translation> +<translation id="5655283760733841251">Aumentar el brillo del teclado</translation> <translation id="5669267381087807207">Activando</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">Familia</translation> @@ -399,6 +412,7 @@ <translation id="5707900041990977207"><ph name="CURRENT_PAGE" /> de <ph name="TOTAL_PAGES" /></translation> <translation id="5733298426544876109">Actualizar <ph name="DEVICE_NAME" /></translation> <translation id="5760715441271661976">Estado de portal</translation> +<translation id="576835345334454681">Aumentar el brillo de la pantalla</translation> <translation id="57838592816432529">Silenciar</translation> <translation id="5784136236926853061">Latencia de HTTP alta</translation> <translation id="5832805196449965646">Añadir perfil</translation> @@ -429,6 +443,7 @@ <translation id="6104112872696127344">Se ha cancelado el análisis</translation> <translation id="6106186594183574873">Para finalizar, introduce tu contraseña anterior</translation> <translation id="6108689792487843350">No se puede acceder a la puerta de enlace</translation> +<translation id="6113701710518389813">Flecha hacia arriba</translation> <translation id="6122191549521593678">Online</translation> <translation id="6137767437444130246">Certificado de usuario</translation> <translation id="6146993107019042706">Para finalizar, introduce tu contraseña nueva</translation> @@ -442,6 +457,7 @@ <translation id="6232017090690406397">Batería</translation> <translation id="6235460611964961764">Reiniciar uso de datos manualmente</translation> <translation id="6243280677745499710">Establecido actualmente</translation> +<translation id="6275224645089671689">Flecha hacia la derecha</translation> <translation id="6278428485366576908">Tema</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515">La prueba <ph name="TEST_NAME" /> se ha cancelado</translation> @@ -477,6 +493,7 @@ <translation id="6620487321149975369">Los trabajos de impresión aparecerán en el historial a menos que se quiten de forma manual</translation> <translation id="6643016212128521049">Borrar</translation> <translation id="6647510110698214773">Algoritmo de cifrado</translation> +<translation id="6650062777702288430">Alternar entre kana y alfanumérico</translation> <translation id="6657585470893396449">Contraseña</translation> <translation id="6659594942844771486">Pestaña</translation> <translation id="6692996468359469499">Obtener información sobre tu selección</translation> @@ -689,6 +706,7 @@ <translation id="9122602430962285795">Para volver a conectarte la red, ve a Configuración</translation> <translation id="9126720536733509015">Guardar varias páginas en un PDF</translation> <translation id="9137526406337347448">Servicios de Google</translation> +<translation id="9138630967333032450">Mayús izquierda</translation> <translation id="9149391708638971077">Realizar prueba de memoria</translation> <translation id="9173638680043580060">Queda menos de 1 minuto</translation> <translation id="917720651393141712">Prueba</translation>
diff --git a/chromeos/strings/chromeos_strings_fr-CA.xtb b/chromeos/strings/chromeos_strings_fr-CA.xtb index 823ea16..65b8cef 100644 --- a/chromeos/strings/chromeos_strings_fr-CA.xtb +++ b/chromeos/strings/chromeos_strings_fr-CA.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">Supprimer</translation> <translation id="1195447618553298278">Erreur inconnue.</translation> <translation id="1196959502276349371">Version <ph name="VERSION" /></translation> +<translation id="1199355487114804640">Lecture/Mise en pause</translation> <translation id="1201402288615127009">Suivant</translation> <translation id="1204296502688602597">Latence DNS</translation> <translation id="123124571410524056">Un portail semble activé</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">Échec : problème de filtre</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">J'ai une biclé</translation> +<translation id="1423591390236870726">Touche <ph name="KEY_NAME" /> non enfoncée</translation> <translation id="1435763214710588005">Réinitialise automatiquement l'utilisation de données tous les mois à un jour défini</translation> <translation id="1442433966118452622">Source de l'image</translation> <translation id="1451536289672181509">L'appareil est un clavier.</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">Galerie d'art</translation> <translation id="1851218745569890714">Vidéoconférence</translation> <translation id="1852934301711881861">Installer Chrome OS Flex</translation> +<translation id="1856388568474281774">Flèche vers le bas</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">Révision du matériel</translation> <translation id="1905710495812624430">Nombre maximal autorisé de tentatives atteint.</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">Essayer les étapes de dépannage</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">Plus de paramètres</translation> +<translation id="2085089206770112532">Diminuer la luminosité de l'écran</translation> <translation id="2104796393919810494">Réparation terminée</translation> <translation id="2105810540595158374">L'appareil est une manette de jeu.</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, version <ph name="MILESTONE_VERSION" /></translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">Vous devez sélectionner au moins un album de galerie d'art</translation> <translation id="2230005943220647148">Celsius</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">Commutateur de la disposition du clavier</translation> <translation id="225692081236532131">État de l'activation</translation> <translation id="2287186687001756809">Aucune image proposée. Pour ajouter des photos, accédez au site <ph name="LINK" /></translation> <translation id="2307344026739914387">Utiliser la biclé actuelle</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">réseau Wi-Fi mesuré</translation> <translation id="3583278742022654445">Faible puissance du signal. Essayez de vous rapprocher de la source du signal Wi-Fi.</translation> <translation id="3595596368722241419">Batterie entièrement chargée</translation> +<translation id="3600339377155080675">Duplication d'écran</translation> <translation id="3603829704940252505">Avatar</translation> <translation id="360565022852130722">Le réseau Wi-Fi est sécurisé par un protocole faible : WEP 802.1x</translation> <translation id="3606583719724308068">Latence élevée pour les sites Web utilisant le protocole HTTPS</translation> +<translation id="3632579075709132555">Commutateur de l'écran de confidentialité</translation> <translation id="3689839747745352263">Test <ph name="TEST_NAME" /></translation> <translation id="370665806235115550">Chargement en cours...</translation> <translation id="3708186454126126312">Connectés précédemment</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">Aperçu</translation> <translation id="4297501883039923494">Tâche arrêtée : erreur inconnue</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> images</translation> +<translation id="4333390807948134856">Touche <ph name="KEY_NAME" /> enfoncée</translation> <translation id="4378373042927530923">Routine non exécutée</translation> <translation id="4378551569595875038">Connexion...</translation> <translation id="4382484599443659549">PDF</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Impossible d'effectuer un ping avec la passerelle réseau autre que celle par défaut</translation> <translation id="4485626319513081846">Sélectionnez cette option si l'appareil est de nouveau en stock ou s'il est remis à neuf pour être distribué à un nouveau client.</translation> +<translation id="4503223151711056411">Flèche vers la gauche</translation> <translation id="4511264077854731334">Portail</translation> <translation id="4521826082652183069">Correspondance du nom alternatif du sujet</translation> <translation id="4536864596629708641">Configuration de l'adresse IP</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">Aucun service</translation> <translation id="458794348635939462">Impossible de résoudre tous les hôtes</translation> <translation id="4593212453765072419">Authentification requise du mandataire</translation> +<translation id="4609350030397390689">Diminuer la luminosité du clavier</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> sur <ph name="TOTAL_PAGE_NUMBER" />. Appuyez sur Entrée pour annuler la tâche d'impression.</translation> <translation id="4627645661474370390">Identité distante</translation> <translation id="463791356324567266">Annulation de la numérisation en cours…</translation> <translation id="4646949265910132906">Connexion Wi-Fi sécurisée</translation> +<translation id="4650608062294027130">Majuscule droite</translation> <translation id="4654549501020883054">Changer tous les jours</translation> <translation id="4665014895760275686">Fabricant</translation> <translation id="467510802200863975">Les mots de passe ne correspondent pas</translation> @@ -391,8 +402,10 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Numériser de nouveau</translation> <translation id="5583640892426849032">Effacement arrière</translation> +<translation id="5600027863942488546">Touche <ph name="KEY_NAME" /> testée</translation> <translation id="5620281292257375798">Pour usage interne seulement</translation> <translation id="5649768706273821470">Écouter</translation> +<translation id="5655283760733841251">Augmenter la luminosité du clavier</translation> <translation id="5669267381087807207">Activation…</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">Famille</translation> @@ -400,6 +413,7 @@ <translation id="5707900041990977207"><ph name="CURRENT_PAGE" /> sur <ph name="TOTAL_PAGES" /></translation> <translation id="5733298426544876109">Mettre à jour <ph name="DEVICE_NAME" /></translation> <translation id="5760715441271661976">État du portail</translation> +<translation id="576835345334454681">Augmenter la luminosité de l'écran</translation> <translation id="57838592816432529">Désactiver le son</translation> <translation id="5784136236926853061">Latence HTTP élevée</translation> <translation id="5832805196449965646">Ajouter une personne</translation> @@ -430,6 +444,7 @@ <translation id="6104112872696127344">La numérisation a été annulée</translation> <translation id="6106186594183574873">Pour terminer cette opération, entrez votre ancien mot de passe</translation> <translation id="6108689792487843350">Impossible d'atteindre la passerelle</translation> +<translation id="6113701710518389813">Flèche vers le haut</translation> <translation id="6122191549521593678">En ligne</translation> <translation id="6137767437444130246">Certificat utilisateur</translation> <translation id="6146993107019042706">Pour terminer cette opération, entrez votre nouveau mot de passe</translation> @@ -443,6 +458,7 @@ <translation id="6232017090690406397">Pile</translation> <translation id="6235460611964961764">Réinitialiser manuellement l'utilisation de données</translation> <translation id="6243280677745499710">Fond d'écran actuel</translation> +<translation id="6275224645089671689">Flèche vers la droite</translation> <translation id="6278428485366576908">Thème</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515">Le test <ph name="TEST_NAME" /> a été annulé</translation> @@ -478,6 +494,7 @@ <translation id="6620487321149975369">Les tâches d'impression s'afficheront dans l'historique, sauf si vous les retirez manuellement</translation> <translation id="6643016212128521049">Effacer</translation> <translation id="6647510110698214773">Algorithme de chiffrement</translation> +<translation id="6650062777702288430">Commutateur Kana/alphanumérique</translation> <translation id="6657585470893396449">Mot de passe</translation> <translation id="6659594942844771486">Onglet</translation> <translation id="6692996468359469499">Obtenir de l'information sur votre sélection</translation> @@ -690,6 +707,7 @@ <translation id="9122602430962285795">Pour vous reconnecter, accédez à Paramètres</translation> <translation id="9126720536733509015">Enregistrer plusieurs pages en un seul PDF</translation> <translation id="9137526406337347448">Services Google</translation> +<translation id="9138630967333032450">Majuscule gauche</translation> <translation id="9149391708638971077">Exécuter le test de mémoire</translation> <translation id="9173638680043580060">Il reste moins d'une minute</translation> <translation id="917720651393141712">Test</translation>
diff --git a/chromeos/strings/chromeos_strings_fr.xtb b/chromeos/strings/chromeos_strings_fr.xtb index 3bc9a63..de11b304 100644 --- a/chromeos/strings/chromeos_strings_fr.xtb +++ b/chromeos/strings/chromeos_strings_fr.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">Supprimer</translation> <translation id="1195447618553298278">Erreur inconnue</translation> <translation id="1196959502276349371">Version <ph name="VERSION" /></translation> +<translation id="1199355487114804640">Lecture/Pause</translation> <translation id="1201402288615127009">Suivant</translation> <translation id="1204296502688602597">Latence avec le DNS</translation> <translation id="123124571410524056">Un portail semble activé</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">Échec – Problème au niveau du filtre</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">J'ai une paire de clés</translation> +<translation id="1423591390236870726">Touche <ph name="KEY_NAME" /> non appuyée</translation> <translation id="1435763214710588005">Réinitialise automatiquement la consommation des données chaque mois, le jour sélectionné</translation> <translation id="1442433966118452622">Source de l'image</translation> <translation id="1451536289672181509">L'appareil est un clavier.</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">Galerie d'art</translation> <translation id="1851218745569890714">Visioconférence</translation> <translation id="1852934301711881861">Installer Chrome OS Flex</translation> +<translation id="1856388568474281774">Flèche vers le bas</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">Version du matériel</translation> <translation id="1905710495812624430">Vous avez atteint le nombre maximal autorisé de tentatives.</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">Essayer la procédure de dépannage</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">Plus de paramètres</translation> +<translation id="2085089206770112532">Baisser la luminosité de l'écran</translation> <translation id="2104796393919810494">Réparation terminée</translation> <translation id="2105810540595158374">L'appareil est une manette de jeu.</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, version <ph name="MILESTONE_VERSION" /></translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">Vous devez sélectionner au moins un album de la galerie d'art</translation> <translation id="2230005943220647148">Celsius</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">Changer de disposition</translation> <translation id="225692081236532131">État d'activation</translation> <translation id="2287186687001756809">Aucune image disponible. Pour ajouter des photos, accédez à <ph name="LINK" /></translation> <translation id="2307344026739914387">Utiliser la paire de clés actuelle</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">Wi-Fi facturé à l'usage</translation> <translation id="3583278742022654445">Signal faible. Rapprochez-vous de la source du signal Wi-Fi.</translation> <translation id="3595596368722241419">Batterie pleine</translation> +<translation id="3600339377155080675">Duplication d'écran</translation> <translation id="3603829704940252505">Avatar</translation> <translation id="360565022852130722">Le réseau Wi-Fi est protégé par le protocole peu sécurisé WEP 802.1x</translation> <translation id="3606583719724308068">Latence élevée avec les sites HTTPS</translation> +<translation id="3632579075709132555">Activer/Désactiver l'écran de confidentialité</translation> <translation id="3689839747745352263">Test de <ph name="TEST_NAME" /></translation> <translation id="370665806235115550">Chargement en cours...</translation> <translation id="3708186454126126312">Connectés précédemment</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">Présentation</translation> <translation id="4297501883039923494">Tâche suspendue - Erreur inconnue</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> images</translation> +<translation id="4333390807948134856">Touche <ph name="KEY_NAME" /> appuyée</translation> <translation id="4378373042927530923">Non exécuté</translation> <translation id="4378551569595875038">Connexion</translation> <translation id="4382484599443659549">PDF</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">Ethernet </translation> <translation id="4483049906298469269">Impossible de pinguer la passerelle du réseau non défini par défaut</translation> <translation id="4485626319513081846">Sélectionnez cette option si l'appareil est remis en stock ou reconditionné pour être distribué à un nouveau client.</translation> +<translation id="4503223151711056411">Flèche vers la gauche</translation> <translation id="4511264077854731334">Portail</translation> <translation id="4521826082652183069">Correspondance de l'autre nom de l'objet</translation> <translation id="4536864596629708641">Configuration IP</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">Aucun service</translation> <translation id="458794348635939462">Impossible de résoudre tous les hôtes</translation> <translation id="4593212453765072419">L'authentification du proxy est requise.</translation> +<translation id="4609350030397390689">Baisser la luminosité du clavier</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> sur <ph name="TOTAL_PAGE_NUMBER" />. Appuyez sur Entrée pour annuler la tâche d'impression.</translation> <translation id="4627645661474370390">Identité à distance</translation> <translation id="463791356324567266">Annulation de la numérisation…</translation> <translation id="4646949265910132906">Connexion Wi-Fi sécurisée</translation> +<translation id="4650608062294027130">Maj droite</translation> <translation id="4654549501020883054">Modifier tous les jours</translation> <translation id="4665014895760275686">Fabricant</translation> <translation id="467510802200863975">Les mots de passe sont différents</translation> @@ -391,8 +402,10 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Rescanner</translation> <translation id="5583640892426849032">Retour</translation> +<translation id="5600027863942488546">Touche <ph name="KEY_NAME" /> testée</translation> <translation id="5620281292257375798">Interne uniquement</translation> <translation id="5649768706273821470">Écouter</translation> +<translation id="5655283760733841251">Augmenter la luminosité du clavier</translation> <translation id="5669267381087807207">Activation</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">Famille</translation> @@ -400,6 +413,7 @@ <translation id="5707900041990977207"><ph name="CURRENT_PAGE" /> sur <ph name="TOTAL_PAGES" /></translation> <translation id="5733298426544876109">Mettre à jour <ph name="DEVICE_NAME" /></translation> <translation id="5760715441271661976">État du portail</translation> +<translation id="576835345334454681">Augmenter la luminosité de l'écran</translation> <translation id="57838592816432529">Couper le son</translation> <translation id="5784136236926853061">Latence HTTP élevée</translation> <translation id="5832805196449965646">Ajouter une personne</translation> @@ -430,6 +444,7 @@ <translation id="6104112872696127344">Numérisation annulée</translation> <translation id="6106186594183574873">Pour terminer, saisissez votre ancien mot de passe</translation> <translation id="6108689792487843350">Passerelle injoignable</translation> +<translation id="6113701710518389813">Flèche vers le haut</translation> <translation id="6122191549521593678">En ligne</translation> <translation id="6137767437444130246">Certificat utilisateur</translation> <translation id="6146993107019042706">Pour terminer, saisissez votre nouveau mot de passe</translation> @@ -443,6 +458,7 @@ <translation id="6232017090690406397">Batterie</translation> <translation id="6235460611964961764">Réinitialiser manuellement la consommation des données</translation> <translation id="6243280677745499710">Actuellement défini</translation> +<translation id="6275224645089671689">Flèche vers la droite</translation> <translation id="6278428485366576908">Thème</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515">Le test <ph name="TEST_NAME" /> a été annulé</translation> @@ -478,6 +494,7 @@ <translation id="6620487321149975369">Les tâches d'impression seront incluses dans l'historique, sauf si vous les supprimez manuellement</translation> <translation id="6643016212128521049">Effacer</translation> <translation id="6647510110698214773">Algorithme de chiffrement</translation> +<translation id="6650062777702288430">Bascule kana/alphanumérique</translation> <translation id="6657585470893396449">Mot de passe</translation> <translation id="6659594942844771486">Onglet</translation> <translation id="6692996468359469499">Obtenir des informations sur votre sélection</translation> @@ -690,6 +707,7 @@ <translation id="9122602430962285795">Pour vous reconnecter, accédez à Paramètres</translation> <translation id="9126720536733509015">Enregistrer plusieurs pages en un seul PDF</translation> <translation id="9137526406337347448">Google Services</translation> +<translation id="9138630967333032450">Maj gauche</translation> <translation id="9149391708638971077">Lancer le test de mémoire</translation> <translation id="9173638680043580060">Moins d'une minute restante</translation> <translation id="917720651393141712">Tester</translation>
diff --git a/chromeos/strings/chromeos_strings_gl.xtb b/chromeos/strings/chromeos_strings_gl.xtb index ba6a2c1..f3bf0dd1 100644 --- a/chromeos/strings/chromeos_strings_gl.xtb +++ b/chromeos/strings/chromeos_strings_gl.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">Eliminar</translation> <translation id="1195447618553298278">Erro descoñecido.</translation> <translation id="1196959502276349371">Versión <ph name="VERSION" /></translation> +<translation id="1199355487114804640">Reproducir/Pór en pausa</translation> <translation id="1201402288615127009">Seguinte</translation> <translation id="1204296502688602597">Latencia de DNS</translation> <translation id="123124571410524056">Posible portal</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">Produciuse un erro: fallo no filtro</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">Teño un par de claves</translation> +<translation id="1423591390236870726">Tecla <ph name="KEY_NAME" /> sen premer</translation> <translation id="1435763214710588005">Restablece automaticamente o uso de datos todos os meses nun día seleccionado</translation> <translation id="1442433966118452622">Fonte da imaxe</translation> <translation id="1451536289672181509">O dispositivo é un teclado.</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">Galería de arte</translation> <translation id="1851218745569890714">Videoconferencias</translation> <translation id="1852934301711881861">Instalar Chrome OS Flex</translation> +<translation id="1856388568474281774">Frecha abaixo</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">Revisión do hardware</translation> <translation id="1905710495812624430">Superouse o número máximo de intentos.</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">Probar os pasos para tentar solucionar o problema</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">Máis configuracións</translation> +<translation id="2085089206770112532">Reducir brillo da pantalla</translation> <translation id="2104796393919810494">Reparación completada</translation> <translation id="2105810540595158374">O dispositivo é un mando de xogos.</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, versión <ph name="MILESTONE_VERSION" /></translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">Debes seleccionar polo menos un álbum da galería de arte</translation> <translation id="2230005943220647148">Celsius</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">Alternar entre deseños</translation> <translation id="225692081236532131">Estado de activación</translation> <translation id="2287186687001756809">Non hai ningunha imaxe dispoñible. Para engadir fotos, vai a <ph name="LINK" /></translation> <translation id="2307344026739914387">Usar par de claves actual</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">wifi de pago por consumo</translation> <translation id="3583278742022654445">A intensidade do sinal é débil. Proba a poñerte máis preto da fonte do sinal wifi.</translation> <translation id="3595596368722241419">Batería completa</translation> +<translation id="3600339377155080675">Proxectar pantalla</translation> <translation id="3603829704940252505">Avatar</translation> <translation id="360565022852130722">A rede wifi está protexida co protocolo WEP 802.1x, que non é moi seguro</translation> <translation id="3606583719724308068">Latencia alta en sitios web HTTPS</translation> +<translation id="3632579075709132555">Activar/Desactivar pantalla de privacidade</translation> <translation id="3689839747745352263"><ph name="TEST_NAME" /> (proba)</translation> <translation id="370665806235115550">Cargando...</translation> <translation id="3708186454126126312">Dispositivos conectados previamente</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">Visión xeral</translation> <translation id="4297501883039923494">Detívose (produciuse un erro descoñecido)</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> imaxes</translation> +<translation id="4333390807948134856">Tecla <ph name="KEY_NAME" /> premida</translation> <translation id="4378373042927530923">Non se executou</translation> <translation id="4378551569595875038">Conectando...</translation> <translation id="4382484599443659549">PDF</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Produciuse un erro ao facer ping na pasarela de rede non predeterminada</translation> <translation id="4485626319513081846">Selecciona esta opción se o dispositivo se vai reacondicionar ou volver poñer en distribución para novos clientes.</translation> +<translation id="4503223151711056411">Frecha esquerda</translation> <translation id="4511264077854731334">Portal</translation> <translation id="4521826082652183069">Coincidencia do nome alternativo do asunto</translation> <translation id="4536864596629708641">Configuración IP</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">Sen servizo</translation> <translation id="458794348635939462">Produciuse un erro ao resolver todos os hosts</translation> <translation id="4593212453765072419">Requírese autenticación proxy</translation> +<translation id="4609350030397390689">Reducir brillo do teclado</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> de <ph name="TOTAL_PAGE_NUMBER" />. Para cancelar o traballo de impresión, preme Intro.</translation> <translation id="4627645661474370390">Identidade remota</translation> <translation id="463791356324567266">Cancelando escaneo…</translation> <translation id="4646949265910132906">Conexión wifi segura</translation> +<translation id="4650608062294027130">Maiúsculas (dereita)</translation> <translation id="4654549501020883054">Cambiar todos os días</translation> <translation id="4665014895760275686">Fabricante</translation> <translation id="467510802200863975">Os contrasinais non coinciden</translation> @@ -391,8 +402,10 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Volver buscar</translation> <translation id="5583640892426849032">Retroceso</translation> +<translation id="5600027863942488546">Tecla <ph name="KEY_NAME" /> probada</translation> <translation id="5620281292257375798">Só para uso interno</translation> <translation id="5649768706273821470">Escoitar</translation> +<translation id="5655283760733841251">Aumentar brillo do teclado</translation> <translation id="5669267381087807207">Activando</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">Familia</translation> @@ -400,6 +413,7 @@ <translation id="5707900041990977207"><ph name="CURRENT_PAGE" /> de <ph name="TOTAL_PAGES" /></translation> <translation id="5733298426544876109">Actualizar <ph name="DEVICE_NAME" /></translation> <translation id="5760715441271661976">Estado do portal</translation> +<translation id="576835345334454681">Aumentar brillo da pantalla</translation> <translation id="57838592816432529">Silenciar</translation> <translation id="5784136236926853061">Latencia de HTTP alta</translation> <translation id="5832805196449965646">Engadir unha persoa</translation> @@ -430,6 +444,7 @@ <translation id="6104112872696127344">Cancelouse o escaneo</translation> <translation id="6106186594183574873">Para finalizar, introduce o teu antigo contrasinal</translation> <translation id="6108689792487843350">Non se puido acceder á pasarela</translation> +<translation id="6113701710518389813">Frecha arriba</translation> <translation id="6122191549521593678">Online</translation> <translation id="6137767437444130246">Certificado de usuario</translation> <translation id="6146993107019042706">Para finalizar, introduce o teu novo contrasinal</translation> @@ -443,6 +458,7 @@ <translation id="6232017090690406397">Batería</translation> <translation id="6235460611964961764">Restablecer uso de datos de forma manual</translation> <translation id="6243280677745499710">Establecido actualmente</translation> +<translation id="6275224645089671689">Frecha dereita</translation> <translation id="6278428485366576908">Tema</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515">Cancelouse a proba de <ph name="TEST_NAME" /></translation> @@ -478,6 +494,7 @@ <translation id="6620487321149975369">Os traballos de impresión aparecerán no historial a menos que os quites de xeito manual</translation> <translation id="6643016212128521049">Borrar</translation> <translation id="6647510110698214773">Algoritmo de encriptación</translation> +<translation id="6650062777702288430">Alternar entre teclado de kana e alfanumérico</translation> <translation id="6657585470893396449">Contrasinal</translation> <translation id="6659594942844771486">Pestana</translation> <translation id="6692996468359469499">Consultar a información relacionada coa túa selección</translation> @@ -690,6 +707,7 @@ <translation id="9122602430962285795">Para volver establecer conexión, vai a Configuración</translation> <translation id="9126720536733509015">Gardar varias páxinas nun mesmo PDF</translation> <translation id="9137526406337347448">Servizos de Google</translation> +<translation id="9138630967333032450">Maiúsculas (esquerda)</translation> <translation id="9149391708638971077">Realizar proba de memoria</translation> <translation id="9173638680043580060">Queda menos dun minuto</translation> <translation id="917720651393141712">Probar</translation>
diff --git a/chromeos/strings/chromeos_strings_gu.xtb b/chromeos/strings/chromeos_strings_gu.xtb index ed0bbf2..286c960 100644 --- a/chromeos/strings/chromeos_strings_gu.xtb +++ b/chromeos/strings/chromeos_strings_gu.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">કાઢી નાખો</translation> <translation id="1195447618553298278">અજ્ઞાત ભૂલ.</translation> <translation id="1196959502276349371">વર્ઝન <ph name="VERSION" /></translation> +<translation id="1199355487114804640">ચલાવો/થોભાવો</translation> <translation id="1201402288615127009">આગલું</translation> <translation id="1204296502688602597">DNS વિલંબતા</translation> <translation id="123124571410524056">શંકાસ્પદ પોર્ટલ</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">નિષ્ફળ થયું - ફિલ્ટર નિષ્ફળ થયું</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">મારી પાસે કીની જોડી છે</translation> +<translation id="1423591390236870726"><ph name="KEY_NAME" /> કી દબાવી નથી</translation> <translation id="1435763214710588005">પસંદ કરેલા દિવસે દર મહિને ઑટોમૅટિક રીતે ડેટા વપરાશ રીસેટ કરે છે</translation> <translation id="1442433966118452622">છબીનો સૉર્સ</translation> <translation id="1451536289672181509">ડિવાઇસ એક કીબોર્ડ છે.</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">આર્ટ ગૅલરી</translation> <translation id="1851218745569890714">વીડિયો કૉન્ફરન્સિંગ</translation> <translation id="1852934301711881861">ChromeOS Flex ઇન્સ્ટૉલ કરો</translation> +<translation id="1856388568474281774">નીચેની ઍરો કી</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">હાર્ડવેર પુનરાવર્તન</translation> <translation id="1905710495812624430">મહત્તમ મંજૂર પ્રયત્નોની સંખ્યા ઓળંગાઈ.</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">સમસ્યા નિવારણના પગલાં અજમાવી જુઓ</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">વધુ સેટિંગ</translation> +<translation id="2085089206770112532">ડિસ્પ્લેનું બ્રાઇટનેસ ઘટાડવાની કી</translation> <translation id="2104796393919810494">સમારકામ પૂરું થયું છે</translation> <translation id="2105810540595158374">ડિવાઇસ એક ગેમ કન્ટ્રોલર છે.</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, વર્ઝન <ph name="MILESTONE_VERSION" /></translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">ઓછામાં ઓછું એક આર્ટ ગૅલરી આલ્બમ પસંદ કરો</translation> <translation id="2230005943220647148">સેલ્સિયસ</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">લેઆઉટ સ્વિચ કી</translation> <translation id="225692081236532131">સક્રિયતાની સ્થિતિ</translation> <translation id="2287186687001756809">કોઈ છબી ઉપલબ્ધ નથી. ફોટા ઉમેરવા માટે, <ph name="LINK" /> પર જાઓ</translation> <translation id="2307344026739914387">હાલની કીની જોડીનો ઉપયોગ કરો</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">મીટર્ડ (ડેટા નિયંત્રણ) વાઇ-ફાઇ</translation> <translation id="3583278742022654445">સિગ્નલની પ્રબળતા નબળી છે. વાઇ-ફાઇ સિગ્નલના સૉર્સની વધુ નજીક જઈને પ્રયાસ કરી જુઓ.</translation> <translation id="3595596368722241419">બૅટરી પૂર્ણ ચાર્જ</translation> +<translation id="3600339377155080675">સ્ક્રીન મિરર કરો</translation> <translation id="3603829704940252505">અવતાર</translation> <translation id="360565022852130722">વાઇ-ફાઇ નેટવર્કની સુરક્ષા પ્રમાણમાં નબળા WEP 802.1x પ્રોટોકૉલ વડે કરવામાં આવી છે</translation> <translation id="3606583719724308068">HTTPS વેબસાઇટ માટે વિલંબતાનો સમય ઘણો વધુ છે</translation> +<translation id="3632579075709132555">પ્રાઇવસી સ્ક્રીન ટૉગલ કરો</translation> <translation id="3689839747745352263"><ph name="TEST_NAME" /> પરીક્ષણ</translation> <translation id="370665806235115550">લોડ કરી રહ્યું છે...</translation> <translation id="3708186454126126312">પહેલાં કનેક્ટ કરેલા</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">ઓવરવ્યૂ</translation> <translation id="4297501883039923494">બંધ - અજાણી ભૂલ</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> છબી</translation> +<translation id="4333390807948134856"><ph name="KEY_NAME" /> કી દબાવી</translation> <translation id="4378373042927530923">ચલાવ્યું નથી</translation> <translation id="4378551569595875038">કનેક્ટિંગ...</translation> <translation id="4382484599443659549">PDF</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">ઇથરનેટ</translation> <translation id="4483049906298469269">નૉન-ડિફૉલ્ટ નેટવર્ક ગેટવેને પિંગ કરવામાં નિષ્ફળ રહ્યાં</translation> <translation id="4485626319513081846">જો ડિવાઇસ રિસ્ટોક કરવામાં અથવા નવા ગ્રાહકને વિતરણ માટે નવીનીકૃત કરવામાં આવી રહ્યું હોય, તો આ વિકલ્પ પસંદ કરો.</translation> +<translation id="4503223151711056411">ડાબી ઍરો કી</translation> <translation id="4511264077854731334">પોર્ટલ</translation> <translation id="4521826082652183069">વિષયના નામનો વૈકલ્પિક મેળ</translation> <translation id="4536864596629708641">IP કન્ફિગ્યુરેશન</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">કોઈ સેવા નથી</translation> <translation id="458794348635939462">બધા હોસ્ટ રિઝોલ્વ કરવામાં નિષ્ફળ રહ્યાં</translation> <translation id="4593212453765072419">પ્રોક્સી પ્રમાણીકરણ આવશ્યક છે</translation> +<translation id="4609350030397390689">કીબોર્ડનું બ્રાઇટનેસ ઘટાડવાની કી</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="TOTAL_PAGE_NUMBER" />માંથી <ph name="PRINTED_PAGE_NUMBER" />. પ્રિન્ટ કરવાનું અટકાવવા માટે, Enter કી દબાવો.</translation> <translation id="4627645661474370390">દૂરના સ્થાને ઓળખ</translation> <translation id="463791356324567266">સ્કૅન કરવાનું કાર્ય રદ કરી રહ્યાં છીએ...</translation> <translation id="4646949265910132906">સુરક્ષિત વાઇ-ફાઇ કનેક્શન</translation> +<translation id="4650608062294027130">જમણી Shift કી</translation> <translation id="4654549501020883054">દરરોજ બદલો</translation> <translation id="4665014895760275686">નિર્માતા</translation> <translation id="467510802200863975">પાસવર્ડ મેળ ખાતા નથી</translation> @@ -390,8 +401,10 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">ફરી સ્કૅન કરો</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5600027863942488546"><ph name="KEY_NAME" /> કીનું પરીક્ષણ કર્યું</translation> <translation id="5620281292257375798">માત્ર આંતરિક</translation> <translation id="5649768706273821470">સાંભળો</translation> +<translation id="5655283760733841251">કીબોર્ડનું બ્રાઇટનેસ વધારવાની કી</translation> <translation id="5669267381087807207">ચાલુ થાય છે</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">કુટુંબ</translation> @@ -399,6 +412,7 @@ <translation id="5707900041990977207"><ph name="TOTAL_PAGES" />માંથી <ph name="CURRENT_PAGE" /></translation> <translation id="5733298426544876109"><ph name="DEVICE_NAME" /> અપડેટ કરો</translation> <translation id="5760715441271661976">પોર્ટલની સ્થિતિ</translation> +<translation id="576835345334454681">ડિસ્પ્લેનું બ્રાઇટનેસ વધારવાની કી</translation> <translation id="57838592816432529">અવાજ બંધ કરો</translation> <translation id="5784136236926853061">HTTPની ઉચ્ચ વિલંબતા</translation> <translation id="5832805196449965646">વ્યક્તિ ઉમેરો</translation> @@ -429,6 +443,7 @@ <translation id="6104112872696127344">સ્કૅન કરવાનું કાર્ય રદ કરવામાં આવ્યું છે</translation> <translation id="6106186594183574873">સમાપ્ત કરવા માટે, તમારો જૂનો પાસવર્ડ દાખલ કરો</translation> <translation id="6108689792487843350">ગેટવેથી કનેક્ટ કરી શકાતું નથી</translation> +<translation id="6113701710518389813">ઉપરની ઍરો કી</translation> <translation id="6122191549521593678">ઓનલાઇન</translation> <translation id="6137767437444130246">વપરાશકર્તા પ્રમાણપત્ર</translation> <translation id="6146993107019042706">સમાપ્ત કરવા માટે, તમારો નવો પાસવર્ડ દાખલ કરો</translation> @@ -442,6 +457,7 @@ <translation id="6232017090690406397">બૅટરી</translation> <translation id="6235460611964961764">ડેટા વપરાશ મૅન્યુઅલી રીસેટ કરો</translation> <translation id="6243280677745499710">હાલમાં સેટ કરેલ</translation> +<translation id="6275224645089671689">જમણી ઍરો કી</translation> <translation id="6278428485366576908">થીમ</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515"><ph name="TEST_NAME" />નું પરીક્ષણ રદ કરવામાં આવ્યું</translation> @@ -477,6 +493,7 @@ <translation id="6620487321149975369">જ્યાં સુધી પ્રિન્ટ કાર્યોને મેન્યુઅલી કાઢી નાખવામાં નહીં આવે, ત્યાં સુધી તે ઇતિહાસમાં દેખાશે</translation> <translation id="6643016212128521049">સાફ કરો</translation> <translation id="6647510110698214773">એન્ક્રિપ્શન ઍલ્ગોરિધમ</translation> +<translation id="6650062777702288430">કાના/આલ્ફાન્યૂમેરિક સ્વિચ કી</translation> <translation id="6657585470893396449">પાસવર્ડ</translation> <translation id="6659594942844771486">ટૅબ</translation> <translation id="6692996468359469499">તમારી પસંદગી સંબંધિત માહિતી મેળવો</translation> @@ -689,6 +706,7 @@ <translation id="9122602430962285795">ફરીથી કનેક્ટ કરવા માટે, સેટિંગમાં જાઓ</translation> <translation id="9126720536733509015">એક PDFમાં એકથી વધુ પેજ સાચવો</translation> <translation id="9137526406337347448">Google સેવાઓ</translation> +<translation id="9138630967333032450">ડાબી Shift કી</translation> <translation id="9149391708638971077">મેમરીનું પરીક્ષણ ચાલુ કરો</translation> <translation id="9173638680043580060">એક મિનિટ કરતાં ઓછો સમય બાકી છે</translation> <translation id="917720651393141712">પરીક્ષણ કરો</translation>
diff --git a/chromeos/strings/chromeos_strings_is.xtb b/chromeos/strings/chromeos_strings_is.xtb index 0c8815a..837b5605 100644 --- a/chromeos/strings/chromeos_strings_is.xtb +++ b/chromeos/strings/chromeos_strings_is.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">Fjarlægja</translation> <translation id="1195447618553298278">Óþekkt villa.</translation> <translation id="1196959502276349371">Útgáfa <ph name="VERSION" /></translation> +<translation id="1199355487114804640">Spila / gera hlé</translation> <translation id="1201402288615127009">Áfram</translation> <translation id="1204296502688602597">DNS-biðtími</translation> <translation id="123124571410524056">Grunur um gátt</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">Mistókst – bilun í síu</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">Ég er með lyklasett</translation> +<translation id="1423591390236870726">Ekki var ýtt á lykilinn <ph name="KEY_NAME" /></translation> <translation id="1435763214710588005">Endurstillir gagnanotkun sjálfkrafa á völdum degi mánaðarlega</translation> <translation id="1442433966118452622">Uppruni myndar</translation> <translation id="1451536289672181509">Tækið er lyklaborð.</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">Listasafn</translation> <translation id="1851218745569890714">Myndfundur</translation> <translation id="1852934301711881861">Setja upp ChromeOS Flex</translation> +<translation id="1856388568474281774">Ör niður</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">Útgáfa vélbúnaðar</translation> <translation id="1905710495812624430">Farið var yfir hámarksfjölda tilrauna.</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">Prófaðu skref úrræðaleitar</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">Fleiri stillingar</translation> +<translation id="2085089206770112532">Draga úr birtustigi skjás</translation> <translation id="2104796393919810494">Viðgerð lokið</translation> <translation id="2105810540595158374">Tækið er leikjafjarstýring.</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, útgáfa <ph name="MILESTONE_VERSION" /></translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">Velja verður að lágmarki eitt albúm listasafns</translation> <translation id="2230005943220647148">Celsíus</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">Uppsetningarrofi</translation> <translation id="225692081236532131">Virkjunarstaða</translation> <translation id="2287186687001756809">Engin mynd tiltæk. Opnaðu <ph name="LINK" /> til að bæta við myndum</translation> <translation id="2307344026739914387">Nota núverandi lyklasett</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">Wi-Fi net með mælda notkun</translation> <translation id="3583278742022654445">Lítill sendistyrkur. Prófaðu að færa þig nær WiFi-sendibúnaðinum.</translation> <translation id="3595596368722241419">Rafhlaða fullhlaðin</translation> +<translation id="3600339377155080675">Spegla skjá</translation> <translation id="3603829704940252505">Notandamynd</translation> <translation id="360565022852130722">Wi-Fi netið er varið með veikum samskiptareglum, WEP 802.1x</translation> <translation id="3606583719724308068">Langur biðtími eftir HTTPS-vefsvæðum</translation> +<translation id="3632579075709132555">Rofalykill persónuverndarskjás</translation> <translation id="3689839747745352263"><ph name="TEST_NAME" /> prófun</translation> <translation id="370665806235115550">Hleður...</translation> <translation id="3708186454126126312">Áður tengt</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">Yfirlit</translation> <translation id="4297501883039923494">Stöðvað – óþekkt villa</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> myndir</translation> +<translation id="4333390807948134856">Ýtt var á lykilinn <ph name="KEY_NAME" /></translation> <translation id="4378373042927530923">Ekki keyra</translation> <translation id="4378551569595875038">Tengist...</translation> <translation id="4382484599443659549">PDF</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Ping-prófun ósjálfgefinnar netkerfisgáttar mistókst</translation> <translation id="4485626319513081846">Veldu þennan valkost ef tækið er skráð aftur í birgðir eða ef endurnýja á tækið og afhenda það nýjum viðskiptavini.</translation> +<translation id="4503223151711056411">Ör til vinstri</translation> <translation id="4511264077854731334">Gátt</translation> <translation id="4521826082652183069">Samsvarandi auknefni viðfangs</translation> <translation id="4536864596629708641">IP-stilling</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">Ekkert símasamband</translation> <translation id="458794348635939462">Ekki tókst að leysa úr öllum hýslum</translation> <translation id="4593212453765072419">Auðkenningar staðgengilsþjóns krafist</translation> +<translation id="4609350030397390689">Draga úr birtustigi lyklaborðs</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> af <ph name="TOTAL_PAGE_NUMBER" />. Ýttu á færslulykilinn til að hætta við prentverkið.</translation> <translation id="4627645661474370390">Fjarkenni</translation> <translation id="463791356324567266">Hættir við að skanna...</translation> <translation id="4646949265910132906">Örugg Wi-Fi tenging</translation> +<translation id="4650608062294027130">Hægri Shift-lykill</translation> <translation id="4654549501020883054">Breyta daglega</translation> <translation id="4665014895760275686">Framleiðandi</translation> <translation id="467510802200863975">Aðgangsorð stemma ekki</translation> @@ -391,8 +402,10 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Leita aftur</translation> <translation id="5583640892426849032">Bakklykill</translation> +<translation id="5600027863942488546">Lykillinn <ph name="KEY_NAME" /> var prófaðu</translation> <translation id="5620281292257375798">Aðeins innanhúss</translation> <translation id="5649768706273821470">Hlusta</translation> +<translation id="5655283760733841251">Auka birtustig lyklaborðs</translation> <translation id="5669267381087807207">Virkjar</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">Fjölskylda</translation> @@ -400,6 +413,7 @@ <translation id="5707900041990977207"><ph name="CURRENT_PAGE" /> af <ph name="TOTAL_PAGES" /></translation> <translation id="5733298426544876109">Uppfæra <ph name="DEVICE_NAME" /></translation> <translation id="5760715441271661976">Vefgáttarstaða</translation> +<translation id="576835345334454681">Auka birtustig skjás</translation> <translation id="57838592816432529">Þagga</translation> <translation id="5784136236926853061">Langur HTTP-biðtími</translation> <translation id="5832805196449965646">Bæta notanda við</translation> @@ -430,6 +444,7 @@ <translation id="6104112872696127344">Hætt var við að skanna</translation> <translation id="6106186594183574873">Sláðu inn gamla aðgangsorðið þitt til að ganga frá þessu</translation> <translation id="6108689792487843350">Ekki næst í gátt</translation> +<translation id="6113701710518389813">Ör upp</translation> <translation id="6122191549521593678">Á netinu</translation> <translation id="6137767437444130246">Notandavottorð</translation> <translation id="6146993107019042706">Sláðu inn nýja aðgangsorðið til að ljúka þessu</translation> @@ -443,6 +458,7 @@ <translation id="6232017090690406397">Rafhlaða</translation> <translation id="6235460611964961764">Endurstilla gagnanotkun handvirkt</translation> <translation id="6243280677745499710">Valið núna</translation> +<translation id="6275224645089671689">Ör til hægri</translation> <translation id="6278428485366576908">Þema</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515">Hætt var við prófunina: <ph name="TEST_NAME" /></translation> @@ -478,6 +494,7 @@ <translation id="6620487321149975369">Prentverk birtast í ferli nema þau séu fjarlægð handvirkt</translation> <translation id="6643016212128521049">Hreinsa</translation> <translation id="6647510110698214773">Dulkóðunarreiknirit</translation> +<translation id="6650062777702288430">Skipta á milli kana/bók- og tölustafa</translation> <translation id="6657585470893396449">Aðgangsorð</translation> <translation id="6659594942844771486">Flipi</translation> <translation id="6692996468359469499">Fá upplýsingar í tengslum við val þitt</translation> @@ -690,6 +707,7 @@ <translation id="9122602430962285795">Opnaðu stillingarnar til að tengjast á ný</translation> <translation id="9126720536733509015">Vista margar síður í einu PDF-skjali</translation> <translation id="9137526406337347448">Google þjónustur</translation> +<translation id="9138630967333032450">Vinstri Shift-lykill</translation> <translation id="9149391708638971077">Keyra minnispróf</translation> <translation id="9173638680043580060">Innan við mínúta eftir</translation> <translation id="917720651393141712">Prófa</translation>
diff --git a/chromeos/strings/chromeos_strings_iw.xtb b/chromeos/strings/chromeos_strings_iw.xtb index aec335d..a4ca55a 100644 --- a/chromeos/strings/chromeos_strings_iw.xtb +++ b/chromeos/strings/chromeos_strings_iw.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">הסרה</translation> <translation id="1195447618553298278">שגיאה לא ידועה.</translation> <translation id="1196959502276349371">גרסה <ph name="VERSION" /></translation> +<translation id="1199355487114804640">הפעלה/השהיה</translation> <translation id="1201402288615127009">הבא</translation> <translation id="1204296502688602597">זמן אחזור של DNS</translation> <translation id="123124571410524056">פורטל חשוד</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">נכשלה – הסינון נכשל</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">יש לי זוג מפתחות</translation> +<translation id="1423591390236870726">לא התבצעה לחיצה על המקש <ph name="KEY_NAME" /></translation> <translation id="1435763214710588005">איפוס אוטומטי של השימוש בחבילת הגלישה ביום הנבחר מדי חודש</translation> <translation id="1442433966118452622">מקור התמונה</translation> <translation id="1451536289672181509">המכשיר הוא מקלדת.</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">גלריית אומנות</translation> <translation id="1851218745569890714">שיחת ועידה בווידאו</translation> <translation id="1852934301711881861">התקנה של ChromeOS Flex</translation> +<translation id="1856388568474281774">חץ למטה</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">שכתוב חומרה</translation> <translation id="1905710495812624430">חריגה ממספר הניסיונות המרבי המותר.</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">להוראות לפתרון בעיות</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">הגדרות נוספות</translation> +<translation id="2085089206770112532">הפחתת הבהירות של התצוגה</translation> <translation id="2104796393919810494">התיקון הושלם</translation> <translation id="2105810540595158374">המכשיר הוא שלט לגיימינג.</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, גרסה <ph name="MILESTONE_VERSION" /></translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">יש לבחור לפחות אלבום של גלריית אומנות אחד</translation> <translation id="2230005943220647148">צלזיוס</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">מתג הפריסה</translation> <translation id="225692081236532131">סטטוס הפעלה</translation> <translation id="2287186687001756809">אין תמונה זמינה. כדי להוסיף תמונה, צריך לעבור אל <ph name="LINK" /></translation> <translation id="2307344026739914387">שימוש בזוג המפתחות הנוכחי</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">Wi-Fi עם חיוב לפי שימוש בנתונים</translation> <translation id="3583278742022654445">עוצמת האות חלשה. כדאי להתקרב למקור של אות ה-Wi-Fi.</translation> <translation id="3595596368722241419">סוללה מלאה</translation> +<translation id="3600339377155080675">שיקוף מסך</translation> <translation id="3603829704940252505">דמות</translation> <translation id="360565022852130722">רשת ה-Wi-Fi מאובטחת בפרוטוקול WEP 802.1x חלש.</translation> <translation id="3606583719724308068">זמן אחזור ארוך לאתרי HTTPS</translation> +<translation id="3632579075709132555">לחצן להחלפת מצב של מסך הפרטיות</translation> <translation id="3689839747745352263">בדיקת <ph name="TEST_NAME" /></translation> <translation id="370665806235115550">בטעינה...</translation> <translation id="3708186454126126312">מכשירים שחוברו בעבר</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">סקירה כללית</translation> <translation id="4297501883039923494">הפסיקה – שגיאה לא ידועה</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> תמונות</translation> +<translation id="4333390807948134856">בוצעה לחיצה על המקש <ph name="KEY_NAME" /></translation> <translation id="4378373042927530923">לא הופעל</translation> <translation id="4378551569595875038">התחברות...</translation> <translation id="4382484599443659549">PDF</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">אתרנט</translation> <translation id="4483049906298469269">לא ניתן היה לבצע פינג לשער הרשת שאינה מוגדרת כברירת מחדל.</translation> <translation id="4485626319513081846">צריך לבחור באפשרות הזו אם המכשיר מוחזר למלאי או מחודש לצורך הפצה ללקוח חדש.</translation> +<translation id="4503223151711056411">חץ שמאלה</translation> <translation id="4511264077854731334">פורטל</translation> <translation id="4521826082652183069">התאמה של שמות נושאים חלופיים</translation> <translation id="4536864596629708641">תצורת IP</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">אין שירות</translation> <translation id="458794348635939462">לא ניתן היה להתאים את הנתונים של כל המארחים</translation> <translation id="4593212453765072419">יש צורך באימות שרת ה-proxy</translation> +<translation id="4609350030397390689">הפחתת הבהירות של המקלדת</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> מתוך <ph name="TOTAL_PAGE_NUMBER" />. ניתן להקיש על Enter כדי לבטל את משימת ההדפסה.</translation> <translation id="4627645661474370390">זהות מרוחקת</translation> <translation id="463791356324567266">הסריקה מתבטלת...</translation> <translation id="4646949265910132906">חיבור Wi-Fi מאובטח</translation> +<translation id="4650608062294027130">shift ימני</translation> <translation id="4654549501020883054">שינוי מדי יום</translation> <translation id="4665014895760275686">יצרן</translation> <translation id="467510802200863975">הסיסמאות אינן תואמות</translation> @@ -391,8 +402,10 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">סריקה מחדש</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5600027863942488546">בוצעה בדיקה של המקש <ph name="KEY_NAME" /></translation> <translation id="5620281292257375798">פנימי בלבד</translation> <translation id="5649768706273821470">האזנה</translation> +<translation id="5655283760733841251">הגברת הבהירות של המקלדת</translation> <translation id="5669267381087807207">ההפעלה מתבצעת</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">משפחה</translation> @@ -400,6 +413,7 @@ <translation id="5707900041990977207"><ph name="CURRENT_PAGE" /> מתוך <ph name="TOTAL_PAGES" /></translation> <translation id="5733298426544876109">עדכון של <ph name="DEVICE_NAME" /></translation> <translation id="5760715441271661976">מצב הפורטל</translation> +<translation id="576835345334454681">הגברה של בהירות התצוגה</translation> <translation id="57838592816432529">השתקה</translation> <translation id="5784136236926853061">משך זמן ההמתנה ל-HTTP ארוך</translation> <translation id="5832805196449965646">הוספת משתמש</translation> @@ -430,6 +444,7 @@ <translation id="6104112872696127344">הסריקה בוטלה</translation> <translation id="6106186594183574873">כדי לסיים יש להזין את הסיסמה הישנה</translation> <translation id="6108689792487843350">לא ניתן להגיע אל השער</translation> +<translation id="6113701710518389813">חץ למעלה</translation> <translation id="6122191549521593678">אונליין</translation> <translation id="6137767437444130246">אישור משתמש</translation> <translation id="6146993107019042706">כדי לסיים, יש להזין את הסיסמה החדשה</translation> @@ -443,6 +458,7 @@ <translation id="6232017090690406397">סוללה</translation> <translation id="6235460611964961764">איפוס ידני של השימוש בחבילת הגלישה</translation> <translation id="6243280677745499710">מוגדר עכשיו</translation> +<translation id="6275224645089671689">חץ ימינה</translation> <translation id="6278428485366576908">עיצוב</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515">בדיקת ה<ph name="TEST_NAME" /> בוטלה</translation> @@ -478,6 +494,7 @@ <translation id="6620487321149975369">משימות הדפסה יופיעו תחת היסטוריה אלא אם הן הוסרו ידנית</translation> <translation id="6643016212128521049">ניקוי</translation> <translation id="6647510110698214773">האלגוריתם להצפנה</translation> +<translation id="6650062777702288430">מתג קאנה/אלפאנומרי</translation> <translation id="6657585470893396449">סיסמה</translation> <translation id="6659594942844771486">כרטיסייה</translation> <translation id="6692996468359469499">קבלת מידע בקשר לבחירה שלך</translation> @@ -690,6 +707,7 @@ <translation id="9122602430962285795">כדי להתחבר מחדש, צריך לעבור להגדרות</translation> <translation id="9126720536733509015">שמירת מספר דפים בקובץ PDF אחד</translation> <translation id="9137526406337347448">שירותי Google</translation> +<translation id="9138630967333032450">shift שמאלי</translation> <translation id="9149391708638971077">הפעלה של בדיקת זיכרון</translation> <translation id="9173638680043580060">נותרה פחות מדקה</translation> <translation id="917720651393141712">בדיקה</translation>
diff --git a/chromeos/strings/chromeos_strings_ka.xtb b/chromeos/strings/chromeos_strings_ka.xtb index cb0444a..347232f 100644 --- a/chromeos/strings/chromeos_strings_ka.xtb +++ b/chromeos/strings/chromeos_strings_ka.xtb
@@ -52,6 +52,7 @@ <translation id="1468664791493211953">შემოთავაზებები</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> მართავს ამ მოწყობილობას და შეუძლია თქვენი აქტივობის მონიტორინგი.</translation> <translation id="1478594628797167447">სკანერი</translation> +<translation id="1486019694341708158">ჩართეთ გადამრთველი, ეკრანმზოგის ვარიანტები რომ აირჩიოთ</translation> <translation id="1491076385728777984">მიმდინარეობს ჩაშენებული პროგრამული უზრუნველყოფის განახლება <ph name="DEVICE_NAME" />-ზე</translation> <translation id="1499900233129743732">ამ მომხმარებელს მართავს <ph name="MANAGER" />, რომელსაც შეუძლია პარამეტრების დისტანციურად მართვა და მომხმარებლის აქტივობის მონიტორინგი.</translation> <translation id="150962533380566081">PUK კოდი არასწორია.</translation> @@ -106,6 +107,7 @@ <translation id="2105810540595158374">მოწყობილობა არის სათამაშო კონტროლერი.</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, ვერსია <ph name="MILESTONE_VERSION" /></translation> <translation id="2126937207024182736">ხელმისაწვდომია <ph name="TOTAL_MEMORY" /> გბაიტიდან <ph name="AVAILABLE_MEMORY" /> გბაიტი</translation> +<translation id="2138109643290557664">ლივლივი</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> ფოტო</translation> <translation id="2157959690810728433">რიგშია</translation> @@ -268,6 +270,7 @@ <translation id="4271957103967917607">სრულ ეკრანზე ნახვა</translation> <translation id="4275799948641988986">შეკეთების შემდეგ ვინ გამოიყენებს მოწყობილობას?</translation> <translation id="4289540628985791613">მიმოხილვა</translation> +<translation id="4289849978083912975">სლაიდშოუ</translation> <translation id="4297501883039923494">გაჩერდა — უცნობი შეცდომა</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> სურათი</translation> <translation id="4333390807948134856"><ph name="KEY_NAME" /> კლავიში დაჭერილია</translation> @@ -539,10 +542,12 @@ <translation id="7175037578838465313">„<ph name="NAME" />“-ის კონფიგურაცია</translation> <translation id="7177485034254901881">ეს <ph name="DEVICE_TYPE" /> იმართება <ph name="MANAGER" />-ის მიერ. ადმინისტრატორებს შეუძლიათ ამ მოწყობილობის დისტანციურად კონფიგურაცია.</translation> <translation id="7180611975245234373">განახლება</translation> +<translation id="7191009787982536050">ეკრანმზოგის ანიმაცია</translation> <translation id="7212734716605298123">გარე მოწყობილობებში ჩაშენებული პროგრამული უზრუნველყოფის განახლებები</translation> <translation id="7216409898977639127">ფიჭური ქსელის პროვაიდერი</translation> <translation id="7271040990581020067">სკანერი ამჟამად გამოიყენება. ცადეთ მოგვიანებით.</translation> <translation id="7274587244503383581"><ph name="PRINTED_PAGES_NUMBER" />/<ph name="TOTAL_PAGES_NUMBER" /></translation> +<translation id="7281657306185710294">ბრიზი</translation> <translation id="7287310195820267359">ფონების კოლექციები</translation> <translation id="7297226631177386107">ქსელის დაცვიდან HTTPS ვებსაიტებთან დაკავშირება ვერ ხერხდება</translation> <translation id="7302860742311162920">ICCID</translation>
diff --git a/chromeos/strings/chromeos_strings_lt.xtb b/chromeos/strings/chromeos_strings_lt.xtb index dea7d138..c76841f 100644 --- a/chromeos/strings/chromeos_strings_lt.xtb +++ b/chromeos/strings/chromeos_strings_lt.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">Pašalinti</translation> <translation id="1195447618553298278">Nežinoma klaida.</translation> <translation id="1196959502276349371"><ph name="VERSION" /> versija</translation> +<translation id="1199355487114804640">Leisti / pristabdyti</translation> <translation id="1201402288615127009">Kitas</translation> <translation id="1204296502688602597">DNS delsa</translation> <translation id="123124571410524056">Įtariamas portalas</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">Nepavyko – filtras neveikia tinkamai</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">Turiu raktų porą</translation> +<translation id="1423591390236870726">Nepaspaustas klavišas <ph name="KEY_NAME" /></translation> <translation id="1435763214710588005">Pasirinktą dieną automatiškai iš naujo nustatomas duomenų naudojimas kiekvieną mėnesį</translation> <translation id="1442433966118452622">Vaizdo šaltinis</translation> <translation id="1451536289672181509">Įrenginys yra klaviatūra.</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">Meno galerija</translation> <translation id="1851218745569890714">Vaizdo konferencijos</translation> <translation id="1852934301711881861">Įdiegti „ChromeOS Flex“</translation> +<translation id="1856388568474281774">Rodyklė žemyn</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">Aparatinės įrangos taisymas</translation> <translation id="1905710495812624430">Viršytas didžiausias bandymų skaičius.</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">Išbandykite trikčių šalinimo veiksmus</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">Daugiau nustatymų</translation> +<translation id="2085089206770112532">Sumažinti ekrano šviesumą</translation> <translation id="2104796393919810494">Baigta taisyti</translation> <translation id="2105810540595158374">Įrenginys yra žaidimų valdiklis.</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, <ph name="MILESTONE_VERSION" /> versija</translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">Reikia pasirinkti bent vieną meno galerijos albumą</translation> <translation id="2230005943220647148">Celsijaus laipsniai</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">Išdėstymo jungiklis</translation> <translation id="225692081236532131">Aktyvinimo būsena</translation> <translation id="2287186687001756809">Nėra jokių vaizdų. Jei norite pridėti nuotraukų, eikite adresu <ph name="LINK" /></translation> <translation id="2307344026739914387">Naudoti dabartinę raktų porą</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">matuojamas „Wi-Fi“ tinklas</translation> <translation id="3583278742022654445">Silpnas signalas. Pabandykite prieiti arčiau „Wi-Fi“ signalo šaltinio.</translation> <translation id="3595596368722241419">Akumuliatorius įkrautas</translation> +<translation id="3600339377155080675">Ekrano vaizdo bendrinimas</translation> <translation id="3603829704940252505">Pseudoportretas</translation> <translation id="360565022852130722">„Wi-Fi“ tinklas apsaugotas naudojant nepatikimą protokolą WEP 802.1x</translation> <translation id="3606583719724308068">Didelė HTTPS svetainių delsa</translation> +<translation id="3632579075709132555">Privatumo ekrano perjungimas</translation> <translation id="3689839747745352263">Bandymas „<ph name="TEST_NAME" />“</translation> <translation id="370665806235115550">Įkeliama...</translation> <translation id="3708186454126126312">Anksčiau susieti</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">Apžvalga</translation> <translation id="4297501883039923494">Sustabdyta – nežinoma klaida</translation> <translation id="4300073214558989">Vaizdų: <ph name="IMAGE_COUNT" /></translation> +<translation id="4333390807948134856">Paspaustas klavišas <ph name="KEY_NAME" /></translation> <translation id="4378373042927530923">Nevykdyti</translation> <translation id="4378551569595875038">Jungiamasi...</translation> <translation id="4382484599443659549">PDF</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">Eternetas</translation> <translation id="4483049906298469269">Nepavyko patikrinti ryšio su nenumatytuoju tinklų sietuvu</translation> <translation id="4485626319513081846">Pasirinkite šią parinktį, jei įrenginys vėl bus pridėtas prie atsargų arba atnaujintas, kad jį būtų galima perduoti naujam klientui.</translation> +<translation id="4503223151711056411">Rodyklė kairėn</translation> <translation id="4511264077854731334">Portalas</translation> <translation id="4521826082652183069">Alternatyvaus subjekto pavadinimo atitiktis</translation> <translation id="4536864596629708641">IP konfigūracija</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">Nėra paslaugos</translation> <translation id="458794348635939462">Nepavyko nustatyti jokių prieglobų pavadinimų</translation> <translation id="4593212453765072419">Būtina autentifikuoti įgaliotąjį serverį</translation> +<translation id="4609350030397390689">Sumažinti klaviatūros šviesumą</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, „<ph name="PRINTER_NAME" />“, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> iš <ph name="TOTAL_PAGE_NUMBER" /> psl. Paspauskite „Enter“, jei norite atšaukti spausdinimo užduotį.</translation> <translation id="4627645661474370390">Nuotolinio ryšio tapatybė</translation> <translation id="463791356324567266">Atšaukiamas nuskaitymas...</translation> <translation id="4646949265910132906">Saugus „Wi-Fi“ ryšys</translation> +<translation id="4650608062294027130">Dešinysis antrojo lygio klavišas</translation> <translation id="4654549501020883054">Keisti kasdien</translation> <translation id="4665014895760275686">Gamintojas</translation> <translation id="467510802200863975">Slaptažodžiai neatitinka</translation> @@ -391,8 +402,10 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Nuskaityti iš naujo</translation> <translation id="5583640892426849032">Grįžties klavišas</translation> +<translation id="5600027863942488546">Išbandytas klavišas <ph name="KEY_NAME" /></translation> <translation id="5620281292257375798">Tik vidiniams naudotojams</translation> <translation id="5649768706273821470">Klausyti</translation> +<translation id="5655283760733841251">Padidinti klaviatūros šviesumą</translation> <translation id="5669267381087807207">Aktyvinama</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">Šeima</translation> @@ -400,6 +413,7 @@ <translation id="5707900041990977207"><ph name="CURRENT_PAGE" /> iš <ph name="TOTAL_PAGES" /></translation> <translation id="5733298426544876109">Atnaujinti „<ph name="DEVICE_NAME" />“</translation> <translation id="5760715441271661976">Portalo būsena</translation> +<translation id="576835345334454681">Padidinti ekrano šviesumą</translation> <translation id="57838592816432529">Nutildyti</translation> <translation id="5784136236926853061">Didelė HTTP delsa</translation> <translation id="5832805196449965646">Pridėti asmenį</translation> @@ -430,6 +444,7 @@ <translation id="6104112872696127344">Nuskaitymas atšauktas</translation> <translation id="6106186594183574873">Norėdami užbaigti įveskite seną slaptažodį</translation> <translation id="6108689792487843350">Tinklų sietuvas nepasiekiamas</translation> +<translation id="6113701710518389813">Rodyklė aukštyn</translation> <translation id="6122191549521593678">Prisijungęs</translation> <translation id="6137767437444130246">Naudotojo sertifikatas</translation> <translation id="6146993107019042706">Norėdami užbaigti įveskite naują slaptažodį</translation> @@ -443,6 +458,7 @@ <translation id="6232017090690406397">Akumuliatorius</translation> <translation id="6235460611964961764">Neautomatiškai iš naujo nustatyti duomenų naudojimą</translation> <translation id="6243280677745499710">Šiuo metu nustatytas</translation> +<translation id="6275224645089671689">Rodyklė dešinėn</translation> <translation id="6278428485366576908">Tema</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515">Bandymas „<ph name="TEST_NAME" />“ atšauktas</translation> @@ -478,6 +494,7 @@ <translation id="6620487321149975369">Spausdinimo užduotys bus rodomos istorijoje, nebent bus pašalintos neautomatiškai</translation> <translation id="6643016212128521049">Išvalyti</translation> <translation id="6647510110698214773">Šifruotės algoritmas</translation> +<translation id="6650062777702288430">Kana / raidinių ir skaitinių simbolių jungiklis</translation> <translation id="6657585470893396449">Slaptažodis</translation> <translation id="6659594942844771486">Skirtukas</translation> <translation id="6692996468359469499">Su pasirinkimu susijusios informacijos gavimas</translation> @@ -690,6 +707,7 @@ <translation id="9122602430962285795">Norėdami prisijungti iš naujo, eikite į Nustatymus</translation> <translation id="9126720536733509015">Išsaugokite kelis puslapius viename PDF</translation> <translation id="9137526406337347448">„Google“ paslaugos</translation> +<translation id="9138630967333032450">Kairysis antrojo lygio klavišas</translation> <translation id="9149391708638971077">Vykdyti atminties bandymą</translation> <translation id="9173638680043580060">Liko mažiau nei minutė</translation> <translation id="917720651393141712">Bandyti</translation>
diff --git a/chromeos/strings/chromeos_strings_lv.xtb b/chromeos/strings/chromeos_strings_lv.xtb index 245aa834e..3b898c15 100644 --- a/chromeos/strings/chromeos_strings_lv.xtb +++ b/chromeos/strings/chromeos_strings_lv.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">Noņemt</translation> <translation id="1195447618553298278">Nezināma kļūda.</translation> <translation id="1196959502276349371">Versija <ph name="VERSION" /></translation> +<translation id="1199355487114804640">Atskaņot/pārtraukt</translation> <translation id="1201402288615127009">Tālāk</translation> <translation id="1204296502688602597">DNS latentums</translation> <translation id="123124571410524056">Aizdomas par portālu</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">Neizdevās — filtra kļūme</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">Man ir atslēgu pāris</translation> +<translation id="1423591390236870726">Taustiņš “<ph name="KEY_NAME" />” nav nospiests</translation> <translation id="1435763214710588005">Katru mēnesi noteiktā dienā automātiski tiek atiestatīta datu lietojuma vērtība</translation> <translation id="1442433966118452622">Attēla avots</translation> <translation id="1451536289672181509">Ierīce ir tastatūra.</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">Mākslas galerija</translation> <translation id="1851218745569890714">Videokonferences</translation> <translation id="1852934301711881861">Instalēt Chrome OS Flex</translation> +<translation id="1856388568474281774">Lejupvērstais bulttaustiņš</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">Aparatūras pārskatījums</translation> <translation id="1905710495812624430">Ir pārsniegts maksimālais atļautais mēģinājumu skaits.</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">Skatīt problēmu novēršanas darbības</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">Vairāk iestatījumu</translation> +<translation id="2085089206770112532">Samazināt displeja spilgtumu</translation> <translation id="2104796393919810494">Labošana pabeigta</translation> <translation id="2105810540595158374">Ierīce ir spēļu vadāmierīce.</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, versija <ph name="MILESTONE_VERSION" /></translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">Jāatlasa vismaz viens mākslas galerijas albums</translation> <translation id="2230005943220647148">Celsija skala</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">Izkārtojuma slēdzis</translation> <translation id="225692081236532131">Aktivizācijas statuss</translation> <translation id="2287186687001756809">Nav pieejams neviens attēls. Lai pievienotu fotoattēlus, pārejiet uz vietni <ph name="LINK" />.</translation> <translation id="2307344026739914387">Izmantot pašreizējo atslēgu pāri</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">Maksas Wi-Fi tīkls</translation> <translation id="3583278742022654445">Vājš signāls. Pārvietojieties tuvāk Wi-Fi signāla avotam.</translation> <translation id="3595596368722241419">Akumulators pilns</translation> +<translation id="3600339377155080675">Spoguļot ekrānu</translation> <translation id="3603829704940252505">Iemiesojums</translation> <translation id="360565022852130722">Wi-Fi tīklu sargā nedrošs protokols WEP 802.1x</translation> <translation id="3606583719724308068">Augsts latentums HTTPS vietnēs</translation> +<translation id="3632579075709132555">Konfidencialitātes ekrāna slēdzis</translation> <translation id="3689839747745352263">Pārbaude: <ph name="TEST_NAME" /></translation> <translation id="370665806235115550">Notiek ielāde...</translation> <translation id="3708186454126126312">Ierīces, ar kurām iepriekš tika izveidots savienojums</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">Kopsavilkums</translation> <translation id="4297501883039923494">Apturēts — nezināma kļūda</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> attēls(-i)</translation> +<translation id="4333390807948134856">Taustiņš “<ph name="KEY_NAME" />” ir nospiests</translation> <translation id="4378373042927530923">Nav veikta izpilde</translation> <translation id="4378551569595875038">Pievienojas...</translation> <translation id="4382484599443659549">PDF</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">tīkls Ethernet</translation> <translation id="4483049906298469269">Neizdevās ehotestēt tīkla vārteju, kas nav noklusējuma vārteja</translation> <translation id="4485626319513081846">Atlasiet šo opciju, ja ierīce tiek padarīta atkal pieejama vai atjaunota izplatīšanai jaunam klientam.</translation> +<translation id="4503223151711056411">Kreisais bulttaustiņš</translation> <translation id="4511264077854731334">Portāls</translation> <translation id="4521826082652183069">Subjekta alternatīvā nosaukuma atbilstība</translation> <translation id="4536864596629708641">IP konfigurācija</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">Nav pakalpojuma</translation> <translation id="458794348635939462">Neizdevās atrisināt visu saimniekdatoru nosaukumus</translation> <translation id="4593212453765072419">Nepieciešama starpniekservera autentifikācija</translation> +<translation id="4609350030397390689">Samazināt tastatūras spilgtumu</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />: <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> no <ph name="TOTAL_PAGE_NUMBER" /> lapas(-ām). Lai atceltu drukas uzdevumu, nospiediet taustiņu Enter.</translation> <translation id="4627645661474370390">Attālā identitāte</translation> <translation id="463791356324567266">Notiek skenēšanas atcelšana…</translation> <translation id="4646949265910132906">Drošs Wi-Fi savienojums</translation> +<translation id="4650608062294027130">Labais pārslēgšanas taustiņš</translation> <translation id="4654549501020883054">Mainīt katru dienu</translation> <translation id="4665014895760275686">Ražotājs</translation> <translation id="467510802200863975">Paroles nav vienādas</translation> @@ -391,8 +402,10 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Atkārtoti skenēt</translation> <translation id="5583640892426849032">Atkāpšanās taustiņš</translation> +<translation id="5600027863942488546">Taustiņš “<ph name="KEY_NAME" />” ir pārbaudīts</translation> <translation id="5620281292257375798">Tikai iekšējai lietošanai</translation> <translation id="5649768706273821470">Klausīties</translation> +<translation id="5655283760733841251">Palielināt tastatūras spilgtumu</translation> <translation id="5669267381087807207">Notiek aktivizācija</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">Ģimene</translation> @@ -400,6 +413,7 @@ <translation id="5707900041990977207"><ph name="CURRENT_PAGE" />. no <ph name="TOTAL_PAGES" /></translation> <translation id="5733298426544876109">Atjaunināt ierīci “<ph name="DEVICE_NAME" />”</translation> <translation id="5760715441271661976">Portāla statuss</translation> +<translation id="576835345334454681">Palielināt displeja spilgtumu</translation> <translation id="57838592816432529">Izslēgt skaņu</translation> <translation id="5784136236926853061">Liels HTTP latentums</translation> <translation id="5832805196449965646">Pievienot personu</translation> @@ -430,6 +444,7 @@ <translation id="6104112872696127344">Skenēšana ir atcelta</translation> <translation id="6106186594183574873">Lai pabeigtu, ievadiet savu iepriekšējo paroli</translation> <translation id="6108689792487843350">Vārteja nav sasniedzama</translation> +<translation id="6113701710518389813">Augšupvērstais bulttaustiņš</translation> <translation id="6122191549521593678">Tiešsaistē</translation> <translation id="6137767437444130246">Lietotāja sertifikāts</translation> <translation id="6146993107019042706">Lai pabeigtu, ievadiet savu jauno paroli</translation> @@ -443,6 +458,7 @@ <translation id="6232017090690406397">Akumulators</translation> <translation id="6235460611964961764">Manuāli atiestatīt datu lietojuma vērtību</translation> <translation id="6243280677745499710">Šobrīd iestatīta</translation> +<translation id="6275224645089671689">Labais bulttaustiņš</translation> <translation id="6278428485366576908">Motīvs</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515"><ph name="TEST_NAME" />: pārbaude ir atcelta.</translation> @@ -478,6 +494,7 @@ <translation id="6620487321149975369">Drukas uzdevumi būs redzami vēsturē, ja vien tie netiks noņemti manuāli</translation> <translation id="6643016212128521049">Notīrīt</translation> <translation id="6647510110698214773">Šifrēšanas algoritms</translation> +<translation id="6650062777702288430">Kana/burtciparu slēdzis</translation> <translation id="6657585470893396449">Parole</translation> <translation id="6659594942844771486">Cilne</translation> <translation id="6692996468359469499">Iespēja saņemt informāciju par atlasīto saturu</translation> @@ -690,6 +707,7 @@ <translation id="9122602430962285795">Lai atkārtoti izveidotu savienojumu, pārejiet uz iestatījumiem.</translation> <translation id="9126720536733509015">Saglabāt vairākas lapas vienā PDF failā</translation> <translation id="9137526406337347448">Google pakalpojumi</translation> +<translation id="9138630967333032450">Kreisais pārslēgšanas taustiņš</translation> <translation id="9149391708638971077">Veikt atmiņas pārbaudi</translation> <translation id="9173638680043580060">Atlicis mazāk par minūti</translation> <translation id="917720651393141712">Testēt</translation>
diff --git a/chromeos/strings/chromeos_strings_sv.xtb b/chromeos/strings/chromeos_strings_sv.xtb index 83308b57..562c962 100644 --- a/chromeos/strings/chromeos_strings_sv.xtb +++ b/chromeos/strings/chromeos_strings_sv.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">Ta bort</translation> <translation id="1195447618553298278">Okänt fel.</translation> <translation id="1196959502276349371">Version <ph name="VERSION" /></translation> +<translation id="1199355487114804640">Uppspelnings-/paustangenten</translation> <translation id="1201402288615127009">Nästa</translation> <translation id="1204296502688602597">DNS-latens</translation> <translation id="123124571410524056">Misstänkt portal</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">Misslyckades – filterfel</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">Jag har ett nyckelpar</translation> +<translation id="1423591390236870726"><ph name="KEY_NAME" /> har inte tryckts ned</translation> <translation id="1435763214710588005">Dataanvändningen återställs automatiskt den angivna dagen i månaden</translation> <translation id="1442433966118452622">Bildkälla</translation> <translation id="1451536289672181509">Enheten är ett tangentbord.</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">Konstgalleri</translation> <translation id="1851218745569890714">Videokonferenser</translation> <translation id="1852934301711881861">Installera ChromeOS Flex</translation> +<translation id="1856388568474281774">Nedåtpiltangenten</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">Revision av maskinvara</translation> <translation id="1905710495812624430">Du har försökt för många gånger.</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">Testa felsökningsstegen</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">Fler inställningar</translation> +<translation id="2085089206770112532">Tangenten som minskar skärmens ljusstyrka</translation> <translation id="2104796393919810494">Reparationen är klar</translation> <translation id="2105810540595158374">Enheten är en spelkontroll.</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, version <ph name="MILESTONE_VERSION" /></translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">Minst ett album i konstgalleriet måste vara markerat</translation> <translation id="2230005943220647148">Celsius</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">Tangenten som byter tangentbordslayout</translation> <translation id="225692081236532131">Aktiveringsstatus</translation> <translation id="2287186687001756809">Det finns inga bilder. Du kan lägga till foton via <ph name="LINK" /></translation> <translation id="2307344026739914387">Använd nuvarande nyckelpar</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">wifi med datapriser</translation> <translation id="3583278742022654445">Svag signalstyrka. Testa att gå närmare källan till wifi-signalen.</translation> <translation id="3595596368722241419">Batteriet är fulladdat</translation> +<translation id="3600339377155080675">Tangenten för att spegla skärmen</translation> <translation id="3603829704940252505">Avatar</translation> <translation id="360565022852130722">wifi-nätverket använder det svaga säkerhetsprotokollet WEP 802.1x</translation> <translation id="3606583719724308068">Hög fördröjning till HTTPS-webbplatser</translation> +<translation id="3632579075709132555">Tangenten som aktiverar och inaktiverar sekretesskärmen</translation> <translation id="3689839747745352263">Test – <ph name="TEST_NAME" /></translation> <translation id="370665806235115550">Läser in...</translation> <translation id="3708186454126126312">Tidigare anslutna enheter</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">Översikt</translation> <translation id="4297501883039923494">Har stoppats – okänt fel</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> bilder</translation> +<translation id="4333390807948134856"><ph name="KEY_NAME" /> har tryckts ned</translation> <translation id="4378373042927530923">Har inte körts</translation> <translation id="4378551569595875038">Ansluter ...</translation> <translation id="4382484599443659549">PDF</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Det gick inte att pinga gateway för nätverket som inte är standard</translation> <translation id="4485626319513081846">Välj det här alternativet om enheten ska åter till lagret eller restaureras så att den kan skickas till en ny kund senare.</translation> +<translation id="4503223151711056411">Vänsterpiltangenten</translation> <translation id="4511264077854731334">Portal</translation> <translation id="4521826082652183069">Matchning av ämnets andra namn</translation> <translation id="4536864596629708641">IP-konfiguration</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">Ingen täckning</translation> <translation id="458794348635939462">DNS-matchningen av alla värdar misslyckades</translation> <translation id="4593212453765072419">Proxyautentisering krävs</translation> +<translation id="4609350030397390689">Tangenten som minskar ljusstyrkan på tangentbordet</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> av <ph name="TOTAL_PAGE_NUMBER" />. Tryck på retur för att avbryta utskriftsjobbet.</translation> <translation id="4627645661474370390">Fjärridentitet</translation> <translation id="463791356324567266">Skanningen avbryts …</translation> <translation id="4646949265910132906">Säker wifi-anslutning</translation> +<translation id="4650608062294027130">Höger skifttangent</translation> <translation id="4654549501020883054">Ändra dagligen</translation> <translation id="4665014895760275686">Tillverkare</translation> <translation id="467510802200863975">Lösenorden matchar inte</translation> @@ -391,8 +402,10 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Sök igen</translation> <translation id="5583640892426849032">Backsteg</translation> +<translation id="5600027863942488546"><ph name="KEY_NAME" /> har testats</translation> <translation id="5620281292257375798">Endast internt</translation> <translation id="5649768706273821470">Lyssna</translation> +<translation id="5655283760733841251">Tangenten som ökar ljusstyrkan på tangentbordet</translation> <translation id="5669267381087807207">Aktiverar</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">Familj</translation> @@ -400,6 +413,7 @@ <translation id="5707900041990977207"><ph name="CURRENT_PAGE" /> av <ph name="TOTAL_PAGES" /></translation> <translation id="5733298426544876109">Uppdatera <ph name="DEVICE_NAME" /></translation> <translation id="5760715441271661976">Portalläge</translation> +<translation id="576835345334454681">Tangenten som ökar skärmens ljusstyrka</translation> <translation id="57838592816432529">Stäng av ljudet</translation> <translation id="5784136236926853061">Hög HTTP-latens</translation> <translation id="5832805196449965646">Lägg till person</translation> @@ -430,6 +444,7 @@ <translation id="6104112872696127344">Skanningen har avbrutits</translation> <translation id="6106186594183574873">Slutför genom att ange det gamla lösenordet</translation> <translation id="6108689792487843350">Gateway kan inte nås</translation> +<translation id="6113701710518389813">Uppåtpiltangenten</translation> <translation id="6122191549521593678">Online</translation> <translation id="6137767437444130246">Användarcertifikat</translation> <translation id="6146993107019042706">Slutför genom att ange det nya lösenordet</translation> @@ -443,6 +458,7 @@ <translation id="6232017090690406397">Batteri</translation> <translation id="6235460611964961764">Återställ dataanvändningen manuellt</translation> <translation id="6243280677745499710">Nuvarande</translation> +<translation id="6275224645089671689">Högerpiltangenten</translation> <translation id="6278428485366576908">Tema</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515"><ph name="TEST_NAME" />-testet har avbrutits</translation> @@ -478,6 +494,7 @@ <translation id="6620487321149975369">Utskriftsjobb visas i historiken såvida de inte tas bort manuellt</translation> <translation id="6643016212128521049">Rensa</translation> <translation id="6647510110698214773">Krypteringsalgoritm</translation> +<translation id="6650062777702288430">Tangenten som byter mellan kana/alfanumeriska tecken</translation> <translation id="6657585470893396449">Lösenord</translation> <translation id="6659594942844771486">Flik</translation> <translation id="6692996468359469499">Få information utifrån det du markerar</translation> @@ -690,6 +707,7 @@ <translation id="9122602430962285795">Öppna inställningarna för att återansluta</translation> <translation id="9126720536733509015">Spara flera sidor till en PDF</translation> <translation id="9137526406337347448">Google Services</translation> +<translation id="9138630967333032450">Vänster skifttangent</translation> <translation id="9149391708638971077">Kör minnestest</translation> <translation id="9173638680043580060">Mindre än en minut kvar</translation> <translation id="917720651393141712">Testa</translation>
diff --git a/chromeos/strings/chromeos_strings_sw.xtb b/chromeos/strings/chromeos_strings_sw.xtb index a030795..7239aa2 100644 --- a/chromeos/strings/chromeos_strings_sw.xtb +++ b/chromeos/strings/chromeos_strings_sw.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">Ondoa</translation> <translation id="1195447618553298278">Hitilafu isiyojulikana.</translation> <translation id="1196959502276349371">Toleo la <ph name="VERSION" /></translation> +<translation id="1199355487114804640">Cheza/Simamisha</translation> <translation id="1201402288615127009">Endelea</translation> <translation id="1204296502688602597">Muda wa Kusubiri wa DNS</translation> <translation id="123124571410524056">Inashukiwa kuna ukurasa wa mwanzo</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">Haijakamilika - Kichujio kimeshindwa kufanya kazi</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">Nina jozi ya funguo</translation> +<translation id="1423591390236870726">Kitufe cha <ph name="KEY_NAME" /> hakijabonyezwa</translation> <translation id="1435763214710588005">Huweka upya matumizi ya data kiotomatiki kila mwezi kwenye siku iliyochaguliwa</translation> <translation id="1442433966118452622">Chanzo cha picha</translation> <translation id="1451536289672181509">Kifaa hiki ni kibodi.</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">Matunzio ya sanaa</translation> <translation id="1851218745569890714">Mikutano ya Video</translation> <translation id="1852934301711881861">Sakinisha ChromeOS Flex</translation> +<translation id="1856388568474281774">Kishale cha chini</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">Sahihisho la maunzi</translation> <translation id="1905710495812624430">Idadi ya juu ya majaribio yanayoruhusiwa.</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">Jaribu hatua za utatuzi</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">Mipangilio zaidi</translation> +<translation id="2085089206770112532">Punguza mwangaza wa skrini</translation> <translation id="2104796393919810494">Mchakato wa kurekebisha umekamilika</translation> <translation id="2105810540595158374">Kifaa hiki ni kidhibiti cha mchezo.</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, toleo la <ph name="MILESTONE_VERSION" /></translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">Unahitaji kuchagua angalau albamu moja ya matunzio ya Sanaa</translation> <translation id="2230005943220647148">Selisiasi</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">Swichi ya muundo</translation> <translation id="225692081236532131">Hali ya kuwasha</translation> <translation id="2287186687001756809">Hakuna picha inayopatikana. Ili uweke picha, nenda kwenye <ph name="LINK" /></translation> <translation id="2307344026739914387">Tumia jozi ya funguo ya sasa</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">Wi-Fi inayopima data</translation> <translation id="3583278742022654445">Muunganisho wa mtandao ni dhaifu. Jaribu kusogea karibu na chanzo cha mawimbi ya Wi-Fi.</translation> <translation id="3595596368722241419">Betri imejaa</translation> +<translation id="3600339377155080675">Kitufe cha uakisi wa skrini</translation> <translation id="3603829704940252505">Ishara</translation> <translation id="360565022852130722">Mtandao wa WiFi umelindwa kwa kutumia itifaki hafifu ya WEP 802.1x</translation> <translation id="3606583719724308068">Muda mwingi wa kusubiri maombi ya tovuti za HTTPS</translation> +<translation id="3632579075709132555">Kugeuza skrini ya faragha</translation> <translation id="3689839747745352263">Jaribio la <ph name="TEST_NAME" /></translation> <translation id="370665806235115550">Inapakia...</translation> <translation id="3708186454126126312">Vilivyounganishwa awali</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">Muhtasari</translation> <translation id="4297501883039923494">Imesimama - Hitilafu isiyojulikana</translation> <translation id="4300073214558989">Picha <ph name="IMAGE_COUNT" /></translation> +<translation id="4333390807948134856">Kitufe cha <ph name="KEY_NAME" /> kimebonyezwa</translation> <translation id="4378373042927530923">Usitekeleze</translation> <translation id="4378551569595875038">Inaunganisha...</translation> <translation id="4382484599443659549">PDF</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">Ethaneti</translation> <translation id="4483049906298469269">Imeshindwa kuita lango la mtandao usio chaguomsingi</translation> <translation id="4485626319513081846">Teua chaguo hili ikiwa kifaa kinaletwa dukani baada ya kuisha au kinarekebishwa ili kisambazwe kwa mteja mpya.</translation> +<translation id="4503223151711056411">Kishale cha kushoto</translation> <translation id="4511264077854731334">Tovuti kuu</translation> <translation id="4521826082652183069">Jina mbadala la kichwa linalolingana</translation> <translation id="4536864596629708641">Mipangilio ya IP</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">Hakuna huduma</translation> <translation id="458794348635939462">Imeshindwa kusuluhisha seva pangishi zote</translation> <translation id="4593212453765072419">Uthibitishaji wa proksi unahitajika</translation> +<translation id="4609350030397390689">Punguza mwangaza wa kibodi</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> kati ya <ph name="TOTAL_PAGE_NUMBER" />. Bonyeza 'Enter' ili ughairi kazi ya kuchapisha.</translation> <translation id="4627645661474370390">Utambulisho wa kiunga mbali</translation> <translation id="463791356324567266">Inaghairi uchanganuzi...</translation> <translation id="4646949265910132906">Muunganisho Salama wa WiFi</translation> +<translation id="4650608062294027130">Kitufe cha Shitf cha kulia</translation> <translation id="4654549501020883054">Badilisha Kila Siku</translation> <translation id="4665014895760275686">Mtengenezaji</translation> <translation id="467510802200863975">Manenosiri hayalingani</translation> @@ -390,8 +401,10 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Changanua upya</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5600027863942488546">Kitufe cha <ph name="KEY_NAME" /> kimejaribishwa</translation> <translation id="5620281292257375798">Ndani ya kampuni pekee</translation> <translation id="5649768706273821470">Sikiliza</translation> +<translation id="5655283760733841251">Ongeza mwangaza wa kibodi</translation> <translation id="5669267381087807207">Inawashwa</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">Familia</translation> @@ -399,6 +412,7 @@ <translation id="5707900041990977207"><ph name="CURRENT_PAGE" /> kati ya <ph name="TOTAL_PAGES" /></translation> <translation id="5733298426544876109">Sasisha <ph name="DEVICE_NAME" /></translation> <translation id="5760715441271661976">Hali ya Ukurasa wa Mwanzo</translation> +<translation id="576835345334454681">Ongeza mwangaza wa skrini</translation> <translation id="57838592816432529">Zima sauti</translation> <translation id="5784136236926853061">Muda mwingi wa kusubiri maombi ya HTTP</translation> <translation id="5832805196449965646">Ongeza Mtumiaji Mwingine</translation> @@ -429,6 +443,7 @@ <translation id="6104112872696127344">Uchanganuzi umeghairiwa</translation> <translation id="6106186594183574873">Ili ukamilishe, weka nenosiri lako la awali</translation> <translation id="6108689792487843350">Imeshindwa kufikia lango</translation> +<translation id="6113701710518389813">Kishale cha juu</translation> <translation id="6122191549521593678">Mtandaoni</translation> <translation id="6137767437444130246">Cheti cha mtumiaji</translation> <translation id="6146993107019042706">Ili ukamilishe, weka nenosiri jipya</translation> @@ -442,6 +457,7 @@ <translation id="6232017090690406397">Betri</translation> <translation id="6235460611964961764">Weka upya matumizi ya data wewe mwenyewe</translation> <translation id="6243280677745499710">Mandhari yaliyopo</translation> +<translation id="6275224645089671689">Kishale cha kulia</translation> <translation id="6278428485366576908">Mandhari</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515">Jaribio la <ph name="TEST_NAME" /> limeghairiwa</translation> @@ -477,6 +493,7 @@ <translation id="6620487321149975369">Kazi za kuchapisha zitaonekana katika historia usipoziondoa mwenyewe</translation> <translation id="6643016212128521049">Futa</translation> <translation id="6647510110698214773">Algoriti ya usimbaji fiche</translation> +<translation id="6650062777702288430">Swichi ya kana au herufi na nambari</translation> <translation id="6657585470893396449">Nenosiri</translation> <translation id="6659594942844771486">Kichupo</translation> <translation id="6692996468359469499">Pata maelezo yanayohusiana na chaguo lako</translation> @@ -689,6 +706,7 @@ <translation id="9122602430962285795">Nenda kwenye Mipangilio ili uunganishe tena</translation> <translation id="9126720536733509015">Hifadhi kurasa nyingi kwenye PDF moja</translation> <translation id="9137526406337347448">Huduma za Google</translation> +<translation id="9138630967333032450">Kitufe cha Shift cha kushoto</translation> <translation id="9149391708638971077">Tekeleza jaribio la Hifadhi</translation> <translation id="9173638680043580060">Imesalia chini ya dakika moja</translation> <translation id="917720651393141712">Jaribu</translation>
diff --git a/chromeos/strings/chromeos_strings_th.xtb b/chromeos/strings/chromeos_strings_th.xtb index 5fd23859..2201f25 100644 --- a/chromeos/strings/chromeos_strings_th.xtb +++ b/chromeos/strings/chromeos_strings_th.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">นำออก</translation> <translation id="1195447618553298278">ข้อผิดพลาดที่ไม่รู้จัก</translation> <translation id="1196959502276349371">เวอร์ชัน <ph name="VERSION" /></translation> +<translation id="1199355487114804640">เล่น/หยุดชั่วคราว</translation> <translation id="1201402288615127009">ถัดไป</translation> <translation id="1204296502688602597">เวลาในการตอบสนองของ DNS</translation> <translation id="123124571410524056">สงสัยว่าเป็นพอร์ทัล</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">ไม่สำเร็จ - ตัวกรองล้มเหลว</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">ฉันมีคู่คีย์</translation> +<translation id="1423591390236870726">ไม่ได้กดปุ่ม <ph name="KEY_NAME" /> อยู่</translation> <translation id="1435763214710588005">รีเซ็ตปริมาณการใช้อินเทอร์เน็ตทุกเดือนโดยอัตโนมัติในวันที่เลือก</translation> <translation id="1442433966118452622">แหล่งที่มาของภาพ</translation> <translation id="1451536289672181509">อุปกรณ์เป็นแป้นพิมพ์</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">แกลเลอรีศิลปะ</translation> <translation id="1851218745569890714">การประชุมทางวิดีโอ</translation> <translation id="1852934301711881861">ติดตั้ง Chrome OS Flex</translation> +<translation id="1856388568474281774">ลูกศรลง</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">การแก้ไขฮาร์ดแวร์</translation> <translation id="1905710495812624430">ลองทำเกินจำนวนครั้งที่กำหนดไว้แล้ว</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">ลองทำตามขั้นตอนการแก้ปัญหา</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">การตั้งค่าเพิ่มเติม</translation> +<translation id="2085089206770112532">ลดความสว่างของหน้าจอ</translation> <translation id="2104796393919810494">ซ่อมเสร็จแล้ว</translation> <translation id="2105810540595158374">อุปกรณ์เป็นอุปกรณ์ควบคุมเกม</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" /> เวอร์ชัน <ph name="MILESTONE_VERSION" /></translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">ต้องเลือกอัลบั้มแกลเลอรีศิลปะอย่างน้อย 1 อัลบั้ม</translation> <translation id="2230005943220647148">เซลเซียส</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">สลับเลย์เอาต์</translation> <translation id="225692081236532131">สถานะการเปิดใช้งาน</translation> <translation id="2287186687001756809">ไม่มีรูปภาพ ไปที่ <ph name="LINK" /> เพื่อเพิ่มรูปภาพ</translation> <translation id="2307344026739914387">ใช้คู่คีย์ปัจจุบัน</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">Wi-Fi ที่มีการวัดปริมาณอินเทอร์เน็ต</translation> <translation id="3583278742022654445">ความแรงสัญญาณไม่ดี ลองขยับไปใกล้ๆ แหล่งสัญญาณ Wi-Fi มากขึ้น</translation> <translation id="3595596368722241419">แบตเตอรี่เต็ม</translation> +<translation id="3600339377155080675">มิเรอร์หน้าจอ</translation> <translation id="3603829704940252505">รูปโปรไฟล์</translation> <translation id="360565022852130722">เครือข่าย WiFi มีการรักษาความปลอดภัยด้วยโปรโตคอล WEP 802.1x ที่ไม่รัดกุม</translation> <translation id="3606583719724308068">เวลาในการตอบสนองไปยังเว็บไซต์ HTTPS สูง</translation> +<translation id="3632579075709132555">เปิด/ปิดหน้าจอความเป็นส่วนตัว</translation> <translation id="3689839747745352263">การทดสอบ <ph name="TEST_NAME" /></translation> <translation id="370665806235115550">กำลังโหลด ...</translation> <translation id="3708186454126126312">อุปกรณ์ที่เคยเชื่อมต่อ</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">ภาพรวม</translation> <translation id="4297501883039923494">หยุดพิมพ์ - ข้อผิดพลาดที่ไม่รู้จัก</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> ภาพ</translation> +<translation id="4333390807948134856">กดปุ่ม <ph name="KEY_NAME" /> อยู่</translation> <translation id="4378373042927530923">ไม่ทำงาน</translation> <translation id="4378551569595875038">กำลังเชื่อมต่อ</translation> <translation id="4382484599443659549">PDF</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">อีเทอร์เน็ต</translation> <translation id="4483049906298469269">ใช้คำสั่ง ping กับเกตเวย์เครือข่ายที่ไม่ใช่ค่าเริ่มต้นไม่สำเร็จ</translation> <translation id="4485626319513081846">เลือกตัวเลือกนี้หากอุปกรณ์อยู่ระหว่างเติมสต็อกหรือซ่อมแซมใหม่สำหรับจัดส่งไปยังลูกค้าใหม่</translation> +<translation id="4503223151711056411">ลูกศรซ้าย</translation> <translation id="4511264077854731334">พอร์ทัล</translation> <translation id="4521826082652183069">การจับคู่ชื่อสำรองของหัวเรื่อง</translation> <translation id="4536864596629708641">การกำหนดค่า IP</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">ไม่มีบริการ</translation> <translation id="458794348635939462">แก้ไขทุกโฮสต์ไม่สำเร็จ</translation> <translation id="4593212453765072419">จำเป็นต้องมีการตรวจสอบสิทธิ์พร็อกซี</translation> +<translation id="4609350030397390689">ลดความสว่างของแป้นพิมพ์</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> จาก <ph name="TOTAL_PAGE_NUMBER" /> หน้า กด Enter เพื่อยกเลิกงานพิมพ์</translation> <translation id="4627645661474370390">ข้อมูลประจำตัวระยะไกล</translation> <translation id="463791356324567266">กำลังยกเลิกการสแกน...</translation> <translation id="4646949265910132906">การเชื่อมต่อ Wi-Fi ที่ปลอดภัย</translation> +<translation id="4650608062294027130">Shift ขวา</translation> <translation id="4654549501020883054">เปลี่ยนทุกวัน</translation> <translation id="4665014895760275686">ผู้ผลิต</translation> <translation id="467510802200863975">รหัสผ่านไม่ตรงกัน</translation> @@ -391,8 +402,10 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">สแกนอีกครั้ง</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5600027863942488546">ทดสอบปุ่ม <ph name="KEY_NAME" /> อยู่</translation> <translation id="5620281292257375798">ภายในเท่านั้น</translation> <translation id="5649768706273821470">ฟัง</translation> +<translation id="5655283760733841251">เพิ่มความสว่างของแป้นพิมพ์</translation> <translation id="5669267381087807207">กำลังเปิดใช้</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">ครอบครัว</translation> @@ -400,6 +413,7 @@ <translation id="5707900041990977207"><ph name="CURRENT_PAGE" /> จาก <ph name="TOTAL_PAGES" /></translation> <translation id="5733298426544876109">อัปเดต <ph name="DEVICE_NAME" /></translation> <translation id="5760715441271661976">สถานะพอร์ทัล</translation> +<translation id="576835345334454681">เพิ่มความสว่างของหน้าจอ</translation> <translation id="57838592816432529">ปิดเสียง</translation> <translation id="5784136236926853061">เวลาในการตอบสนองของ HTTP สูง</translation> <translation id="5832805196449965646">เพิ่มบุคคล</translation> @@ -430,6 +444,7 @@ <translation id="6104112872696127344">ยกเลิกการสแกนแล้ว</translation> <translation id="6106186594183574873">ป้อนรหัสผ่านเดิมเพื่อเปลี่ยนรหัสผ่านให้เสร็จ</translation> <translation id="6108689792487843350">เข้าถึงเกตเวย์ไม่ได้</translation> +<translation id="6113701710518389813">ลูกศรขึ้น</translation> <translation id="6122191549521593678">ออนไลน์</translation> <translation id="6137767437444130246">ใบรับรองของผู้ใช้</translation> <translation id="6146993107019042706">ป้อนรหัสผ่านใหม่เพื่อเปลี่ยนรหัสผ่านให้เสร็จ</translation> @@ -443,6 +458,7 @@ <translation id="6232017090690406397">แบตเตอรี่</translation> <translation id="6235460611964961764">รีเซ็ตปริมาณการใช้อินเทอร์เน็ตด้วยตนเอง</translation> <translation id="6243280677745499710">วอลเปเปอร์ปัจจุบัน</translation> +<translation id="6275224645089671689">ลูกศรขวา</translation> <translation id="6278428485366576908">ธีม</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515">ยกเลิกการทดสอบ<ph name="TEST_NAME" />แล้ว</translation> @@ -478,6 +494,7 @@ <translation id="6620487321149975369">งานพิมพ์จะปรากฏในประวัติการพิมพ์ เว้นแต่จะมีผู้ใช้นำออกไปด้วยตนเอง</translation> <translation id="6643016212128521049">ล้าง</translation> <translation id="6647510110698214773">อัลกอริทึมการเข้ารหัส</translation> +<translation id="6650062777702288430">สลับระหว่างอักขระคานะ/ตัวอักษรและตัวเลขคละกัน</translation> <translation id="6657585470893396449">รหัสผ่าน</translation> <translation id="6659594942844771486">แท็บ</translation> <translation id="6692996468359469499">ดูข้อมูลที่เกี่ยวข้องกับการเลือกของคุณ</translation> @@ -690,6 +707,7 @@ <translation id="9122602430962285795">ไปที่การตั้งค่าเพื่อเชื่อมต่ออีกครั้ง</translation> <translation id="9126720536733509015">บันทึกหลายหน้าเป็น PDF ไฟล์เดียว</translation> <translation id="9137526406337347448">Google Services</translation> +<translation id="9138630967333032450">Shift ซ้าย</translation> <translation id="9149391708638971077">ทดสอบหน่วยความจำ</translation> <translation id="9173638680043580060">เหลืออีกไม่ถึง 1 นาที</translation> <translation id="917720651393141712">ทดสอบ</translation>
diff --git a/chromeos/strings/chromeos_strings_tr.xtb b/chromeos/strings/chromeos_strings_tr.xtb index 1e56338..5fd4aa46 100644 --- a/chromeos/strings/chromeos_strings_tr.xtb +++ b/chromeos/strings/chromeos_strings_tr.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">Kaldır</translation> <translation id="1195447618553298278">Bilinmeyen hata.</translation> <translation id="1196959502276349371">Sürüm <ph name="VERSION" /></translation> +<translation id="1199355487114804640">Oynat/Duraklat</translation> <translation id="1201402288615127009">İleri</translation> <translation id="1204296502688602597">DNS Gecikmesi</translation> <translation id="123124571410524056">Portal olabilir</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">İşlem başarısız - Filtre başarısız</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">Anahtar çiftim var</translation> +<translation id="1423591390236870726"><ph name="KEY_NAME" /> tuşuna basılmadı</translation> <translation id="1435763214710588005">Her ay belirli bir günde veri kullanımı otomatik olarak sıfırlanır</translation> <translation id="1442433966118452622">Resim kaynağı</translation> <translation id="1451536289672181509">Cihazın türü klavye.</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">Sanat galerisi</translation> <translation id="1851218745569890714">Video Konferansı</translation> <translation id="1852934301711881861">ChromeOS Flex'i yükle</translation> +<translation id="1856388568474281774">Aşağı ok</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">Donanım düzeltmesi</translation> <translation id="1905710495812624430">İzin verilen maksimum deneme sayısı aşıldı.</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">Sorun giderme adımlarını deneyin</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">Daha fazla ayar</translation> +<translation id="2085089206770112532">Ekran parlaklığını azalt</translation> <translation id="2104796393919810494">Onarım tamamlandı</translation> <translation id="2105810540595158374">Cihazın türü oyun kumandası.</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, sürüm <ph name="MILESTONE_VERSION" /></translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">En az bir Sanat galerisi albümü seçilmelidir</translation> <translation id="2230005943220647148">Santigrat</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">Düzeni değiştir</translation> <translation id="225692081236532131">Etkinleştirme durumu</translation> <translation id="2287186687001756809">Resim yok. Fotoğraf eklemek için <ph name="LINK" /> adresine gidin</translation> <translation id="2307344026739914387">Mevcut anahtar çiftini kullanın</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">sayaçlı kablosuz ağ</translation> <translation id="3583278742022654445">Düşük sinyal gücü. Kablosuz sinyal kaynağına yaklaşmayı deneyin.</translation> <translation id="3595596368722241419">Pil tam dolu</translation> +<translation id="3600339377155080675">Ekranı yansıt</translation> <translation id="3603829704940252505">Avatar</translation> <translation id="360565022852130722">Kablosuz ağ, zayıf bir protokol olan WEP 802.1x ile güvenlik altına alınmış</translation> <translation id="3606583719724308068">HTTPS web sitelerinde yüksek gecikme süresi</translation> +<translation id="3632579075709132555">Gizlilik ekranını aç/kapat</translation> <translation id="3689839747745352263"><ph name="TEST_NAME" /> testi</translation> <translation id="370665806235115550">Yükleniyor...</translation> <translation id="3708186454126126312">Daha önce bağlanılmış cihazlar</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">Genel bakış</translation> <translation id="4297501883039923494">Durduruldu - Bilinmeyen hata</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> Resim</translation> +<translation id="4333390807948134856"><ph name="KEY_NAME" /> tuşuna basıldı</translation> <translation id="4378373042927530923">Çalıştırılmadı</translation> <translation id="4378551569595875038">Bağlanıyor...</translation> <translation id="4382484599443659549">PDF</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Varsayılan olmayan ağ geçidi pinglenemedi</translation> <translation id="4485626319513081846">Cihaz yeni bir müşteriye dağıtılmak üzere yenileniyor veya tekrar stoklara ekleniyorsa bu seçeneği belirleyin.</translation> +<translation id="4503223151711056411">Sol ok</translation> <translation id="4511264077854731334">Portal</translation> <translation id="4521826082652183069">Alternatif konu adı eşleşmesi</translation> <translation id="4536864596629708641">IP Yapılandırması</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">Hizmet yok</translation> <translation id="458794348635939462">Tüm ana makineler çözümlenemedi</translation> <translation id="4593212453765072419">Proxy kimlik doğrulaması gerekli</translation> +<translation id="4609350030397390689">Klavye parlaklığını azalt</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" />/<ph name="TOTAL_PAGE_NUMBER" /> Yazdırma işini iptal etmek için enter tuşuna basın.</translation> <translation id="4627645661474370390">Uzak kimlik</translation> <translation id="463791356324567266">Tarama iptal ediliyor...</translation> <translation id="4646949265910132906">Güvenli Kablosuz Bağlantı</translation> +<translation id="4650608062294027130">Sağ üst karakter</translation> <translation id="4654549501020883054">Günlük Olarak Değiştir</translation> <translation id="4665014895760275686">Üretici</translation> <translation id="467510802200863975">Şifreler eşleşmiyor</translation> @@ -391,8 +402,10 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Yeniden tara</translation> <translation id="5583640892426849032">Geri al tuşu</translation> +<translation id="5600027863942488546"><ph name="KEY_NAME" /> tuşu test edildi</translation> <translation id="5620281292257375798">Yalnızca dahili</translation> <translation id="5649768706273821470">Dinle</translation> +<translation id="5655283760733841251">Klavye parlaklığını artır</translation> <translation id="5669267381087807207">Etkinleştiriliyor</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">Aile</translation> @@ -400,6 +413,7 @@ <translation id="5707900041990977207"><ph name="CURRENT_PAGE" />/<ph name="TOTAL_PAGES" /></translation> <translation id="5733298426544876109"><ph name="DEVICE_NAME" /> cihazı güncelle</translation> <translation id="5760715441271661976">Portal Durumu</translation> +<translation id="576835345334454681">Ekran parlaklığını artır</translation> <translation id="57838592816432529">Sesi kapat</translation> <translation id="5784136236926853061">Yüksek HTTP gecikmesi</translation> <translation id="5832805196449965646">Kişi Ekle</translation> @@ -430,6 +444,7 @@ <translation id="6104112872696127344">Tarama iptal edildi</translation> <translation id="6106186594183574873">Bitirmek için eski şifrenizi girin</translation> <translation id="6108689792487843350">Ağ geçidine ulaşılamıyor</translation> +<translation id="6113701710518389813">Yukarı ok</translation> <translation id="6122191549521593678">Çevrimiçi</translation> <translation id="6137767437444130246">Kullanıcı sertifikası</translation> <translation id="6146993107019042706">Bitirmek için yeni şifrenizi girin</translation> @@ -443,6 +458,7 @@ <translation id="6232017090690406397">Pil</translation> <translation id="6235460611964961764">Veri kullanımını manuel olarak sıfırla</translation> <translation id="6243280677745499710">Şu anda ayarlı</translation> +<translation id="6275224645089671689">Sağ ok</translation> <translation id="6278428485366576908">Tema</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515"><ph name="TEST_NAME" /> testi iptal edildi</translation> @@ -478,6 +494,7 @@ <translation id="6620487321149975369">Yazdırma işleri, manuel olarak kaldırılmadığı sürece geçmişte görünür</translation> <translation id="6643016212128521049">Temizle</translation> <translation id="6647510110698214773">Şifreleme algoritması</translation> +<translation id="6650062777702288430">Kana/alfanümerik karaktere geç</translation> <translation id="6657585470893396449">Şifre</translation> <translation id="6659594942844771486">Sekme</translation> <translation id="6692996468359469499">Seçiminizle alakalı bilgi edinin</translation> @@ -690,6 +707,7 @@ <translation id="9122602430962285795">Tekrar bağlanmak için Ayarlar'a gidin</translation> <translation id="9126720536733509015">Birden fazla sayfayı tek bir PDF'ye kaydet</translation> <translation id="9137526406337347448">Google Hizmetleri</translation> +<translation id="9138630967333032450">Sol üst karakter</translation> <translation id="9149391708638971077">Bellek testini çalıştır</translation> <translation id="9173638680043580060">Bir dakikadan az kaldı</translation> <translation id="917720651393141712">Test</translation>
diff --git a/chromeos/strings/chromeos_strings_uk.xtb b/chromeos/strings/chromeos_strings_uk.xtb index ab073a4..7719699 100644 --- a/chromeos/strings/chromeos_strings_uk.xtb +++ b/chromeos/strings/chromeos_strings_uk.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">Видалити</translation> <translation id="1195447618553298278">Невідома помилка.</translation> <translation id="1196959502276349371">Версія <ph name="VERSION" /></translation> +<translation id="1199355487114804640">Відтворити/призупинити</translation> <translation id="1201402288615127009">Далі</translation> <translation id="1204296502688602597">Затримка DNS</translation> <translation id="123124571410524056">Можливо, виявлено портал</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">Не надруковано – помилка фільтра</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">У мене є пара ключів</translation> +<translation id="1423591390236870726">Клавішу "<ph name="KEY_NAME" />" не натиснено</translation> <translation id="1435763214710588005">Щомісяця дані про використання трафіку скидатимуться у вибраний день</translation> <translation id="1442433966118452622">Джерело зображення</translation> <translation id="1451536289672181509">Це клавіатура.</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">Мистецька галерея</translation> <translation id="1851218745569890714">Відеоконференції</translation> <translation id="1852934301711881861">Установити ОС Chrome Flex</translation> +<translation id="1856388568474281774">Стрілка вниз</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">Апаратне забезпечення</translation> <translation id="1905710495812624430">Перевищено максимальну кількість дозволених спроб.</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">Виконайте дії для вирішення проблеми</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">Більше налаштувань</translation> +<translation id="2085089206770112532">Зменшити яскравість екрана</translation> <translation id="2104796393919810494">Ремонт завершено</translation> <translation id="2105810540595158374">Це ігровий контролер.</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, версія <ph name="MILESTONE_VERSION" /></translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">Потрібно вибрати принаймні один альбом із мистецької галереї</translation> <translation id="2230005943220647148">Градуси Цельсія</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">Перемикач розкладки клавіатури</translation> <translation id="225692081236532131">Статус активації</translation> <translation id="2287186687001756809">Немає зображень. Щоб додати фото, перейдіть на сторінку <ph name="LINK" /></translation> <translation id="2307344026739914387">Використовувати поточну пару ключів</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">Wi-Fi із тарифікацією трафіку</translation> <translation id="3583278742022654445">Низький рівень сигналу. Підійдіть ближче до джерела сигналу Wi-Fi.</translation> <translation id="3595596368722241419">Акумулятор заряджено</translation> +<translation id="3600339377155080675">Дзеркалювання екрана</translation> <translation id="3603829704940252505">Аватар</translation> <translation id="360565022852130722">Мережа Wi-Fi захищена ненадійним протоколом WEP 802.1x</translation> <translation id="3606583719724308068">Велика затримка для веб-сайтів HTTPS</translation> +<translation id="3632579075709132555">Перемикач Екрана конфіденційності</translation> <translation id="3689839747745352263">Перевірка "<ph name="TEST_NAME" />"</translation> <translation id="370665806235115550">Завантаження...</translation> <translation id="3708186454126126312">Підключені раніше</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">Огляд</translation> <translation id="4297501883039923494">Зупинено – невідома помилка</translation> <translation id="4300073214558989">Зображень: <ph name="IMAGE_COUNT" /></translation> +<translation id="4333390807948134856">Клавішу "<ph name="KEY_NAME" />" натиснено</translation> <translation id="4378373042927530923">Не виконано</translation> <translation id="4378551569595875038">Підключення…</translation> <translation id="4382484599443659549">PDF</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Не вдалося надіслати запит ping шлюзу мережі не за умовчанням</translation> <translation id="4485626319513081846">Виберіть цей варіант, якщо пристрій знову в наявності або відремонтований для надання новому клієнту.</translation> +<translation id="4503223151711056411">Стрілка вліво</translation> <translation id="4511264077854731334">Портал</translation> <translation id="4521826082652183069">Збіг з альтернативною назвою суб’єкта</translation> <translation id="4536864596629708641">Конфігурація IP-адрес</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">Не працює</translation> <translation id="458794348635939462">Не вдалося розпізнати всі хости</translation> <translation id="4593212453765072419">Потрібна автентифікація проксі-сервера</translation> +<translation id="4609350030397390689">Зменшити яскравість клавіатури</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> з <ph name="TOTAL_PAGE_NUMBER" />. Натисніть Enter, щоб скасувати завдання друку.</translation> <translation id="4627645661474370390">Віддалений ідентифікатор</translation> <translation id="463791356324567266">Сканування скасовується…</translation> <translation id="4646949265910132906">Надійне з'єднання Wi-Fi</translation> +<translation id="4650608062294027130">Права клавіша Shift</translation> <translation id="4654549501020883054">Змінювати щодня</translation> <translation id="4665014895760275686">Виробник</translation> <translation id="467510802200863975">Паролі не збігаються</translation> @@ -391,8 +402,10 @@ <translation id="5578477003638479617">Технологія UMTS</translation> <translation id="5578519639599103840">Сканувати ще раз</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5600027863942488546">Клавішу "<ph name="KEY_NAME" />" перевірено</translation> <translation id="5620281292257375798">Лише для внутрішнього використання</translation> <translation id="5649768706273821470">Слухати</translation> +<translation id="5655283760733841251">Збільшити яскравість клавіатури</translation> <translation id="5669267381087807207">Активація</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">Сім’я</translation> @@ -400,6 +413,7 @@ <translation id="5707900041990977207"><ph name="CURRENT_PAGE" /> з <ph name="TOTAL_PAGES" /></translation> <translation id="5733298426544876109">Оновити пристрій: <ph name="DEVICE_NAME" /></translation> <translation id="5760715441271661976">Стан порталу</translation> +<translation id="576835345334454681">Збільшити яскравість екрана</translation> <translation id="57838592816432529">Вимкнути звук</translation> <translation id="5784136236926853061">Велика затримка HTTP</translation> <translation id="5832805196449965646">Додати користувача</translation> @@ -430,6 +444,7 @@ <translation id="6104112872696127344">Сканування скасовано</translation> <translation id="6106186594183574873">Щоб завершити, введіть старий пароль</translation> <translation id="6108689792487843350">шлюз недоступний</translation> +<translation id="6113701710518389813">Стрілка вгору</translation> <translation id="6122191549521593678">Онлайн</translation> <translation id="6137767437444130246">Сертифікат користувача</translation> <translation id="6146993107019042706">Щоб завершити, введіть новий пароль</translation> @@ -443,6 +458,7 @@ <translation id="6232017090690406397">Акумулятор</translation> <translation id="6235460611964961764">Вручну скидати дані про використання трафіку</translation> <translation id="6243280677745499710">Налаштовано зараз</translation> +<translation id="6275224645089671689">Стрілка вправо</translation> <translation id="6278428485366576908">Тема</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515">Тест "<ph name="TEST_NAME" />" скасовано</translation> @@ -478,6 +494,7 @@ <translation id="6620487321149975369">Завдання друку відображатимуться в історії, доки ви не вилучите їх вручну</translation> <translation id="6643016212128521049">Очистити</translation> <translation id="6647510110698214773">Алгоритм шифрування</translation> +<translation id="6650062777702288430">Перемикач між розкладками кана й буквено-цифровою</translation> <translation id="6657585470893396449">Пароль</translation> <translation id="6659594942844771486">Вкладка</translation> <translation id="6692996468359469499">Отримати інформацію, пов'язану з виділеним текстом</translation> @@ -690,6 +707,7 @@ <translation id="9122602430962285795">Щоб знову підключитися, перейдіть у налаштування</translation> <translation id="9126720536733509015">Зберігати кілька сторінок в один файл PDF</translation> <translation id="9137526406337347448">Служби Google</translation> +<translation id="9138630967333032450">Ліва клавіша Shift</translation> <translation id="9149391708638971077">Виконати перевірку пам'яті</translation> <translation id="9173638680043580060">Залишилося менше хвилини</translation> <translation id="917720651393141712">Перевірити</translation>
diff --git a/chromeos/strings/chromeos_strings_ur.xtb b/chromeos/strings/chromeos_strings_ur.xtb index e3c8bf8..dfda470 100644 --- a/chromeos/strings/chromeos_strings_ur.xtb +++ b/chromeos/strings/chromeos_strings_ur.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">ہٹائیں</translation> <translation id="1195447618553298278">نامعلوم خرابی۔</translation> <translation id="1196959502276349371">ورژن <ph name="VERSION" /></translation> +<translation id="1199355487114804640">چلائیں/روکیں</translation> <translation id="1201402288615127009">اگلا</translation> <translation id="1204296502688602597">DNS تاخیر</translation> <translation id="123124571410524056">پورٹل مشکوک ہے</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">ناکام ہو گیا - فلٹر ناکام ہو گیا</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">میرے پاس کلیدوں کا ایک جوڑا ہے</translation> +<translation id="1423591390236870726"><ph name="KEY_NAME" /> کلید نہیں دبائی گئی</translation> <translation id="1435763214710588005">ہر ماہ منتخب کردہ دن پر ڈیٹا کے استعمال کو خودکار طور پر ری سیٹ کرتا ہے</translation> <translation id="1442433966118452622">تصویر کا ماخذ</translation> <translation id="1451536289672181509">آلہ ایک کی بورڈ ہے۔</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">آرٹ گیلری</translation> <translation id="1851218745569890714">ویڈیو کانفرنسنگ</translation> <translation id="1852934301711881861">ChromeOS Flex انسٹال کریں</translation> +<translation id="1856388568474281774">نیچے تیر کا نشان</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">ہارڈ ویئر سے متعلق نظر ثانی</translation> <translation id="1905710495812624430">زیادہ سے زیادہ مجاز کوششوں سے تجاوز کرگیا۔</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">ٹربل شوٹنگ اقدامات کو آزمائیں</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">مزید ترتیبات</translation> +<translation id="2085089206770112532">ڈسپلے کی چمک کم کرنے کی کلید</translation> <translation id="2104796393919810494">مرمت کی کارروائی مکمل ہو گئی</translation> <translation id="2105810540595158374">آلہ ایک گیم کنٹرولر ہے۔</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />، ورژن <ph name="MILESTONE_VERSION" /></translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">کم از کم ایک آرٹ گیلری البم کو منتخب کرنے کی ضرورت ہے</translation> <translation id="2230005943220647148">سیلسیئس</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">لے آؤٹ کو سوئچ کرنے کی کلید</translation> <translation id="225692081236532131">فعالیت کی صورتحال</translation> <translation id="2287186687001756809">کوئی تصویر دستیاب نہیں ہے۔ تصاویر شامل کرنے کے لیے، <ph name="LINK" /> پر جائیں</translation> <translation id="2307344026739914387">موجودہ کلیدوں کا جوڑا استعمال کریں</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">میٹرڈ Wi-Fi</translation> <translation id="3583278742022654445">کمزور سگنل کی مضبوطی۔ Wi-Fi سگنل ماخذ کے قریب منتقل کرنے کی کوشش کریں۔</translation> <translation id="3595596368722241419">بیٹری پوری چارج ہے</translation> +<translation id="3600339377155080675">اسکرین مرر</translation> <translation id="3603829704940252505">اوتار</translation> <translation id="360565022852130722">WiFi نیٹ ورک کمزور پروٹوکول WEP 802.1x کے ساتھ محفوظ ہے</translation> <translation id="3606583719724308068">HTTPS ویب سائٹس پر زیادہ تاخیر</translation> +<translation id="3632579075709132555">رازداری کی اسکرین کو ٹوگل کرنے کی کلید</translation> <translation id="3689839747745352263"><ph name="TEST_NAME" /> ٹیسٹ</translation> <translation id="370665806235115550">لوڈ ہو رہے ہیں…</translation> <translation id="3708186454126126312">پہلے سے منسلک کردہ</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">عمومی جائزہ</translation> <translation id="4297501883039923494">رک گیا - نامعلوم خرابی</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> تصاویر</translation> +<translation id="4333390807948134856"><ph name="KEY_NAME" /> کلید دبائی گئی</translation> <translation id="4378373042927530923">نہیں چلا</translation> <translation id="4378551569595875038">منسلک ہو رہا ہے…</translation> <translation id="4382484599443659549">PDF</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">ایتھرنیٹ</translation> <translation id="4483049906298469269">غیر ڈیفالٹ نیٹ ورک گیٹ وے کو پنگ کرنے میں ناکام</translation> <translation id="4485626319513081846">اگر آلے کو نئے کسٹمر کو بھیجنے کے لیے دوبارہ اسٹاک کیا جا رہا ہے یا اس کے لیے استعمال کیا جا رہا ہے تو اس اختیار کو منتخب کریں۔</translation> +<translation id="4503223151711056411">بائیں تیر کا نشان</translation> <translation id="4511264077854731334">پورٹل</translation> <translation id="4521826082652183069">موضوع کا متبادل نام مماثل کریں</translation> <translation id="4536864596629708641">IP کنفیگریشن</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">کوئی سروس نہیں</translation> <translation id="458794348635939462">تمام میزبانوں کو حل کرنے میں ناکام</translation> <translation id="4593212453765072419">پراکسی کی تصدیق درکار ہے</translation> +<translation id="4609350030397390689">کی بورڈ کی چمک کم کرنے کی کلید</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />، <ph name="PRINTER_NAME" />، <ph name="CREATION_TIME" />، <ph name="TOTAL_PAGE_NUMBER" /> میں سے <ph name="PRINTED_PAGE_NUMBER" />۔ براہ کرم پرنٹ جاب منسوخ کرنے کے لیے enter دبائیں۔</translation> <translation id="4627645661474370390">ریموٹ شناخت</translation> <translation id="463791356324567266">اسکین کا عمل منسوخ کیا جا رہا ہے...</translation> <translation id="4646949265910132906">WiFi کنکشن محفوظ کریں</translation> +<translation id="4650608062294027130">دائیں شفٹ</translation> <translation id="4654549501020883054">روزانہ تبدیل کریں</translation> <translation id="4665014895760275686">مینوفیکچرر</translation> <translation id="467510802200863975">پاس ورڈز مماثل نہیں ہیں</translation> @@ -390,8 +401,10 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">دوبارہ اسکین کریں</translation> <translation id="5583640892426849032">بیک اسپیس</translation> +<translation id="5600027863942488546"><ph name="KEY_NAME" /> کلید ٹیسٹ کی گئی</translation> <translation id="5620281292257375798">صرف داخلی</translation> <translation id="5649768706273821470">سنیں</translation> +<translation id="5655283760733841251">کی بورڈ کی چمک بڑھانے کی کلید</translation> <translation id="5669267381087807207">فعال ہو رہا ہے</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">فیملی</translation> @@ -399,6 +412,7 @@ <translation id="5707900041990977207"><ph name="CURRENT_PAGE" /> از <ph name="TOTAL_PAGES" /></translation> <translation id="5733298426544876109"><ph name="DEVICE_NAME" /> اپ ڈیٹ کریں</translation> <translation id="5760715441271661976">پورٹل صورت حال</translation> +<translation id="576835345334454681">ڈسپلے کی چمک بڑھانے کی کلید</translation> <translation id="57838592816432529">آواز بند کریں</translation> <translation id="5784136236926853061">زیادہ HTTPS تاخیر</translation> <translation id="5832805196449965646">شخص کو شامل کریں</translation> @@ -429,6 +443,7 @@ <translation id="6104112872696127344">اسکین کا عمل منسوخ کر دیا گیا</translation> <translation id="6106186594183574873">مکمل کرنے کے لئے اپنا پرانا پاس ورڈ درج کریں</translation> <translation id="6108689792487843350">گیٹ وے ناقابل رسائی ہے</translation> +<translation id="6113701710518389813">اوپر تیر کا نشان</translation> <translation id="6122191549521593678">آن لائن</translation> <translation id="6137767437444130246">صارف کا سرٹیفیکیٹ</translation> <translation id="6146993107019042706">مکمل کرنے کے لئے اپنا نیا پاس ورڈ درج کریں</translation> @@ -442,6 +457,7 @@ <translation id="6232017090690406397">بیٹری</translation> <translation id="6235460611964961764">ڈیٹا کے استعمال کو دستی طور پر ری سیٹ کریں</translation> <translation id="6243280677745499710">فی الحال سیٹ ہے</translation> +<translation id="6275224645089671689">دائیں تیر کا نشان</translation> <translation id="6278428485366576908">تھیم</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515"><ph name="TEST_NAME" /> ٹیسٹ منسوخ کر دیا گیا ہے</translation> @@ -477,6 +493,7 @@ <translation id="6620487321149975369">پرنٹ جابز سرگزشت میں ظاہر ہوں گی جب تک کہ انہیں دستی طور پر ہٹا نہیں دیا جاتا</translation> <translation id="6643016212128521049">صاف کریں</translation> <translation id="6647510110698214773">مرموز کاری الگورتھم</translation> +<translation id="6650062777702288430">کانا/الفانیومیرک کو سوئچ کرنے کی کلید</translation> <translation id="6657585470893396449">پاس ورڈ</translation> <translation id="6659594942844771486">ٹیب</translation> <translation id="6692996468359469499">اپنے انتخاب سے متعلق معلومات حاصل کریں</translation> @@ -689,6 +706,7 @@ <translation id="9122602430962285795">دوبارہ منسلک ہونے کیلئے، ترتیبات پر جائیں</translation> <translation id="9126720536733509015">متعدد صفحات کو ایک PDF میں محفوظ کریں</translation> <translation id="9137526406337347448">Google سروسز</translation> +<translation id="9138630967333032450">بائیں شفٹ</translation> <translation id="9149391708638971077">میموری ٹیسٹ چلائیں</translation> <translation id="9173638680043580060">ایک منٹ سے کم باقی ہے</translation> <translation id="917720651393141712">ٹیسٹ</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-CN.xtb b/chromeos/strings/chromeos_strings_zh-CN.xtb index af3118d..4f8a7c63 100644 --- a/chromeos/strings/chromeos_strings_zh-CN.xtb +++ b/chromeos/strings/chromeos_strings_zh-CN.xtb
@@ -20,6 +20,7 @@ <translation id="1181037720776840403">移除</translation> <translation id="1195447618553298278">未知错误。</translation> <translation id="1196959502276349371"><ph name="VERSION" /> 版</translation> +<translation id="1199355487114804640">播放/暂停</translation> <translation id="1201402288615127009">下一步</translation> <translation id="1204296502688602597">DNS 延迟时间</translation> <translation id="123124571410524056">疑似存在门户</translation> @@ -43,6 +44,7 @@ <translation id="1413240736185167732">失败 - 过滤器出问题了</translation> <translation id="1416836038590872660">EAP-MD5</translation> <translation id="142228117786570094">我有一个密钥对</translation> +<translation id="1423591390236870726">未按下<ph name="KEY_NAME" />键</translation> <translation id="1435763214710588005">在每月的指定日期自动重置流量使用情况</translation> <translation id="1442433966118452622">图片来源</translation> <translation id="1451536289672181509">设备类型是键盘。</translation> @@ -84,6 +86,7 @@ <translation id="1827738518074806965">画廊</translation> <translation id="1851218745569890714">视频会议</translation> <translation id="1852934301711881861">安装 ChromeOS Flex</translation> +<translation id="1856388568474281774">向下</translation> <translation id="1874612839560830905">MTU</translation> <translation id="1887850431809612466">硬件版本</translation> <translation id="1905710495812624430">已超过允许的尝试次数上限。</translation> @@ -98,6 +101,7 @@ <translation id="2016697457005847575">尝试问题排查步骤</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">更多设置</translation> +<translation id="2085089206770112532">调低显示屏亮度</translation> <translation id="2104796393919810494">已修复完毕</translation> <translation id="2105810540595158374">设备类型是游戏控制器。</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />,版本 <ph name="MILESTONE_VERSION" /></translation> @@ -116,6 +120,7 @@ <translation id="222447520299472966">您需要选择至少 1 个画廊影集</translation> <translation id="2230005943220647148">摄氏度</translation> <translation id="2230051135190148440">CHAP</translation> +<translation id="2240366984605217732">布局切换</translation> <translation id="225692081236532131">激活状态</translation> <translation id="2287186687001756809">没有可显示的图片。若要添加照片,请前往 <ph name="LINK" /></translation> <translation id="2307344026739914387">使用当前密钥对</translation> @@ -207,9 +212,11 @@ <translation id="357889014807611375">按流量计费的 Wi-Fi</translation> <translation id="3583278742022654445">信号强度较弱。请尝试移到离 Wi-Fi 信号源更近的地方。</translation> <translation id="3595596368722241419">电池已充满</translation> +<translation id="3600339377155080675">屏幕镜像</translation> <translation id="3603829704940252505">头像</translation> <translation id="360565022852130722">Wi-Fi 网络采用了防护能力较弱的 WEP 802.1x 协议</translation> <translation id="3606583719724308068">HTTPS 网站的延迟时间较长</translation> +<translation id="3632579075709132555">隐私保护屏幕开关</translation> <translation id="3689839747745352263"><ph name="TEST_NAME" />测试</translation> <translation id="370665806235115550">正在加载...</translation> <translation id="3708186454126126312">曾经连接过</translation> @@ -263,6 +270,7 @@ <translation id="4289540628985791613">概述</translation> <translation id="4297501883039923494">已停止 - 未知错误</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> 张图片</translation> +<translation id="4333390807948134856">已按下<ph name="KEY_NAME" />键</translation> <translation id="4378373042927530923">未运行</translation> <translation id="4378551569595875038">正在连接…</translation> <translation id="4382484599443659549">PDF</translation> @@ -278,6 +286,7 @@ <translation id="4479639480957787382">以太网</translation> <translation id="4483049906298469269">未能对非默认网关执行 ping 操作</translation> <translation id="4485626319513081846">若要将设备重新上架或翻新后发放给新客户,请选择此选项。</translation> +<translation id="4503223151711056411">向左</translation> <translation id="4511264077854731334">门户网站</translation> <translation id="4521826082652183069">主题备用名称匹配</translation> <translation id="4536864596629708641">IP 配置</translation> @@ -289,10 +298,12 @@ <translation id="4562494484721939086">无服务</translation> <translation id="458794348635939462">未能解析所有主机</translation> <translation id="4593212453765072419">需要验证代理身份</translation> +<translation id="4609350030397390689">调低键盘亮度</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />,<ph name="PRINTER_NAME" />,<ph name="CREATION_TIME" />,已打印 <ph name="PRINTED_PAGE_NUMBER" /> 页,共 <ph name="TOTAL_PAGE_NUMBER" /> 页。按 Enter 键即可取消这项打印任务。</translation> <translation id="4627645661474370390">远程身份</translation> <translation id="463791356324567266">正在取消扫描…</translation> <translation id="4646949265910132906">安全的 Wi-Fi 连接</translation> +<translation id="4650608062294027130">右 Shift</translation> <translation id="4654549501020883054">每日更换一次</translation> <translation id="4665014895760275686">制造商</translation> <translation id="467510802200863975">输入的两个密码不相同</translation> @@ -391,8 +402,10 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">重新扫描</translation> <translation id="5583640892426849032">退格</translation> +<translation id="5600027863942488546">已测试<ph name="KEY_NAME" />键</translation> <translation id="5620281292257375798">仅供内部使用</translation> <translation id="5649768706273821470">收听</translation> +<translation id="5655283760733841251">调高键盘亮度</translation> <translation id="5669267381087807207">正在激活</translation> <translation id="5670702108860320605">BSSID</translation> <translation id="5691511426247308406">家用</translation> @@ -400,6 +413,7 @@ <translation id="5707900041990977207"><ph name="CURRENT_PAGE" /> / <ph name="TOTAL_PAGES" /></translation> <translation id="5733298426544876109">更新“<ph name="DEVICE_NAME" />”</translation> <translation id="5760715441271661976">门户状态</translation> +<translation id="576835345334454681">调高显示屏亮度</translation> <translation id="57838592816432529">静音</translation> <translation id="5784136236926853061">HTTP 延迟时间较长</translation> <translation id="5832805196449965646">添加用户</translation> @@ -430,6 +444,7 @@ <translation id="6104112872696127344">已取消扫描</translation> <translation id="6106186594183574873">要完成更改,请输入您的旧密码</translation> <translation id="6108689792487843350">无法连接至网关</translation> +<translation id="6113701710518389813">向上</translation> <translation id="6122191549521593678">在线</translation> <translation id="6137767437444130246">用户证书</translation> <translation id="6146993107019042706">要完成更改,请输入您的新密码</translation> @@ -443,6 +458,7 @@ <translation id="6232017090690406397">电池</translation> <translation id="6235460611964961764">手动重置流量使用情况</translation> <translation id="6243280677745499710">当前设置的壁纸</translation> +<translation id="6275224645089671689">向右</translation> <translation id="6278428485366576908">主题背景</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6302401976930124515"><ph name="TEST_NAME" />测试已被取消</translation> @@ -478,6 +494,7 @@ <translation id="6620487321149975369">打印任务如未被手动移除,将会显示在历史记录中,</translation> <translation id="6643016212128521049">清除</translation> <translation id="6647510110698214773">加密算法</translation> +<translation id="6650062777702288430">假名/字母数字切换</translation> <translation id="6657585470893396449">密码</translation> <translation id="6659594942844771486">Tab 键</translation> <translation id="6692996468359469499">获取与您的所选项相关的信息</translation> @@ -690,6 +707,7 @@ <translation id="9122602430962285795">若要重新连接,请转到“设置”</translation> <translation id="9126720536733509015">将多个页面扫描成 1 个 PDF 文件</translation> <translation id="9137526406337347448">Google 服务</translation> +<translation id="9138630967333032450">左 Shift</translation> <translation id="9149391708638971077">运行内存测试</translation> <translation id="9173638680043580060">还剩不到 1 分钟</translation> <translation id="917720651393141712">测试</translation>
diff --git a/components/OWNERS b/components/OWNERS index e47f144d..90f56a3 100644 --- a/components/OWNERS +++ b/components/OWNERS
@@ -14,6 +14,7 @@ per-file autofill_strings.grdp=file://components/autofill/OWNERS per-file bookmark_bar_strings.grdp=file://components/bookmarks/OWNERS per-file browsing_data_strings.grdp=file://components/browsing_data/OWNERS +per-file commerce_strings.grdp=file://components/commerce_strings_grdp/OWNERS per-file content_creation_strings.grdp=file://components/content_creation/OWNERS per-file crash_strings.grdp=file://components/crash/OWNERS per-file dom_distiller_strings.grdp=file://components/dom_distiller/OWNERS
diff --git a/components/app_restore/app_restore_utils.cc b/components/app_restore/app_restore_utils.cc index b487b61..b88cc1fa 100644 --- a/components/app_restore/app_restore_utils.cc +++ b/components/app_restore/app_restore_utils.cc
@@ -96,7 +96,8 @@ ArcReadHandler* arc_read_handler = ShouldUseFullRestoreArcData() ? full_restore_read_handler->arc_read_handler() - : DeskTemplateReadHandler::Get()->arc_read_handler(); + : DeskTemplateReadHandler::Get()->GetArcReadHandlerForWindow( + restore_window_id); window_info = arc_read_handler ? arc_read_handler->GetWindowInfo(restore_window_id) : nullptr; @@ -179,6 +180,12 @@ arc_session_id, window_id); } +void SetDeskTemplateLaunchIdForArcSessionId(int32_t arc_session_id, + int32_t desk_template_launch_id) { + DeskTemplateReadHandler::Get()->SetLaunchIdForArcSessionId( + arc_session_id, desk_template_launch_id); +} + int32_t GetArcRestoreWindowIdForTaskId(int32_t task_id) { if (ShouldUseFullRestoreArcData()) { return full_restore::FullRestoreReadHandler::GetInstance()
diff --git a/components/app_restore/app_restore_utils.h b/components/app_restore/app_restore_utils.h index 281c759..1381750e 100644 --- a/components/app_restore/app_restore_utils.h +++ b/components/app_restore/app_restore_utils.h
@@ -65,6 +65,11 @@ COMPONENT_EXPORT(APP_RESTORE) void SetArcSessionIdForWindowId(int32_t arc_session_id, int32_t window_id); +// Associates `desk_template_launch_id` with `arc_session_id`. +COMPONENT_EXPORT(APP_RESTORE) +void SetDeskTemplateLaunchIdForArcSessionId(int32_t arc_session_id, + int32_t desk_template_launch_id); + // Returns the restore window id for the ARC app's `task_id`. COMPONENT_EXPORT(APP_RESTORE) int32_t GetArcRestoreWindowIdForTaskId(int32_t task_id);
diff --git a/components/app_restore/desk_template_read_handler.cc b/components/app_restore/desk_template_read_handler.cc index ae80470..1b7815d 100644 --- a/components/app_restore/desk_template_read_handler.cc +++ b/components/app_restore/desk_template_read_handler.cc
@@ -19,6 +19,20 @@ namespace app_restore { +namespace { + +// Erase all entries in `map` that have the value `value`. +void EraseMapByValue(base::flat_map<int32_t, int32_t>& map, int32_t value) { + for (auto it = map.begin(); it != map.end();) { + if (it->second == value) + it = map.erase(it); + else + ++it; + } +} + +} // namespace + DeskTemplateReadHandler::DeskTemplateReadHandler() { if (aura::Env::HasInstance()) env_observer_.Observe(aura::Env::GetInstance()); @@ -33,56 +47,75 @@ return desk_template_read_handler.get(); } -void DeskTemplateReadHandler::SetRestoreData( - std::unique_ptr<RestoreData> restore_data) { - // It is expected we do not replace an existing valid `restore_data_` before - // it is cleared by the app launch handler. - if (restore_data) { - DCHECK(!restore_data_) - << "Restore data should be cleared before setting a new one"; - } +ArcReadHandler* DeskTemplateReadHandler::GetArcReadHandlerForWindow( + int32_t restore_window_id) { + return GetArcReadHandlerForLaunch( + GetLaunchIdForRestoreWindowId(restore_window_id)); +} - restore_data_ = std::move(restore_data); +void DeskTemplateReadHandler::SetRestoreData( + int32_t launch_id, + std::unique_ptr<RestoreData> restore_data) { + RestoreData* rd = restore_data.get(); + + DCHECK_EQ(restore_data_.count(launch_id), 0u); + DCHECK_EQ(arc_read_handler_.count(launch_id), 0u); + + restore_data_[launch_id] = std::move(restore_data); if (!ash::features::AreDesksTemplatesEnabled()) return; - arc_read_handler_.reset(); - if (!restore_data_) - return; + // Set up mapping from restore window IDs to launch ID. Create an ARC read + // handler and add restore data to it if we have at least one ARC app. + for (const auto& [app_id, launch_list] : rd->app_id_to_launch_list()) { + for (const auto& [window_id, app_restore_data] : launch_list) { + restore_window_id_to_launch_id_[window_id] = launch_id; - // Add restore data to the `arc_read_handler_` for ARC apps. Create - // `arc_read_handler_` if we have at least one ARC app. - for (const std::pair<std::string, const RestoreData::LaunchList&> entry : - restore_data_->app_id_to_launch_list()) { - const std::string& app_id = entry.first; - for (const std::pair<int, const std::unique_ptr<AppRestoreData>&> - app_restore_data : entry.second) { // Only ARC app launch parameters have event_flag. - if (!app_restore_data.second->event_flag.has_value()) + if (!app_restore_data->event_flag.has_value()) continue; - if (!arc_read_handler_) { - arc_read_handler_ = + + auto& arc_read_handler = arc_read_handler_[launch_id]; + if (!arc_read_handler) { + arc_read_handler = std::make_unique<ArcReadHandler>(base::FilePath(), this); } - const int32_t& window_id = app_restore_data.first; - arc_read_handler_->AddRestoreData(app_id, window_id); + + arc_read_handler->AddRestoreData(app_id, window_id); } } } +RestoreData* DeskTemplateReadHandler::GetRestoreDataForWindow( + int32_t restore_window_id) { + auto it = + restore_data_.find(GetLaunchIdForRestoreWindowId(restore_window_id)); + return it != restore_data_.end() ? it->second.get() : nullptr; +} + +void DeskTemplateReadHandler::ClearRestoreData(int32_t launch_id) { + restore_data_.erase(launch_id); + arc_read_handler_.erase(launch_id); + + EraseMapByValue(restore_window_id_to_launch_id_, launch_id); + EraseMapByValue(session_id_to_launch_id_, launch_id); + EraseMapByValue(task_id_to_launch_id_, launch_id); +} + std::unique_ptr<WindowInfo> DeskTemplateReadHandler::GetWindowInfo( - int restore_window_id) { - if (!restore_data_) + int32_t restore_window_id) { + const auto* restore_data = GetRestoreDataForWindow(restore_window_id); + if (!restore_data) return nullptr; // Try to find the window info associated with `restore_window_id`. const RestoreData::AppIdToLaunchList& launch_list = - restore_data_->app_id_to_launch_list(); + restore_data->app_id_to_launch_list(); for (const auto& it : launch_list) { const std::string& app_id = it.first; const AppRestoreData* app_restore_data = - restore_data_->GetAppRestoreData(app_id, restore_window_id); + restore_data->GetAppRestoreData(app_id, restore_window_id); if (app_restore_data) return app_restore_data->GetWindowInfo(); } @@ -92,46 +125,63 @@ int32_t DeskTemplateReadHandler::FetchRestoreWindowId( const std::string& app_id) { - return restore_data_ ? restore_data_->FetchRestoreWindowId(app_id) : 0; + if (RestoreData* restore_data = GetMostRecentRestoreDataForApp(app_id)) + return restore_data->FetchRestoreWindowId(app_id); + return 0; } void DeskTemplateReadHandler::SetNextRestoreWindowIdForChromeApp( const std::string& app_id) { - if (restore_data_) - restore_data_->SetNextRestoreWindowIdForChromeApp(app_id); + if (RestoreData* restore_data = GetMostRecentRestoreDataForApp(app_id)) + restore_data->SetNextRestoreWindowIdForChromeApp(app_id); +} + +void DeskTemplateReadHandler::SetLaunchIdForArcSessionId(int32_t arc_session_id, + int32_t launch_id) { + session_id_to_launch_id_[arc_session_id] = launch_id; } void DeskTemplateReadHandler::SetArcSessionIdForWindowId(int32_t arc_session_id, int32_t window_id) { - if (arc_read_handler_) - arc_read_handler_->SetArcSessionIdForWindowId(arc_session_id, window_id); + if (int32_t launch_id = GetLaunchIdForArcSessionId(arc_session_id)) { + if (ArcReadHandler* handler = GetArcReadHandlerForLaunch(launch_id)) + handler->SetArcSessionIdForWindowId(arc_session_id, window_id); + } } int32_t DeskTemplateReadHandler::GetArcRestoreWindowIdForTaskId( int32_t task_id) { - return arc_read_handler_ - ? arc_read_handler_->GetArcRestoreWindowIdForTaskId(task_id) - : 0; + auto it = task_id_to_launch_id_.find(task_id); + if (it == task_id_to_launch_id_.end()) + return 0; + + ArcReadHandler* handler = GetArcReadHandlerForLaunch(it->second); + return handler ? handler->GetArcRestoreWindowIdForTaskId(task_id) : 0; } int32_t DeskTemplateReadHandler::GetArcRestoreWindowIdForSessionId( int32_t session_id) { - return arc_read_handler_ - ? arc_read_handler_->GetArcRestoreWindowIdForSessionId(session_id) - : 0; + int32_t launch_id = GetLaunchIdForArcSessionId(session_id); + if (!launch_id) + return 0; + + ArcReadHandler* handler = GetArcReadHandlerForLaunch(launch_id); + return handler ? handler->GetArcRestoreWindowIdForSessionId(session_id) : 0; } void DeskTemplateReadHandler::OnWindowInitialized(aura::Window* window) { // If there isn't restore data for ARC apps, we don't need to handle ARC app // windows restoration. - if (!arc_read_handler_ || !IsArcWindow(window)) + if (arc_read_handler_.empty() || !IsArcWindow(window)) return; const int32_t window_id = window->GetProperty(kRestoreWindowIdKey); + ArcReadHandler* handler = GetArcReadHandlerForWindow(window_id); + if (window_id == app_restore::kParentToHiddenContainer || - arc_read_handler_->HasRestoreData(window_id)) { + (handler && handler->HasRestoreData(window_id))) { observed_windows_.AddObservation(window); - arc_read_handler_->AddArcWindowCandidate(window); + handler->AddArcWindowCandidate(window); } } @@ -139,45 +189,87 @@ DCHECK(observed_windows_.IsObservingSource(window)); observed_windows_.RemoveObservation(window); - if (arc_read_handler_) - arc_read_handler_->OnWindowDestroyed(window); + const int32_t window_id = window->GetProperty(kRestoreWindowIdKey); + if (ArcReadHandler* handler = GetArcReadHandlerForWindow(window_id)) + handler->OnWindowDestroyed(window); } std::unique_ptr<app_restore::AppLaunchInfo> DeskTemplateReadHandler::GetAppLaunchInfo(const base::FilePath& profile_path, const std::string& app_id, int32_t restore_window_id) { - return restore_data_ - ? restore_data_->GetAppLaunchInfo(app_id, restore_window_id) - : nullptr; + if (RestoreData* restore_data = GetRestoreDataForWindow(restore_window_id)) + return restore_data->GetAppLaunchInfo(app_id, restore_window_id); + return nullptr; } std::unique_ptr<WindowInfo> DeskTemplateReadHandler::GetWindowInfo( const base::FilePath& profile_path, const std::string& app_id, int32_t restore_window_id) { - return restore_data_ ? restore_data_->GetWindowInfo(app_id, restore_window_id) - : nullptr; + if (RestoreData* restore_data = GetRestoreDataForWindow(restore_window_id)) + return restore_data->GetWindowInfo(app_id, restore_window_id); + return nullptr; } void DeskTemplateReadHandler::RemoveAppRestoreData( const base::FilePath& profile_path, const std::string& app_id, int32_t restore_window_id) { - if (restore_data_) - restore_data_->RemoveAppRestoreData(app_id, restore_window_id); + if (RestoreData* restore_data = GetRestoreDataForWindow(restore_window_id)) + restore_data->RemoveAppRestoreData(app_id, restore_window_id); } void DeskTemplateReadHandler::OnTaskCreated(const std::string& app_id, int32_t task_id, int32_t session_id) { - if (arc_read_handler_) - arc_read_handler_->OnTaskCreated(app_id, task_id, session_id); + int32_t launch_id = GetLaunchIdForArcSessionId(session_id); + if (launch_id == 0) + return; + + task_id_to_launch_id_[task_id] = launch_id; + + if (ArcReadHandler* handler = GetArcReadHandlerForLaunch(launch_id)) + handler->OnTaskCreated(app_id, task_id, session_id); } void DeskTemplateReadHandler::OnTaskDestroyed(int32_t task_id) { - if (arc_read_handler_) - arc_read_handler_->OnTaskDestroyed(task_id); + auto it = task_id_to_launch_id_.find(task_id); + if (it == task_id_to_launch_id_.end()) + return; + + if (ArcReadHandler* handler = GetArcReadHandlerForLaunch(it->second)) + handler->OnTaskDestroyed(task_id); +} + +int32_t DeskTemplateReadHandler::GetLaunchIdForArcSessionId( + int32_t arc_session_id) { + auto it = session_id_to_launch_id_.find(arc_session_id); + return it != session_id_to_launch_id_.end() ? it->second : 0; +} + +int32_t DeskTemplateReadHandler::GetLaunchIdForRestoreWindowId( + int32_t restore_window_id) { + auto it = restore_window_id_to_launch_id_.find(restore_window_id); + return it != restore_window_id_to_launch_id_.end() ? it->second : 0; +} + +ArcReadHandler* DeskTemplateReadHandler::GetArcReadHandlerForLaunch( + int32_t launch_id) { + auto it = arc_read_handler_.find(launch_id); + return it != arc_read_handler_.end() ? it->second.get() : nullptr; +} + +RestoreData* DeskTemplateReadHandler::GetMostRecentRestoreDataForApp( + const std::string& app_id) { + // Go from newest to oldest. + for (auto it = restore_data_.rbegin(); it != restore_data_.rend(); ++it) { + auto& restore_data = it->second; + if (restore_data->app_id_to_launch_list().count(app_id)) { + return restore_data.get(); + } + } + return nullptr; } } // namespace app_restore
diff --git a/components/app_restore/desk_template_read_handler.h b/components/app_restore/desk_template_read_handler.h index 41568d4..740ae93d 100644 --- a/components/app_restore/desk_template_read_handler.h +++ b/components/app_restore/desk_template_read_handler.h
@@ -9,6 +9,7 @@ #include <string> #include "base/component_export.h" +#include "base/containers/flat_map.h" #include "base/scoped_multi_source_observation.h" #include "base/scoped_observation.h" #include "components/app_restore/app_restore_arc_info.h" @@ -40,17 +41,25 @@ static DeskTemplateReadHandler* Get(); - RestoreData* restore_data() { return restore_data_.get(); } - ArcReadHandler* arc_read_handler() { return arc_read_handler_.get(); } + // Returns the ARC read handler for the launch associated to the window + // `restore_window_id`. Returns nullptr if the launch is unknown. + ArcReadHandler* GetArcReadHandlerForWindow(int32_t restore_window_id); - // Sets the `restore_data` for a launch session. `restore_data` can be - // nullptr, which signifies that a launch session is over. Creates + // Sets the `restore_data` for the launch identified by `launch_id`. Creates // `arc_read_handler_` if necessary, which is a helper class for dealing with // ARC apps. - void SetRestoreData(std::unique_ptr<RestoreData> restore_data); + void SetRestoreData(int32_t launch_id, + std::unique_ptr<RestoreData> restore_data); + + // Returns restore data for the launch associated to the window + // `restore_window_id`. Returns nullptr if the launch is unknown. + RestoreData* GetRestoreDataForWindow(int32_t restore_window_id); + + // Clears restore data for the launch identified by `launch_id`. + void ClearRestoreData(int32_t launch_id); // Gets the window information for `restore_window_id`. - std::unique_ptr<WindowInfo> GetWindowInfo(int restore_window_id); + std::unique_ptr<WindowInfo> GetWindowInfo(int32_t restore_window_id); // Fetches the restore id for the window from RestoreData for the given // `app_id`. `app_id` should be a Chrome app id. @@ -60,9 +69,11 @@ // chrome app with `app_id`. void SetNextRestoreWindowIdForChromeApp(const std::string& app_id); - // Sets `arc_session_id` for `window_id`. `arc session id` is assigned when + // Sets `arc_session_id` for `window_id`. `arc_session_id` is assigned when // ARC apps are restored. void SetArcSessionIdForWindowId(int32_t arc_session_id, int32_t window_id); + // Same as above, but for `launch_id`. + void SetLaunchIdForArcSessionId(int32_t arc_session_id, int32_t launch_id); // Returns the restore window id for the ARC app's `task_id`. int32_t GetArcRestoreWindowIdForTaskId(int32_t task_id); @@ -95,12 +106,31 @@ void OnTaskDestroyed(int32_t task_id) override; private: - // The restore data read from desk storage. Empty when no launch is underway. - std::unique_ptr<RestoreData> restore_data_; + // Returns the launch id that `arc_session_id` is associated with, or 0. + int32_t GetLaunchIdForArcSessionId(int32_t arc_session_id); - // Helper that is created if an ARC app is launched. This class contains some - // ARC specific logic needed to launch ARC apps. - std::unique_ptr<ArcReadHandler> arc_read_handler_; + // Returns the launch id that `restore_window_id` is associated with, or 0. + int32_t GetLaunchIdForRestoreWindowId(int32_t restore_window_id); + + // Returns the arc read handler associated with `launch_id`, or nullptr. + ArcReadHandler* GetArcReadHandlerForLaunch(int32_t launch_id); + + // Returns the most recent launch that has `app_id`. + RestoreData* GetMostRecentRestoreDataForApp(const std::string& app_id); + + // Maps launch id to restore data. + base::flat_map<int32_t, std::unique_ptr<RestoreData>> restore_data_; + + // Maps launch id to helpers with logic specific to launching ARC apps. + base::flat_map<int32_t, std::unique_ptr<ArcReadHandler>> arc_read_handler_; + + // Mapping ARC session id to launch id. + base::flat_map<int32_t, int32_t> session_id_to_launch_id_; + // Mapping ARC task id to launch id. + base::flat_map<int32_t, int32_t> task_id_to_launch_id_; + + // Maps restore window id to launch id. + base::flat_map<int32_t, int32_t> restore_window_id_to_launch_id_; base::ScopedObservation<aura::Env, aura::EnvObserver> env_observer_{this};
diff --git a/components/app_restore/restore_data.cc b/components/app_restore/restore_data.cc index 7c75b97..f3df0545 100644 --- a/components/app_restore/restore_data.cc +++ b/components/app_restore/restore_data.cc
@@ -15,6 +15,14 @@ namespace app_restore { +namespace { + +// Used to generate unique window IDs for desk template launches. Numbers lower +// than this are reserved for full restore. +int32_t g_desk_template_window_restore_id = 1000000000; + +} // namespace + RestoreData::RestoreData() = default; RestoreData::RestoreData(std::unique_ptr<base::Value> restore_data_value) { @@ -253,6 +261,20 @@ } } +void RestoreData::MakeWindowIdsUniqueForDeskTemplate() { + for (auto& [app_id, launch_list] : app_id_to_launch_list_) { + // We don't want to do in-place updates of the launch list since we could + // have collisions. We'll therefore build a new LaunchList and pilfer the + // old one for AppRestoreData. + LaunchList new_launch_list; + for (auto& [window_id, app_restore_data] : launch_list) { + new_launch_list[g_desk_template_window_restore_id++] = + std::move(app_restore_data); + } + launch_list = std::move(new_launch_list); + } +} + std::string RestoreData::ToString() const { if (app_id_to_launch_list_.empty()) return "empty";
diff --git a/components/app_restore/restore_data.h b/components/app_restore/restore_data.h index 2475a3e9..df5e426 100644 --- a/components/app_restore/restore_data.h +++ b/components/app_restore/restore_data.h
@@ -172,6 +172,10 @@ // Sets `desk_index` as the desk to launch on for all windows. void SetDeskIndex(int desk_index); + // Make all contained window IDs globally unique for a desk template + // launch. This must be done before launching. + void MakeWindowIdsUniqueForDeskTemplate(); + std::string ToString() const; const AppIdToLaunchList& app_id_to_launch_list() const {
diff --git a/components/app_restore/window_properties.cc b/components/app_restore/window_properties.cc index 1c3c543..5cda130 100644 --- a/components/app_restore/window_properties.cc +++ b/components/app_restore/window_properties.cc
@@ -23,7 +23,6 @@ DEFINE_UI_CLASS_PROPERTY_KEY(bool, kRealArcTaskWindow, true) DEFINE_UI_CLASS_PROPERTY_KEY(int32_t, kRestoreWindowIdKey, 0) DEFINE_UI_CLASS_PROPERTY_KEY(int32_t, kWindowIdKey, 0) -DEFINE_UI_CLASS_PROPERTY_KEY(int32_t, kLaunchId, 0) DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(WindowInfo, kWindowInfoKey, nullptr) } // namespace app_restore
diff --git a/components/app_restore/window_properties.h b/components/app_restore/window_properties.h index 232ff6c..551813ad 100644 --- a/components/app_restore/window_properties.h +++ b/components/app_restore/window_properties.h
@@ -70,11 +70,6 @@ COMPONENT_EXPORT(APP_RESTORE) extern const ui::ClassProperty<int32_t>* const kWindowIdKey; -// A property key to indicate which launch (full restore or desk template) a -// window is associated with. -COMPONENT_EXPORT(APP_RESTORE) -extern const ui::ClassProperty<int32_t>* const kLaunchId; - COMPONENT_EXPORT(APP_RESTORE) extern const ui::ClassProperty<WindowInfo*>* const kWindowInfoKey;
diff --git a/components/autofill_assistant/android/BUILD.gn b/components/autofill_assistant/android/BUILD.gn index 5ff04b7..6eac8dd 100644 --- a/components/autofill_assistant/android/BUILD.gn +++ b/components/autofill_assistant/android/BUILD.gn
@@ -145,6 +145,7 @@ "java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataNativeDelegate.java", "java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataSection.java", "java/src/org/chromium/components/autofill_assistant/user_data/AssistantContactDetailsSection.java", + "java/src/org/chromium/components/autofill_assistant/user_data/AssistantDataOriginNotice.java", "java/src/org/chromium/components/autofill_assistant/user_data/AssistantDateTime.java", "java/src/org/chromium/components/autofill_assistant/user_data/AssistantInfoSection.java", "java/src/org/chromium/components/autofill_assistant/user_data/AssistantLoginChoice.java", @@ -354,6 +355,7 @@ "internal/java/res/drawable/ic_airline_seat_recline_normal_black_24dp.xml", "internal/java/res/drawable/ic_autofill_assistant_add_circle_24dp.xml", "internal/java/res/drawable/ic_autofill_assistant_default_progress_start_black_24dp.xml", + "internal/java/res/drawable/ic_baseline_help_24dp.xml", "internal/java/res/drawable/ic_check_circle_black_24dp.xml", "internal/java/res/drawable/ic_clear_black_chrome_24dp.xml", "internal/java/res/drawable/ic_confirmation_number_black_24dp.xml", @@ -380,6 +382,7 @@ "internal/java/res/layout/autofill_assistant_button_hairline.xml", "internal/java/res/layout/autofill_assistant_contact_full.xml", "internal/java/res/layout/autofill_assistant_contact_summary.xml", + "internal/java/res/layout/autofill_assistant_data_origin_notice.xml", "internal/java/res/layout/autofill_assistant_details.xml", "internal/java/res/layout/autofill_assistant_form_checkbox.xml", "internal/java/res/layout/autofill_assistant_form_counter.xml",
diff --git a/components/autofill_assistant/android/internal/java/res/drawable/ic_baseline_help_24dp.xml b/components/autofill_assistant/android/internal/java/res/drawable/ic_baseline_help_24dp.xml new file mode 100644 index 0000000..8cf0ec7 --- /dev/null +++ b/components/autofill_assistant/android/internal/java/res/drawable/ic_baseline_help_24dp.xml
@@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2022 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. --> +<vector android:height="16dp" android:tint="@color/baseline_primary_600" + android:viewportHeight="24" android:viewportWidth="24" + android:width="16dp" xmlns:android="http://schemas.android.com/apk/res/android"> + <path android:fillColor="@android:color/white" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,19h-2v-2h2v2zM15.07,11.25l-0.9,0.92C13.45,12.9 13,13.5 13,15h-2v-0.5c0,-1.1 0.45,-2.1 1.17,-2.83l1.24,-1.26c0.37,-0.36 0.59,-0.86 0.59,-1.41 0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2L8,9c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,0.88 -0.36,1.68 -0.93,2.25z"/> +</vector> \ No newline at end of file
diff --git a/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_data_origin_notice.xml b/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_data_origin_notice.xml new file mode 100644 index 0000000..3fa8bcc --- /dev/null +++ b/components/autofill_assistant/android/internal/java/res/layout/autofill_assistant_data_origin_notice.xml
@@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2022 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. --> + +<RelativeLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="30dp" + android:layout_centerVertical="true"> + <TextView + android:id="@+id/link_to_data_origin_dialog" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerInParent="true" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp" + android:drawablePadding="12dp" + android:includeFontPadding="false" + android:gravity="center_vertical" + app:drawableEndCompat="@drawable/ic_baseline_help_24dp" + /> + <!-- Line before start of text. --> + <View + android:layout_width="match_parent" + android:layout_height="1dp" + android:layout_centerVertical="true" + android:layout_marginStart="40dp" + android:layout_toStartOf="@id/link_to_data_origin_dialog" + android:background="@color/baseline_neutral_50" + /> + <!-- Line after end of text. --> + <View + android:layout_width="match_parent" + android:layout_height="1dp" + android:layout_centerVertical="true" + android:layout_marginEnd="40dp" + android:layout_toEndOf="@id/link_to_data_origin_dialog" + android:background="@color/baseline_neutral_50" + /> +</RelativeLayout>
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantTagsForTesting.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantTagsForTesting.java index 9d5ad3c..2a622a10 100644 --- a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantTagsForTesting.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantTagsForTesting.java
@@ -21,6 +21,7 @@ public static final String COLLECT_USER_DATA_CHECKBOX_TERMS_SECTION_TAG = "checkbox_terms"; public static final String COLLECT_USER_DATA_INFO_SECTION_TAG = "info_section"; public static final String COLLECT_USER_DATA_TERMS_REQUIRE_REVIEW = "require_review"; + public static final String COLLECT_USER_DATA_DATA_ORIGIN_NOTICE_TAG = "data_origin_notice"; public static final String VERTICAL_EXPANDER_CHEVRON = "chevron"; public static final String COLLECT_USER_DATA_CHOICE_LIST = "choicelist"; public static final String CHOICE_LIST_EDIT_ICON = "edit_icon";
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantTextUtils.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantTextUtils.java index a24cb83e..f8c06609 100644 --- a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantTextUtils.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantTextUtils.java
@@ -3,8 +3,9 @@ // found in the LICENSE file. package org.chromium.components.autofill_assistant; - +import android.content.Context; import android.graphics.Typeface; +import android.text.SpannableString; import android.text.method.LinkMovementMethod; import android.text.style.StyleSpan; import android.widget.TextView; @@ -47,6 +48,21 @@ */ public static void applyVisualAppearanceTags( TextView view, String text, @Nullable Callback<Integer> linkCallback) { + SpannableString textWithSpans = + applyVisualAppearanceTags(text, view.getContext(), linkCallback); + view.setText(textWithSpans); + if (textWithSpans.getSpans(0, textWithSpans.length(), NoUnderlineClickableSpan.class).length + != 0) { + view.setMovementMethod(LinkMovementMethod.getInstance()); + } + } + + /** + * Returns a {@link SpannableString} version of {@code text}, with the appropriate appearance + * tags. + */ + public static SpannableString applyVisualAppearanceTags( + String text, Context context, @Nullable Callback<Integer> linkCallback) { List<SpanApplier.SpanInfo> spans = new ArrayList<>(); if (text.contains("<b>")) { spans.add(BOLD_SPAN_INFO); @@ -64,7 +80,7 @@ for (Integer linkId : linkIds) { spans.add(new SpanApplier.SpanInfo("<link" + linkId + ">", "</link" + linkId + ">", - new NoUnderlineClickableSpan(view.getContext(), (unusedView) -> { + new NoUnderlineClickableSpan(context, (unusedView) -> { if (linkCallback != null) { linkCallback.onResult(linkId); } @@ -82,10 +98,7 @@ Log.d(TAG, "Mismatching span", e); } } - view.setText(SpanApplier.applySpans( - text, successfulSpans.toArray(new SpanApplier.SpanInfo[successfulSpans.size()]))); - if (!linkIds.isEmpty()) { - view.setMovementMethod(LinkMovementMethod.getInstance()); - } + return SpanApplier.applySpans( + text, successfulSpans.toArray(new SpanApplier.SpanInfo[successfulSpans.size()])); } }
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataBinder.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataBinder.java index 184f847..9efef048 100644 --- a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataBinder.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataBinder.java
@@ -53,6 +53,7 @@ private final AssistantInfoSection mInfoSection; private final AssistantAdditionalSectionContainer mPrependedSections; private final AssistantAdditionalSectionContainer mAppendedSections; + private final AssistantDataOriginNotice mDataOriginNotice; private final ViewGroup mGenericUserInterfaceContainerPrepended; private final ViewGroup mGenericUserInterfaceContainerAppended; private final Object mDividerTag; @@ -70,6 +71,7 @@ AssistantInfoSection infoSection, AssistantAdditionalSectionContainer prependedSections, AssistantAdditionalSectionContainer appendedSections, + AssistantDataOriginNotice dataOriginNotice, ViewGroup genericUserInterfaceContainerPrepended, ViewGroup genericUserInterfaceContainerAppended, Object dividerTag, Activity activity, AssistantEditorFactory editorFactory, @@ -89,6 +91,7 @@ mAppendedSections = appendedSections; mGenericUserInterfaceContainerPrepended = genericUserInterfaceContainerPrepended; mGenericUserInterfaceContainerAppended = genericUserInterfaceContainerAppended; + mDataOriginNotice = dataOriginNotice; mDividerTag = dividerTag; mActivity = activity; mEditorFactory = editorFactory; @@ -318,6 +321,26 @@ view.mContactDetailsSection.setContactFullOptions( model.get(AssistantCollectUserDataModel.CONTACT_FULL_DESCRIPTION_OPTIONS)); return true; + } else if (propertyKey == AssistantCollectUserDataModel.DATA_ORIGIN_LINK_TEXT) { + view.mDataOriginNotice.setDataOriginLinkText( + model.get(AssistantCollectUserDataModel.DATA_ORIGIN_LINK_TEXT)); + return true; + } else if (propertyKey == AssistantCollectUserDataModel.DATA_ORIGIN_DIALOG_TITLE) { + view.mDataOriginNotice.setDataOriginDialogTitle( + model.get(AssistantCollectUserDataModel.DATA_ORIGIN_DIALOG_TITLE)); + return true; + } else if (propertyKey == AssistantCollectUserDataModel.DATA_ORIGIN_DIALOG_TEXT) { + view.mDataOriginNotice.setDataOriginDialogText( + model.get(AssistantCollectUserDataModel.DATA_ORIGIN_DIALOG_TEXT)); + return true; + } else if (propertyKey == AssistantCollectUserDataModel.DATA_ORIGIN_DIALOG_BUTTON_TEXT) { + view.mDataOriginNotice.setDataOriginDialogButtonText( + model.get(AssistantCollectUserDataModel.DATA_ORIGIN_DIALOG_BUTTON_TEXT)); + return true; + } else if (propertyKey == AssistantCollectUserDataModel.ACCOUNT_EMAIL) { + view.mDataOriginNotice.setAccountEmail( + model.get(AssistantCollectUserDataModel.ACCOUNT_EMAIL)); + return true; } return false;
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataCoordinator.java index a1d4cde..2d93d570 100644 --- a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataCoordinator.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataCoordinator.java
@@ -99,6 +99,9 @@ new AssistantTermsSection(mActivity, paymentRequestExpanderAccordion, /* showAsSingleCheckbox= */ true); + AssistantDataOriginNotice dataOriginNotice = new AssistantDataOriginNotice( + mActivity, windowAndroid, paymentRequestExpanderAccordion); + paymentRequestExpanderAccordion.setTag( AssistantTagsForTesting.COLLECT_USER_DATA_ACCORDION_TAG); loginSection.getView().setTag(AssistantTagsForTesting.COLLECT_USER_DATA_LOGIN_SECTION_TAG); @@ -115,15 +118,17 @@ termsAsCheckboxSection.getView().setTag( AssistantTagsForTesting.COLLECT_USER_DATA_CHECKBOX_TERMS_SECTION_TAG); infoSection.getView().setTag(AssistantTagsForTesting.COLLECT_USER_DATA_INFO_SECTION_TAG); + dataOriginNotice.getView().setTag( + AssistantTagsForTesting.COLLECT_USER_DATA_DATA_ORIGIN_NOTICE_TAG); // Bind view and mediator through the model. mViewHolder = new AssistantCollectUserDataBinder.ViewHolder(mPaymentRequestUI, paymentRequestExpanderAccordion, sectionToSectionPadding, loginSection, contactDetailsSection, phoneNumberSection, paymentMethodSection, shippingAddressSection, termsSection, termsAsCheckboxSection, infoSection, - prependedSections, appendedSections, genericUserInterfaceContainerPrepended, - genericUserInterfaceContainerAppended, DIVIDER_TAG, mActivity, editorFactory, - windowAndroid); + prependedSections, appendedSections, dataOriginNotice, + genericUserInterfaceContainerPrepended, genericUserInterfaceContainerAppended, + DIVIDER_TAG, mActivity, editorFactory, windowAndroid); AssistantCollectUserDataBinder binder = new AssistantCollectUserDataBinder(); PropertyModelChangeProcessor.create(model, mViewHolder, binder);
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataModel.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataModel.java index 5796434..9760df8 100644 --- a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataModel.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantCollectUserDataModel.java
@@ -196,6 +196,15 @@ public static final WritableObjectPropertyKey<byte[]> INITIALIZE_ADDRESS_COLLECTION_PARAMS = new WritableObjectPropertyKey<>(); + public static final WritableObjectPropertyKey<String> DATA_ORIGIN_LINK_TEXT = + new WritableObjectPropertyKey<>(); + public static final WritableObjectPropertyKey<String> DATA_ORIGIN_DIALOG_TITLE = + new WritableObjectPropertyKey<>(); + public static final WritableObjectPropertyKey<String> DATA_ORIGIN_DIALOG_TEXT = + new WritableObjectPropertyKey<>(); + public static final WritableObjectPropertyKey<String> DATA_ORIGIN_DIALOG_BUTTON_TEXT = + new WritableObjectPropertyKey<>(); + public AssistantCollectUserDataModel() { super(DELEGATE, WEB_CONTENTS, VISIBLE, SELECTED_SHIPPING_ADDRESS, SELECTED_PAYMENT_INSTRUMENT, SELECTED_CONTACT_DETAILS, SELECTED_PHONE_NUMBER, @@ -211,7 +220,9 @@ GENERIC_USER_INTERFACE_PREPENDED, GENERIC_USER_INTERFACE_APPENDED, CONTACT_SUMMARY_DESCRIPTION_OPTIONS, CONTACT_FULL_DESCRIPTION_OPTIONS, SHOULD_STORE_USER_DATA_CHANGES, USE_GMS_CORE_EDIT_DIALOGS, ACCOUNT_EMAIL, - ADD_PAYMENT_INSTRUMENT_ACTION_TOKEN, INITIALIZE_ADDRESS_COLLECTION_PARAMS); + ADD_PAYMENT_INSTRUMENT_ACTION_TOKEN, INITIALIZE_ADDRESS_COLLECTION_PARAMS, + DATA_ORIGIN_LINK_TEXT, DATA_ORIGIN_DIALOG_TITLE, DATA_ORIGIN_DIALOG_TEXT, + DATA_ORIGIN_DIALOG_BUTTON_TEXT); /* * Set initial state for basic type properties (others are implicitly null). @@ -236,6 +247,10 @@ set(AVAILABLE_BILLING_ADDRESSES, Collections.emptyList()); set(INFO_SECTION_TEXT, ""); set(ACCOUNT_EMAIL, ""); + set(DATA_ORIGIN_LINK_TEXT, ""); + set(DATA_ORIGIN_DIALOG_TITLE, ""); + set(DATA_ORIGIN_DIALOG_TEXT, ""); + set(DATA_ORIGIN_DIALOG_BUTTON_TEXT, ""); } @CalledByNative @@ -378,6 +393,26 @@ set(SELECTED_LOGIN, loginChoice == null ? null : new LoginChoiceModel(loginChoice)); } + @CalledByNative + private void setDataOriginLinkText(String text) { + set(DATA_ORIGIN_LINK_TEXT, text); + } + + @CalledByNative + private void setDataOriginDialogTitle(String title) { + set(DATA_ORIGIN_DIALOG_TITLE, title); + } + + @CalledByNative + private void setDataOriginDialogText(String text) { + set(DATA_ORIGIN_DIALOG_TEXT, text); + } + + @CalledByNative + private void setDataOriginDialogButtonText(String text) { + set(DATA_ORIGIN_DIALOG_BUTTON_TEXT, text); + } + /** Creates an empty list of login options. */ @CalledByNative private static List<AssistantLoginChoice> createLoginChoiceList() {
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantDataOriginNotice.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantDataOriginNotice.java new file mode 100644 index 0000000..bd36b535 --- /dev/null +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/user_data/AssistantDataOriginNotice.java
@@ -0,0 +1,106 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.autofill_assistant.user_data; +import android.app.Activity; +import android.content.DialogInterface; +import android.text.TextUtils; +import android.text.method.LinkMovementMethod; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; + +import org.chromium.base.ApiCompatibilityUtils; +import org.chromium.components.autofill_assistant.AssistantTextUtils; +import org.chromium.components.autofill_assistant.LayoutUtils; +import org.chromium.components.autofill_assistant.R; +import org.chromium.ui.base.WindowAndroid; + +/** + * Shows a link for the user to open an information dialog on the origin of their data. + */ +public class AssistantDataOriginNotice { + private static final int ACCOUNT_SETTINGS_SCREEN_ID = 10003; + + private final View mView; + private final TextView mLinkToDataOriginDialog; + private final WindowAndroid mWindowAndroid; + private final Activity mActivity; + @Nullable + private AlertDialog mDialog; + private String mDialogTitle = ""; + private String mDialogText = ""; + private String mDialogButtonText = ""; + private String mAccountEmail = ""; + + AssistantDataOriginNotice(Activity activity, WindowAndroid windowAndroid, ViewGroup parent) { + mActivity = activity; + mView = LayoutUtils.createInflater(activity).inflate( + R.layout.autofill_assistant_data_origin_notice, parent, false); + parent.addView(mView); + mLinkToDataOriginDialog = mView.findViewById(R.id.link_to_data_origin_dialog); + mWindowAndroid = windowAndroid; + } + + void setDataOriginLinkText(String text) { + if (TextUtils.isEmpty(text)) { + mView.setVisibility(View.GONE); + } else { + mView.setVisibility(View.VISIBLE); + + mLinkToDataOriginDialog.setText(text); + ApiCompatibilityUtils.setTextAppearance( + mLinkToDataOriginDialog, R.style.TextAppearance_TextSmall_Link); + mLinkToDataOriginDialog.setOnClickListener(this::showDataOriginDialog); + } + } + + void setDataOriginDialogTitle(String title) { + mDialogTitle = title; + } + + void setDataOriginDialogText(String text) { + mDialogText = text; + } + + void setDataOriginDialogButtonText(String text) { + mDialogButtonText = text; + } + + void setAccountEmail(String accountEmail) { + mAccountEmail = accountEmail; + } + + View getView() { + return mView; + } + + private void onDataOriginLinkClicked(int unusedLink) { + new GmsIntegrator(mAccountEmail, mActivity) + .launchAccountIntent(ACCOUNT_SETTINGS_SCREEN_ID, mWindowAndroid, unused -> {}); + } + + private void showDataOriginDialog(View unusedView) { + mDialog = createAlertDialog(); + mDialog.show(); + + // Make links in the dialog clickable. + ((TextView) mDialog.findViewById(android.R.id.message)) + .setMovementMethod(LinkMovementMethod.getInstance()); + } + + private AlertDialog createAlertDialog() { + AlertDialog dialog = new AlertDialog.Builder(mActivity, R.style.Theme_Chromium_AlertDialog) + .setTitle(mDialogTitle) + .setMessage(AssistantTextUtils.applyVisualAppearanceTags( + mDialogText, mActivity, this::onDataOriginLinkClicked)) + .setPositiveButton(mDialogButtonText, + (DialogInterface dialogInterface, int unused) -> {}) + .create(); + return dialog; + } +}
diff --git a/components/autofill_assistant/browser/BUILD.gn b/components/autofill_assistant/browser/BUILD.gn index c935188b..241ac0af 100644 --- a/components/autofill_assistant/browser/BUILD.gn +++ b/components/autofill_assistant/browser/BUILD.gn
@@ -62,6 +62,8 @@ "actions/generate_password_for_form_field_action.h", "actions/get_element_status_action.cc", "actions/get_element_status_action.h", + "actions/js_flow_action.cc", + "actions/js_flow_action.h", "actions/navigate_action.cc", "actions/navigate_action.h", "actions/perform_on_single_element_action.cc", @@ -424,6 +426,7 @@ "actions/fallback_handler/required_fields_fallback_handler_unittest.cc", "actions/generate_password_for_form_field_action_unittest.cc", "actions/get_element_status_action_unittest.cc", + "actions/js_flow_action_unittest.cc", "actions/navigate_action_unittest.cc", "actions/perform_on_single_element_action_unittest.cc", "actions/popup_message_action_unittest.cc",
diff --git a/components/autofill_assistant/browser/actions/action.cc b/components/autofill_assistant/browser/actions/action.cc index 93acfc3..0189c29 100644 --- a/components/autofill_assistant/browser/actions/action.cc +++ b/components/autofill_assistant/browser/actions/action.cc
@@ -270,6 +270,9 @@ case ActionProto::ActionInfoCase::kExecuteJs: out << "ExecuteJs"; break; + case ActionProto::ActionInfoCase::kJsFlow: + out << "JsFlow"; + break; case ActionProto::ActionInfoCase::ACTION_INFO_NOT_SET: out << "ACTION_INFO_NOT_SET"; break;
diff --git a/components/autofill_assistant/browser/actions/action.h b/components/autofill_assistant/browser/actions/action.h index c0766b2..b63a358 100644 --- a/components/autofill_assistant/browser/actions/action.h +++ b/components/autofill_assistant/browser/actions/action.h
@@ -56,7 +56,7 @@ const ActionProto& proto() const { return proto_; } // Returns the current action's ActionData. - ActionData& GetActionData(); + virtual ActionData& GetActionData(); protected: // |delegate| must remain valid for the lifetime of this instance.
diff --git a/components/autofill_assistant/browser/actions/collect_user_data_action.cc b/components/autofill_assistant/browser/actions/collect_user_data_action.cc index 566b53f..bf448bd 100644 --- a/components/autofill_assistant/browser/actions/collect_user_data_action.cc +++ b/components/autofill_assistant/browser/actions/collect_user_data_action.cc
@@ -1145,6 +1145,15 @@ collect_user_data_options_->default_email = delegate_->GetEmailAddressForAccessTokenAccount(); + if (collect_user_data.has_data_origin_notice()) { + const auto& notice = collect_user_data.data_origin_notice(); + if (notice.link_text().empty() || notice.dialog_title().empty() || + notice.dialog_text().empty() || notice.dialog_button_text().empty()) { + return false; + } + collect_user_data_options_->data_origin_notice = notice; + } + return true; }
diff --git a/components/autofill_assistant/browser/actions/js_flow_action.cc b/components/autofill_assistant/browser/actions/js_flow_action.cc new file mode 100644 index 0000000..8b069eb4 --- /dev/null +++ b/components/autofill_assistant/browser/actions/js_flow_action.cc
@@ -0,0 +1,121 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/autofill_assistant/browser/actions/js_flow_action.h" +#include "base/base64.h" +#include "base/json/json_writer.h" +#include "components/autofill_assistant/browser/actions/action_delegate.h" +#include "components/autofill_assistant/browser/js_flow_executor_impl.h" +#include "components/autofill_assistant/browser/js_flow_util.h" +#include "components/autofill_assistant/browser/protocol_utils.h" + +namespace autofill_assistant { + +JsFlowAction::JsFlowAction(ActionDelegate* delegate, const ActionProto& proto) + : Action(delegate, proto), + js_flow_executor_( + std::make_unique<JsFlowExecutorImpl>(delegate->GetWebContents(), + this)) { + DCHECK(proto_.has_js_flow()); +} + +JsFlowAction::JsFlowAction(ActionDelegate* delegate, + const ActionProto& proto, + std::unique_ptr<JsFlowExecutor> js_flow_executor) + : Action(delegate, proto), js_flow_executor_(std::move(js_flow_executor)) { + DCHECK(proto_.has_js_flow()); +} + +JsFlowAction::~JsFlowAction() = default; + +Action::ActionData& JsFlowAction::GetActionData() { + if (!current_native_action_) { + return Action::GetActionData(); + } + return current_native_action_->GetActionData(); +} + +void JsFlowAction::RunNativeAction( + int action_id, + const std::string& action, + base::OnceCallback<void(const ClientStatus& result_status, + std::unique_ptr<base::Value> result_value)> + finished_callback) { + DCHECK(!current_native_action_) << "Must not call RunNativeAction while " + "already executing a native action"; + std::string error_message; + absl::optional<ActionProto> action_proto = + ProtocolUtils::ParseFromString(action_id, action, &error_message); + if (!action_proto) { + VLOG(1) << error_message; + std::move(finished_callback).Run(ClientStatus(INVALID_ACTION), nullptr); + return; + } + + if (action_proto->action_info_case() == + ActionProto::ActionInfoCase::kJsFlow) { + LOG(ERROR) << "Nested JS flow actions are not allowed!"; + std::move(finished_callback).Run(ClientStatus(INVALID_ACTION), nullptr); + return; + } + + current_native_action_ = + ProtocolUtils::CreateAction(delegate_, *action_proto); + VLOG(2) << "Running native action: " << action_proto->action_info_case(); + current_native_action_->ProcessAction(base::BindOnce( + &JsFlowAction::OnNativeActionFinished, weak_ptr_factory_.GetWeakPtr(), + std::move(finished_callback))); +} + +void JsFlowAction::OnNativeActionFinished( + base::OnceCallback<void(const ClientStatus& result_status, + std::unique_ptr<base::Value> result_value)> + finished_callback, + std::unique_ptr<ProcessedActionProto> processed_action) { + VLOG(2) << "Native action finished with status " + << processed_action->status(); + + // TODO(arbesser): send a representation of the processed action back to JS. + current_native_action_ = nullptr; + std::move(finished_callback) + .Run(ClientStatus(processed_action->status(), + processed_action->status_details()), + nullptr); +} + +void JsFlowAction::InternalProcessAction(ProcessActionCallback callback) { + js_flow_executor_->Start( + proto_.js_flow().js_flow(), + base::BindOnce(&JsFlowAction::OnFlowFinished, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); +} + +void JsFlowAction::OnFlowFinished(ProcessActionCallback callback, + const ClientStatus& status, + std::unique_ptr<base::Value> return_value) { + UpdateProcessedAction(status); + + // If the flow returned a value, we extract the status and possibly a flow + // return value from that, and the overall action result will be whatever the + // flow returned. Flows that don't return a value are assumed to have + // succeeded. See js_flow_util::ExtractJsFlowActionReturnValue for details. + if (return_value) { + std::unique_ptr<base::Value> out_return_value; + UpdateProcessedAction(js_flow_util::ExtractJsFlowActionReturnValue( + *return_value, out_return_value)); + if (out_return_value) { + base::JSONWriter::Write(*out_return_value, + processed_action_proto_->mutable_js_flow_result() + ->mutable_result_json()); + } + } + + // Since JS flows have the potential to be quite big, we remove them from the + // action response. The backend has access to the full script anyway. + processed_action_proto_->mutable_action()->mutable_js_flow()->clear_js_flow(); + + std::move(callback).Run(std::move(processed_action_proto_)); +} + +} // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/actions/js_flow_action.h b/components/autofill_assistant/browser/actions/js_flow_action.h new file mode 100644 index 0000000..8376648a --- /dev/null +++ b/components/autofill_assistant/browser/actions/js_flow_action.h
@@ -0,0 +1,62 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ACTIONS_JS_FLOW_ACTION_H_ +#define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ACTIONS_JS_FLOW_ACTION_H_ + +#include <memory> +#include "base/callback.h" +#include "base/memory/weak_ptr.h" +#include "base/values.h" +#include "components/autofill_assistant/browser/actions/action.h" +#include "components/autofill_assistant/browser/client_status.h" +#include "components/autofill_assistant/browser/js_flow_executor.h" + +namespace autofill_assistant { + +// An action that runs a javascript flow inside an isolated JS context. +class JsFlowAction : public Action, public JsFlowExecutor::Delegate { + public: + explicit JsFlowAction(ActionDelegate* delegate, const ActionProto& proto); + // Can be used to inject a different flow executor in tests. + explicit JsFlowAction(ActionDelegate* delegate, + const ActionProto& proto, + std::unique_ptr<JsFlowExecutor> js_flow_executor); + ~JsFlowAction() override; + JsFlowAction(const JsFlowAction&) = delete; + JsFlowAction& operator=(const JsFlowAction&) = delete; + + // Override Action + ActionData& GetActionData() override; + + // Override JsFlowExecutor::Delegate + void RunNativeAction( + int action_id, + const std::string& action, + base::OnceCallback<void(const ClientStatus& result_status, + std::unique_ptr<base::Value> result_value)> + finished_callback) override; + + private: + // Overrides Action: + void InternalProcessAction(ProcessActionCallback callback) override; + + void OnNativeActionFinished( + base::OnceCallback<void(const ClientStatus& result_status, + std::unique_ptr<base::Value> result_value)> + finished_callback, + std::unique_ptr<ProcessedActionProto> processed_action); + void OnFlowFinished(ProcessActionCallback callback, + const ClientStatus& status, + std::unique_ptr<base::Value> return_value); + + // Only set while executing a native action. + std::unique_ptr<Action> current_native_action_; + + std::unique_ptr<JsFlowExecutor> js_flow_executor_; + base::WeakPtrFactory<JsFlowAction> weak_ptr_factory_{this}; +}; + +} // namespace autofill_assistant +#endif // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ACTIONS_JS_FLOW_ACTION_H_
diff --git a/components/autofill_assistant/browser/actions/js_flow_action_unittest.cc b/components/autofill_assistant/browser/actions/js_flow_action_unittest.cc new file mode 100644 index 0000000..c40a58c3 --- /dev/null +++ b/components/autofill_assistant/browser/actions/js_flow_action_unittest.cc
@@ -0,0 +1,277 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/autofill_assistant/browser/actions/js_flow_action.h" +#include "base/json/json_reader.h" +#include "base/strings/strcat.h" +#include "base/test/gmock_callback_support.h" +#include "base/test/mock_callback.h" +#include "components/autofill_assistant/browser/actions/mock_action_delegate.h" +#include "components/autofill_assistant/browser/js_flow_executor.h" +#include "components/autofill_assistant/browser/service.pb.h" +#include "components/autofill_assistant/browser/test_util.h" +#include "testing/gmock/include/gmock/gmock.h" + +namespace autofill_assistant { +namespace { + +using ::base::test::RunOnceCallback; +using ::testing::_; +using ::testing::AllOf; +using ::testing::ElementsAre; +using ::testing::Eq; +using ::testing::Property; +using ::testing::SaveArgPointee; +using ::testing::WithArg; + +// Parses |json| as a base::Value. No error handling - this will crash for +// invalid json inputs. +std::unique_ptr<base::Value> UniqueValueFromJson(const std::string& json) { + return std::make_unique<base::Value>( + std::move(*base::JSONReader::Read(json))); +} + +class MockJsFlowExecutor : public JsFlowExecutor { + public: + MockJsFlowExecutor() = default; + ~MockJsFlowExecutor() override = default; + + MOCK_METHOD( + void, + Start, + (const std::string& js_flow, + base::OnceCallback<void(const ClientStatus&, + std::unique_ptr<base::Value>)> result_callback), + (override)); +}; + +class JsFlowActionTest : public testing::Test { + protected: + std::unique_ptr<JsFlowAction> CreateAction( + std::unique_ptr<JsFlowExecutor> js_flow_executor) { + ActionProto action_proto; + *action_proto.mutable_js_flow() = proto_; + std::unique_ptr<JsFlowAction> action = std::make_unique<JsFlowAction>( + &mock_action_delegate_, action_proto, std::move(js_flow_executor)); + return action; + } + + MockActionDelegate mock_action_delegate_; + base::MockCallback<Action::ProcessActionCallback> callback_; + base::MockCallback<base::OnceCallback< + void(const ClientStatus&, std::unique_ptr<base::Value> result_value)>> + native_action_callback_; + JsFlowProto proto_; +}; + +TEST_F(JsFlowActionTest, SmokeTest) { + auto mock_js_flow_executor = std::make_unique<MockJsFlowExecutor>(); + + EXPECT_CALL(*mock_js_flow_executor, Start("", _)) + .WillOnce(RunOnceCallback<1>(ClientStatus(ACTION_APPLIED), + /* return_value = */ nullptr)); + EXPECT_CALL( + callback_, + Run(Pointee(Property(&ProcessedActionProto::status, ACTION_APPLIED)))); + CreateAction(std::move(mock_js_flow_executor)) + ->ProcessAction(callback_.Get()); +} + +TEST_F(JsFlowActionTest, FailsIfNativeActionIsInvalid) { + auto mock_js_flow_executor = std::make_unique<MockJsFlowExecutor>(); + auto* mock_js_flow_executor_ptr = mock_js_flow_executor.get(); + auto action = CreateAction(std::move(mock_js_flow_executor)); + + EXPECT_CALL(*mock_js_flow_executor_ptr, Start).WillOnce([&]() { + // invalid action_id + EXPECT_CALL( + native_action_callback_, + Run(Property(&ClientStatus::proto_status, UNSUPPORTED_ACTION), _)); + action->RunNativeAction( + /* action_id = */ -1, + /* action = */ std::string(), native_action_callback_.Get()); + }); + action->ProcessAction(callback_.Get()); +} + +TEST_F(JsFlowActionTest, FailsForInvalidNativeActionProto) { + auto mock_js_flow_executor = std::make_unique<MockJsFlowExecutor>(); + auto* mock_js_flow_executor_ptr = mock_js_flow_executor.get(); + auto action = CreateAction(std::move(mock_js_flow_executor)); + + EXPECT_CALL(*mock_js_flow_executor_ptr, Start).WillOnce([&]() { + // invalid proto. + EXPECT_CALL(native_action_callback_, + Run(Property(&ClientStatus::proto_status, INVALID_ACTION), _)); + action->RunNativeAction( + /* action_id = */ 11, + /* action = */ "\xff\xff\xff", native_action_callback_.Get()); + }); + action->ProcessAction(callback_.Get()); +} + +TEST_F(JsFlowActionTest, NestedFlowActionsAreDisallowed) { + auto mock_js_flow_executor = std::make_unique<MockJsFlowExecutor>(); + auto* mock_js_flow_executor_ptr = mock_js_flow_executor.get(); + auto action = CreateAction(std::move(mock_js_flow_executor)); + + EXPECT_CALL(*mock_js_flow_executor_ptr, Start).WillOnce([&]() { + // nested flows are disallowed. 92 == js_flow action. + EXPECT_CALL(native_action_callback_, + Run(Property(&ClientStatus::proto_status, INVALID_ACTION), _)); + action->RunNativeAction( + /* action_id = */ 92, + /* action = */ "", native_action_callback_.Get()); + }); + action->ProcessAction(callback_.Get()); +} + +TEST_F(JsFlowActionTest, NativeActionSucceeds) { + auto mock_js_flow_executor = std::make_unique<MockJsFlowExecutor>(); + auto* mock_js_flow_executor_ptr = mock_js_flow_executor.get(); + auto action = CreateAction(std::move(mock_js_flow_executor)); + + ActionProto native_action; + native_action.mutable_tell()->set_message("Hello World!"); + EXPECT_CALL(*mock_js_flow_executor_ptr, Start) + .WillOnce(WithArg<1>([&](auto finished_callback) { + std::string serialized_native_action; + native_action.tell().SerializeToString(&serialized_native_action); + + EXPECT_CALL(mock_action_delegate_, SetStatusMessage("Hello World!")); + EXPECT_CALL( + native_action_callback_, + Run(Property(&ClientStatus::proto_status, ACTION_APPLIED), _)); + action->RunNativeAction( + /* action_id = */ static_cast<int>( + native_action.action_info_case()), + /* action = */ + serialized_native_action, native_action_callback_.Get()); + std::move(finished_callback).Run(ClientStatus(ACTION_APPLIED), nullptr); + })); + ProcessedActionProto processed_action_capture; + EXPECT_CALL(callback_, Run) + .WillOnce(SaveArgPointee<0>(&processed_action_capture)); + action->ProcessAction(callback_.Get()); + + EXPECT_THAT(processed_action_capture.status(), Eq(ACTION_APPLIED)); +} + +TEST_F(JsFlowActionTest, NativeActionFails) { + auto mock_js_flow_executor = std::make_unique<MockJsFlowExecutor>(); + auto* mock_js_flow_executor_ptr = mock_js_flow_executor.get(); + auto action = CreateAction(std::move(mock_js_flow_executor)); + + ActionProto native_action; + // ShowCast without a selector is invalid. + native_action.mutable_show_cast(); + EXPECT_CALL(*mock_js_flow_executor_ptr, Start) + .WillOnce(WithArg<1>([&](auto finished_callback) { + std::string serialized_native_action; + native_action.show_cast().SerializeToString(&serialized_native_action); + + EXPECT_CALL( + native_action_callback_, + Run(Property(&ClientStatus::proto_status, INVALID_SELECTOR), _)); + action->RunNativeAction( + /* action_id = */ static_cast<int>( + native_action.action_info_case()), + /* action = */ + serialized_native_action, native_action_callback_.Get()); + + // Note: it is possible for the flow to succeed even if a native action + // fails. + std::move(finished_callback).Run(ClientStatus(ACTION_APPLIED), nullptr); + })); + ProcessedActionProto processed_action_capture; + EXPECT_CALL(callback_, Run) + .WillOnce(SaveArgPointee<0>(&processed_action_capture)); + action->ProcessAction(callback_.Get()); + EXPECT_THAT(processed_action_capture.status(), Eq(ACTION_APPLIED)); +} + +TEST_F(JsFlowActionTest, WritesFlowResultAsJsonDictToActionResult) { + auto mock_js_flow_executor = std::make_unique<MockJsFlowExecutor>(); + + EXPECT_CALL(*mock_js_flow_executor, Start("", _)) + .WillOnce(RunOnceCallback<1>(ClientStatus(ACTION_APPLIED), + /* return_value = */ UniqueValueFromJson(R"( + { + "status": 3, + "result": [[1, 2], null, {"enum": 5}] + } + )"))); + + ProcessedActionProto processed_action_capture; + EXPECT_CALL(callback_, Run) + .WillOnce(SaveArgPointee<0>(&processed_action_capture)); + CreateAction(std::move(mock_js_flow_executor)) + ->ProcessAction(callback_.Get()); + + // OTHER_ACTION_STATUS == 3 + EXPECT_THAT(processed_action_capture.status(), Eq(OTHER_ACTION_STATUS)); + EXPECT_EQ(base::JSONReader::Read( + processed_action_capture.js_flow_result().result_json()), + base::JSONReader::Read(R"([[1, 2], null, {"enum": 5}])")); +} + +TEST_F(JsFlowActionTest, AllowsFlowsWithoutReturnValue) { + auto mock_js_flow_executor = std::make_unique<MockJsFlowExecutor>(); + + EXPECT_CALL(*mock_js_flow_executor, Start("", _)) + .WillOnce(RunOnceCallback<1>(ClientStatus(ACTION_APPLIED), + /* return_value = */ nullptr)); + + ProcessedActionProto processed_action_capture; + EXPECT_CALL(callback_, Run) + .WillOnce(SaveArgPointee<0>(&processed_action_capture)); + CreateAction(std::move(mock_js_flow_executor)) + ->ProcessAction(callback_.Get()); + + EXPECT_THAT(processed_action_capture.status(), Eq(ACTION_APPLIED)); + EXPECT_FALSE(processed_action_capture.js_flow_result().has_result_json()); +} + +TEST_F(JsFlowActionTest, AllowsFlowsReturningStatusWithoutResult) { + auto mock_js_flow_executor = std::make_unique<MockJsFlowExecutor>(); + + EXPECT_CALL(*mock_js_flow_executor, Start("", _)) + .WillOnce(RunOnceCallback<1>(ClientStatus(ACTION_APPLIED), + /* return_value = */ UniqueValueFromJson(R"( + { + "status": 3 + } + )"))); + + ProcessedActionProto processed_action_capture; + EXPECT_CALL(callback_, Run) + .WillOnce(SaveArgPointee<0>(&processed_action_capture)); + CreateAction(std::move(mock_js_flow_executor)) + ->ProcessAction(callback_.Get()); + + EXPECT_THAT(processed_action_capture.status(), Eq(OTHER_ACTION_STATUS)); + EXPECT_FALSE(processed_action_capture.js_flow_result().has_result_json()); +} + +TEST_F(JsFlowActionTest, RemovesOriginalProtoFromTheProcessedAction) { + auto mock_js_flow_executor = std::make_unique<MockJsFlowExecutor>(); + + EXPECT_CALL(*mock_js_flow_executor, Start) + .WillOnce(RunOnceCallback<1>(ClientStatus(ACTION_APPLIED), + /* return_value = */ nullptr)); + + ProcessedActionProto processed_action_capture; + EXPECT_CALL(callback_, Run) + .WillOnce(SaveArgPointee<0>(&processed_action_capture)); + proto_.set_js_flow( + "console.log('Large blob that should not be sent back to the backend');"); + CreateAction(std::move(mock_js_flow_executor)) + ->ProcessAction(callback_.Get()); + + EXPECT_THAT(processed_action_capture.status(), Eq(ACTION_APPLIED)); + EXPECT_FALSE(processed_action_capture.action().js_flow().has_js_flow()); +} + +} // namespace +} // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/android/ui_controller_android.cc b/components/autofill_assistant/browser/android/ui_controller_android.cc index 08609cb..44b8cce7 100644 --- a/components/autofill_assistant/browser/android/ui_controller_android.cc +++ b/components/autofill_assistant/browser/android/ui_controller_android.cc
@@ -1289,6 +1289,26 @@ env, jmodel, base::android::ToJavaArrayOfStrings( env, collect_user_data_options->supported_basic_card_networks)); + if (collect_user_data_options->data_origin_notice) { + Java_AssistantCollectUserDataModel_setDataOriginLinkText( + env, jmodel, + ConvertUTF8ToJavaString( + env, collect_user_data_options->data_origin_notice->link_text())); + Java_AssistantCollectUserDataModel_setDataOriginDialogTitle( + env, jmodel, + ConvertUTF8ToJavaString( + env, + collect_user_data_options->data_origin_notice->dialog_title())); + Java_AssistantCollectUserDataModel_setDataOriginDialogText( + env, jmodel, + ConvertUTF8ToJavaString( + env, collect_user_data_options->data_origin_notice->dialog_text())); + Java_AssistantCollectUserDataModel_setDataOriginDialogButtonText( + env, jmodel, + ConvertUTF8ToJavaString(env, + collect_user_data_options->data_origin_notice + ->dialog_button_text())); + } if (collect_user_data_options->request_login_choice) { auto jlist = CreateJavaLoginChoiceList( env, collect_user_data_options->login_choices,
diff --git a/components/autofill_assistant/browser/js_flow_executor_impl.cc b/components/autofill_assistant/browser/js_flow_executor_impl.cc index 5e9ac05f..aefc68f 100644 --- a/components/autofill_assistant/browser/js_flow_executor_impl.cc +++ b/components/autofill_assistant/browser/js_flow_executor_impl.cc
@@ -53,9 +53,9 @@ std::string bytes; // A base64-encoded string containing a serialized proto. if (base::Base64Decode(action->GetString(), &bytes)) { - *error_message = "Invalid Base64-encoded string"; return bytes; } + *error_message = "Invalid Base64-encoded string"; return absl::nullopt; } if (action->is_list()) { @@ -65,6 +65,7 @@ *error_message = "Unexpected value type"; return absl::nullopt; } + } // namespace JsFlowExecutorImpl::JsFlowExecutorImpl(content::WebContents* web_contents, @@ -348,8 +349,8 @@ const ClientStatus& status, std::unique_ptr<base::Value> result_value) { if (!status.ok() && result_value) { - DVLOG(1) << "Flow failed with " << status - << " and result: " << *result_value; + VLOG(1) << "Flow failed with " << status + << " and result: " << *result_value; } std::move(callback_).Run(status, std::move(result_value)); }
diff --git a/components/autofill_assistant/browser/js_flow_executor_impl.h b/components/autofill_assistant/browser/js_flow_executor_impl.h index 01adddc4..9eb3e30 100644 --- a/components/autofill_assistant/browser/js_flow_executor_impl.h +++ b/components/autofill_assistant/browser/js_flow_executor_impl.h
@@ -52,55 +52,20 @@ // JavaScript snippet |js_flow| is run. // // The flow result is one of the following, depending on the |js_flow|: - // (1) ACTION_APPLIED and a base::Value dictionary containing the 'result' key - // and value, as returned by the JS flow. Example for a one-liner js flow - // 'return 12345': - // { - // "result": { - // "description": "12345", - // "type": "number", - // "value": 12345 - // } - // } - // See the unit tests for further examples. Note: field names are - // auto-generated by base::Value serializers. + // (1) ACTION_APPLIED and a base::Value dictionary containing the overall + // flow result. This will never contain string values - if the flow attempts + // to return a dictionary containing strings, INVALID_ACTION and null are + // returned instead. // - // (2) UNEXPECTED_JS_ERROR in case of an execution error, along with a - // base::Value dictionary containing the 'exceptionDetails' key and exception, - // if available. Note that this exception originates from the sandbox JS - // context. Example: - // JS flow: - // function doSomething(x) { - // console.log('foobar says: ' + x); - // throw new Error('Hello world!'); - // } - // function entrypoint() { - // doSomething('bla'); - // } - // entrypoint(); + // (2) UNEXPECTED_JS_ERROR in case of an execution error. The status may + // contain the callstack line and column numbers, if available. // - // Returned exception details: - // "exceptionDetails": { - // "columnNumber": 0, - // "exception": { - // "className": "Error", - // "description": "Error: Hello world! - // at doSomething (<anonymous>:16:33) - // at entrypoint (<anonymous>:19:27) - // at <anonymous>:21:25 - // at <anonymous>:22:28", - // "objectId": "-3968045700143737919.4.2", - // "subtype": "error", - // "type": "object" - // }, - // "exceptionId": 2, - // "lineNumber": 0, - // "text": "Uncaught (in promise) Error: Hello world!" - // } - // - // (3) UNEXPECTED_JS_ERROR and null in case of internal errors during script + // (3) OTHER_ACTION_STATUS and null in case of internal errors during script // execution (i.e., unrecoverable devtools errors). The status details may // contain additional information. + // + // (4) INVALID_ACTION if the flow attempted to return a prohibited value, such + // as a string. void Start(const std::string& js_flow, base::OnceCallback<void(const ClientStatus&, std::unique_ptr<base::Value>)>
diff --git a/components/autofill_assistant/browser/js_flow_util.cc b/components/autofill_assistant/browser/js_flow_util.cc index a1ff04e..39f3c020 100644 --- a/components/autofill_assistant/browser/js_flow_util.cc +++ b/components/autofill_assistant/browser/js_flow_util.cc
@@ -4,12 +4,20 @@ #include "components/autofill_assistant/browser/js_flow_util.h" #include "base/strings/strcat.h" +#include "components/autofill_assistant/browser/model.pb.h" #include "components/autofill_assistant/browser/web/web_controller_util.h" namespace autofill_assistant { namespace { +// The field names of the object that a JS flow action expects flows to return. +// DO NOT CHANGE THIS without changing the backend at the same time. +// This belongs to |js_flow_action| - it has been moved here to make testing +// more convenient. +const char kStatusKey[] = "status"; +const char kResultKey[] = "result"; + // Returns true for remote object types that flows are allowed to return. This // is mostly used to filter types like FUNCTION which would otherwise slip // through. @@ -24,6 +32,17 @@ } } +ClientStatus ClientStatusWithSourceLocation( + ProcessedActionStatusProto proto_status, + const std::string& file, + int line) { + ClientStatus status(proto_status); + auto* error_info = status.mutable_details()->mutable_unexpected_error_info(); + error_info->set_source_file(file); + error_info->set_source_line_number(line); + return status; +} + } // namespace namespace js_flow_util { @@ -105,5 +124,30 @@ return OkClientStatus(); } +ClientStatus ExtractJsFlowActionReturnValue( + const base::Value& value, + std::unique_ptr<base::Value>& out_result_value) { + if (value.is_none()) { + return ClientStatus(ACTION_APPLIED); + } + + if (!value.is_dict()) { + return ClientStatusWithSourceLocation(INVALID_ACTION, __FILE__, __LINE__); + } + + const base::Value::Dict* dict = value.GetIfDict(); + absl::optional<int> flow_status = dict->FindInt(kStatusKey); + const base::Value* flow_return_value = dict->Find(kResultKey); + if (!flow_status || !ProcessedActionStatusProto_IsValid(*flow_status)) { + return ClientStatusWithSourceLocation(INVALID_ACTION, __FILE__, __LINE__); + } + + if (flow_return_value) { + out_result_value = + std::make_unique<base::Value>(flow_return_value->Clone()); + } + return ClientStatus(static_cast<ProcessedActionStatusProto>(*flow_status)); +} + } // namespace js_flow_util } // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/js_flow_util.h b/components/autofill_assistant/browser/js_flow_util.h index 2db68004..429cb10 100644 --- a/components/autofill_assistant/browser/js_flow_util.h +++ b/components/autofill_assistant/browser/js_flow_util.h
@@ -39,6 +39,27 @@ runtime::EvaluateResult* devtools_result, std::unique_ptr<base::Value>& out_flow_result); +// Extracts client status and optionally return value from |value|. Expects +// status and result to be in specific fields (see .cc) Other fields are +// ignored. +// +// This returns one the following statuses. In case of error, a source line +// number is provided in the status details to allow disambiguating. +// +// <value.status>, [out_result_value]: +// - value is a dictionary, value.status exists, is an int and a valid +// ProcessedActionStatusProto enum. It need not be ACTION_APPLIED. +// If value.result exists, it will be assigned to |out_result_value|. +// INVALID_ACTION: +// - |value| is not a dictionary and not NONE +// - |value| does not contain a "status" integer field containing a valid +// ProcessedActionStatusProto. +// ACTION_APPLIED: +// - [value] is NONE +ClientStatus ExtractJsFlowActionReturnValue( + const base::Value& value, + std::unique_ptr<base::Value>& out_result_value); + } // namespace js_flow_util } // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/js_flow_util_unittest.cc b/components/autofill_assistant/browser/js_flow_util_unittest.cc index 9437f8f..5ab8c82 100644 --- a/components/autofill_assistant/browser/js_flow_util_unittest.cc +++ b/components/autofill_assistant/browser/js_flow_util_unittest.cc
@@ -144,6 +144,89 @@ EXPECT_EQ(*out_flow_value, base::Value(12345)); } +TEST(JsFlowUtilTest, ExtractJsFlowActionReturnValueAllowsNullValue) { + std::unique_ptr<base::Value> out_result_value; + EXPECT_EQ(ExtractJsFlowActionReturnValue(base::Value(), out_result_value) + .proto_status(), + ACTION_APPLIED); + EXPECT_EQ(out_result_value, nullptr); +} + +TEST(JsFlowUtilTest, ExtractJsFlowActionReturnValueDisallowsNonDictValues) { + std::unique_ptr<base::Value> out_result_value; + EXPECT_EQ(ExtractJsFlowActionReturnValue(base::Value(1), out_result_value) + .proto_status(), + INVALID_ACTION); + EXPECT_EQ(out_result_value, nullptr); +} + +TEST(JsFlowUtilTest, ExtractJsFlowActionReturnValueDisallowsInvalidDict) { + std::unique_ptr<base::Value> out_result_value; + + // Empty dict. + EXPECT_EQ(ExtractJsFlowActionReturnValue(base::Value(base::Value::Dict()), + out_result_value) + .proto_status(), + INVALID_ACTION); + EXPECT_EQ(out_result_value, nullptr); + + // Invalid dict (does not contain 'status' field). + base::Value::Dict dict; + dict.Set("foo", 12345); + EXPECT_EQ(ExtractJsFlowActionReturnValue(base::Value(std::move(dict)), + out_result_value) + .proto_status(), + INVALID_ACTION); + EXPECT_EQ(out_result_value, nullptr); +} + +TEST(JsFlowUtilTest, + ExtractJsFlowActionReturnValueDisallowsResultWithoutStatus) { + std::unique_ptr<base::Value> out_result_value; + base::Value::Dict dict; + dict.Set("result", 12345); + EXPECT_EQ(ExtractJsFlowActionReturnValue(base::Value(std::move(dict)), + out_result_value) + .proto_status(), + INVALID_ACTION); + EXPECT_EQ(out_result_value, nullptr); +} + +TEST(JsFlowUtilTest, ExtractJsFlowActionReturnValueDisallowsInvalidStatus) { + std::unique_ptr<base::Value> out_result_value; + base::Value::Dict dict; + dict.Set("status", -1); + EXPECT_EQ(ExtractJsFlowActionReturnValue(base::Value(std::move(dict)), + out_result_value) + .proto_status(), + INVALID_ACTION); + EXPECT_EQ(out_result_value, nullptr); +} + +TEST(JsFlowUtilTest, ExtractJsFlowActionReturnValueAllowsStatusWithoutResult) { + std::unique_ptr<base::Value> out_result_value; + base::Value::Dict dict; + dict.Set("status", 3); + EXPECT_EQ(ExtractJsFlowActionReturnValue(base::Value(std::move(dict)), + out_result_value) + .proto_status(), + OTHER_ACTION_STATUS); + EXPECT_EQ(out_result_value, nullptr); +} + +TEST(JsFlowUtilTest, ExtractJsFlowActionReturnValueAllowsStatusWithResult) { + std::unique_ptr<base::Value> out_result_value; + base::Value::Dict dict; + dict.Set("status", 3); + dict.Set("result", *base::JSONReader::Read(R"([[1, 2], null, {"enum": 5}])")); + EXPECT_EQ(ExtractJsFlowActionReturnValue(base::Value(std::move(dict)), + out_result_value) + .proto_status(), + OTHER_ACTION_STATUS); + EXPECT_EQ(*out_result_value, + *base::JSONReader::Read(R"([[1, 2], null, {"enum": 5}])")); +} + } // namespace } // namespace js_flow_util } // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/protocol_utils.cc b/components/autofill_assistant/browser/protocol_utils.cc index 62c1bd6..760c11c 100644 --- a/components/autofill_assistant/browser/protocol_utils.cc +++ b/components/autofill_assistant/browser/protocol_utils.cc
@@ -24,6 +24,7 @@ #include "components/autofill_assistant/browser/actions/expect_navigation_action.h" #include "components/autofill_assistant/browser/actions/generate_password_for_form_field_action.h" #include "components/autofill_assistant/browser/actions/get_element_status_action.h" +#include "components/autofill_assistant/browser/actions/js_flow_action.h" #include "components/autofill_assistant/browser/actions/navigate_action.h" #include "components/autofill_assistant/browser/actions/perform_on_single_element_action.h" #include "components/autofill_assistant/browser/actions/popup_message_action.h" @@ -448,6 +449,8 @@ return std::make_unique<SaveSubmittedPasswordAction>(delegate, action); case ActionProto::ActionInfoCase::kExecuteJs: return std::make_unique<ExecuteJsAction>(delegate, action); + case ActionProto::ActionInfoCase::kJsFlow: + return std::make_unique<JsFlowAction>(delegate, action); case ActionProto::ActionInfoCase::ACTION_INFO_NOT_SET: { VLOG(1) << "Encountered action with ACTION_INFO_NOT_SET"; return std::make_unique<UnsupportedAction>(delegate, action); @@ -708,6 +711,10 @@ success = ParseActionFromString(action_id, bytes, error_message, proto.mutable_execute_js()); break; + case ActionProto::ActionInfoCase::kJsFlow: + success = ParseActionFromString(action_id, bytes, error_message, + proto.mutable_js_flow()); + break; case ActionProto::ActionInfoCase::ACTION_INFO_NOT_SET: // This is an "unknown action", handled as such in CreateAction. return proto; @@ -772,6 +779,17 @@ } // static +std::unique_ptr<Action> ProtocolUtils::ParseAction( + ActionDelegate* delegate, + const std::string& serialized_action) { + ActionProto proto; + if (!proto.ParseFromString(serialized_action)) { + return nullptr; + } + return CreateAction(delegate, proto); +} + +// static std::string ProtocolUtils::CreateGetTriggerScriptsRequest( const GURL& url, const ClientContextProto& client_context,
diff --git a/components/autofill_assistant/browser/protocol_utils.h b/components/autofill_assistant/browser/protocol_utils.h index c9d60bc..963d25f8 100644 --- a/components/autofill_assistant/browser/protocol_utils.h +++ b/components/autofill_assistant/browser/protocol_utils.h
@@ -114,6 +114,12 @@ std::vector<std::unique_ptr<Script>>* scripts, bool* should_update_scripts); + // Parses a single serialized ActionProto. Returns nullptr in the case of + // parsing errors. + static std::unique_ptr<Action> ParseAction( + ActionDelegate* delegate, + const std::string& serialized_action); + // Parse trigger scripts from the given |response| and insert them into // |trigger_scripts|. Returns false if parsing failed or the proto contained // invalid values.
diff --git a/components/autofill_assistant/browser/protocol_utils_unittest.cc b/components/autofill_assistant/browser/protocol_utils_unittest.cc index 4b5ca57..a44417e 100644 --- a/components/autofill_assistant/browser/protocol_utils_unittest.cc +++ b/components/autofill_assistant/browser/protocol_utils_unittest.cc
@@ -238,6 +238,10 @@ /* should_update_scripts= */ &unused)); } +TEST_F(ProtocolUtilsTest, ParseActionParseError) { + EXPECT_EQ(ProtocolUtils::ParseAction(nullptr, "invalid"), nullptr); +} + TEST_F(ProtocolUtilsTest, ParseActionsValid) { ActionsResponseProto proto; proto.set_run_id(1); @@ -267,6 +271,14 @@ EXPECT_TRUE(scripts.empty()); } +TEST_F(ProtocolUtilsTest, ParseActionValid) { + ActionProto action_proto; + action_proto.mutable_tell()->set_message("Hello world!"); + std::string proto_str; + action_proto.SerializeToString(&proto_str); + EXPECT_NE(ProtocolUtils::ParseAction(nullptr, proto_str), nullptr); +} + TEST_F(ProtocolUtilsTest, ParseActionsEmptyUpdateScriptList) { ActionsResponseProto proto; proto.mutable_update_script_list();
diff --git a/components/autofill_assistant/browser/script_executor.cc b/components/autofill_assistant/browser/script_executor.cc index fc091b8..5f7800d 100644 --- a/components/autofill_assistant/browser/script_executor.cc +++ b/components/autofill_assistant/browser/script_executor.cc
@@ -595,6 +595,11 @@ } else { at_end_ = SHUTDOWN; } + + // Clear remaining actions, if any. If there is a current action, it is + // allowed to finish and add its status to |processed_actions_|. + actions_.resize(processed_actions_.size() + + (current_action_ != nullptr ? 1 : 0)); } void ScriptExecutor::Close() {
diff --git a/components/autofill_assistant/browser/script_executor_unittest.cc b/components/autofill_assistant/browser/script_executor_unittest.cc index d63d5d3..1755a20 100644 --- a/components/autofill_assistant/browser/script_executor_unittest.cc +++ b/components/autofill_assistant/browser/script_executor_unittest.cc
@@ -744,6 +744,29 @@ executor_->Run(&user_data_, executor_callback_.Get()); } +TEST_F(ScriptExecutorTest, StopClearsUnexecutedActions) { + ActionsResponseProto actions_response; + actions_response.add_actions()->mutable_stop(); + actions_response.add_actions()->mutable_tell()->set_message("should not run"); + + EXPECT_CALL(mock_service_, OnGetActions(_, _, _, _, _, _)) + .WillOnce(RunOnceCallback<5>(net::HTTP_OK, Serialize(actions_response))); + + std::vector<ProcessedActionProto> processed_actions_capture; + EXPECT_CALL(mock_service_, OnGetNextActions(_, _, _, _, _, _)) + .WillOnce(DoAll(SaveArg<3>(&processed_actions_capture), + RunOnceCallback<5>(net::HTTP_OK, ""))); + EXPECT_CALL(executor_callback_, + Run(AllOf(Field(&ScriptExecutor::Result::success, true), + Field(&ScriptExecutor::Result::at_end, + ScriptExecutor::SHUTDOWN)))); + executor_->Run(&user_data_, executor_callback_.Get()); + + EXPECT_NE(ui_delegate_.GetStatusMessage(), "should not run"); + ASSERT_EQ(processed_actions_capture.size(), 1u); + EXPECT_EQ(processed_actions_capture[0].action(), actions_response.actions(0)); +} + TEST_F(ScriptExecutorTest, InterruptActionListOnError) { ActionsResponseProto initial_actions_response; initial_actions_response.add_actions()->mutable_tell()->set_message(
diff --git a/components/autofill_assistant/browser/service.proto b/components/autofill_assistant/browser/service.proto index 2decea9f..7f315c8 100644 --- a/components/autofill_assistant/browser/service.proto +++ b/components/autofill_assistant/browser/service.proto
@@ -995,6 +995,7 @@ ResetPendingCredentialsProto reset_pending_credentials = 86; SaveSubmittedPasswordProto save_submitted_password = 87; UpdateClientSettingsProto update_client_settings = 89; + JsFlowProto js_flow = 92; ExecuteJsProto execute_js = 93; } @@ -1004,7 +1005,7 @@ optional bool clean_contextual_ui = 33; reserved 5, 6, 8, 13 to 17, 20 to 23, 25 to 27, 30, 31, 34, 38, 46 to 48, 50, - 51, 71, 88, 90 to 92; + 51, 71, 88, 90, 91; } // Result of |CollectUserDataProto| to be sent to the server. @@ -1093,6 +1094,8 @@ CheckOptionElementProto.Result check_option_element_result = 35; // Should be set as a result of SendKeystrokeEventsProto. SendKeystrokeEventsProto.Result send_key_stroke_events_result = 36; + // Should be set as a result of JsFlowProto. + JsFlowProto.Result js_flow_result = 37; } // Reports information about navigation that happened while @@ -2561,6 +2564,16 @@ reserved 1; } +message DataOriginNoticeProto { + // Text of the link to the dialog. + optional string link_text = 1; + + // Content of the dialog + optional string dialog_title = 2; + optional string dialog_text = 3; + optional string dialog_button_text = 4; +} + // Asks to provide the data used by UseAddressAction and // UseCreditCardAction. // Next: 40 @@ -2627,6 +2640,8 @@ optional string credit_card_expired_text = 23; // The login details that should be gathered. optional LoginDetailsProto login_details = 16; + // If set, shows the data origin section to the user. + optional DataOriginNoticeProto data_origin_notice = 39; // An optional list of additional sections, which is above all other sections. repeated UserFormSectionProto additional_prepended_sections = 18; // An optional list of additional sections, which is below all other sections. @@ -3296,3 +3311,18 @@ // Action to unconditionally dispatch a custom JS event 'duplexweb' on document. message DispatchJsEventProto {} + +// Executes a javascript flow in an isolated environment. Additional actions may +// be requested directly from the flow. See +// components/autofill_assistant/browser/js_flow_executor_impl.h for details. +message JsFlowProto { + message Result { + // A serialized JSON object containing the overall result value of the flow. + // This will never contain string values, for reasons of privacy and + // security. If the script attempts to return string values anyway, this + // field will be empty and the action will return INVALID_ACTION. + optional string result_json = 1; + } + // The JS flow to execute in a sandbox. + optional string js_flow = 1; +}
diff --git a/components/autofill_assistant/browser/user_data.h b/components/autofill_assistant/browser/user_data.h index 6e5de88..678a7a21 100644 --- a/components/autofill_assistant/browser/user_data.h +++ b/components/autofill_assistant/browser/user_data.h
@@ -350,6 +350,7 @@ absl::optional<GenericUserInterfaceProto> generic_user_interface_prepended; absl::optional<GenericUserInterfaceProto> generic_user_interface_appended; absl::optional<std::string> additional_model_identifier_to_check; + absl::optional<DataOriginNoticeProto> data_origin_notice; base::OnceCallback<void(UserData*, const UserModel*)> confirm_callback; base::OnceCallback<void(int, UserData*, const UserModel*)>
diff --git a/components/browser_sync/active_devices_provider_impl_unittest.cc b/components/browser_sync/active_devices_provider_impl_unittest.cc index 5dc8d2c..cb074665 100644 --- a/components/browser_sync/active_devices_provider_impl_unittest.cc +++ b/components/browser_sync/active_devices_provider_impl_unittest.cc
@@ -11,6 +11,7 @@ #include "base/guid.h" #include "base/strings/string_number_conversions.h" #include "base/test/mock_callback.h" +#include "base/test/scoped_feature_list.h" #include "base/test/simple_test_clock.h" #include "base/time/time.h" #include "components/browser_sync/browser_sync_switches.h" @@ -78,6 +79,8 @@ }; TEST_F(ActiveDevicesProviderImplTest, ShouldFilterInactiveDevices) { + base::test::ScopedFeatureList feature_override( + switches::kSyncFilterOutInactiveDevicesForSingleClient); AddDevice("local_device_pulse_interval", /*fcm_registration_token=*/"", DefaultInterestedDataTypes(), clock_.Now() - base::Minutes(kPulseIntervalMinutes + 1)); @@ -145,6 +148,8 @@ } TEST_F(ActiveDevicesProviderImplTest, ShouldReturnActiveFCMRegistrationTokens) { + base::test::ScopedFeatureList feature_override( + switches::kSyncFilterOutInactiveDevicesForSingleClient); AddDevice("device_1", "fcm_token_1", DefaultInterestedDataTypes(), clock_.Now() - base::Minutes(1)); AddDevice("device_2", "fcm_token_2", DefaultInterestedDataTypes(),
diff --git a/components/browser_sync/browser_sync_switches.h b/components/browser_sync/browser_sync_switches.h index 86fa0200..140ef5d1 100644 --- a/components/browser_sync/browser_sync_switches.h +++ b/components/browser_sync/browser_sync_switches.h
@@ -39,7 +39,7 @@ // recently (depending on the device's pulse_interval and an additional margin). inline constexpr base::Feature kSyncFilterOutInactiveDevicesForSingleClient{ "SyncFilterOutInactiveDevicesForSingleClient", - base::FEATURE_ENABLED_BY_DEFAULT}; + base::FEATURE_DISABLED_BY_DEFAULT}; // An additional threshold to consider devices as active. It extends device's // pulse interval to mitigate possible latency after DeviceInfo commit. inline constexpr base::FeatureParam<base::TimeDelta> kSyncActiveDeviceMargin{
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb index 752fc092..16da0b6 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb
@@ -77,6 +77,7 @@ <translation id="2687403674020088961">Bütün kukiləri bloklayın (tövsiyə edilmir)</translation> <translation id="2704606927547763573">Kopyalandı</translation> <translation id="2717722538473713889">E-poçt ünvanları</translation> +<translation id="2750481671343847896">Saytlar kimlik xidmətlərindən daxil olma sorğularını göstərə bilər.</translation> <translation id="2785051990912111074">Bu seçim <ph name="WEBSITE" /> üçün kukiləri siləcək</translation> <translation id="2822354292072154809"><ph name="CHOSEN_OBJECT_NAME" /> üçün bütün sayt icazələrini sıfırlamaq istədiyinizə əminsiniz?</translation> <translation id="2870560284913253234">Sayt</translation> @@ -112,6 +113,7 @@ <translation id="3763247130972274048">10 saniyə keçmək üçün videonun sol və ya sağına iki dəfə toxunun</translation> <translation id="3797520601150691162">Müəyyən sayta tünd tema tətbiq etməyin</translation> <translation id="381841723434055211">Telefon nömrələri</translation> +<translation id="3826050100957962900">Üçüncü tərəfin girişi</translation> <translation id="3835233591525155343">Cihazdan istifadəniz</translation> <translation id="385051799172605136">Geri</translation> <translation id="3859306556332390985">İrəli axtarın</translation> @@ -235,6 +237,7 @@ <translation id="6643016212128521049">Silin</translation> <translation id="6689172468748959065">Profil fotoları</translation> <translation id="6697925417670533197">Aktiv endirmələr</translation> +<translation id="6722828510648505498">Kimlik xidmətlərindən daxil olma sorğularını bloklayın.</translation> <translation id="6746124502594467657">Aşağı köçürün</translation> <translation id="6749077623962119521">İcazələr sıfırlansın?</translation> <translation id="6766622839693428701">Bağlamaq üçün aşağı sürüşdürün.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb index 2556cde..e47dafd 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb
@@ -77,6 +77,7 @@ <translation id="2687403674020088961">Block all cookies (not recommended)</translation> <translation id="2704606927547763573">Copied</translation> <translation id="2717722538473713889">Email addresses</translation> +<translation id="2750481671343847896">Sites can show sign-in prompts from identity services.</translation> <translation id="2785051990912111074">This choice will clear cookies for <ph name="WEBSITE" /></translation> <translation id="2822354292072154809">Are you sure that you want to reset all site permissions for <ph name="CHOSEN_OBJECT_NAME" />?</translation> <translation id="2870560284913253234">Site</translation> @@ -112,6 +113,7 @@ <translation id="3763247130972274048">Double-tap video left or right to skip 10s</translation> <translation id="3797520601150691162">Don’t apply Dark theme for a specific site</translation> <translation id="381841723434055211">Phone numbers</translation> +<translation id="3826050100957962900">Third-party sign-in</translation> <translation id="3835233591525155343">Your device use</translation> <translation id="385051799172605136">Back</translation> <translation id="3859306556332390985">Seek forward</translation> @@ -235,6 +237,7 @@ <translation id="6643016212128521049">Clear</translation> <translation id="6689172468748959065">Profile photos</translation> <translation id="6697925417670533197">Active downloads</translation> +<translation id="6722828510648505498">Block sign-in prompts from identity services.</translation> <translation id="6746124502594467657">Move down</translation> <translation id="6749077623962119521">Reset permissions?</translation> <translation id="6766622839693428701">Swipe down to close.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb index 72a72d1..4ca61664 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb
@@ -77,6 +77,7 @@ <translation id="2687403674020088961">ყველა ქუქი-ჩანაწერის დაბლოკვა (არარეკომენდებული)</translation> <translation id="2704606927547763573">დაკოპირდა</translation> <translation id="2717722538473713889">ელფოსტის მისამართები</translation> +<translation id="2750481671343847896">საიტებს შეუძლია სისტემაში შესვლის მოთხოვნების ჩვენება პირადობის მონაცემების სერვისებიდან.</translation> <translation id="2785051990912111074">ეს არჩევანი გაასუფთავებს ქუქი-ჩანაწერებს <ph name="WEBSITE" />-ისთვის</translation> <translation id="2822354292072154809">ნამდვილად გსურთ, საიტის ყველა ნებართვის გადაყენება <ph name="CHOSEN_OBJECT_NAME" />-ისთვის?</translation> <translation id="2870560284913253234">საიტი</translation> @@ -112,6 +113,7 @@ <translation id="3763247130972274048">10 წამის გამოსატოვებლად ორმაგად შეეხეთ ვიდეოს მარცხნივ ან მარჯვნივ</translation> <translation id="3797520601150691162">არ მსურს მუქი თემის გამოყენება კონკრეტულ საიტზე</translation> <translation id="381841723434055211">ტელეფონის ნომრები</translation> +<translation id="3826050100957962900">სისტემაში შესვლა მესამე მხარის მეშვეობით</translation> <translation id="3835233591525155343">თქვენი მოწყობილობის გამოყენება</translation> <translation id="385051799172605136">უკან</translation> <translation id="3859306556332390985">წინ ძიება</translation> @@ -235,6 +237,7 @@ <translation id="6643016212128521049">გასუფთავება</translation> <translation id="6689172468748959065">პროფილის ფოტოები</translation> <translation id="6697925417670533197">მიმდინარე ჩამოტვირთვები</translation> +<translation id="6722828510648505498">სისტემაში შესვლის მოთხოვნების დაბლოკვა პირადობის მონაცემების სერვისებიდან.</translation> <translation id="6746124502594467657">გადაადგილება ქვემოთ</translation> <translation id="6749077623962119521">გსურთ ნებართვების გადაყენება?</translation> <translation id="6766622839693428701">დასახურად გადაფურცლეთ ქვემოთ.</translation>
diff --git a/components/browser_ui/widget/android/java/res/values/attrs.xml b/components/browser_ui/widget/android/java/res/values/attrs.xml index a8026ac..0d57621 100644 --- a/components/browser_ui/widget/android/java/res/values/attrs.xml +++ b/components/browser_ui/widget/android/java/res/values/attrs.xml
@@ -110,6 +110,7 @@ <attr name="primaryTextAppearance" format="reference"/> <attr name="endIconWidth" format="reference|dimension"/> <attr name="endIconHeight" format="reference|dimension"/> + <attr name="multiLineVerticalPadding" format="reference|dimension"/> <attr name="secondaryTextAppearance" format="reference"/> <attr name="rippleColor"/> <attr name="verticalInset"/>
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialog.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialog.java index f562d30..8db0cb8 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialog.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialog.java
@@ -24,6 +24,7 @@ import android.widget.FrameLayout; import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.ContextUtils; @@ -215,7 +216,11 @@ mOnDragListener = new OnDragListener() { @Override public boolean onDrag(View view, DragEvent dragEvent) { - return mTouchEventDelegateView.dispatchDragEvent(dragEvent); + if (mTouchEventDelegateView != null + && mTouchEventDelegateView.isAttachedToWindow()) { + return mTouchEventDelegateView.dispatchDragEvent(dragEvent); + } + return false; } }; mLayout.setOnDragListener(mOnDragListener); @@ -303,7 +308,7 @@ dismiss(); return true; } - if (isDialogNonModal()) { + if (isDialogNonModal() && mTouchEventDelegateView.isAttachedToWindow()) { return mTouchEventDelegateView.dispatchTouchEvent(event); } return false; @@ -340,4 +345,9 @@ private boolean isDialogNonModal() { return mIsPopup && mShouldRemoveScrim && mTouchEventDelegateView != null; } + + @VisibleForTesting + OnDragListener getOnDragListenerForTesting() { + return mOnDragListener; + } }
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialogUnitTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialogUnitTest.java index fb2e419..04f36383 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialogUnitTest.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialogUnitTest.java
@@ -11,6 +11,7 @@ import android.app.ActionBar.LayoutParams; import android.app.Activity; import android.graphics.Rect; +import android.view.DragEvent; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -186,6 +187,7 @@ requestLayoutForRootView(); Mockito.verify(mSpyPopupWindow) .showAtLocation(eq(mRootView.getRootView()), anyInt(), anyInt(), anyInt()); + Mockito.doReturn(true).when(mMockTouchEventDelegateView).isAttachedToWindow(); // common motion events other than ACTION_DOWN should be forwarded to touch event delegate. int[] motionEvenActions = new int[] {MotionEvent.ACTION_CANCEL, @@ -196,7 +198,8 @@ for (int actionType : motionEvenActions) { MotionEvent event = createMockMotionEventWithActionType(actionType); mDialog.onTouchEvent(event); - Mockito.verify(mMockTouchEventDelegateView).dispatchTouchEvent(eq(event)); + Mockito.verify(mMockTouchEventDelegateView, Mockito.description("Action" + actionType)) + .dispatchTouchEvent(eq(event)); } // ACTION_DOWN should dismiss the dialog and the popup window. @@ -207,6 +210,30 @@ Mockito.verify(mSpyPopupWindow).dismiss(); } + @Test + public void testDispatchDragEvents() { + mDialog = createContextMenuDialog(/*isPopup=*/true, /*shouldRemoveScrim=*/true); + mDialog.show(); + requestLayoutForRootView(); + Mockito.verify(mSpyPopupWindow) + .showAtLocation(eq(mRootView.getRootView()), anyInt(), anyInt(), anyInt()); + Assert.assertNotNull("OnDragListener is null.", mDialog.getOnDragListenerForTesting()); + + final DragEvent mockDragEvent = Mockito.mock(DragEvent.class); + Mockito.doReturn(DragEvent.ACTION_DRAG_LOCATION).when(mockDragEvent).getAction(); + + Mockito.doReturn(true).when(mMockTouchEventDelegateView).isAttachedToWindow(); + mDialog.getOnDragListenerForTesting().onDrag(mRootView, mockDragEvent); + Mockito.verify(mMockTouchEventDelegateView, Mockito.times(1)) + .dispatchDragEvent(eq(mockDragEvent)); + + final DragEvent mockDragEvent2 = Mockito.mock(DragEvent.class); + Mockito.doReturn(false).when(mMockTouchEventDelegateView).isAttachedToWindow(); + mDialog.getOnDragListenerForTesting().onDrag(mRootView, mockDragEvent2); + Mockito.verify(mMockTouchEventDelegateView, Mockito.times(0)) + .dispatchDragEvent(eq(mockDragEvent2)); + } + private ContextMenuDialog createContextMenuDialog(boolean isPopup, boolean shouldRemoveScrim) { return new ContextMenuDialog(mActivity, 0, ContextMenuDialog.NO_CUSTOM_MARGIN, ContextMenuDialog.NO_CUSTOM_MARGIN, mRootView, mMenuContentView, isPopup,
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/chips/ChipView.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/chips/ChipView.java index ecd4980..6c406c9 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/chips/ChipView.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/chips/ChipView.java
@@ -138,6 +138,9 @@ int verticalInset = a.getDimensionPixelSize(R.styleable.ChipView_verticalInset, getResources().getDimensionPixelSize(R.dimen.chip_bg_vertical_inset)); boolean allowMultipleLines = a.getBoolean(R.styleable.ChipView_allowMultipleLines, false); + int minMultilineVerticalTextPadding = a.getDimensionPixelSize( + R.styleable.ChipView_multiLineVerticalPadding, + getResources().getDimensionPixelSize(R.dimen.chip_text_multiline_vertical_padding)); boolean textAlignStart = a.getBoolean(R.styleable.ChipView_textAlignStart, false); boolean reduceTextStartPadding = a.getBoolean(R.styleable.ChipView_reduceTextStartPadding, false); @@ -175,10 +178,6 @@ // If false fall back to single line defined in XML styles. if (allowMultipleLines) { mPrimaryText.setMaxLines(MAX_LINES); - // Vertical padding must be explicitly defined for the text view to create space if text - // wrapping causes the chip to increase in size vertically. - int minMultilineVerticalTextPadding = getResources().getDimensionPixelSize( - R.dimen.chip_text_multiline_vertical_padding); // TODO(benwgold): Test for non multiline chips to see if 4dp vertical padding can be // safely applied to all chips without affecting styling. mPrimaryText.setPaddingRelative(mPrimaryText.getPaddingStart(),
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/listmenu/OWNERS b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/listmenu/OWNERS new file mode 100644 index 0000000..b887596 --- /dev/null +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/listmenu/OWNERS
@@ -0,0 +1,2 @@ +lazzzis@google.com +twellington@chromium.org
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index 6b2a1d9..01e2a5f 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "7.2", - "log_list_timestamp": "2022-03-16T01:33:58Z", + "version": "7.3", + "log_list_timestamp": "2022-03-17T01:34:25Z", "operators": [ { "name": "Google",
diff --git a/components/commerce/core/commerce_heuristics_data.cc b/components/commerce/core/commerce_heuristics_data.cc index cc3eeee4..9942770 100644 --- a/components/commerce/core/commerce_heuristics_data.cc +++ b/components/commerce/core/commerce_heuristics_data.cc
@@ -12,6 +12,7 @@ namespace { // CommerceHintHeuristics types. constexpr char kMerchantNameType[] = "merchant_name"; +constexpr char kMerchantCartURLType[] = "cart_url"; // CommerceGlobalHeuristics types. constexpr char kSkipProductPatternType[] = "sensitive_product_regex"; @@ -52,6 +53,11 @@ return GetCommerceHintHeuristics(kMerchantNameType, domain); } +absl::optional<std::string> CommerceHeuristicsData::GetMerchantCartURL( + const std::string& domain) { + return GetCommerceHintHeuristics(kMerchantCartURLType, domain); +} + const re2::RE2* CommerceHeuristicsData::GetProductSkipPattern() { return product_skip_pattern_.get(); }
diff --git a/components/commerce/core/commerce_heuristics_data.h b/components/commerce/core/commerce_heuristics_data.h index 78e24e6..3cd7391 100644 --- a/components/commerce/core/commerce_heuristics_data.h +++ b/components/commerce/core/commerce_heuristics_data.h
@@ -28,6 +28,9 @@ // Try to get merchant name for `domain`. absl::optional<std::string> GetMerchantName(const std::string& domain); + // Try to get merchant cart URL for `domain`. + absl::optional<std::string> GetMerchantCartURL(const std::string& domain); + // Try to get the product skip pattern. const re2::RE2* GetProductSkipPattern();
diff --git a/components/commerce/core/commerce_heuristics_data_unittest.cc b/components/commerce/core/commerce_heuristics_data_unittest.cc index 223636e..f660e7c 100644 --- a/components/commerce/core/commerce_heuristics_data_unittest.cc +++ b/components/commerce/core/commerce_heuristics_data_unittest.cc
@@ -11,7 +11,8 @@ const char kHintHeuristicsJSONData[] = R"###( { "foo.com": { - "merchant_name": "Foo" + "merchant_name": "Foo", + "cart_url": "foo.com/cart" }, "bar.com": { "merchant_name": "Bar" @@ -53,6 +54,8 @@ ASSERT_TRUE(hint_heuristics->contains("baz.com")); ASSERT_EQ(*hint_heuristics->FindDict("foo.com")->FindString("merchant_name"), "Foo"); + ASSERT_EQ(*hint_heuristics->FindDict("foo.com")->FindString("cart_url"), + "foo.com/cart"); ASSERT_EQ(*hint_heuristics->FindDict("bar.com")->FindString("merchant_name"), "Bar"); auto* global_heuristics = GetGlobalHeuristics(); @@ -93,6 +96,16 @@ ASSERT_FALSE(data.GetMerchantName("xyz.com").has_value()); } +TEST_F(CommerceHeuristicsDataTest, TestGetMerchantCartURL) { + auto& data = commerce_heuristics::CommerceHeuristicsData::GetInstance(); + + ASSERT_TRUE(data.PopulateDataFromComponent( + kHintHeuristicsJSONData, kGlobalHeuristicsJSONData, "", "")); + + ASSERT_EQ(*data.GetMerchantCartURL("foo.com"), "foo.com/cart"); + ASSERT_FALSE(data.GetMerchantCartURL("baz.com").has_value()); +} + TEST_F(CommerceHeuristicsDataTest, TestGetProductSkipPattern) { auto& data = commerce_heuristics::CommerceHeuristicsData::GetInstance();
diff --git a/components/commerce_strings.grdp b/components/commerce_strings.grdp new file mode 100644 index 0000000..cea8b17 --- /dev/null +++ b/components/commerce_strings.grdp
@@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<grit-part> + <!-- Desktop only --> + <if expr="not is_android and not is_ios"> + <message name="IDS_DISCOUNT_CONTEXTUAL_CONSENT_TITLE" desc="The title shown on the consent bubble for getting discount."> + Get discount on <ph name="MERCHANT_NAME">$1</ph> and more + </message> + <message name="IDS_DISCOUNT_CONTEXTUAL_CONSENT_CONTENT" desc="Text shown on the consent bubble asking if users would like to give their consent to the feature."> + Let Google use your carts to find personalized discounts when available + </message> + <message name="IDS_DISCOUNT_CONTEXTUAL_CONSENT_NO_THANKS" desc="Text shown on the reject button of the consent bubble. By clicking this button, users has chosen not to accept the consent."> + No thanks + </message> + <message name="IDS_DISCOUNT_CONTEXTUAL_CONSENT_GET_DISCOUNTS" desc="Text shown on the accept button of the consent bubble. By clicking this button, users has chosen to accept the consent."> + Get discounts + </message> + <message name="IDS_DISCOUNT_CONTEXTUAL_CONSENT_ACCEPTED_CONFIRMATION_TITLE" desc="The title shown on the consent confirmation bubble after the user has accepted the consent."> + Google will find discounts for you + </message> + <message name="IDS_DISCOUNT_CONTEXTUAL_CONSENT_ACCEPTED_CONFIRMATION_CONTENT" desc="The text shown on the consent confirmation bubble telling user where to look for discounts."> + When Google finds available discounts, they will show during checkout + </message> + <message name="IDS_DISCOUNT_CONTEXTUAL_CONSENT_ACCEPTED_CONFIRMATION_DONE" desc="The text shown on the consent confirmation bubble bubble. User can click this button to close the bubble."> + Done + </message> + </if> +</grit-part> \ No newline at end of file
diff --git a/components/commerce_strings_grdp/IDS_DISCOUNT_CONTEXTUAL_CONSENT_ACCEPTED_CONFIRMATION_CONTENT.png.sha1 b/components/commerce_strings_grdp/IDS_DISCOUNT_CONTEXTUAL_CONSENT_ACCEPTED_CONFIRMATION_CONTENT.png.sha1 new file mode 100644 index 0000000..e3fc153 --- /dev/null +++ b/components/commerce_strings_grdp/IDS_DISCOUNT_CONTEXTUAL_CONSENT_ACCEPTED_CONFIRMATION_CONTENT.png.sha1
@@ -0,0 +1 @@ +64ee3af0a35e80a30fa09213750f1e76e6f37a9a \ No newline at end of file
diff --git a/components/commerce_strings_grdp/IDS_DISCOUNT_CONTEXTUAL_CONSENT_ACCEPTED_CONFIRMATION_DONE.png.sha1 b/components/commerce_strings_grdp/IDS_DISCOUNT_CONTEXTUAL_CONSENT_ACCEPTED_CONFIRMATION_DONE.png.sha1 new file mode 100644 index 0000000..e3fc153 --- /dev/null +++ b/components/commerce_strings_grdp/IDS_DISCOUNT_CONTEXTUAL_CONSENT_ACCEPTED_CONFIRMATION_DONE.png.sha1
@@ -0,0 +1 @@ +64ee3af0a35e80a30fa09213750f1e76e6f37a9a \ No newline at end of file
diff --git a/components/commerce_strings_grdp/IDS_DISCOUNT_CONTEXTUAL_CONSENT_ACCEPTED_CONFIRMATION_TITLE.png.sha1 b/components/commerce_strings_grdp/IDS_DISCOUNT_CONTEXTUAL_CONSENT_ACCEPTED_CONFIRMATION_TITLE.png.sha1 new file mode 100644 index 0000000..e3fc153 --- /dev/null +++ b/components/commerce_strings_grdp/IDS_DISCOUNT_CONTEXTUAL_CONSENT_ACCEPTED_CONFIRMATION_TITLE.png.sha1
@@ -0,0 +1 @@ +64ee3af0a35e80a30fa09213750f1e76e6f37a9a \ No newline at end of file
diff --git a/components/commerce_strings_grdp/IDS_DISCOUNT_CONTEXTUAL_CONSENT_CONTENT.png.sha1 b/components/commerce_strings_grdp/IDS_DISCOUNT_CONTEXTUAL_CONSENT_CONTENT.png.sha1 new file mode 100644 index 0000000..8ec14b0c --- /dev/null +++ b/components/commerce_strings_grdp/IDS_DISCOUNT_CONTEXTUAL_CONSENT_CONTENT.png.sha1
@@ -0,0 +1 @@ +45f1316c3beb1da3dff6bf23d01263d0c38fe7fa \ No newline at end of file
diff --git a/components/commerce_strings_grdp/IDS_DISCOUNT_CONTEXTUAL_CONSENT_GET_DISCOUNTS.png.sha1 b/components/commerce_strings_grdp/IDS_DISCOUNT_CONTEXTUAL_CONSENT_GET_DISCOUNTS.png.sha1 new file mode 100644 index 0000000..8ec14b0c --- /dev/null +++ b/components/commerce_strings_grdp/IDS_DISCOUNT_CONTEXTUAL_CONSENT_GET_DISCOUNTS.png.sha1
@@ -0,0 +1 @@ +45f1316c3beb1da3dff6bf23d01263d0c38fe7fa \ No newline at end of file
diff --git a/components/commerce_strings_grdp/IDS_DISCOUNT_CONTEXTUAL_CONSENT_NO_THANKS.png.sha1 b/components/commerce_strings_grdp/IDS_DISCOUNT_CONTEXTUAL_CONSENT_NO_THANKS.png.sha1 new file mode 100644 index 0000000..f8b2b9e --- /dev/null +++ b/components/commerce_strings_grdp/IDS_DISCOUNT_CONTEXTUAL_CONSENT_NO_THANKS.png.sha1
@@ -0,0 +1 @@ +3862a6772ec328ad0cfd3b66c9729ed31f1dc155 \ No newline at end of file
diff --git a/components/commerce_strings_grdp/IDS_DISCOUNT_CONTEXTUAL_CONSENT_TITLE.png.sha1 b/components/commerce_strings_grdp/IDS_DISCOUNT_CONTEXTUAL_CONSENT_TITLE.png.sha1 new file mode 100644 index 0000000..8ec14b0c --- /dev/null +++ b/components/commerce_strings_grdp/IDS_DISCOUNT_CONTEXTUAL_CONSENT_TITLE.png.sha1
@@ -0,0 +1 @@ +45f1316c3beb1da3dff6bf23d01263d0c38fe7fa \ No newline at end of file
diff --git a/components/commerce_strings_grdp/OWNERS b/components/commerce_strings_grdp/OWNERS new file mode 100644 index 0000000..ba6bb0d --- /dev/null +++ b/components/commerce_strings_grdp/OWNERS
@@ -0,0 +1,3 @@ +meiliang@chromium.org + +file://components/commerce/OWNERS
diff --git a/components/commerce_strings_grdp/README.md b/components/commerce_strings_grdp/README.md new file mode 100644 index 0000000..527d0bed --- /dev/null +++ b/components/commerce_strings_grdp/README.md
@@ -0,0 +1,6 @@ +This directory of image SHA-1 hashes is used to improve translations of UI +strings through context images for translators. + +See also: [Chrome Translation Screenshots - Instructions & FAQ +](https://docs.google.com/document/d/1nwYWDny20icMSpLUuV_LgrlbWKrYpbXOERUIZNH636o/edit#heading=h.2t7lc4cxo2au) +
diff --git a/components/component_updater/installer_policies/BUILD.gn b/components/component_updater/installer_policies/BUILD.gn index 681ddeb..aff6966 100644 --- a/components/component_updater/installer_policies/BUILD.gn +++ b/components/component_updater/installer_policies/BUILD.gn
@@ -2,16 +2,22 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -static_library("installer_policies") { +group("installer_policies") { + public_deps = [ + ":installer_policies_no_content_deps", + ":installer_policies_with_content_deps", + ] +} + +# Installer policies that can be used in targets that can't depend on +# //content/ such as //android_webview:nonembedded. +# Prefer adding installer policies here. +static_library("installer_policies_no_content_deps") { sources = [ "autofill_states_component_installer.cc", "autofill_states_component_installer.h", "client_side_phishing_component_installer_policy.cc", "client_side_phishing_component_installer_policy.h", - "on_device_head_suggest_component_installer.cc", - "on_device_head_suggest_component_installer.h", - "optimization_hints_component_installer.cc", - "optimization_hints_component_installer.h", "origin_trials_component_installer.cc", "origin_trials_component_installer.h", "safety_tips_component_installer.cc", @@ -24,13 +30,30 @@ "//base", "//components/autofill/core/browser", "//components/component_updater", - "//components/omnibox/browser", - "//components/omnibox/common", - "//components/optimization_guide/core", "//components/prefs:prefs", "//components/reputation/core", "//components/reputation/core:proto", ] + + # Disallow depending on content. + assert_no_deps = [ "//content/public" ] +} + +static_library("installer_policies_with_content_deps") { + sources = [ + "on_device_head_suggest_component_installer.cc", + "on_device_head_suggest_component_installer.h", + "optimization_hints_component_installer.cc", + "optimization_hints_component_installer.h", + ] + + deps = [ + "//base", + "//components/component_updater", + "//components/omnibox/browser", + "//components/omnibox/common", + "//components/optimization_guide/core", + ] } source_set("unit_tests") {
diff --git a/components/components_strings.grd b/components/components_strings.grd index 355854e7..4e3891a8 100644 --- a/components/components_strings.grd +++ b/components/components_strings.grd
@@ -287,6 +287,7 @@ <part file="bookmark_component_strings.grdp" /> <part file="blocked_content_strings.grdp" /> <part file="browsing_data_strings.grdp" /> + <part file="commerce_strings.grdp" /> <part file="live_caption_strings.grdp" /> <part file="components_settings_strings.grdp" /> <part file="content_creation_strings.grdp" />
diff --git a/components/keyed_service/core/refcounted_keyed_service.h b/components/keyed_service/core/refcounted_keyed_service.h index 83e2c1ef..4d3ac8bb 100644 --- a/components/keyed_service/core/refcounted_keyed_service.h +++ b/components/keyed_service/core/refcounted_keyed_service.h
@@ -54,7 +54,8 @@ // If you need your service to be deleted on a specific sequence (for example, // you're converting a service that used content::DeleteOnThread<IO>), then // use this constructor with a reference to the SequencedTaskRunner (e.g., you - // can get it from base::CreateSequencedTaskRunner). + // can get it from content::Get(UI|IO)ThreadTaskRunner or + // base::ThreadPool::CreateSequencedTaskRunner). explicit RefcountedKeyedService( scoped_refptr<base::SequencedTaskRunner> task_runner);
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc index b06df27..7fadb2f2 100644 --- a/components/omnibox/browser/autocomplete_controller.cc +++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -58,6 +58,7 @@ #include "components/search_engines/template_url_service.h" #include "components/strings/grit/components_strings.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/metrics_proto/chrome_searchbox_stats.pb.h" #include "ui/base/device_form_factor.h" #include "ui/base/l10n/l10n_util.h" @@ -153,13 +154,15 @@ // This type indicates a native chrome suggestion. *type = 69; - // If provider is TYPE_ZERO_SUGGEST or TYPE_ON_DEVICE_HEAD, set the subtype - // accordingly. Type will be set in the switch statement below where we'll - // enter one of SEARCH_SUGGEST or NAVSUGGEST. + // If provider is TYPE_ZERO_SUGGEST_LOCAL_HISTORY, TYPE_ZERO_SUGGEST, or + // TYPE_ON_DEVICE_HEAD, set the subtype accordingly. The type will be set in + // the switch statement below for SEARCH_SUGGEST or NAVSUGGEST types. if (match.provider) { if (match.provider->type() == AutocompleteProvider::TYPE_ZERO_SUGGEST && (match.type == AutocompleteMatchType::SEARCH_SUGGEST || match.type == AutocompleteMatchType::NAVSUGGEST)) { + // Make sure changes here are reflected in UpdateAssistedQueryStats() + // below in which the zero-prefix suggestions are counted. if (match.type == AutocompleteMatchType::NAVSUGGEST) { subtypes->emplace(/*SUBTYPE_ZERO_PREFIX_LOCAL_FREQUENT_URLS=*/451); } @@ -172,6 +175,8 @@ AutocompleteProvider::TYPE_ON_DEVICE_HEAD) { // This subtype indicates a match from an on-device head provider. subtypes->emplace(/*SUBTYPE_SUGGEST_2G_LITE=*/271); + // Make sure changes here are reflected in UpdateAssistedQueryStats() + // below in which the zero-prefix suggestions are counted. } else if (match.provider->type() == AutocompleteProvider::TYPE_ZERO_SUGGEST_LOCAL_HISTORY) { subtypes->emplace(/*SUBTYPE_ZERO_PREFIX_LOCAL_HISTORY=*/450); @@ -641,21 +646,36 @@ UpdateMatchDestinationURLWithAdditionalAssistedQueryStats( base::TimeDelta query_formulation_time, AutocompleteMatch* match) const { + // We expect the assisted_query_stats and the searchbox_stats to have been + // previously set when this method is called. If that is not the case, this + // method is being called by mistake and assisted_query_stats and the + // searchbox_stats should not be updated with additional information. if (!match->search_terms_args || - match->search_terms_args->assisted_query_stats.empty()) + match->search_terms_args->assisted_query_stats.empty() || + match->search_terms_args->searchbox_stats.ByteSizeLong() == 0) { return; + } // Append the query formulation time (time from when the user first typed a // character into the omnibox to when the user selected a query), whether // a field trial has triggered, and the current page classification to the AQS // parameter. - match->search_terms_args->assisted_query_stats += base::StringPrintf( - ".%" PRId64 "j%dj%d", query_formulation_time.InMilliseconds(), + const std::string experiment_stats = base::StringPrintf( + "%" PRId64 "j%dj%d", query_formulation_time.InMilliseconds(), (search_provider_ && search_provider_->field_trial_triggered_in_session()) || (zero_suggest_provider_ && zero_suggest_provider_->field_trial_triggered_in_session()), input_.current_page_classification()); + match->search_terms_args->assisted_query_stats += "." + experiment_stats; + // TODO(crbug.com/1247846): experiment_stats is a deprecated field. We should + // however continue to report it for parity with what gets reported in aqs=, + // and for the downstream consumers that expect this field. Once gs_lcrp= + // fully replaces aqs=, Chrome should start logging the substitute fields and + // the downstream consumers should migrate to using those fields before we + // can stop logging this deprecated field. + match->search_terms_args->searchbox_stats.set_experiment_stats( + experiment_stats); // Append the ExperimentStatsV2 to the AQS parameter to be logged in // searchbox_stats.proto's experiment_stats_v2 field. @@ -682,6 +702,10 @@ // 'i' is used as a delimiter between experiment stat type and value. experiment_stats_v2.push_back(base::NumberToString(*type_int) + "i" + value); + auto* experiment_stats_v2_proto = + match->search_terms_args->searchbox_stats.add_experiment_stats_v2(); + experiment_stats_v2_proto->set_type_int(*type_int); + experiment_stats_v2_proto->set_string_value(value); } } if (!experiment_stats_v2.empty()) { @@ -949,15 +973,36 @@ if (result->empty()) return; + metrics::ChromeSearchboxStats searchbox_stats; + searchbox_stats.set_client_name("chrome"); + // Build the impressions string (the AQS part after "."). std::string autocompletions; int count = 0; + int num_zero_prefix_suggestions_shown = 0; size_t last_type = std::u16string::npos; base::flat_set<int> last_subtypes = {}; - for (const auto& match : *result) { - auto subtypes = match.subtypes; + for (size_t index = 0; index < result->size(); ++index) { + AutocompleteMatch* match = result->match_at(index); + auto subtypes = match->subtypes; size_t type = std::u16string::npos; - GetMatchTypeAndExtendSubtypes(match, &type, &subtypes); + GetMatchTypeAndExtendSubtypes(*match, &type, &subtypes); + + // Count any suggestions that constitute zero-prefix suggestions. + if (subtypes.contains(/*SUBTYPE_ZERO_PREFIX_LOCAL_HISTORY*/ 450) || + subtypes.contains( + /*SUBTYPE_ZERO_PREFIX_LOCAL_FREQUENT_URLS*/ 451) || + subtypes.contains(/*SUBTYPE_ZERO_PREFIX*/ 362)) { + num_zero_prefix_suggestions_shown++; + } + + auto* available_suggestion = searchbox_stats.add_available_suggestions(); + available_suggestion->set_index(index); + available_suggestion->set_type(type); + for (const auto subtype : subtypes) { + available_suggestion->add_subtypes(subtype); + } + if (last_type != std::u16string::npos && (type != last_type || subtypes != last_subtypes)) { AppendAvailableAutocompletion(last_type, last_subtypes, count, @@ -971,6 +1016,15 @@ } AppendAvailableAutocompletion(last_type, last_subtypes, count, &autocompletions); + + // TODO(crbug.com/1307142): These two fields should take into account all the + // zero-prefix suggestions shown during the session and not only the ones + // shown at the time of user making a selection. + searchbox_stats.set_num_zero_prefix_suggestions_shown( + num_zero_prefix_suggestions_shown); + searchbox_stats.set_zero_prefix_enabled(num_zero_prefix_suggestions_shown > + 0); + // Go over all matches and set AQS if the match supports it. for (size_t index = 0; index < result->size(); ++index) { AutocompleteMatch* match = result->match_at(index); @@ -978,10 +1032,24 @@ match->GetTemplateURL(template_url_service_, false); if (!template_url || !match->search_terms_args) continue; + + match->search_terms_args->searchbox_stats = searchbox_stats; + std::string selected_index; // Prevent trivial suggestions from getting credit for being selected. - if (!match->IsTrivialAutocompletion()) + if (!match->IsTrivialAutocompletion()) { + DCHECK_LT(static_cast<int>(index), + match->search_terms_args->searchbox_stats + .available_suggestions_size()); + const auto& selected_suggestion = + match->search_terms_args->searchbox_stats.available_suggestions( + index); + DCHECK_EQ(static_cast<int>(index), selected_suggestion.index()); + match->search_terms_args->searchbox_stats.mutable_assisted_query_info() + ->MergeFrom(selected_suggestion); + selected_index = base::StringPrintf("%" PRIuS, index); + } match->search_terms_args->assisted_query_stats = base::StringPrintf("chrome.%s.%s", selected_index.c_str(),
diff --git a/components/omnibox/browser/autocomplete_controller.h b/components/omnibox/browser/autocomplete_controller.h index 3944e37..39a5820 100644 --- a/components/omnibox/browser/autocomplete_controller.h +++ b/components/omnibox/browser/autocomplete_controller.h
@@ -78,13 +78,11 @@ bool default_match_changed) {} }; - // Converts the given match to a type (and possibly subtype) based on the AQS - // specification. For more details, see go/binary-clients-logging. - // Note: the `subtypes` parameter passed over to this function may be filled - // with subtypes reported by the suggest server. This call will update this - // set with Chrome-specific subtypes. - // TODO(https://crbug.com/1103056): relocate subtype updates to appropriate - // sites that construct these matches. + // Given a match, returns the appropriate type and zero or more subtypes + // corresponding to the SuggestType and SuggestSubtype enums in suggest.proto. + // This is needed to update Chrome's native types/subtypes to those expected + // by the server. For more details, see go/chrome-suggest-logging. + // Note: `subtypes` may be prepopulated with server-reported subtypes. static void GetMatchTypeAndExtendSubtypes(const AutocompleteMatch& match, size_t* type, base::flat_set<int>* subtypes);
diff --git a/components/omnibox/browser/autocomplete_provider_unittest.cc b/components/omnibox/browser/autocomplete_provider_unittest.cc index 4952452..36526e75 100644 --- a/components/omnibox/browser/autocomplete_provider_unittest.cc +++ b/components/omnibox/browser/autocomplete_provider_unittest.cc
@@ -12,6 +12,9 @@ #include "base/bind.h" #include "base/command_line.h" #include "base/location.h" +#include "base/test/scoped_feature_list.h" + +#include "base/base64.h" #include "base/memory/ptr_util.h" #include "base/memory/raw_ptr.h" #include "base/run_loop.h" @@ -31,6 +34,7 @@ #include "components/omnibox/browser/omnibox_prefs.h" #include "components/omnibox/browser/search_provider.h" #include "components/omnibox/browser/zero_suggest_provider.h" +#include "components/omnibox/common/omnibox_features.h" #include "components/open_from_clipboard/fake_clipboard_recent_content.h" #include "components/prefs/testing_pref_service.h" #include "components/search_engines/omnibox_focus_type.h" @@ -339,6 +343,7 @@ struct AssistedQueryStatsTestData { const AutocompleteMatch::Type match_type; const std::string expected_aqs; + const metrics::ChromeSearchboxStats expected_searchbox_stats; base::flat_set<int> subtypes; }; @@ -478,7 +483,8 @@ // don't rely on kResultsPerProvided and default relevance ordering // (B > A). RegisterTemplateURL(kTestTemplateURLKeyword, - "http://aqs/{searchTerms}/{google:assistedQueryStats}"); + "http://aqs/{searchTerms}/" + "{google:assistedQueryStats}{google:searchboxStats}"); AutocompleteController::Providers providers; @@ -659,6 +665,19 @@ for (size_t i = 0; i < size; ++i) { EXPECT_EQ(aqs_test_data[i].expected_aqs, result_.match_at(i)->search_terms_args->assisted_query_stats); + + std::string serialized_searchbox_stats; + result_.match_at(i)->search_terms_args->searchbox_stats.SerializeToString( + &serialized_searchbox_stats); + std::string encoded_searchbox_stats; + base::Base64Encode(serialized_searchbox_stats, &encoded_searchbox_stats); + std::string expected_serialized_searchbox_stats; + aqs_test_data[i].expected_searchbox_stats.SerializeToString( + &expected_serialized_searchbox_stats); + std::string expected_encoded_searchbox_stats; + base::Base64Encode(expected_serialized_searchbox_stats, + &expected_encoded_searchbox_stats); + EXPECT_EQ(expected_encoded_searchbox_stats, encoded_searchbox_stats); } } @@ -929,87 +948,267 @@ ResetControllerWithTestProviders(false, nullptr, nullptr); { + metrics::ChromeSearchboxStats searchbox_stats; AssistedQueryStatsTestData test_data[] = { // MSVC doesn't support zero-length arrays, so supply some dummy data. - {AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, ""}}; + {AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, "", searchbox_stats}}; SCOPED_TRACE("No matches"); // Note: We pass 0 here to ignore the dummy data above. RunAssistedQueryStatsTest(test_data, 0); } + // Note: See suggest.proto for the types and subtypes referenced below. + { + metrics::ChromeSearchboxStats searchbox_stats; + searchbox_stats.set_client_name("chrome"); + searchbox_stats.set_num_zero_prefix_suggestions_shown(0); + searchbox_stats.set_zero_prefix_enabled(false); + auto* available_suggestion = searchbox_stats.add_available_suggestions(); + available_suggestion->set_index(0); + available_suggestion->set_type(69); // NATIVE_CHROME + available_suggestion->add_subtypes(57); // SUBTYPE_OMNIBOX_ECHO_SEARCH + AssistedQueryStatsTestData test_data[] = { - {AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, "chrome..69i57"}}; + {AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, "chrome..69i57", + searchbox_stats}}; SCOPED_TRACE("One match"); RunAssistedQueryStatsTest(test_data, std::size(test_data)); } { + metrics::ChromeSearchboxStats searchbox_stats; + searchbox_stats.set_client_name("chrome"); + searchbox_stats.set_num_zero_prefix_suggestions_shown(0); + searchbox_stats.set_zero_prefix_enabled(false); + auto* available_suggestion = searchbox_stats.add_available_suggestions(); + available_suggestion->set_index(0); + available_suggestion->set_type(46); // ENTITY + available_suggestion->add_subtypes(131); + auto* assisted_query_info = searchbox_stats.mutable_assisted_query_info(); + assisted_query_info->MergeFrom(searchbox_stats.available_suggestions(0)); + AssistedQueryStatsTestData test_data[] = { {AutocompleteMatchType::SEARCH_SUGGEST_ENTITY, "chrome.0.46i131", + searchbox_stats, {131}}}; SCOPED_TRACE("One match with provider populated subtypes"); RunAssistedQueryStatsTest(test_data, std::size(test_data)); } { + metrics::ChromeSearchboxStats searchbox_stats; + searchbox_stats.set_client_name("chrome"); + searchbox_stats.set_num_zero_prefix_suggestions_shown(0); + searchbox_stats.set_zero_prefix_enabled(false); + auto* available_suggestion = searchbox_stats.add_available_suggestions(); + available_suggestion->set_index(0); + available_suggestion->set_type(0); // QUERY + available_suggestion->add_subtypes(13); + available_suggestion->add_subtypes(22); + available_suggestion->add_subtypes(99); + available_suggestion = searchbox_stats.add_available_suggestions(); + available_suggestion->set_index(1); + available_suggestion->set_type(46); // ENTITY + available_suggestion->add_subtypes(27); + available_suggestion->add_subtypes(31); + available_suggestion = searchbox_stats.add_available_suggestions(); + available_suggestion->set_index(2); + available_suggestion->set_type(46); // ENTITY + available_suggestion->add_subtypes(27); + available_suggestion->add_subtypes(31); + available_suggestion = searchbox_stats.add_available_suggestions(); + available_suggestion->set_index(3); + available_suggestion->set_type(46); // ENTITY + available_suggestion->add_subtypes(27); + available_suggestion->add_subtypes(31); + available_suggestion->add_subtypes(42); + available_suggestion = searchbox_stats.add_available_suggestions(); + available_suggestion->set_index(4); + available_suggestion->set_type(46); // ENTITY + available_suggestion->add_subtypes(27); + available_suggestion->add_subtypes(31); + + metrics::ChromeSearchboxStats searchbox_stats_0; + searchbox_stats_0.MergeFrom(searchbox_stats); + auto* assisted_query_info = searchbox_stats_0.mutable_assisted_query_info(); + assisted_query_info->MergeFrom(searchbox_stats.available_suggestions(0)); + + metrics::ChromeSearchboxStats searchbox_stats_1; + searchbox_stats_1.MergeFrom(searchbox_stats); + assisted_query_info = searchbox_stats_1.mutable_assisted_query_info(); + assisted_query_info->MergeFrom(searchbox_stats.available_suggestions(1)); + + metrics::ChromeSearchboxStats searchbox_stats_2; + searchbox_stats_2.MergeFrom(searchbox_stats); + assisted_query_info = searchbox_stats_2.mutable_assisted_query_info(); + assisted_query_info->MergeFrom(searchbox_stats.available_suggestions(2)); + + metrics::ChromeSearchboxStats searchbox_stats_3; + searchbox_stats_3.MergeFrom(searchbox_stats); + assisted_query_info = searchbox_stats_3.mutable_assisted_query_info(); + assisted_query_info->MergeFrom(searchbox_stats.available_suggestions(3)); + + metrics::ChromeSearchboxStats searchbox_stats_4; + searchbox_stats_4.MergeFrom(searchbox_stats); + assisted_query_info = searchbox_stats_4.mutable_assisted_query_info(); + assisted_query_info->MergeFrom(searchbox_stats.available_suggestions(4)); + // This test confirms that repetitive subtype information is being // properly handled and reported as the same suggestion type. AssistedQueryStatsTestData test_data[] = { {AutocompleteMatchType::SEARCH_SUGGEST, "chrome.0.0i13i22i99j46i27i31l2j46i27i31i42j46i27i31", + searchbox_stats_0, {22, 99, 13, 99}}, // The next two matches should be detected as the same type, despite // repeated subtype match. {AutocompleteMatchType::SEARCH_SUGGEST_ENTITY, "chrome.1.0i13i22i99j46i27i31l2j46i27i31i42j46i27i31", + searchbox_stats_1, {27, 31}}, {AutocompleteMatchType::SEARCH_SUGGEST_ENTITY, "chrome.2.0i13i22i99j46i27i31l2j46i27i31i42j46i27i31", + searchbox_stats_2, {27, 31, 27}}, // This match should not be bundled together with previous two, because // it comes with additional subtype information (42). {AutocompleteMatchType::SEARCH_SUGGEST_ENTITY, "chrome.3.0i13i22i99j46i27i31l2j46i27i31i42j46i27i31", + searchbox_stats_3, {27, 31, 42}}, // This match should not be bundled together with the group before, // because these items are not adjacent. {AutocompleteMatchType::SEARCH_SUGGEST_ENTITY, "chrome.4.0i13i22i99j46i27i31l2j46i27i31i42j46i27i31", + searchbox_stats_4, {27, 31}}, }; SCOPED_TRACE("Complex set of matches with repetitive subtypes"); RunAssistedQueryStatsTest(test_data, std::size(test_data)); } + // This test confirms that selection of trivial suggestions does not get + // reported in `assisted_query_info`. And that the count of zero-prefix + // matches coming from the suggest server or the local device are recorded. { + metrics::ChromeSearchboxStats searchbox_stats; + searchbox_stats.set_client_name("chrome"); + searchbox_stats.set_num_zero_prefix_suggestions_shown(3); + searchbox_stats.set_zero_prefix_enabled(true); + auto* available_suggestion = searchbox_stats.add_available_suggestions(); + available_suggestion->set_index(0); + available_suggestion->set_type(69); // NATIVE_CHROME + available_suggestion->add_subtypes(57); // SUBTYPE_OMNIBOX_ECHO_SEARCH + available_suggestion = searchbox_stats.add_available_suggestions(); + available_suggestion->set_index(1); + available_suggestion->set_type(69); // NATIVE_CHROME + available_suggestion->add_subtypes(58); // SUBTYPE_OMNIBOX_ECHO_URL + available_suggestion = searchbox_stats.add_available_suggestions(); + available_suggestion->set_index(2); + available_suggestion->set_type(5); // NAVIGATION + available_suggestion = searchbox_stats.add_available_suggestions(); + available_suggestion->set_index(3); + available_suggestion->set_type(5); // NAVIGATION + available_suggestion = searchbox_stats.add_available_suggestions(); + available_suggestion->set_index(4); + available_suggestion->set_type(0); // QUERY + available_suggestion->add_subtypes(362); // SUBTYPE_ZERO_PREFIX + available_suggestion = searchbox_stats.add_available_suggestions(); + available_suggestion->set_index(5); + available_suggestion->set_type(0); // QUERY + available_suggestion->add_subtypes(362); // SUBTYPE_ZERO_PREFIX + available_suggestion->add_subtypes( + 450); // SUBTYPE_ZERO_PREFIX_LOCAL_HISTORY + available_suggestion = searchbox_stats.add_available_suggestions(); + available_suggestion->set_index(6); + available_suggestion->set_type(0); // QUERY + available_suggestion->add_subtypes(362); // SUBTYPE_ZERO_PREFIX + available_suggestion->add_subtypes( + 451); // SUBTYPE_ZERO_PREFIX_LOCAL_FREQUENT_URL + available_suggestion = searchbox_stats.add_available_suggestions(); + available_suggestion->set_index(7); + available_suggestion->set_type(69); // NATIVE_CHROME + available_suggestion->add_subtypes(59); // SUBTYPE_OMNIBOX_HISTORY_SEARCH + + metrics::ChromeSearchboxStats searchbox_stats_0; + searchbox_stats_0.MergeFrom(searchbox_stats); + + metrics::ChromeSearchboxStats searchbox_stats_1; + searchbox_stats_1.MergeFrom(searchbox_stats); + + metrics::ChromeSearchboxStats searchbox_stats_2; + searchbox_stats_2.MergeFrom(searchbox_stats); + auto* assisted_query_info = searchbox_stats_2.mutable_assisted_query_info(); + assisted_query_info->MergeFrom(searchbox_stats.available_suggestions(2)); + + metrics::ChromeSearchboxStats searchbox_stats_3; + searchbox_stats_3.MergeFrom(searchbox_stats); + assisted_query_info = searchbox_stats_3.mutable_assisted_query_info(); + assisted_query_info->MergeFrom(searchbox_stats.available_suggestions(3)); + + metrics::ChromeSearchboxStats searchbox_stats_4; + searchbox_stats_4.MergeFrom(searchbox_stats); + assisted_query_info = searchbox_stats_4.mutable_assisted_query_info(); + assisted_query_info->MergeFrom(searchbox_stats.available_suggestions(4)); + + metrics::ChromeSearchboxStats searchbox_stats_5; + searchbox_stats_5.MergeFrom(searchbox_stats); + assisted_query_info = searchbox_stats_5.mutable_assisted_query_info(); + assisted_query_info->MergeFrom(searchbox_stats.available_suggestions(5)); + + metrics::ChromeSearchboxStats searchbox_stats_6; + searchbox_stats_6.MergeFrom(searchbox_stats); + assisted_query_info = searchbox_stats_6.mutable_assisted_query_info(); + assisted_query_info->MergeFrom(searchbox_stats.available_suggestions(6)); + + metrics::ChromeSearchboxStats searchbox_stats_7; + searchbox_stats_7.MergeFrom(searchbox_stats); + assisted_query_info = searchbox_stats_7.mutable_assisted_query_info(); + assisted_query_info->MergeFrom(searchbox_stats.available_suggestions(7)); + AssistedQueryStatsTestData test_data[] = { {AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, - "chrome..69i57j69i58j5l2j0l3j69i59"}, + "chrome..69i57j69i58j5l2j0i362j0i362i450j0i362i451j69i59", + searchbox_stats_0}, {AutocompleteMatchType::URL_WHAT_YOU_TYPED, - "chrome..69i57j69i58j5l2j0l3j69i59"}, + "chrome..69i57j69i58j5l2j0i362j0i362i450j0i362i451j69i59", + searchbox_stats_1}, {AutocompleteMatchType::NAVSUGGEST, - "chrome.2.69i57j69i58j5l2j0l3j69i59"}, + "chrome.2.69i57j69i58j5l2j0i362j0i362i450j0i362i451j69i59", + searchbox_stats_2}, {AutocompleteMatchType::NAVSUGGEST, - "chrome.3.69i57j69i58j5l2j0l3j69i59"}, + "chrome.3.69i57j69i58j5l2j0i362j0i362i450j0i362i451j69i59", + searchbox_stats_3}, {AutocompleteMatchType::SEARCH_SUGGEST, - "chrome.4.69i57j69i58j5l2j0l3j69i59"}, + "chrome.4.69i57j69i58j5l2j0i362j0i362i450j0i362i451j69i59", + searchbox_stats_4, + {362}}, {AutocompleteMatchType::SEARCH_SUGGEST, - "chrome.5.69i57j69i58j5l2j0l3j69i59"}, + "chrome.5.69i57j69i58j5l2j0i362j0i362i450j0i362i451j69i59", + searchbox_stats_5, + {362, 450}}, {AutocompleteMatchType::SEARCH_SUGGEST, - "chrome.6.69i57j69i58j5l2j0l3j69i59"}, + "chrome.6.69i57j69i58j5l2j0i362j0i362i450j0i362i451j69i59", + searchbox_stats_6, + {362, 451}}, {AutocompleteMatchType::SEARCH_HISTORY, - "chrome.7.69i57j69i58j5l2j0l3j69i59"}, + "chrome.7.69i57j69i58j5l2j0i362j0i362i450j0i362i451j69i59", + searchbox_stats_7}, }; - SCOPED_TRACE("Multiple matches"); + SCOPED_TRACE("Trivial and zero-prefix matches"); RunAssistedQueryStatsTest(test_data, std::size(test_data)); } } -TEST_F(AutocompleteProviderTest, GetDestinationURL) { +TEST_F(AutocompleteProviderTest, GetDestinationURL_AssistedQueryStatsOnly) { ResetControllerWithKeywordAndSearchProviders(); + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures({omnibox::kReportAssistedQueryStats}, + {omnibox::kReportSearchboxStats}); + // For the destination URL to have aqs parameters for query formulation time // and the field trial triggered bit, many conditions need to be satisfied. AutocompleteMatch match(nullptr, 1100, false, @@ -1019,7 +1218,8 @@ // The protocol needs to be https. RegisterTemplateURL(kTestTemplateURLKeyword, - "https://aqs/{searchTerms}/{google:assistedQueryStats}"); + "https://aqs/{searchTerms}/" + "{google:assistedQueryStats}{google:searchboxStats}"); url = GetDestinationURL(match, base::Milliseconds(2456)); EXPECT_TRUE(url.path().empty()); @@ -1034,9 +1234,10 @@ url = GetDestinationURL(match, base::Milliseconds(2456)); EXPECT_TRUE(url.path().empty()); - // assisted_query_stats needs to have been previously set. + // Both assisted_query_stats and searchbox_stats need to have been set. match.search_terms_args->assisted_query_stats = "chrome.0.69i57j69i58j5l2j0l3j69i59"; + match.search_terms_args->searchbox_stats.set_client_name("chrome"); url = GetDestinationURL(match, base::Milliseconds(2456)); EXPECT_EQ("//aqs=chrome.0.69i57j69i58j5l2j0l3j69i59.2456j0j0&", url.path()); @@ -1085,6 +1286,168 @@ url.path()); } +TEST_F(AutocompleteProviderTest, GetDestinationURL_SearchboxStatsOnly) { + ResetControllerWithKeywordAndSearchProviders(); + + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures({omnibox::kReportSearchboxStats}, + {omnibox::kReportAssistedQueryStats}); + + // For the destination URL to have aqs parameters for query formulation time + // and the field trial triggered bit, many conditions need to be satisfied. + AutocompleteMatch match(nullptr, 1100, false, + AutocompleteMatchType::SEARCH_SUGGEST); + GURL url(GetDestinationURL(match, base::Milliseconds(2456))); + EXPECT_TRUE(url.path().empty()); + + // The protocol needs to be https. + RegisterTemplateURL(kTestTemplateURLKeyword, + "https://foo/{searchTerms}/" + "{google:assistedQueryStats}{google:searchboxStats}"); + url = GetDestinationURL(match, base::Milliseconds(2456)); + EXPECT_TRUE(url.path().empty()); + + // There needs to be a keyword provider. + match.keyword = kTestTemplateURLKeyword; + url = GetDestinationURL(match, base::Milliseconds(2456)); + EXPECT_TRUE(url.path().empty()); + + // search_terms_args needs to be set. + match.search_terms_args = + std::make_unique<TemplateURLRef::SearchTermsArgs>(std::u16string()); + url = GetDestinationURL(match, base::Milliseconds(2456)); + EXPECT_TRUE(url.path().empty()); + + // Both assisted_query_stats and searchbox_stats need to have been set. + match.search_terms_args->assisted_query_stats = + "chrome.0.69i57j69i58j5l2j0l3j69i59"; + match.search_terms_args->searchbox_stats.set_client_name("chrome"); + url = GetDestinationURL(match, base::Milliseconds(2456)); + EXPECT_EQ("//gs_lcrp=EgZjaHJvbWXSAQgyNDU2ajBqMA==&", url.path()); + // Make sure searchbox_stats is serialized and encoded correctly. + { + std::string serialized_proto; + base::Base64Decode("EgZjaHJvbWXSAQgyNDU2ajBqMA==", &serialized_proto); + metrics::ChromeSearchboxStats expected; + expected.ParseFromString(serialized_proto); + EXPECT_EQ("chrome", expected.client_name()); + } + + // Test field trial triggered bit set. + set_search_provider_field_trial_triggered_in_session(true); + url = GetDestinationURL(match, base::Milliseconds(2456)); + EXPECT_EQ("//gs_lcrp=EgZjaHJvbWXSAQgyNDU2ajFqMA==&", url.path()); + // Make sure searchbox_stats is serialized and encoded correctly. + { + std::string serialized_proto; + base::Base64Decode("EgZjaHJvbWXSAQgyNDU2ajFqMA==", &serialized_proto); + metrics::ChromeSearchboxStats expected; + expected.ParseFromString(serialized_proto); + EXPECT_EQ("2456j1j0", expected.experiment_stats()); + } + + // Test page classification set. + set_search_provider_field_trial_triggered_in_session(false); + set_current_page_classification(metrics::OmniboxEventProto::OTHER); + url = GetDestinationURL(match, base::Milliseconds(2456)); + EXPECT_EQ("//gs_lcrp=EgZjaHJvbWXSAQgyNDU2ajBqNA==&", url.path()); + // Make sure searchbox_stats is serialized and encoded correctly. + { + std::string serialized_proto; + base::Base64Decode("EgZjaHJvbWXSAQgyNDU2ajBqNA==", &serialized_proto); + metrics::ChromeSearchboxStats expected; + expected.ParseFromString(serialized_proto); + EXPECT_EQ("2456j0j4", expected.experiment_stats()); + } + + // Test page classification and field trial triggered set. + set_search_provider_field_trial_triggered_in_session(true); + set_current_page_classification(metrics::OmniboxEventProto::OTHER); + url = GetDestinationURL(match, base::Milliseconds(2456)); + EXPECT_EQ("//gs_lcrp=EgZjaHJvbWXSAQgyNDU2ajFqNA==&", url.path()); + // Make sure searchbox_stats is serialized and encoded correctly. + { + std::string serialized_proto; + base::Base64Decode("EgZjaHJvbWXSAQgyNDU2ajFqNA==", &serialized_proto); + metrics::ChromeSearchboxStats expected; + expected.ParseFromString(serialized_proto); + EXPECT_EQ("2456j1j4", expected.experiment_stats()); + } + + // Test experiment stats v2 set. + add_zero_suggest_provider_experiment_stat( + base::test::ParseJson(R"json({"2":"0:67","4":10001})json")); + url = GetDestinationURL(match, base::Milliseconds(2456)); + EXPECT_EQ("//gs_lcrp=EgZjaHJvbWXSAQgyNDU2ajFqNOIDCRIEMCw2NyCRTg==&", + url.path()); + // Make sure searchbox_stats is serialized and encoded correctly. + { + std::string serialized_proto; + base::Base64Decode("EgZjaHJvbWXSAQgyNDU2ajFqNOIDCRIEMCw2NyCRTg==", + &serialized_proto); + metrics::ChromeSearchboxStats expected; + expected.ParseFromString(serialized_proto); + EXPECT_EQ(1, expected.experiment_stats_v2_size()); + EXPECT_EQ(10001, expected.experiment_stats_v2(0).type_int()); + EXPECT_EQ("0,67", expected.experiment_stats_v2(0).string_value()); + } +} + +TEST_F(AutocompleteProviderTest, + GetDestinationURL_AssistedQueryStatsAndSearchboxStats) { + ResetControllerWithKeywordAndSearchProviders(); + + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures( + {omnibox::kReportSearchboxStats, omnibox::kReportAssistedQueryStats}, {}); + + // For the destination URL to have aqs parameters for query formulation time + // and the field trial triggered bit, many conditions need to be satisfied. + AutocompleteMatch match(nullptr, 1100, false, + AutocompleteMatchType::SEARCH_SUGGEST); + GURL url(GetDestinationURL(match, base::Milliseconds(2456))); + EXPECT_TRUE(url.path().empty()); + + // The protocol needs to be https. + RegisterTemplateURL(kTestTemplateURLKeyword, + "https://foo/{searchTerms}/" + "{google:assistedQueryStats}{google:searchboxStats}"); + url = GetDestinationURL(match, base::Milliseconds(2456)); + EXPECT_TRUE(url.path().empty()); + + // There needs to be a keyword provider. + match.keyword = kTestTemplateURLKeyword; + url = GetDestinationURL(match, base::Milliseconds(2456)); + EXPECT_TRUE(url.path().empty()); + + // search_terms_args needs to be set. + match.search_terms_args = + std::make_unique<TemplateURLRef::SearchTermsArgs>(std::u16string()); + url = GetDestinationURL(match, base::Milliseconds(2456)); + EXPECT_TRUE(url.path().empty()); + + // If assisted_query_stats is not set, searchbox_stats is not reported either. + match.search_terms_args->searchbox_stats.set_client_name("chrome"); + url = GetDestinationURL(match, base::Milliseconds(2456)); + EXPECT_TRUE(url.path().empty()); + + // If searchbox_stats is not set, assisted_query_stats is not reported either. + match.search_terms_args->assisted_query_stats = + "chrome.0.69i57j69i58j5l2j0l3j69i59"; + match.search_terms_args->searchbox_stats.clear_client_name(); + url = GetDestinationURL(match, base::Milliseconds(2456)); + EXPECT_TRUE(url.path().empty()); + + // Both assisted_query_stats and searchbox_stats need to have been set. + match.search_terms_args->searchbox_stats.set_client_name("chrome"); + url = GetDestinationURL(match, base::Milliseconds(2456)); + EXPECT_EQ( + "//" + "aqs=chrome.0.69i57j69i58j5l2j0l3j69i59.2456j0j0&gs_lcrp=" + "EgZjaHJvbWXSAQgyNDU2ajBqMA==&", + url.path()); +} + TEST_F(AutocompleteProviderTest, ClassifyAllMatchesInString) { ResetControllerWithKeywordAndSearchProviders();
diff --git a/components/password_manager/core/browser/sync/password_proto_utils.cc b/components/password_manager/core/browser/sync/password_proto_utils.cc index fbcf7a5f..a9083f3 100644 --- a/components/password_manager/core/browser/sync/password_proto_utils.cc +++ b/components/password_manager/core/browser/sync/password_proto_utils.cc
@@ -102,12 +102,44 @@ return form_issues; } +sync_pb::PasswordSpecificsData TrimPasswordSpecificsDataForCaching( + const sync_pb::PasswordSpecificsData& password_specifics_data) { + sync_pb::PasswordSpecificsData trimmed_password_data = + sync_pb::PasswordSpecificsData(password_specifics_data); + trimmed_password_data.clear_scheme(); + trimmed_password_data.clear_signon_realm(); + trimmed_password_data.clear_origin(); + trimmed_password_data.clear_action(); + trimmed_password_data.clear_username_element(); + trimmed_password_data.clear_username_value(); + trimmed_password_data.clear_password_element(); + trimmed_password_data.clear_password_value(); + trimmed_password_data.clear_date_created(); + trimmed_password_data.clear_blacklisted(); + trimmed_password_data.clear_type(); + trimmed_password_data.clear_times_used(); + trimmed_password_data.clear_display_name(); + trimmed_password_data.clear_avatar_url(); + trimmed_password_data.clear_federation_url(); + trimmed_password_data.clear_date_last_used(); + trimmed_password_data.clear_password_issues(); + trimmed_password_data.clear_date_password_modified_windows_epoch_micros(); + return trimmed_password_data; +} + sync_pb::PasswordSpecifics SpecificsFromPassword( const PasswordForm& password_form) { sync_pb::PasswordSpecifics specifics; *specifics.mutable_client_only_encrypted_data() = SpecificsDataFromPassword(password_form); + // WARNING: if you are adding support for new `PasswordSpecificsData` fields, + // you need to update following functions accordingly: + // `TrimPasswordSpecificsDataForCaching` + // `TrimRemoteSpecificsForCachingPreservesOnlyUnknownFields` + DCHECK_EQ(0u, TrimPasswordSpecificsDataForCaching( + specifics.client_only_encrypted_data()) + .ByteSizeLong()); return specifics; }
diff --git a/components/password_manager/core/browser/sync/password_proto_utils.h b/components/password_manager/core/browser/sync/password_proto_utils.h index 9d69c14..ef32d0f 100644 --- a/components/password_manager/core/browser/sync/password_proto_utils.h +++ b/components/password_manager/core/browser/sync/password_proto_utils.h
@@ -57,6 +57,11 @@ std::vector<PasswordForm> PasswordVectorFromListResult( const sync_pb::ListPasswordsResult& list_result); +// Returns a copy of |password_specifics_data| with cleared supported fields +// that don't need to be preserved in EntityMetadata cache. +sync_pb::PasswordSpecificsData TrimPasswordSpecificsDataForCaching( + const sync_pb::PasswordSpecificsData& password_specifics_data); + } // namespace password_manager #endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_PROTO_UTILS_H_
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge.cc b/components/password_manager/core/browser/sync/password_sync_bridge.cc index 4d958ea..6a83eee8 100644 --- a/components/password_manager/core/browser/sync/password_sync_bridge.cc +++ b/components/password_manager/core/browser/sync/password_sync_bridge.cc
@@ -843,6 +843,17 @@ sync_enabled_or_disabled_cb_.Run(); } +sync_pb::EntitySpecifics PasswordSyncBridge::TrimRemoteSpecificsForCaching( + const sync_pb::EntitySpecifics& entity_specifics) { + DCHECK(entity_specifics.has_password()); + sync_pb::EntitySpecifics trimmed_entity_specifics; + *trimmed_entity_specifics.mutable_password() + ->mutable_client_only_encrypted_data() = + TrimPasswordSpecificsDataForCaching( + entity_specifics.password().client_only_encrypted_data()); + return trimmed_entity_specifics; +} + std::set<FormPrimaryKey> PasswordSyncBridge::GetUnsyncedPasswordsStorageKeys() { std::set<FormPrimaryKey> storage_keys; DCHECK(password_store_sync_);
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge.h b/components/password_manager/core/browser/sync/password_sync_bridge.h index b549e95..6608cba1 100644 --- a/components/password_manager/core/browser/sync/password_sync_bridge.h +++ b/components/password_manager/core/browser/sync/password_sync_bridge.h
@@ -63,6 +63,8 @@ bool SupportsGetStorageKey() const override; void ApplyStopSyncChanges(std::unique_ptr<syncer::MetadataChangeList> delete_metadata_change_list) override; + sync_pb::EntitySpecifics TrimRemoteSpecificsForCaching( + const sync_pb::EntitySpecifics& entity_specifics) override; static std::string ComputeClientTagForTesting( const sync_pb::PasswordSpecificsData& password_data);
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc index 57c45d4..9e4fcba 100644 --- a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc +++ b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc
@@ -1466,4 +1466,45 @@ EXPECT_FALSE(error); } +TEST_F(PasswordSyncBridgeTest, + TrimRemoteSpecificsForCachingPreservesOnlyUnknownFields) { + sync_pb::EntitySpecifics specifics_with_only_unknown_fields; + *specifics_with_only_unknown_fields.mutable_password() + ->mutable_client_only_encrypted_data() + ->mutable_unknown_fields() = "unknown_fields"; + + sync_pb::EntitySpecifics specifics; + sync_pb::PasswordSpecificsData* password_data = + specifics.mutable_password()->mutable_client_only_encrypted_data(); + password_data->set_scheme(2); + password_data->set_signon_realm(kSignonRealm1); + password_data->set_origin("http://www.origin.com/"); + password_data->set_action("action"); + password_data->set_username_element("username_element"); + password_data->set_username_value("username_value"); + password_data->set_password_element("password_element"); + password_data->set_password_value("password_value"); + password_data->set_date_created(1000); + password_data->set_blacklisted(false); + password_data->set_type(0); + password_data->set_times_used(1); + password_data->set_display_name("display_name"); + password_data->set_avatar_url("avatar_url"); + password_data->set_federation_url("federation_url"); + password_data->set_date_last_used(1000); + *password_data->mutable_password_issues() = + CreateSpecificsIssues({InsecureType::kLeaked}); + password_data->set_date_password_modified_windows_epoch_micros(1000); + + *specifics.mutable_password() + ->mutable_client_only_encrypted_data() + ->mutable_unknown_fields() = "unknown_fields"; + + sync_pb::EntitySpecifics trimmed_specifics = + bridge()->TrimRemoteSpecificsForCaching(specifics); + + EXPECT_EQ(trimmed_specifics.SerializeAsString(), + specifics_with_only_unknown_fields.SerializeAsString()); +} + } // namespace password_manager
diff --git a/components/permissions/android/java/src/org/chromium/components/permissions/AndroidPermissionRequester.java b/components/permissions/android/java/src/org/chromium/components/permissions/AndroidPermissionRequester.java index d3b94bd..cf8e454c 100644 --- a/components/permissions/android/java/src/org/chromium/components/permissions/AndroidPermissionRequester.java +++ b/components/permissions/android/java/src/org/chromium/components/permissions/AndroidPermissionRequester.java
@@ -4,21 +4,20 @@ package org.chromium.components.permissions; -import android.app.Activity; +import android.content.Context; import android.content.pm.PackageManager; import android.util.SparseArray; +import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; -import androidx.annotation.StringRes; - +import org.chromium.base.BuildInfo; import org.chromium.base.CollectionUtil; import org.chromium.base.annotations.CalledByNative; import org.chromium.components.content_settings.ContentSettingsType; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modaldialog.DialogDismissalCause; import org.chromium.ui.modaldialog.ModalDialogManager; -import org.chromium.ui.modaldialog.ModalDialogManagerHolder; import org.chromium.ui.modaldialog.ModalDialogProperties; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.permissions.AndroidPermissionDelegate; @@ -151,9 +150,9 @@ } } - Activity activity = windowAndroid.getActivity().get(); + Context context = windowAndroid.getContext().get(); - if (allRequestable && !deniedContentSettings.isEmpty() && activity != null) { + if (allRequestable && !deniedContentSettings.isEmpty() && context != null) { int deniedStringId = -1; if (deniedContentSettings.size() == 2 && deniedContentSettings.contains(ContentSettingsType.MEDIASTREAM_MIC) @@ -179,7 +178,9 @@ != -1 : "Invalid combination of missing content settings: " + deniedContentSettings; - showMissingPermissionDialog(activity, deniedStringId, + String appName = BuildInfo.getInstance().hostPackageLabel; + showMissingPermissionDialog(windowAndroid, + context.getString(deniedStringId, appName), () -> requestAndroidPermissions( windowAndroid, contentSettingsTypes, delegate), @@ -200,18 +201,14 @@ /** * Shows a dialog that informs the user about a missing Android permission. - * @param activity Current Activity. It should implement {@link ModalDialogManagerHolder}. + * @param windowAndroid Current WindowAndroid. * @param messageId The message that is shown on the dialog. * @param onPositiveButtonClicked Runnable that is executed on positive button click. * @param onCancelled Runnable that is executed on cancellation. */ - public static void showMissingPermissionDialog(Activity activity, @StringRes int messageId, + public static void showMissingPermissionDialog(WindowAndroid windowAndroid, String message, Runnable onPositiveButtonClicked, Runnable onCancelled) { - assert activity - instanceof ModalDialogManagerHolder - : "Activity should implement ModalDialogManagerHolder"; - final ModalDialogManager modalDialogManager = - ((ModalDialogManagerHolder) activity).getModalDialogManager(); + final ModalDialogManager modalDialogManager = windowAndroid.getModalDialogManager(); assert modalDialogManager != null : "ModalDialogManager is null"; ModalDialogProperties.Controller controller = new ModalDialogProperties.Controller() { @@ -231,15 +228,16 @@ } } }; - View view = activity.getLayoutInflater().inflate(R.layout.update_permissions_dialog, null); + Context context = windowAndroid.getContext().get(); + View view = LayoutInflater.from(context).inflate(R.layout.update_permissions_dialog, null); TextView dialogText = view.findViewById(R.id.text); - dialogText.setText(messageId); + dialogText.setText(message); PropertyModel dialogModel = new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS) .with(ModalDialogProperties.CUSTOM_VIEW, view) .with(ModalDialogProperties.CANCEL_ON_TOUCH_OUTSIDE, true) .with(ModalDialogProperties.POSITIVE_BUTTON_TEXT, - activity.getString(R.string.infobar_update_permissions_button_text)) + context.getString(R.string.infobar_update_permissions_button_text)) .with(ModalDialogProperties.CONTROLLER, controller) .build(); modalDialogManager.showDialog(dialogModel, ModalDialogManager.ModalDialogType.APP);
diff --git a/components/permissions/android/permissions_android_strings.grd b/components/permissions/android/permissions_android_strings.grd index da89ab5e..9427901 100644 --- a/components/permissions/android/permissions_android_strings.grd +++ b/components/permissions/android/permissions_android_strings.grd
@@ -173,19 +173,19 @@ <release seq="1"> <messages fallback_to_english="true"> <message name="IDS_INFOBAR_MISSING_AR_CAMERA_PERMISSION_TEXT" desc="Text shown in an infobar when a website has requested access to augmented reality capabilities, but Chrome is missing the Android camera permission."> - Chrome needs permission to access your camera to create a 3D map of your surroundings. + <ph name="APP_NAME">%1$s<ex>Chrome</ex></ph> needs permission to access your camera to create a 3D map of your surroundings. </message> <message name="IDS_INFOBAR_MISSING_CAMERA_PERMISSION_TEXT" desc="Text shown in an infobar when a website has requested access to the camera capabilities, but Chrome is missing the Android camera permission."> - Chrome needs permission to access your camera for this site. + <ph name="APP_NAME">%1$s<ex>Chrome</ex></ph> needs permission to access your camera for this site. </message> <message name="IDS_INFOBAR_MISSING_MICROPHONE_PERMISSION_TEXT" desc="Text shown in an infobar when a website has requested access to the microphone capabilities, but Chrome is missing the Android microphone permission."> - Chrome needs permission to access your microphone for this site. + <ph name="APP_NAME">%1$s<ex>Chrome</ex></ph> needs permission to access your microphone for this site. </message> <message name="IDS_INFOBAR_MISSING_MICROPHONE_CAMERA_PERMISSIONS_TEXT" desc="Text shown in an infobar when a website has requested access to the microphone and camera capabilities, but Chrome is missing the Android microphone and camera permissions."> - Chrome needs permission to access your camera and microphone for this site. + <ph name="APP_NAME">%1$s<ex>Chrome</ex></ph> needs permission to access your camera and microphone for this site. </message> <message name="IDS_INFOBAR_MISSING_LOCATION_PERMISSION_TEXT" desc="Text shown in an infobar when a website has requested access to the location capabilities, but Chrome is missing the Android location permission."> - Chrome needs access to your location to share your location with this site. + <ph name="APP_NAME">%1$s<ex>Chrome</ex></ph> needs access to your location to share your location with this site. </message> <message name="IDS_INFOBAR_UPDATE_PERMISSIONS_BUTTON_TEXT" desc="Button text shown when Chrome does not have the necessary permission required to complete the requested tasks (e.g. a website has request location information, but Chrome is missing that Android permission)."> Continue
diff --git a/components/permissions/android/permissions_android_strings_grd/IDS_INFOBAR_MISSING_AR_CAMERA_PERMISSION_TEXT.png.sha1 b/components/permissions/android/permissions_android_strings_grd/IDS_INFOBAR_MISSING_AR_CAMERA_PERMISSION_TEXT.png.sha1 index 49b0f931..1ba73dd 100644 --- a/components/permissions/android/permissions_android_strings_grd/IDS_INFOBAR_MISSING_AR_CAMERA_PERMISSION_TEXT.png.sha1 +++ b/components/permissions/android/permissions_android_strings_grd/IDS_INFOBAR_MISSING_AR_CAMERA_PERMISSION_TEXT.png.sha1
@@ -1 +1 @@ -6f4c7e9032d02c56a5d3c82311c4246b0df059e2 \ No newline at end of file +9b9663e5d966b6e548b1298da933da8d06822df6 \ No newline at end of file
diff --git a/components/permissions/android/permissions_android_strings_grd/IDS_INFOBAR_MISSING_CAMERA_PERMISSION_TEXT.png.sha1 b/components/permissions/android/permissions_android_strings_grd/IDS_INFOBAR_MISSING_CAMERA_PERMISSION_TEXT.png.sha1 new file mode 100644 index 0000000..2921f1c --- /dev/null +++ b/components/permissions/android/permissions_android_strings_grd/IDS_INFOBAR_MISSING_CAMERA_PERMISSION_TEXT.png.sha1
@@ -0,0 +1 @@ +23ef462a1e6cf840f1f538cb0506664cf516ab52 \ No newline at end of file
diff --git a/components/permissions/android/permissions_android_strings_grd/IDS_INFOBAR_MISSING_LOCATION_PERMISSION_TEXT.png.sha1 b/components/permissions/android/permissions_android_strings_grd/IDS_INFOBAR_MISSING_LOCATION_PERMISSION_TEXT.png.sha1 new file mode 100644 index 0000000..20ad092 --- /dev/null +++ b/components/permissions/android/permissions_android_strings_grd/IDS_INFOBAR_MISSING_LOCATION_PERMISSION_TEXT.png.sha1
@@ -0,0 +1 @@ +30ac3d44e4a179ef9d4812e8cd4c49b8392edcae \ No newline at end of file
diff --git a/components/permissions/android/permissions_android_strings_grd/IDS_INFOBAR_MISSING_MICROPHONE_CAMERA_PERMISSIONS_TEXT.png.sha1 b/components/permissions/android/permissions_android_strings_grd/IDS_INFOBAR_MISSING_MICROPHONE_CAMERA_PERMISSIONS_TEXT.png.sha1 new file mode 100644 index 0000000..1ae80d8 --- /dev/null +++ b/components/permissions/android/permissions_android_strings_grd/IDS_INFOBAR_MISSING_MICROPHONE_CAMERA_PERMISSIONS_TEXT.png.sha1
@@ -0,0 +1 @@ +a74d386c6d73864430aa866c5ac14765e7f540bc \ No newline at end of file
diff --git a/components/permissions/android/permissions_android_strings_grd/IDS_INFOBAR_MISSING_MICROPHONE_PERMISSION_TEXT.png.sha1 b/components/permissions/android/permissions_android_strings_grd/IDS_INFOBAR_MISSING_MICROPHONE_PERMISSION_TEXT.png.sha1 new file mode 100644 index 0000000..3dc9483 --- /dev/null +++ b/components/permissions/android/permissions_android_strings_grd/IDS_INFOBAR_MISSING_MICROPHONE_PERMISSION_TEXT.png.sha1
@@ -0,0 +1 @@ +c692031e5313020172ba9abc973909e56039ffb6 \ No newline at end of file
diff --git a/components/permissions/permission_request_manager.cc b/components/permissions/permission_request_manager.cc index ec5a9668..bb6413f2 100644 --- a/components/permissions/permission_request_manager.cc +++ b/components/permissions/permission_request_manager.cc
@@ -719,7 +719,8 @@ switch (*quiet_ui_reason) { case QuietUiReason::kEnabledInPrefs: case QuietUiReason::kTriggeredByCrowdDeny: - case QuietUiReason::kPredictedVeryUnlikelyGrant: + case QuietUiReason::kServicePredictedVeryUnlikelyGrant: + case QuietUiReason::kOnDevicePredictedVeryUnlikelyGrant: break; case QuietUiReason::kTriggeredDueToAbusiveRequests: LogWarningToConsole(kAbusiveNotificationRequestsEnforcementMessage); @@ -791,8 +792,9 @@ requests_, web_contents(), permission_action, time_to_decision, DetermineCurrentRequestUIDisposition(), DetermineCurrentRequestUIDispositionReasonForUMA(), - prediction_grant_likelihood_, did_show_bubble_, did_click_manage_, - did_click_learn_more_); + prediction_grant_likelihood_, + current_request_ui_to_use_->decision_held_back, did_show_bubble_, + did_click_manage_, did_click_learn_more_); content::BrowserContext* browser_context = web_contents()->GetBrowserContext(); @@ -965,7 +967,8 @@ if (quiet_ui_reason.has_value()) { switch (quiet_ui_reason.value()) { case QuietUiReason::kEnabledInPrefs: - case QuietUiReason::kPredictedVeryUnlikelyGrant: + case QuietUiReason::kServicePredictedVeryUnlikelyGrant: + case QuietUiReason::kOnDevicePredictedVeryUnlikelyGrant: case QuietUiReason::kTriggeredByCrowdDeny: return false; case QuietUiReason::kTriggeredDueToAbusiveRequests: @@ -1058,8 +1061,10 @@ case QuietUiReason::kTriggeredDueToAbusiveRequests: case QuietUiReason::kTriggeredDueToAbusiveContent: return PermissionPromptDispositionReason::SAFE_BROWSING_VERDICT; - case QuietUiReason::kPredictedVeryUnlikelyGrant: + case QuietUiReason::kServicePredictedVeryUnlikelyGrant: return PermissionPromptDispositionReason::PREDICTION_SERVICE; + case QuietUiReason::kOnDevicePredictedVeryUnlikelyGrant: + return PermissionPromptDispositionReason::ON_DEVICE_PREDICTION_MODEL; } }
diff --git a/components/permissions/permission_ui_selector.cc b/components/permissions/permission_ui_selector.cc index b264e9fd..436a419 100644 --- a/components/permissions/permission_ui_selector.cc +++ b/components/permissions/permission_ui_selector.cc
@@ -15,7 +15,8 @@ switch (*reason) { case QuietUiReason::kEnabledInPrefs: - case QuietUiReason::kPredictedVeryUnlikelyGrant: + case QuietUiReason::kServicePredictedVeryUnlikelyGrant: + case QuietUiReason::kOnDevicePredictedVeryUnlikelyGrant: return false; case QuietUiReason::kTriggeredByCrowdDeny: case QuietUiReason::kTriggeredDueToAbusiveRequests: @@ -26,8 +27,11 @@ PermissionUiSelector::Decision::Decision( absl::optional<QuietUiReason> quiet_ui_reason, - absl::optional<WarningReason> warning_reason) - : quiet_ui_reason(quiet_ui_reason), warning_reason(warning_reason) {} + absl::optional<WarningReason> warning_reason, + absl::optional<bool> decision_held_back) + : quiet_ui_reason(quiet_ui_reason), + warning_reason(warning_reason), + decision_held_back(decision_held_back) {} PermissionUiSelector::Decision::~Decision() = default; PermissionUiSelector::Decision::Decision(const Decision&) = default;
diff --git a/components/permissions/permission_ui_selector.h b/components/permissions/permission_ui_selector.h index 0220513..2cf3567 100644 --- a/components/permissions/permission_ui_selector.h +++ b/components/permissions/permission_ui_selector.h
@@ -25,7 +25,8 @@ kTriggeredByCrowdDeny, kTriggeredDueToAbusiveRequests, kTriggeredDueToAbusiveContent, - kPredictedVeryUnlikelyGrant, + kServicePredictedVeryUnlikelyGrant, + kOnDevicePredictedVeryUnlikelyGrant, }; enum class WarningReason { @@ -35,7 +36,8 @@ struct Decision { Decision(absl::optional<QuietUiReason> quiet_ui_reason, - absl::optional<WarningReason> warning_reason); + absl::optional<WarningReason> warning_reason, + absl::optional<bool> decision_held_back = absl::nullopt); ~Decision(); Decision(const Decision&); @@ -58,6 +60,9 @@ // The reason for printing a warning to the console, or `absl::nullopt` if // no warning should be printed. absl::optional<WarningReason> warning_reason; + + // Whether the decision to show the quiet ui was held back. + absl::optional<bool> decision_held_back; }; using DecisionMadeCallback = base::OnceCallback<void(const Decision&)>;
diff --git a/components/permissions/permission_uma_util.cc b/components/permissions/permission_uma_util.cc index 32992dcf..fe0ac99 100644 --- a/components/permissions/permission_uma_util.cc +++ b/components/permissions/permission_uma_util.cc
@@ -218,6 +218,7 @@ PredictionRequestFeatures::ActionCounts loud_ui_actions_counts, PredictionRequestFeatures::ActionCounts actions_counts_for_request_type, PredictionRequestFeatures::ActionCounts actions_counts, + absl::optional<bool> prediction_decision_held_back, absl::optional<ukm::SourceId> source_id) { // Only record the permission change if the origin is in the history. if (!source_id.has_value()) @@ -303,6 +304,11 @@ static_cast<int64_t>(predicted_grant_likelihood.value())); } + if (prediction_decision_held_back.has_value()) { + builder.SetPredictionsApiResponse_Heldback( + prediction_decision_held_back.value()); + } + if (has_three_consecutive_denies.has_value()) { int64_t satisfied_adaptive_triggers = 0; if (has_three_consecutive_denies.value()) @@ -482,7 +488,8 @@ PermissionPromptDisposition::NOT_APPLICABLE, /*ui_reason=*/absl::nullopt, revoked_origin, /*web_contents=*/nullptr, browser_context, - /*predicted_grant_likelihood=*/absl::nullopt); + /*predicted_grant_likelihood=*/absl::nullopt, + /*prediction_decision_held_back=*/absl::nullopt); } void PermissionUmaUtil::RecordEmbargoPromptSuppression( @@ -550,6 +557,7 @@ PermissionPromptDisposition ui_disposition, absl::optional<PermissionPromptDispositionReason> ui_reason, absl::optional<PredictionGrantLikelihood> predicted_grant_likelihood, + absl::optional<bool> prediction_decision_held_back, bool did_show_prompt, bool did_click_managed, bool did_click_learn_more) { @@ -592,7 +600,7 @@ permission, permission_action, PermissionSourceUI::PROMPT, gesture_type, time_to_decision, ui_disposition, ui_reason, requesting_origin, web_contents, web_contents->GetBrowserContext(), - predicted_grant_likelihood); + predicted_grant_likelihood, prediction_decision_held_back); std::string priorDismissPrefix = "Permissions.Prompt." + action_string + ".PriorDismissCount2."; @@ -822,7 +830,8 @@ const GURL& requesting_origin, const content::WebContents* web_contents, content::BrowserContext* browser_context, - absl::optional<PredictionGrantLikelihood> predicted_grant_likelihood) { + absl::optional<PredictionGrantLikelihood> predicted_grant_likelihood, + absl::optional<bool> prediction_decision_held_back) { DCHECK(PermissionUtil::IsPermission(permission)); PermissionDecisionAutoBlocker* autoblocker = PermissionsClient::Get()->GetPermissionDecisionAutoBlocker( @@ -882,7 +891,7 @@ browser_context, requesting_origin, permission), predicted_grant_likelihood, loud_ui_actions_counts_per_request_type, loud_ui_actions_counts, actions_counts_per_request_type, - actions_counts)); + actions_counts, prediction_decision_held_back)); switch (permission) { case ContentSettingsType::GEOLOCATION:
diff --git a/components/permissions/permission_uma_util.h b/components/permissions/permission_uma_util.h index 4da8d5d..6db373a 100644 --- a/components/permissions/permission_uma_util.h +++ b/components/permissions/permission_uma_util.h
@@ -191,6 +191,10 @@ // Disposition was used as a fallback, if no selector made a decision. DEFAULT_FALLBACK = 3, + + // Disposition was chosen based on grant likelihood predicted by the On-Device + // Permission Prediction Model. + ON_DEVICE_PREDICTION_MODEL = 4, }; enum class AdaptiveTriggers { @@ -314,6 +318,7 @@ PermissionPromptDisposition ui_disposition, absl::optional<PermissionPromptDispositionReason> ui_reason, absl::optional<PredictionGrantLikelihood> predicted_grant_likelihood, + absl::optional<bool> prediction_decision_held_back, bool did_show_prompt, bool did_click_manage, bool did_click_learn_more); @@ -419,7 +424,8 @@ const GURL& requesting_origin, const content::WebContents* web_contents, content::BrowserContext* browser_context, - absl::optional<PredictionGrantLikelihood> predicted_grant_likelihood); + absl::optional<PredictionGrantLikelihood> predicted_grant_likelihood, + absl::optional<bool> prediction_decision_held_back); // Records |count| total prior actions for a prompt of type |permission| // for a single origin using |prefix| for the metric.
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index 781a1310..327e485b 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -11736,7 +11736,7 @@ 'items': { 'type': 'string' }, 'sensitiveValue': True, }, - 'supported_on': ['chrome_os:12-'], + 'supported_on': ['chrome_os:12-100'], 'device_only': True, 'features': { 'dynamic_refresh': True, @@ -17106,7 +17106,7 @@ }, }, }, - 'supported_on': ['chrome_os:51-'], + 'supported_on': ['chrome_os:51-100'], 'device_only': True, 'features': { 'dynamic_refresh': False, @@ -18327,7 +18327,7 @@ 'hash': { 'type': 'string' } }, }, - 'supported_on': ['chrome_os:73-'], + 'supported_on': ['chrome_os:73-100'], 'features': { 'dynamic_refresh': True, 'per_profile': False, @@ -18357,7 +18357,7 @@ 'owners': ['srad@google.com', 'pawliczek@chromium.org'], 'id': 387, 'device_only': True, - 'supported_on': ['chrome_os:73-'], + 'supported_on': ['chrome_os:73-100'], 'type': 'int-enum', 'schema': { 'type': 'integer', @@ -18403,7 +18403,7 @@ { 'name': 'DeviceNativePrintersBlacklist', 'owners': ['srad@google.com', 'pawliczek@chromium.org'], - 'supported_on': ['chrome_os:73-'], + 'supported_on': ['chrome_os:73-100'], 'device_only': True, 'id': 388, 'type': 'list', @@ -18425,7 +18425,7 @@ { 'name': 'DeviceNativePrintersWhitelist', 'owners': ['srad@google.com', 'pawliczek@chromium.org'], - 'supported_on': ['chrome_os:73-'], + 'supported_on': ['chrome_os:73-100'], 'device_only': True, 'id': 389, 'type': 'list',
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 53aae4a3..d26342e 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -1062,6 +1062,7 @@ <ph name="DEFAULT_SEARCH_PROVIDER_ICON_URL_POLICY_NAME" />을 설정하지 않으면 검색 공급자의 아이콘이 없습니다.</translation> <translation id="2145735238144543545">필수 클라이언트 인증서</translation> <translation id="2146103669166779785">16진수 색상은 테마를 만들어 브라우저에 적용하는 데 사용됩니다.</translation> +<translation id="2148769554831004951">WebSQL을 강제로 사용 설정합니다.</translation> <translation id="214901426630414675">양면 인쇄 모드 제한</translation> <translation id="2149330464730004005">컬러 인쇄 제한</translation> <translation id="2149592087996467903">WebRTC에서 지원 중단된 버전의 TLS/DTLS를 사용하지 못하도록 차단</translation> @@ -4673,6 +4674,7 @@ 정책 값은 밀리초로 지정되어야 합니다. 유휴 지연 시간보다 작거나 같게 값이 잘립니다. 유휴 작업이 로그아웃 또는 종료인 경우에만 경고 메시지가 표시됩니다.</translation> +<translation id="6331172765821724350">WebSQL이 Chrome 플래그에 의해 사용 중지되도록 허용합니다.</translation> <translation id="6331943515692769234">이전 User-Agent GREASE 알고리즘이 사용되도록 강제 적용합니다.</translation> <translation id="6332546092866098577">다음 사이트에서 File System API를 통한 읽기 액세스 차단</translation> <translation id="6334330017384340264">이 정책은 앱별 사용 제한으로 인해 차단되지 않는 허용 목록에 포함되어야 하는 애플리케이션과 URL을 지정합니다. @@ -6927,6 +6929,9 @@ <translation id="8757552286070680084">Wilco DTC 설정입니다.</translation> <translation id="8758831693895931466">필수 클라우드 관리 등록 사용</translation> <translation id="8759829385824155666">허용된 Kerberos 암호화 유형</translation> +<translation id="8763716376920670835">M101에서 WebSQL이 기본으로 사용 설정되어 있으나 Chrome 플래그에 의해 사용 중지될 수 있습니다. + 이 정책을 False로 설정하거나 설정하지 않으면 WebSQL이 사용 중지될 수 있습니다. + 정책을 True로 설정하면 WebSQL이 사용 중지되지 않습니다.</translation> <translation id="8767743923206070405">정책을 사용으로 설정하면 <ph name="PRODUCT_NAME" /> 툴바에 홈 버튼이 표시됩니다. 사용 안함으로 설정하면 홈 버튼이 표시되지 않습니다. 정책을 설정하면 <ph name="PRODUCT_NAME" />에서 사용자가 변경할 수 없습니다. 설정하지 않으면 사용자가 홈 버튼 표시 여부를 선택할 수 있습니다.</translation>
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index 12af24a..970f8afd 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -1064,6 +1064,7 @@ Nếu bạn không đặt <ph name="DEFAULT_SEARCH_PROVIDER_ICON_URL_POLICY_NAME" />, thì sẽ không có biểu tượng cho nhà cung cấp dịch vụ tìm kiếm.</translation> <translation id="2145735238144543545">Chứng chỉ ứng dụng bắt buộc</translation> <translation id="2146103669166779785">Màu theo hệ thập lục phân sẽ được dùng để tạo và áp dụng một giao diện cho trình duyệt.</translation> +<translation id="2148769554831004951">Buộc WebSQL bật.</translation> <translation id="214901426630414675">Hạn chế chế độ in hai mặt</translation> <translation id="2149330464730004005">Bật chế độ in màu</translation> <translation id="2149592087996467903">Ngăn WebRTC sử dụng các phiên bản cũ của TLS/DTLS</translation> @@ -4666,6 +4667,7 @@ Bạn phải chỉ định giá trị của chính sách bằng mili giây. Các giá trị được giới hạn ở mức nhỏ hơn hoặc bằng thời gian chờ khi ở chế độ tạm vắng. Thông báo cảnh báo chỉ hiển thị nếu hành động ở chế độ tạm vắng là hành động đăng xuất hoặc tắt nguồn.</translation> +<translation id="6331172765821724350">Cho phép cờ Chrome tắt WebSQL.</translation> <translation id="6331943515692769234">Buộc sử dụng thuật toán User-Agent GREASE cũ.</translation> <translation id="6332546092866098577">Chặn quyền đọc qua API Hệ thống tệp trên các trang web này</translation> <translation id="6334330017384340264">Chính sách này chỉ định những ứng dụng và URL được phép theo các giới hạn sử dụng của mỗi ứng dụng. @@ -6925,6 +6927,9 @@ <translation id="8757552286070680084">Cấu hình bộ điều khiển chẩn đoán và đo từ xa (DTC) wilco</translation> <translation id="8758831693895931466">Bật đăng ký quản lý đám mây bắt buộc</translation> <translation id="8759829385824155666">Các loại mã hóa Kerberos được cho phép</translation> +<translation id="8763716376920670835">WebSQL được bật theo mặc định từ M101, nhưng cũng có thể bị cờ Chrome tắt. + Nếu chính sách này được đặt thành sai hoặc không được đặt, thì WebSQL có thể tắt được. + Nếu chính sách này được đặt thành đúng, thì WebSQL không tắt được.</translation> <translation id="8767743923206070405">Việc đặt chính sách này thành Bật sẽ hiển thị nút Trang chủ trên thanh công cụ của <ph name="PRODUCT_NAME" />. Nếu bạn đặt chính sách này thành Tắt, nút Trang chủ sẽ không xuất hiện. Nếu bạn đặt chính sách này, người dùng sẽ không thay đổi được trong <ph name="PRODUCT_NAME" />. Nếu bạn không đặt chính sách này, người dùng sẽ chọn liệu có hiển thị nút Trang chủ hay không.</translation>
diff --git a/components/reporting/storage/storage_queue_unittest.cc b/components/reporting/storage/storage_queue_unittest.cc index 35bfe77..079a0c2e 100644 --- a/components/reporting/storage/storage_queue_unittest.cc +++ b/components/reporting/storage/storage_queue_unittest.cc
@@ -992,16 +992,7 @@ storage_queue_->Flush(); } -// TODO(crbug.com/1302007): This test crashes on iPad device. -#if BUILDFLAG(IS_IOS) -#define MAYBE_WriteIntoNewStorageQueueReopenWriteMoreAndFlush \ - DISABLED_WriteIntoNewStorageQueueReopenWriteMoreAndFlush -#else -#define MAYBE_WriteIntoNewStorageQueueReopenWriteMoreAndFlush \ - WriteIntoNewStorageQueueReopenWriteMoreAndFlush -#endif -TEST_P(StorageQueueTest, - MAYBE_WriteIntoNewStorageQueueReopenWriteMoreAndFlush) { +TEST_P(StorageQueueTest, WriteIntoNewStorageQueueReopenWriteMoreAndFlush) { CreateTestStorageQueueOrDie(BuildStorageQueueOptionsOnlyManual()); WriteStringOrDie(kData[0]); WriteStringOrDie(kData[1]);
diff --git a/components/safe_browsing/content/browser/password_protection/mock_password_protection_service.h b/components/safe_browsing/content/browser/password_protection/mock_password_protection_service.h index 946aed3f..e0afe8e 100644 --- a/components/safe_browsing/content/browser/password_protection/mock_password_protection_service.h +++ b/components/safe_browsing/content/browser/password_protection/mock_password_protection_service.h
@@ -84,9 +84,12 @@ LoginReputationClientResponse::VerdictType, const std::string&, ReusedPasswordAccountType)); - MOCK_METHOD4( - MaybeReportPasswordReuseDetected, - void(PasswordProtectionRequest*, const std::string&, PasswordType, bool)); + MOCK_METHOD5(MaybeReportPasswordReuseDetected, + void(PasswordProtectionRequest*, + const std::string&, + PasswordType, + bool, + bool)); MOCK_METHOD3(UpdateSecurityState, void(safe_browsing::SBThreatType, ReusedPasswordAccountType,
diff --git a/components/safe_browsing/core/browser/password_protection/password_protection_service_base.cc b/components/safe_browsing/core/browser/password_protection/password_protection_service_base.cc index 708a064..ff009fd 100644 --- a/components/safe_browsing/core/browser/password_protection/password_protection_service_base.cc +++ b/components/safe_browsing/core/browser/password_protection/password_protection_service_base.cc
@@ -166,6 +166,9 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(request); +#if !BUILDFLAG(IS_ANDROID) + bool warning_shown = false; +#endif if (response) { ReusedPasswordAccountType password_type = GetPasswordProtectionReusedPasswordAccountType(request->password_type(), @@ -198,6 +201,9 @@ ShowModalWarning(request, response->verdict_type(), response->verdict_token(), password_type); request->set_is_modal_warning_showing(true); +#if !BUILDFLAG(IS_ANDROID) + warning_shown = true; +#endif } } @@ -217,7 +223,7 @@ #if !BUILDFLAG(IS_ANDROID) MaybeReportPasswordReuseDetected( request, request->username(), request->password_type(), - verdict == LoginReputationClientResponse::PHISHING); + verdict == LoginReputationClientResponse::PHISHING, warning_shown); #endif // Persist a bit in CompromisedCredentials table when saved password is
diff --git a/components/safe_browsing/core/browser/password_protection/password_protection_service_base.h b/components/safe_browsing/core/browser/password_protection/password_protection_service_base.h index 27f4b7a..b3527803 100644 --- a/components/safe_browsing/core/browser/password_protection/password_protection_service_base.h +++ b/components/safe_browsing/core/browser/password_protection/password_protection_service_base.h
@@ -123,7 +123,8 @@ PasswordProtectionRequest* request, const std::string& username, PasswordType password_type, - bool is_phishing_url) = 0; + bool is_phishing_url, + bool warning_shown) = 0; // Called when a protected password change is detected. Must be called on // UI thread.
diff --git a/components/safe_browsing/ios/browser/password_protection/password_protection_request_ios.mm b/components/safe_browsing/ios/browser/password_protection/password_protection_request_ios.mm index 825c304..71260ab 100644 --- a/components/safe_browsing/ios/browser/password_protection/password_protection_request_ios.mm +++ b/components/safe_browsing/ios/browser/password_protection/password_protection_request_ios.mm
@@ -38,20 +38,19 @@ bool password_field_exists, PasswordProtectionServiceBase* pps, int request_timeout_in_ms) - : PasswordProtectionRequest( - base::CreateSingleThreadTaskRunner({web::WebThread::UI}), - base::CreateSingleThreadTaskRunner({web::WebThread::IO}), - main_frame_url, - /*password_form_action=*/GURL(), - /*password_frame_url=*/GURL(), - mime_type, - username, - password_type, - matching_reused_credentials, - type, - password_field_exists, - pps, - request_timeout_in_ms), + : PasswordProtectionRequest(web::GetUIThreadTaskRunner({}), + web::GetIOThreadTaskRunner({}), + main_frame_url, + /*password_form_action=*/GURL(), + /*password_frame_url=*/GURL(), + mime_type, + username, + password_type, + matching_reused_credentials, + type, + password_field_exists, + pps, + request_timeout_in_ms), web_state_(web_state) { request_canceler_ = RequestCanceler::CreateRequestCanceler(AsWeakPtr(), web_state);
diff --git a/components/search_engines/template_url.cc b/components/search_engines/template_url.cc index bb0f934..0015612 100644 --- a/components/search_engines/template_url.cc +++ b/components/search_engines/template_url.cc
@@ -19,6 +19,7 @@ #include "base/i18n/icu_string_conversions.h" #include "base/i18n/rtl.h" #include "base/metrics/field_trial.h" +#include "base/metrics/histogram_functions.h" #include "base/notreached.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_piece.h" @@ -1052,19 +1053,26 @@ case GOOGLE_ASSISTED_QUERY_STATS: DCHECK(!replacement.is_post_param); if (!search_terms_args.assisted_query_stats.empty()) { - // Get the base URL without substituting AQS to avoid infinite - // recursion. We need the URL to find out if it meets all - // AQS requirements (e.g. HTTPS protocol check). - // See TemplateURLRef::SearchTermsArgs for more details. - SearchTermsArgs search_terms_args_without_aqs(search_terms_args); - search_terms_args_without_aqs.assisted_query_stats.clear(); - GURL base_url(ReplaceSearchTerms(search_terms_args_without_aqs, + // Get the base URL without substituting AQS and gs_lcrp to avoid + // infinite recursion and unwanted replacement respectively. We need + // the URL to find out if it meets all AQS requirements (e.g. HTTPS + // protocol check). See TemplateURLRef::SearchTermsArgs for more + // details. + SearchTermsArgs sanitized_search_terms_args(search_terms_args); + sanitized_search_terms_args.assisted_query_stats.clear(); + // Clear the proto. Its empty state has a serialized size of zero. + sanitized_search_terms_args.searchbox_stats.Clear(); + GURL base_url(ReplaceSearchTerms(sanitized_search_terms_args, search_terms_data, nullptr)); if (base_url.SchemeIsCryptographic() && base::FeatureList::IsEnabled( omnibox::kReportAssistedQueryStats)) { HandleReplacement("aqs", search_terms_args.assisted_query_stats, replacement, &url); + base::UmaHistogramCounts1000( + "Omnibox.AssistedQueryStats.Length", + static_cast<int>( + search_terms_args.assisted_query_stats.length())); } } break; @@ -1072,14 +1080,16 @@ case GOOGLE_SEARCHBOX_STATS: { DCHECK(!replacement.is_post_param); if (search_terms_args.searchbox_stats.ByteSizeLong() > 0) { - // Get the base URL without substituting gs_lcrp to avoid infinite - // recursion. We need the URL to find out if it meets all - // gs_lcrp requirements (e.g. HTTPS protocol check). - // See TemplateURLRef::SearchTermsArgs for more details. - SearchTermsArgs search_terms_args_without_gs_lcrp(search_terms_args); + // Get the base URL without substituting gs_lcrp and AQS to avoid + // infinite recursion and unwanted replacement respectively. We need + // the URL to find out if it meets all gs_lcrp requirements (e.g. + // HTTPS protocol check). See TemplateURLRef::SearchTermsArgs for more + // details. + SearchTermsArgs sanitized_search_terms_args(search_terms_args); + sanitized_search_terms_args.assisted_query_stats.clear(); // Clear the proto. Its empty state has a serialized size of zero. - search_terms_args_without_gs_lcrp.searchbox_stats.Clear(); - GURL base_url(ReplaceSearchTerms(search_terms_args_without_gs_lcrp, + sanitized_search_terms_args.searchbox_stats.Clear(); + GURL base_url(ReplaceSearchTerms(sanitized_search_terms_args, search_terms_data, nullptr)); if (base_url.SchemeIsCryptographic() && base::FeatureList::IsEnabled(omnibox::kReportSearchboxStats)) { @@ -1092,6 +1102,9 @@ &encoded_searchbox_stats); HandleReplacement("gs_lcrp", encoded_searchbox_stats, replacement, &url); + base::UmaHistogramCounts1000( + "Omnibox.SearchboxStats.Length", + static_cast<int>(encoded_searchbox_stats.length())); } } }
diff --git a/components/search_engines/template_url_unittest.cc b/components/search_engines/template_url_unittest.cc index edd9cb1..071d1761 100644 --- a/components/search_engines/template_url_unittest.cc +++ b/components/search_engines/template_url_unittest.cc
@@ -14,6 +14,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "components/google/core/common/google_util.h" #include "components/omnibox/common/omnibox_features.h" @@ -604,6 +605,7 @@ // Tests replacing assisted query stats (AQS) in various scenarios. TEST_F(TemplateURLTest, ReplaceAssistedQueryStats) { + base::HistogramTester histogram_tester; base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures({omnibox::kReportAssistedQueryStats}, {}); @@ -650,16 +652,22 @@ ASSERT_TRUE(result.is_valid()); EXPECT_EQ(test_data[i].expected_result, result.spec()); } + // Expect correct histograms to have been logged. + histogram_tester.ExpectTotalCount("Omnibox.AssistedQueryStats.Length", 2); + histogram_tester.ExpectBucketCount("Omnibox.AssistedQueryStats.Length", 12, + 2); } // Tests replacing searchbox stats (gs_lcrp) in various scenarios. TEST_F(TemplateURLTest, ReplaceSearchboxStats) { + base::HistogramTester histogram_tester; base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures({omnibox::kReportSearchboxStats}, {}); metrics::ChromeSearchboxStats empty_searchbox_stats; metrics::ChromeSearchboxStats non_empty_searchbox_stats; non_empty_searchbox_stats.set_client_name("chrome"); + non_empty_searchbox_stats.set_zero_prefix_enabled(true); struct TestData { const std::u16string search_term; @@ -679,7 +687,7 @@ // HTTPS and non-empty gs_lcrp: replace gs_lcrp. {u"foo", non_empty_searchbox_stats, "https://foo/", "{google:baseURL}?q={searchTerms}&{google:searchboxStats}", - "https://foo/?q=foo&gs_lcrp=EgZjaHJvbWU=&"}, + "https://foo/?q=foo&gs_lcrp=EgZjaHJvbWWwAgE=&"}, // HTTPS and non-empty gs_lcrp but no google:searchboxStats: no gs_lcrp. {u"foo", non_empty_searchbox_stats, "https://foo/", "{google:baseURL}?q={searchTerms}", "https://foo/?q=foo"}, @@ -694,7 +702,7 @@ // gs_lcrp. {u"foo", non_empty_searchbox_stats, "https://foo/", "https://foo/?{searchTerms}&{google:searchboxStats}", - "https://foo/?foo&gs_lcrp=EgZjaHJvbWU=&"}, + "https://foo/?foo&gs_lcrp=EgZjaHJvbWWwAgE=&"}, // Non-Google search provider, HTTPS and non-empty gs_lcrp but no // google:searchboxStats: no gs_lcrp. {u"foo", non_empty_searchbox_stats, "https://foo/", @@ -715,16 +723,21 @@ ASSERT_TRUE(result.is_valid()); EXPECT_EQ(entry.expected_result, result.spec()); } + // Expect correct histograms to have been logged. + histogram_tester.ExpectTotalCount("Omnibox.SearchboxStats.Length", 2); + histogram_tester.ExpectBucketCount("Omnibox.SearchboxStats.Length", 16, 2); } // Tests replacing searchbox stats (gs_lcrp) and assisted query stats (AQS). TEST_F(TemplateURLTest, ReplaceSearchboxStatsAndAssistedQueryStats) { + base::HistogramTester histogram_tester; base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( {omnibox::kReportSearchboxStats, omnibox::kReportAssistedQueryStats}, {}); metrics::ChromeSearchboxStats non_empty_searchbox_stats; non_empty_searchbox_stats.set_client_name("chrome"); + non_empty_searchbox_stats.set_zero_prefix_enabled(true); struct TestData { const std::u16string search_term; @@ -738,13 +751,13 @@ {u"foo", "chrome.0.0l6", non_empty_searchbox_stats, "https://foo/", "{google:baseURL}?q={searchTerms}&{google:searchboxStats}{google:" "assistedQueryStats}", - "https://foo/?q=foo&gs_lcrp=EgZjaHJvbWU=&aqs=chrome.0.0l6&"}, + "https://foo/?q=foo&gs_lcrp=EgZjaHJvbWWwAgE=&aqs=chrome.0.0l6&"}, // Non-Google search provider, HTTPS and non-empty gs_lcrp and AQS: // replace both. {u"foo", "chrome.0.0l6", non_empty_searchbox_stats, "https://foo/", "https://foo/" "?{searchTerms}&{google:searchboxStats}{google:assistedQueryStats}", - "https://foo/?foo&gs_lcrp=EgZjaHJvbWU=&aqs=chrome.0.0l6&"}, + "https://foo/?foo&gs_lcrp=EgZjaHJvbWWwAgE=&aqs=chrome.0.0l6&"}, }; TemplateURLData data; data.input_encodings.push_back("UTF-8"); @@ -762,6 +775,12 @@ ASSERT_TRUE(result.is_valid()); EXPECT_EQ(entry.expected_result, result.spec()); } + // Expect correct histograms to have been logged. + histogram_tester.ExpectTotalCount("Omnibox.AssistedQueryStats.Length", 2); + histogram_tester.ExpectBucketCount("Omnibox.AssistedQueryStats.Length", 12, + 2); + histogram_tester.ExpectTotalCount("Omnibox.SearchboxStats.Length", 2); + histogram_tester.ExpectBucketCount("Omnibox.SearchboxStats.Length", 16, 2); } // Tests replacing cursor position.
diff --git a/components/signin/public/android/junit/src/org/chromium/components/signin/base/AccountCapabilitiesTest.java b/components/signin/public/android/junit/src/org/chromium/components/signin/base/AccountCapabilitiesTest.java index 72153ed..d7aae21 100644 --- a/components/signin/public/android/junit/src/org/chromium/components/signin/base/AccountCapabilitiesTest.java +++ b/components/signin/public/android/junit/src/org/chromium/components/signin/base/AccountCapabilitiesTest.java
@@ -55,6 +55,16 @@ return -1; } + /** Populates all capabilities with the given response value. */ + public static HashMap<String, Integer> populateCapabilitiesResponse( + @AccountManagerDelegate.CapabilityResponse int value) { + HashMap<String, Integer> response = new HashMap<>(); + for (String capabilityName : AccountCapabilities.SUPPORTED_ACCOUNT_CAPABILITY_NAMES) { + response.put(capabilityName, value); + } + return response; + } + /** * List of parameters to run in capability fetching tests. */ @@ -138,44 +148,32 @@ } @Test - public void testParseFromCapabilitiesResponseWithSuccessResponse() { - AccountCapabilities capabilities = - AccountCapabilities.parseFromCapabilitiesResponse(new HashMap<String, Integer>() { - { - put(AccountCapabilitiesConstants - .IS_SUBJECT_TO_PARENTAL_CONTROLS_CAPABILITY_NAME, - AccountManagerDelegate.CapabilityResponse.YES); - put(AccountCapabilitiesConstants - .CAN_OFFER_EXTENDED_CHROME_SYNC_PROMOS_CAPABILITY_NAME, - AccountManagerDelegate.CapabilityResponse.NO); - put(AccountCapabilitiesConstants - .CAN_RUN_CHROME_PRIVACY_SANDBOX_TRIALS_CAPABILITY_NAME, - AccountManagerDelegate.CapabilityResponse.NO); - } - }); - Assert.assertEquals(capabilities.canOfferExtendedSyncPromos(), Tribool.FALSE); - Assert.assertEquals(capabilities.isSubjectToParentalControls(), Tribool.TRUE); - Assert.assertEquals(capabilities.canRunChromePrivacySandboxTrials(), Tribool.FALSE); + public void testParseFromCapabilitiesResponseWithResponseYes() { + AccountCapabilities capabilities = AccountCapabilities.parseFromCapabilitiesResponse( + populateCapabilitiesResponse(AccountManagerDelegate.CapabilityResponse.YES)); + + for (String capabilityName : AccountCapabilities.SUPPORTED_ACCOUNT_CAPABILITY_NAMES) { + Assert.assertEquals(getCapability(capabilityName, capabilities), Tribool.TRUE); + } + } + + @Test + public void testParseFromCapabilitiesResponseWithResponseNo() { + AccountCapabilities capabilities = AccountCapabilities.parseFromCapabilitiesResponse( + populateCapabilitiesResponse(AccountManagerDelegate.CapabilityResponse.NO)); + + for (String capabilityName : AccountCapabilities.SUPPORTED_ACCOUNT_CAPABILITY_NAMES) { + Assert.assertEquals(getCapability(capabilityName, capabilities), Tribool.FALSE); + } } @Test public void testParseFromCapabilitiesResponseWithExceptionResponse() { - AccountCapabilities capabilities = - AccountCapabilities.parseFromCapabilitiesResponse(new HashMap<String, Integer>() { - { - put(AccountCapabilitiesConstants - .IS_SUBJECT_TO_PARENTAL_CONTROLS_CAPABILITY_NAME, - AccountManagerDelegate.CapabilityResponse.EXCEPTION); - put(AccountCapabilitiesConstants - .CAN_OFFER_EXTENDED_CHROME_SYNC_PROMOS_CAPABILITY_NAME, - AccountManagerDelegate.CapabilityResponse.EXCEPTION); - put(AccountCapabilitiesConstants - .CAN_RUN_CHROME_PRIVACY_SANDBOX_TRIALS_CAPABILITY_NAME, - AccountManagerDelegate.CapabilityResponse.EXCEPTION); - } - }); - Assert.assertEquals(capabilities.canOfferExtendedSyncPromos(), Tribool.UNKNOWN); - Assert.assertEquals(capabilities.isSubjectToParentalControls(), Tribool.UNKNOWN); - Assert.assertEquals(capabilities.canRunChromePrivacySandboxTrials(), Tribool.UNKNOWN); + AccountCapabilities capabilities = AccountCapabilities.parseFromCapabilitiesResponse( + populateCapabilitiesResponse(AccountManagerDelegate.CapabilityResponse.EXCEPTION)); + + for (String capabilityName : AccountCapabilities.SUPPORTED_ACCOUNT_CAPABILITY_NAMES) { + Assert.assertEquals(getCapability(capabilityName, capabilities), Tribool.UNKNOWN); + } } }
diff --git a/components/signin/public/identity_manager/account_capabilities.cc b/components/signin/public/identity_manager/account_capabilities.cc index eb521b9f..58e5187 100644 --- a/components/signin/public/identity_manager/account_capabilities.cc +++ b/components/signin/public/identity_manager/account_capabilities.cc
@@ -34,7 +34,8 @@ AccountCapabilities::GetSupportedAccountCapabilityNames() { static base::NoDestructor<std::vector<std::string>> kCapabilityNames{ {kCanOfferExtendedChromeSyncPromosCapabilityName, - kCanRunChromePrivacySandboxTrialsCapabilityName}}; + kCanRunChromePrivacySandboxTrialsCapabilityName, + kIsSubjectToParentalControlsCapabilityName}}; return *kCapabilityNames; } @@ -67,6 +68,10 @@ return GetCapabilityByName(kCanRunChromePrivacySandboxTrialsCapabilityName); } +signin::Tribool AccountCapabilities::is_subject_to_parental_controls() const { + return GetCapabilityByName(kIsSubjectToParentalControlsCapabilityName); +} + bool AccountCapabilities::UpdateWith(const AccountCapabilities& other) { bool modified = false;
diff --git a/components/signin/public/identity_manager/account_capabilities.h b/components/signin/public/identity_manager/account_capabilities.h index 9f85a273..6006382 100644 --- a/components/signin/public/identity_manager/account_capabilities.h +++ b/components/signin/public/identity_manager/account_capabilities.h
@@ -48,6 +48,9 @@ // Chrome can run privacy sandbox trials for accounts with this capability. signin::Tribool can_run_chrome_privacy_sandbox_trials() const; + // Chrome applies parental controls to accounts with this capability. + signin::Tribool is_subject_to_parental_controls() const; + // Whether none of the capabilities has `signin::Tribool::kUnknown`. bool AreAllCapabilitiesKnown() const;
diff --git a/components/signin/public/identity_manager/account_capabilities_test_mutator.cc b/components/signin/public/identity_manager/account_capabilities_test_mutator.cc index c7db63b..3536410 100644 --- a/components/signin/public/identity_manager/account_capabilities_test_mutator.cc +++ b/components/signin/public/identity_manager/account_capabilities_test_mutator.cc
@@ -30,6 +30,12 @@ value; } +void AccountCapabilitiesTestMutator::set_is_subject_to_parental_controls( + bool value) { + capabilities_->capabilities_map_[kIsSubjectToParentalControlsCapabilityName] = + value; +} + void AccountCapabilitiesTestMutator::SetAllSupportedCapabilities(bool value) { for (const std::string& name : AccountCapabilities::GetSupportedAccountCapabilityNames()) {
diff --git a/components/signin/public/identity_manager/account_capabilities_test_mutator.h b/components/signin/public/identity_manager/account_capabilities_test_mutator.h index 28198b4..182a197 100644 --- a/components/signin/public/identity_manager/account_capabilities_test_mutator.h +++ b/components/signin/public/identity_manager/account_capabilities_test_mutator.h
@@ -19,6 +19,7 @@ // Exposes setters for the supported capabilities. void set_can_offer_extended_chrome_sync_promos(bool value); void set_can_run_chrome_privacy_sandbox_trials(bool value); + void set_is_subject_to_parental_controls(bool value); // Modifies all supported capabilities at once. void SetAllSupportedCapabilities(bool value);
diff --git a/components/signin/public/identity_manager/account_capabilities_unittest.cc b/components/signin/public/identity_manager/account_capabilities_unittest.cc index 81980687..01fc029e 100644 --- a/components/signin/public/identity_manager/account_capabilities_unittest.cc +++ b/components/signin/public/identity_manager/account_capabilities_unittest.cc
@@ -43,6 +43,21 @@ signin::Tribool::kFalse); } +TEST_F(AccountCapabilitiesTest, IsSubjectToParentalControls) { + AccountCapabilities capabilities; + EXPECT_EQ(capabilities.is_subject_to_parental_controls(), + signin::Tribool::kUnknown); + + AccountCapabilitiesTestMutator mutator(&capabilities); + mutator.set_is_subject_to_parental_controls(true); + EXPECT_EQ(capabilities.is_subject_to_parental_controls(), + signin::Tribool::kTrue); + + mutator.set_is_subject_to_parental_controls(false); + EXPECT_EQ(capabilities.is_subject_to_parental_controls(), + signin::Tribool::kFalse); +} + TEST_F(AccountCapabilitiesTest, AreAllCapabilitiesKnown_Empty) { AccountCapabilities capabilities; EXPECT_FALSE(capabilities.AreAllCapabilitiesKnown());
diff --git a/components/spellcheck/DIR_METADATA b/components/spellcheck/DIR_METADATA index 49408cf..d54df3e 100644 --- a/components/spellcheck/DIR_METADATA +++ b/components/spellcheck/DIR_METADATA
@@ -1,5 +1,5 @@ monorail { - component: "UI>Browser>Spellcheck" + component: "UI>Browser>Language>Spellcheck" } team_email: "language@chromium.org"
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb index e155079c..e72097d 100644 --- a/components/strings/components_strings_az.xtb +++ b/components/strings/components_strings_az.xtb
@@ -170,6 +170,7 @@ <translation id="1436185428532214179">Saytlar cihazınızdakı faylları və qovluqları redaktə etmək üçün icazə istəyə bilər</translation> <translation id="1442386063175183758">Sağ küncə qatlayın</translation> <translation id="1442987760062738829">Deşik açın</translation> +<translation id="1446396933673057385">Dəqiqliyin yoxlanması</translation> <translation id="1447067628680007684">(x86_64)</translation> <translation id="1453974140256777690">Yapışdırdığınız və ya əlavə etdiyiniz mətn təhlil üçün Google Cloud'a və ya üçüncü tərəflərə göndərilir. Məsələn, onlar həssas dataya görə skanlana bilər.</translation> <translation id="1455413310270022028">Pozan</translation> @@ -460,6 +461,7 @@ <translation id="2318594867107319532">Son siyasət vaxt nişanı:</translation> <translation id="2328651992442742497">İcazə verilib (defolt)</translation> <translation id="2329182534073751090">pəncərənin yerləşdirilməsi</translation> +<translation id="2329473609445770916">Bu sayt digər saytların sizə reklam göstərmək üçün istifadə edə biləcəyi maraqları müəyyən edir</translation> <translation id="2330137317877982892"><ph name="CREDIT_CARD" />, <ph name="EXPIRATION_DATE_ABBR" /> tarixində bitir</translation> <translation id="2337852623177822836">Ayara administrator tərəfindən nəzarət edilir</translation> <translation id="2340263603246777781"><ph name="ORIGIN" /> ütləndirmək istəyir</translation> @@ -735,6 +737,7 @@ <translation id="3240683217920639535"><ph name="MANAGE_CHROME_THEMES_FOCUSED_FRIENDLY_MATCH_TEXT" />, Tab düyməsi, sonra Enter düyməsinə basaraq brauzerinizin görünüşünü fərdiləşdirin</translation> <translation id="3240791268468473923">"Təhlükəsiz ödəniş giriş məlumatları uyğun gəlmir" giriş məlumatları səhifəsi açılıb</translation> <translation id="324180406144491771">“<ph name="HOST_NAME" />” keçidləri bloklanıb</translation> +<translation id="3248611290851046188">Bu sayt digər saytların sizə reklam göstərmək üçün istifadə edə biləcəyi maraqları müəyyən edir. Bu sayt sizə daha uyğun reklamlar göstərmək üçün Chrome'dan maraqlarınızı da əldə edir.</translation> <translation id="3249845759089040423">Modern</translation> <translation id="3252266817569339921">Fransız</translation> <translation id="3259648571731540213"><ph name="CREATE_GOOGLE_CALENDAR_EVENT_FOCUSED_FRIENDLY_MATCH_TEXT" />, Tab düyməsi, sonra Enter düyməsinə basaraq Google Calendar'da cəld yeni tədbir yaradın</translation> @@ -845,6 +848,7 @@ <translation id="3586931643579894722">Detalları gizlədin</translation> <translation id="3587738293690942763">Orta</translation> <translation id="3592413004129370115">İtalyan (Zərf)</translation> +<translation id="3595645257662173296">Hansı dəlillər bunu dəstəkləyir?</translation> <translation id="3595699422137460894">{NUM_DAYS,plural, =0{Qrupunuzu istənilən vaxt sıfırlaya bilərsiniz. Yeni bir qrupa qoşulmaq təxminən bir gün çəkir.}=1{Qrupunuzu istənilən vaxt sıfırlaya bilərsiniz. Yeni bir qrupa qoşulmaq təxminən bir gün çəkir.}other{Qrupunuzu istənilən vaxt sıfırlaya bilərsiniz. Yeni bir qrupa qoşulmaq təxminən {NUM_DAYS} gün çəkir.}}</translation> <translation id="3600246354004376029"><ph name="TITLE" />, <ph name="DOMAIN" />, <ph name="TIME" /></translation> <translation id="3603507503523709">Tətbiq admin tərəfindən bloklanıb</translation> @@ -1658,6 +1662,7 @@ <translation id="6165508094623778733">Ətraflı öyrənin</translation> <translation id="6167577165590485365">Son əldə etmə cəhdi:</translation> <translation id="6169916984152623906">İndi şəxsi axtarış edə bilərsiniz və bu cihazı istifadə edən digər şəxslər fəaliyyətinizi görməyəcək. Lakin endirmələr və əlfəcinlər yadda saxlanacaq.</translation> +<translation id="6176716740821145453">Dəqiqliyi nəzərə almaq üçün bir az vaxt ayırın</translation> <translation id="6177128806592000436">Bu sayta olan bağlantınız güvənli deyil</translation> <translation id="6180316780098470077">Təkrar cəhd intervalı</translation> <translation id="6196640612572343990">Üçüncü tərəf kukiləri blok edin</translation> @@ -1781,6 +1786,7 @@ <translation id="6615297766614333076">Yığıcı 2</translation> <translation id="6624427990725312378">Kontakt Məlumatı</translation> <translation id="6626291197371920147">Düzgün kart nömrəsi əlavə edin</translation> +<translation id="6627727261837091711">Reklam fərdiləşdirmə təfərrüatlarını göstərin</translation> <translation id="6628463337424475685"><ph name="ENGINE" /> axtarışı</translation> <translation id="6630043285902923878">USB cihazları axtarılır...</translation> <translation id="6630809736994426279">Hazırda <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> saytındakı hücumçular Mac cihazındakı məlumatları (məsələn, foto, parol, mesaj və kredit kartları) oğurlayan və ya silən təhlükəli proqramlar quraşdırmağa cəhd edə bilər. <ph name="BEGIN_LEARN_MORE_LINK" />Ətraflı məlumat<ph name="END_LEARN_MORE_LINK" /></translation> @@ -2049,6 +2055,7 @@ <translation id="7473891865547856676">Yox</translation> <translation id="7481312909269577407">İrəli</translation> <translation id="7485870689360869515">Heç bir data tapılmadı.</translation> +<translation id="7485948220959728508">Bu məlumatların arxasında kim dayanır?</translation> <translation id="7495528107193238112">Bu məzmun bloklanıb. Problemi düzəltmək üçün sayt sahibi ilə əlaqə saxlayın.</translation> <translation id="7497998058912824456">"Sənəd yaradın" düyməsi, Enter düyməsinə basaraq cəld yeni Google Sənəd yaradın</translation> <translation id="7506488012654002225">Chromium aşağıdakı məlumatları <ph name="BEGIN_EMPHASIS" />yadda saxlamayacaq<ph name="END_EMPHASIS" />: @@ -2129,6 +2136,7 @@ <translation id="7682287625158474539">Göndəriş</translation> <translation id="7687186412095877299">Ödəniş formalarına yadda saxladığınız ödəniş metodunu daxil edir</translation> <translation id="7687305263118037187">Təkrar cəhdin vaxtı bitdi</translation> +<translation id="7687451951329798396">Digər mənbələr nə deyir?</translation> <translation id="7693583928066320343">Səhifə sırası qəbul edildi</translation> <translation id="7697066736081121494">Prc8 (Zərf)</translation> <translation id="769721561045429135">Hazırda yalnız bu cihazda istifadə edilə bilən kartlar var Kartlara baxmaq üçün "Davam edin" seçiminə klikləyin.</translation> @@ -2372,6 +2380,7 @@ <translation id="8507227106804027148">Əmr sahəsi</translation> <translation id="8508648098325802031">Axtarış işarəsi</translation> <translation id="8511402995811232419">Kukiləri idarə edin</translation> +<translation id="851353418319061866">Dəqiqliyin Yoxlanması</translation> <translation id="8519753333133776369">Administratorunuz tərəfindən icazə verilən HID cihazı</translation> <translation id="8522552481199248698">Chrome Google Hesabınızı qorumağa və parolu dəyişməyə kömək edə bilər.</translation> <translation id="8530813470445476232">Baxış tarixçəsi, kukilər, keş və daha çoxunu Chrome ayarlarında təmizləyin</translation>
diff --git a/components/strings/components_strings_be.xtb b/components/strings/components_strings_be.xtb index 9b14e21..9b5539a 100644 --- a/components/strings/components_strings_be.xtb +++ b/components/strings/components_strings_be.xtb
@@ -2093,6 +2093,7 @@ <translation id="7575207903026901870">Кнопка "Выдаліць прапанову". Каб выдаліць прапанову, націсніце Enter.</translation> <translation id="7577900504646297215">Кіраваць інтарэсамі</translation> <translation id="7578104083680115302">Хуткая аплата на сайтах і ў праграмах з розных прылад карткамі, захаванымі ў сэрвісах Google.</translation> +<translation id="7579442726219254162">Невядомая пераменная "<ph name="VARIABLE" />" у кіруемай канфігурацыі праграмы "<ph name="APPLICATION_ID" />".</translation> <translation id="7581199239021537589">Зрух відарыса па восі Y, бок 2</translation> <translation id="7582602800368606489">Хутка стварыць новую падзею ў Google Календары</translation> <translation id="7591288787774558753">Абагуліць канфідэнцыяльнае змесціва?</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index 5054379..1232c4d 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -2093,6 +2093,7 @@ <translation id="7575207903026901870">সাজেশন বোতাম সরান, এই সাজেশন সরাতে 'Enter' কী প্রেস করুন</translation> <translation id="7577900504646297215">আপনার পছন্দ ম্যানেজ করুন</translation> <translation id="7578104083680115302">আপনি Google এর সাথে সংরক্ষণ করেছেন এমন কার্ড ব্যবহার করে ডিভাইস জুড়ে সাইট এবং অ্যাপ্লিকেশানগুলিতে দ্রুত অর্থ পরিশোধ করুন।</translation> +<translation id="7579442726219254162">"<ph name="APPLICATION_ID" />"-এর ম্যানেজ করা কনফিগারেশনে অজানা ভেরিয়েবল "<ph name="VARIABLE" />"।</translation> <translation id="7581199239021537589">সাইড 2 ছবি Y শিফ্ট</translation> <translation id="7582602800368606489">Google Calendar-এ চটপট নতুন একটি ইভেন্ট তৈরি করুন</translation> <translation id="7591288787774558753">গোপনীয় কন্টেন্ট শেয়ার করবেন?</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index 344877b..a76f125 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -2084,6 +2084,7 @@ <translation id="7575207903026901870">Botó Suprimeix el suggeriment, prem Retorn per suprimir aquest suggeriment</translation> <translation id="7577900504646297215">Gestiona els interessos</translation> <translation id="7578104083680115302">Agilitzeu els pagaments en llocs i en aplicacions des de qualsevol dispositiu mitjançant les targetes que hàgiu desat a Google.</translation> +<translation id="7579442726219254162">S'ha trobat una variable desconeguda anomenada "<ph name="VARIABLE" />" a la configuració gestionada de l'aplicació "<ph name="APPLICATION_ID" />".</translation> <translation id="7581199239021537589">Desplaçament a l'eix Y del costat 2 de la imatge</translation> <translation id="7582602800368606489">Crea un esdeveniment a Google Calendar ràpidament</translation> <translation id="7591288787774558753">Vols compartir contingut confidencial?</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index 73de728e..a7f41cc 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -2078,6 +2078,7 @@ <translation id="7575207903026901870">Tlačítko Odstranit návrh, stisknutím klávesy Enter tento návrh odstraníte</translation> <translation id="7577900504646297215">Spravovat zájmy</translation> <translation id="7578104083680115302">Plaťte na webech a v aplikacích v různých zařízeních rychle pomocí karet uložených na Googlu.</translation> +<translation id="7579442726219254162">Neznámá proměnná <ph name="VARIABLE" /> ve spravované konfiguraci aplikace <ph name="APPLICATION_ID" />.</translation> <translation id="7581199239021537589">Posun obrázku strany 2 na ose Y</translation> <translation id="7582602800368606489">Rychle vytvořit novou událost v Kalendáři Google</translation> <translation id="7591288787774558753">Sdílet důvěrný obsah?</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index 3d9bf3b..bc5af71e 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -2093,6 +2093,7 @@ <translation id="7575207903026901870">Knappen Fjern forslag. Tryk på Enter for at fjerne dette forslag.</translation> <translation id="7577900504646297215">Administrer interesser</translation> <translation id="7578104083680115302">Betal hurtigt på websites og i apps på alle enheder ved hjælp af kort, du har gemt med Google.</translation> +<translation id="7579442726219254162">Der er en ukendt variabel (<ph name="VARIABLE" />) i den administrerede konfiguration af "<ph name="APPLICATION_ID" />".</translation> <translation id="7581199239021537589">Billedskift Y på side 2</translation> <translation id="7582602800368606489">Opret hurtigt en ny begivenhed i Google Kalender</translation> <translation id="7591288787774558753">Vil du dele fortroligt indhold?</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index e9fa101..ae4ac1c 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -170,6 +170,7 @@ <translation id="1436185428532214179">Can ask to edit files and folders on your device</translation> <translation id="1442386063175183758">Right gate fold</translation> <translation id="1442987760062738829">Punch</translation> +<translation id="1446396933673057385">Accuracy check</translation> <translation id="1447067628680007684">(x86_64)</translation> <translation id="1453974140256777690">Text that you paste or attach is sent to Google Cloud or third parties for analysis. For example, it might be scanned for sensitive data.</translation> <translation id="1455413310270022028">Eraser</translation> @@ -459,6 +460,7 @@ <translation id="2318594867107319532">Last policy timestamp:</translation> <translation id="2328651992442742497">Allowed (default)</translation> <translation id="2329182534073751090">window placement</translation> +<translation id="2329473609445770916">This site defines interests that other sites can use to show you ads</translation> <translation id="2330137317877982892"><ph name="CREDIT_CARD" />, expires on <ph name="EXPIRATION_DATE_ABBR" /></translation> <translation id="2337852623177822836">Setting controlled by your administrator</translation> <translation id="2340263603246777781"><ph name="ORIGIN" /> wants to pair</translation> @@ -736,6 +738,7 @@ <translation id="3240683217920639535"><ph name="MANAGE_CHROME_THEMES_FOCUSED_FRIENDLY_MATCH_TEXT" />; press tab and then Enter to customise the look of your browser</translation> <translation id="3240791268468473923">Secure payment credential no matching credential sheet is opened</translation> <translation id="324180406144491771">'<ph name="HOST_NAME" />' links are blocked</translation> +<translation id="3248611290851046188">This site defines interests that other sites can use to show you ads. This site also gets your interests from Chrome to show you more relevant ads.</translation> <translation id="3249845759089040423">Groovy</translation> <translation id="3252266817569339921">French</translation> <translation id="3259648571731540213"><ph name="CREATE_GOOGLE_CALENDAR_EVENT_FOCUSED_FRIENDLY_MATCH_TEXT" />: press Tab then Enter to create a new event in Google Calendar quickly</translation> @@ -847,6 +850,7 @@ <translation id="3586931643579894722">Hide details</translation> <translation id="3587738293690942763">Middle</translation> <translation id="3592413004129370115">Italian (Envelope)</translation> +<translation id="3595645257662173296">What evidence supports it?</translation> <translation id="3595699422137460894">{NUM_DAYS,plural, =0{You can reset your group at any time. It takes about a day to join a new group.}=1{You can reset your group at any time. It takes about a day to join a new group.}other{You can reset your group at any time. It takes {NUM_DAYS} days to join a new group.}}</translation> <translation id="3600246354004376029"><ph name="TITLE" />, <ph name="DOMAIN" />, <ph name="TIME" /></translation> <translation id="3603507503523709">Application blocked by your administrator</translation> @@ -1662,6 +1666,7 @@ <translation id="6165508094623778733">Learn more</translation> <translation id="6167577165590485365">Last fetch attempted:</translation> <translation id="6169916984152623906">Now you can browse privately, and other people who use this device won’t see your activity. However, downloads and bookmarks will be saved.</translation> +<translation id="6176716740821145453">Take a moment to consider accuracy</translation> <translation id="6177128806592000436">Your connection to this site is not secure</translation> <translation id="6180316780098470077">Retry interval</translation> <translation id="6196640612572343990">Block third-party cookies</translation> @@ -1785,6 +1790,7 @@ <translation id="6615297766614333076">Stacker 2</translation> <translation id="6624427990725312378">Contact Info</translation> <translation id="6626291197371920147">Add valid card number</translation> +<translation id="6627727261837091711">Show ad personalisation details</translation> <translation id="6628463337424475685"><ph name="ENGINE" /> Search</translation> <translation id="6630043285902923878">Finding USB devices…</translation> <translation id="6630809736994426279">Attackers currently on <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> might attempt to install dangerous programs on your Mac that steal or delete your information (for example, photos, passwords, messages and credit cards). <ph name="BEGIN_LEARN_MORE_LINK" />Learn more<ph name="END_LEARN_MORE_LINK" /></translation> @@ -2053,6 +2059,7 @@ <translation id="7473891865547856676">No, thanks</translation> <translation id="7481312909269577407">Forward</translation> <translation id="7485870689360869515">No data found.</translation> +<translation id="7485948220959728508">Who’s behind this information?</translation> <translation id="7495528107193238112">This content is blocked. Contact the site owner to fix the issue.</translation> <translation id="7497998058912824456">Create doc button: press Enter to create a new Google Doc quickly</translation> <translation id="7506488012654002225">Chromium <ph name="BEGIN_EMPHASIS" />won’t save<ph name="END_EMPHASIS" /> the following information: @@ -2133,6 +2140,7 @@ <translation id="7682287625158474539">Shipping</translation> <translation id="7687186412095877299">Fills in payment forms with your saved payment methods</translation> <translation id="7687305263118037187">Retry time-out</translation> +<translation id="7687451951329798396">What do other sources say?</translation> <translation id="7693583928066320343">Page order received</translation> <translation id="7697066736081121494">Prc8 (Envelope)</translation> <translation id="769721561045429135">At the moment, you have cards that can only be used on this device. Click Continue to review cards.</translation> @@ -2376,6 +2384,7 @@ <translation id="8507227106804027148">Command line</translation> <translation id="8508648098325802031">Search icon</translation> <translation id="8511402995811232419">Manage cookies</translation> +<translation id="851353418319061866">Accuracy check</translation> <translation id="8519753333133776369">HID device allowed by your administrator</translation> <translation id="8522552481199248698">Chrome can help you protect your Google account and change your password.</translation> <translation id="8530813470445476232">Clear your browsing history, cookies, cache and more in Chrome settings</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index 50a29470..004b7709 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -2085,6 +2085,7 @@ <translation id="7575207903026901870">Botón Quitar sugerencia; presiona Intro para quitar esta sugerencia</translation> <translation id="7577900504646297215">Administrar intereses</translation> <translation id="7578104083680115302">Paga con rapidez en sitios y apps a través de varios dispositivos con tarjetas que guardaste en Google.</translation> +<translation id="7579442726219254162">La configuración administrada de "<ph name="APPLICATION_ID" />" contiene la variable desconocida "<ph name="VARIABLE" />".</translation> <translation id="7581199239021537589">Cambio en el eje Y del lado 2 de la imagen</translation> <translation id="7582602800368606489">Crear un evento nuevo en el Calendario de Google rápidamente</translation> <translation id="7591288787774558753">¿Deseas compartir contenido confidencial?</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index ccdc4fb..8b157ba 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -2093,6 +2093,7 @@ <translation id="7575207903026901870">Botón Eliminar sugerencia, pulsa Intro para eliminar esta sugerencia</translation> <translation id="7577900504646297215">Gestionar intereses</translation> <translation id="7578104083680115302">Paga rápidamente en aplicaciones y sitios desde tus dispositivos utilizando las tarjetas que has guardado en Google.</translation> +<translation id="7579442726219254162">Variable desconocida "<ph name="VARIABLE" />" en la configuración gestionada de "<ph name="APPLICATION_ID" />".</translation> <translation id="7581199239021537589">Cara 2 del desplazamiento de la imagen en el eje Y</translation> <translation id="7582602800368606489">Crea un nuevo evento en Google Calendar rápidamente</translation> <translation id="7591288787774558753">¿Compartir contenido confidencial?</translation>
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb index c5c3380..949af6c7 100644 --- a/components/strings/components_strings_fr-CA.xtb +++ b/components/strings/components_strings_fr-CA.xtb
@@ -2084,6 +2084,7 @@ <translation id="7575207903026901870">Bouton Supprimer la suggestion, appuyez sur Entrée pour supprimer cette suggestion</translation> <translation id="7577900504646297215">Gérer les centres d'intérêt</translation> <translation id="7578104083680115302">Payez rapidement sur les sites et les applications, sur tous les appareils, à l'aide des cartes que vous avez enregistrées avec Google.</translation> +<translation id="7579442726219254162">Variable inconnue « <ph name="VARIABLE" /> » dans la configuration gérée de « <ph name="APPLICATION_ID" /> ».</translation> <translation id="7581199239021537589">Décalage Y de l'image côté 2</translation> <translation id="7582602800368606489">Créer rapidement un événement dans Google Agenda</translation> <translation id="7591288787774558753">Partager le contenu confidentiel?</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index ed63dc7..c065ac4 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -1997,7 +1997,7 @@ <translation id="7334320624316649418">&Rétablir la réorganisation</translation> <translation id="7335157162773372339">Peut demander à utiliser votre appareil photo</translation> <translation id="7337248890521463931">Afficher plus de lignes</translation> -<translation id="7337418456231055214">Le numéro de carte virtuelle n'est pas renseigné ? Cliquez sur les informations relatives à la carte pour les copier. <ph name="IDS_AUTOFILL_VIRTUAL_CARD_MANUAL_FALLBACK_BUBBLE_LEARN_MORE_LINK_LABEL" /></translation> +<translation id="7337418456231055214">Le numéro de carte virtuelle n'est pas renseigné ? Cliquez sur les informations de la carte pour les copier. <ph name="IDS_AUTOFILL_VIRTUAL_CARD_MANUAL_FALLBACK_BUBBLE_LEARN_MORE_LINK_LABEL" /></translation> <translation id="7337706099755338005">Non disponible sur votre plate-forme</translation> <translation id="733923710415886693">Le certificat du serveur n'a pas été communiqué tel que le prévoient les règles de transparence des certificats.</translation> <translation id="734600844861828519">11x15</translation> @@ -2094,6 +2094,7 @@ <translation id="7575207903026901870">Bouton "Supprimer la suggestion" (appuyez sur Entrée pour supprimer cette suggestion)</translation> <translation id="7577900504646297215">Gérer les centres d'intérêt</translation> <translation id="7578104083680115302">Payez rapidement sur des sites et dans des applications sur tous vos appareils au moyen de cartes que vous avez enregistrées sur Google.</translation> +<translation id="7579442726219254162">Variable inconnue "<ph name="VARIABLE" />" dans la configuration gérée de "<ph name="APPLICATION_ID" />".</translation> <translation id="7581199239021537589">Décalage Y de l'image côté 2</translation> <translation id="7582602800368606489">Créer rapidement un événement dans Google Agenda</translation> <translation id="7591288787774558753">Partager le contenu confidentiel ?</translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb index 3d4e427..6e4c506f 100644 --- a/components/strings/components_strings_gl.xtb +++ b/components/strings/components_strings_gl.xtb
@@ -2092,6 +2092,7 @@ <translation id="7575207903026901870">Botón Quitar suxestión, preme Intro para quitala</translation> <translation id="7577900504646297215">Xestionar intereses</translation> <translation id="7578104083680115302">Paga rapidamente en sitios e aplicacións en diferentes dispositivos usando as tarxetas que gardaches con Google.</translation> +<translation id="7579442726219254162">Variable descoñecida ("<ph name="VARIABLE" />") na configuración xestionada de "<ph name="APPLICATION_ID" />".</translation> <translation id="7581199239021537589">Desprazamento do lado 2 da imaxe no eixe Y</translation> <translation id="7582602800368606489">Crear rapidamente un evento novo en Google Calendar</translation> <translation id="7591288787774558753">Queres compartir contido confidencial?</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index 8254886e..94d5507c 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -2093,6 +2093,7 @@ <translation id="7575207903026901870">સૂચન કાઢી નાખો બટન, આ સૂચન કાઢી નાખવા માટે Enter દબાવો</translation> <translation id="7577900504646297215">રુચિઓ મેનેજ કરો</translation> <translation id="7578104083680115302">તમે Google સાથે સાચવેલાં કાર્ડનો ઉપયોગ કરીને બધા ડિવાઇસમાં સાઇટ અને ઍપ પર ઝડપથી ચુકવણી કરો.</translation> +<translation id="7579442726219254162">"<ph name="APPLICATION_ID" />"ના મેનેજ કરેલા કન્ફિગ્યુરેશનમાં અજાણ્યું ચલ "<ph name="VARIABLE" />".</translation> <translation id="7581199239021537589">બાજુ 2 છબીને Y અક્ષ પર ખસેડો</translation> <translation id="7582602800368606489">Google Calendarમાં ઝડપથી કોઈ નવી ઇવેન્ટ બનાવો</translation> <translation id="7591288787774558753">શું ગોપનીય કન્ટેન્ટ શેર કરીએ?</translation>
diff --git a/components/strings/components_strings_is.xtb b/components/strings/components_strings_is.xtb index 458eebf..b9e02471 100644 --- a/components/strings/components_strings_is.xtb +++ b/components/strings/components_strings_is.xtb
@@ -2093,6 +2093,7 @@ <translation id="7575207903026901870">Hnappur til að fjarlægja tillögu, ýttu á færslulykilinn til að fjarlægja þessa tillögu</translation> <translation id="7577900504646297215">Stjórna áhugamálum</translation> <translation id="7578104083680115302">Borgaðu með hraði á vefsvæðum og forritum úr öllum tækjum með því að nota greiðslukort sem þú hefur vistað hjá Google.</translation> +<translation id="7579442726219254162">Óþekkt breyta „<ph name="VARIABLE" />“ í stýrðri stillingu „<ph name="APPLICATION_ID" />“.</translation> <translation id="7581199239021537589">Y-færsla myndar á hlið 2</translation> <translation id="7582602800368606489">Búa til nýjan viðburð í Google dagatali á skjótan hátt</translation> <translation id="7591288787774558753">Deila trúnaðarupplýsingum?</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index ecd6f4a..fab32b8a 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -2096,6 +2096,7 @@ <translation id="7575207903026901870">הלחצן 'הסרת ההצעה', יש ללחוץ על Enter כדי להסיר את ההצעה הזו</translation> <translation id="7577900504646297215">ניהול תחומי עניין</translation> <translation id="7578104083680115302">ניתן לשלם במהירות באתרים ובאפליקציות בכל המכשירים באמצעות כרטיסים ששמרת ב-Google.</translation> +<translation id="7579442726219254162">משתנה לא ידוע '<ph name="VARIABLE" />' בהגדרות האישיות המנוהלות של '<ph name="APPLICATION_ID" />'.</translation> <translation id="7581199239021537589">הזזה של תמונה בצד 2 על ציר Y</translation> <translation id="7582602800368606489">יצירה מהירה של אירוע חדש ביומן Google</translation> <translation id="7591288787774558753">לשתף מידע סודי?</translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb index 44a8634b9..14b92246 100644 --- a/components/strings/components_strings_ka.xtb +++ b/components/strings/components_strings_ka.xtb
@@ -170,6 +170,7 @@ <translation id="1436185428532214179">შეუძლია თქვენს მოწყობილობაზე არსებული ფაილებისა და საქაღალდეების რედაქტირების თხოვნა</translation> <translation id="1442386063175183758">მარჯვნივ დაკეცვა ჭიშკრის ფორმით</translation> <translation id="1442987760062738829">გახვრეტა</translation> +<translation id="1446396933673057385">სიზუსტის შემოწმება</translation> <translation id="1447067628680007684">(x86_64)</translation> <translation id="1453974140256777690">თქვენ მიერ ჩასმული ან დართული ტექსტი გასაანალიზებლად გაეგზავნება Google Cloud-ს ან მესამე მხარეს. მაგალითად, შეიძლება შესრულდეს მისი სკანირება მასში სენსიტიური მონაცემების აღმოსაჩენად.</translation> <translation id="1455413310270022028">საშლელი</translation> @@ -456,6 +457,7 @@ <translation id="2318594867107319532">წესების ბოლო დროის ანაბეჭდი:</translation> <translation id="2328651992442742497">დაშვებულია (ნაგულისხმევად)</translation> <translation id="2329182534073751090">ფანჯრის განლაგება</translation> +<translation id="2329473609445770916">ეს საიტი განსაზღვრავს ინტერესებს, რომელთა გამოყენებაც შეუძლია სხვა საიტებს, რეკლამა რომ გაჩვენოთ</translation> <translation id="2330137317877982892"><ph name="CREDIT_CARD" />, ძალაშია <ph name="EXPIRATION_DATE_ABBR" />-მდე</translation> <translation id="2337852623177822836">პარამეტრს აკონტროლებს თქვენი ადმინისტრატორი</translation> <translation id="2340263603246777781"><ph name="ORIGIN" /> დაწყვილებას ითხოვს</translation> @@ -733,6 +735,7 @@ <translation id="3240683217920639535"><ph name="MANAGE_CHROME_THEMES_FOCUSED_FRIENDLY_MATCH_TEXT" />, თქვენი ბრაუზერის იერსახის მოსარგებად დააჭირეთ კლავიშს Tab, შემდეგ კი Enter-ს</translation> <translation id="3240791268468473923">უსაფრთხო გადახდისთვის საჭირო ავტორიზაციის მონაცემების არარსებობის ფურცელი გახსნილია</translation> <translation id="324180406144491771">„<ph name="HOST_NAME" />“-ის ბმულები დაბლოკილია</translation> +<translation id="3248611290851046188">ეს საიტი განსაზღვრავს ინტერესებს, რომელთა გამოყენებაც შეუძლია სხვა საიტებს, რეკლამა რომ გაჩვენოთ. გარდა ამისა, ეს საიტი Chrome-იდან იღებს ინფორმაციას თქვენი ინტერესების შესახებ, უფრო შესაფერისი რეკლამა რომ შემოგთავაზოთ.</translation> <translation id="3249845759089040423">სასიამოვნო</translation> <translation id="3252266817569339921">ფრანგული</translation> <translation id="3259648571731540213"><ph name="CREATE_GOOGLE_CALENDAR_EVENT_FOCUSED_FRIENDLY_MATCH_TEXT" />, Google Calendar-ში ახალი მოვლენის სწრაფად შესაქმნელად დააჭირეთ კლავიშს Tab, შემდეგ კი Enter-ს</translation> @@ -844,6 +847,7 @@ <translation id="3586931643579894722">დეტალების დამალვა</translation> <translation id="3587738293690942763">შუა</translation> <translation id="3592413004129370115">Italian (კონვერტი)</translation> +<translation id="3595645257662173296">რა ასაბუთებს?</translation> <translation id="3595699422137460894">{NUM_DAYS,plural, =0{თქვენი ჯგუფის გადაყენება ნებისმიერ დროს შეგიძლიათ. ახალ ჯგუფში გაწევრიანებს დაახლოებით ერთი დღე სჭირდება.}=1{თქვენი ჯგუფის გადაყენება ნებისმიერ დროს შეგიძლიათ. ახალ ჯგუფში გაწევრიანებს დაახლოებით ერთი დღე სჭირდება.}other{თქვენი ჯგუფის გადაყენება ნებისმიერ დროს შეგიძლიათ. ახალ ჯგუფში გაწევრიანებს დაახლოებით {NUM_DAYS} დღე სჭირდება.}}</translation> <translation id="3600246354004376029"><ph name="TITLE" />, <ph name="DOMAIN" />, <ph name="TIME" /></translation> <translation id="3603507503523709">აპლიკაცია დაბლოკილია თქვენი ადმინისტრატორის მიერ</translation> @@ -1654,6 +1658,7 @@ <translation id="6165508094623778733">შეიტყვეთ მეტი</translation> <translation id="6167577165590485365">მონაცემთა მიღების ბოლო მცდელობა:</translation> <translation id="6169916984152623906">ახლა ვების დათვალიერება კონფიდენციალურად შეგიძლიათ, რაც ნიშნავს, რომ ამ მოწყობილობის სხვა მომხმარებლები თქვენს აქტივობას ვერ იხილავენ. მიუხედავად ამისა, ჩამოტვირთული ფაილები და სანიშნეები მაინც შეინახება.</translation> +<translation id="6176716740821145453">დაფიქრდით სიზუსტეზე</translation> <translation id="6177128806592000436">თქვენი კავშირი ამ საიტთან დაცული არ არის</translation> <translation id="6180316780098470077">ხელახლა მცდელობის ინტერვალი</translation> <translation id="6196640612572343990">მესამე მხარის ქუქი-ჩანაწერების დაბლოკვა</translation> @@ -1777,6 +1782,7 @@ <translation id="6615297766614333076">სტეკერი 2</translation> <translation id="6624427990725312378">საკონტაქტო ინფორმაცია</translation> <translation id="6626291197371920147">მიუთითეთ ბარათის სწორი ნომერი</translation> +<translation id="6627727261837091711">რეკლამის პერსონალიზების დეტალების ჩვენება</translation> <translation id="6628463337424475685"><ph name="ENGINE" /> ძიება</translation> <translation id="6630043285902923878">მიმდინარეობს USB მოწყობილობების პოვნა…</translation> <translation id="6630809736994426279"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />-ზე ამჟამად მყოფმა თავდამსხმელებმა შეიძლება ცადონ თქვენს Mac-ზე ისეთი სახიფათო პროგრამების ინსტალაცია, რომლებსაც თქვენი ინფორმაციის (მაგალითად, ფოტოების, პაროლების, შეტყობინებების და საკრედიტო ბარათების მონაცემების) მოპარვა ან წაშლა შეუძლია. <ph name="BEGIN_LEARN_MORE_LINK" />შეიტყვეთ მეტი<ph name="END_LEARN_MORE_LINK" /></translation> @@ -2045,6 +2051,7 @@ <translation id="7473891865547856676">არა, გმადლობთ</translation> <translation id="7481312909269577407">გადამისამართება</translation> <translation id="7485870689360869515">მონაცემები ვერ მოიძებნა.</translation> +<translation id="7485948220959728508">ვის დგას ამ ინფორმაციის უკან?</translation> <translation id="7495528107193238112">ეს კონტენტი დაბლოკილია. დაუკავშირდით საიტის მფლობელს ამ პრობლემის მოსაგვარებლად.</translation> <translation id="7497998058912824456">დოკუმენტის შექმნის ღილაკი, ახალი Google Doc-ის სწრაფად შესაქმნელად დააჭირეთ კლავიშს Enter</translation> <translation id="7506488012654002225">Chromium-ის მიერ <ph name="BEGIN_EMPHASIS" />არ შეინახება<ph name="END_EMPHASIS" /> შემდეგი ინფორმაცია: @@ -2125,6 +2132,7 @@ <translation id="7682287625158474539">მიწოდება</translation> <translation id="7687186412095877299">შეავსებს ანგარიშსწორების ფორმებს გადახდის შენახული მეთოდების მონაცემებით</translation> <translation id="7687305263118037187">ხელახლა ცდის დროის ლიმიტი</translation> +<translation id="7687451951329798396">რას ამბობს სხვა წყაროები?</translation> <translation id="7693583928066320343">გვერდების მიმდევრობა მიღებულია</translation> <translation id="7697066736081121494">Prc8 (კონვერტი)</translation> <translation id="769721561045429135">ამჟამად თქვენ გაქვთ ბარათები, რომელთა გამოყენებაც შეგიძლიათ მხოლოდ ამ მოწყობილობაზე. ბარათების გადასახედად დააწკაპუნეთ „გაგრძელებაზე“.</translation> @@ -2368,6 +2376,7 @@ <translation id="8507227106804027148">ბრძანებათა სტრიქონი</translation> <translation id="8508648098325802031">ძიების ხატულა</translation> <translation id="8511402995811232419">ქუქი-ჩანაწერების მართვა</translation> +<translation id="851353418319061866">სიზუსტის შემოწმება</translation> <translation id="8519753333133776369">HID მოწყობილობა დაშვებულია თქვენი ადმინისტრატორის მიერ</translation> <translation id="8522552481199248698">Chrome-ს შეუძლია დაგეხმაროთ თქვენი Google ანგარიშის დაცვაში და პაროლის შეცვლაში.</translation> <translation id="8530813470445476232">გაასუფთავეთ დათვალიერების ისტორია, ქუქი-ჩანაწერები, ქეში და სხვა კონტენტი Chrome-ის პარამეტრებიდან</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index 75f6a05b1..53001a2 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -2094,6 +2094,7 @@ <translation id="7575207903026901870">Pašalinkite pasiūlymo mygtuką, paspauskite „Enter“, kad pašalintumėte šį pasiūlymą</translation> <translation id="7577900504646297215">Tvarkyti pomėgius</translation> <translation id="7578104083680115302">Greitai mokėkite svetainėse ir programose įvairiuose įrenginiuose naudodami korteles, kurias išsaugojote „Google“.</translation> +<translation id="7579442726219254162">Nežinomas kintamasis „<ph name="VARIABLE" />“ valdomoje „<ph name="APPLICATION_ID" />“ konfigūracijoje.</translation> <translation id="7581199239021537589">2 pusė: sukti vaizdą pagal Y ašį</translation> <translation id="7582602800368606489">Greitai sukurkite naują „Google“ kalendoriaus įvykį</translation> <translation id="7591288787774558753">Bendrinti konfidencialų turinį?</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index 644045e..d9c6fe9 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -2092,6 +2092,7 @@ <translation id="7575207903026901870">Ieteikuma noņemšanas poga, nospiediet ievadīšanas taustiņu, lai noņemtu šo ieteikumu</translation> <translation id="7577900504646297215">Pārvaldīt intereses</translation> <translation id="7578104083680115302">Ātri apmaksājiet pirkumus vietnēs un lietotnēs no dažādām ierīcēm, izmantojot kartes, ko esat saglabājis Google sistēmā.</translation> +<translation id="7579442726219254162">Nezināms mainīgais “<ph name="VARIABLE" />” lietojumprogrammas “<ph name="APPLICATION_ID" />” pārvaldītajā konfigurācijā.</translation> <translation id="7581199239021537589">2. puses attēla nobīde uz Y ass</translation> <translation id="7582602800368606489">Ātri izveidot jaunu pasākumu Google kalendārā</translation> <translation id="7591288787774558753">Vai kopīgot konfidenciālu saturu?</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index ef0c28c..45e8c0d 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -2093,6 +2093,7 @@ <translation id="7575207903026901870">Knappen Ta bort förslag, tryck på retur om du vill ta bort förslaget</translation> <translation id="7577900504646297215">Hantera intressen</translation> <translation id="7578104083680115302">Betala snabbt på webbplatser och i appar på olika enheter med kort som du har sparat hos Google.</translation> +<translation id="7579442726219254162">Okänd variabel, <ph name="VARIABLE" />, i den hanterade konfigurationen av <ph name="APPLICATION_ID" />.</translation> <translation id="7581199239021537589">Sida 2 bild Y – byte</translation> <translation id="7582602800368606489">Skapa en ny händelse i Google Kalender snabbt</translation> <translation id="7591288787774558753">Vill du dela konfidentiellt innehåll?</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index 41738b6..6f7dee43 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -2090,6 +2090,7 @@ <translation id="7575207903026901870">Ondoa kitufe cha Mapendekezo, bonyeza Enter ili uondoe pendekezo hili</translation> <translation id="7577900504646297215">Dhibiti yanayokuvutia</translation> <translation id="7578104083680115302">Lipa haraka kwenye tovuti na programu katika vifaa vyote ukitumia kadi ulizohifadhi kwenye Google.</translation> +<translation id="7579442726219254162">Thamani isiyojulikana "<ph name="VARIABLE" />" kwenye mipangilio iliyodhibitiwa ya"<ph name="APPLICATION_ID" />".</translation> <translation id="7581199239021537589">Ugeuzaji wa upande wa pili wa picha ya Y</translation> <translation id="7582602800368606489">Weka tukio jipya katika Kalenda ya Google kwa haraka</translation> <translation id="7591288787774558753">Ungependa kushiriki maudhui ya siri?</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index 913834555..6caf406 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -2083,6 +2083,7 @@ <translation id="7575207903026901870">ปุ่ม "นำคำแนะนำออก" กด Enter เพื่อนำคำแนะนำนี้ออก</translation> <translation id="7577900504646297215">จัดการความสนใจ</translation> <translation id="7578104083680115302">ชำระเงินบนเว็บไซต์และแอปในอุปกรณ์ต่างๆ ได้อย่างรวดเร็วด้วยบัตรที่คุณได้บันทึกไว้กับ Google</translation> +<translation id="7579442726219254162">มีตัวแปร "<ph name="VARIABLE" />" ซึ่งเป็นตัวแปรที่ไม่รู้จักในการกำหนดค่าที่มีการจัดการของ "<ph name="APPLICATION_ID" />"</translation> <translation id="7581199239021537589">เปลี่ยนตำแหน่งรูปภาพด้าน 2 ตามแกน Y</translation> <translation id="7582602800368606489">สร้างกิจกรรมใหม่ใน Google ปฏิทินอย่างรวดเร็ว</translation> <translation id="7591288787774558753">แชร์เนื้อหาที่เป็นความลับไหม</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index 1e18121a..90170cc 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -2086,6 +2086,7 @@ <translation id="7575207903026901870">Öneriyi Kaldır düğmesi, bu öneriyi kaldrımak için Enter tuşuna basın</translation> <translation id="7577900504646297215">İlgi alanlarını yönet</translation> <translation id="7578104083680115302">Google'a kaydettiğiniz kartları kullanarak farklı cihazlardan sitelerde ve uygulamalarda ödemelerinizi hızla yapabilirsiniz.</translation> +<translation id="7579442726219254162">"<ph name="APPLICATION_ID" />" uygulamasının yönetilen yapılandırmasında bilinmeyen "<ph name="VARIABLE" />" değişkeni.</translation> <translation id="7581199239021537589">Taraf 2 resim Y kayması</translation> <translation id="7582602800368606489">Google Takvim'de hızlıca yeni bir etkinlik oluşturun</translation> <translation id="7591288787774558753">Gizli içerik paylaşılsın mı?</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index 2ebc075..d724835a 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -2093,6 +2093,7 @@ <translation id="7575207903026901870">Кнопка видалення підказки: натисніть Enter, щоб видалити цю підказку</translation> <translation id="7577900504646297215">Керувати інтересами</translation> <translation id="7578104083680115302">Зберігайте картки в Google, щоб швидко платити на сайтах і в додатках на всіх своїх пристроях.</translation> +<translation id="7579442726219254162">Невідома змінна "<ph name="VARIABLE" />" у керованій конфігурації "<ph name="APPLICATION_ID" />".</translation> <translation id="7581199239021537589">Вертикальний зсув сторони 2 зображення</translation> <translation id="7582602800368606489">Швидко створюйте нові події в Google Календарі</translation> <translation id="7591288787774558753">Поділитися конфіденційним контентом?</translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb index 730e792..fe4b4e0 100644 --- a/components/strings/components_strings_ur.xtb +++ b/components/strings/components_strings_ur.xtb
@@ -2096,6 +2096,7 @@ <translation id="7575207903026901870">تجویز کا بٹن ہٹائیں، اس تجویز کو ہٹانے کے لیے Enter دبائیں</translation> <translation id="7577900504646297215">دلچسپیوں کا نظم کریں</translation> <translation id="7578104083680115302">Google کے ساتھ اپنے محفوظ کردہ کارڈز کا استعمال کر کے سبھی آلات پر موجود سائٹس اور ایپس پر جلدی سے ادائیگی کریں۔</translation> +<translation id="7579442726219254162">"<ph name="APPLICATION_ID" />" کی نظم کردہ کنفیگریشن میں نامعلوم متغیر "<ph name="VARIABLE" />"۔</translation> <translation id="7581199239021537589">سائیڈ 2 تصویر Y شفٹ</translation> <translation id="7582602800368606489">Google کیلنڈر میں تیزی سے ایک نیا ایونٹ تخلیق کریں</translation> <translation id="7591288787774558753">رازدارانہ مواد کا اشتراک کریں؟</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index 2ccd036..6b8f7a1 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -2079,6 +2079,7 @@ <translation id="7575207903026901870">“移除建议”按钮,按 Enter 键即可移除这项建议</translation> <translation id="7577900504646297215">管理我的兴趣</translation> <translation id="7578104083680115302">通过各种设备在网站和应用中购物时,您都可以使用 Google 为您保存的银行卡信息快速付款。</translation> +<translation id="7579442726219254162">“<ph name="APPLICATION_ID" />”的托管配置中包含未知变量“<ph name="VARIABLE" />”。</translation> <translation id="7581199239021537589">侧边 2,图片沿 Y 轴位移</translation> <translation id="7582602800368606489">在 Google 日历中快速创建新活动</translation> <translation id="7591288787774558753">共享机密内容?</translation>
diff --git a/components/sync/base/features.h b/components/sync/base/features.h index 849ff7e..4c81bbf 100644 --- a/components/sync/base/features.h +++ b/components/sync/base/features.h
@@ -46,8 +46,8 @@ base::FEATURE_DISABLED_BY_DEFAULT}; #if BUILDFLAG(IS_ANDROID) -inline constexpr base::Feature kSyncAndroidPromosRevamp{ - "SyncAndroidPromosRevamp", base::FEATURE_DISABLED_BY_DEFAULT}; +inline constexpr base::Feature kSyncAndroidPromosWithSingleButton{ + "SyncAndroidPromosWithSingleButton", base::FEATURE_DISABLED_BY_DEFAULT}; #endif // BUILDFLAG(IS_ANDROID) // Causes the sync engine to count a quota for commits of data types that can
diff --git a/components/sync/model/model_type_sync_bridge.cc b/components/sync/model/model_type_sync_bridge.cc index b6d63fac..626d46d2 100644 --- a/components/sync/model/model_type_sync_bridge.cc +++ b/components/sync/model/model_type_sync_bridge.cc
@@ -68,6 +68,13 @@ return 0U; } +sync_pb::EntitySpecifics ModelTypeSyncBridge::TrimRemoteSpecificsForCaching( + const sync_pb::EntitySpecifics& entity_specifics) { + // Clears all fields by default to avoid the memory and I/O overhead of an + // additional copy of the data. + return sync_pb::EntitySpecifics(); +} + ModelTypeChangeProcessor* ModelTypeSyncBridge::change_processor() { return change_processor_.get(); }
diff --git a/components/sync/model/model_type_sync_bridge.h b/components/sync/model/model_type_sync_bridge.h index b693aaa..734de00 100644 --- a/components/sync/model/model_type_sync_bridge.h +++ b/components/sync/model/model_type_sync_bridge.h
@@ -198,6 +198,17 @@ // SyncableService by other means. virtual size_t EstimateSyncOverheadMemoryUsage() const; + // Returns a copy of |entity_specifics| where fields that do not need to be + // preserved in EntityMetadata cache are cleared. This allows each data type + // to specify which fields are supported in the current version. This usually + // means all known proto fields (i.e. all except unknown proto fields synced + // from more recent versions of the browser) but not always, since there are + // cases where a proto field is defined, but its implementation is not + // complete yet or exists behind a feature flag. + // By default, empty EntitySpecifics is returned. + virtual sync_pb::EntitySpecifics TrimRemoteSpecificsForCaching( + const sync_pb::EntitySpecifics& entity_specifics); + // Needs to be informed about any model change occurring via Delete() and // Put(). The changing metadata should be stored to persistent storage // before or atomically with the model changes.
diff --git a/components/url_formatter/url_fixer_unittest.cc b/components/url_formatter/url_fixer_unittest.cc index f1048ee..73f44c80 100644 --- a/components/url_formatter/url_fixer_unittest.cc +++ b/components/url_formatter/url_fixer_unittest.cc
@@ -21,14 +21,6 @@ #include "url/gurl.h" #include "url/third_party/mozilla/url_parse.h" -namespace url { - -std::ostream& operator<<(std::ostream& os, const Component& part) { - return os << "(begin=" << part.begin << ", len=" << part.len << ")"; -} - -} // namespace url - struct SegmentCase { const std::string input; const std::string result;
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc index 076cc626..41de23d 100644 --- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -1865,7 +1865,14 @@ RunHtmlTest(FILE_PATH_LITERAL("fieldset.html")); } -IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityFigcaption) { +// TODO(crbug.com/1307316): failing on Linux bots. +#if BUILDFLAG(IS_LINUX) +#define MAYBE_AccessibilityFigcaption DISABLED_AccessibilityFigcaption +#else +#define MAYBE_AccessibilityFigcaption AccessibilityFigcaption +#endif +IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, + MAYBE_AccessibilityFigcaption) { RunHtmlTest(FILE_PATH_LITERAL("figcaption.html")); }
diff --git a/content/browser/aggregation_service/aggregatable_report.cc b/content/browser/aggregation_service/aggregatable_report.cc index 65ddd1a2..5186c877 100644 --- a/content/browser/aggregation_service/aggregatable_report.cc +++ b/content/browser/aggregation_service/aggregatable_report.cc
@@ -7,8 +7,10 @@ #include <stddef.h> #include <stdint.h> +#include <limits> #include <ostream> #include <string> +#include <type_traits> #include <utility> #include <vector> @@ -19,6 +21,7 @@ #include "base/json/json_string_value_serializer.h" #include "base/rand_util.h" #include "base/ranges/algorithm.h" +#include "base/strings/abseil_string_number_conversions.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/time/time.h" @@ -28,6 +31,7 @@ #include "content/browser/aggregation_service/aggregation_service_features.h" #include "content/browser/aggregation_service/public_key.h" #include "services/network/public/cpp/is_potentially_trustworthy.h" +#include "third_party/abseil-cpp/absl/numeric/int128.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/boringssl/src/include/openssl/hpke.h" #include "third_party/distributed_point_functions/code/dpf/distributed_point_function.h" @@ -151,15 +155,22 @@ } // TODO(crbug.com/1298196): Replace with `base::WriteBigEndian()` when available -std::vector<uint8_t> EncodeBucketForPayload(absl::uint128 bucket) { - std::vector<uint8_t> byte_string(sizeof(absl::uint128) / sizeof(uint8_t)); +template <typename T> +std::vector<uint8_t> EncodeIntegerForPayload(T integer) { + static_assert(sizeof(T) <= sizeof(absl::uint128), + "sizeof(T) <= sizeof(absl::uint128)"); + static_assert(!std::numeric_limits<T>::is_signed, + "!std::numeric_limits<T>::is_signed"); + static_assert(std::is_integral_v<T> || std::is_same_v<T, absl::uint128>, + "std::is_integral_v<T> || std::is_same_v<T, absl::uint128>"); + std::vector<uint8_t> byte_string(sizeof(T)); // Construct the vector in reverse to ensure network byte (big-endian) order. for (auto it = byte_string.rbegin(); it != byte_string.rend(); ++it) { - *it = static_cast<uint8_t>(bucket & 0xFF); - bucket >>= 8; + *it = static_cast<uint8_t>(integer & 0xFF); + integer >>= 8; } - DCHECK_EQ(bucket, 0); + DCHECK_EQ(integer, 0u); return byte_string; } @@ -176,8 +187,10 @@ for (AggregationServicePayloadContents::HistogramContribution contribution : payload_contents.contributions) { cbor::Value::MapValue data_map; - data_map.emplace("bucket", EncodeBucketForPayload(contribution.bucket)); - data_map.emplace("value", contribution.value); + data_map.emplace( + "bucket", EncodeIntegerForPayload<absl::uint128>(contribution.bucket)); + data_map.emplace("value", + EncodeIntegerForPayload<uint32_t>(contribution.value)); data.push_back(cbor::Value(std::move(data_map))); } value.emplace("data", std::move(data));
diff --git a/content/browser/aggregation_service/aggregatable_report.h b/content/browser/aggregation_service/aggregatable_report.h index 0190347a..0114ec3 100644 --- a/content/browser/aggregation_service/aggregatable_report.h +++ b/content/browser/aggregation_service/aggregatable_report.h
@@ -132,8 +132,8 @@ // { // "operation": "<chosen operation as string>", // "data": [{ - // "bucket": <128-bit integer encoded as a big-endian bytestring>, - // "value": <integer>, + // "bucket": <a 16-byte (i.e. 128-bit) big-endian bytestring>, + // "value": <a 4-byte (i.e. 32-bit) big-endian bytestring> // }, ...], // } // Note that the "data" array may contain multiple contributions.
diff --git a/content/browser/aggregation_service/aggregatable_report_unittest.cc b/content/browser/aggregation_service/aggregatable_report_unittest.cc index 8327263..bdc65db 100644 --- a/content/browser/aggregation_service/aggregatable_report_unittest.cc +++ b/content/browser/aggregation_service/aggregatable_report_unittest.cc
@@ -167,9 +167,17 @@ &bucket); EXPECT_EQ(bucket, expected_payload_contents.contributions[i].bucket); - ASSERT_TRUE(CborMapContainsKeyAndType(data_map, "value", - cbor::Value::Type::UNSIGNED)); - EXPECT_EQ(data_map.at(cbor::Value("value")).GetInteger(), + ASSERT_TRUE(CborMapContainsKeyAndType( + data_map, "value", cbor::Value::Type::BYTE_STRING)); + const cbor::Value::BinaryValue& value_byte_string = + data_map.at(cbor::Value("value")).GetBytestring(); + EXPECT_EQ(value_byte_string.size(), 4u); // 4 bytes = 32 bits + + // TODO(crbug.com/1298196): Replace with `base::ReadBigEndian()` when + // available. + uint32_t value; + base::HexStringToUInt(base::HexEncode(value_byte_string), &value); + EXPECT_EQ(static_cast<int64_t>(value), expected_payload_contents.contributions[i].value); }
diff --git a/content/browser/aggregation_service/aggregation_service_features.cc b/content/browser/aggregation_service/aggregation_service_features.cc index c332ed5..601afee 100644 --- a/content/browser/aggregation_service/aggregation_service_features.cc +++ b/content/browser/aggregation_service/aggregation_service_features.cc
@@ -8,11 +8,12 @@ // Enables the Aggregation Service. See crbug.com/1207974. const base::Feature kPrivacySandboxAggregationService = { - "PrivacySandboxAggregationService", base::FEATURE_DISABLED_BY_DEFAULT}; + "PrivacySandboxAggregationService", base::FEATURE_ENABLED_BY_DEFAULT}; const base::FeatureParam<std::string> kPrivacySandboxAggregationServiceTrustedServerUrlParam{ &kPrivacySandboxAggregationService, "trusted_server_url", - "https://server.example/.well-known/aggregation-service/keys.json"}; + "https://publickeyservice.aws.privacysandboxservices.com/v1alpha/" + "publicKeys"}; } // namespace content
diff --git a/content/browser/attribution_reporting/BUILD.gn b/content/browser/attribution_reporting/BUILD.gn index 59b0a96..72608ff 100644 --- a/content/browser/attribution_reporting/BUILD.gn +++ b/content/browser/attribution_reporting/BUILD.gn
@@ -18,13 +18,21 @@ { types = [ { - mojom = "content.mojom.AttributionReportID" + mojom = "content.mojom.AttributionReportAggregatableAttributionID" + cpp = "::content::AttributionReport::AggregatableAttributionData::Id" + }, + { + mojom = "content.mojom.AttributionReportEventLevelID" cpp = "::content::AttributionReport::EventLevelData::Id" }, { mojom = "content.mojom.AttributionSourceType" cpp = "::content::AttributionSourceType" }, + { + mojom = "content.mojom.AttributionReportType" + cpp = "::content::AttributionReport::ReportType" + }, ] traits_headers = [ "attribution_internals_mojom_traits.h",
diff --git a/content/browser/attribution_reporting/attribution_internals.mojom b/content/browser/attribution_reporting/attribution_internals.mojom index 140cd7dc..fb86e62 100644 --- a/content/browser/attribution_reporting/attribution_internals.mojom +++ b/content/browser/attribution_reporting/attribution_internals.mojom
@@ -13,23 +13,56 @@ kEvent, }; -struct AttributionReportID { +// Represents `AttributionReport::EventLevelData::Id`. +// Will be used to issue commands for individual reports. +struct AttributionReportEventLevelID { int64 value; }; +// Represents `AttributionReport::AggregatableAttributionData::Id`. +// Will be used to issue commands for individual reports. +struct AttributionReportAggregatableAttributionID { + int64 value; +}; + +// Contains event-level data to be displayed. +struct WebUIAttributionReportEventLevelData { + // Allows the WebUI to issue commands for individual reports. + // Not intended to be displayed. + AttributionReportEventLevelID? id; + int64 priority; + bool attributed_truthfully; +}; + +// Represents `AggregatableHistogramContribution`. +struct AttributionReportHistogramContribution { + uint64 key_high_bits; + uint64 key_low_bits; + uint32 value; +}; + +// Contains aggregatable attribution data to be displayed. +struct WebUIAttributionReportAggregatableAttributionData { + // Allows the WebUI to issue commands for individual reports. + // Not intended to be displayed. + AttributionReportAggregatableAttributionID? id; + array<AttributionReportHistogramContribution> contributions; +}; + +union WebUIAttributionReportData { + WebUIAttributionReportEventLevelData event_level_data; + WebUIAttributionReportAggregatableAttributionData + aggregatable_attribution_data; +}; + // Struct containing stored data that will be sent in a future attribution // report. struct WebUIAttributionReport { - // Allows the WebUI to issue commands for individual reports. - // Not intended to be displayed. - AttributionReportID? id; string attribution_destination; url.mojom.Url report_url; double trigger_time; double report_time; - int64 priority; string report_body; - bool attributed_truthfully; enum Status { kPending, @@ -44,12 +77,16 @@ kSent, kNetworkError, kNoMatchingSourceFilterData, + kFailedToAssemble, + kInsufficientAggregatableBudget, }; Status status; // Only valid if `status == kSent`. int32 http_response_code; + + WebUIAttributionReportData data; }; struct AttributionDebugKey { @@ -87,6 +124,12 @@ Attributability attributability; }; +// Represents `AttributionReport::ReportType`. +enum AttributionReportType { + kEventLevel, + kAggregatableAttribution, +}; + // Observer for events relevant to the attribution internals WebUI. interface AttributionInternalsObserver { // Called when the sources in storage changed, indicating that the observer @@ -95,7 +138,7 @@ // Called when the reports in storage changed, indicating that the observer // should call `AttributionInternalsHandler::GetReports()`. - OnReportsChanged(); + OnReportsChanged(AttributionReportType report_type); // Called when a source-registration attempt fails or a stored source is // deactivated. @@ -121,14 +164,21 @@ // due to reaching policy limits. GetActiveSources() => (array<WebUIAttributionSource> sources); - // Returns all reports contained in storage, including those that are actively - // being sent. - GetReports() => (array<WebUIAttributionReport> reports); + // Returns all reports of the specified type contained in storage, including + // those that are actively being sent. + GetReports(AttributionReportType report_type) => ( + array<WebUIAttributionReport> reports); - // Sends the given reports, ignoring delay, returning when the + // Sends the given event-level reports, ignoring delay, returning when the // operation has been completed and the reports have been cleared from // storage. - SendReports(array<AttributionReportID> ids) => (); + SendEventLevelReports(array<AttributionReportEventLevelID> ids) => (); + + // Sends the given aggregate reports, ignoring delay, returning when the + // operation has been completed and the reports have been cleared from + // storage. + SendAggregatableAttributionReports( + array<AttributionReportAggregatableAttributionID> ids) => (); // Deletes all persisted data for the attribution reporting API, returning when the // operation has been completed.
diff --git a/content/browser/attribution_reporting/attribution_internals_browsertest.cc b/content/browser/attribution_reporting/attribution_internals_browsertest.cc index 885750e..bee669d 100644 --- a/content/browser/attribution_reporting/attribution_internals_browsertest.cc +++ b/content/browser/attribution_reporting/attribution_internals_browsertest.cc
@@ -43,6 +43,7 @@ using ::testing::ElementsAre; using ::testing::IsNull; using ::testing::Return; +using ::testing::VariantWith; const char kAttributionInternalsUrl[] = "chrome://attribution-internals/"; @@ -53,23 +54,32 @@ const std::u16string kMaxInt64String = u"9223372036854775807"; const std::u16string kMaxUint64String = u"18446744073709551615"; -template <typename T> -auto InvokeCallback(T value) { - return [value = std::move(value)](base::OnceCallback<void(T)> callback) { +auto InvokeCallback(std::vector<StoredSource> value) { + return [value = std::move(value)]( + base::OnceCallback<void(std::vector<StoredSource>)> callback) { std::move(callback).Run(std::move(value)); }; } +auto InvokeCallback(std::vector<AttributionReport> value) { + return + [value = std::move(value)]( + AttributionReport::ReportType report_type, + base::OnceCallback<void(std::vector<AttributionReport>)> callback) { + std::move(callback).Run(std::move(value)); + }; +} + } // namespace class AttributionInternalsWebUiBrowserTest : public ContentBrowserTest { public: AttributionInternalsWebUiBrowserTest() { ON_CALL(manager_, GetActiveSourcesForWebUI) - .WillByDefault(InvokeCallback<std::vector<StoredSource>>({})); + .WillByDefault(InvokeCallback(std::vector<StoredSource>{})); ON_CALL(manager_, GetPendingReportsForInternalUse) - .WillByDefault(InvokeCallback<std::vector<AttributionReport>>({})); + .WillByDefault(InvokeCallback(std::vector<AttributionReport>{})); } void ClickRefreshButton() { @@ -224,7 +234,7 @@ // with `Number.MAX_SAFE_INTEGER`. ON_CALL(manager_, GetActiveSourcesForWebUI) - .WillByDefault(InvokeCallback<std::vector<StoredSource>>( + .WillByDefault(InvokeCallback( {SourceBuilder(now) .SetSourceEventId(std::numeric_limits<uint64_t>::max()) .SetAttributionLogic(StoredSource::AttributionLogic::kNever) @@ -408,7 +418,7 @@ /*http_response_code=*/0)); ON_CALL(manager_, GetPendingReportsForInternalUse) - .WillByDefault(InvokeCallback<std::vector<AttributionReport>>( + .WillByDefault(InvokeCallback( {ReportBuilder(AttributionInfoBuilder( SourceBuilder(now) .SetSourceType(AttributionSourceType::kEvent) @@ -493,8 +503,8 @@ AttributionInfoBuilder(SourceBuilder().BuildStored()).Build()) .Build()})); - // These shouldn't result in a row, as `CreateReportResult::dropped_report()` - // is null. + // These shouldn't result in a row, as `CreateReportResult::dropped_reports()` + // is empty. manager_.NotifyTriggerHandled(CreateReportResult( AttributionTrigger::EventLevelResult::kInternalError, AttributionTrigger::AggregatableResult::kNoHistograms)); @@ -637,8 +647,8 @@ .SetPriority(7) .Build(); EXPECT_CALL(manager_, GetPendingReportsForInternalUse) - .WillOnce(InvokeCallback<std::vector<AttributionReport>>({report})); - + .WillOnce(InvokeCallback({report})) + .WillOnce(InvokeCallback(std::vector<AttributionReport>{})); report.set_report_time(report.report_time() + base::Hours(1)); manager_.NotifyReportSent(report, /*is_debug_report=*/false, @@ -687,7 +697,7 @@ base::Time now = base::Time::Now(); ON_CALL(manager_, GetActiveSourcesForWebUI) - .WillByDefault(InvokeCallback<std::vector<StoredSource>>( + .WillByDefault(InvokeCallback( {SourceBuilder(now).SetSourceEventId(5).BuildStored()})); manager_.NotifySourceDeactivated(DeactivatedSource( @@ -742,20 +752,23 @@ EXPECT_TRUE(NavigateToURL(shell(), GURL(kAttributionInternalsUrl))); EXPECT_CALL(manager_, GetPendingReportsForInternalUse) - .WillOnce(InvokeCallback<std::vector<AttributionReport>>( + .WillOnce(InvokeCallback( {ReportBuilder( AttributionInfoBuilder(SourceBuilder().BuildStored()).Build()) .SetPriority(7) .SetReportId(AttributionReport::EventLevelData::Id(5)) .Build()})) - .WillOnce(InvokeCallback<std::vector<AttributionReport>>({})); + .WillOnce(InvokeCallback(std::vector<AttributionReport>{})) + .WillOnce(InvokeCallback(std::vector<AttributionReport>{})); - EXPECT_CALL(manager_, - SendReportsForWebUI( - ElementsAre(AttributionReport::EventLevelData::Id(5)), _)) - .WillOnce( - [](const std::vector<AttributionReport::EventLevelData::Id>& ids, - base::OnceClosure done) { std::move(done).Run(); }); + EXPECT_CALL( + manager_, + SendReportsForWebUI( + ElementsAre(VariantWith<AttributionReport::EventLevelData::Id>( + AttributionReport::EventLevelData::Id(5))), + _)) + .WillOnce([](const std::vector<AttributionReport::Id>& ids, + base::OnceClosure done) { std::move(done).Run(); }); OverrideWebUIAttributionManager(); @@ -787,7 +800,7 @@ // The real manager would do this itself, but the test manager requires manual // triggering. - manager_.NotifyReportsChanged(); + manager_.NotifyReportsChanged(AttributionReport::ReportType::kEventLevel); EXPECT_EQ(kSentTitle, sent_title_watcher.WaitAndGetTitle()); } @@ -814,4 +827,247 @@ } } +IN_PROC_BROWSER_TEST_F( + AttributionInternalsWebUiBrowserTest, + WebUIShownWithPendingAggregatableReports_ReportsDisplayed) { + EXPECT_TRUE(NavigateToURL(shell(), GURL(kAttributionInternalsUrl))); + + const base::Time now = base::Time::Now(); + + OverrideWebUIAttributionManager(); + + std::vector<AggregatableHistogramContribution> contributions{ + AggregatableHistogramContribution(1, 2)}; + + manager_.NotifyReportSent( + ReportBuilder( + AttributionInfoBuilder(SourceBuilder(now).BuildStored()).Build()) + .SetReportTime(now + base::Hours(3)) + .SetAggregatableHistogramContributions(contributions) + .BuildAggregatableAttribution(), + /*is_debug_report=*/false, + SendResult(SendResult::Status::kSent, + /*http_response_code=*/200)); + manager_.NotifyReportSent( + ReportBuilder( + AttributionInfoBuilder(SourceBuilder(now).BuildStored()).Build()) + .SetReportTime(now + base::Hours(4)) + .SetAggregatableHistogramContributions(contributions) + .BuildAggregatableAttribution(), + /*is_debug_report=*/false, + SendResult(SendResult::Status::kDropped, + /*http_response_code=*/0)); + manager_.NotifyReportSent( + ReportBuilder( + AttributionInfoBuilder(SourceBuilder(now).BuildStored()).Build()) + .SetReportTime(now + base::Hours(5)) + .SetAggregatableHistogramContributions(contributions) + .BuildAggregatableAttribution(), + /*is_debug_report=*/false, + SendResult(SendResult::Status::kFailedToAssemble, + /*http_response_code=*/0)); + manager_.NotifyReportSent( + ReportBuilder( + AttributionInfoBuilder(SourceBuilder(now).BuildStored()).Build()) + .SetReportTime(now + base::Hours(6)) + .SetAggregatableHistogramContributions(contributions) + .BuildAggregatableAttribution(), + /*is_debug_report=*/false, + SendResult(SendResult::Status::kFailure, + /*http_response_code=*/0)); + manager_.NotifyReportSent( + ReportBuilder( + AttributionInfoBuilder(SourceBuilder(now).BuildStored()).Build()) + .SetReportTime(now + base::Hours(10)) + .SetAggregatableHistogramContributions(contributions) + .BuildAggregatableAttribution(), + /*is_debug_report=*/true, + SendResult(SendResult::Status::kTransientFailure, + /*http_response_code=*/0)); + ON_CALL(manager_, GetPendingReportsForInternalUse) + .WillByDefault(InvokeCallback( + {ReportBuilder(AttributionInfoBuilder( + SourceBuilder(now) + .SetSourceType(AttributionSourceType::kEvent) + .BuildStored()) + .Build()) + .SetReportTime(now) + .SetAggregatableHistogramContributions(contributions) + .BuildAggregatableAttribution()})); + + manager_.NotifyTriggerHandled(CreateReportResult( + AttributionTrigger::EventLevelResult::kNoMatchingImpressions, + AttributionTrigger::AggregatableResult::kInsufficientBudget, + /*dropped_reports=*/ + {ReportBuilder( + AttributionInfoBuilder(SourceBuilder(now).BuildStored()).Build()) + .SetReportTime(now + base::Hours(1)) + .SetAggregatableHistogramContributions(contributions) + .BuildAggregatableAttribution()})); + + manager_.NotifyTriggerHandled(CreateReportResult( + AttributionTrigger::EventLevelResult::kNoMatchingImpressions, + AttributionTrigger::AggregatableResult:: + kNoCapacityForConversionDestination, + /*dropped_reports=*/ + {ReportBuilder( + AttributionInfoBuilder(SourceBuilder(now).BuildStored()).Build()) + .SetReportTime(now + base::Hours(2)) + .SetAggregatableHistogramContributions(contributions) + .BuildAggregatableAttribution()})); + + manager_.NotifyTriggerHandled(CreateReportResult( + AttributionTrigger::EventLevelResult::kNoMatchingImpressions, + AttributionTrigger::AggregatableResult::kExcessiveAttributions, + /*dropped_reports=*/ + {ReportBuilder( + AttributionInfoBuilder(SourceBuilder(now).BuildStored()).Build()) + .SetReportTime(now + base::Hours(7)) + .SetAggregatableHistogramContributions(contributions) + .BuildAggregatableAttribution()})); + + manager_.NotifyTriggerHandled(CreateReportResult( + AttributionTrigger::EventLevelResult::kNoMatchingImpressions, + AttributionTrigger::AggregatableResult::kExcessiveReportingOrigins, + /*dropped_reports=*/ + {ReportBuilder( + AttributionInfoBuilder(SourceBuilder(now).BuildStored()).Build()) + .SetReportTime(now + base::Hours(8)) + .SetAggregatableHistogramContributions(contributions) + .BuildAggregatableAttribution()})); + + manager_.NotifyTriggerHandled(CreateReportResult( + AttributionTrigger::EventLevelResult::kNoMatchingImpressions, + AttributionTrigger::AggregatableResult::kInternalError, + /*dropped_reports=*/ + {ReportBuilder( + AttributionInfoBuilder(SourceBuilder(now).BuildStored()).Build()) + .SetReportTime(now + base::Hours(9)) + .SetAggregatableHistogramContributions(contributions) + .BuildAggregatableAttribution()})); + + // This shouldn't result in a row, as a registration succeeded. + manager_.NotifyTriggerHandled(CreateReportResult( + AttributionTrigger::EventLevelResult::kNoMatchingImpressions, + AttributionTrigger::AggregatableResult::kSuccess, + /*dropped_reports=*/{}, + /*new_reports=*/ + {ReportBuilder( + AttributionInfoBuilder(SourceBuilder().BuildStored()).Build()) + .SetAggregatableHistogramContributions(contributions) + .BuildAggregatableAttribution()})); + + // These shouldn't result in a row, as `CreateReportResult::dropped_reports()` + // is empty. + manager_.NotifyTriggerHandled(CreateReportResult( + AttributionTrigger::EventLevelResult::kNoMatchingImpressions, + AttributionTrigger::AggregatableResult::kNoMatchingImpressions)); + manager_.NotifyTriggerHandled(CreateReportResult( + AttributionTrigger::EventLevelResult::kNoMatchingImpressions, + AttributionTrigger::AggregatableResult::kNoHistograms)); + + { + static constexpr char wait_script[] = R"( + let table = document.querySelector("#aggregatable-report-table-wrapper tbody"); + let obs = new MutationObserver(() => { + if (table.children.length === 11 && + table.children[0].children[2].innerText === "https://conversion.test" && + table.children[0].children[3].innerText === + "https://report.test/.well-known/attribution-reporting/report-aggregate-attribution" && + table.children[0].children[7].innerText === "Pending" && + table.children[1].children[7].innerText === "Dropped due to insufficient aggregatable budget" && + table.children[2].children[7].innerText === "No report capacity for destination site" && + table.children[3].children[7].innerText === "Sent: HTTP 200" && + table.children[4].children[7].innerText === "Prohibited by browser policy" && + table.children[5].children[7].innerText === "Dropped due to assembly failure" && + table.children[6].children[7].innerText === "Network error" && + table.children[7].children[7].innerText === "Dropped due to excessive attributions" && + table.children[8].children[7].innerText === "Dropped due to excessive reporting origins" && + table.children[9].children[7].innerText === "Internal error" && + table.children[10].children[3].innerText === + "https://report.test/.well-known/attribution-reporting/debug/report-aggregate-attribution") { + document.title = $1; + } + }); + obs.observe(table, {'childList': true});)"; + EXPECT_TRUE(ExecJsInWebUI(JsReplace(wait_script, kCompleteTitle))); + + TitleWatcher title_watcher(shell()->web_contents(), kCompleteTitle); + ClickRefreshButton(); + EXPECT_EQ(kCompleteTitle, title_watcher.WaitAndGetTitle()); + } +} + +IN_PROC_BROWSER_TEST_F(AttributionInternalsWebUiBrowserTest, + WebUISendAggregatableReports_ReportsRemoved) { + EXPECT_TRUE(NavigateToURL(shell(), GURL(kAttributionInternalsUrl))); + + EXPECT_CALL(manager_, GetPendingReportsForInternalUse) + .WillOnce(InvokeCallback(std::vector<AttributionReport>{})) + .WillOnce(InvokeCallback( + {ReportBuilder( + AttributionInfoBuilder(SourceBuilder().BuildStored()).Build()) + .SetReportId( + AttributionReport::AggregatableAttributionData::Id(5)) + .SetAggregatableHistogramContributions( + {AggregatableHistogramContribution(1, 2)}) + .BuildAggregatableAttribution()})) + .WillOnce(InvokeCallback(std::vector<AttributionReport>{})); + + EXPECT_CALL( + manager_, + SendReportsForWebUI( + ElementsAre( + VariantWith<AttributionReport::AggregatableAttributionData::Id>( + AttributionReport::AggregatableAttributionData::Id(5))), + _)) + .WillOnce([](const std::vector<AttributionReport::Id>& ids, + base::OnceClosure done) { std::move(done).Run(); }); + + OverrideWebUIAttributionManager(); + + static constexpr char wait_script[] = R"( + let table = document.querySelector("#aggregatable-report-table-wrapper tbody"); + let obs = new MutationObserver(() => { + if (table.children.length === 1) { + document.title = $1; + } + }); + obs.observe(table, {'childList': true});)"; + EXPECT_TRUE(ExecJsInWebUI(JsReplace(wait_script, kCompleteTitle))); + + // Wait for the table to rendered. + TitleWatcher title_watcher(shell()->web_contents(), kCompleteTitle); + ClickRefreshButton(); + EXPECT_EQ(kCompleteTitle, title_watcher.WaitAndGetTitle()); + + // Click the send reports button and expect that the report table is emptied. + const std::u16string kSentTitle = u"Sent"; + TitleWatcher sent_title_watcher(shell()->web_contents(), kSentTitle); + + static constexpr char kObserveEmptyReportsTableScript[] = R"( + let table = document.querySelector("#aggregatable-report-table-wrapper tbody"); + let obs = new MutationObserver(() => { + if (table.children.length === 1 && + table.children[0].children[0].innerText === "No sent or pending reports.") { + document.title = $1; + } + }); + obs.observe(table, {'childList': true});)"; + EXPECT_TRUE( + ExecJsInWebUI(JsReplace(kObserveEmptyReportsTableScript, kSentTitle))); + + EXPECT_TRUE(ExecJsInWebUI( + R"(document.querySelectorAll('input[type="checkbox"]')[1].click();)")); + EXPECT_TRUE(ExecJsInWebUI( + "document.getElementById('send-aggregatable-reports').click();")); + + // The real manager would do this itself, but the test manager requires manual + // triggering. + manager_.NotifyReportsChanged( + AttributionReport::ReportType::kAggregatableAttribution); + + EXPECT_EQ(kSentTitle, sent_title_watcher.WaitAndGetTitle()); +} + } // namespace content
diff --git a/content/browser/attribution_reporting/attribution_internals_handler_impl.cc b/content/browser/attribution_reporting/attribution_internals_handler_impl.cc index 0720adc..a8d92d86 100644 --- a/content/browser/attribution_reporting/attribution_internals_handler_impl.cc +++ b/content/browser/attribution_reporting/attribution_internals_handler_impl.cc
@@ -4,6 +4,7 @@ #include "content/browser/attribution_reporting/attribution_internals_handler_impl.h" +#include <iterator> #include <utility> #include <vector> @@ -11,6 +12,7 @@ #include "base/callback_helpers.h" #include "base/command_line.h" #include "base/notreached.h" +#include "base/ranges/algorithm.h" #include "base/time/time.h" #include "content/browser/attribution_reporting/attribution_info.h" #include "content/browser/attribution_reporting/attribution_manager_provider.h" @@ -28,6 +30,7 @@ #include "content/public/browser/web_ui.h" #include "content/public/common/content_client.h" #include "content/public/common/content_switches.h" +#include "third_party/abseil-cpp/absl/numeric/int128.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/abseil-cpp/absl/types/variant.h" @@ -89,21 +92,48 @@ bool is_debug_report, int http_response_code, mojom::WebUIAttributionReport::Status status) { - const auto* data = - absl::get_if<AttributionReport::EventLevelData>(&report.data()); - DCHECK(data); + struct Visitor { + StoredSource::AttributionLogic attribution_logic; + + mojom::WebUIAttributionReportDataPtr operator()( + const AttributionReport::EventLevelData& event_level_data) { + return mojom::WebUIAttributionReportData::NewEventLevelData( + mojom::WebUIAttributionReportEventLevelData::New( + event_level_data.id, event_level_data.priority, + attribution_logic == + StoredSource::AttributionLogic::kTruthfully)); + } + + mojom::WebUIAttributionReportDataPtr operator()( + const AttributionReport::AggregatableAttributionData& + aggregatable_data) { + std::vector<mojom::AttributionReportHistogramContributionPtr> + contributions; + base::ranges::transform( + aggregatable_data.contributions, std::back_inserter(contributions), + [](const auto& contribution) { + return mojom::AttributionReportHistogramContribution::New( + absl::Uint128High64(contribution.key()), + absl::Uint128Low64(contribution.key()), contribution.value()); + }); + return mojom::WebUIAttributionReportData::NewAggregatableAttributionData( + mojom::WebUIAttributionReportAggregatableAttributionData::New( + aggregatable_data.id, std::move(contributions))); + } + }; + const AttributionInfo& attribution_info = report.attribution_info(); + + mojom::WebUIAttributionReportDataPtr data = absl::visit( + Visitor{.attribution_logic = attribution_info.source.attribution_logic()}, + report.data()); return mojom::WebUIAttributionReport::New( - data->id, attribution_info.source.common_info().ConversionDestination().Serialize(), report.ReportURL(is_debug_report), /*trigger_time=*/attribution_info.time.ToJsTime(), - /*report_time=*/report.report_time().ToJsTime(), data->priority, + /*report_time=*/report.report_time().ToJsTime(), SerializeAttributionJson(report.ReportBody(), /*pretty_print=*/true), - /*attributed_truthfully=*/ - attribution_info.source.attribution_logic() == - StoredSource::AttributionLogic::kTruthfully, - status, http_response_code); + status, http_response_code, std::move(data)); } void ForwardReportsToWebUI( @@ -159,19 +189,37 @@ } void AttributionInternalsHandlerImpl::GetReports( + AttributionReport::ReportType report_type, mojom::AttributionInternalsHandler::GetReportsCallback callback) { if (AttributionManager* manager = manager_provider_->GetManager(web_ui_->GetWebContents())) { manager->GetPendingReportsForInternalUse( + report_type, base::BindOnce(&ForwardReportsToWebUI, std::move(callback))); } else { std::move(callback).Run({}); } } -void AttributionInternalsHandlerImpl::SendReports( +void AttributionInternalsHandlerImpl::SendEventLevelReports( const std::vector<AttributionReport::EventLevelData::Id>& ids, - mojom::AttributionInternalsHandler::SendReportsCallback callback) { + mojom::AttributionInternalsHandler::SendEventLevelReportsCallback + callback) { + SendReports(std::vector<AttributionReport::Id>(ids.begin(), ids.end()), + std::move(callback)); +} + +void AttributionInternalsHandlerImpl::SendAggregatableAttributionReports( + const std::vector<AttributionReport::AggregatableAttributionData::Id>& ids, + mojom::AttributionInternalsHandler:: + SendAggregatableAttributionReportsCallback callback) { + SendReports(std::vector<AttributionReport::Id>(ids.begin(), ids.end()), + std::move(callback)); +} + +void AttributionInternalsHandlerImpl::SendReports( + const std::vector<AttributionReport::Id> ids, + base::OnceClosure callback) { if (AttributionManager* manager = manager_provider_->GetManager(web_ui_->GetWebContents())) { manager->SendReportsForWebUI(ids, std::move(callback)); @@ -212,9 +260,10 @@ observer->OnSourcesChanged(); } -void AttributionInternalsHandlerImpl::OnReportsChanged() { +void AttributionInternalsHandlerImpl::OnReportsChanged( + AttributionReport::ReportType report_type) { for (auto& observer : observers_) - observer->OnReportsChanged(); + observer->OnReportsChanged(report_type); } void AttributionInternalsHandlerImpl::OnSourceDeactivated( @@ -268,12 +317,6 @@ const AttributionReport& report, bool is_debug_report, const SendResult& info) { - // TODO(crbug.com/1285317): Show aggregatable reports in internal page. - if (!absl::holds_alternative<AttributionReport::EventLevelData>( - report.data())) { - return; - } - mojom::WebUIAttributionReport::Status status; switch (info.status) { case SendResult::Status::kSent: @@ -288,8 +331,8 @@ status = mojom::WebUIAttributionReport::Status::kNetworkError; break; case SendResult::Status::kFailedToAssemble: - NOTREACHED(); - return; + status = mojom::WebUIAttributionReport::Status::kFailedToAssemble; + break; } auto web_report = WebUIAttributionReport(report, is_debug_report, @@ -333,19 +376,56 @@ } } +absl::optional<mojom::WebUIAttributionReport::Status> GetDroppedReportStatus( + AttributionTrigger::AggregatableResult status) { + switch (status) { + case AttributionTrigger::AggregatableResult::kExcessiveAttributions: + return mojom::WebUIAttributionReport::Status:: + kDroppedDueToExcessiveAttributions; + case AttributionTrigger::AggregatableResult::kExcessiveReportingOrigins: + return mojom::WebUIAttributionReport::Status:: + kDroppedDueToExcessiveReportingOrigins; + case AttributionTrigger::AggregatableResult:: + kNoCapacityForConversionDestination: + return mojom::WebUIAttributionReport::Status:: + kNoReportCapacityForDestinationSite; + case AttributionTrigger::AggregatableResult::kNoMatchingSourceFilterData: + return mojom::WebUIAttributionReport::Status::kNoMatchingSourceFilterData; + case AttributionTrigger::AggregatableResult::kInsufficientBudget: + return mojom::WebUIAttributionReport::Status:: + kInsufficientAggregatableBudget; + case AttributionTrigger::AggregatableResult::kInternalError: + return mojom::WebUIAttributionReport::Status::kInternalError; + case AttributionTrigger::AggregatableResult::kSuccess: + case AttributionTrigger::AggregatableResult::kNoHistograms: + case AttributionTrigger::AggregatableResult::kNoMatchingImpressions: + // TODO(apaseltiner): Surface `kNoMatchingImpressions` in internals UI. + // TODO(linnan): Surface `kNoHistograms` in internals UI. + return absl::nullopt; + } +} + } // namespace void AttributionInternalsHandlerImpl::OnTriggerHandled( const CreateReportResult& result) { for (const AttributionReport& dropped_report : result.dropped_reports()) { - // TODO(crbug.com/1285317): Support aggregatable report in internal UI. - if (!absl::holds_alternative<AttributionReport::EventLevelData>( - dropped_report.data())) { - continue; - } + struct Visitor { + const CreateReportResult& result; + + absl::optional<mojom::WebUIAttributionReport::Status> operator()( + const AttributionReport::EventLevelData&) { + return GetDroppedReportStatus(result.event_level_status()); + } + + absl::optional<mojom::WebUIAttributionReport::Status> operator()( + const AttributionReport::AggregatableAttributionData&) { + return GetDroppedReportStatus(result.aggregatable_status()); + } + }; absl::optional<mojom::WebUIAttributionReport::Status> status = - GetDroppedReportStatus(result.event_level_status()); + absl::visit(Visitor{.result = result}, dropped_report.data()); DCHECK(status.has_value()); auto report =
diff --git a/content/browser/attribution_reporting/attribution_internals_handler_impl.h b/content/browser/attribution_reporting/attribution_internals_handler_impl.h index de81c2ff..6c39d56 100644 --- a/content/browser/attribution_reporting/attribution_internals_handler_impl.h +++ b/content/browser/attribution_reporting/attribution_internals_handler_impl.h
@@ -50,11 +50,17 @@ mojom::AttributionInternalsHandler::GetActiveSourcesCallback callback) override; void GetReports( + AttributionReport::ReportType report_type, mojom::AttributionInternalsHandler::GetReportsCallback callback) override; - void SendReports( + void SendEventLevelReports( const std::vector<AttributionReport::EventLevelData::Id>& ids, - mojom::AttributionInternalsHandler::SendReportsCallback callback) - override; + mojom::AttributionInternalsHandler::SendEventLevelReportsCallback + callback) override; + void SendAggregatableAttributionReports( + const std::vector<AttributionReport::AggregatableAttributionData::Id>& + ids, + mojom::AttributionInternalsHandler:: + SendAggregatableAttributionReportsCallback callback) override; void ClearStorage(mojom::AttributionInternalsHandler::ClearStorageCallback callback) override; void AddObserver( @@ -68,7 +74,7 @@ private: // AttributionObserver: void OnSourcesChanged() override; - void OnReportsChanged() override; + void OnReportsChanged(AttributionReport::ReportType report_type) override; void OnSourceDeactivated( const DeactivatedSource& deactivated_source) override; void OnSourceHandled(const StorableSource& source, @@ -78,6 +84,9 @@ const SendResult& info) override; void OnTriggerHandled(const CreateReportResult& result) override; + void SendReports(const std::vector<AttributionReport::Id> ids, + base::OnceClosure callback); + raw_ptr<WebUI> web_ui_; std::unique_ptr<AttributionManagerProvider> manager_provider_;
diff --git a/content/browser/attribution_reporting/attribution_internals_mojom_traits.cc b/content/browser/attribution_reporting/attribution_internals_mojom_traits.cc index 9008eae..f24efdb6 100644 --- a/content/browser/attribution_reporting/attribution_internals_mojom_traits.cc +++ b/content/browser/attribution_reporting/attribution_internals_mojom_traits.cc
@@ -7,12 +7,24 @@ namespace mojo { // static -bool StructTraits<content::mojom::AttributionReportIDDataView, +bool StructTraits<content::mojom::AttributionReportEventLevelIDDataView, content::AttributionReport::EventLevelData::Id>:: - Read(content::mojom::AttributionReportIDDataView data, + Read(content::mojom::AttributionReportEventLevelIDDataView data, content::AttributionReport::EventLevelData::Id* out) { *out = content::AttributionReport::EventLevelData::Id(data.value()); return true; } +// static +bool StructTraits< + content::mojom::AttributionReportAggregatableAttributionIDDataView, + content::AttributionReport::AggregatableAttributionData::Id>:: + Read( + content::mojom::AttributionReportAggregatableAttributionIDDataView data, + content::AttributionReport::AggregatableAttributionData::Id* out) { + *out = + content::AttributionReport::AggregatableAttributionData::Id(data.value()); + return true; +} + } // namespace mojo
diff --git a/content/browser/attribution_reporting/attribution_internals_mojom_traits.h b/content/browser/attribution_reporting/attribution_internals_mojom_traits.h index bec6fd2..b71a570 100644 --- a/content/browser/attribution_reporting/attribution_internals_mojom_traits.h +++ b/content/browser/attribution_reporting/attribution_internals_mojom_traits.h
@@ -45,7 +45,36 @@ }; template <> -class StructTraits<content::mojom::AttributionReportIDDataView, +class EnumTraits<content::mojom::AttributionReportType, + content::AttributionReport::ReportType> { + public: + static content::mojom::AttributionReportType ToMojom( + content::AttributionReport::ReportType input) { + switch (input) { + case content::AttributionReport::ReportType::kEventLevel: + return content::mojom::AttributionReportType::kEventLevel; + case content::AttributionReport::ReportType::kAggregatableAttribution: + return content::mojom::AttributionReportType::kAggregatableAttribution; + } + } + + static bool FromMojom(content::mojom::AttributionReportType input, + content::AttributionReport::ReportType* out) { + switch (input) { + case content::mojom::AttributionReportType::kEventLevel: + *out = content::AttributionReport::ReportType::kEventLevel; + break; + case content::mojom::AttributionReportType::kAggregatableAttribution: + *out = content::AttributionReport::ReportType::kAggregatableAttribution; + break; + } + + return true; + } +}; + +template <> +class StructTraits<content::mojom::AttributionReportEventLevelIDDataView, content::AttributionReport::EventLevelData::Id> { public: static int64_t value( @@ -53,10 +82,25 @@ return *id; } - static bool Read(content::mojom::AttributionReportIDDataView data, + static bool Read(content::mojom::AttributionReportEventLevelIDDataView data, content::AttributionReport::EventLevelData::Id* out); }; +template <> +class StructTraits< + content::mojom::AttributionReportAggregatableAttributionIDDataView, + content::AttributionReport::AggregatableAttributionData::Id> { + public: + static int64_t value( + const content::AttributionReport::AggregatableAttributionData::Id& id) { + return *id; + } + + static bool Read( + content::mojom::AttributionReportAggregatableAttributionIDDataView data, + content::AttributionReport::AggregatableAttributionData::Id* out); +}; + } // namespace mojo #endif // CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_INTERNALS_MOJOM_TRAITS_H_
diff --git a/content/browser/attribution_reporting/attribution_manager.h b/content/browser/attribution_reporting/attribution_manager.h index 55aa9dad..312a449 100644 --- a/content/browser/attribution_reporting/attribution_manager.h +++ b/content/browser/attribution_reporting/attribution_manager.h
@@ -55,12 +55,13 @@ // Get all pending reports that are currently stored in this partition. Used // for populating WebUI and simulator. virtual void GetPendingReportsForInternalUse( + AttributionReport::ReportType report_type, base::OnceCallback<void(std::vector<AttributionReport>)> callback) = 0; // Sends the given reports immediately, and runs |done| once they have all // been sent. virtual void SendReportsForWebUI( - const std::vector<AttributionReport::EventLevelData::Id>& ids, + const std::vector<AttributionReport::Id>& ids, base::OnceClosure done) = 0; // Deletes all data in storage for URLs matching |filter|, between
diff --git a/content/browser/attribution_reporting/attribution_manager_impl.cc b/content/browser/attribution_reporting/attribution_manager_impl.cc index ca43e6494..7c0416e 100644 --- a/content/browser/attribution_reporting/attribution_manager_impl.cc +++ b/content/browser/attribution_reporting/attribution_manager_impl.cc
@@ -16,6 +16,7 @@ #include "base/command_line.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" +#include "base/notreached.h" #include "base/ranges/algorithm.h" #include "base/task/lazy_thread_pool_task_runner.h" #include "base/time/time.h" @@ -120,6 +121,10 @@ } } +AttributionReport::ReportType GetReportType(AttributionReport::Id report_id) { + return static_cast<AttributionReport::ReportType>(report_id.index()); +} + void RecordAssembleAggregatableReportStatus( AssembleAggregatableReportStatus status) { base::UmaHistogramEnumeration( @@ -503,7 +508,7 @@ // Sources are changed here because storing a report can cause sources to be // deleted or become associated with a dedup key. NotifySourcesChanged(); - NotifyReportsChanged(); + NotifyReportsChanged(AttributionReport::ReportType::kEventLevel); } for (auto& observer : observers_) @@ -534,16 +539,17 @@ } void AttributionManagerImpl::GetPendingReportsForInternalUse( + AttributionReport::ReportType report_type, base::OnceCallback<void(std::vector<AttributionReport>)> callback) { - // TODO(crbug.com/1285317): Show aggregatable reports in internal page. - - attribution_storage_.AsyncCall(&AttributionStorage::GetEventLevelReports) - .WithArgs(/*max_report_time=*/base::Time::Max(), /*limit=*/1000) + attribution_storage_.AsyncCall(&AttributionStorage::GetAttributionReports) + .WithArgs( + /*max_report_time=*/base::Time::Max(), /*limit=*/1000, + AttributionReport::ReportTypes{report_type}) .Then(std::move(callback)); } void AttributionManagerImpl::SendReportsForWebUI( - const std::vector<AttributionReport::EventLevelData::Id>& ids, + const std::vector<AttributionReport::Id>& ids, base::OnceClosure done) { attribution_storage_.AsyncCall(&AttributionStorage::GetReports) .WithArgs(ids) @@ -566,7 +572,10 @@ if (manager) { manager->scheduler_.Refresh(); manager->NotifySourcesChanged(); - manager->NotifyReportsChanged(); + manager->NotifyReportsChanged( + AttributionReport::ReportType::kEventLevel); + manager->NotifyReportsChanged( + AttributionReport::ReportType::kAggregatableAttribution); } }, std::move(done), weak_factory_.GetWeakPtr())); @@ -582,7 +591,10 @@ // TODO(apaseltiner): Consider limiting the number of reports being sent at // once, to avoid pulling an arbitrary number of reports into memory. attribution_storage_.AsyncCall(&AttributionStorage::GetAttributionReports) - .WithArgs(/*max_report_time=*/base::Time::Now(), /*limit=*/-1) + .WithArgs(/*max_report_time=*/base::Time::Now(), /*limit=*/-1, + AttributionReport::ReportTypes{ + AttributionReport::ReportType::kEventLevel, + AttributionReport::ReportType::kAggregatableAttribution}) .Then(base::BindOnce(&AttributionManagerImpl::OnGetReportsToSend, weak_factory_.GetWeakPtr())); } @@ -718,7 +730,7 @@ if (manager && success) { manager->MarkReportCompleted(report_id); manager->scheduler_.ScheduleSend(new_report_time); - manager->NotifyReportsChanged(); + manager->NotifyReportsChanged(GetReportType(report_id)); } }, std::move(done), weak_factory_.GetWeakPtr(), *report.ReportId(), @@ -734,7 +746,7 @@ if (manager && success) { manager->MarkReportCompleted(report_id); - manager->NotifyReportsChanged(); + manager->NotifyReportsChanged(GetReportType(report_id)); } }, std::move(done), weak_factory_.GetWeakPtr(), *report.ReportId())); @@ -856,9 +868,10 @@ observer.OnSourcesChanged(); } -void AttributionManagerImpl::NotifyReportsChanged() { +void AttributionManagerImpl::NotifyReportsChanged( + AttributionReport::ReportType report_type) { for (auto& observer : observers_) - observer.OnReportsChanged(); + observer.OnReportsChanged(report_type); } void AttributionManagerImpl::NotifySourceDeactivated(
diff --git a/content/browser/attribution_reporting/attribution_manager_impl.h b/content/browser/attribution_reporting/attribution_manager_impl.h index 7ea13df..97d09307b 100644 --- a/content/browser/attribution_reporting/attribution_manager_impl.h +++ b/content/browser/attribution_reporting/attribution_manager_impl.h
@@ -89,11 +89,11 @@ void GetActiveSourcesForWebUI( base::OnceCallback<void(std::vector<StoredSource>)> callback) override; void GetPendingReportsForInternalUse( + AttributionReport::ReportType report_type, base::OnceCallback<void(std::vector<AttributionReport>)> callback) override; - void SendReportsForWebUI( - const std::vector<AttributionReport::EventLevelData::Id>& ids, - base::OnceClosure done) override; + void SendReportsForWebUI(const std::vector<AttributionReport::Id>& ids, + base::OnceClosure done) override; void ClearData(base::Time delete_begin, base::Time delete_end, base::RepeatingCallback<bool(const url::Origin&)> filter, @@ -159,7 +159,7 @@ void MaybeSendDebugReport(AttributionReport&&); void NotifySourcesChanged(); - void NotifyReportsChanged(); + void NotifyReportsChanged(AttributionReport::ReportType report_type); void NotifySourceDeactivated(const DeactivatedSource& source); void NotifyReportSent(bool is_debug_report, AttributionReport, SendResult);
diff --git a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc index 20e8328..4bd5362c 100644 --- a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc +++ b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc
@@ -105,7 +105,10 @@ public: MOCK_METHOD(void, OnSourcesChanged, (), (override)); - MOCK_METHOD(void, OnReportsChanged, (), (override)); + MOCK_METHOD(void, + OnReportsChanged, + (AttributionReport::ReportType report_type), + (override)); MOCK_METHOD(void, OnSourceHandled, @@ -886,10 +889,8 @@ EXPECT_THAT(reports, SizeIs(1)); EXPECT_THAT(report_sender_->calls(), IsEmpty()); - attribution_manager_->SendReportsForWebUI( - {*(absl::get<AttributionReport::EventLevelData>(reports.front().data()) - .id)}, - base::DoNothing()); + attribution_manager_->SendReportsForWebUI({*reports.front().ReportId()}, + base::DoNothing()); task_environment_.FastForwardBy(base::TimeDelta()); EXPECT_THAT(report_sender_->calls(), SizeIs(1)); } @@ -907,10 +908,7 @@ EXPECT_THAT(report_sender_->calls(), IsEmpty()); attribution_manager_->SendReportsForWebUI( - {*(absl::get<AttributionReport::EventLevelData>(reports.front().data()) - .id), - *(absl::get<AttributionReport::EventLevelData>(reports.back().data()) - .id)}, + {*reports.front().ReportId(), *reports.back().ReportId()}, base::BindLambdaForTesting([&]() { callback_calls++; })); task_environment_.FastForwardBy(base::TimeDelta()); EXPECT_THAT(report_sender_->calls(), SizeIs(2)); @@ -1204,7 +1202,7 @@ observation.Observe(attribution_manager_.get()); EXPECT_CALL(observer, OnSourcesChanged); - EXPECT_CALL(observer, OnReportsChanged); + EXPECT_CALL(observer, OnReportsChanged).Times(2); base::RunLoop run_loop; attribution_manager_->ClearData( @@ -1742,11 +1740,12 @@ attribution_manager_->HandleSource(SourceBuilder().Build()); const auto aggregatable_attribution = - ReportBuilder( - AttributionInfoBuilder( - SourceBuilder().SetSourceId(StoredSource::Id(1)).BuildStored()) - .SetTime(base::Time::Now()) - .Build()) + ReportBuilder(AttributionInfoBuilder(SourceBuilder() + .SetSourceId(StoredSource::Id(1)) + .SetDefaultFilterData() + .BuildStored()) + .SetTime(base::Time::Now()) + .Build()) .SetReportTime(base::Time::Now() + base::Hours(1)) .SetAggregatableHistogramContributions( {AggregatableHistogramContribution(/*key=*/1, /*value=*/2)}) @@ -1754,6 +1753,14 @@ attribution_manager_->AddAggregatableAttributionForTesting( aggregatable_attribution); + MockAttributionObserver observer; + base::ScopedObservation<AttributionManager, AttributionObserver> observation( + &observer); + observation.Observe(attribution_manager_.get()); + + EXPECT_CALL(observer, OnReportSent(aggregatable_attribution, + /*is_debug_report=*/false, _)); + // Make sure the report is not sent earlier than its report time. task_environment_.FastForwardBy(base::Hours(1) - base::Microseconds(1)); EXPECT_THAT(aggregation_service_->calls(), IsEmpty()); @@ -1802,7 +1809,7 @@ aggregation_service_->RunCallback( 0, absl::nullopt, AggregationService::AssemblyStatus::kAssemblyFailed); - EXPECT_THAT(report_sender_->calls(), SizeIs(0)); + EXPECT_THAT(report_sender_->calls(), IsEmpty()); // kAssembleReportFailed = 3. histograms.ExpectUniqueSample(
diff --git a/content/browser/attribution_reporting/attribution_observer.h b/content/browser/attribution_reporting/attribution_observer.h index 7247f49..3ef5fb4 100644 --- a/content/browser/attribution_reporting/attribution_observer.h +++ b/content/browser/attribution_reporting/attribution_observer.h
@@ -6,11 +6,11 @@ #define CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_OBSERVER_H_ #include "base/observer_list_types.h" +#include "content/browser/attribution_reporting/attribution_report.h" #include "content/browser/attribution_reporting/storable_source.h" namespace content { -class AttributionReport; class CreateReportResult; struct DeactivatedSource; @@ -26,7 +26,7 @@ virtual void OnSourcesChanged() {} // Called when reports in storage change. - virtual void OnReportsChanged() {} + virtual void OnReportsChanged(AttributionReport::ReportType report_type) {} // Called when a source is registered, regardless of success. virtual void OnSourceHandled(const StorableSource& source,
diff --git a/content/browser/attribution_reporting/attribution_report.cc b/content/browser/attribution_reporting/attribution_report.cc index 369cd045..b6023208 100644 --- a/content/browser/attribution_reporting/attribution_report.cc +++ b/content/browser/attribution_reporting/attribution_report.cc
@@ -184,12 +184,21 @@ } base::Value operator()(const AggregatableAttributionData& data) { - DCHECK(data.assembled_report.has_value()); + base::Value::DictStorage dict; + + if (data.assembled_report.has_value()) { + dict = data.assembled_report->GetAsJson(); + } else { + // This generally should only be called when displaying the report for + // debugging/internals. + dict.emplace("shared_info", "not generated prior to send"); + dict.emplace("aggregation_service_payloads", + "not generated prior to send"); + } const CommonSourceInfo& common_info = report->attribution_info().source.common_info(); - base::Value::DictStorage dict = data.assembled_report->GetAsJson(); dict.emplace("source_site", common_info.ImpressionSite().Serialize()); dict.emplace("attribution_destination", common_info.ConversionDestination().Serialize());
diff --git a/content/browser/attribution_reporting/attribution_report.h b/content/browser/attribution_reporting/attribution_report.h index 7bc6cc3..70f386c 100644 --- a/content/browser/attribution_reporting/attribution_report.h +++ b/content/browser/attribution_reporting/attribution_report.h
@@ -9,6 +9,7 @@ #include <vector> +#include "base/containers/enum_set.h" #include "base/guid.h" #include "base/numerics/checked_math.h" #include "base/time/time.h" @@ -32,6 +33,16 @@ // report. This class can represent multiple different types of reports. class CONTENT_EXPORT AttributionReport { public: + enum class ReportType { + kEventLevel = 0, + kAggregatableAttribution = 1, + kMinValue = kEventLevel, + kMaxValue = kAggregatableAttribution, + }; + + using ReportTypes = + base::EnumSet<ReportType, ReportType::kMinValue, ReportType::kMaxValue>; + // Struct that contains the data specific to the event-level report. struct CONTENT_EXPORT EventLevelData { using Id = base::StrongAlias<EventLevelData, int64_t>;
diff --git a/content/browser/attribution_reporting/attribution_src_browsertest.cc b/content/browser/attribution_reporting/attribution_src_browsertest.cc index 5261e52..65a223b 100644 --- a/content/browser/attribution_reporting/attribution_src_browsertest.cc +++ b/content/browser/attribution_reporting/attribution_src_browsertest.cc
@@ -160,8 +160,17 @@ ::testing::Values("createAttributionSrcImg($1);", "window.attributionReporting.registerSource($1);")); +// TODO(crbug.com/1307363): Consistently failing on Linux MSAN and Linux +// ChromiumOS MSAN. +#if BUILDFLAG(IS_LINUX) +#define MAYBE_AttributionSrcAnchor_SourceRegistered \ + DISABLED_AttributionSrcAnchor_SourceRegistered +#else +#define MAYBE_AttributionSrcAnchor_SourceRegistered \ + AttributionSrcAnchor_SourceRegistered +#endif IN_PROC_BROWSER_TEST_F(AttributionSrcBrowserTest, - AttributionSrcAnchor_SourceRegistered) { + MAYBE_AttributionSrcAnchor_SourceRegistered) { SourceObserver source_observer(web_contents()); GURL page_url = https_server()->GetURL("b.test", "/page_with_impression_creator.html"); @@ -781,6 +790,43 @@ EXPECT_THAT(source_data.back()->aggregatable_source->keys, SizeIs(2)); } +IN_PROC_BROWSER_TEST_F(AttributionSrcBrowserTest, + AttributionSrcRegisterSourceJS_TriggerIgnored) { + GURL page_url = + https_server()->GetURL("b.test", "/page_with_impression_creator.html"); + EXPECT_TRUE(NavigateToURL(web_contents(), page_url)); + + MockAttributionHost host(web_contents()); + std::unique_ptr<MockDataHost> data_host; + base::RunLoop loop; + EXPECT_CALL(host, RegisterDataHost) + .WillOnce( + [&](mojo::PendingReceiver<blink::mojom::AttributionDataHost> host) { + data_host = GetRegisteredDataHost(std::move(host)); + loop.Quit(); + }); + + GURL register_url = + https_server()->GetURL("c.test", "/register_trigger_source_trigger.html"); + + EXPECT_TRUE( + ExecJs(web_contents(), + JsReplace("window.attributionReporting.registerSource($1);", + register_url))); + if (!data_host) + loop.Run(); + data_host->WaitForSourceData(/*num_source_data=*/1); + const auto& source_data = data_host->source_data(); + + EXPECT_EQ(source_data.size(), 1u); + + // Only the source should be processed. + EXPECT_EQ(source_data.front()->source_event_id, 5u); + + // The triggers should be ignored. + EXPECT_EQ(data_host->trigger_data().size(), 0u); +} + class AttributionSrcPrerenderBrowserTest : public AttributionSrcBrowserTest { public: AttributionSrcPrerenderBrowserTest()
diff --git a/content/browser/attribution_reporting/attribution_storage.h b/content/browser/attribution_reporting/attribution_storage.h index 4e876b8..29cff47 100644 --- a/content/browser/attribution_reporting/attribution_storage.h +++ b/content/browser/attribution_reporting/attribution_storage.h
@@ -75,23 +75,16 @@ virtual CreateReportResult MaybeCreateAndStoreReport( const AttributionTrigger& trigger) = 0; - // Returns all of the event-level reports that should be sent before - // |max_report_time|. This call is logically const, and does not modify the - // underlying storage. |limit| limits the number of reports to return; use - // a negative number for no limit. - // TODO(crbug.com/1285317): Consider removing this interface or changing to - // for testing. - virtual std::vector<AttributionReport> GetEventLevelReports( - base::Time max_report_time, - int limit = -1) = 0; - // Returns all of the reports that should be sent before // |max_report_time|. This call is logically const, and does not modify the // underlying storage. |limit| limits the number of reports to return; use // a negative number for no limit. Reports are shuffled before being returned. virtual std::vector<AttributionReport> GetAttributionReports( base::Time max_report_time, - int limit = -1) = 0; + int limit = -1, + AttributionReport::ReportTypes report_types = { + AttributionReport::ReportType::kEventLevel, + AttributionReport::ReportType::kAggregatableAttribution}) = 0; // Returns the first report time strictly after `time`. virtual absl::optional<base::Time> GetNextReportTime(base::Time time) = 0; @@ -99,7 +92,7 @@ // Returns the reports with the given IDs. This call is logically const, and // does not modify the underlying storage. virtual std::vector<AttributionReport> GetReports( - const std::vector<AttributionReport::EventLevelData::Id>& ids) = 0; + const std::vector<AttributionReport::Id>& ids) = 0; // Returns all active sources in storage. Active sources are all // sources that can still convert. Sources that: are past expiry,
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.cc b/content/browser/attribution_reporting/attribution_storage_sql.cc index 94441914c..cbc1ff5 100644 --- a/content/browser/attribution_reporting/attribution_storage_sql.cc +++ b/content/browser/attribution_reporting/attribution_storage_sql.cc
@@ -56,18 +56,18 @@ namespace content { // Version number of the database. -const int AttributionStorageSql::kCurrentVersionNumber = 32; +const int AttributionStorageSql::kCurrentVersionNumber = 33; // Earliest version which can use a |kCurrentVersionNumber| database // without failing. -const int AttributionStorageSql::kCompatibleVersionNumber = 32; +const int AttributionStorageSql::kCompatibleVersionNumber = 33; // Latest version of the database that cannot be upgraded to // |kCurrentVersionNumber| without razing the database. // // Note that all versions >=15 were introduced during the transitional state of // the Attribution Reporting API and can be removed when done. -const int AttributionStorageSql::kDeprecatedVersionNumber = 31; +const int AttributionStorageSql::kDeprecatedVersionNumber = 32; namespace { @@ -79,7 +79,7 @@ const base::FilePath::CharType kDatabasePath[] = FILE_PATH_LITERAL("Conversions"); -#define ATTRIBUTION_CONVERSIONS_TABLE "conversions" +#define ATTRIBUTION_CONVERSIONS_TABLE "event_level_reports" #define ATTRIBUTION_AGGREGATABLE_REPORT_METADATA_TABLE \ "aggregatable_report_metadata" @@ -109,18 +109,18 @@ // clang-format off #define ATTRIBUTION_SOURCE_COLUMNS_SQL(prefix) \ - prefix "impression_id," \ - prefix "impression_data," \ - prefix "impression_origin," \ - prefix "conversion_origin," \ + prefix "source_id," \ + prefix "source_event_id," \ + prefix "source_origin," \ + prefix "destination_origin," \ prefix "reporting_origin," \ - prefix "impression_time," \ + prefix "source_time," \ prefix "expiry_time," \ prefix "source_type," \ - prefix "attributed_truthfully," \ + prefix "attribution_logic," \ prefix "priority," \ prefix "debug_key," \ - prefix "num_conversions," \ + prefix "num_attributions," \ prefix "aggregatable_budget_consumed," \ prefix "aggregatable_source," \ prefix "filter_data," \ @@ -130,10 +130,10 @@ #define ATTRIBUTION_SELECT_EVENT_LEVEL_REPORT_AND_SOURCE_COLUMNS_SQL \ "SELECT " \ ATTRIBUTION_SOURCE_COLUMNS_SQL("I.") \ - ",C.conversion_data,C.conversion_time,C.report_time,C.conversion_id," \ + ",C.trigger_data,C.trigger_time,C.report_time,C.report_id," \ "C.priority,C.failed_send_attempts,C.external_report_id,C.debug_key " \ - "FROM conversions C " \ - "JOIN impressions I ON C.impression_id = I.impression_id " + "FROM event_level_reports C " \ + "JOIN sources I ON C.source_id = I.source_id " #define ATTRIBUTION_SELECT_AGGREGATABLE_REPORT_AND_SOURCE_COLUMNS_SQL \ "SELECT " \ @@ -142,7 +142,7 @@ "A.external_report_id,A.failed_send_attempts " \ "FROM aggregatable_report_metadata A " \ DCHECK_SQL_INDEXED_BY("aggregate_report_time_idx") \ - "JOIN impressions I ON A.source_id = I.impression_id " + "JOIN sources I ON A.source_id = I.source_id " // clang-format on @@ -312,8 +312,8 @@ static constexpr char kReadSourceToAttributeSql[] = // clang-format off "SELECT " ATTRIBUTION_SOURCE_COLUMNS_SQL("") - " FROM impressions " - "WHERE impression_id = ?"; // clang-format on + " FROM sources " + "WHERE source_id = ?"; // clang-format on sql::Statement statement( db->GetCachedStatement(SQL_FROM_HERE, kReadSourceToAttributeSql)); statement.BindInt64(0, *source_id); @@ -376,10 +376,10 @@ static constexpr char kGetSourcesToReturnSql[] = // clang-format off "SELECT " ATTRIBUTION_SOURCE_COLUMNS_SQL("") - " FROM impressions " - DCHECK_SQL_INDEXED_BY("conversion_destination_idx") - "WHERE conversion_destination = ? AND reporting_origin = ? AND " - "((event_level_active = 1 AND num_conversions > 0) OR " + " FROM sources " + DCHECK_SQL_INDEXED_BY("sources_by_active_destination_site_reporting_origin") + "WHERE destination_site = ? AND reporting_origin = ? AND " + "((event_level_active = 1 AND num_attributions > 0) OR " "(aggregatable_active = 1 AND aggregatable_budget_consumed > 0)) " "LIMIT ?"; // clang-format on sql::Statement get_statement( @@ -408,11 +408,11 @@ } static constexpr char kDeactivateSourcesSql[] = - "UPDATE impressions " - DCHECK_SQL_INDEXED_BY("conversion_destination_idx") + "UPDATE sources " + DCHECK_SQL_INDEXED_BY("sources_by_active_destination_site_reporting_origin") "SET event_level_active = 0,aggregatable_active = 0 " - "WHERE conversion_destination = ? AND reporting_origin = ? AND " - "((event_level_active = 1 AND num_conversions > 0) OR " + "WHERE destination_site = ? AND reporting_origin = ? AND " + "((event_level_active = 1 AND num_attributions > 0) OR " "(aggregatable_active = 1 AND aggregatable_budget_consumed > 0))"; sql::Statement deactivate_statement( db_->GetCachedStatement(SQL_FROM_HERE, kDeactivateSourcesSql)); @@ -520,12 +520,12 @@ const bool aggregatable_active = true; static constexpr char kInsertImpressionSql[] = - "INSERT INTO impressions" - "(impression_data,impression_origin,conversion_origin," - "conversion_destination," - "reporting_origin,impression_time,expiry_time,source_type," - "attributed_truthfully,priority,impression_site," - "num_conversions,event_level_active,aggregatable_active,debug_key," + "INSERT INTO sources" + "(source_event_id,source_origin,destination_origin," + "destination_site," + "reporting_origin,source_time,expiry_time,source_type," + "attribution_logic,priority,source_site," + "num_attributions,event_level_active,aggregatable_active,debug_key," "aggregatable_budget_consumed,aggregatable_source,filter_data)" "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,0,?,?)"; sql::Statement statement( @@ -624,14 +624,14 @@ // Prioritization is scoped within report windows. // This is reasonably optimized as is because we only store a ~small number - // of reports per impression_id. Selects the report with lowest priority, - // and uses the greatest conversion_time to break ties. This favors sending + // of reports per source_id. Selects the report with lowest priority, + // and uses the greatest trigger_time to break ties. This favors sending // reports for report closer to the source time. static constexpr char kMinPrioritySql[] = - "SELECT priority,conversion_id " - "FROM conversions " - "WHERE impression_id = ? AND report_time = ? " - "ORDER BY priority ASC, conversion_time DESC " + "SELECT priority,report_id " + "FROM event_level_reports " + "WHERE source_id = ? AND report_time = ? " + "ORDER BY priority ASC, trigger_time DESC " "LIMIT 1"; sql::Statement min_priority_statement( db_->GetCachedStatement(SQL_FROM_HERE, kMinPrioritySql)); @@ -646,7 +646,7 @@ // generated in the future. if (!has_matching_report) { static constexpr char kDeactivateSql[] = - "UPDATE impressions SET event_level_active = 0 WHERE impression_id = ?"; + "UPDATE sources SET event_level_active = 0 WHERE source_id = ?"; sql::Statement deactivate_statement( db_->GetCachedStatement(SQL_FROM_HERE, kDeactivateSql)); deactivate_statement.BindInt64(0, *source.source_id()); @@ -943,12 +943,12 @@ // past their expiry time. The sources are fetched in order so that the // first one is the one that will be attributed; the others will be deleted. static constexpr char kGetMatchingSourcesSql[] = - "SELECT impression_id FROM impressions " - DCHECK_SQL_INDEXED_BY("conversion_destination_idx") - "WHERE conversion_destination = ? AND reporting_origin = ? " + "SELECT source_id FROM sources " + DCHECK_SQL_INDEXED_BY("sources_by_active_destination_site_reporting_origin") + "WHERE destination_site = ? AND reporting_origin = ? " "AND (event_level_active = 1 OR aggregatable_active = 1) " "AND expiry_time > ? " - "ORDER BY priority DESC,impression_time DESC"; + "ORDER BY priority DESC,source_time DESC"; sql::Statement statement( db_->GetCachedStatement(SQL_FROM_HERE, kGetMatchingSourcesSql)); @@ -1018,7 +1018,7 @@ // stored source and report with the current configuration. One way to do that // is to permanently store the configuration history in the binary with each // version having a unique ID, and storing that ID in a new column in the - // impressions and conversions DB tables. This code would then look up the + // sources and event_level_reports DB tables. This code would then look up the // values for the particular IDs. Because such an approach would entail // complicating the DB schema, we hardcode the values for now and will wait // for the first time the values are changed before complicating the codebase. @@ -1103,7 +1103,7 @@ // stored. if (dedup_key.has_value()) { static constexpr char kInsertDedupKeySql[] = - "INSERT INTO dedup_keys(impression_id,dedup_key)VALUES(?,?)"; + "INSERT INTO dedup_keys(source_id,dedup_key)VALUES(?,?)"; sql::Statement insert_dedup_key_statement( db_->GetCachedStatement(SQL_FROM_HERE, kInsertDedupKeySql)); insert_dedup_key_statement.BindInt64(0, @@ -1118,8 +1118,8 @@ if (maybe_replace_lower_priority_report_result == MaybeReplaceLowerPriorityEventLevelReportResult::kAddNewReport) { static constexpr char kUpdateImpressionForConversionSql[] = - "UPDATE impressions SET num_conversions = num_conversions + 1 " - "WHERE impression_id = ?"; + "UPDATE sources SET num_attributions = num_attributions + 1 " + "WHERE source_id = ?"; sql::Statement impression_update_statement(db_->GetCachedStatement( SQL_FROM_HERE, kUpdateImpressionForConversionSql)); @@ -1154,8 +1154,8 @@ DCHECK(external_report_id.is_valid()); static constexpr char kStoreReportSql[] = - "INSERT INTO conversions" - "(impression_id,conversion_data,conversion_time,report_time," + "INSERT INTO event_level_reports" + "(source_id,trigger_data,trigger_time,report_time," "priority,failed_send_attempts,external_report_id,debug_key)" "VALUES(?,?,?,?,?,0,?,?)"; sql::Statement store_report_statement( @@ -1212,34 +1212,38 @@ return report; } -std::vector<AttributionReport> AttributionStorageSql::GetEventLevelReports( - base::Time max_report_time, - int limit) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (!LazyInit(DbCreationPolicy::kIgnoreIfAbsent)) - return {}; - - std::vector<AttributionReport> reports = - GetEventLevelReportsInternal(max_report_time, limit); - delegate_->ShuffleReports(reports); - return reports; -} - std::vector<AttributionReport> AttributionStorageSql::GetAttributionReports( base::Time max_report_time, - int limit) { + int limit, + AttributionReport::ReportTypes report_types) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(!report_types.Empty()); + if (!LazyInit(DbCreationPolicy::kIgnoreIfAbsent)) return {}; - std::vector<AttributionReport> reports = - GetEventLevelReportsInternal(max_report_time, limit); - std::vector<AttributionReport> aggregatable_reports = - GetAggregatableAttributionReportsInternal(max_report_time, limit); + std::vector<AttributionReport> reports; - reports.insert(reports.end(), - std::make_move_iterator(aggregatable_reports.begin()), - std::make_move_iterator(aggregatable_reports.end())); + for (AttributionReport::ReportType report_type : report_types) { + switch (report_type) { + case AttributionReport::ReportType::kEventLevel: { + std::vector<AttributionReport> event_level_reports = + GetEventLevelReportsInternal(max_report_time, limit); + reports.insert(reports.end(), + std::make_move_iterator(event_level_reports.begin()), + std::make_move_iterator(event_level_reports.end())); + break; + } + case AttributionReport::ReportType::kAggregatableAttribution: { + std::vector<AttributionReport> aggregatable_reports = + GetAggregatableAttributionReportsInternal(max_report_time, limit); + reports.insert(reports.end(), + std::make_move_iterator(aggregatable_reports.begin()), + std::make_move_iterator(aggregatable_reports.end())); + break; + } + } + } if (limit >= 0 && reports.size() > static_cast<size_t>(limit)) { base::ranges::partial_sort(reports, reports.begin() + limit, /*comp=*/{}, @@ -1254,9 +1258,9 @@ std::vector<AttributionReport> AttributionStorageSql::GetEventLevelReportsInternal(base::Time max_report_time, int limit) { - // Get at most |limit| entries in the conversions table with a |report_time| - // no greater than |max_report_time| and their matching information from the - // impression table. Negatives are treated as no limit + // Get at most |limit| entries in the event_level_reports table with a + // |report_time| no greater than |max_report_time| and their matching + // information from the impression table. Negatives are treated as no limit // (https://sqlite.org/lang_select.html#limitoffset). static constexpr char kGetReportsSql[] = ATTRIBUTION_SELECT_EVENT_LEVEL_REPORT_AND_SOURCE_COLUMNS_SQL @@ -1318,14 +1322,31 @@ } std::vector<AttributionReport> AttributionStorageSql::GetReports( - const std::vector<AttributionReport::EventLevelData::Id>& ids) { + const std::vector<AttributionReport::Id>& ids) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!LazyInit(DbCreationPolicy::kIgnoreIfAbsent)) return {}; + struct Visitor { + raw_ptr<AttributionStorageSql> storage; + + absl::optional<AttributionReport> operator()( + AttributionReport::EventLevelData::Id id) { + DCHECK_CALLED_ON_VALID_SEQUENCE(storage->sequence_checker_); + return storage->GetReport(id); + } + + absl::optional<AttributionReport> operator()( + AttributionReport::AggregatableAttributionData::Id id) { + DCHECK_CALLED_ON_VALID_SEQUENCE(storage->sequence_checker_); + return storage->GetReport(id); + } + }; + std::vector<AttributionReport> reports; - for (AttributionReport::EventLevelData::Id id : ids) { - absl::optional<AttributionReport> report = GetReport(id); + for (AttributionReport::Id id : ids) { + absl::optional<AttributionReport> report = + absl::visit(Visitor{.storage = this}, id); if (report.has_value()) reports.push_back(std::move(*report)); } @@ -1336,7 +1357,7 @@ AttributionReport::EventLevelData::Id conversion_id) { static constexpr char kGetReportSql[] = ATTRIBUTION_SELECT_EVENT_LEVEL_REPORT_AND_SOURCE_COLUMNS_SQL - "WHERE C.conversion_id = ?"; + "WHERE C.report_id = ?"; sql::Statement statement( db_->GetCachedStatement(SQL_FROM_HERE, kGetReportSql)); statement.BindInt64(0, *conversion_id); @@ -1376,13 +1397,13 @@ // Delete all sources that have no associated reports and are past // their expiry time. Optimized by |kImpressionExpiryIndexSql|. static constexpr char kSelectExpiredSourcesSql[] = - "SELECT impression_id FROM impressions " - DCHECK_SQL_INDEXED_BY("impression_expiry_idx") + "SELECT source_id FROM sources " + DCHECK_SQL_INDEXED_BY("sources_by_expiry_time") "WHERE expiry_time <= ? AND " - "impression_id NOT IN(" - "SELECT impression_id FROM conversions" - DCHECK_SQL_INDEXED_BY("conversion_impression_id_idx") - ")AND impression_id NOT IN(" + "source_id NOT IN(" + "SELECT source_id FROM event_level_reports" + DCHECK_SQL_INDEXED_BY("event_level_reports_by_source_id") + ")AND source_id NOT IN(" "SELECT source_id FROM aggregatable_report_metadata" DCHECK_SQL_INDEXED_BY("aggregate_source_id_idx") ")LIMIT ?"; @@ -1398,13 +1419,13 @@ // |kSelectExpiredSourcesSql| so that each query is optimized by an index. // Optimized by |kConversionDestinationIndexSql|. static constexpr char kSelectInactiveSourcesSql[] = - "SELECT impression_id FROM impressions " - DCHECK_SQL_INDEXED_BY("conversion_destination_idx") + "SELECT source_id FROM sources " + DCHECK_SQL_INDEXED_BY("sources_by_active_destination_site_reporting_origin") "WHERE event_level_active = 0 AND aggregatable_active = 0 AND " - "impression_id NOT IN(" - "SELECT impression_id FROM conversions" - DCHECK_SQL_INDEXED_BY("conversion_impression_id_idx") - ")AND impression_id NOT IN(" + "source_id NOT IN(" + "SELECT source_id FROM event_level_reports" + DCHECK_SQL_INDEXED_BY("event_level_reports_by_source_id") + ")AND source_id NOT IN(" "SELECT source_id FROM aggregatable_report_metadata" DCHECK_SQL_INDEXED_BY("aggregate_source_id_idx") ")LIMIT ?"; @@ -1439,7 +1460,7 @@ bool AttributionStorageSql::DeleteEventLevelReport( AttributionReport::EventLevelData::Id report_id) { static constexpr char kDeleteReportSql[] = - "DELETE FROM conversions WHERE conversion_id = ?"; + "DELETE FROM event_level_reports WHERE report_id = ?"; sql::Statement statement( db_->GetCachedStatement(SQL_FROM_HERE, kDeleteReportSql)); statement.BindInt64(0, *report_id); @@ -1461,7 +1482,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(storage->sequence_checker_); static constexpr char kUpdateFailedReportSql[] = ATTRIBUTION_UPDATE_FAILED_REPORT_SQL(ATTRIBUTION_CONVERSIONS_TABLE, - "conversion_id"); + "report_id"); return storage->UpdateReportForSendFailure( SQL_FROM_HERE, kUpdateFailedReportSql, *id, new_report_time); } @@ -1563,18 +1584,18 @@ SCOPED_UMA_HISTOGRAM_TIMER("Conversions.Storage.ClearDataWithFilterDuration"); // TODO(csharrison, johnidel): This query can be split up and optimized by - // adding indexes on the impression_time and conversion_time columns. + // adding indexes on the time and trigger_time columns. // See this comment for more information: // crrev.com/c/2150071/4/content/browser/conversions/conversion_storage_sql.cc#342 // // TODO(crbug.com/1290377): Look into optimizing origin filter callback. static constexpr char kScanCandidateData[] = - "SELECT I.impression_origin,I.conversion_origin,I.reporting_origin," - "I.impression_id,C.conversion_id " - "FROM impressions I LEFT JOIN conversions C ON " - "C.impression_id = I.impression_id WHERE" - "(I.impression_time BETWEEN ?1 AND ?2)OR" - "(C.conversion_time BETWEEN ?1 AND ?2)"; + "SELECT I.source_origin,I.destination_origin,I.reporting_origin," + "I.source_id,C.report_id " + "FROM sources I LEFT JOIN event_level_reports C ON " + "C.source_id = I.source_id WHERE" + "(I.source_time BETWEEN ?1 AND ?2)OR" + "(C.trigger_time BETWEEN ?1 AND ?2)"; sql::Statement statement( db_->GetCachedStatement(SQL_FROM_HERE, kScanCandidateData)); statement.BindTime(0, delete_begin); @@ -1633,7 +1654,7 @@ // Delete all unattributed reports here to ensure everything is cleaned // up. static constexpr char kDeleteVestigialConversionSql[] = - "DELETE FROM conversions WHERE impression_id = ?"; + "DELETE FROM event_level_reports WHERE source_id = ?"; sql::Statement delete_vestigial_statement( db_->GetCachedStatement(SQL_FROM_HERE, kDeleteVestigialConversionSql)); for (StoredSource::Id source_id : source_ids_to_delete) { @@ -1672,14 +1693,15 @@ if (!transaction.Begin()) return; - static constexpr char kDeleteAllReportsSql[] = "DELETE FROM conversions"; + static constexpr char kDeleteAllReportsSql[] = + "DELETE FROM event_level_reports"; sql::Statement delete_all_reports_statement( db_->GetCachedStatement(SQL_FROM_HERE, kDeleteAllReportsSql)); if (!delete_all_reports_statement.Run()) return; int num_reports_deleted = db_->GetLastChangeCount(); - static constexpr char kDeleteAllSourcesSql[] = "DELETE FROM impressions"; + static constexpr char kDeleteAllSourcesSql[] = "DELETE FROM sources"; sql::Statement delete_all_sources_statement( db_->GetCachedStatement(SQL_FROM_HERE, kDeleteAllSourcesSql)); if (!delete_all_sources_statement.Run()) @@ -1720,9 +1742,9 @@ const std::string& serialized_origin) { static constexpr char kCountSourcesSql[] = // clang-format off - "SELECT COUNT(impression_origin)FROM impressions " - DCHECK_SQL_INDEXED_BY("impression_origin_idx") - "WHERE impression_origin = ?"; // clang-format on + "SELECT COUNT(source_origin)FROM sources " + DCHECK_SQL_INDEXED_BY("sources_by_origin") + "WHERE source_origin = ?"; // clang-format on sql::Statement statement( db_->GetCachedStatement(SQL_FROM_HERE, kCountSourcesSql)); @@ -1741,7 +1763,7 @@ static constexpr char kCountReportsSql[] = "SELECT COUNT(*)FROM dedup_keys " - "WHERE impression_id = ? AND dedup_key = ?"; + "WHERE source_id = ? AND dedup_key = ?"; sql::Statement statement( db_->GetCachedStatement(SQL_FROM_HERE, kCountReportsSql)); statement.BindInt64(0, *source_id); @@ -1769,11 +1791,11 @@ // |event_level_active| and |aggregatable_active| are booleans, so include // them in the conditional. static constexpr char kCountReportsSql[] = - "SELECT COUNT(conversion_id)FROM conversions C " - "JOIN impressions I " - DCHECK_SQL_INDEXED_BY("conversion_destination_idx") - "ON I.impression_id = C.impression_id " - "WHERE I.conversion_destination = ? AND " + "SELECT COUNT(*)FROM event_level_reports C " + "JOIN sources I " + DCHECK_SQL_INDEXED_BY("sources_by_active_destination_site_reporting_origin") + "ON I.source_id = C.source_id " + "WHERE I.destination_site = ? AND " "(event_level_active BETWEEN 0 AND 1) AND " "(aggregatable_active BETWEEN 0 AND 1)"; sql::Statement statement( @@ -1798,7 +1820,7 @@ static constexpr char kGetActiveSourcesSql[] = // clang-format off "SELECT " ATTRIBUTION_SOURCE_COLUMNS_SQL("") - " FROM impressions " + " FROM sources " "WHERE (event_level_active = 1 OR aggregatable_active = 1) AND " "expiry_time > ? LIMIT ?"; // clang-format on @@ -1831,7 +1853,7 @@ absl::optional<std::vector<uint64_t>> AttributionStorageSql::ReadDedupKeys( StoredSource::Id source_id) { static constexpr char kDedupKeySql[] = - "SELECT dedup_key FROM dedup_keys WHERE impression_id = ?"; + "SELECT dedup_key FROM dedup_keys WHERE source_id = ?"; sql::Statement statement( db_->GetCachedStatement(SQL_FROM_HERE, kDedupKeySql)); statement.BindInt64(0, *source_id); @@ -1964,9 +1986,9 @@ // Origins usually aren't _that_ big compared to a 64 bit integer(8 bytes). // // All of the columns in this table are designed to be "const" except for - // |num_conversions|, |aggregatable_budget_consumed|, |event_level_active| + // |num_attributions|, |aggregatable_budget_consumed|, |event_level_active| // and |aggregatable_active| which are updated when a new trigger is - // received. |num_conversions| is the number of times an event-level report + // received. |num_attributions| is the number of times an event-level report // has been created for a given source. |aggregatable_budget_consumed| is the // aggregatable budget that has been consumed for a given source. |delegate_| // can choose to enforce a maximum limit on them. |event_level_active| and @@ -1978,35 +2000,35 @@ // ineligible for new sources due to the attribution model documented // in `StoreSource()`. // - A source has expired but still has unsent reports in the - // conversions table meaning it cannot be deleted yet. + // event_level_reports table meaning it cannot be deleted yet. // |source_type| is the type of the source of the source, currently always // |kNavigation|. - // |attributed_truthfully| corresponds to the + // |attribution_logic| corresponds to the // |StoredSource::AttributionLogic| enum. - // |impression_site| is used to optimize the lookup of sources; + // |source_site| is used to optimize the lookup of sources; // |CommonSourceInfo::ImpressionSite| is always derived from the origin. // |filter_data| is a serialized `AttributionFilterData` used for source // matching. // - // |impression_id| uses AUTOINCREMENT to ensure that IDs aren't reused over + // |source_id| uses AUTOINCREMENT to ensure that IDs aren't reused over // the lifetime of the DB. static constexpr char kImpressionTableSql[] = - "CREATE TABLE IF NOT EXISTS impressions" - "(impression_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," - "impression_data INTEGER NOT NULL," - "impression_origin TEXT NOT NULL," - "conversion_origin TEXT NOT NULL," + "CREATE TABLE IF NOT EXISTS sources" + "(source_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + "source_event_id INTEGER NOT NULL," + "source_origin TEXT NOT NULL," + "destination_origin TEXT NOT NULL," "reporting_origin TEXT NOT NULL," - "impression_time INTEGER NOT NULL," + "source_time INTEGER NOT NULL," "expiry_time INTEGER NOT NULL," - "num_conversions INTEGER NOT NULL," + "num_attributions INTEGER NOT NULL," "event_level_active INTEGER NOT NULL," "aggregatable_active INTEGER NOT NULL," - "conversion_destination TEXT NOT NULL," + "destination_site TEXT NOT NULL," "source_type INTEGER NOT NULL," - "attributed_truthfully INTEGER NOT NULL," + "attribution_logic INTEGER NOT NULL," "priority INTEGER NOT NULL," - "impression_site TEXT NOT NULL," + "source_site TEXT NOT NULL," "debug_key INTEGER," "aggregatable_budget_consumed INTEGER NOT NULL," "aggregatable_source BLOB NOT NULL," @@ -2021,9 +2043,10 @@ // need to distinguish between active and inactive reports, so include // |event_level_active| and |aggregatable_active| in the index. static constexpr char kConversionDestinationIndexSql[] = - "CREATE INDEX IF NOT EXISTS conversion_destination_idx " - "ON impressions(event_level_active,aggregatable_active," - "conversion_destination,reporting_origin)"; + "CREATE INDEX IF NOT EXISTS " + "sources_by_active_destination_site_reporting_origin " + "ON sources(event_level_active,aggregatable_active," + "destination_site,reporting_origin)"; if (!db_->Execute(kConversionDestinationIndexSql)) return false; @@ -2032,24 +2055,25 @@ // time. Both calls require only returning sources that expire after a // given time. static constexpr char kImpressionExpiryIndexSql[] = - "CREATE INDEX IF NOT EXISTS impression_expiry_idx " - "ON impressions(expiry_time)"; + "CREATE INDEX IF NOT EXISTS sources_by_expiry_time " + "ON sources(expiry_time)"; if (!db_->Execute(kImpressionExpiryIndexSql)) return false; // Optimizes counting sources by source origin. static constexpr char kImpressionOriginIndexSql[] = - "CREATE INDEX IF NOT EXISTS impression_origin_idx " - "ON impressions(impression_origin)"; + "CREATE INDEX IF NOT EXISTS sources_by_origin " + "ON sources(source_origin)"; if (!db_->Execute(kImpressionOriginIndexSql)) return false; // Optimizes `HasCapacityForUniqueDestinationLimitForPendingSource()`, which // only needs to examine active, unconverted sources. static constexpr char kImpressionSiteReportingOriginIndexSql[] = - "CREATE INDEX IF NOT EXISTS impression_site_reporting_origin_idx " - "ON impressions(impression_site,reporting_origin)" - "WHERE event_level_active=1 AND num_conversions=0 AND " + "CREATE INDEX IF NOT EXISTS " + "active_unattributed_sources_by_site_reporting_origin " + "ON sources(source_site,reporting_origin)" + "WHERE event_level_active=1 AND num_attributions=0 AND " "aggregatable_active=1 AND aggregatable_budget_consumed=0"; if (!db_->Execute(kImpressionSiteReportingOriginIndexSql)) return false; @@ -2057,20 +2081,20 @@ // All columns in this table are const except |report_time| and // |failed_send_attempts|, // which are updated when a report fails to send, as part of retries. - // |impression_id| is the primary key of a row in the [impressions] table, - // [impressions.impression_id]. |conversion_time| is the time at which the + // |source_id| is the primary key of a row in the [sources] table, + // [sources.source_id]. |trigger_time| is the time at which the // trigger was registered, and should be used for clearing site data. // |report_time| is the time a <report, source> pair should be // reported, and is specified by |delegate_|. // - // |conversion_id| uses AUTOINCREMENT to ensure that IDs aren't reused over + // |id| uses AUTOINCREMENT to ensure that IDs aren't reused over // the lifetime of the DB. static constexpr char kConversionTableSql[] = - "CREATE TABLE IF NOT EXISTS conversions" - "(conversion_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," - "impression_id INTEGER NOT NULL," - "conversion_data INTEGER NOT NULL," - "conversion_time INTEGER NOT NULL," + "CREATE TABLE IF NOT EXISTS event_level_reports" + "(report_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + "source_id INTEGER NOT NULL," + "trigger_data INTEGER NOT NULL," + "trigger_time INTEGER NOT NULL," "report_time INTEGER NOT NULL," "priority INTEGER NOT NULL," "failed_send_attempts INTEGER NOT NULL," @@ -2083,8 +2107,8 @@ // `GetAttributionReports()`. The reports with the earliest report times are // periodically fetched from storage to be sent. static constexpr char kConversionReportTimeIndexSql[] = - "CREATE INDEX IF NOT EXISTS conversion_report_idx " - "ON conversions(report_time)"; + "CREATE INDEX IF NOT EXISTS event_level_reports_by_report_time " + "ON event_level_reports(report_time)"; if (!db_->Execute(kConversionReportTimeIndexSql)) return false; @@ -2093,8 +2117,8 @@ // corresponding pending reports during calls to // `DeleteExpiredSources()`. static constexpr char kConversionImpressionIdIndexSql[] = - "CREATE INDEX IF NOT EXISTS conversion_impression_id_idx " - "ON conversions(impression_id)"; + "CREATE INDEX IF NOT EXISTS event_level_reports_by_source_id " + "ON event_level_reports(source_id)"; if (!db_->Execute(kConversionImpressionIdIndexSql)) return false; @@ -2103,9 +2127,9 @@ static constexpr char kDedupKeyTableSql[] = "CREATE TABLE IF NOT EXISTS dedup_keys" - "(impression_id INTEGER NOT NULL," + "(source_id INTEGER NOT NULL," "dedup_key INTEGER NOT NULL," - "PRIMARY KEY(impression_id,dedup_key))WITHOUT ROWID"; + "PRIMARY KEY(source_id,dedup_key))WITHOUT ROWID"; if (!db_->Execute(kDedupKeyTableSql)) return false; @@ -2120,8 +2144,8 @@ // All columns in this table are const except `report_time` and // `failed_send_attempts`, which are updated when a report fails to send, as // part of retries. - // `source_id` is the primary key of a row in the [impressions] table, - // [impressions.impression_id]. + // `source_id` is the primary key of a row in the [sources] table, + // [sources.source_id]. // `trigger_time` is the time at which the trigger was registered, and // should be used for clearing site data. // `external_report_id` is used for deduplicating reports received by the @@ -2249,10 +2273,10 @@ // Optimized by `kImpressionSiteReportingOriginIndexSql`. static constexpr char kSelectSourcesSql[] = - "SELECT conversion_destination FROM impressions " - DCHECK_SQL_INDEXED_BY("impression_site_reporting_origin_idx") - "WHERE impression_site=? AND reporting_origin=? " - "AND event_level_active=1 AND num_conversions=0 AND " + "SELECT destination_site FROM sources " + DCHECK_SQL_INDEXED_BY("active_unattributed_sources_by_site_reporting_origin") + "WHERE source_site=? AND reporting_origin=? " + "AND event_level_active=1 AND num_attributions=0 AND " "aggregatable_active=1 AND aggregatable_budget_consumed=0"; sql::Statement statement( db_->GetCachedStatement(SQL_FROM_HERE, kSelectSourcesSql)); @@ -2284,7 +2308,7 @@ return false; static constexpr char kDeleteSourcesSql[] = - "DELETE FROM impressions WHERE impression_id = ?"; + "DELETE FROM sources WHERE source_id = ?"; sql::Statement delete_impression_statement( db_->GetCachedStatement(SQL_FROM_HERE, kDeleteSourcesSql)); @@ -2296,7 +2320,7 @@ } static constexpr char kDeleteDedupKeySql[] = - "DELETE FROM dedup_keys WHERE impression_id = ?"; + "DELETE FROM dedup_keys WHERE source_id = ?"; sql::Statement delete_dedup_key_statement( db_->GetCachedStatement(SQL_FROM_HERE, kDeleteDedupKeySql)); @@ -2349,12 +2373,12 @@ // TODO(linnan): Considering optimizing SQL query by moving some logic to C++. // See the comment in crrev.com/c/3379484 for more information. static constexpr char kScanCandidateData[] = - "SELECT I.impression_origin,I.conversion_origin,I.reporting_origin," - "I.impression_id,A.aggregation_id " - "FROM impressions I LEFT JOIN aggregatable_report_metadata A " + "SELECT I.source_origin,I.destination_origin,I.reporting_origin," + "I.source_id,A.aggregation_id " + "FROM sources I LEFT JOIN aggregatable_report_metadata A " DCHECK_SQL_INDEXED_BY("aggregate_trigger_time_idx") - "ON A.source_id=I.impression_id WHERE" - "(I.impression_time BETWEEN ?1 AND ?2)OR" + "ON A.source_id=I.source_id WHERE" + "(I.source_time BETWEEN ?1 AND ?2)OR" "(A.trigger_time BETWEEN ?1 AND ?2)"; sql::Statement statement( db_->GetCachedStatement(SQL_FROM_HERE, kScanCandidateData)); @@ -2462,40 +2486,10 @@ std::vector<AttributionReport> reports; while (statement.Step()) { - absl::optional<StoredSourceData> source_data = - ReadSourceFromStatement(statement); - - int col = kSourceColumnCount; - AttributionReport::AggregatableAttributionData::Id report_id( - statement.ColumnInt64(col++)); - base::Time trigger_time = statement.ColumnTime(col++); - base::Time report_time = statement.ColumnTime(col++); - absl::optional<uint64_t> trigger_debug_key = - ColumnUint64OrNull(statement, col++); - base::GUID external_report_id = - base::GUID::ParseLowercase(statement.ColumnString(col++)); - int failed_send_attempts = statement.ColumnInt(col++); - - // Ensure data is valid before continuing. This could happen if there is - // database corruption. - if (!source_data.has_value() || !external_report_id.is_valid() || - failed_send_attempts < 0) { - continue; - } - - std::vector<AggregatableHistogramContribution> contributions = - GetAggregatableContributions(report_id); - if (contributions.empty()) - continue; - - AttributionReport report(AttributionInfo(std::move(source_data->source), - trigger_time, trigger_debug_key), - report_time, std::move(external_report_id), - AttributionReport::AggregatableAttributionData( - std::move(contributions), report_id)); - report.set_failed_send_attempts(failed_send_attempts); - - reports.push_back(std::move(report)); + absl::optional<AttributionReport> report = + ReadAggregatableAttributionReportFromStatement(statement); + if (report.has_value()) + reports.push_back(std::move(*report)); } if (!statement.Succeeded()) @@ -2559,9 +2553,9 @@ DCHECK_GE(additional_budget_consumed, 0); static constexpr char kAdjustBudgetConsumedForSourceSql[] = - "UPDATE impressions " + "UPDATE sources " "SET aggregatable_budget_consumed=aggregatable_budget_consumed+? " - "WHERE impression_id=?"; + "WHERE source_id=?"; sql::Statement statement(db_->GetCachedStatement( SQL_FROM_HERE, kAdjustBudgetConsumedForSourceSql)); statement.BindInt64(0, additional_budget_consumed); @@ -2718,4 +2712,62 @@ return AggregatableResult::kSuccess; } +// Helper to deserialize report rows. See `GetReport()` for the expected +// ordering of columns used for the input to this function. +absl::optional<AttributionReport> +AttributionStorageSql::ReadAggregatableAttributionReportFromStatement( + sql::Statement& statement) { + DCHECK_EQ(statement.ColumnCount(), kSourceColumnCount + 6); + + absl::optional<StoredSourceData> source_data = + ReadSourceFromStatement(statement); + if (!source_data.has_value()) + return absl::nullopt; + + int col = kSourceColumnCount; + AttributionReport::AggregatableAttributionData::Id report_id( + statement.ColumnInt64(col++)); + base::Time trigger_time = statement.ColumnTime(col++); + base::Time report_time = statement.ColumnTime(col++); + absl::optional<uint64_t> trigger_debug_key = + ColumnUint64OrNull(statement, col++); + base::GUID external_report_id = + base::GUID::ParseLowercase(statement.ColumnString(col++)); + int failed_send_attempts = statement.ColumnInt(col++); + + // Ensure data is valid before continuing. This could happen if there is + // database corruption. + if (!external_report_id.is_valid() || failed_send_attempts < 0) { + return absl::nullopt; + } + + std::vector<AggregatableHistogramContribution> contributions = + GetAggregatableContributions(report_id); + if (contributions.empty()) + return absl::nullopt; + + AttributionReport report(AttributionInfo(std::move(source_data->source), + trigger_time, trigger_debug_key), + report_time, std::move(external_report_id), + AttributionReport::AggregatableAttributionData( + std::move(contributions), report_id)); + report.set_failed_send_attempts(failed_send_attempts); + return report; +} + +absl::optional<AttributionReport> AttributionStorageSql::GetReport( + AttributionReport::AggregatableAttributionData::Id report_id) { + static constexpr char kGetReportSql[] = + ATTRIBUTION_SELECT_AGGREGATABLE_REPORT_AND_SOURCE_COLUMNS_SQL + "WHERE A.aggregation_id = ?"; + sql::Statement statement( + db_->GetCachedStatement(SQL_FROM_HERE, kGetReportSql)); + statement.BindInt64(0, *report_id); + + if (!statement.Step()) + return absl::nullopt; + + return ReadAggregatableAttributionReportFromStatement(statement); +} + } // namespace content
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.h b/content/browser/attribution_reporting/attribution_storage_sql.h index f666813..730042c 100644 --- a/content/browser/attribution_reporting/attribution_storage_sql.h +++ b/content/browser/attribution_reporting/attribution_storage_sql.h
@@ -101,15 +101,15 @@ int deactivated_source_return_limit = -1) override; CreateReportResult MaybeCreateAndStoreReport( const AttributionTrigger& trigger) override; - std::vector<AttributionReport> GetEventLevelReports( - base::Time max_report_time, - int limit = -1) override; std::vector<AttributionReport> GetAttributionReports( base::Time max_report_time, - int limit = -1) override; + int limit = -1, + AttributionReport::ReportTypes report_types = { + AttributionReport::ReportType::kEventLevel, + AttributionReport::ReportType::kAggregatableAttribution}) override; absl::optional<base::Time> GetNextReportTime(base::Time time) override; std::vector<AttributionReport> GetReports( - const std::vector<AttributionReport::EventLevelData::Id>& ids) override; + const std::vector<AttributionReport::Id>& ids) override; std::vector<StoredSource> GetActiveSources(int limit = -1) override; bool DeleteReport(AttributionReport::Id report_id) override; bool UpdateReportForSendFailure(AttributionReport::Id report_id, @@ -284,8 +284,7 @@ // `filter`, between `delete_begin` and `delete_end` time. More specifically, // this: // 1. Deletes all sources within the time range. If any aggregatable - // attribution - // is attributed to this source it is also deleted. + // attribution is attributed to this source it is also deleted. // 2. Deletes all aggregatable attributions within the time range. All sources // attributed to the aggregatable attribution are also deleted. // @@ -361,6 +360,14 @@ const AttributionReport& report) VALID_CONTEXT_REQUIRED(sequence_checker_); + absl::optional<AttributionReport> + ReadAggregatableAttributionReportFromStatement(sql::Statement&) + VALID_CONTEXT_REQUIRED(sequence_checker_); + + absl::optional<AttributionReport> GetReport( + AttributionReport::AggregatableAttributionData::Id report_id) + VALID_CONTEXT_REQUIRED(sequence_checker_); + static bool g_run_in_memory_; // If set, database errors will not crash the client when run in debug mode.
diff --git a/content/browser/attribution_reporting/attribution_storage_sql_migrations_unittest.cc b/content/browser/attribution_reporting/attribution_storage_sql_migrations_unittest.cc index 7a681c1..45cf665 100644 --- a/content/browser/attribution_reporting/attribution_storage_sql_migrations_unittest.cc +++ b/content/browser/attribution_reporting/attribution_storage_sql_migrations_unittest.cc
@@ -130,8 +130,8 @@ VersionFromDatabase(&db)); // Check that expected tables are present. - EXPECT_TRUE(db.DoesTableExist("conversions")); - EXPECT_TRUE(db.DoesTableExist("impressions")); + EXPECT_TRUE(db.DoesTableExist("event_level_reports")); + EXPECT_TRUE(db.DoesTableExist("sources")); EXPECT_TRUE(db.DoesTableExist("meta")); EXPECT_EQ(GetCurrentSchema(), db.GetSchema()); @@ -175,7 +175,8 @@ EXPECT_EQ(RemoveQuotes(GetCurrentSchema()), RemoveQuotes(db.GetSchema())); // Verify that data is not preserved across the migration. - sql::Statement s(db.GetUniqueStatement("SELECT COUNT(*) FROM conversions")); + sql::Statement s( + db.GetUniqueStatement("SELECT COUNT(*) FROM event_level_reports")); ASSERT_TRUE(s.Step()); ASSERT_EQ(0, s.ColumnInt(0));
diff --git a/content/browser/attribution_reporting/attribution_storage_sql_unittest.cc b/content/browser/attribution_reporting/attribution_storage_sql_unittest.cc index bfd81f01..2098bba 100644 --- a/content/browser/attribution_reporting/attribution_storage_sql_unittest.cc +++ b/content/browser/attribution_reporting/attribution_storage_sql_unittest.cc
@@ -60,8 +60,8 @@ EXPECT_TRUE(raw_db.Open(db_path())); static constexpr const char* kTables[] = { - "conversions", - "impressions", + "event_level_reports", + "sources", "rate_limits", "dedup_keys", "aggregatable_report_metadata", @@ -87,7 +87,7 @@ sql::Database raw_db; EXPECT_TRUE(raw_db.Open(db_path())); size_t rows; - sql::test::CountTableRows(&raw_db, "impressions", &rows); + sql::test::CountTableRows(&raw_db, "sources", &rows); EXPECT_EQ(expected, rows); } @@ -151,7 +151,7 @@ sql::Database raw_db; EXPECT_TRUE(raw_db.Open(db_path())); - // [impressions], [conversions], [meta], [rate_limits], [dedup_keys], + // [sources], [event_level_reports], [meta], [rate_limits], [dedup_keys], // [aggregatable_report_metadata], [aggregatable_contributions], // [sqlite_sequence] (for AUTOINCREMENT support). EXPECT_EQ(8u, sql::test::CountSQLTables(&raw_db)); @@ -550,7 +550,7 @@ sql::Database raw_db; EXPECT_TRUE(raw_db.Open(db_path())); size_t impression_rows; - sql::test::CountTableRows(&raw_db, "impressions", &impression_rows); + sql::test::CountTableRows(&raw_db, "sources", &impression_rows); EXPECT_EQ(1u, impression_rows); size_t rate_limit_rows; sql::test::CountTableRows(&raw_db, "rate_limits", &rate_limit_rows); @@ -573,7 +573,7 @@ sql::Database raw_db; EXPECT_TRUE(raw_db.Open(db_path())); size_t conversion_rows; - sql::test::CountTableRows(&raw_db, "conversions", &conversion_rows); + sql::test::CountTableRows(&raw_db, "event_level_reports", &conversion_rows); EXPECT_EQ(2u, conversion_rows); size_t rate_limit_rows; sql::test::CountTableRows(&raw_db, "rate_limits", &rate_limit_rows); @@ -618,7 +618,7 @@ sql::Database raw_db; EXPECT_TRUE(raw_db.Open(db_path())); size_t conversion_rows; - sql::test::CountTableRows(&raw_db, "conversions", &conversion_rows); + sql::test::CountTableRows(&raw_db, "event_level_reports", &conversion_rows); EXPECT_EQ(0u, conversion_rows); size_t rate_limit_rows; sql::test::CountTableRows(&raw_db, "rate_limits", &rate_limit_rows); @@ -663,7 +663,7 @@ sql::Database raw_db; EXPECT_TRUE(raw_db.Open(db_path())); size_t conversion_rows; - sql::test::CountTableRows(&raw_db, "conversions", &conversion_rows); + sql::test::CountTableRows(&raw_db, "event_level_reports", &conversion_rows); EXPECT_EQ(0u, conversion_rows); size_t rate_limit_rows; sql::test::CountTableRows(&raw_db, "rate_limits", &rate_limit_rows);
diff --git a/content/browser/attribution_reporting/attribution_test_utils.cc b/content/browser/attribution_reporting/attribution_test_utils.cc index b84efb0..3ccfec7 100644 --- a/content/browser/attribution_reporting/attribution_test_utils.cc +++ b/content/browser/attribution_reporting/attribution_test_utils.cc
@@ -348,9 +348,10 @@ observer.OnSourcesChanged(); } -void MockAttributionManager::NotifyReportsChanged() { +void MockAttributionManager::NotifyReportsChanged( + AttributionReport::ReportType report_type) { for (auto& observer : observers_) - observer.OnReportsChanged(); + observer.OnReportsChanged(report_type); } void MockAttributionManager::NotifySourceDeactivated( @@ -1191,6 +1192,19 @@ return out; } +std::ostream& operator<<(std::ostream& out, + AttributionReport::ReportType report_type) { + switch (report_type) { + case AttributionReport::ReportType::kEventLevel: + out << "kEventLevel"; + break; + case AttributionReport::ReportType::kAggregatableAttribution: + out << "kAggregatableAttribution"; + break; + } + return out; +} + std::ostream& operator<<(std::ostream& out, SendResult::Status status) { switch (status) { case SendResult::Status::kSent: @@ -1393,7 +1407,10 @@ std::vector<AttributionReport> attribution_reports; manager->attribution_storage_ .AsyncCall(&AttributionStorage::GetAttributionReports) - .WithArgs(max_report_time, /*limit=*/-1) + .WithArgs(max_report_time, /*limit=*/-1, + AttributionReport::ReportTypes{ + AttributionReport::ReportType::kEventLevel, + AttributionReport::ReportType::kAggregatableAttribution}) .Then(base::BindOnce(base::BindLambdaForTesting( [&](std::vector<AttributionReport> reports) { attribution_reports = std::move(reports);
diff --git a/content/browser/attribution_reporting/attribution_test_utils.h b/content/browser/attribution_reporting/attribution_test_utils.h index e504df619..8668ad67 100644 --- a/content/browser/attribution_reporting/attribution_test_utils.h +++ b/content/browser/attribution_reporting/attribution_test_utils.h
@@ -322,12 +322,13 @@ MOCK_METHOD( void, GetPendingReportsForInternalUse, - (base::OnceCallback<void(std::vector<AttributionReport>)> callback), + (AttributionReport::ReportType report_type, + base::OnceCallback<void(std::vector<AttributionReport>)> callback), (override)); MOCK_METHOD(void, SendReportsForWebUI, - (const std::vector<AttributionReport::EventLevelData::Id>& ids, + (const std::vector<AttributionReport::Id>& ids, base::OnceClosure done), (override)); @@ -344,7 +345,7 @@ AttributionDataHostManager* GetDataHostManager() override; void NotifySourcesChanged(); - void NotifyReportsChanged(); + void NotifyReportsChanged(AttributionReport::ReportType report_type); void NotifySourceDeactivated(const DeactivatedSource& source); void NotifySourceHandled(const StorableSource& source, StorableSource::Result result); @@ -709,6 +710,9 @@ std::ostream& operator<<(std::ostream& out, const AttributionReport& report); +std::ostream& operator<<(std::ostream& out, + AttributionReport::ReportType report_type); + std::ostream& operator<<(std::ostream& out, SendResult::Status status); std::ostream& operator<<(std::ostream& out, const SendResult& info);
diff --git a/content/browser/attribution_reporting/attributions_browsertest.cc b/content/browser/attribution_reporting/attributions_browsertest.cc index 2ddc3f3..b71c5415 100644 --- a/content/browser/attribution_reporting/attributions_browsertest.cc +++ b/content/browser/attribution_reporting/attributions_browsertest.cc
@@ -822,8 +822,17 @@ expected_report.WaitForReport(); } +// TODO(crbug.com/1307363): Consistently failing on Linux MSAN and Linux +// ChromiumOS MSAN. +#if BUILDFLAG(IS_LINUX) +#define MAYBE_AttributionSrcNavigationSourceAndTrigger_ReportSent \ + DISABLED_AttributionSrcNavigationSourceAndTrigger_ReportSent +#else +#define MAYBE_AttributionSrcNavigationSourceAndTrigger_ReportSent \ + AttributionSrcNavigationSourceAndTrigger_ReportSent +#endif IN_PROC_BROWSER_TEST_F(AttributionsBrowserTest, - AttributionSrcNavigationSourceAndTrigger_ReportSent) { + MAYBE_AttributionSrcNavigationSourceAndTrigger_ReportSent) { // Expected reports must be registered before the server starts. ExpectedReportWaiter expected_report( GURL("https://a.test/.well-known/attribution-reporting/"
diff --git a/content/browser/attribution_reporting/rate_limit_table.cc b/content/browser/attribution_reporting/rate_limit_table.cc index b7233e6..e1d3afd2 100644 --- a/content/browser/attribution_reporting/rate_limit_table.cc +++ b/content/browser/attribution_reporting/rate_limit_table.cc
@@ -37,25 +37,25 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // All columns in this table are const. - // |impression_id| is the primary key of a row in the |impressions| table, + // |source_id| is the primary key of a row in the |impressions| table, // though the row may not exist. // |scope| is a serialized `RateLimitTable::Scope`. - // |impression_site| is the eTLD+1 of the impression. - // |impression_origin| is the origin of the impression. - // |conversion_destination| is the destination of the conversion. - // |conversion_origin| is the origin of the conversion. + // |source_site| is the eTLD+1 of the impression. + // |source_origin| is the origin of the impression. + // |destination_site| is the destination of the conversion. + // |destination_origin| is the origin of the conversion. // |reporting_origin| is the reporting origin of the impression/conversion. // |time| is the time of either the source registration or the attribution // trigger, depending on |scope|. static constexpr char kRateLimitTableSql[] = "CREATE TABLE IF NOT EXISTS rate_limits" - "(rate_limit_id INTEGER PRIMARY KEY NOT NULL," + "(id INTEGER PRIMARY KEY NOT NULL," "scope INTEGER NOT NULL," - "impression_id INTEGER NOT NULL," - "impression_site TEXT NOT NULL," - "impression_origin TEXT NOT NULL," - "conversion_destination TEXT NOT NULL," - "conversion_origin TEXT NOT NULL," + "source_id INTEGER NOT NULL," + "source_site TEXT NOT NULL," + "source_origin TEXT NOT NULL," + "destination_site TEXT NOT NULL," + "destination_origin TEXT NOT NULL," "reporting_origin TEXT NOT NULL," "time INTEGER NOT NULL)"; if (!db->Execute(kRateLimitTableSql)) @@ -67,7 +67,7 @@ // Optimizes calls to |AttributionAllowedForAttributionLimit()|. static constexpr char kRateLimitAttributionIndexSql[] = "CREATE INDEX IF NOT EXISTS rate_limit_attribution_idx ON rate_limits" - "(conversion_destination,impression_site,reporting_origin,time)" + "(destination_site,source_site,reporting_origin,time)" "WHERE scope=1"; if (!db->Execute(kRateLimitAttributionIndexSql)) return false; @@ -75,7 +75,7 @@ // Optimizes calls to |AllowedForReportingOriginLimit()|. static constexpr char kRateLimitReportingOriginIndexSql[] = "CREATE INDEX IF NOT EXISTS rate_limit_reporting_origin_idx " - "ON rate_limits(scope,conversion_destination,impression_site,time)"; + "ON rate_limits(scope,destination_site,source_site,time)"; if (!db->Execute(kRateLimitReportingOriginIndexSql)) return false; @@ -88,8 +88,8 @@ // Optimizes calls to |ClearDataForSourceIds()|. static constexpr char kRateLimitImpressionIdIndexSql[] = - "CREATE INDEX IF NOT EXISTS rate_limit_impression_id_idx " - "ON rate_limits(impression_id)"; + "CREATE INDEX IF NOT EXISTS rate_limit_source_id_idx " + "ON rate_limits(source_id)"; return db->Execute(kRateLimitImpressionIdIndexSql); } @@ -128,8 +128,8 @@ static constexpr char kStoreRateLimitSql[] = "INSERT INTO rate_limits" - "(scope,impression_id,impression_site,impression_origin," - "conversion_destination,conversion_origin,reporting_origin,time)" + "(scope,source_id,source_site,source_origin," + "destination_site,destination_origin,reporting_origin,time)" "VALUES(?,?,?,?,?,?,?,?)"; sql::Statement statement( db->GetCachedStatement(SQL_FROM_HERE, kStoreRateLimitSql)); @@ -165,8 +165,8 @@ "SELECT COUNT(*)FROM rate_limits " DCHECK_SQL_INDEXED_BY("rate_limit_attribution_idx") "WHERE scope=1 " - "AND impression_site=? " - "AND conversion_destination=? " + "AND source_site=? " + "AND destination_site=? " "AND reporting_origin=? " "AND time>?"; sql::Statement statement( @@ -232,8 +232,8 @@ "SELECT reporting_origin FROM rate_limits " DCHECK_SQL_INDEXED_BY("rate_limit_reporting_origin_idx") "WHERE scope=? " - "AND impression_site=? " - "AND conversion_destination=? " + "AND source_site=? " + "AND destination_site=? " "AND time>?"; sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSelectSql)); statement.BindInt(0, static_cast<int>(scope)); @@ -295,8 +295,7 @@ if (filter.is_null()) return ClearAllDataInRange(db, delete_begin, delete_end); - static constexpr char kDeleteSql[] = - "DELETE FROM rate_limits WHERE rate_limit_id=?"; + static constexpr char kDeleteSql[] = "DELETE FROM rate_limits WHERE id=?"; sql::Statement delete_statement( db->GetCachedStatement(SQL_FROM_HERE, kDeleteSql)); @@ -306,7 +305,7 @@ static constexpr char kSelectSql[] = // clang-format off - "SELECT rate_limit_id,impression_origin,conversion_origin," + "SELECT id,source_origin,destination_origin," "reporting_origin " "FROM rate_limits " DCHECK_SQL_INDEXED_BY("rate_limit_time_idx") @@ -361,7 +360,7 @@ return false; static constexpr char kDeleteRateLimitSql[] = - "DELETE FROM rate_limits WHERE impression_id = ?"; + "DELETE FROM rate_limits WHERE source_id = ?"; sql::Statement statement( db->GetCachedStatement(SQL_FROM_HERE, kDeleteRateLimitSql));
diff --git a/content/browser/attribution_reporting/rate_limit_table_unittest.cc b/content/browser/attribution_reporting/rate_limit_table_unittest.cc index 5e3ff88..50b88a1 100644 --- a/content/browser/attribution_reporting/rate_limit_table_unittest.cc +++ b/content/browser/attribution_reporting/rate_limit_table_unittest.cc
@@ -130,7 +130,7 @@ std::vector<std::pair<int64_t, RateLimitRow>> rows; static constexpr char kSelectSql[] = - "SELECT rate_limit_id,scope,impression_origin,conversion_origin," + "SELECT id,scope,source_origin,destination_origin," "reporting_origin,time FROM rate_limits"; sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, kSelectSql));
diff --git a/content/browser/byte_stream.h b/content/browser/byte_stream.h index 09ba51c..504646c 100644 --- a/content/browser/byte_stream.h +++ b/content/browser/byte_stream.h
@@ -70,7 +70,7 @@ // std::unique_ptr<ByteStreamReader> reader; // CreateByteStream( // GetIOThreadTaskRunner({}), -// base::CreateSequencedTaskRunner({base::MayBlock, ...}), +// base::ThreadPool::CreateSequencedTaskRunner({base::MayBlock, ...}), // kStreamBufferSize /* e.g. 10240. */, // &writer, // &reader); // Presumed passed to FILE thread for reading.
diff --git a/content/browser/cross_origin_opener_policy_browsertest.cc b/content/browser/cross_origin_opener_policy_browsertest.cc index aa97eb6f..b3e9009 100644 --- a/content/browser/cross_origin_opener_policy_browsertest.cc +++ b/content/browser/cross_origin_opener_policy_browsertest.cc
@@ -134,6 +134,16 @@ } } + // Provides meaningful param names instead of /0, /1, ... + static std::string DescribeParams( + const testing::TestParamInfo<ParamType>& info) { + auto [render_document_level, enable_back_forward_cache] = info.param; + return base::StringPrintf( + "%s_%s", + GetRenderDocumentLevelNameForTestParams(render_document_level).c_str(), + enable_back_forward_cache ? "BFCacheEnabled" : "BFCacheDisabled"); + } + bool IsBackForwardCacheEnabled() { return std::get<1>(GetParam()); } net::EmbeddedTestServer* https_server() { return &https_server_; } @@ -3394,18 +3404,30 @@ static auto kTestParams = testing::Combine(testing::ValuesIn(RenderDocumentFeatureLevelValues()), testing::Bool()); -INSTANTIATE_TEST_SUITE_P(All, CrossOriginOpenerPolicyBrowserTest, kTestParams); -INSTANTIATE_TEST_SUITE_P(All, VirtualBrowsingContextGroupTest, kTestParams); -INSTANTIATE_TEST_SUITE_P(All, NoSharedArrayBufferByDefault, kTestParams); +INSTANTIATE_TEST_SUITE_P(All, + CrossOriginOpenerPolicyBrowserTest, + kTestParams, + CrossOriginOpenerPolicyBrowserTest::DescribeParams); +INSTANTIATE_TEST_SUITE_P(All, + VirtualBrowsingContextGroupTest, + kTestParams, + CrossOriginOpenerPolicyBrowserTest::DescribeParams); +INSTANTIATE_TEST_SUITE_P(All, + NoSharedArrayBufferByDefault, + kTestParams, + CrossOriginOpenerPolicyBrowserTest::DescribeParams); INSTANTIATE_TEST_SUITE_P(All, SoapByDefaultVirtualBrowsingContextGroupTest, - kTestParams); + kTestParams, + CrossOriginOpenerPolicyBrowserTest::DescribeParams); INSTANTIATE_TEST_SUITE_P(All, SameOriginAllowPopupsPlusCoepBrowserTest, - kTestParams); + kTestParams, + CrossOriginOpenerPolicyBrowserTest::DescribeParams); INSTANTIATE_TEST_SUITE_P(All, NoSiteIsolationCrossOriginIsolationBrowserTest, - kTestParams); + kTestParams, + CrossOriginOpenerPolicyBrowserTest::DescribeParams); IN_PROC_BROWSER_TEST_P(NoSharedArrayBufferByDefault, BaseCase) { GURL url = https_server()->GetURL("a.test", "/empty.html"); @@ -3866,7 +3888,8 @@ INSTANTIATE_TEST_SUITE_P(All, SharedArrayBufferOnDesktopBrowserTest, - kTestParams); + kTestParams, + CrossOriginOpenerPolicyBrowserTest::DescribeParams); IN_PROC_BROWSER_TEST_P(SharedArrayBufferOnDesktopBrowserTest, DesktopHasSharedArrayBuffer) {
diff --git a/content/browser/file_system_access/file_system_access_capacity_allocation_host_impl_browsertest.cc b/content/browser/file_system_access/file_system_access_capacity_allocation_host_impl_browsertest.cc index 4ac52a2..86592726 100644 --- a/content/browser/file_system_access/file_system_access_capacity_allocation_host_impl_browsertest.cc +++ b/content/browser/file_system_access/file_system_access_capacity_allocation_host_impl_browsertest.cc
@@ -100,7 +100,7 @@ runOnWorkerAndWaitForResult(` let root = await navigator.storage.getDirectory(); let fh = await root.getFileHandle('test_closing', {create: false}); - let ah = await fh.createSyncAccessHandle(); + let ah = await fh.createSyncAccessHandle({mode: 'in-place'}); await ah.truncate(100); await ah.truncate(10); await ah.close(); @@ -131,7 +131,7 @@ runOnWorkerAndWaitForResult(` let root = await navigator.storage.getDirectory(); let fh = await root.getFileHandle('test_existing', {create: true}); - let ah = await fh.createSyncAccessHandle(); + let ah = await fh.createSyncAccessHandle({mode: 'in-place'}); await ah.truncate(100); await ah.close(); return true; @@ -147,7 +147,7 @@ runOnWorkerAndWaitForResult(` let root = await navigator.storage.getDirectory(); let fh = await root.getFileHandle('test_existing', {create: false}); - let ah = await fh.createSyncAccessHandle(); + let ah = await fh.createSyncAccessHandle({mode: 'in-place'}); await ah.truncate(0); await ah.close(); return true; @@ -185,7 +185,7 @@ runOnWorkerAndWaitForResult(` let root = await navigator.storage.getDirectory(); let fh = await root.getFileHandle('test_file_small', {create: true}); - let ah = await fh.createSyncAccessHandle(); + let ah = await fh.createSyncAccessHandle({mode: 'in-place'}); let storage_manager = await navigator.storage.estimate(); let usage_before_operation = storage_manager.usageDetails.fileSystem; await ah.truncate(100); @@ -201,7 +201,7 @@ runOnWorkerAndWaitForResult(` let root = await navigator.storage.getDirectory(); let fh = await root.getFileHandle('test_file_medium', {create: true}); - let ah = await fh.createSyncAccessHandle(); + let ah = await fh.createSyncAccessHandle({mode: 'in-place'}); let storage_manager = await navigator.storage.estimate(); let usage_before_operation = storage_manager.usageDetails.fileSystem; let new_file_size = 3*1024*1024;
diff --git a/content/browser/renderer_host/render_widget_host_view_child_frame.cc b/content/browser/renderer_host/render_widget_host_view_child_frame.cc index 1430b7c9..c56d5c0 100644 --- a/content/browser/renderer_host/render_widget_host_view_child_frame.cc +++ b/content/browser/renderer_host/render_widget_host_view_child_frame.cc
@@ -497,9 +497,13 @@ host()->SetIntersectsViewport( !intersection_state.viewport_intersection.IsEmpty()); - // Do not send viewport intersection to main frames. + // Do not send |visual_properties| to main frames. DCHECK(!visual_properties.has_value() || !host()->owner_delegate()); - if (!host()->owner_delegate()) { + + // TODO(crbug.com/1148960): Also propagate this for portals. + bool is_fenced_frame = + host()->frame_tree()->type() == FrameTree::Type::kFencedFrame; + if (!host()->owner_delegate() || is_fenced_frame) { host()->GetAssociatedFrameWidget()->SetViewportIntersection( intersection_state.Clone(), visual_properties); }
diff --git a/content/browser/renderer_host/render_widget_host_view_child_frame_unittest.cc b/content/browser/renderer_host/render_widget_host_view_child_frame_unittest.cc index 3daf804e..8e2d464 100644 --- a/content/browser/renderer_host/render_widget_host_view_child_frame_unittest.cc +++ b/content/browser/renderer_host/render_widget_host_view_child_frame_unittest.cc
@@ -24,9 +24,12 @@ #include "content/browser/renderer_host/agent_scheduling_group_host.h" #include "content/browser/renderer_host/cross_process_frame_connector.h" #include "content/browser/renderer_host/frame_token_message_queue.h" +#include "content/browser/renderer_host/frame_tree.h" #include "content/browser/renderer_host/render_widget_host_delegate.h" #include "content/browser/renderer_host/render_widget_host_impl.h" #include "content/public/browser/render_widget_host_view.h" +#include "content/public/browser/site_instance.h" +#include "content/public/browser/web_contents.h" #include "content/public/test/browser_task_environment.h" #include "content/public/test/fake_frame_widget.h" #include "content/public/test/mock_render_process_host.h" @@ -35,6 +38,7 @@ #include "content/test/mock_widget.h" #include "content/test/test_render_view_host.h" #include "content/test/test_render_widget_host.h" +#include "content/test/test_web_contents.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" @@ -126,9 +130,13 @@ int32_t routing_id = process_host_->GetNextRoutingID(); sink_ = &process_host_->sink(); + web_contents_ = TestWebContents::Create( + browser_context_.get(), + SiteInstanceImpl::Create(browser_context_.get())); + widget_host_ = RenderWidgetHostImpl::Create( - /*frame_tree=*/nullptr, &delegate_, *agent_scheduling_group_host_, - routing_id, + /*frame_tree=*/&web_contents_->GetPrimaryFrameTree(), &delegate_, + *agent_scheduling_group_host_, routing_id, /*hidden=*/false, /*renderer_initiated_creation=*/false, std::make_unique<FrameTokenMessageQueue>()); @@ -161,6 +169,7 @@ if (view_) view_->Destroy(); widget_host_.reset(); + web_contents_.reset(); process_host_->Cleanup(); agent_scheduling_group_host_ = nullptr; delete test_frame_connector_; @@ -191,6 +200,7 @@ std::unique_ptr<BrowserContext> browser_context_; std::unique_ptr<AgentSchedulingGroupHost> agent_scheduling_group_host_; std::unique_ptr<MockRenderProcessHost> process_host_; + std::unique_ptr<WebContentsImpl> web_contents_; raw_ptr<IPC::TestSink> sink_ = nullptr; MockRenderWidgetHostDelegate delegate_; MockWidget widget_;
diff --git a/content/browser/resources/attribution_reporting/attribution_internals.html b/content/browser/resources/attribution_reporting/attribution_internals.html index 09f9caf..0c32129 100644 --- a/content/browser/resources/attribution_reporting/attribution_internals.html +++ b/content/browser/resources/attribution_reporting/attribution_internals.html
@@ -20,6 +20,9 @@ <div id="info"> <p>Attribution reporting is currently <span id="feature-status-content"></span> in this browser. </div> +<div> + <span id="debug-mode-content"></span> +</div> <hr> <div id="page-content"> <div> @@ -30,16 +33,20 @@ <div class="content"> <div class="table-wrapper" id="source-table-wrapper"></div> </div> - <h2> Sent and Pending Reports </h2> + <h2> Sent and Pending Event-Level Reports </h2> <div class="content"> <div> - <button id="send-reports" disabled>Send Selected Pending Reports</button> - </div> - <div> - <span id="debug-mode-content"></span> + <button id="send-reports" disabled>Send Selected Pending Event-Level Reports</button> </div> <div class="table-wrapper" id="report-table-wrapper"></div> </div> + <h2> Sent and Pending Aggregatable Reports </h2> + <div class="content"> + <div> + <button id="send-aggregatable-reports" disabled>Send Selected Pending Aggregatable Reports</button> + </div> + <div class="table-wrapper" id="aggregatable-report-table-wrapper"></div> + </div> </div> </body> </html>
diff --git a/content/browser/resources/attribution_reporting/attribution_internals.js b/content/browser/resources/attribution_reporting/attribution_internals.js index 9b445f1c..a8dd7d6 100644 --- a/content/browser/resources/attribution_reporting/attribution_internals.js +++ b/content/browser/resources/attribution_reporting/attribution_internals.js
@@ -7,7 +7,7 @@ import {$, getRequiredElement} from 'chrome://resources/js/util.m.js'; import {Origin} from 'chrome://resources/mojo/url/mojom/origin.mojom-webui.js'; -import {AttributionInternalsHandler, AttributionInternalsHandlerRemote, AttributionInternalsObserverInterface, AttributionInternalsObserverReceiver, AttributionSourceType, WebUIAttributionReport, WebUIAttributionReport_Status, WebUIAttributionSource, WebUIAttributionSource_Attributability} from './attribution_internals.mojom-webui.js'; +import {AttributionInternalsHandler, AttributionInternalsHandlerRemote, AttributionInternalsObserverInterface, AttributionInternalsObserverReceiver, AttributionReportAggregatableAttributionID, AttributionReportEventLevelID, AttributionReportType, AttributionSourceType, WebUIAttributionReport, WebUIAttributionReport_Status, WebUIAttributionSource, WebUIAttributionSource_Attributability} from './attribution_internals.mojom-webui.js'; /** * @template T @@ -495,21 +495,23 @@ } } +/** + * @template ID + */ class Report extends Selectable { /** * @param {!WebUIAttributionReport} mojo + * @param {ID} id */ - constructor(mojo) { + constructor(mojo, id) { super(); - this.id = mojo.id; + this.id = id; this.reportBody = mojo.reportBody; this.attributionDestination = mojo.attributionDestination; this.reportUrl = mojo.reportUrl.url; this.triggerTime = new Date(mojo.triggerTime); this.reportTime = new Date(mojo.reportTime); - this.reportPriority = mojo.priority; - this.attributedTruthfully = mojo.attributedTruthfully; // Only pending reports are selectable. if (this.id === null || @@ -555,39 +557,60 @@ case WebUIAttributionReport_Status.kNoMatchingSourceFilterData: this.status = 'Dropped due to no matching source filter data'; break; + case WebUIAttributionReport_Status.kFailedToAssemble: + this.status = 'Dropped due to assembly failure'; + break; + case WebUIAttributionReport_Status.kInsufficientAggregatableBudget: + this.status = 'Dropped due to insufficient aggregatable budget'; + break; } } } -/** @extends {TableModel<Report>} */ +/** @extends {Report<!AttributionReportEventLevelID>} */ +class EventLevelReport extends Report { + /** + * @param {!WebUIAttributionReport} mojo + */ + constructor(mojo) { + super(mojo, mojo.data.eventLevelData.id); + + this.reportPriority = mojo.data.eventLevelData.priority; + this.attributedTruthfully = mojo.data.eventLevelData.attributedTruthfully; + } +} + +/** @extends {Report<!AttributionReportAggregatableAttributionID>} */ +class AggregatableAttributionReport extends Report { + /** + * @param {!WebUIAttributionReport} mojo + */ + constructor(mojo) { + super(mojo, mojo.data.aggregatableAttributionData.id); + + this.contributions = JSON.stringify( + mojo.data.aggregatableAttributionData.contributions, + (key, value) => + typeof value === 'bigint' ? value.toString() : value); + } +} + +/** + * @template ID + * @extends {TableModel<Report<ID>>} + */ class ReportTableModel extends TableModel { constructor() { super(); this.selectionColumn = new SelectionColumn(this); - this.cols = [ - this.selectionColumn, - new CodeColumn('Report Body', (e) => e.reportBody), - new ValueColumn('Destination', (e) => e.attributionDestination), - new ValueColumn('Report URL', (e) => e.reportUrl), - new DateColumn('Trigger Time', (e) => e.triggerTime), - new DateColumn('Report Time', (e) => e.reportTime), - new ValueColumn('Report Priority', (e) => e.reportPriority), - new ValueColumn( - 'Fake Report', (e) => e.attributedTruthfully ? 'no' : 'yes'), - new ValueColumn('Status', (e) => e.status), - ]; - this.emptyRowText = 'No sent or pending reports.'; - // Sort by report time by default. - this.sortIdx = 5; - - /** @type {!Array<!Report>} */ + /** @type {!Array<!Report<ID>>} */ this.sentOrDroppedReports = []; - /** @type {!Array<!Report>} */ + /** @type {!Array<!Report<ID>>} */ this.storedReports = []; } @@ -603,13 +626,13 @@ return this.sentOrDroppedReports.concat(this.storedReports); } - /** @param {!Array<!Report>} storedReports */ + /** @param {!Array<!Report<ID>>} storedReports */ setStoredReports(storedReports) { this.storedReports = storedReports; this.notifyRowsChanged(); } - /** @param {!Report} report */ + /** @param {!Report<ID>} report */ addSentOrDroppedReport(report) { // Prevent the page from consuming ever more memory if the user leaves the // page open for a long time. @@ -626,8 +649,66 @@ this.sentOrDroppedReports = []; this.notifyRowsChanged(); } + + /** + * @return {Array<ID>} + */ + getSelectedIDs() { + const ids = []; + this.storedReports.forEach((report) => { + if (!report.input.disabled && report.input.checked && report.id !== null) { + ids.push(report.id); + } + }); + return ids; + } } +/** @extends {ReportTableModel<!AttributionReportEventLevelID>} */ +class EventLevelReportTableModel extends ReportTableModel { + constructor() { + super(); + + this.cols = [ + this.selectionColumn, + new CodeColumn('Report Body', (e) => e.reportBody), + new ValueColumn('Destination', (e) => e.attributionDestination), + new ValueColumn('Report URL', (e) => e.reportUrl), + new DateColumn('Trigger Time', (e) => e.triggerTime), + new DateColumn('Report Time', (e) => e.reportTime), + new ValueColumn('Report Priority', (e) => e.reportPriority), + new ValueColumn( + 'Fake Report', (e) => e.attributedTruthfully ? 'no' : 'yes'), + new ValueColumn('Status', (e) => e.status), + ]; + + // Sort by report time by default. + this.sortIdx = 5; + } +} + +/** @extends {ReportTableModel<!AttributionReportAggregatableAttributionID>} */ +class AggregatableAttributionReportTableModel extends ReportTableModel { + constructor() { + super(); + + this.cols = [ + this.selectionColumn, + new CodeColumn('Report Body', (e) => e.reportBody), + new ValueColumn('Destination', (e) => e.attributionDestination), + new ValueColumn('Report URL', (e) => e.reportUrl), + new DateColumn('Trigger Time', (e) => e.triggerTime), + new DateColumn('Report Time', (e) => e.reportTime), + new CodeColumn('Histograms', (e) => e.contributions), + new ValueColumn('Status', (e) => e.status), + ]; + + // Sort by report time by default. + this.sortIdx = 5; + } +} + + /** * Reference to the backend providing all the data. * @type {?AttributionInternalsHandlerRemote} @@ -638,8 +719,11 @@ /** @type {?SourceTableModel} */ let sourceTableModel = null; -/** @type {?ReportTableModel} */ -let reportTableModel = null; +/** @type {?EventLevelReportTableModel} */ +let eventLevelReportTableModel = null; + +/** @type {?AggregatableAttributionReportTableModel} */ +let aggregatableAttributionReportTableModel = null; /** * Converts a mojo origin into a user-readable string, omitting default ports. @@ -727,7 +811,8 @@ }); updateSources(); - updateReports(); + updateReports(AttributionReportType.kEventLevel); + updateReports(AttributionReportType.kAggregatableAttribution); } function updateSources() { @@ -737,10 +822,27 @@ }); } -function updateReports() { - pageHandler.getReports().then((response) => { - reportTableModel.setStoredReports( - response.reports.map((mojo) => new Report(mojo))); +/** + * @param {!AttributionReportType} reportType + */ +function updateReports(reportType) { + pageHandler.getReports(reportType).then((response) => { + switch (reportType) { + case AttributionReportType.kEventLevel: + eventLevelReportTableModel.setStoredReports( + response.reports + .filter((mojo) => mojo.data.eventLevelData !== undefined) + .map((mojo) => new EventLevelReport(mojo))); + break; + case AttributionReportType.kAggregatableAttribution: + aggregatableAttributionReportTableModel.setStoredReports( + response.reports + .filter( + (mojo) => + mojo.data.aggregatableAttributionData !== undefined) + .map((mojo) => new AggregatableAttributionReport(mojo))); + break; + } }); } @@ -752,7 +854,8 @@ */ function clearStorage() { sourceTableModel.clear(); - reportTableModel.clear(); + eventLevelReportTableModel.clear(); + aggregatableAttributionReportTableModel.clear(); pageHandler.clearStorage(); } @@ -763,29 +866,55 @@ * automatically as reports are deleted, so there's no need to manually refresh * the data on completion. */ -function sendReports() { - const ids = []; - reportTableModel.storedReports.forEach((report) => { - if (!report.input.disabled && report.input.checked && report.id !== null) { - ids.push(report.id); - } - }); +function sendEventLevelReports() { + const ids = eventLevelReportTableModel.getSelectedIDs(); if (ids.length === 0) { return; } const button = $('send-reports'); - const previousText = $('send-reports').innerText; + const previousText = button.innerText; button.disabled = true; button.innerText = 'Sending...'; - pageHandler.sendReports(ids).then(() => { + pageHandler.sendEventLevelReports(ids).then(() => { button.innerText = previousText; }); } +function sendAggregatableAttributionReports() { + const ids = aggregatableAttributionReportTableModel.getSelectedIDs(); + + if (ids.length === 0) { + return; + } + + const button = $('send-aggregatable-reports'); + const previousText = $('send-aggregatable-reports').innerText; + + button.disabled = true; + button.innerText = 'Sending...'; + + pageHandler.sendAggregatableAttributionReports(ids).then(() => { + button.innerText = previousText; + }); +} + +/** + * @param {!WebUIAttributionReport} mojo + */ +function addSentOrDroppedReport(mojo) { + if (mojo.data.eventLevelData !== undefined) { + eventLevelReportTableModel.addSentOrDroppedReport( + new EventLevelReport(mojo)); + } else { + aggregatableAttributionReportTableModel.addSentOrDroppedReport( + new AggregatableAttributionReport(mojo)); + } +} + /** @implements {AttributionInternalsObserverInterface} */ class Observer { /** @override */ @@ -794,8 +923,8 @@ } /** @override */ - onReportsChanged() { - updateReports(); + onReportsChanged(reportType) { + updateReports(reportType); } /** @override */ @@ -805,12 +934,12 @@ /** @override */ onReportSent(mojo) { - reportTableModel.addSentOrDroppedReport(new Report(mojo)); + addSentOrDroppedReport(mojo); } /** @override */ onReportDropped(mojo) { - reportTableModel.addSentOrDroppedReport(new Report(mojo)); + addSentOrDroppedReport(mojo); } } @@ -819,20 +948,35 @@ pageHandler = AttributionInternalsHandler.getRemote(); sourceTableModel = new SourceTableModel(); - reportTableModel = new ReportTableModel(); + eventLevelReportTableModel = new EventLevelReportTableModel(); + aggregatableAttributionReportTableModel = + new AggregatableAttributionReportTableModel(); $('refresh').addEventListener('click', updatePageData); $('clear-data').addEventListener('click', clearStorage); - const sendReportsButton = $('send-reports'); - sendReportsButton.addEventListener('click', sendReports); - reportTableModel.selectionColumn.selectionChangedListeners.add( + const sendEventLevelReportsButton = $('send-reports'); + sendEventLevelReportsButton.addEventListener('click', sendEventLevelReports); + eventLevelReportTableModel.selectionColumn.selectionChangedListeners.add( (anySelected) => { - sendReportsButton.disabled = !anySelected; + sendEventLevelReportsButton.disabled = !anySelected; + }); + + const sendAggregatableAttributionReportsButton = + $('send-aggregatable-reports'); + sendAggregatableAttributionReportsButton.addEventListener( + 'click', sendAggregatableAttributionReports); + aggregatableAttributionReportTableModel.selectionColumn + .selectionChangedListeners.add((anySelected) => { + sendAggregatableAttributionReportsButton.disabled = !anySelected; }); Table.decorate(getRequiredElement('source-table-wrapper'), sourceTableModel); - Table.decorate(getRequiredElement('report-table-wrapper'), reportTableModel); + Table.decorate( + getRequiredElement('report-table-wrapper'), eventLevelReportTableModel); + Table.decorate( + getRequiredElement('aggregatable-report-table-wrapper'), + aggregatableAttributionReportTableModel); const receiver = new AttributionInternalsObserverReceiver(new Observer()); pageHandler.addObserver(receiver.$.bindNewPipeAndPassRemote());
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 4e5d3e39..62818b1 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -517,7 +517,7 @@ // ui::ColorProviderSource: const ui::ColorProvider* GetColorProvider() const override { return ui::ColorProviderManager::Get().GetColorProviderFor( - ui::NativeTheme::GetInstanceForWeb()->GetColorProviderKey(nullptr)); + GetColorProviderKey()); } // ui::NativeThemeObserver: @@ -526,6 +526,12 @@ NotifyColorProviderChanged(); } + protected: + // ui::ColorProviderSource: + ui::ColorProviderManager::Key GetColorProviderKey() const override { + return ui::NativeTheme::GetInstanceForWeb()->GetColorProviderKey(nullptr); + } + private: base::ScopedObservation<ui::NativeTheme, ui::NativeThemeObserver> native_theme_observation_{this};
diff --git a/content/public/browser/browser_task_traits.h b/content/public/browser/browser_task_traits.h index 6b89fae8..e1d7749 100644 --- a/content/public/browser/browser_task_traits.h +++ b/content/public/browser/browser_task_traits.h
@@ -69,8 +69,6 @@ // in the order they were posted, regardless of the TaskRunners they were // posted via. // -// See //base/task/post_task.h for more detailed documentation. -// // Posting to a BrowserThread must only be done after it was initialized (ref. // BrowserMainLoop::CreateThreads() phase). class CONTENT_EXPORT BrowserTaskTraitsExtension {
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index 2ec697d0..a6fcfa8 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -1159,7 +1159,7 @@ // process fore/background state change. const base::Feature kChangeServiceWorkerPriorityForClientForegroundStateChange{ "ChangeServiceWorkerPriorityForClientForegroundStateChange", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; #if BUILDFLAG(IS_ANDROID) // Allows the use of page zoom in place of accessibility text autosizing, and
diff --git a/content/test/attribution_simulator_impl.cc b/content/test/attribution_simulator_impl.cc index 67b2a89..7c8520d 100644 --- a/content/test/attribution_simulator_impl.cc +++ b/content/test/attribution_simulator_impl.cc
@@ -328,6 +328,7 @@ base::RunLoop loop; manager->GetPendingReportsForInternalUse( + AttributionReport::ReportType::kEventLevel, base::BindLambdaForTesting([&](std::vector<AttributionReport> reports) { if (!reports.empty()) { last_report_time = base::ranges::max(reports, /*comp=*/{},
diff --git a/content/test/data/accessibility/aria/aria-owns-included-in-tree-expected-auralinux.txt b/content/test/data/accessibility/aria/aria-owns-included-in-tree-expected-auralinux.txt index 0a6872f..552c40d1f2 100644 --- a/content/test/data/accessibility/aria/aria-owns-included-in-tree-expected-auralinux.txt +++ b/content/test/data/accessibility/aria/aria-owns-included-in-tree-expected-auralinux.txt
@@ -1,21 +1,22 @@ [document web] -++[separator] name='Control: elements that are not in tree' horizontal ++[section] +++++[separator] name='Control: elements that are not in tree' horizontal ++++[section] ++++++[section] -++++++++[entry] selectable-text -++[separator] name='An aria-owned element is always in tree' horizontal -++[panel] -++++[push button] name='button-in-owned-tree' -++[separator] name='Element with aria-owns is always in tree' horizontal -++[section] -++++[entry] selectable-text -++[separator] name='Owning an element with unincluded ancestors serializes cleanly' horizontal -++[panel] -++++[check box] checkable:true -++[separator] name='All the above in one' horizontal -++[section] +++++++++[section] +++++++++++[entry] selectable-text +++++[separator] name='An aria-owned element is always in tree' horizontal +++++[panel] +++++++[push button] name='button-in-owned-tree' +++++[separator] name='Element with aria-owns is always in tree' horizontal ++++[section] -++++++[static] name='xyz' +++++++[entry] selectable-text +++++[separator] name='Owning an element with unincluded ancestors serializes cleanly' horizontal +++++[panel] +++++++[check box] checkable:true +++++[separator] name='All the above in one' horizontal ++++[section] -++++++[slider] horizontal current=50.000000 minimum=0.000000 maximum=100.000000 +++++++[section] +++++++++[static] name='xyz' +++++++[section] +++++++++[slider] horizontal current=50.000000 minimum=0.000000 maximum=100.000000
diff --git a/content/test/data/accessibility/aria/aria-owns-included-in-tree-expected-blink.txt b/content/test/data/accessibility/aria/aria-owns-included-in-tree-expected-blink.txt index 86297cd..a768635 100644 --- a/content/test/data/accessibility/aria/aria-owns-included-in-tree-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-owns-included-in-tree-expected-blink.txt
@@ -1,6 +1,6 @@ rootWebArea ++genericContainer ignored -++++genericContainer ignored +++++genericContainer ++++++genericContainer ignored ++++++++splitter horizontal name='Control: elements that are not in tree' ++++++++genericContainer ignored
diff --git a/content/test/data/accessibility/aria/label-with-selected-option-expected-blink.txt b/content/test/data/accessibility/aria/label-with-selected-option-expected-blink.txt index f24d099..170e69f 100644 --- a/content/test/data/accessibility/aria/label-with-selected-option-expected-blink.txt +++ b/content/test/data/accessibility/aria/label-with-selected-option-expected-blink.txt
@@ -1,7 +1,7 @@ rootWebArea ++genericContainer ignored ++++genericContainer ignored -++++++genericContainer ignored +++++++genericContainer ++++++++checkBox name='Test 1: Flash the screen 2 times.' checkedState=false ++++++++labelText ++++++++++staticText name='Test 1: Flash the screen' @@ -18,7 +18,7 @@ ++++++++++++++++inlineTextBox name='3' ++++++++++staticText name='times.' ++++++++++++inlineTextBox name='times.' -++++++genericContainer ignored +++++++genericContainer ++++++++checkBox name='Test 2: Flash the screen 2 times.' checkedState=false ++++++++labelText ++++++++++staticText name='Test 2: Flash the screen' @@ -37,7 +37,7 @@ ++++++++++++++++++inlineTextBox name='3' ++++++++++staticText name='times.' ++++++++++++inlineTextBox name='times.' -++++++genericContainer ignored +++++++genericContainer ++++++++checkBox name='Test 3: Flash the screen two times.' checkedState=false ++++++++labelText ++++++++++staticText name='Test 3: Flash the screen' @@ -54,7 +54,7 @@ ++++++++++++++++inlineTextBox name='3' ++++++++++staticText name='times.' ++++++++++++inlineTextBox name='times.' -++++++genericContainer ignored +++++++genericContainer ++++++++checkBox name='Test 4: Flash the screen two times.' checkedState=false ++++++++labelText ++++++++++staticText name='Test 4: Flash the screen' @@ -73,7 +73,7 @@ ++++++++++++++++++inlineTextBox name='3' ++++++++++staticText name='times.' ++++++++++++inlineTextBox name='times.' -++++++genericContainer ignored +++++++genericContainer ++++++++checkBox name='Test 5: Flash the screen two times.' checkedState=false ++++++++labelText ++++++++++staticText name='Test 5: Flash the screen'
diff --git a/content/test/data/accessibility/css/before-after-block-expected-blink.txt b/content/test/data/accessibility/css/before-after-block-expected-blink.txt index 344d34c..8cb1b0a2 100644 --- a/content/test/data/accessibility/css/before-after-block-expected-blink.txt +++ b/content/test/data/accessibility/css/before-after-block-expected-blink.txt
@@ -1,7 +1,7 @@ rootWebArea htmlTag='#document' ++genericContainer ignored htmlTag='html' ++++genericContainer ignored htmlTag='body' -++++++genericContainer ignored htmlTag='div' +++++++genericContainer htmlTag='div' ++++++++staticText name='A' ++++++++++inlineTextBox name='A' ++++++++genericContainer ignored htmlTag='b'
diff --git a/content/test/data/accessibility/css/before-after-code-expected-android-external.txt b/content/test/data/accessibility/css/before-after-code-expected-android-external.txt index 0906446..f1ca5d2f 100644 --- a/content/test/data/accessibility/css/before-after-code-expected-android-external.txt +++ b/content/test/data/accessibility/css/before-after-code-expected-android-external.txt
@@ -1,24 +1,4 @@ WebView focusable focused scrollable actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"] ++TextView text:"start" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="genericContainer"] -++TextView text:"text with " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++TextView text:"[" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++TextView text:":before" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++TextView text:"]" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++TextView text:" and " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++TextView text:"[" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++TextView text:":after" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++TextView text:"]" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++TextView text:" content, then a" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++TextView text:"bold" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++TextView text:" element with a " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++TextView text:"[" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++TextView text:"block" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++TextView text:"]" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++TextView text:" before content then a " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++TextView text:"italic" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++TextView text:"element with a " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++TextView text:"[" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++TextView text:"block" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++TextView text:"]" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++TextView text:" after content" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] +++TextView text:"text with [:before] and [:after] content, then abold element with a [block] before content then a italicelement with a [block] after content" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="genericContainer"] ++TextView text:"end" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="genericContainer"] \ No newline at end of file
diff --git a/content/test/data/accessibility/html/a-nested-structure-expected-android-external.txt b/content/test/data/accessibility/html/a-nested-structure-expected-android-external.txt index b7d1548..6d58949 100644 --- a/content/test/data/accessibility/html/a-nested-structure-expected-android-external.txt +++ b/content/test/data/accessibility/html/a-nested-structure-expected-android-external.txt
@@ -1,13 +1,14 @@ WebView focusable focused scrollable actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"] -++View text:"null" contentDescription:"Header 1 List element 1 List element 2 List element 3" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="link", clickableScore="300", roleDescription="link", targetUrl="http://www.foobar.com/"] -++++TextView text:"Header 1" CollectionItemInfo:[heading, rowIndex=0, rowSpan=0, colIndex=0, colSpan=0] actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="heading", clickableScore="100", roleDescription="heading 1"] -++++ListView CollectionInfo:[rows=3, cols=0] actions:[AX_FOCUS] bundle:[chromeRole="list", clickableScore="100"] -++++++View CollectionItemInfo:[rowIndex=0, rowSpan=0, colIndex=0, colSpan=0] actions:[AX_FOCUS] bundle:[chromeRole="listItem", clickableScore="100"] -++++++++View text:"• " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="listMarker", clickableScore="100"] -++++++++TextView text:"List element 1" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++++++View CollectionItemInfo:[rowIndex=1, rowSpan=0, colIndex=0, colSpan=0] actions:[AX_FOCUS] bundle:[chromeRole="listItem", clickableScore="100"] -++++++++View text:"• " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="listMarker", clickableScore="100"] -++++++++TextView text:"List element 2" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++++++View CollectionItemInfo:[rowIndex=2, rowSpan=0, colIndex=0, colSpan=0] actions:[AX_FOCUS] bundle:[chromeRole="listItem", clickableScore="100"] -++++++++View text:"• " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="listMarker", clickableScore="100"] -++++++++TextView text:"List element 3" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] \ No newline at end of file +++View actions:[AX_FOCUS] bundle:[chromeRole="genericContainer"] +++++View text:"null" contentDescription:"Header 1 List element 1 List element 2 List element 3" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="link", clickableScore="300", roleDescription="link", targetUrl="http://www.foobar.com/"] +++++++TextView text:"Header 1" CollectionItemInfo:[heading, rowIndex=0, rowSpan=0, colIndex=0, colSpan=0] actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="heading", clickableScore="100", roleDescription="heading 1"] +++++++ListView CollectionInfo:[rows=3, cols=0] actions:[AX_FOCUS] bundle:[chromeRole="list", clickableScore="100"] +++++++++View CollectionItemInfo:[rowIndex=0, rowSpan=0, colIndex=0, colSpan=0] actions:[AX_FOCUS] bundle:[chromeRole="listItem", clickableScore="100"] +++++++++++View text:"• " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="listMarker", clickableScore="100"] +++++++++++TextView text:"List element 1" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] +++++++++View CollectionItemInfo:[rowIndex=1, rowSpan=0, colIndex=0, colSpan=0] actions:[AX_FOCUS] bundle:[chromeRole="listItem", clickableScore="100"] +++++++++++View text:"• " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="listMarker", clickableScore="100"] +++++++++++TextView text:"List element 2" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] +++++++++View CollectionItemInfo:[rowIndex=2, rowSpan=0, colIndex=0, colSpan=0] actions:[AX_FOCUS] bundle:[chromeRole="listItem", clickableScore="100"] +++++++++++View text:"• " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="listMarker", clickableScore="100"] +++++++++++TextView text:"List element 3" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] \ No newline at end of file
diff --git a/content/test/data/accessibility/html/a-nested-structure-expected-android.txt b/content/test/data/accessibility/html/a-nested-structure-expected-android.txt index fac36600..1d08501 100644 --- a/content/test/data/accessibility/html/a-nested-structure-expected-android.txt +++ b/content/test/data/accessibility/html/a-nested-structure-expected-android.txt
@@ -1,13 +1,14 @@ android.webkit.WebView focusable focused scrollable -++android.view.View role_description='link' clickable focusable link name='Header 1 List element 1 List element 2 List element 3' -++++android.widget.TextView role_description='heading 1' heading name='Header 1' -++++android.widget.ListView collection item_count=3 row_count=3 -++++++android.view.View collection_item -++++++++android.view.View name='%E2%80%A2 ' -++++++++android.widget.TextView name='List element 1' -++++++android.view.View collection_item item_index=1 row_index=1 -++++++++android.view.View name='%E2%80%A2 ' -++++++++android.widget.TextView name='List element 2' -++++++android.view.View collection_item item_index=2 row_index=2 -++++++++android.view.View name='%E2%80%A2 ' -++++++++android.widget.TextView name='List element 3' \ No newline at end of file +++android.view.View +++++android.view.View role_description='link' clickable focusable link name='Header 1 List element 1 List element 2 List element 3' +++++++android.widget.TextView role_description='heading 1' heading name='Header 1' +++++++android.widget.ListView collection item_count=3 row_count=3 +++++++++android.view.View collection_item +++++++++++android.view.View name='%E2%80%A2 ' +++++++++++android.widget.TextView name='List element 1' +++++++++android.view.View collection_item item_index=1 row_index=1 +++++++++++android.view.View name='%E2%80%A2 ' +++++++++++android.widget.TextView name='List element 2' +++++++++android.view.View collection_item item_index=2 row_index=2 +++++++++++android.view.View name='%E2%80%A2 ' +++++++++++android.widget.TextView name='List element 3' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/a-nested-structure-expected-auralinux.txt b/content/test/data/accessibility/html/a-nested-structure-expected-auralinux.txt index b34baeb3..2bb42c14 100644 --- a/content/test/data/accessibility/html/a-nested-structure-expected-auralinux.txt +++ b/content/test/data/accessibility/html/a-nested-structure-expected-auralinux.txt
@@ -1,14 +1,15 @@ [document web] -++[link] name='Header 1 List element 1 List element 2 List element 3' -++++[heading] name='Header 1' -++++++[static] name='Header 1' -++++[list] -++++++[list item] -++++++++[static] name='%E2%80%A2 ' -++++++++[static] name='List element 1' -++++++[list item] -++++++++[static] name='%E2%80%A2 ' -++++++++[static] name='List element 2' -++++++[list item] -++++++++[static] name='%E2%80%A2 ' -++++++++[static] name='List element 3' \ No newline at end of file +++[section] +++++[link] name='Header 1 List element 1 List element 2 List element 3' +++++++[heading] name='Header 1' +++++++++[static] name='Header 1' +++++++[list] +++++++++[list item] +++++++++++[static] name='%E2%80%A2 ' +++++++++++[static] name='List element 1' +++++++++[list item] +++++++++++[static] name='%E2%80%A2 ' +++++++++++[static] name='List element 2' +++++++++[list item] +++++++++++[static] name='%E2%80%A2 ' +++++++++++[static] name='List element 3' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/a-nested-structure-expected-blink.txt b/content/test/data/accessibility/html/a-nested-structure-expected-blink.txt index 163ea5e..579028a 100644 --- a/content/test/data/accessibility/html/a-nested-structure-expected-blink.txt +++ b/content/test/data/accessibility/html/a-nested-structure-expected-blink.txt
@@ -1,6 +1,6 @@ rootWebArea ++genericContainer ignored -++++genericContainer ignored +++++genericContainer ++++++link name='Header 1 List element 1 List element 2 List element 3' ++++++++heading name='Header 1' hierarchicalLevel=1 ++++++++++staticText name='Header 1'
diff --git a/content/test/data/accessibility/html/a-nested-structure-expected-fuchsia.txt b/content/test/data/accessibility/html/a-nested-structure-expected-fuchsia.txt index 857daab..d837e51 100644 --- a/content/test/data/accessibility/html/a-nested-structure-expected-fuchsia.txt +++ b/content/test/data/accessibility/html/a-nested-structure-expected-fuchsia.txt
@@ -1,6 +1,6 @@ UNKNOWN focusable has_input_focus ++UNKNOWN hidden -++++UNKNOWN +++++UNKNOWN hidden ++++++LINK focusable label='Header 1 List element 1 List element 2 List element 3' actions='{DEFAULT}' ++++++++UNKNOWN label='Header 1' actions='{DEFAULT}' ++++++++++STATIC_TEXT label='Header 1'
diff --git a/content/test/data/accessibility/html/continuations-expected-android-external.txt b/content/test/data/accessibility/html/continuations-expected-android-external.txt index 90be058..433091c 100644 --- a/content/test/data/accessibility/html/continuations-expected-android-external.txt +++ b/content/test/data/accessibility/html/continuations-expected-android-external.txt
@@ -15,7 +15,8 @@ ++++++++TextView text:"After" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] ++View text:"Group 4" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="group"] ++++TextView text:"Before" viewIdResName:"before" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="genericContainer"] -++++TextView text:"After" viewIdResName:"after" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"] +++++View actions:[AX_FOCUS] bundle:[chromeRole="genericContainer"] +++++++TextView text:"After" viewIdResName:"after" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"] ++View text:"Group 5" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="group"] ++++TextView text:"Italic only " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] ++++TextView text:"italic and bold" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"]
diff --git a/content/test/data/accessibility/html/continuations-expected-auralinux.txt b/content/test/data/accessibility/html/continuations-expected-auralinux.txt index 23dcfc44..0e4e2cf3 100644 --- a/content/test/data/accessibility/html/continuations-expected-auralinux.txt +++ b/content/test/data/accessibility/html/continuations-expected-auralinux.txt
@@ -21,8 +21,9 @@ ++[panel] name='Group 4' ++++[section] ++++++[static] name='Before' -++++[paragraph] -++++++[static] name='After' +++++[section] +++++++[paragraph] +++++++++[static] name='After' ++[panel] name='Group 5' ++++[static] name='Italic only ' ++++[static] name='italic and bold'
diff --git a/content/test/data/accessibility/html/continuations-expected-blink.txt b/content/test/data/accessibility/html/continuations-expected-blink.txt index 96dcbe8..af1441e 100644 --- a/content/test/data/accessibility/html/continuations-expected-blink.txt +++ b/content/test/data/accessibility/html/continuations-expected-blink.txt
@@ -32,7 +32,7 @@ ++++++++genericContainer display='block' isLineBreakingObject=true ++++++++++staticText display='block' name='Before' ++++++++++++inlineTextBox display='block' name='Before' -++++++++genericContainer ignored isLineBreakingObject=true +++++++++genericContainer display='block' isLineBreakingObject=true ++++++++++paragraph display='block' isLineBreakingObject=true ++++++++++++staticText display='block' name='After' ++++++++++++++inlineTextBox display='block' name='After'
diff --git a/content/test/data/accessibility/html/continuations-parser-splits-markup-expected-blink.txt b/content/test/data/accessibility/html/continuations-parser-splits-markup-expected-blink.txt index 6829cda..5f023da 100644 --- a/content/test/data/accessibility/html/continuations-parser-splits-markup-expected-blink.txt +++ b/content/test/data/accessibility/html/continuations-parser-splits-markup-expected-blink.txt
@@ -1,7 +1,7 @@ rootWebArea isLineBreakingObject=true ++genericContainer ignored isLineBreakingObject=true ++++genericContainer ignored isLineBreakingObject=true -++++++genericContainer ignored isLineBreakingObject=true +++++++genericContainer display='block' isLineBreakingObject=true ++++++++genericContainer className='copied-element' display='inline' ++++++++++genericContainer className='before' display='block' isLineBreakingObject=true ++++++++++++staticText display='block' name='Before'
diff --git a/content/test/data/accessibility/html/custom-element-nested-slots-expected-auralinux.txt b/content/test/data/accessibility/html/custom-element-nested-slots-expected-auralinux.txt index f5af5c2..855e286f 100644 --- a/content/test/data/accessibility/html/custom-element-nested-slots-expected-auralinux.txt +++ b/content/test/data/accessibility/html/custom-element-nested-slots-expected-auralinux.txt
@@ -1,3 +1,4 @@ [document web] tag:#document -++[paragraph] tag:p -++++[static] name='Slot contents' +++[section] tag:body +++++[paragraph] tag:p +++++++[static] name='Slot contents' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/custom-element-nested-slots-expected-blink.txt b/content/test/data/accessibility/html/custom-element-nested-slots-expected-blink.txt index 654c3422f..f094fb6 100644 --- a/content/test/data/accessibility/html/custom-element-nested-slots-expected-blink.txt +++ b/content/test/data/accessibility/html/custom-element-nested-slots-expected-blink.txt
@@ -1,6 +1,6 @@ rootWebArea htmlTag='#document' ++genericContainer ignored htmlTag='html' -++++genericContainer ignored htmlTag='body' +++++genericContainer htmlTag='body' ++++++genericContainer ignored htmlTag='my-element' ++++++++genericContainer ignored className='div-inside-template' htmlTag='div' ++++++++++genericContainer ignored className='outer' htmlTag='slot'
diff --git a/content/test/data/accessibility/html/custom-element-remove-nodes-expected-blink.txt b/content/test/data/accessibility/html/custom-element-remove-nodes-expected-blink.txt index 80e69ed..4312912 100644 --- a/content/test/data/accessibility/html/custom-element-remove-nodes-expected-blink.txt +++ b/content/test/data/accessibility/html/custom-element-remove-nodes-expected-blink.txt
@@ -1,6 +1,6 @@ rootWebArea htmlTag='#document' name='done' ++genericContainer ignored htmlTag='html' -++++genericContainer ignored htmlTag='body' +++++genericContainer htmlTag='body' ++++++genericContainer className='dt1' htmlTag='x-details' ++++++++genericContainer ignored htmlTag='slot' ++++++++++genericContainer description='Details' htmlTag='summary' descriptionFrom=summary
diff --git a/content/test/data/accessibility/html/custom-element-with-aria-owns-inside-expected-blink.txt b/content/test/data/accessibility/html/custom-element-with-aria-owns-inside-expected-blink.txt index d22c1bf3..2251051 100644 --- a/content/test/data/accessibility/html/custom-element-with-aria-owns-inside-expected-blink.txt +++ b/content/test/data/accessibility/html/custom-element-with-aria-owns-inside-expected-blink.txt
@@ -1,6 +1,6 @@ rootWebArea ++genericContainer ignored -++++genericContainer ignored +++++genericContainer ++++++group ++++++++docEndnotes ++++++++++docEndnote
diff --git a/content/test/data/accessibility/html/custom-element-with-aria-owns-inside-slot-expected-blink.txt b/content/test/data/accessibility/html/custom-element-with-aria-owns-inside-slot-expected-blink.txt index 0e70391a..9a776199 100644 --- a/content/test/data/accessibility/html/custom-element-with-aria-owns-inside-slot-expected-blink.txt +++ b/content/test/data/accessibility/html/custom-element-with-aria-owns-inside-slot-expected-blink.txt
@@ -1,6 +1,6 @@ rootWebArea ++genericContainer ignored -++++genericContainer ignored +++++genericContainer ++++++group ++++++++docEndnotes ++++++++++docEndnote
diff --git a/content/test/data/accessibility/html/figcaption-expected-fuchsia.txt b/content/test/data/accessibility/html/figcaption-expected-fuchsia.txt index fac5cc5..81c6d10b 100644 --- a/content/test/data/accessibility/html/figcaption-expected-fuchsia.txt +++ b/content/test/data/accessibility/html/figcaption-expected-fuchsia.txt
@@ -1,7 +1,7 @@ UNKNOWN focusable has_input_focus ++UNKNOWN hidden ++++UNKNOWN hidden -++++++UNKNOWN label='Fig.1 - A green Box' +++++++UNKNOWN ++++++++IMAGE label='This is a green box.' ++++++++UNKNOWN ++++++++++STATIC_TEXT label='Fig.1 - A green Box'
diff --git a/content/test/data/accessibility/html/map-any-contents-expected-android-external.txt b/content/test/data/accessibility/html/map-any-contents-expected-android-external.txt index 5a3cb51..8e046a3 100644 --- a/content/test/data/accessibility/html/map-any-contents-expected-android-external.txt +++ b/content/test/data/accessibility/html/map-any-contents-expected-android-external.txt
@@ -1,10 +1,11 @@ WebView focusable focused scrollable actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea", hasImage="true"] -++Image text:"pipe" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="image", hasImage="true", roleDescription="graphic", targetUrl="file:///storage/emulated/0/chromium_tests_root/content/test/data/accessibility/html/pipe.jpg"] -++++TextView text:"Headings are allowed in a map" CollectionItemInfo:[heading, rowIndex=0, rowSpan=0, colIndex=0, colSpan=0] actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="heading", roleDescription="heading 1"] -++++View text:"null" contentDescription:"pipe1" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="link", clickableScore="300", roleDescription="link", targetUrl="file:///storage/emulated/0/chromium_tests_root/content/test/data/accessibility/html/fake.htm"] -++++View actions:[AX_FOCUS] bundle:[chromeRole="paragraph"] -++++++TextView text:"So are " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++++++View text:"other elements" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="mark", roleDescription="highlight"] -++++++TextView text:"!" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] -++++TextView text:"pipe2" clickable actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText", clickableScore="200"] -++++Button text:"Even a button" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="button", clickableScore="300", roleDescription="button"] \ No newline at end of file +++View actions:[AX_FOCUS] bundle:[chromeRole="genericContainer", hasImage="true"] +++++Image text:"pipe" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="image", hasImage="true", roleDescription="graphic", targetUrl="file:///storage/emulated/0/chromium_tests_root/content/test/data/accessibility/html/pipe.jpg"] +++++++TextView text:"Headings are allowed in a map" CollectionItemInfo:[heading, rowIndex=0, rowSpan=0, colIndex=0, colSpan=0] actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="heading", roleDescription="heading 1"] +++++++View text:"null" contentDescription:"pipe1" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="link", clickableScore="300", roleDescription="link", targetUrl="file:///storage/emulated/0/chromium_tests_root/content/test/data/accessibility/html/fake.htm"] +++++++View actions:[AX_FOCUS] bundle:[chromeRole="paragraph"] +++++++++TextView text:"So are " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] +++++++++View text:"other elements" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="mark", roleDescription="highlight"] +++++++++TextView text:"!" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"] +++++++TextView text:"pipe2" clickable actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText", clickableScore="200"] +++++++Button text:"Even a button" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="button", clickableScore="300", roleDescription="button"] \ No newline at end of file
diff --git a/content/test/data/accessibility/html/map-any-contents-expected-auralinux.txt b/content/test/data/accessibility/html/map-any-contents-expected-auralinux.txt index a5de671..59d1f39 100644 --- a/content/test/data/accessibility/html/map-any-contents-expected-auralinux.txt +++ b/content/test/data/accessibility/html/map-any-contents-expected-auralinux.txt
@@ -1,12 +1,13 @@ [document web] -++[image map] name='pipe' -++++[heading] name='Headings are allowed in a map' -++++++[static] name='Headings are allowed in a map' -++++[link] name='pipe1' -++++[paragraph] -++++++[static] name='So are ' -++++++[static] -++++++++[static] name='other elements' -++++++[static] name='!' -++++[static] name='pipe2' -++++[push button] name='Even a button' \ No newline at end of file +++[section] +++++[image map] name='pipe' +++++++[heading] name='Headings are allowed in a map' +++++++++[static] name='Headings are allowed in a map' +++++++[link] name='pipe1' +++++++[paragraph] +++++++++[static] name='So are ' +++++++++[static] +++++++++++[static] name='other elements' +++++++++[static] name='!' +++++++[static] name='pipe2' +++++++[push button] name='Even a button' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/map-any-contents-expected-blink.txt b/content/test/data/accessibility/html/map-any-contents-expected-blink.txt index b4d6e31..f88a81d 100644 --- a/content/test/data/accessibility/html/map-any-contents-expected-blink.txt +++ b/content/test/data/accessibility/html/map-any-contents-expected-blink.txt
@@ -1,6 +1,6 @@ rootWebArea ++genericContainer ignored -++++genericContainer ignored +++++genericContainer ++++++image name='pipe' ++++++++heading name='Headings are allowed in a map' ++++++++++staticText name='Headings are allowed in a map'
diff --git a/content/test/data/attribution_reporting/databases/version_31.sql b/content/test/data/attribution_reporting/databases/version_31.sql deleted file mode 100644 index b3fd863a..0000000 --- a/content/test/data/attribution_reporting/databases/version_31.sql +++ /dev/null
@@ -1,53 +0,0 @@ -PRAGMA foreign_keys=OFF; - -BEGIN TRANSACTION; - -CREATE TABLE impressions(impression_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,impression_data INTEGER NOT NULL,impression_origin TEXT NOT NULL,conversion_origin TEXT NOT NULL,reporting_origin TEXT NOT NULL,impression_time INTEGER NOT NULL,expiry_time INTEGER NOT NULL,num_conversions INTEGER NOT NULL,event_level_active INTEGER NOT NULL,aggregatable_active INTEGER NOT NULL,conversion_destination TEXT NOT NULL,source_type INTEGER NOT NULL,attributed_truthfully INTEGER NOT NULL,priority INTEGER NOT NULL,impression_site TEXT NOT NULL,debug_key INTEGER,aggregatable_budget_consumed INTEGER NOT NULL,aggregatable_sources BLOB NOT NULL,filter_data BLOB NOT NULL); - -CREATE TABLE conversions(conversion_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,impression_id INTEGER NOT NULL,conversion_data INTEGER NOT NULL,conversion_time INTEGER NOT NULL,report_time INTEGER NOT NULL,priority INTEGER NOT NULL,failed_send_attempts INTEGER NOT NULL,external_report_id TEXT NOT NULL,debug_key INTEGER); - -CREATE TABLE rate_limits(rate_limit_id INTEGER PRIMARY KEY NOT NULL,scope INTEGER NOT NULL,impression_id INTEGER NOT NULL,impression_site TEXT NOT NULL,impression_origin TEXT NOT NULL,conversion_destination TEXT NOT NULL,conversion_origin TEXT NOT NULL,reporting_origin TEXT NOT NULL,time INTEGER NOT NULL); - -CREATE TABLE dedup_keys(impression_id INTEGER NOT NULL,dedup_key INTEGER NOT NULL,PRIMARY KEY(impression_id,dedup_key))WITHOUT ROWID; - -CREATE TABLE aggregatable_report_metadata(aggregation_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,source_id INTEGER NOT NULL,trigger_time INTEGER NOT NULL,debug_key INTEGER,external_report_id TEXT NOT NULL,report_time INTEGER NOT NULL,failed_send_attempts INTEGER NOT NULL); - -CREATE TABLE aggregatable_contributions(contribution_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,aggregation_id INTEGER NOT NULL,key_high_bits INTEGER NOT NULL,key_low_bits INTEGER NOT NULL,value INTEGER NOT NULL); - -CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR); - -INSERT INTO meta VALUES('mmap_status','-1'); -INSERT INTO meta VALUES('version','31'); -INSERT INTO meta VALUES('last_compatible_version','31'); - -CREATE INDEX conversion_destination_idx ON impressions(event_level_active,aggregatable_active,conversion_destination,reporting_origin); - -CREATE INDEX impression_expiry_idx ON impressions(expiry_time); - -CREATE INDEX impression_origin_idx ON impressions(impression_origin); - -CREATE INDEX impression_site_reporting_origin_idx ON impressions(impression_site,reporting_origin)WHERE event_level_active=1 AND num_conversions=0 AND aggregatable_active=1 AND aggregatable_budget_consumed=0; - -CREATE INDEX conversion_report_idx ON conversions(report_time); - -CREATE INDEX conversion_impression_id_idx ON conversions(impression_id); - -CREATE INDEX rate_limit_attribution_idx ON rate_limits(conversion_destination,impression_site,reporting_origin,time)WHERE scope=1; - -CREATE INDEX rate_limit_reporting_origin_idx ON rate_limits(scope,conversion_destination,impression_site,time); - -CREATE INDEX rate_limit_time_idx ON rate_limits(time); - -CREATE INDEX rate_limit_impression_id_idx ON rate_limits(impression_id); - -CREATE INDEX aggregate_source_id_idx ON aggregatable_report_metadata(source_id); - -CREATE INDEX aggregate_trigger_time_idx ON aggregatable_report_metadata(trigger_time); - -CREATE INDEX aggregate_report_time_idx ON aggregatable_report_metadata(report_time); - -CREATE INDEX contribution_aggregation_id_idx ON aggregatable_contributions(aggregation_id); - -INSERT INTO conversions VALUES (1,2,3,4,5,6,7,8,9); - -COMMIT;
diff --git a/content/test/data/attribution_reporting/databases/version_32.sql b/content/test/data/attribution_reporting/databases/version_32.sql index 8f9c6aa..09c9cabd 100644 --- a/content/test/data/attribution_reporting/databases/version_32.sql +++ b/content/test/data/attribution_reporting/databases/version_32.sql
@@ -48,4 +48,6 @@ CREATE INDEX contribution_aggregation_id_idx ON aggregatable_contributions(aggregation_id); +INSERT INTO conversions VALUES (1,2,3,4,5,6,7,8,9); + COMMIT;
diff --git a/content/test/data/attribution_reporting/databases/version_33.sql b/content/test/data/attribution_reporting/databases/version_33.sql new file mode 100644 index 0000000..f24b39b --- /dev/null +++ b/content/test/data/attribution_reporting/databases/version_33.sql
@@ -0,0 +1,51 @@ +PRAGMA foreign_keys=OFF; + +BEGIN TRANSACTION; + +CREATE TABLE sources(source_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,source_event_id INTEGER NOT NULL,source_origin TEXT NOT NULL,destination_origin TEXT NOT NULL,reporting_origin TEXT NOT NULL,source_time INTEGER NOT NULL,expiry_time INTEGER NOT NULL,num_attributions INTEGER NOT NULL,event_level_active INTEGER NOT NULL,aggregatable_active INTEGER NOT NULL,destination_site TEXT NOT NULL,source_type INTEGER NOT NULL,attribution_logic INTEGER NOT NULL,priority INTEGER NOT NULL,source_site TEXT NOT NULL,debug_key INTEGER,aggregatable_budget_consumed INTEGER NOT NULL,aggregatable_source BLOB NOT NULL,filter_data BLOB NOT NULL); + +CREATE TABLE event_level_reports(report_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,source_id INTEGER NOT NULL,trigger_data INTEGER NOT NULL,trigger_time INTEGER NOT NULL,report_time INTEGER NOT NULL,priority INTEGER NOT NULL,failed_send_attempts INTEGER NOT NULL,external_report_id TEXT NOT NULL,debug_key INTEGER); + +CREATE TABLE rate_limits(id INTEGER PRIMARY KEY NOT NULL,scope INTEGER NOT NULL,source_id INTEGER NOT NULL,source_site TEXT NOT NULL,source_origin TEXT NOT NULL,destination_site TEXT NOT NULL,destination_origin TEXT NOT NULL,reporting_origin TEXT NOT NULL,time INTEGER NOT NULL); + +CREATE TABLE dedup_keys(source_id INTEGER NOT NULL,dedup_key INTEGER NOT NULL,PRIMARY KEY(source_id,dedup_key))WITHOUT ROWID; + +CREATE TABLE aggregatable_report_metadata(aggregation_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,source_id INTEGER NOT NULL,trigger_time INTEGER NOT NULL,debug_key INTEGER,external_report_id TEXT NOT NULL,report_time INTEGER NOT NULL,failed_send_attempts INTEGER NOT NULL); + +CREATE TABLE aggregatable_contributions(contribution_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,aggregation_id INTEGER NOT NULL,key_high_bits INTEGER NOT NULL,key_low_bits INTEGER NOT NULL,value INTEGER NOT NULL); + +CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR); + +INSERT INTO meta VALUES('mmap_status','-1'); +INSERT INTO meta VALUES('version','33'); +INSERT INTO meta VALUES('last_compatible_version','33'); + +CREATE INDEX sources_by_active_destination_site_reporting_origin ON sources(event_level_active,aggregatable_active,destination_site,reporting_origin); + +CREATE INDEX sources_by_expiry_time ON sources(expiry_time); + +CREATE INDEX sources_by_origin ON sources(source_origin); + +CREATE INDEX active_unattributed_sources_by_site_reporting_origin ON sources(source_site,reporting_origin)WHERE event_level_active=1 AND num_attributions=0 AND aggregatable_active=1 AND aggregatable_budget_consumed=0; + +CREATE INDEX event_level_reports_by_report_time ON event_level_reports(report_time); + +CREATE INDEX event_level_reports_by_source_id ON event_level_reports(source_id); + +CREATE INDEX rate_limit_attribution_idx ON rate_limits(destination_site,source_site,reporting_origin,time)WHERE scope=1; + +CREATE INDEX rate_limit_reporting_origin_idx ON rate_limits(scope,destination_site,source_site,time); + +CREATE INDEX rate_limit_time_idx ON rate_limits(time); + +CREATE INDEX rate_limit_source_id_idx ON rate_limits(source_id); + +CREATE INDEX aggregate_source_id_idx ON aggregatable_report_metadata(source_id); + +CREATE INDEX aggregate_trigger_time_idx ON aggregatable_report_metadata(trigger_time); + +CREATE INDEX aggregate_report_time_idx ON aggregatable_report_metadata(report_time); + +CREATE INDEX contribution_aggregation_id_idx ON aggregatable_contributions(aggregation_id); + +COMMIT;
diff --git a/content/test/data/gpu/pixel_webgpu_cached_swap_buffer_invalidated.html b/content/test/data/gpu/pixel_webgpu_cached_swap_buffer_invalidated.html index a8ac584..ea8c53ab 100644 --- a/content/test/data/gpu/pixel_webgpu_cached_swap_buffer_invalidated.html +++ b/content/test/data/gpu/pixel_webgpu_cached_swap_buffer_invalidated.html
@@ -45,6 +45,7 @@ device: device, format: 'bgra8unorm', usage: GPUTextureUsage.RENDER_ATTACHMENT, + compositingAlphaMode: 'premultiplied', }); let framesToRender = 30;
diff --git a/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt index a1193e8..4b46300 100644 --- a/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt
@@ -105,6 +105,12 @@ crbug.com/1154047 [ android ] GpuCrash_InfoForHardwareGpu [ Skip ] crbug.com/1154047 [ fuchsia ] GpuCrash_InfoForHardwareGpu [ Skip ] +# WebGPU tests hanging on multiple Mac FYI bots +crbug.com/1305020 [ mac asan intel-0x3e9b ] ContextLost_WebGPUContextLostFromGPUProcessExit [ Skip ] +crbug.com/1305020 [ mac asan intel-0xd26 ] ContextLost_WebGPUContextLostFromGPUProcessExit [ Skip ] +crbug.com/1305020 [ mac nvidia-0xfe9 ] ContextLost_WebGPUContextLostFromGPUProcessExit [ Skip ] + + ############################### # Temporary Skip Expectations # ###############################
diff --git a/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt index f39644e7..fc6b623a 100644 --- a/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt
@@ -82,6 +82,11 @@ # Software Compositing is not supported on ChromeOS. crbug.com/1084796 [ chromeos ] GpuProcess_readback_webgl_gpu_process [ Skip ] +# WebGPU tests hanging on multiple Mac FYI bots +crbug.com/1305020 [ mac asan intel-0x3e9b ] GpuProcess_webgpu_iframe_removed [ Skip ] +crbug.com/1305020 [ mac asan intel-0xd26 ] GpuProcess_webgpu_iframe_removed [ Skip ] +crbug.com/1305020 [ mac nvidia-0xfe9 ] GpuProcess_webgpu_iframe_removed [ Skip ] + ############################### # Temporary Skip Expectations # ###############################
diff --git a/gpu/command_buffer/service/external_vk_image_dawn_representation.cc b/gpu/command_buffer/service/external_vk_image_dawn_representation.cc index fc63311..5f8b5ed 100644 --- a/gpu/command_buffer/service/external_vk_image_dawn_representation.cc +++ b/gpu/command_buffer/service/external_vk_image_dawn_representation.cc
@@ -55,11 +55,12 @@ texture_descriptor.mipLevelCount = 1; texture_descriptor.sampleCount = 1; - // We need to have an internal usage of CopySrc in order to use - // CopyTextureToTextureInternal. + // We need to have internal usages of CopySrc for copies and + // RenderAttachment for clears. WGPUDawnTextureInternalUsageDescriptor internalDesc = {}; internalDesc.chain.sType = WGPUSType_DawnTextureInternalUsageDescriptor; - internalDesc.internalUsage = WGPUTextureUsage_CopySrc; + internalDesc.internalUsage = + WGPUTextureUsage_CopySrc | WGPUTextureUsage_RenderAttachment; texture_descriptor.nextInChain = reinterpret_cast<WGPUChainedStruct*>(&internalDesc);
diff --git a/gpu/command_buffer/service/shared_image_backing_d3d.cc b/gpu/command_buffer/service/shared_image_backing_d3d.cc index 9f51ca99..2e2c33e 100644 --- a/gpu/command_buffer/service/shared_image_backing_d3d.cc +++ b/gpu/command_buffer/service/shared_image_backing_d3d.cc
@@ -620,11 +620,12 @@ } #endif - // We need to have an internal usage of CopySrc in order to use - // CopyTextureToTextureInternal. + // We need to have internal usages of CopySrc for copies and + // RenderAttachment for clears. WGPUDawnTextureInternalUsageDescriptor internalDesc = {}; internalDesc.chain.sType = WGPUSType_DawnTextureInternalUsageDescriptor; - internalDesc.internalUsage = WGPUTextureUsage_CopySrc; + internalDesc.internalUsage = + WGPUTextureUsage_CopySrc | WGPUTextureUsage_RenderAttachment; texture_descriptor.nextInChain = reinterpret_cast<WGPUChainedStruct*>(&internalDesc);
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_iosurface.mm b/gpu/command_buffer/service/shared_image_backing_factory_iosurface.mm index 66598f2..5cfcad9 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_iosurface.mm +++ b/gpu/command_buffer/service/shared_image_backing_factory_iosurface.mm
@@ -120,11 +120,12 @@ texture_descriptor.mipLevelCount = 1; texture_descriptor.sampleCount = 1; - // We need to have an internal usage of CopySrc in order to use - // CopyTextureToTextureInternal. + // We need to have internal usages of CopySrc for copies and + // RenderAttachment for clears. WGPUDawnTextureInternalUsageDescriptor internalDesc = {}; internalDesc.chain.sType = WGPUSType_DawnTextureInternalUsageDescriptor; - internalDesc.internalUsage = WGPUTextureUsage_CopySrc; + internalDesc.internalUsage = + WGPUTextureUsage_CopySrc | WGPUTextureUsage_RenderAttachment; texture_descriptor.nextInChain = reinterpret_cast<WGPUChainedStruct*>(&internalDesc);
diff --git a/gpu/command_buffer/service/shared_image_representation_dawn_ozone.cc b/gpu/command_buffer/service/shared_image_representation_dawn_ozone.cc index 6e3ddef..9d3d98c 100644 --- a/gpu/command_buffer/service/shared_image_representation_dawn_ozone.cc +++ b/gpu/command_buffer/service/shared_image_representation_dawn_ozone.cc
@@ -70,11 +70,12 @@ texture_descriptor.mipLevelCount = 1; texture_descriptor.sampleCount = 1; - // We need to have an internal usage of CopySrc in order to use - // CopyTextureToTextureInternal. + // We need to have internal usages of CopySrc for copies and + // RenderAttachment for clears. WGPUDawnTextureInternalUsageDescriptor internalDesc = {}; internalDesc.chain.sType = WGPUSType_DawnTextureInternalUsageDescriptor; - internalDesc.internalUsage = WGPUTextureUsage_CopySrc; + internalDesc.internalUsage = + WGPUTextureUsage_CopySrc | WGPUTextureUsage_RenderAttachment; texture_descriptor.nextInChain = reinterpret_cast<WGPUChainedStruct*>(&internalDesc);
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.cc b/gpu/command_buffer/service/webgpu_decoder_impl.cc index dd1e79f..bd85889f 100644 --- a/gpu/command_buffer/service/webgpu_decoder_impl.cc +++ b/gpu/command_buffer/service/webgpu_decoder_impl.cc
@@ -1812,8 +1812,15 @@ render_pass_descriptor.colorAttachmentCount = 1; render_pass_descriptor.colorAttachments = &color_attachment; + WGPUDawnEncoderInternalUsageDescriptor internal_usage_desc = { + .chain = {.sType = WGPUSType_DawnEncoderInternalUsageDescriptor}, + .useInternalUsages = true, + }; + WGPUCommandEncoderDescriptor command_encoder_desc = { + .nextInChain = &internal_usage_desc.chain, + }; WGPUCommandEncoder encoder = - procs.deviceCreateCommandEncoder(device, nullptr); + procs.deviceCreateCommandEncoder(device, &command_encoder_desc); WGPURenderPassEncoder pass = procs.commandEncoderBeginRenderPass(encoder, &render_pass_descriptor); procs.renderPassEncoderEndPass(pass);
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index 4ffccbc..c3091c91 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1646,13 +1646,13 @@ Camera </message> <message name="IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_ACCESSIBLE" desc="Message shown in the infobar when camera access is enabled."> - Camera Access allowed + Camera Access Allowed </message> <message name="IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_AND_MICROPHONE_ACCESSIBLE" desc="Message shown in the infobar when both camera and microphone access are enabled."> - Camera and Microphone Access allowed + Camera and Microphone Access Allowed </message> <message name="IDS_IOS_PERMISSIONS_INFOBAR_BANNER_MICROPHONE_ACCESSIBLE" desc="Message shown in the infobar when microphone access is enabled."> - Microphone Access allowed + Microphone Access Allowed </message> <message name="IDS_IOS_PERMISSIONS_MICROPHONE" desc="Usually used to show whether user has enabled a site's permission to use the device microphone."> Microphone
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_ACCESSIBLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_ACCESSIBLE.png.sha1 index 12d90fda..a1b03ee 100644 --- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_ACCESSIBLE.png.sha1 +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_ACCESSIBLE.png.sha1
@@ -1 +1 @@ -922aa14ab3c8d1764886ab23e1eb7467fc409cbc \ No newline at end of file +e3d51652eb5cb23f1386bbcae17a5615561eb34a \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_AND_MICROPHONE_ACCESSIBLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_AND_MICROPHONE_ACCESSIBLE.png.sha1 index bf7335c0..ed7abd0 100644 --- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_AND_MICROPHONE_ACCESSIBLE.png.sha1 +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_AND_MICROPHONE_ACCESSIBLE.png.sha1
@@ -1 +1 @@ -def59e987cb4a8f86c40709045f5d5603d50a7f1 \ No newline at end of file +dad7135c35c391efdc80699dc1293f6ae5fda71d \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_BANNER_MICROPHONE_ACCESSIBLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_BANNER_MICROPHONE_ACCESSIBLE.png.sha1 index 3f41f5e4..4b28966 100644 --- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_BANNER_MICROPHONE_ACCESSIBLE.png.sha1 +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PERMISSIONS_INFOBAR_BANNER_MICROPHONE_ACCESSIBLE.png.sha1
@@ -1 +1 @@ -c042c34fb417700003206a2ea38b4a0434c597cf \ No newline at end of file +72ce65668eb0be1f86c76a6e4f18aa56d3f6ab71 \ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb index 3589b58..236526d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -17,7 +17,7 @@ <translation id="1066060668811609597">Керуйте синхронізацією</translation> <translation id="1076421457278169141">Код зіскановано</translation> <translation id="1084365883616172403">Опубліковано у Facebook</translation> -<translation id="1086486568852410168">Пошук через Об’єктив</translation> +<translation id="1086486568852410168">Шукати через Об’єктив</translation> <translation id="1103523840287552314">Завжди перекладати з такої мови: <ph name="LANGUAGE" /></translation> <translation id="1104948393051856124">Прийняти та продовжити</translation> <translation id="110724200315609752">Перейти у відкрите вікно</translation>
diff --git a/ios/chrome/browser/autofill/BUILD.gn b/ios/chrome/browser/autofill/BUILD.gn index 9172c6d..146299c 100644 --- a/ios/chrome/browser/autofill/BUILD.gn +++ b/ios/chrome/browser/autofill/BUILD.gn
@@ -544,12 +544,14 @@ "//components/password_manager/core/browser:test_support", "//components/password_manager/ios", "//components/security_state/ios", + "//components/sync_user_events:test_support", "//ios/chrome/app/application_delegate:app_state_header", "//ios/chrome/browser", "//ios/chrome/browser/browser_state:test_support", "//ios/chrome/browser/infobars", "//ios/chrome/browser/passwords", "//ios/chrome/browser/ssl", + "//ios/chrome/browser/sync:sync", "//ios/chrome/browser/ui/autofill", "//ios/chrome/browser/ui/autofill:features", "//ios/chrome/browser/ui/autofill/form_input_accessory",
diff --git a/ios/chrome/browser/autofill/form_structure_browsertest.mm b/ios/chrome/browser/autofill/form_structure_browsertest.mm index dfe2707..3b8cd4a 100644 --- a/ios/chrome/browser/autofill/form_structure_browsertest.mm +++ b/ios/chrome/browser/autofill/form_structure_browsertest.mm
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <WebKit/WebKit.h> #include <vector> #include "base/files/file_enumerator.h" @@ -12,6 +13,7 @@ #include "base/path_service.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" +#include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/task/thread_pool/thread_pool_instance.h" #import "base/test/ios/wait_util.h" @@ -25,19 +27,30 @@ #include "components/autofill/ios/browser/autofill_driver_ios.h" #import "components/autofill/ios/form_util/form_util_java_script_feature.h" #include "components/autofill/ios/form_util/unique_id_data_tab_helper.h" +#include "components/password_manager/core/browser/mock_password_store_interface.h" +#include "components/password_manager/core/browser/password_manager_test_utils.h" +#include "components/sync_user_events/fake_user_event_service.h" #include "ios/chrome/browser/autofill/address_normalizer_factory.h" #import "ios/chrome/browser/autofill/form_suggestion_controller.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #include "ios/chrome/browser/chrome_paths.h" #include "ios/chrome/browser/infobars/infobar_manager_impl.h" +#include "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" #import "ios/chrome/browser/passwords/password_controller.h" +#include "ios/chrome/browser/sync/ios_user_event_service_factory.h" #import "ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h" #include "ios/chrome/browser/web/chrome_web_client.h" #import "ios/chrome/browser/web/chrome_web_test.h" #include "ios/web/public/js_messaging/web_frame.h" #import "ios/web/public/js_messaging/web_frames_manager.h" +#import "ios/web/public/test/scoped_testing_web_client.h" +#import "ios/web/public/test/task_observer_util.h" +#import "ios/web/public/test/web_state_test_util.h" +#import "ios/web/public/test/web_task_environment.h" +#import "ios/web/public/test/web_view_interaction_test_util.h" #import "ios/web/public/web_state.h" #include "testing/data_driven_testing/data_driven_test.h" +#include "testing/platform_test.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -107,7 +120,7 @@ // This is based on FormStructureBrowserTest from the Chromium Project. // TODO(crbug.com/245246): Unify the tests. class FormStructureBrowserTest - : public ChromeWebTest, + : public PlatformTest, public testing::DataDrivenTest, public testing::WithParamInterface<base::FilePath> { public: @@ -130,6 +143,12 @@ std::string FormStructuresToString( const std::map<FormGlobalId, std::unique_ptr<FormStructure>>& forms); + web::WebState* web_state() const { return web_state_.get(); } + + web::ScopedTestingWebClient web_client_; + web::WebTaskEnvironment task_environment_; + std::unique_ptr<TestChromeBrowserState> browser_state_; + std::unique_ptr<web::WebState> web_state_; std::unique_ptr<autofill::ChromeAutofillClientIOS> autofill_client_; AutofillAgent* autofill_agent_; FormSuggestionController* suggestion_controller_; @@ -140,8 +159,24 @@ }; FormStructureBrowserTest::FormStructureBrowserTest() - : ChromeWebTest(std::make_unique<ChromeWebClient>()), - DataDrivenTest(GetTestDataDir(), kFeatureName, kTestName) { + : DataDrivenTest(GetTestDataDir(), kFeatureName, kTestName), + web_client_(std::make_unique<ChromeWebClient>()) { + TestChromeBrowserState::Builder builder; + builder.AddTestingFactory( + IOSChromePasswordStoreFactory::GetInstance(), + base::BindRepeating(&password_manager::BuildPasswordStoreInterface< + web::BrowserState, + password_manager::MockPasswordStoreInterface>)); + builder.AddTestingFactory( + IOSUserEventServiceFactory::GetInstance(), + base::BindRepeating( + [](web::BrowserState*) -> std::unique_ptr<KeyedService> { + return std::make_unique<syncer::FakeUserEventService>(); + })); + browser_state_ = builder.Build(); + + web::WebState::CreateParams params(browser_state_.get()); + web_state_ = web::WebState::Create(params); feature_list_.InitWithFeatures( // Enabled {// TODO(crbug.com/1098943): Remove once experiment is over. @@ -168,7 +203,7 @@ } void FormStructureBrowserTest::SetUp() { - ChromeWebTest::SetUp(); + PlatformTest::SetUp(); // Create a PasswordController instance that will handle set up for renderer // ids. @@ -181,7 +216,7 @@ AddressNormalizerFactory::GetInstance(); autofill_agent_ = - [[AutofillAgent alloc] initWithPrefService:GetBrowserState()->GetPrefs() + [[AutofillAgent alloc] initWithPrefService:browser_state_->GetPrefs() webState:web_state()]; suggestion_controller_ = [[FormSuggestionController alloc] initWithWebState:web_state() @@ -191,7 +226,7 @@ infobars::InfoBarManager* infobar_manager = InfoBarManagerImpl::FromWebState(web_state()); autofill_client_.reset(new autofill::ChromeAutofillClientIOS( - GetBrowserState(), web_state(), infobar_manager, autofill_agent_, + browser_state_.get(), web_state(), infobar_manager, autofill_agent_, /*password_generation_manager=*/nullptr)); std::string locale("en"); @@ -201,12 +236,14 @@ } void FormStructureBrowserTest::TearDown() { - ChromeWebTest::TearDown(); + web::test::WaitForBackgroundTasks(); + web_state_.reset(); } bool FormStructureBrowserTest::LoadHtmlWithoutSubresourcesAndInitRendererIds( const std::string& html) { - bool success = ChromeWebTest::LoadHtmlWithoutSubresources(html); + bool success = web::test::LoadHtmlWithoutSubresources( + base::SysUTF8ToNSString(html), web_state()); if (!success) { return false; } @@ -227,7 +264,8 @@ // Wait for |SetUpForUniqueIDsWithInitialState| to complete. return WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^bool { - return [ExecuteJavaScript(@"document[__gCrWeb.fill.ID_SYMBOL]") intValue] == + return [web::test::ExecuteJavaScript(@"document[__gCrWeb.fill.ID_SYMBOL]", + web_state()) intValue] == static_cast<int>(next_available_id); }); }
diff --git a/ios/chrome/browser/browsing_data/browsing_data_remover_impl.mm b/ios/chrome/browser/browsing_data/browsing_data_remover_impl.mm index 53a92b1..1c7d699 100644 --- a/ios/chrome/browser/browsing_data/browsing_data_remover_impl.mm +++ b/ios/chrome/browser/browsing_data/browsing_data_remover_impl.mm
@@ -290,8 +290,7 @@ ClearIOSSnapshots(CreatePendingTaskCompletionClosure()); } - constexpr base::TaskTraits task_traits = { - web::WebThread::IO, base::TaskShutdownBehavior::BLOCK_SHUTDOWN}; + auto io_thread_task_runner = web::GetIOThreadTaskRunner({}); if (IsRemoveDataMaskSet(mask, BrowsingDataRemoveMask::REMOVE_COOKIES)) { if (!browser_state_->IsOffTheRecord()) { @@ -301,8 +300,8 @@ } net::CookieDeletionInfo::TimeRange deletion_time_range = net::CookieDeletionInfo::TimeRange(delete_begin, delete_end); - base::PostTask( - FROM_HERE, task_traits, + io_thread_task_runner->PostTask( + FROM_HERE, base::BindOnce( &ClearCookies, context_getter_, deletion_time_range, base::BindOnce(base::IgnoreResult(&base::TaskRunner::PostTask), @@ -350,8 +349,8 @@ IOSChromeIOThread* ios_chrome_io_thread = GetApplicationContext()->GetIOSChromeIOThread(); if (ios_chrome_io_thread) { - base::PostTaskAndReply( - FROM_HERE, task_traits, + io_thread_task_runner->PostTaskAndReply( + FROM_HERE, base::BindOnce(&IOSChromeIOThread::ClearHostCache, base::Unretained(ios_chrome_io_thread)), CreatePendingTaskCompletionClosure()); @@ -465,9 +464,8 @@ if (IsRemoveDataMaskSet(mask, BrowsingDataRemoveMask::REMOVE_CACHE)) { base::RecordAction(base::UserMetricsAction("ClearBrowsingData_Cache")); - ClearHttpCache(context_getter_, - base::CreateSingleThreadTaskRunner(task_traits), - delete_begin, delete_end, + ClearHttpCache(context_getter_, io_thread_task_runner, delete_begin, + delete_end, base::BindOnce(&NetCompletionCallbackAdapter, CreatePendingTaskCompletionClosure())); }
diff --git a/ios/chrome/browser/safe_browsing/chrome_password_protection_service.h b/ios/chrome/browser/safe_browsing/chrome_password_protection_service.h index a837807..69f9dde 100644 --- a/ios/chrome/browser/safe_browsing/chrome_password_protection_service.h +++ b/ios/chrome/browser/safe_browsing/chrome_password_protection_service.h
@@ -100,7 +100,8 @@ safe_browsing::PasswordProtectionRequest* request, const std::string& username, safe_browsing::PasswordType password_type, - bool is_phishing_url) override; + bool is_phishing_url, + bool warning_shown) override; void ReportPasswordChanged() override;
diff --git a/ios/chrome/browser/safe_browsing/chrome_password_protection_service.mm b/ios/chrome/browser/safe_browsing/chrome_password_protection_service.mm index d1f09a8..f2d0978 100644 --- a/ios/chrome/browser/safe_browsing/chrome_password_protection_service.mm +++ b/ios/chrome/browser/safe_browsing/chrome_password_protection_service.mm
@@ -236,7 +236,8 @@ safe_browsing::PasswordProtectionRequest* request, const std::string& username, PasswordType password_type, - bool is_phishing_url) { + bool is_phishing_url, + bool warning_shown) { // Enterprise reporting extension not yet supported in iOS. }
diff --git a/ios/chrome/browser/ui/infobars/modals/infobar_save_card_table_view_controller.mm b/ios/chrome/browser/ui/infobars/modals/infobar_save_card_table_view_controller.mm index cffe6e0..7f741cf 100644 --- a/ios/chrome/browser/ui/infobars/modals/infobar_save_card_table_view_controller.mm +++ b/ios/chrome/browser/ui/infobars/modals/infobar_save_card_table_view_controller.mm
@@ -195,30 +195,24 @@ self.displayedTargetAccountAvatar != nil; // Concatenate legal lines and maybe add the extra one. - // TODO(crbug.com/1224680): In reality the server sends a single legal line. - // The extra text should be added directly to the server string instead of - // here (see b/192290070). - NSMutableString* joinedMessage = [[NSMutableString alloc] init]; - BOOL shouldAddSpace = NO; for (SaveCardMessageWithLinks* message in self.legalMessages) { - if (shouldAddSpace) - [joinedMessage appendString:@" "]; - [joinedMessage appendString:message.messageText]; - shouldAddSpace = YES; + TableViewTextLinkItem* legalMessageItem = + [[TableViewTextLinkItem alloc] initWithType:ItemTypeCardLegalMessage]; + legalMessageItem.text = message.messageText; + legalMessageItem.linkURLs = message.linkURLs; + legalMessageItem.linkRanges = message.linkRanges; + [model addItem:legalMessageItem + toSectionWithIdentifier:SectionIdentifierContent]; } if (shouldShowExtraLegalLineAndAccountInfo) { - if (shouldAddSpace) - [joinedMessage appendString:@" "]; - [joinedMessage appendString:l10n_util::GetNSString( - IDS_IOS_CARD_WILL_BE_SAVED_TO_ACCOUNT)]; + TableViewTextLinkItem* legalMessageItem = + [[TableViewTextLinkItem alloc] initWithType:ItemTypeCardLegalMessage]; + legalMessageItem.text = + l10n_util::GetNSString(IDS_IOS_CARD_WILL_BE_SAVED_TO_ACCOUNT); + [model addItem:legalMessageItem + toSectionWithIdentifier:SectionIdentifierContent]; } - TableViewTextLinkItem* legalMessageItem = - [[TableViewTextLinkItem alloc] initWithType:ItemTypeCardLegalMessage]; - legalMessageItem.text = joinedMessage; - [model addItem:legalMessageItem - toSectionWithIdentifier:SectionIdentifierContent]; - if (shouldShowExtraLegalLineAndAccountInfo) { TargetAccountItem* targetTargetAccountItem = [[TargetAccountItem alloc] initWithType:ItemTypeTargetAccount]; @@ -328,13 +322,6 @@ case ItemTypeCardLegalMessage: { TableViewTextLinkCell* linkCell = base::mac::ObjCCast<TableViewTextLinkCell>(cell); - for (SaveCardMessageWithLinks* message in self.legalMessages) { - [message.linkRanges enumerateObjectsUsingBlock:^( - NSValue* rangeValue, NSUInteger i, BOOL* stop) { - CrURL* crurl = [[CrURL alloc] initWithGURL:message.linkURLs[i]]; - [linkCell setLinkURL:crurl forRange:rangeValue.rangeValue]; - }]; - } linkCell.delegate = self; linkCell.separatorInset = UIEdgeInsetsMake(0, self.tableView.bounds.size.width, 0, 0);
diff --git a/ios/chrome/browser/ui/open_in/open_in_controller.mm b/ios/chrome/browser/ui/open_in/open_in_controller.mm index 5af0fce9..329a33f9 100644 --- a/ios/chrome/browser/ui/open_in/open_in_controller.mm +++ b/ios/chrome/browser/ui/open_in/open_in_controller.mm
@@ -71,12 +71,15 @@ UMA_HISTOGRAM_ENUMERATION("IOS.OpenIn.DownloadResult", result); } -// Returns true if the file located at |url| is file. +// Returns true if the file located at |url| can be previewed. bool HasValidFileAtUrl(NSURL* url) { if (!url) return false; - NSString* extension = [[url path] pathExtension]; + if (![[NSFileManager defaultManager] isReadableFileAtPath:url.path]) + return false; + + NSString* extension = [url.path pathExtension]; if ([extension isEqualToString:@"pdf"]) { base::ScopedCFTypeRef<CGPDFDocumentRef> document( CGPDFDocumentCreateWithURL((__bridge CFURLRef)url));
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm index 53fe5227..1fee476 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm
@@ -1534,6 +1534,8 @@ .indexPathsForVisibleItems) { UICollectionViewCell* cell = [self.collectionView cellForItemAtIndexPath:indexPath]; + if (![cell isKindOfClass:[GridCell class]]) + continue; NSUInteger itemIndex = base::checked_cast<NSUInteger>(indexPath.item); cell.accessibilityIdentifier = [NSString stringWithFormat:@"%@%ld", kGridCellIdentifierPrefix, itemIndex];
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_text_link_item.h b/ios/chrome/browser/ui/table_view/cells/table_view_text_link_item.h index 2098c42..45218a3 100644 --- a/ios/chrome/browser/ui/table_view/cells/table_view_text_link_item.h +++ b/ios/chrome/browser/ui/table_view/cells/table_view_text_link_item.h
@@ -7,9 +7,12 @@ #import <UIKit/UIKit.h> +#include <vector> + #import "ios/chrome/browser/ui/table_view/cells/table_view_cell.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_item.h" +class GURL; @class CrURL; @class TableViewTextLinkCell; @@ -24,8 +27,12 @@ @interface TableViewTextLinkItem : TableViewItem // Text being stored by this item. @property(nonatomic, readwrite, strong) NSString* text; -// URL link being stored by this item. If empty or not valid no URL will be set. -@property(nonatomic, readwrite, strong) CrURL* linkURL; +// URL links being stored by this item. +@property(nonatomic, assign) std::vector<GURL> linkURLs; +// Character range for the links in |linkURLs|. Order should match order in +// |linkURLs|. +@property(nonatomic, strong) NSArray* linkRanges; + @end // TableViewCell that displays a text label that might contain a link.
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_text_link_item.mm b/ios/chrome/browser/ui/table_view/cells/table_view_text_link_item.mm index 0577827..41c22ca3 100644 --- a/ios/chrome/browser/ui/table_view/cells/table_view_text_link_item.mm +++ b/ios/chrome/browser/ui/table_view/cells/table_view_text_link_item.mm
@@ -20,8 +20,6 @@ #pragma mark - TableViewTextLinkItem @implementation TableViewTextLinkItem -@synthesize text = _text; -@synthesize linkURL = _linkURL; - (instancetype)initWithType:(NSInteger)type { self = [super initWithType:type]; @@ -38,8 +36,14 @@ base::mac::ObjCCastStrict<TableViewTextLinkCell>(tableCell); cell.textView.text = self.text; cell.selectionStyle = UITableViewCellSelectionStyleNone; - if (self.linkURL && !self.linkURL.gurl.is_empty()) - [cell setLinkURL:self.linkURL]; + + if (self.linkRanges) { + [self.linkRanges enumerateObjectsUsingBlock:^(NSValue* rangeValue, + NSUInteger i, BOOL* stop) { + CrURL* crurl = [[CrURL alloc] initWithGURL:self.linkURLs[i]]; + [cell setLinkURL:crurl forRange:rangeValue.rangeValue]; + }]; + } } @end
diff --git a/ios/web/public/test/web_state_test_util.h b/ios/web/public/test/web_state_test_util.h index 58c217e..2bb0dc9f1 100644 --- a/ios/web/public/test/web_state_test_util.h +++ b/ios/web/public/test/web_state_test_util.h
@@ -25,6 +25,10 @@ // Loads the specified HTML content into the WebState, using test url name. void LoadHtml(NSString* html, web::WebState* web_state); +// Loads the specified HTML content with URL into the WebState. None of the +// subresources will be fetched. +bool LoadHtmlWithoutSubresources(NSString* html, web::WebState* web_state); + } // namespace test } // namespace web
diff --git a/ios/web/public/test/web_state_test_util.mm b/ios/web/public/test/web_state_test_util.mm index 58830e8..880264f 100644 --- a/ios/web/public/test/web_state_test_util.mm +++ b/ios/web/public/test/web_state_test_util.mm
@@ -12,6 +12,7 @@ #import "ios/web/public/navigation/navigation_manager.h" #import "ios/web/public/web_state.h" #import "ios/web/web_state/ui/crw_web_controller.h" +#import "ios/web/web_state/ui/wk_web_view_configuration_provider.h" #import "ios/web/web_state/web_state_impl.h" #include "url/gurl.h" @@ -100,5 +101,52 @@ LoadHtml(html, url, web_state); } +bool LoadHtmlWithoutSubresources(NSString* html, web::WebState* web_state) { + NSString* block_all = @"[{" + " \"trigger\": {" + " \"url-filter\": \".*\"" + " }," + " \"action\": {" + " \"type\": \"block\"" + " }" + "}]"; + __block WKContentRuleList* content_rule_list = nil; + __block NSError* error = nil; + __block BOOL rule_compilation_completed = NO; + [WKContentRuleListStore.defaultStore + compileContentRuleListForIdentifier:@"block_everything" + encodedContentRuleList:block_all + completionHandler:^(WKContentRuleList* rule_list, + NSError* err) { + error = err; + content_rule_list = rule_list; + rule_compilation_completed = YES; + }]; + + bool success = WaitUntilConditionOrTimeout( + base::test::ios::kWaitForActionTimeout, ^bool { + return rule_compilation_completed; + }); + if (!success) { + DLOG(WARNING) << "ContentRuleList compilation timed out."; + return false; + } + if (error) { + DLOG(WARNING) << "ContentRuleList compilation failed with error: " + << base::SysNSStringToUTF8(error.description); + return false; + } + DCHECK(content_rule_list); + web::WKWebViewConfigurationProvider& configuration_provider = + web::WKWebViewConfigurationProvider::FromBrowserState( + web_state->GetBrowserState()); + WKWebViewConfiguration* configuration = + configuration_provider.GetWebViewConfiguration(); + [configuration.userContentController addContentRuleList:content_rule_list]; + web::test::LoadHtml(html, web_state); + [configuration.userContentController removeContentRuleList:content_rule_list]; + return true; +} + } // namespace test } // namespace web
diff --git a/ios/web/public/test/web_test_with_web_state.mm b/ios/web/public/test/web_test_with_web_state.mm index ee13183..4106cbc 100644 --- a/ios/web/public/test/web_test_with_web_state.mm +++ b/ios/web/public/test/web_test_with_web_state.mm
@@ -74,48 +74,8 @@ } bool WebTestWithWebState::LoadHtmlWithoutSubresources(const std::string& html) { - NSString* block_all = @"[{" - " \"trigger\": {" - " \"url-filter\": \".*\"" - " }," - " \"action\": {" - " \"type\": \"block\"" - " }" - "}]"; - __block WKContentRuleList* content_rule_list = nil; - __block NSError* error = nil; - __block BOOL rule_compilation_completed = NO; - [WKContentRuleListStore.defaultStore - compileContentRuleListForIdentifier:@"block_everything" - encodedContentRuleList:block_all - completionHandler:^(WKContentRuleList* rule_list, - NSError* err) { - error = err; - content_rule_list = rule_list; - rule_compilation_completed = YES; - }]; - - bool success = WaitUntilConditionOrTimeout(kWaitForActionTimeout, ^bool { - return rule_compilation_completed; - }); - if (!success) { - DLOG(WARNING) << "ContentRuleList compilation timed out."; - return false; - } - if (error) { - DLOG(WARNING) << "ContentRuleList compilation failed with error: " - << base::SysNSStringToUTF8(error.description); - return false; - } - DCHECK(content_rule_list); - WKWebViewConfigurationProvider& configuration_provider = - WKWebViewConfigurationProvider::FromBrowserState(GetBrowserState()); - WKWebViewConfiguration* configuration = - configuration_provider.GetWebViewConfiguration(); - [configuration.userContentController addContentRuleList:content_rule_list]; - bool result = LoadHtml(html); - [configuration.userContentController removeContentRuleList:content_rule_list]; - return result; + return web::test::LoadHtmlWithoutSubresources(base::SysUTF8ToNSString(html), + web_state()); } void WebTestWithWebState::LoadHtml(NSString* html, const GURL& url) {
diff --git a/ios/web/security/crw_cert_verification_controller.mm b/ios/web/security/crw_cert_verification_controller.mm index 448b862..b40b8f81 100644 --- a/ios/web/security/crw_cert_verification_controller.mm +++ b/ios/web/security/crw_cert_verification_controller.mm
@@ -181,8 +181,8 @@ completionHandler:(web::PolicyDecisionHandler)handler { DCHECK_CURRENTLY_ON(WebThread::UI); DCHECK(handler); - TaskTraits traits{WebThread::IO, TaskShutdownBehavior::BLOCK_SHUTDOWN}; - base::PostTask(FROM_HERE, traits, base::BindOnce(^{ + web::GetIOThreadTaskRunner({}) + ->PostTask(FROM_HERE, base::BindOnce(^{ // |loadPolicyForRejectedTrustResult:certStatus:serverTrust // :host:| can only be called on IO thread. net::CertStatus certStatus =
diff --git a/ios/web/shell/shell_url_request_context_getter.h b/ios/web/shell/shell_url_request_context_getter.h index 2a6f44b..70d49fb 100644 --- a/ios/web/shell/shell_url_request_context_getter.h +++ b/ios/web/shell/shell_url_request_context_getter.h
@@ -14,13 +14,11 @@ #include "net/url_request/url_request_context_getter.h" namespace net { -class NetworkDelegate; class ProxyConfigService; class TransportSecurityPersister; class URLRequestContext; -class URLRequestContextStorage; class SystemCookieStore; -} +} // namespace net namespace web { @@ -49,8 +47,6 @@ base::FilePath base_path_; scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_; std::unique_ptr<net::ProxyConfigService> proxy_config_service_; - std::unique_ptr<net::NetworkDelegate> network_delegate_; - std::unique_ptr<net::URLRequestContextStorage> storage_; std::unique_ptr<net::URLRequestContext> url_request_context_; std::unique_ptr<net::TransportSecurityPersister> transport_security_persister_;
diff --git a/ios/web/shell/shell_url_request_context_getter.mm b/ios/web/shell/shell_url_request_context_getter.mm index 60d3313..e70b8756 100644 --- a/ios/web/shell/shell_url_request_context_getter.mm +++ b/ios/web/shell/shell_url_request_context_getter.mm
@@ -19,10 +19,7 @@ #import "ios/web/public/web_client.h" #include "net/base/cache_type.h" #include "net/base/network_delegate_impl.h" -#include "net/cert/cert_verifier.h" -#include "net/cert/ct_policy_enforcer.h" #include "net/dns/host_resolver.h" -#include "net/http/http_auth_handler_factory.h" #include "net/http/http_cache.h" #include "net/http/http_network_session.h" #include "net/http/http_server_properties.h" @@ -31,13 +28,10 @@ #include "net/log/net_log.h" #include "net/proxy_resolution/configured_proxy_resolution_service.h" #include "net/proxy_resolution/proxy_config_service_ios.h" -#include "net/quic/quic_context.h" -#include "net/ssl/ssl_config_service_defaults.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "net/url_request/static_http_user_agent_settings.h" #include "net/url_request/url_request_context.h" -#include "net/url_request/url_request_context_storage.h" -#include "net/url_request/url_request_job_factory.h" +#include "net/url_request/url_request_context_builder.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -61,38 +55,27 @@ DCHECK(network_task_runner_->BelongsToCurrentThread()); if (!url_request_context_) { - url_request_context_.reset(new net::URLRequestContext()); - url_request_context_->set_net_log(net::NetLog::Get()); - DCHECK(!network_delegate_.get()); - network_delegate_ = std::make_unique<net::NetworkDelegateImpl>(); - url_request_context_->set_network_delegate(network_delegate_.get()); - - storage_.reset( - new net::URLRequestContextStorage(url_request_context_.get())); - // Using std::move on a |system_cookie_store_| resets it to null as it's a - // unique_ptr, so |system_cookie_store_| will not be a dangling pointer. - storage_->set_cookie_store(std::make_unique<net::CookieStoreIOS>( - std::move(system_cookie_store_), url_request_context_->net_log())); - + net::URLRequestContextBuilder builder; + builder.set_network_delegate(std::make_unique<net::NetworkDelegateImpl>()); + builder.SetCookieStore(std::make_unique<net::CookieStoreIOS>( + std::move(system_cookie_store_), net::NetLog::Get())); std::string user_agent = web::GetWebClient()->GetUserAgent(web::UserAgentType::MOBILE); - storage_->set_http_user_agent_settings( + builder.set_http_user_agent_settings( std::make_unique<net::StaticHttpUserAgentSettings>("en-us,en", user_agent)); - storage_->set_proxy_resolution_service( + builder.set_proxy_resolution_service( net::ConfiguredProxyResolutionService::CreateUsingSystemProxyResolver( - std::move(proxy_config_service_), url_request_context_->net_log(), + std::move(proxy_config_service_), net::NetLog::Get(), /*quick_check_enabled=*/true)); - storage_->set_ssl_config_service( - std::make_unique<net::SSLConfigServiceDefaults>()); - storage_->set_cert_verifier( - net::CertVerifier::CreateDefault(/*cert_net_fetcher=*/nullptr)); + builder.set_host_resolver( + net::HostResolver::CreateStandaloneResolver(net::NetLog::Get())); + net::URLRequestContextBuilder::HttpCacheParams cache_params; + cache_params.type = net::URLRequestContextBuilder::HttpCacheParams::DISK; + cache_params.path = base_path_.Append(FILE_PATH_LITERAL("Cache")); + builder.EnableHttpCache(cache_params); + url_request_context_ = builder.Build(); - storage_->set_transport_security_state( - std::make_unique<net::TransportSecurityState>()); - storage_->set_ct_policy_enforcer( - base::WrapUnique(new net::DefaultCTPolicyEnforcer)); - storage_->set_quic_context(std::make_unique<net::QuicContext>()); base::FilePath transport_security_state_file_path = base_path_.Append(FILE_PATH_LITERAL("TransportSecurity")); transport_security_persister_ = @@ -101,50 +84,6 @@ base::ThreadPool::CreateSequencedTaskRunner( {base::MayBlock(), base::TaskPriority::BEST_EFFORT}), transport_security_state_file_path); - storage_->set_http_server_properties( - std::make_unique<net::HttpServerProperties>()); - - std::unique_ptr<net::HostResolver> host_resolver( - net::HostResolver::CreateStandaloneResolver( - url_request_context_->net_log())); - storage_->set_http_auth_handler_factory( - net::HttpAuthHandlerFactory::CreateDefault()); - storage_->set_host_resolver(std::move(host_resolver)); - - net::HttpNetworkSessionContext network_session_context; - network_session_context.cert_verifier = - url_request_context_->cert_verifier(); - network_session_context.transport_security_state = - url_request_context_->transport_security_state(); - network_session_context.ct_policy_enforcer = - url_request_context_->ct_policy_enforcer(); - network_session_context.net_log = url_request_context_->net_log(); - network_session_context.proxy_resolution_service = - url_request_context_->proxy_resolution_service(); - network_session_context.ssl_config_service = - url_request_context_->ssl_config_service(); - network_session_context.http_auth_handler_factory = - url_request_context_->http_auth_handler_factory(); - network_session_context.http_server_properties = - url_request_context_->http_server_properties(); - network_session_context.host_resolver = - url_request_context_->host_resolver(); - network_session_context.quic_context = url_request_context_->quic_context(); - - base::FilePath cache_path = base_path_.Append(FILE_PATH_LITERAL("Cache")); - std::unique_ptr<net::HttpCache::DefaultBackend> main_backend( - new net::HttpCache::DefaultBackend( - net::DISK_CACHE, net::CACHE_BACKEND_DEFAULT, cache_path, - /*max_bytes=*/0, /*hard_reset=*/false)); - - storage_->set_http_network_session( - std::make_unique<net::HttpNetworkSession>( - net::HttpNetworkSessionParams(), network_session_context)); - storage_->set_http_transaction_factory(std::make_unique<net::HttpCache>( - storage_->http_network_session(), std::move(main_backend), - true /* set_up_quic_server_info */)); - - storage_->set_job_factory(std::make_unique<net::URLRequestJobFactory>()); } return url_request_context_.get();
diff --git a/media/capture/video/chromeos/vendor_tag_ops_delegate.h b/media/capture/video/chromeos/vendor_tag_ops_delegate.h index c7a3ecb..a31122d 100644 --- a/media/capture/video/chromeos/vendor_tag_ops_delegate.h +++ b/media/capture/video/chromeos/vendor_tag_ops_delegate.h
@@ -10,6 +10,7 @@ #include <vector> #include "base/synchronization/lock.h" +#include "base/synchronization/waitable_event.h" #include "media/capture/video/chromeos/mojom/camera_common.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/remote.h"
diff --git a/media/gpu/mac/vt_video_decode_accelerator_mac.cc b/media/gpu/mac/vt_video_decode_accelerator_mac.cc index eba1691..77bc5c3 100644 --- a/media/gpu/mac/vt_video_decode_accelerator_mac.cc +++ b/media/gpu/mac/vt_video_decode_accelerator_mac.cc
@@ -953,6 +953,7 @@ // record parameter sets for VideoToolbox initialization. size_t data_size = 0; std::vector<H264NALU> nalus; + size_t first_slice_index = 0; h264_parser_.SetStream(buffer->data(), buffer->data_size()); H264NALU nalu; while (true) { @@ -1016,11 +1017,6 @@ return; } seen_pps_[pps_id].assign(nalu.data, nalu.data + nalu.size); - // Pass PPS as data to the platform decoder, it helps in cases - // when there are more than one PPS, Video Toolbox is smart enough - // to find and recognize them there. - nalus.push_back(nalu); - data_size += kNALUHeaderLength + nalu.size; break; } @@ -1105,8 +1101,12 @@ frame->has_mmco5 = h264_poc_.IsPendingMMCO5(); frame->pic_order_cnt = *pic_order_cnt; frame->reorder_window = ComputeH264ReorderWindow(sps); + + first_slice_index = nalus.size(); } - [[fallthrough]]; + nalus.push_back(nalu); + data_size += kNALUHeaderLength + nalu.size; + break; default: nalus.push_back(nalu); @@ -1140,27 +1140,53 @@ return; } - // Apply any configuration change, but only at an IDR. If there is no IDR, we - // just hope for the best from the decoder. - if (frame->is_idr && - (configured_sps_ != active_sps_ || configured_spsext_ != active_spsext_ || - configured_pps_ != active_pps_)) { - if (active_sps_.empty()) { - WriteToMediaLog(MediaLogMessageLevel::kERROR, - "Invalid configuration (no SPS)"); - NotifyError(INVALID_ARGUMENT, SFT_INVALID_STREAM); - return; - } - if (active_pps_.empty()) { - WriteToMediaLog(MediaLogMessageLevel::kERROR, - "Invalid configuration (no PPS)"); - NotifyError(INVALID_ARGUMENT, SFT_INVALID_STREAM); - return; - } + // If the configuration has changed, and we're at an IDR, reconfigure the + // decoding session. Otherwise insert the parameter sets and hope for the + // best. + if (configured_sps_ != active_sps_ || configured_spsext_ != active_spsext_ || + configured_pps_ != active_pps_) { + if (frame->is_idr) { + if (active_sps_.empty()) { + WriteToMediaLog(MediaLogMessageLevel::kERROR, + "Invalid configuration (no SPS)"); + NotifyError(INVALID_ARGUMENT, SFT_INVALID_STREAM); + return; + } + if (active_pps_.empty()) { + WriteToMediaLog(MediaLogMessageLevel::kERROR, + "Invalid configuration (no PPS)"); + NotifyError(INVALID_ARGUMENT, SFT_INVALID_STREAM); + return; + } - // ConfigureDecoder() calls NotifyError() on failure. - if (!ConfigureDecoder()) - return; + // ConfigureDecoder() calls NotifyError() on failure. + if (!ConfigureDecoder()) + return; + } else { + // Only |data| and |size| are read later, other fields are left empty. + media::H264NALU sps_nalu; + sps_nalu.data = active_sps_.data(); + sps_nalu.size = active_sps_.size(); + nalus.insert(nalus.begin() + first_slice_index, sps_nalu); + data_size += kNALUHeaderLength + sps_nalu.size; + first_slice_index += 1; + + if (active_spsext_.size()) { + media::H264NALU spsext_nalu; + spsext_nalu.data = active_spsext_.data(); + spsext_nalu.size = active_spsext_.size(); + nalus.insert(nalus.begin() + first_slice_index, spsext_nalu); + data_size += kNALUHeaderLength + spsext_nalu.size; + first_slice_index += 1; + } + + media::H264NALU pps_nalu; + pps_nalu.data = active_pps_.data(); + pps_nalu.size = active_pps_.size(); + nalus.insert(nalus.begin() + first_slice_index, pps_nalu); + data_size += kNALUHeaderLength + pps_nalu.size; + first_slice_index += 1; + } } // If the session is not configured by this point, fail.
diff --git a/mojo/public/cpp/bindings/interface_endpoint_client.h b/mojo/public/cpp/bindings/interface_endpoint_client.h index b1c097e..a1ed57a 100644 --- a/mojo/public/cpp/bindings/interface_endpoint_client.h +++ b/mojo/public/cpp/bindings/interface_endpoint_client.h
@@ -21,7 +21,6 @@ #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" #include "base/synchronization/lock.h" -#include "base/synchronization/waitable_event.h" #include "base/task/sequenced_task_runner.h" #include "base/time/time.h" #include "base/timer/timer.h"
diff --git a/mojo/public/cpp/bindings/receiver_set.cc b/mojo/public/cpp/bindings/receiver_set.cc index 35ccc17..95a5a0b 100644 --- a/mojo/public/cpp/bindings/receiver_set.cc +++ b/mojo/public/cpp/bindings/receiver_set.cc
@@ -138,7 +138,7 @@ } } -void ReceiverSetState::SetDispatchContext(const void* context, +void ReceiverSetState::SetDispatchContext(void* context, ReceiverId receiver_id) { current_context_ = context; current_receiver_ = receiver_id;
diff --git a/mojo/public/cpp/bindings/receiver_set.h b/mojo/public/cpp/bindings/receiver_set.h index 0f2cb4b..75a7934 100644 --- a/mojo/public/cpp/bindings/receiver_set.h +++ b/mojo/public/cpp/bindings/receiver_set.h
@@ -60,6 +60,7 @@ public: virtual ~ReceiverState() = default; virtual const void* GetContext() const = 0; + virtual void* GetContext() = 0; virtual void InstallDispatchHooks( std::unique_ptr<MessageFilter> filter, RepeatingConnectionErrorWithReasonCallback disconnect_handler) = 0; @@ -105,6 +106,11 @@ return current_context_; } + void* current_context() { + DCHECK(current_context_); + return current_context_; + } + ReceiverId current_receiver() const { DCHECK(current_context_); return current_receiver_; @@ -121,7 +127,7 @@ uint32_t custom_reason_code, const std::string& description); void FlushForTesting(); - void SetDispatchContext(const void* context, ReceiverId receiver_id); + void SetDispatchContext(void* context, ReceiverId receiver_id); void OnDisconnect(ReceiverId id, uint32_t custom_reason_code, const std::string& description); @@ -131,7 +137,7 @@ RepeatingConnectionErrorWithReasonCallback disconnect_with_reason_handler_; ReceiverId next_receiver_id_ = 0; EntryMap entries_; - const void* current_context_ = nullptr; + void* current_context_ = nullptr; ReceiverId current_receiver_; base::WeakPtrFactory<ReceiverSetState> weak_ptr_factory_{this}; }; @@ -300,6 +306,14 @@ return *static_cast<const Context*>(state_.current_context()); } + // Like `current_context() const`, but returns non-const reference to the + // context value. + Context& current_context() { + static_assert(ContextTraits::SupportsContext(), + "current_context() requires non-void context type."); + return *static_cast<Context*>(state_.current_context()); + } + // Implementations may call this when processing a received method call or // disconnection notification. See above note for constraints on usage. // This returns the ReceiverId associated with the specific receiver which @@ -369,6 +383,7 @@ // ReceiverSetState::ReceiverState: const void* GetContext() const override { return &context_; } + void* GetContext() override { return &context_; } void InstallDispatchHooks(std::unique_ptr<MessageFilter> filter, RepeatingConnectionErrorWithReasonCallback @@ -393,7 +408,7 @@ private: ReceiverType receiver_; - Context const context_; + Context context_; }; ReceiverId AddImpl(ImplPointerType impl,
diff --git a/mojo/public/cpp/bindings/tests/receiver_set_unittest.cc b/mojo/public/cpp/bindings/tests/receiver_set_unittest.cc index 8f483605..782d8c8 100644 --- a/mojo/public/cpp/bindings/tests/receiver_set_unittest.cc +++ b/mojo/public/cpp/bindings/tests/receiver_set_unittest.cc
@@ -25,18 +25,40 @@ using ReceiverSetTest = BindingsTestBase; template <typename ReceiverSetType, typename ContextType> -void ExpectContextHelper(ReceiverSetType* receiver_set, +void ExpectContextHelper(const ReceiverSetType* receiver_set, ContextType expected_context) { EXPECT_EQ(expected_context, receiver_set->current_context()); } template <typename ReceiverSetType, typename ContextType> -base::RepeatingClosure ExpectContext(ReceiverSetType* receiver_set, +base::RepeatingClosure ExpectContext(const ReceiverSetType* receiver_set, ContextType expected_context) { return base::BindRepeating(&ExpectContextHelper<ReceiverSetType, ContextType>, receiver_set, expected_context); } +template <typename ReceiverSetType, typename ContextType> +void ExpectMutableContextHelper(ReceiverSetType* receiver_set, + ContextType expected_context, + ContextType new_context) { + { + ContextType& context = receiver_set->current_context(); + EXPECT_EQ(context, expected_context); + context = new_context; + } + + ExpectContextHelper(receiver_set, new_context); +} + +template <typename ReceiverSetType, typename ContextType> +base::RepeatingClosure ExpectMutableContext(ReceiverSetType* receiver_set, + ContextType expected_context, + ContextType new_context) { + return base::BindRepeating( + &ExpectMutableContextHelper<ReceiverSetType, ContextType>, receiver_set, + expected_context, new_context); +} + template <typename ReceiverSetType> void ExpectReceiverIdHelper(ReceiverSetType* receiver_set, ReceiverId expected_receiver_id) { @@ -148,6 +170,29 @@ EXPECT_TRUE(receivers.empty()); } +TEST_P(ReceiverSetTest, ReceiverSetMutableContext) { + PingImpl impl; + + ReceiverSet<PingService, int> receivers; + Remote<PingService> ping_a, ping_b; + receivers.Add(&impl, ping_a.BindNewPipeAndPassReceiver(), 1); + receivers.Add(&impl, ping_b.BindNewPipeAndPassReceiver(), 2); + + { + impl.set_ping_handler(ExpectMutableContext(&receivers, 1, 3)); + base::RunLoop loop; + ping_a->Ping(loop.QuitClosure()); + loop.Run(); + } + + { + impl.set_ping_handler(ExpectMutableContext(&receivers, 2, 4)); + base::RunLoop loop; + ping_b->Ping(loop.QuitClosure()); + loop.Run(); + } +} + TEST_P(ReceiverSetTest, ReceiverSetDispatchReceiver) { PingImpl impl;
diff --git a/mojo/public/js/mojo_bindings_resources.grd b/mojo/public/js/mojo_bindings_resources.grd index 0a262e1..be3fc72 100644 --- a/mojo/public/js/mojo_bindings_resources.grd +++ b/mojo/public/js/mojo_bindings_resources.grd
@@ -126,7 +126,7 @@ use_base_dir="false" resource_path="mojo/mojo/public/mojom/base/unguessable_token.mojom-webui.js" type="BINDATA" /> - <if expr="is_win or is_macosx or is_linux or is_android"> + <if expr="is_win or is_macosx or is_linux or is_android or is_fuchsia"> <include name="IDR_MOJO_PROCESS_ID_MOJOM_WEBUI_JS" file="${root_gen_dir}/mojom-webui/mojo/public/mojom/base/process_id.mojom-webui.js" use_base_dir="false"
diff --git a/services/preferences/tracked/pref_hash_calculator_unittest.cc b/services/preferences/tracked/pref_hash_calculator_unittest.cc index eb04e68..deedab7a 100644 --- a/services/preferences/tracked/pref_hash_calculator_unittest.cc +++ b/services/preferences/tracked/pref_hash_calculator_unittest.cc
@@ -87,10 +87,9 @@ nested_empty_dict.SetKey("a", base::DictionaryValue()); nested_empty_dict.SetKey("b", base::ListValue()); base::ListValue nested_empty_list; - nested_empty_list.Append(std::make_unique<base::DictionaryValue>()); - nested_empty_list.Append(std::make_unique<base::ListValue>()); - nested_empty_list.Append( - std::make_unique<base::Value>(nested_empty_dict.Clone())); + nested_empty_list.Append(base::Value(base::Value::Type::DICTIONARY)); + nested_empty_list.Append(base::Value(base::Value::Type::LIST)); + nested_empty_list.Append(nested_empty_dict.Clone()); // A dictionary with an empty dictionary, an empty list, and nested empty // dictionaries/lists in it.
diff --git a/services/tracing/perfetto/privacy_filtered_fields-inl.h b/services/tracing/perfetto/privacy_filtered_fields-inl.h index f1c85922..763a0f4 100644 --- a/services/tracing/perfetto/privacy_filtered_fields-inl.h +++ b/services/tracing/perfetto/privacy_filtered_fields-inl.h
@@ -328,11 +328,12 @@ // Proto Message: TrackEvent constexpr int kTrackEventIndices[] = { - 1, 2, 3, 5, 6, 9, 10, 11, 12, 16, 17, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 38, 39, 40, 41, 42, 43, 1001, 1002, 1003, 1004, - 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, - 1017, 1018, 1019, 1020, 1021, 1023, 1024, 1025, 1031, 1032, 1033, -1}; + 1, 2, 3, 5, 6, 9, 10, 11, 12, 16, 17, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 38, 39, 40, 41, 42, 43, 1001, + 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, + 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1023, 1024, + 1025, 1031, 1032, 1033, 1036, -1}; constexpr MessageInfo const* kTrackEventComplexMessages[] = { nullptr, nullptr, @@ -392,7 +393,8 @@ &kChromeSamplingProfilerSampleCollected, &kRendererMainThreadTaskExecution, &kEventLatency, - &kProcessSingleton}; + &kProcessSingleton, + nullptr}; constexpr MessageInfo kTrackEvent = {kTrackEventIndices, kTrackEventComplexMessages};
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h index d0e6fe50..39478f04 100644 --- a/skia/config/SkUserConfig.h +++ b/skia/config/SkUserConfig.h
@@ -215,8 +215,6 @@ #define SK_LEGACY_INNER_JOINS -#define SK_LEGACY_RP_BICUBIC - ///////////////////////// Imported from BUILD.gn and skia_common.gypi /* In some places Skia can use static initializers for global initialization,
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json index ccc92e1..a946e60 100644 --- a/testing/buildbot/chrome.json +++ b/testing/buildbot/chrome.json
@@ -1778,7 +1778,7 @@ { "args": [], "cros_board": "atlas", - "cros_img": "atlas-release/R101-14579.0.0", + "cros_img": "atlas-release/R101-14583.0.0", "name": "lacros_all_tast_tests_ATLAS_RELEASE_LKGM", "resultdb": { "enable": true, @@ -1808,7 +1808,7 @@ { "args": [], "cros_board": "atlas", - "cros_img": "atlas-release/R100-14526.19.0", + "cros_img": "atlas-release/R100-14526.28.0", "name": "lacros_all_tast_tests_ATLAS_RELEASE_BETA", "resultdb": { "enable": true, @@ -1838,7 +1838,7 @@ { "args": [], "cros_board": "eve", - "cros_img": "eve-release/R101-14579.0.0", + "cros_img": "eve-release/R101-14583.0.0", "name": "lacros_all_tast_tests_EVE_RELEASE_LKGM", "resultdb": { "enable": true, @@ -1868,7 +1868,7 @@ { "args": [], "cros_board": "eve", - "cros_img": "eve-release/R100-14526.19.0", + "cros_img": "eve-release/R100-14526.28.0", "name": "lacros_all_tast_tests_EVE_RELEASE_BETA", "resultdb": { "enable": true, @@ -1943,7 +1943,7 @@ { "args": [], "cros_board": "kevin", - "cros_img": "kevin-release/R101-14579.0.0", + "cros_img": "kevin-release/R101-14583.0.0", "name": "lacros_all_tast_tests_KEVIN_RELEASE_LKGM", "resultdb": { "enable": true, @@ -1958,7 +1958,7 @@ { "args": [], "cros_board": "hana", - "cros_img": "hana-release/R101-14579.0.0", + "cros_img": "hana-release/R101-14583.0.0", "name": "lacros_all_tast_tests_HANA_RELEASE_LKGM", "resultdb": { "enable": true, @@ -1971,9 +1971,11 @@ "timeout_sec": 10800 }, { - "args": [], + "args": [ + "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.ozone_unittests.filter" + ], "cros_board": "kevin", - "cros_img": "kevin-release/R101-14579.0.0", + "cros_img": "kevin-release/R101-14583.0.0", "name": "ozone_unittests_KEVIN_RELEASE_LKGM", "resultdb": { "enable": true, @@ -1985,9 +1987,11 @@ "timeout_sec": 3600 }, { - "args": [], + "args": [ + "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.ozone_unittests.filter" + ], "cros_board": "hana", - "cros_img": "hana-release/R101-14579.0.0", + "cros_img": "hana-release/R101-14583.0.0", "name": "ozone_unittests_HANA_RELEASE_LKGM", "resultdb": { "enable": true, @@ -1999,9 +2003,11 @@ "timeout_sec": 3600 }, { - "args": [], + "args": [ + "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.viz_unittests.filter" + ], "cros_board": "kevin", - "cros_img": "kevin-release/R101-14579.0.0", + "cros_img": "kevin-release/R101-14583.0.0", "name": "viz_unittests_KEVIN_RELEASE_LKGM", "resultdb": { "enable": true, @@ -2013,9 +2019,11 @@ "timeout_sec": 3600 }, { - "args": [], + "args": [ + "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.viz_unittests.filter" + ], "cros_board": "hana", - "cros_img": "hana-release/R101-14579.0.0", + "cros_img": "hana-release/R101-14583.0.0", "name": "viz_unittests_HANA_RELEASE_LKGM", "resultdb": { "enable": true,
diff --git a/testing/buildbot/filters/BUILD.gn b/testing/buildbot/filters/BUILD.gn index 7a33e70..bc5ba530 100644 --- a/testing/buildbot/filters/BUILD.gn +++ b/testing/buildbot/filters/BUILD.gn
@@ -347,7 +347,10 @@ } source_set("ozone_unittests_filters") { - data = [ "//testing/buildbot/filters/chromeos.ozone_unittests.filter" ] + data = [ + "//testing/buildbot/filters/chromeos.ozone_unittests.filter", + "//testing/buildbot/filters/lacros-arm.ozone_unittests.filter", + ] } source_set("sandbox_linux_unittests_filters") { @@ -376,6 +379,7 @@ "//testing/buildbot/filters/android.emulator_11.viz_unittests.filter", "//testing/buildbot/filters/fuchsia.debug.viz_unittests.filter", "//testing/buildbot/filters/fuchsia.viz_unittests.filter", + "//testing/buildbot/filters/lacros-arm.viz_unittests.filter", ] }
diff --git a/testing/buildbot/filters/chromeos.msan.browser_tests.oobe_negative.filter b/testing/buildbot/filters/chromeos.msan.browser_tests.oobe_negative.filter index b3a7453..fb81232 100644 --- a/testing/buildbot/filters/chromeos.msan.browser_tests.oobe_negative.filter +++ b/testing/buildbot/filters/chromeos.msan.browser_tests.oobe_negative.filter
@@ -71,6 +71,8 @@ -EncryptionMigrationTest.* -EnrollmentLocalPolicyServerBase.* -EnrollmentRecoveryTest.* +-EnrollmentScreenChromadMigrationTest.* +-EnrollmentScreenHandsOffTest.* -EnrollmentScreenTest.* -EnterpriseEnrollmentTest.* -EnterpriseEnrollmentTestBase.* @@ -166,7 +168,9 @@ -WebviewLoginTest.* -WebviewProxyAuthLoginTest.* -WelcomeScreenBrowserTest.* +-WelcomeScreenChromadMigrationBrowserTest.* -WelcomeScreenChromeVoxHintTest.* +-WelcomeScreenHandsOffBrowserTest.* -WelcomeScreenInternationalChromeVoxHintTest.* -WelcomeScreenSystemDevModeBrowserTest.* -WelcomeScreenTimezone.* @@ -182,6 +186,7 @@ -WizardControllerKioskFlowTest.* -WizardControllerOnboardingResumeTest.* -WizardControllerOobeConfigurationTest.* +-WizardControllerOobeSwitchTest.* -WizardControllerOobeResumeTest.* -WizardControllerProxyAuthOnSigninTest.* -WizardControllerRollbackFlowTest.*
diff --git a/testing/buildbot/filters/chromeos.msan.browser_tests.oobe_positive.filter b/testing/buildbot/filters/chromeos.msan.browser_tests.oobe_positive.filter index 14ede5a..9733dfb6 100644 --- a/testing/buildbot/filters/chromeos.msan.browser_tests.oobe_positive.filter +++ b/testing/buildbot/filters/chromeos.msan.browser_tests.oobe_positive.filter
@@ -71,6 +71,8 @@ EncryptionMigrationTest.* EnrollmentLocalPolicyServerBase.* EnrollmentRecoveryTest.* +EnrollmentScreenChromadMigrationTest.* +EnrollmentScreenHandsOffTest.* EnrollmentScreenTest.* EnterpriseEnrollmentTest.* EnterpriseEnrollmentTestBase.* @@ -166,7 +168,9 @@ WebviewLoginTest.* WebviewProxyAuthLoginTest.* WelcomeScreenBrowserTest.* +WelcomeScreenChromadMigrationBrowserTest.* WelcomeScreenChromeVoxHintTest.* +WelcomeScreenHandsOffBrowserTest.* WelcomeScreenInternationalChromeVoxHintTest.* WelcomeScreenSystemDevModeBrowserTest.* WelcomeScreenTimezone.* @@ -183,6 +187,7 @@ WizardControllerOnboardingResumeTest.* WizardControllerOobeConfigurationTest.* WizardControllerOobeResumeTest.* +WizardControllerOobeSwitchTest.* WizardControllerProxyAuthOnSigninTest.* WizardControllerRollbackFlowTest.* WizardControllerScreenPriorityOOBETest.*
diff --git a/testing/buildbot/filters/fuchsia.browser_tests.filter b/testing/buildbot/filters/fuchsia.browser_tests.filter index 9482e4c1..8561f4e5 100644 --- a/testing/buildbot/filters/fuchsia.browser_tests.filter +++ b/testing/buildbot/filters/fuchsia.browser_tests.filter
@@ -1,4 +1,3 @@ --AbortPaymentHandlerTest.JitPaymentHandlerCanRefuseAbort -AccessContextAuditBrowserTest.CheckSessionOnly -AccessContextAuditBrowserTest.MultipleAccesses -AccessContextAuditBrowserTest.Remove* @@ -12,89 +11,29 @@ -AdsPageLoadMetricsObserverBrowserTest.SubframeNavigate_CpuTimesCumulative -All/BrowsingDataRemoverBrowserTestP.Web* -All/CastV2PerformanceTest.Performance* +-All/ChromeBrowsingDataLifetimeManagerScheduledRemovalTest.Cache/0 -All/ChromeBrowsingDataLifetimeManagerScheduledRemovalTest.Download* -All/ChromeBrowsingDataLifetimeManagerScheduledRemovalTest.Keeps* -All/ChromeBrowsingDataLifetimeManagerScheduledRemovalTest.PrefChange/0 -All/ChromeBrowsingDataLifetimeManagerScheduledRemovalTest.Site* -All/ChromeMultiProfileStartupBrowserTestBase.Post* --All/CookieSettingsTest.Basic* -All/CryptotokenBrowserTest.Sign* --All/DeclarativeNetRequestAllowAllRequestsBrowserTest.Test* --All/DeclarativeNetRequestBackForwardCacheBrowserTest.Back* --All/DeclarativeNetRequestBrowserTest.ActionCountPreferenceMultipleWindows/0 --All/DeclarativeNetRequestBrowserTest.Actions* --All/DeclarativeNetRequestBrowserTest.Allow* -All/DeclarativeNetRequestBrowserTest.Block* --All/DeclarativeNetRequestBrowserTest.ChromeURLS/0 --All/DeclarativeNetRequestBrowserTest.DynamicRules/0 --All/DeclarativeNetRequestBrowserTest.Enable_Disable_Reload_Uninstall/0 --All/DeclarativeNetRequestBrowserTest.FledgeAuctionScripts/0 --All/DeclarativeNetRequestBrowserTest.Get* --All/DeclarativeNetRequestBrowserTest.HostAccessPermission/0 --All/DeclarativeNetRequestBrowserTest.ImageCollapsed/0 --All/DeclarativeNetRequestBrowserTest.InterceptExtensionScheme/0 --All/DeclarativeNetRequestBrowserTest.ModifyHeadersBadgeText/0 --All/DeclarativeNetRequestBrowserTest.MultipleRulesets/0 --All/DeclarativeNetRequestBrowserTest.OnRuleMatchedDebugAvailability/0 -All/DeclarativeNetRequestBrowserTest.Pac* --All/DeclarativeNetRequestBrowserTest.Redirect* --All/DeclarativeNetRequestBrowserTest.RendererCacheCleared/0 --All/DeclarativeNetRequestBrowserTest.RulesetPrefsDeletedOnUninstall/0 --All/DeclarativeNetRequestBrowserTest.TabIdFiltering/0 --All/DeclarativeNetRequestBrowserTest.UpgradeRules/0 --All/DeclarativeNetRequestBrowserTest.WarningOnFailedRulesetLoad/0 --All/DeclarativeNetRequestBrowserTest.WebRequestPriority/0 --All/DeclarativeNetRequestBrowserTest.WithheldPermissions_Block/0 --All/DeclarativeNetRequestBrowserTest.ZeroRulesets/0 --All/DeclarativeNetRequestBrowserTest_Packed.BrowserRestart/0 --All/DeclarativeNetRequestBrowserTest_Packed.CorruptedIndexedRuleset/0 --All/DeclarativeNetRequestBrowserTest_Packed.Extension* --All/DeclarativeNetRequestBrowserTest_Packed.UpdateRespectsPermission/0 --All/DeclarativeNetRequestGlobalRulesBrowserTest_Packed.GlobalRulesBrowserRestart/0 --All/DeclarativeNetRequestGlobalRulesBrowserTest_Packed.PackedUpdateAndReload/0 --All/DeclarativeNetRequestGlobalRulesBrowserTest_Packed.UpdateEnabledRulesetsAfterPackedUpdate/0 --All/DeclarativeNetRequestHostPermissionsBrowserTest.NoPermissions/0 --All/DeclarativeNetRequestHostPermissionsBrowserTest.SubframesRequireNoInitiatorPermissions/0 --All/DeclarativeNetRequestIdentifiabilityTest.DeclarativeBlockRecorded/0 -All/DeclarativeNetRequestResourceTypeBrowserTest.Test* --All/DeclarativeNetRequestSubresourceWebBundlesBrowserTest.Request* --All/DeclarativeNetRequestSubresourceWebBundlesBrowserTest.WebBundleRequestRedirected/0 --All/DeclarativeNetRequestWebTransportTest.BlockRequests/0 +-All/DiceWebSigninInterceptionBubblePixelTest.Invoke* +-All/DiceWebSigninInterceptionBubbleSyncPromoPixelTest.Invoke* -All/DownloadFramePolicyBrowserTest_UpdateIframeSandboxFlags.Effective* -All/DownloadFramePolicyBrowserTest_UpdateIframeSandboxFlags.Pending* -All/DownloadReferrerPolicyTest.Alt* -All/DownloadReferrerPolicyTest.Download* -All/DownloadReferrerPolicyTest.Save* -All/DownloadTestWithOptionalSafetyTipsFeature.Safety* --All/ExtensionCrxInstallerTestWithWithholdingUI.WithholdingHostsOnInstall/0 -All/ExtensionURLLoaderThrottleWithSplitCacheBrowserTest.Do* --All/HostedAppIsolatedOriginTest.AppBroaderThanIsolatedOrigin/0 --All/HostedAppIsolatedOriginTest.NestedIsolatedOriginStaysOutsideApp/0 --All/HostedAppJitTestBaseDefaultDisabled.JITDisabledTest/0 --All/HostedAppJitTestBaseDefaultEnabled.JITDisabledTest/0 --All/HostedAppOriginIsolationTest.Isolated* --All/HostedAppProcessModelTest.AppRegistrarExcludesPackaged/0 --All/HostedAppProcessModelTest.BackgroundPageWithAppCoveringDifferentSites/0 --All/HostedAppProcessModelTest.FromOutsideHostedApp/0 --All/HostedAppProcessModelTest.IframeNavigationsInsideHostedApp/0 --All/HostedAppProcessModelTest.IframesInsideHostedApp/0 --All/HostedAppProcessModelTest.NavigateToAppURLWithDoubleSlashPath/0 --All/HostedAppProcessModelTest.PopupsInsideHostedApp/0 --All/HostedAppSitePerProcessTest.CrossSiteNavigationsWithinApp/0 --All/HostedAppSitePerProcessTest.Do* --All/HostedAppTest.HasReloadButton/0 --All/HostedAppTest.NotWebApp/0 --All/HostedAppTestWithAutoupgradesDisabled.MixedContentInPlatformApp/0 --All/HostedAppTestWithAutoupgradesDisabled.Should* --All/HostedOrWebAppTest.CanUserUninstall/HostedApp -All/HostedOrWebAppTest.Ctrl* --All/HostedOrWebAppTest.Should* --All/HostedOrWebAppTest.SubframeRedirectsToHostedApp/HostedApp --All/HostedOrWebAppTest.Web* -All/LoadingPredictorNetworkIsolationKeyBrowserTest.Loading* -All/LoginPromptBrowserTest.Block* -All/LoginPromptBrowserTest.Should* --All/LookalikeUrlNavigationThrottleDigitalAssetLinksBrowserTest.Valid* -All/ManifestUpdateManagerBrowserTest_AppIdentityParameterized.Check* -All/ManifestUpdateManagerBrowserTest_UpdateDialog.Check* -All/ManifestUpdateManagerBrowserTest_UpdateDialog.ScopeChangeWithProductIconChange/UpdateDialogEnabled @@ -103,22 +42,24 @@ -All/MediaEngagementAutoplayBrowserTest.Use* -All/MediaHistoryBrowserTest.Do* -All/MediaHistoryBrowserTest.Record* --All/NetworkRequestMetricsBrowserTest.Download* +-All/NetworkRequestMetricsBrowserTest.Cancel* +-All/NetworkRequestMetricsBrowserTest.Download/1 +-All/NetworkRequestMetricsBrowserTest.File* +-All/NetworkRequestMetricsBrowserTest.Interrupted* +-All/NetworkRequestMetricsBrowserTest.Net* +-All/NetworkRequestMetricsBrowserTest.Success* -All/NoStatePrefetchBrowserTestHttpCache_DefaultAndDoubleKeyedHttpCache.Load* -All/OneTimePermissionPromptBubbleViewBrowserTest.Invoke* -All/OtherFrameNavigationDownloadBrowserTest_AdFrame.Download* --All/PaymentHandlerJustInTimeInstallationTestWithParam.MultiplePaymentMethods/0 -All/PermissionPromptBubbleViewBrowserTest.Active* -All/PermissionPromptBubbleViewBrowserTest.Invoke* -All/PopupBrowserTest.Move* --All/ProfileNetworkContextServiceDiskCacheBrowsertest.DiskCacheLocation/1 -All/RendererEventInjectionTest.TestRootTransform/0 -All/ReportingBrowserTest.Crash* --All/SafetyTipPageInfoBubbleViewDigitalAssetLinksBrowserTest.NoShowOnDigitalAssetLinkMatch/0 -All/SearchPrefetchServiceEnabledBrowserTest.Back* -All/SubframeSameFrameDownloadBrowserTest_AdFrame.Download* -All/SubframeSameFrameDownloadBrowserTest_Sandbox.Download* --All/SubresourceFilterWebSocketBrowserTest.BlockWebSocket/0 +-All/SubresourceFilterWebSocketBrowserTest.Block* -All/SubresourceFilterWebSocketBrowserTest.Do* -All/TabCapturePerformanceTest.Performance* -All/TopFrameSameFrameDownloadBrowserTest.Download* @@ -130,33 +71,29 @@ -AppBackgroundPageApiTest.NoJsBackgroundPage -AppInfoDialogBrowserTest.InvokeUi_default -AppSessionRestoreTest.Restore* --AppViewTest.Test* +-AppSettingsAppTest.All -AppWindowApiTest.On* -AskGoogleForSuggestionsDialogTest.InvokeUi_default +-AudibleContentsTrackerTest.TestAudioNotifications -AuthenticatorDialogTest.Invoke* -AuthenticatorDialogViewTest.Invoke* --AutoPictureInPictureWindowControllerBrowserTest.AutoExitPictureInPictureIsTriggeredInRegularWebApp -AutofillErrorDialogViewNativeViewsBrowserTest.Invoke* -AutofillPopupBaseViewTest.CorrectBoundsTest -AutofillProgressDialogViewsBrowserTest.InvokeUi -AutomationApiTest.BoundsForRange -AutomationApiTest.Events +-AutomationApiTest.HitTest -AutomationApiTest.Location2 -AutomationApiTest.SanityCheck -AvatarToolbarButtonBrowserTest.GuestWindowCount -BackForwardCacheSiteDetailsBrowserTest.MemoryDetailsForBackForwardCache --BackgroundAppBrowserTest.InstallBackgroundApp --BackgroundFetchBrowserTest.DownloadService_Acceptance +-BackgroundFetchBrowserTest.ClickEventIsDispatched -BackgroundFetchBrowserTest.Fetch* -BackgroundFetchBrowserTest.Fetches* --BackgroundFetchBrowserTest.Offline* --BackgroundFetchBrowserTest.RecordBackgroundFetchUkmEvent --BiMapTest.All --BitmapFetcherBrowserTest.DataURLImage --BitmapFetcherBrowserTest.StartTest -BluetoothApiTest.Device* -BluetoothApiTest.Discovery* -BluetoothApiTest.Get* +-BluetoothApiTest.OnAdapterStateChanged -BluetoothChooserBrowserTest.Invoke* -BluetoothPrivateApiTest.CancelPairing -BluetoothPrivateApiTest.Connect @@ -174,21 +111,14 @@ -BookmarksListTest.All -BreadcrumbManagerTabHelperBrowserTest.Download -BreadcrumbManagerTabHelperSecurityStateBrowserTest.BrokenAuthentication --BrowserActionApiTest.TestPictureInPictureOnBrowserActionIconClick -BrowserCloseManagerBrowserTest.Test* -BrowserFrameTest.DevToolsHasBoundsOnOpen -BrowserFrameTest.WebAppsHasBoundsOnOpen --BrowserNonClientFrameViewBrowserTest.Bookmark* --BrowserNonClientFrameViewBrowserTest.BrowserFrameColorThemed --BrowserNonClientFrameViewBrowserTest.CustomTabBarIsVisibleInFullscreen --BrowserNonClientFrameViewBrowserTest.FullscreenForTabTitlebarHeight -BrowserNonClientFrameViewBrowserTest.HTMLMetaThemeColorOverridesManifest -BrowserTabRestoreTest.DelegateRestoreTabDisposition -BrowserTabRestoreTest.RecentTabsMenuTabDisposition --BrowserTest.DialogsDropFullscreen -BrowserTest.DownloadDoesntDismissDialog -BrowserTest.FaviconChange --BrowserTest.FullscreenBookmarkBar -BrowserTest.TestPopupBounds -BrowserTestWithTabGroupsAutoCreateEnabled.SecondNewTabFromLinkWithSameDomainCreatesGroup -BrowserViewTest.DevToolsUpdatesBrowserWindow @@ -205,6 +135,7 @@ -CacheCounterTest.NonEmpty -CacheCounterTest.PeriodChanged -CacheCounterTest.PrefChanged +-CaptivePortalBrowserTest.CertErrorOnCaptivePortalLoginShowsSSLErrorInterstitial -CaptivePortalBrowserTest.InterstitialTimerNavigateWhileLoading_EndWithSSLInterstitial -CaptivePortalBrowserTest.SSLCertErrorLogin -CaptivePortalBrowserTest.ShowCaptivePortalInterstitialOnCertError @@ -226,11 +157,26 @@ -CertificateTransparencySSLUITest.EnforcedAfterApril2018 -ChromeAcceptHeaderTest.Check -ChromeBackForwardCacheBrowserTest.DoNotShowSameSiteSubframeInTaskManager --ChromeBackForwardCacheBrowserTest.DoesNotCacheIfPictureInPicture -ChromeBackForwardCacheBrowserTest.Show* --ChromeBrowserCloudManagementEnrollmentTest/ChromeBrowserCloudManagementEnrollmentTest.Test/1 +-ChromeBrowserCloudManagementEnrollmentTest/ChromeBrowserCloudManagementEnrollmentTest.Test* -ChromeBrowsingDataLifetimeManagerShutdownTest.BrowserShutdown +-ChromeLabsUiTest.InvokeUi_default +-ChromeMimeHandlerViewTest.ActivatePostMessageSupportOnce +-ChromeMimeHandlerViewTest.BackgroundPage +-ChromeMimeHandlerViewTest.Basic +-ChromeMimeHandlerViewTest.Before* +-ChromeMimeHandlerViewTest.DataUrl +-ChromeMimeHandlerViewTest.DoNotLoadInSandboxedFrame +-ChromeMimeHandlerViewTest.Embed* +-ChromeMimeHandlerViewTest.Embedded* +-ChromeMimeHandlerViewTest.EmbedderFrameRemovedNoCrash +-ChromeMimeHandlerViewTest.Iframe -ChromeMimeHandlerViewTest.MimeHandlerViewInDisplayNoneFrameForGoogleApps +-ChromeMimeHandlerViewTest.NonAsciiHeaders +-ChromeMimeHandlerViewTest.PostMessage +-ChromeMimeHandlerViewTest.RejectPointLock +-ChromeMimeHandlerViewTest.SingleRequest +-ChromeMimeHandlerViewTest.TargetBlankAnchor -ChromeMojoProxyResolverFactoryBrowserTest.DestroyAndCreateService -ChromeNavigationBrowserTest.CrossSiteRedirectionToPDF -ChromeNavigationBrowserTest.OpenerNavigation_DownloadPolicy_Allowed @@ -240,46 +186,51 @@ -ChromePasswordProtectionServiceBrowserWithFakeBackendPasswordStoreTest.SavedPassword -ChromePasswordProtectionServiceSyncBrowserTest.GSuitePasswordAlertMode -ChromeSitePerProcessPDFTest.EmbeddedPDFInsideCrossOriginFrame +-ChromeSitePerProcessTest.JSPrintDuringSwap -ChromeSitePerProcessTest.PopupWindowFocus --ChromeSitePerProcessTest.TwoFingerTapContextMenu -ChromeTracingDelegateBrowserTestFromCommandLine.IgnoreThrottle -ChromeTracingDelegateBrowserTestFromCommandLine.ScenarioFromCommandLine -ChromeURLDataManagerWebUITrustedTypesTest.No* --ChromeUpdatesEventsApiTest.ChromeUpdates -ClickModifierTest.Href* -ClickModifierTest.Window* -ClientHintsBrowserTest.Switch* -CollectedCookiesTest.InvokeUi_default --ColocatedPaymentManifestsTest.CanPay -CommandServiceTest.Get* -CommandServiceTest.Remove* +-CommerceHintAddToCartPatternTest.Add* +-CommerceHintAgentFencedFrameTest.VisitCartInFencedFrame +-CommerceHintAgentPortalBrowserTest.VisitCartInPortal +-CommerceHintAgentTest.Add* +-CommerceHintAgentTest.ExtractCart +-CommerceHintAgentTest.PurchaseByForm +-CommerceHintAgentTest.Visit* +-CommerceHintCacaoTest.Rejected +-CommerceHintCartPatternTest.VisitCart +-CommerceHintCheckoutPatternTest.VisitCheckout +-CommerceHintMaxCountTest.ExtractCart +-CommerceHintOptimizeRendererTest.CartExtractionSkipped +-CommerceHintPurchaseURLPatternTest.PurchaseByURL +-CommerceHintSkippAddToCartTest.AddToCartByForm +-CommerceHintTimeoutTest.ExtractCart -CommonNameMismatchBrowserTest.NoCrashIfBothSubdomainsHaveCommonNameErrors -CommonNameMismatchBrowserTest.WWWSubdomainMismatch_StopOnRedirects -ConditionalCacheCountingHelperBrowserTest.Count -ConfirmBubbleTest.InvokeUi_default --ConnectionHelpTabHelperTest.CorrectlyExpandsCertErrorSection +-ConnectionHelpTabHelperTest.Correctly* -ConnectionHelpTabHelperTest.Interstitial* -ConsumerDeepScanningBrowserTest.NonretriableErrorDoesNotShowModal +-ConsumerDeepScanningBrowserTest.RetriableErrorShowsModal +-ContentAnalysisDelegateBlockingSettingBrowserTest.Block* -ContentAnalysysDialogUiTest.InvokeUi_default -ContentScriptApiTest.ContentScriptCSSLocalization -ContentSettingBubbleDialogTest.Invoke* --ContentVerifierPolicyTest.Backoff --ContentVerifierPolicyTest.FailedUpdateRetries --ContentVerifierPolicyTest.PolicyCorruptedOnStartup --ContentVerifierTest.Content* --ContentVerifierTest.DotSlashPaths --ContentVerifierTest.ManualInstalledExtensionGotCorruptedThenForceInstalled --ContentVerifierTest.PolicyCorrupted --ContentVerifierTest.Remains* --ContentVerifierTest.ResourceReadCancellationDoesNotFailVerification --ContentVerifierTest.TamperLargeSizedResource --ContentVerifierTest.Verification* +-ContentVerifierTest.ContentScriptsInLocales -ContextMenuBrowserTest.Gif* -ContextMenuBrowserTest.JpgImageDownscaleToJpg -ContextMenuBrowserTest.MenuContentsVerification_Subframe -ContextMenuBrowserTest.Non* -ContextMenuBrowserTest.OpenProfileNoneReferrer --ContextMenuBrowserTest.PngImageOriginalDownscaleToPng +-ContextMenuBrowserTest.Png* -ContextMenuBrowserTest.RealMenu -ContextMenuBrowserTest.RequestPngForGifImage -ContextMenuBrowserTest.SuggestedFileName @@ -287,53 +238,40 @@ -ContinueWhereILeftOffTest.SessionCookies -CookieControlsBubbleViewTest.Invoke* -CookiePolicyBrowserTest.NestedFirstPartyIFrameStorageForFrame --CrExtensionsA11yTestWithMultipleExensions.With* --CrExtensionsManagerTestWithIdQueryParam.NavigationToDetails --CrExtensionsManagerTestWithMultipleExtensionTypesInstalled.ChangePages --CrExtensionsManagerTestWithMultipleExtensionTypesInstalled.ItemListVisibility --CrExtensionsManagerTestWithMultipleExtensionTypesInstalled.NavigateToSitePermissionsSuccess --CrExtensionsManagerTestWithMultipleExtensionTypesInstalled.PageTitleUpdate --CrExtensionsManagerTestWithMultipleExtensionTypesInstalled.SplitItems --CrExtensionsShortcutA11yTestWithExtensions.Shortcuts* --CrManagementA11yTestWithExtension.Extension* --CrSettingsAdvancedPageTest.Load --CrSettingsCookiesPageTest.All --CrSettingsPasswordsCheckTest.All --CrSettingsPasswordsSectionTest.All +-CorbAndCorsExtensionBrowserTest.Content* +-CorbAndCorsExtensionBrowserTest.ExtensionWithNoHttpPermissions +-CorbAndCorsExtensionBrowserTest.From* -CrSettingsPeoplePageTest.All -CrSettingsSecurityPageTest.All --CrSettingsSiteSettingsPageTest.All -CreateAppShortcutDialogTest.InvokeUi_default -CreativeOriginAdsPageLoadMetricsObserverBrowserTest.Creative* --DeclarativeApiTest.ExtensionLifetimeRulesHandling --DeclarativeApiTest.NoTracesAfterUninstalling +-DebuggerExtensionApiTest.AttachToPdf -DeepScanningFailureModalDialogTest.InvokeUi_default -DefaultIsolation/TaskManagerOOPIFBrowserTest.CrossSiteIframeBecomesSameSite/0 -DefaultIsolation/TaskManagerOOPIFBrowserTest.KillSubframe/0 -DefaultIsolation/TaskManagerOOPIFBrowserTest.LeavePageWithCrossSiteIframes/0 -DefaultIsolation/TaskManagerOOPIFBrowserTest.Navigate* -DefaultIsolation/TaskManagerOOPIFBrowserTest.SubframeHistoryNavigation/0 +-DeprecatedAppsDialogViewBrowserTest.VerifyTableModelForMultipleApps -DesktopCaptureApiTest.ChooseDesktopMedia -DesktopCaptureApiTest.Delegation -DesktopMediaPickerViewsBrowserTest.Invoke* -DestroyProfileOnBrowserClose/ProfileHelperTestWithDestroyProfile.Delete* -DestroyProfileOnBrowserClose/ProfileManagerBrowserTest.Delete* -DestroyProfileOnBrowserClose/ProfileManagerBrowserTest.Ephemeral* --DevToolsAllowedByCommandLineSwitch.SwitchOverridesPolicyOnChromeOS --DevToolsExtensionForceInstallTest.Policy* -DevToolsNetInfoTest.EmulateNetworkConditions -DevToolsProtocolTest.InputDispatchEventsToCorrectTarget -DiceBrowserTest.Signout* -DiceManageAccountBrowserTest.ClearManagedProfileOnStartup --DiceWebSigninInterceptionBubbleBrowserTest.InvokeUi_default -DiceWebSigninInterceptorBrowserTest.CloseSourceTab -DiceWebSigninInterceptorBrowserTest.Switch* -DiceWebSigninInterceptorEnterpriseBrowserTest.Enterprise* -DidChangeVisibleSecurityStateTest.DidChangeVisibleSecurityStateObserverGoBack +-DidChangeVisibleSecurityStateTestWithAutoupgradesDisabled.DidChangeVisibleSecurityStateObserver -DiskCachesizeExperiment.ScaledCacheSize -DownloadDangerPromptBrowserTest.Invoke* -DownloadDeepScanningBrowserTest.Dangerous* --DownloadDeepScanningBrowserTest.DlpAndMalwareViolations/0 +-DownloadDeepScanningBrowserTest.Dlp* -DownloadDeepScanningBrowserTest.Failed* -DownloadDeepScanningBrowserTest.Multiple* -DownloadDeepScanningBrowserTest.Partial* @@ -351,11 +289,12 @@ -DownloadTest.Close* -DownloadTest.CrossOriginRedirectDownloadFromAnchorDownload -DownloadTest.Crx* --DownloadTest.Dangerous* +-DownloadTest.DangerousFileWithSBDisabledBeforeCompletion -DownloadTest.Dont* -DownloadTest.Download* -DownloadTest.Feedback* -DownloadTest.FileExistenceCheckOpeningDownloadsPage +-DownloadTest.IncognitoDownload -DownloadTest.KnownSize -DownloadTest.MultipleDownloadsFromIframeSrcdoc -DownloadTest.NewWindow @@ -368,127 +307,70 @@ -DownloadTest.UnknownSize -DownloadTest.UserScriptDownload -DownloadTestSplitCacheEnabled.Save* --DownloadTestWithFakeSafeBrowsing.NoUncommonDownloadReportWithoutUserProceed +-DownloadTestWithFakeSafeBrowsing.No* -DownloadTestWithFakeSafeBrowsing.SendUncommonDownloadReportIfUserProceed -EditAddressProfileDialogControllerImplTest.InvokeUi_Edit --EmptyParametersTest.NoCrash --EncryptedMediaSupportedTypesClearKeyTest.Video* +-EncryptedMediaSupportedTypesClearKeyTest.Video_MP4 +-EncryptedMediaSupportedTypesClearKeyTest.Video_WebM -EncryptedMediaSupportedTypesExternalClearKeyTest.EncryptionScheme -EncryptedMediaSupportedTypesExternalClearKeyTest.Robustness -EncryptedMediaSupportedTypesExternalClearKeyTest.SessionType -EnterpriseStartupDialogViewBrowserTest.Invoke* -ErrorPageAutoReloadTest.AutoReload -ErrorPageAutoReloadTest.ManualReloadNotSuppressed --EventPage/ManagementApiNonPersistentApiTest.UninstallSelf/0 --EventsApiTest.ExtensionUpdateSendsOnInstalledEvent --EventsApiTest.UpdateDispatchesOnInstalledAfterEnablement --ExplicitlyAllowedNetworkPortsBackgroundFetchBrowserTest.UnblockedPortsDontThrow +-ExtensionApiTest.ChromeRuntimeGetPlatformInfo -ExtensionApiTest.FileURLs -ExtensionApiTest.Font* +-ExtensionApiTest.I18NUpdate -ExtensionApiTest.Shared* -ExtensionApiTest.Storage -ExtensionApiTest.WebSocket --ExtensionApiTestWithManagementPolicy.ContentScriptPolicyByExtensionId --ExtensionBackForwardCacheBlockedExtensionBrowserTest.ScriptDisallowed +-ExtensionBackForwardCacheBrowserTest.StorageCallbackEvicts -ExtensionBindingsApiTest.Web* -ExtensionBrowserTest.BackgroundPageIsNeverComposited --ExtensionBrowserTest.LoadChromeExtensionsWithOptionsParamWhenEmbedded --ExtensionBrowserTest.OptionsPage -ExtensionBrowserTest.RSSMultiRelLink -ExtensionBrowserTest.RSSParse* -ExtensionBrowserTest.SettingsOverridesDisallowed -ExtensionBrowserTest.WebContents --ExtensionCrxInstallerTest.AllowOffStore --ExtensionCrxInstallerTest.AllowedThemeFileTypes --ExtensionCrxInstallerTest.BlockedFileTypes --ExtensionCrxInstallerTest.Blocklist --ExtensionCrxInstallerTest.DoNotSync --ExtensionCrxInstallerTest.Experimental* --ExtensionCrxInstallerTest.HiDpiThemeTest --ExtensionCrxInstallerTest.Install* --ExtensionCrxInstallerTest.Non* --ExtensionCrxInstallerTest.PackAndInstallExtensionFromDownload --ExtensionCrxInstallerTest.Update* --ExtensionCrxInstallerTestWithExperimentalApis.DoNotGrantScopes_WithCallback --ExtensionCrxInstallerTestWithExperimentalApis.ExperimentalExtensionFromOutsideGalleryWithFlag --ExtensionCrxInstallerTestWithExperimentalApis.Grant* --ExtensionCrxInstallerTestWithExperimentalApis.PlatformAppCrx -ExtensionDialogTest.TextInputViaKeyEvent --ExtensionDisabledGlobalErrorTest.AcceptPermissions --ExtensionDisabledGlobalErrorTest.HigherPermissionsFromSync --ExtensionDisabledGlobalErrorTest.RemoteInstall --ExtensionDisabledGlobalErrorTest.Uninstall* --ExtensionDisabledGlobalErrorTest.UserDisabled -ExtensionFunctionalTest.DownloadExtensionResource -ExtensionFunctionalTest.TestSetExtensionsState -ExtensionInstallBlockedDialogViewTest.Invoke* -ExtensionInstallDialogRatingsSectionTest.RatingsSectionA11y -ExtensionInstallDialogViewInteractiveBrowserTest.Invoke* -ExtensionInstallFrictionDialogTest.InvokeUi_default --ExtensionInstallUIBrowserTest.Test* -ExtensionInstalledBubbleViewsBrowserTest.Invoke* --ExtensionLoadingTest.KeepAliveWithDevToolsOpenOnReload --ExtensionLoadingTest.Upgrade* --ExtensionManagementApiBrowserTest.CreateAppShortcutConfirmDialog --ExtensionManagementApiEscalationTest.DisabledReason --ExtensionManagementApiEscalationTest.SetEnabled --ExtensionManagementTest.Auto* --ExtensionManagementTest.External* --ExtensionManagementTest.Install* --ExtensionManagementTest.PolicyOverridesUserInstall --ExtensionOverrideTest.OverrideNewTabMultiple --ExtensionPinningTest.IgnoreUpdateUrlInManifest -ExtensionPinningTest.SelfHostedCWSExtensionNotUpdatedFromStore --ExtensionPinningTest.Update* --ExtensionPolicyTest.Corrupted* --ExtensionPolicyTest.CrxVersionInconsistencyFromManifest --ExtensionPolicyTest.Extension* --ExtensionPolicyTest.Update* --ExtensionPolicyTest2Contexts.ExtensionDefaultPolicyBlockedHost -ExtensionStartupTest.NoFileAccess +-ExtensionStartupTest.Test -ExtensionTagsTest.Basic -ExtensionUninstallDialogViewInteractiveBrowserTest.Invoke* -ExtensionWebRequestApiIdentifiabilityTest.WebSocket +-ExtensionWebRequestApiTest.HSTSUpgradeAfterRedirect -ExtensionWebRequestApiTest.Web* --ExtensionWebUITest.ReceivesExtensionOptionsOnClose -ExtensionWebstoreGetWebGLStatusTest.Allowed --ExtensionWebstorePrivateApiAllowlistEnforcementTest.EnhancedSafeBrowsingNotAllowlisted --ExtensionWebstorePrivateApiAllowlistEnforcementTest.StandardSafeBrowsingNotAllowlisted --ExtensionWebstorePrivateApiTest.AppInstallBubble --ExtensionWebstorePrivateApiTest.EmptyCrx --ExtensionWebstorePrivateApiTest.IconUrl --ExtensionWebstorePrivateApiTest.IncorrectManifest2 --ExtensionWebstorePrivateApiTest.Install* --ExtensionWebstorePrivateApiTest.MissingDownloadDir +-ExtensionWebstorePrivateApiTest.InstallLocalized -ExtensionWindowCreateTest.AcceptState --ExtensionsDisabledBrowserTest.TestStartupWithInstalledExtensions --ExtensionsInternalsTest.TestExtensionsInternalsAreServed -ExtensionsLoadMultipleTest.Test -ExtensionsLoadTest.Test --ExternalInstallErrorTest.TestShutdown -ExternalProtocolDialogBrowserTest.InvokeUi_default -ExternalProtocolDialogBrowserTest.TestFocus +-FeedbackTest.AnonymousUser +-FeedbackTest.ExtraDiagnostics +-FeedbackTest.Show* -FencedFrameSiteDetailsBrowserTest.MemoryDetailsForFencedFrame --FetchBehaviorTests/ContentVerifierHashTest.Default* --FetchBehaviorTests/ContentVerifierHashTest.Fetch* --FetchBehaviorTests/ContentVerifierHashTest.Tamper* --FetchFLCodeDiscountWorkerBrowserTest.SimplePercentDiscountWithCodeTest --FetchFLCodeDiscountWorkerBrowserTest.TwoCartsOneWithDiscountOneWithoutDiscount --FetchFLCodelessDiscountWorkerBrowserTest.CartDiscountBecomeUnavailable --FetchFLCodelessDiscountWorkerBrowserTest.NoDiscountForThisMerchantTest --FetchFLCodelessDiscountWorkerBrowserTest.Simple* --FetchFLCodelessDiscountWorkerBrowserTest.TwoCartsOneWithDiscountOneWithoutDiscount -FileIFrameAPITest.FileAccessAllURLs --FileSystemAccessBrowserTest.FullscreenOpenFile -FileSystemAccessPermissionViewTest.Invoke* -FileSystemAccessRestrictedDirectoryDialogViewTest.InvokeUi_default -FileSystemAccessUsageBubbleViewTest.Invoke* +-FindInPageControllerTest.ActivateLinkNavigatesPage -FindInPageControllerTest.AudibleAlertsWithPrepopulatedFind -FindInPageControllerTest.BigString -FindInPageControllerTest.Find* -FindInPageControllerTest.GlobalPasteboardIncognito -FindInPageControllerTest.IncognitoFindNextSecret -FindInPageControllerTest.LargePage +-FindInPageControllerTest.NavigateClearsOrdinal -FindInPageControllerTest.No* -FindInPageControllerTest.PreferPreviousSearch -FindInPageControllerTest.Prepopulate* @@ -497,16 +379,8 @@ -FindInPageControllerTest.StaleCountAfterNoResults -FindInPageControllerTest.StartSearchAfterSelection -FirstPartySetsWebSocketBrowserTest.SendsSamePartyCookies --FlocInternalsBrowserTest.EmptyResponse --FlocInternalsBrowserTest.Response* -FolderUploadConfirmationViewTest.InitiallyFocusesCancel -FolderUploadConfirmationViewTest.InvokeUi_default --FullscreenControllerTest.FastKeyboardLockUnlockRelock --FullscreenControllerTest.FullscreenOnFileURL --FullscreenControllerTest.Keyboard* --FullscreenControllerTest.Repeated* --FullscreenControllerTest.SlowKeyboardLockUnlockRelock --FuzzySearchTest.All -GetAuthTokenFunctionTest.Interactive* -GetAuthTokenFunctionTest.LoginInvalidatesTokenCache -GetAuthTokenFunctionTest.Non* @@ -524,6 +398,7 @@ -HatsServiceProbabilityOne.VisibleWebContentsShow -HelpBubbleFactoryViewsBrowsertest.InvokeUi_default -HistoryBrowserTest.DownloadNoHistory +-HistoryClustersHandlerBrowserTest.OpenVisitUrlsInTabGroupHardCap -HistoryManipulationInterventionBrowserTest.PDFDoNotSkipOnBackForwardDueToUserGesture -HistoryManipulationInterventionBrowserTest.PDFSkipOnBackForwardNoUserGesture -HttpProxyScriptBrowserTest.Verify @@ -531,21 +406,19 @@ -HttpsOnlyModeBrowserTest.HttpsUpgradeWithBrokenSSL_ShouldTriggerSSLInterstitial -HttpsOnlyModeBrowserTest.UrlWithHttpsScheme_BrokenSSL_ShouldNotFallback -I18nProcessTest.All +-IconLoaderBrowserTest.LoadGroup -IconModuleTest.All -IdentityInternalsMultipleTokensWebUITest.getAllTokens -IdentityInternalsSingleTokenWebUITest.getAllTokens -IdentityInternalsSingleTokenWebUITest.verifyGetters --IframeCspTest.Show --IgnorePaymentMethodTest.JITInstallablePHCannotMakePayments -ImageAnnotationBrowserTest.ImageUrl --ImageDecoderBrowserTest.Basic* --ImageFetcherImplBrowserTest.NormalFetch -ImportLockDialogViewBrowserTest.InvokeUi_default -InMemoryApp/NetworkContextConfigurationDataPacBrowserTest.Data* -InMemoryApp/NetworkContextConfigurationFilePacBrowserTest.File* -InMemoryApp/NetworkContextConfigurationHttpPacBrowserTest.HttpPac/1 -InMemoryApp/NetworkContextConfigurationManagedProxySettingsBrowserTest.Max* -InMemoryApp/NetworkContextConfigurationProxySettingsBrowserTest.Max* +-InProcess/ChromeNetworkServiceBrowserTest.EncryptedCookies/0 -InProcessBrowserTest.ExternalConnectionFail -InProcessBrowserTest.RunsScheduledLayoutOnAnchoredBubbles -InProgressDownloadTest.ResumeInProgressDownloadBeforeLoadingHistory @@ -557,10 +430,9 @@ -IncognitoProfileMainNetworkContext/NetworkContextConfigurationDataPacBrowserTest.Data* -IncognitoProfileMainNetworkContext/NetworkContextConfigurationFilePacBrowserTest.FilePac/1 -IncognitoProfileMainNetworkContext/NetworkContextConfigurationHttpPacBrowserTest.Http* +-IncognitoProfileMainNetworkContext/NetworkContextConfigurationManagedProxySettingsBrowserTest.MaxConnectionsPerProxy/1 -IncognitoProfileMainNetworkContext/NetworkContextConfigurationProxySettingsBrowserTest.Max* --InfiniteListTest.All -InfoBarUiTest.InvokeUi_multiple_infobars --InfoBarsTest.TestInfoBarsCloseOnNewTheme -InlineLoginHelperBrowserTest.InvokeUi_default -InlineLoginHelperBrowserTest.Signin* -InlineLoginHelperBrowserTest.UntrustedSigninDialogCancel @@ -578,17 +450,12 @@ -InterstitialUITest.SSLInterstitial -InterstitialUITest.UnwantedSoftwareInterstitialQuiet -InterstitialUITest.UseCorrectWebContents --JourneyLoggerTest.GooglePaymentApp --JourneyLoggerTest.UKMCheckoutEventsNotRecordedForAppOriginWhenNoWindowShown --JourneyLoggerTest.UKMTransactionAmountRecorded -LargeStickyAdViolationBrowserTest.LargeStickyAd_AdInterventionTriggered -LargeStickyAdViolationBrowserTest.NoLargeStickyAd_AdInterventionNotTriggered -LargeStickyAdViolationBrowserTestWithoutEnforcement.LargeStickyAd_NoAdInterventionTriggered -LoadImageBrowserTest.Load* --LoadingPredictorBrowserTestWithOptimizationGuide.NavigationWithBothLocalPredictionAndOptimizationHint/3 -LoadingPredictorBrowserTestWithProxy.Prepare* -LoadingPredictorPrefetchBrowserTest.PrepareForPageLoadWithPredictionForPrefetchHasLocalHint/4 --LoadingPredictorPrefetchCounterfactualBrowserTest.PrepareForPageLoadWithPredictionForPrefetchHasLocalHint/0 -LocalCardMigrationBrowserTest.AcceptingDialogAddsLocalCardMigrationStrikes -LocalCardMigrationBrowserTest.CardIdentifierString -LocalCardMigrationBrowserTest.Clicking* @@ -605,18 +472,13 @@ -LocalCardMigrationBrowserTestForStatusChip.ClickingOmniboxIconReshowsBubble -LocalCardMigrationBrowserTestForStatusChip.CreditCardIconShownInStatusChip -LocalCardMigrationBrowserTestForStatusChip.IconAndBubbleVisibilityAfterTabSwitching --ManagedConfigurationAPITest.AppRemovedFromPolicyList --ManagedConfigurationAPITest.Data* --ManagedConfigurationAPITest.Policy* --ManagedConfigurationAPITest.UnknownKeys -ManifestUpdateManagerAppIdentityBrowserTest.TestUpgradeDuringShutdownForAppIdentity -ManifestUpdateManagerBrowserTest.Check* -ManifestUpdateManagerCaptureLinksBrowserTest.CheckFindsCaptureLinksChange -ManifestUpdateManagerHandleLinksBrowserTest.CheckFindsHandleLinksChange -ManifestUpdateManagerIconUpdatingBrowserTest.CheckFindsIconUrlChange -ManifestUpdateManagerLaunchHandlerBrowserTest.CheckFindsLaunchHandlerChange --ManifestVerifierBrowserTest.OneSupportedOrigin --ManifestVerifierBrowserTest.ThreeTypesOfMethods +-MediaEngagementBrowserTest.ClearBrowsingHistoryBeforePlayback -MediaEngagementBrowserTest.Do* -MediaEngagementBrowserTest.IFrame* -MediaEngagementBrowserTest.MultipleElements @@ -624,35 +486,10 @@ -MediaEngagementBrowserTest.Session* -MediaEngagementPreloadBrowserTest.EnsureSingletonListIsLoaded -MediaEngagementSessionRestoreBrowserTest.RestoredSession_Playback_MEI --MediaFileValidatorTest.ValidImage -MediaGalleriesInteractiveDialogTest.InvokeUi_DisplayDialog -MediaHistoryForPrerenderBrowserTest.KeepRecordingMediaSession --MediaHistoryOriginsWebUIBrowserTest.All --MediaHistoryPlaybacksWebUIBrowserTest.All --MediaHistoryStatsWebUIBrowserTest.All --MediaSessionPictureInPictureWindowControllerBrowserTest.Next* --MediaSessionPictureInPictureWindowControllerBrowserTest.Play* --MediaSessionPictureInPictureWindowControllerBrowserTest.PreviousTrackHandlerCalled --MediaSessionPictureInPictureWindowControllerBrowserTest.Skip* --MediaSessionPictureInPictureWindowControllerBrowserTest.StopMediaSessionClosesPictureInPictureWindow -MetadataCheckAndDeepScanningBrowserTest.Test* --MimeHandlerViewTest.ActivatePostMessageSupportOnce --MimeHandlerViewTest.BackgroundPage --MimeHandlerViewTest.Basic --MimeHandlerViewTest.Before* --MimeHandlerViewTest.DataUrl --MimeHandlerViewTest.DoNotLoadInSandboxedFrame --MimeHandlerViewTest.Embed* --MimeHandlerViewTest.Embedded* --MimeHandlerViewTest.EmbedderFrameRemovedNoCrash --MimeHandlerViewTest.Iframe --MimeHandlerViewTest.NonAsciiHeaders --MimeHandlerViewTest.PostMessage --MimeHandlerViewTest.RejectPointLock --MimeHandlerViewTest.SingleRequest --MimeHandlerViewTest.TargetBlankAnchor -MyIpAddressProxyScriptBrowserTest.Verify --NavigationConsumingTest.NavigationConsumesUserGesture_Fullscreen -NavigationPredictorBrowserTest.ClickAnchorElement -NavigationPredictorBrowserTest.MultipleNavigations -NavigationPredictorBrowserTest.Page* @@ -660,41 +497,13 @@ -NavigationPredictorBrowserTest.Single* -NavigationPredictorBrowserTest.TwoObservers -NavigationPredictorBrowserTest.ViewportOnlyAndUrlIncrementByOne +-NavigationPredictorFencedFrameBrowserTest.EnsureFencedFrameDoesNotCreateNavigationPredictor -NavigationPredictorPrerenderBrowserTest.PrerenderingDontCreatePredictor -NetworkQualityEstimatorPrefsBrowserTest.ReadPrefsAtStartupCustomPrefFile -NetworkingPrivateServiceClientApiTest.On* -NetworkingPrivateServiceClientApiTest.RequestNetworkScan --NewTabPageAppTest.Clicks --NewTabPageAppTest.CounterfactualModules --NewTabPageAppTest.CustomizeUrl --NewTabPageAppTest.Misc --NewTabPageAppTest.Modules --NewTabPageAppTest.Promo --NewTabPageAppTest.Theming --NewTabPageBackgroundManagerTest.All --NewTabPageCustomizeBackgroundsTest.All --NewTabPageCustomizeDialogTest.All --NewTabPageCustomizeModulesTest.All --NewTabPageCustomizeShortcutsTest.All --NewTabPageDoodleShareDialogTest.All -NewTabPageLogoTest.All --NewTabPageMetricsUtilsTest.All --NewTabPageMiddleSlotPromoTest.All --NewTabPageModulesChromeCartV2ModuleTest.All --NewTabPageModulesDriveModuleTest.All --NewTabPageModulesDriveV2ModuleTest.All --NewTabPageModulesDummyModuleTest.All --NewTabPageModulesInfoDialogTest.All --NewTabPageModulesModuleDescriptorTest.All --NewTabPageModulesModuleHeaderTest.All --NewTabPageModulesModuleRegistryTest.All -NewTabPageModulesModuleWrapperTest.All --NewTabPageModulesModulesTest.All --NewTabPageModulesPhotosModuleTest.All --NewTabPageModulesRecipesV2ModuleTest.All --NewTabPageRealboxTest.All --NewTabPageTest.LandingPagePixelTest --NewTabPageVoiceSearchOverlayTest.All -NoSessionRestoreTest.CookiesClearedOnExit -NoSessionRestoreTest.LocalStorageClearedOnStartup -NoSessionRestoreTestWithStartupDeletionDisabled.CookiesClearedOnStartup @@ -709,17 +518,18 @@ -OnDiskApp/NetworkContextConfigurationBrowserTest.Cookies* -OnDiskApp/NetworkContextConfigurationBrowserTest.DiskCache/0 -OnDiskApp/NetworkContextConfigurationDataPacBrowserTest.Data* --OnDiskApp/NetworkContextConfigurationFilePacBrowserTest.FilePac/0 +-OnDiskApp/NetworkContextConfigurationFilePacBrowserTest.File* -OnDiskApp/NetworkContextConfigurationHttpPacBrowserTest.HttpPac/0 -OnDiskApp/NetworkContextConfigurationManagedProxySettingsBrowserTest.Max* -OnDiskApp/NetworkContextConfigurationProxySettingsBrowserTest.Max* --OnDiskApp/NetworkContextConfigurationReportingAndNelBrowserTest.PersistReportingAndNel/0 --OnDiskAppWithIncognitoProfile/NetworkContextConfigurationDataPacBrowserTest.DataPac/0 +-OnDiskApp/NetworkContextConfigurationReportingAndNelBrowserTest.Persist* +-OnDiskAppWithIncognitoProfile/NetworkContextConfigurationDataPacBrowserTest.Data* -OnDiskAppWithIncognitoProfile/NetworkContextConfigurationFilePacBrowserTest.File* -OnDiskAppWithIncognitoProfile/NetworkContextConfigurationHttpPacBrowserTest.Http* -OnDiskAppWithIncognitoProfile/NetworkContextConfigurationManagedProxySettingsBrowserTest.Max* -OnDiskAppWithIncognitoProfile/NetworkContextConfigurationProxySettingsBrowserTest.Max* -OutOfMemoryReporterPrerenderBrowserTest.NotReportedOnPrerenderPage +-OutOfProcess/ChromeNetworkServiceBrowserTest.EncryptedCookies/0 -OutdatedUpgradeBubbleTest.Invoke* -OverlayPopupAdViolationBrowserTest.NoOverlayPopupAd_AdInterventionNotTriggered -OverlayPopupAdViolationBrowserTest.OverlayPopupAd_AdInterventionTriggered @@ -729,23 +539,23 @@ -OverrideSitePrefsForAutoHrefTranslateBrowserTest.HrefTranslateOverrideForAutoTranslate -OverrideSitePrefsForUiOnlyHrefTranslateBrowserTest.HrefTranslateOverrideForTranslateUi -PKPModelClientTest.PKPEnforced +-PageContentAnnotationsServicePageTopicsBrowserTest.E2EWithGoldenTestData -PageInfoBubbleViewAboutThisSiteDialogBrowserTest.Invoke* -PageInfoBubbleViewDialogBrowserTest.Invoke* -PageInfoBubbleViewHistoryDialogBrowserTest.InvokeUi_History +-PageInfoBubbleViewPrivacySandboxDialogBrowserTest.Invoke* -PageLoadMetricsBrowserTest.CachedPage -PageLoadMetricsBrowserTest.IgnoreDownloads -PageLoadMetricsBrowserTest.Input* -PageLoadMetricsBrowserTest.Main* -PageLoadMetricsBrowserTest.PayloadSizeIgnoresDownloads -PageLoadMetricsBrowserTestWithAnimatedLCPFlag.Page* --PageLoadMetricsBrowserTestWithAutoupgradesDisabled.Use* --PageLoadMetricsBrowserTestWithBackForwardCache.UseCounterUkmFeaturesLoggedOnBFCacheEviction -PageLoadMetricsBrowserTestWithRuntimeAnimatedLCPFlag.PageLCPAnimatedImageOnlyRuntimeFlag -PageTextObserverBrowserTest.OOPIFAMPSubframe --PageTextObserverSingleProcessBrowserTest.Same* -PasswordBubbleBrowserTest.Invoke* -PasswordDialogViewTest.Invoke* -PasswordGenerationPopupViewTest.CloseWebContentsWithVisiblePopup +-PasswordGenerationPopupViewTest.MouseMovementInEditingPopup -PasswordManagerBrowserTest.DeleteCredentialsUpdateDropdown -PasswordManagerBrowserTest.InFrameNavigationDoesNotClearPopupState -PasswordManagerBrowserTest.PasswordValueAccessibleOnSubmit @@ -753,25 +563,14 @@ -PasswordManagerDialogBrowserTest.InvokeUi_normal -PasswordReuseModalWarningTest.InvokeUi_default -PasswordsPrivateApiTest.Get* --PaymentHandlerIconRefetchTest.RefetchMissingIcon --PaymentHandlerInstallFailedTest.Test --PaymentHandlerJitInstallWithRegisteredSwTest.CanJitInstallPaymentHandlerWhenServiceWorkerIsAlreadyInstalled --PaymentHandlerJustInTimeInstallationTest.Install* --PaymentHandlerSkipSheetTest.NoSkipWithoutUserGesture --PaymentHandlerSkipSheetTest.SkipWithUserGesture --PaymentManifestParserTest.UrlsAndOrigins --PaymentManifestParserTest.WebAppManifest --PaymentMethodViewControllerTest.DoNotShowAddCardWhenBasicCardIsNotSupported --PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest.Called* --PaymentRequestCanMakePaymentQueryBasicCardDisabledTest.CanMakePayment_NotSupported -PaymentRequestCvcUnmaskViewControllerVisualTest.InvokeUi_default +-PaymentRequestModifiersBasicCardDisabledTest.No* -PaymentRequestModifiersTest.Modifier* -PaymentRequestModifiersTest.No* -PaymentRequestNoUpdateWithBasicCardDisabledTest.BuyWithoutPromises -PaymentRequestNoUpdateWithTest.BuyWithoutPromises -PaymentRequestOrderSummaryViewControllerBasicCardDisabledTest.OrderSummaryReflectsShippingOption -PaymentRequestOrderSummaryViewControllerTest.OrderSummaryReflectsShippingOption --PaymentRequestPaymentAppTest.ReadSupportedDelegationsFromAppManifest -PaymentRequestShippingOptionViewControllerBasicCardDisabledTest.SelectingVariousShippingOptions -PaymentRequestShippingOptionViewControllerTest.SelectingVariousShippingOptions -PaymentRequestShowPromiseTest.CannotShipError @@ -784,43 +583,15 @@ -PermissionsApiTest.FileLoad -PersistentBackground/ExtensionApiCaptureTest.Capture* -PersistentBackground/ExtensionI18nTest.Basic/0 --PersistentBackground/ExtensionManagementApiTest.Basics/0 --PersistentBackground/ExtensionManagementApiTest.NoPermission/0 --PersistentBackground/ExtensionPageCaptureApiTest.SaveAsMHTMLWithFileAccess/0 --PersistentBackground/InstallReplacementWebAppApiTest.Installable* --PersistentBackground/InstallReplacementWebAppApiTest.NoGesture/0 --PersistentBackground/InstallReplacementWebAppApiTest.NotInstallableWebApp/0 +-PersistentBackground/ExtensionPageCaptureApiTest.Save* -PersistentBackground/PageActionBrowserTest.PageAction/0 -PersistentBackground/PageActionBrowserTest.UnloadPageAction/0 -PersistentBackground/RuntimeApiTest.GetPlatformInfo/0 --PersistentBackground/WebNavigationApiTestWithContextType.Download/0 -PersistentBackground/WebNavigationApiTestWithContextType.RequestOpenTab/0 -PersistentBackground/WebNavigationApiTestWithContextType.Target* --PictureInPictureLazyBackgroundPageApiTest.PictureInPictureInBackgroundPage -PictureInPicturePixelComparisonBrowserTest.PlayAndPauseControls -PictureInPicturePixelComparisonBrowserTest.VideoPlay --PictureInPictureWindowControllerBrowserTest.Close* --PictureInPictureWindowControllerBrowserTest.CreationAndVisibilityAndActivation --PictureInPictureWindowControllerBrowserTest.CrossOriginFrameEnterLeaveCloseWindow --PictureInPictureWindowControllerBrowserTest.Enter* --PictureInPictureWindowControllerBrowserTest.ExitFireEventAndCallbackWhenNoSource --PictureInPictureWindowControllerBrowserTest.FrameEnterLeaveClosesWindow --PictureInPictureWindowControllerBrowserTest.MultipleBrowserWindowOnePIPWindow --PictureInPictureWindowControllerBrowserTest.Open* --PictureInPictureWindowControllerBrowserTest.PageVisibilityEventsFiredWhenPictureInPicture --PictureInPictureWindowControllerBrowserTest.Picture* --PictureInPictureWindowControllerBrowserTest.Play* --PictureInPictureWindowControllerBrowserTest.PreloadNoneSrcChangeThenLoad --PictureInPictureWindowControllerBrowserTest.RequestPictureInPictureTwiceFromSameVideo --PictureInPictureWindowControllerBrowserTest.ResetVideoSrcKeepsPictureInPictureWindowOpened --PictureInPictureWindowControllerBrowserTest.ResizeEventFired --PictureInPictureWindowControllerBrowserTest.SpaceKeyTogglePlayPause --PictureInPictureWindowControllerBrowserTest.TabIconUpdated --PictureInPictureWindowControllerBrowserTest.UpdateVideoSrcKeepsPictureInPictureWindowOpened --PictureInPictureWindowControllerBrowserTest.VideoWithNoAudioPausedWhenHiddenResumesPlayback --PictureInPictureWindowControllerFencedFrameBrowserTest.FencedFrameShouldNotCloseWindow --PictureInPictureWindowControllerPrerenderBrowserTest.EnterPipThenNavigateAwayCloseWindow --PolicyAppParameterizedTest/ManifestUpdateManagerBrowserTest_PolicyAppsCanUpdate.CheckDoesApplyIconURLChangeForPolicyAppsWithFlag/0 +-PolicyAppParameterizedTest/ManifestUpdateManagerBrowserTest_PolicyAppsCanUpdate.Check* -PolicyPrefsTestCoverageTest.AllPoliciesHaveATestCase -PolicyTest.DefaultCookiesSetting -PolicyTest.DownloadDirectory @@ -830,35 +601,26 @@ -PolicyUpdateServiceTest.FailedUpdateRetries -PolicyUpdateServiceTest.PolicyCorruptedOnStartup -PortalBrowserTest.Task* --PrefHashBrowserTestChangedSplitPref.ChangedSplitPref --PrefHashBrowserTestUnchangedCustom.UnchangedCustom -PrefetchBrowserTest.Prefetch* -PrefsFunctionalTest.TestDownloadDirPref --PreinstalledAppsMigrationBrowserTest.Test* --PreinstalledAppsMigrationEnabledThenRolledBackBrowserTest.TestAppInstalled --PreinstalledWebAppManagerExtensionBrowserTest.UninstallAndReplace --PreinstalledWebAppMigratePlatformAppBrowserTest.MigratePlatformAppPreferences --PreinstalledWebAppMigrationBrowserTest.AppToReplaceStillInstalled --PreinstalledWebAppMigrationBrowserTest.Migrate* --PreinstalledWebAppMigrationBrowserTest.UserUninstalledExtensionApp -PrerenderSiteDetailsBrowserTest.MemoryDetailsForPrerender --PresentationReceiverWindowControllerBrowserTest.CreatesWindow --PresentationReceiverWindowControllerBrowserTest.WindowClosingTerminatesPresentation -PresentationReceiverWindowViewBrowserTest.LocationBarViewShown -PresentationReceiverWindowViewBrowserTest.ShowPageInfoDialog -PreservedWindowPlacement.Test -PrivacyBudgetFieldtrialConfigTest.LoadsSettingsFromFieldTrialConfig --PrivacySandboxTest.All +-PrivacySandboxDialogHelperTestWithParamInstance/PrivacySandboxDialogHelperTestWithParam.Unsuitable* -PrivateNetworkAccessAutoReloadBrowserTest.AutoReloadWorks +-PrivateNetworkAccessWithFeatureEnabledBrowserTest.CachedResourcesAllowed +-PrivateNetworkAccessWithFeatureEnabledBrowserTest.RecordsAddressSpaceFeatureForBlockedRequests -ProcessManagerBrowserTest.BlobURLDownloadsToExtensionAllowed -ProcessMemoryMetricsEmitterTest.Fetch* -ProcessMemoryMetricsEmitterTest.ForegroundAndBackgroundPages -ProfileCustomizationBubbleBrowserTest.IPH -ProfileCustomizationBubbleBrowserTest.InvokeUi_default -ProfileHelperTest.OpenNewWindowForProfile --ProfileMainNetworkContext/NetworkContextConfigurationBrowserTest.Cache* +-ProfileMainNetworkContext/NetworkContextConfigurationBrowserTest.Cache/0 -ProfileMainNetworkContext/NetworkContextConfigurationBrowserTest.Cookies* --ProfileMainNetworkContext/NetworkContextConfigurationBrowserTest.Disk* +-ProfileMainNetworkContext/NetworkContextConfigurationBrowserTest.DiskCache/0 -ProfileMainNetworkContext/NetworkContextConfigurationDataPacBrowserTest.Data* -ProfileMainNetworkContext/NetworkContextConfigurationFilePacBrowserTest.File* -ProfileMainNetworkContext/NetworkContextConfigurationHttpPacBrowserTest.Http* @@ -866,11 +628,10 @@ -ProfileMainNetworkContext/NetworkContextConfigurationProxySettingsBrowserTest.Max* -ProfileMainNetworkContext/NetworkContextConfigurationReportingAndNelBrowserTest.Persist* -ProfileMenuClickTest_MultipleProfiles.Profile* --ProfileMenuClickTest_SyncError.Profile* -ProfileMenuClickTest_WithUnconsentedPrimaryAccount.Profile* -ProfileMenuViewExtensionsTest.CloseIPH --ProfileMenuViewExtensionsTest.ThemeChanged -ProfileNetworkContextServiceBrowsertest.DefaultCacheSize +-ProfileNetworkContextServiceDiskCacheBrowsertest.DiskCacheLocation -ProfileWindowBrowserTest.OpenBrowserWindowForProfileWithSigninRequired -PromptForScanningModalDialogTest.InvokeUi_default -ProxyBrowserTest.BasicAuthWSConnect @@ -879,6 +640,7 @@ -QRCodeGeneratorBubbleBrowserTest.Invoke* -ReadLaterButtonBrowserTest.InvokeUi_default -ReaderModeIconViewBrowserTest.NonSecurePagesNotDistillable +-RecurrentInterstitialBrowserTest.RecurrentInterstitial -RedirectTest.ClientCancelled -ReferrerPolicyCapReferrerToOriginOnCrossOriginTest.Honors* -ReferrerPolicyCapReferrerToOriginOnCrossOriginTest.RespectsNoReferrerPref @@ -899,14 +661,15 @@ -RestartTest.CookiesClearedOnExit -RestartTest.SessionCookies -RestoreOnStartupPolicyTestInstance/RestoreOnStartupPolicyTest.Run* --RuntimeAPIUpdateTest.TerminatedExtensionUpdateHasCorrectPreviousVersion +-RssLinksFetcherTest.Fetch* +-SCTReportingServiceBrowserTest.CTNonCompliantInvalidSCTsNotReported -SCTReportingServiceBrowserTest.NoValidSCTsNoReport -SSLBlockingPageIDNTest.SSLBlockingPageDecodesIDN -SSLFencedFrameBrowserTest.InAppTestProceededBadCertPageInFencedFrame -SSLNetworkTimeBrowserTest.CloseTabBeforeNetworkFetchCompletes -SSLNetworkTimeBrowserTest.On* -SSLNetworkTimeBrowserTest.TimeoutExpiresBeforeFetchCompletes --SSLPKPBrowserTest.SendPKPReport +-SSLPKPBrowserTest.Send* -SSLUIAutoReloadTest.AutoReloadDisabled -SSLUICaptivePortalListDisabledTest.Disabled -SSLUICaptivePortalListResourceBundleTest.Enabled* @@ -915,6 +678,7 @@ -SSLUIMITMSoftwareEnabledTest.Certificate* -SSLUIMITMSoftwareEnabledTest.EnabledWithFinch -SSLUIMITMSoftwareEnabledTest.EnterpriseManaged +-SSLUIMITMSoftwareEnabledTest.IgnoreDynamicUpdateWithSmallVersionId -SSLUIMITMSoftwareEnabledTest.NonMatchingCertificate_NoMITMSoftwareInterstitial -SSLUIMITMSoftwareEnabledTest.NotEnterpriseManaged -SSLUIMITMSoftwareEnabledTest.OverridableError_NoMITMSoftwareInterstitial @@ -925,7 +689,7 @@ -SSLUITest.ErrorPage -SSLUITest.InAppTestHTTPSExpiredCertAndPreviouslyProceeded -SSLUITest.InterstitialNotAffectedByHideShow --SSLUITest.MixedContentHistogramNotLoggedForSiteWithBadCertificate +-SSLUITest.Mixed* -SSLUITest.NetworkErrorDoesntRevokeExemptions -SSLUITest.ProceedLinkOverridable -SSLUITest.SHA1IsDefaultDisabled @@ -939,18 +703,16 @@ -SSLUITestWithEnhancedProtectionMessage.Verify* -SSLUITestWithExtendedReporting.Test* -SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.Security* --SafeBrowsingBlockingPageWithDelayedWarningsBrowserTest/SafeBrowsingBlockingPageDelayedWarningBrowserTest.Fullscreen* --SafeBrowsingBlockingPageWithDelayedWarningsBrowserTest/SafeBrowsingBlockingPageDelayedWarningBrowserTest.Key* -SafeBrowsingNetworkContext/NetworkContextConfigurationBrowserTest.CookiesEnabled/1 --SafeBrowsingNetworkContext/NetworkContextConfigurationDataPacBrowserTest.DataPac/0 --SafeBrowsingNetworkContext/NetworkContextConfigurationFilePacBrowserTest.FilePac/0 +-SafeBrowsingNetworkContext/NetworkContextConfigurationDataPacBrowserTest.Data* +-SafeBrowsingNetworkContext/NetworkContextConfigurationFilePacBrowserTest.File* -SafeBrowsingNetworkContext/NetworkContextConfigurationHttpPacBrowserTest.Http* -SafeBrowsingNetworkContext/NetworkContextConfigurationManagedProxySettingsBrowserTest.Max* -SafeBrowsingNetworkContext/NetworkContextConfigurationProxySettingsBrowserTest.Max* -SafeBrowsingPolicyTest.SSLError* -SafeBrowsingPolicyTest.SafeBrowsingStatePolicyManaged --SafeXmlParserTest.Parse -SafetyTipPageInfoBubbleViewDialogTest.Invoke* +-SaveAsCompleteHtml/SavePageOriginalVsSavedComparisonTest.AboutBlank/0 -SaveAsCompleteHtml/SavePageOriginalVsSavedComparisonTest.BrokenImage/0 -SaveAsCompleteHtml/SavePageOriginalVsSavedComparisonTest.Cross* -SaveAsCompleteHtml/SavePageOriginalVsSavedComparisonTest.Encoding/0 @@ -971,12 +733,12 @@ -SaveCardBubbleViewsFullFormBrowserTestForStatusChip.ActivateFirstInactiveBubbleForAccessibility -SaveCardBubbleViewsFullFormBrowserTestForStatusChip.ClickingOnCreditCardIconInStatusChipReshowsBubble -SaveCardBubbleViewsFullFormBrowserTestForStatusChip.CreditCardIconShownInStatusChip --SaveCardBubbleViewsFullFormBrowserTestForStatusChip.Feedback_Success +-SaveCardBubbleViewsFullFormBrowserTestForStatusChip.Feedback* -SaveCardBubbleViewsFullFormBrowserTestForStatusChip.IconAndBubbleVisibilityAfterTabSwitching -SaveCardBubbleViewsFullFormBrowserTestSettings.Local_ManageCardsButtonRedirects -SaveCardBubbleViewsFullFormBrowserTestWithAutofillUpstream.Local* -SaveCardBubbleViewsFullFormBrowserTestWithAutofillUpstream.Logic* --SaveCardBubbleViewsFullFormBrowserTestWithAutofillUpstream.StrikeDatabase_Upload_AddStrikeIfBubbleDeclined +-SaveCardBubbleViewsFullFormBrowserTestWithAutofillUpstream.Strike* -SaveCardBubbleViewsFullFormBrowserTestWithAutofillUpstream.Upload* -SaveCardBubbleViewsSyncTransportFullFormBrowserTest.Local_TransportMode_InfoTextIconDoesNotExist -SaveCardBubbleViewsSyncTransportFullFormBrowserTest.Upload* @@ -991,10 +753,11 @@ -SavePageBrowserTest.Save* -SavePageBrowserTest.SecurityLevelHistogram -SavePageSitePerProcessBrowserTest.CompleteHtmlWhenRendererIsDead --SavePageSitePerProcessBrowserTest.SaveAsMHTML +-SavePageSitePerProcessBrowserTest.Save* -SaveUPIBubbleControllerImplTest.InvokeUi -SaveUpdateAddressProfileBubbleControllerImplTest.CloseTabWhileBubbleIsOpen -SaveUpdateAddressProfileBubbleControllerImplTest.Invoke* +-ScriptingAPITest.NestedWebContents -SearchByImageBrowserTest.ImageSearchWithValidImage -SearchByImageBrowserTest.LensImageSearchWithValidImage -SecurePaymentConfirmationDialogViewTest.InvokeUi_default @@ -1004,47 +767,31 @@ -SecurityStateTabHelperTest.UMALogs* -SecurityStateTabHelperTestWithAutoupgradesDisabled.BrokenHTTPS -SendTabToSelfBubbleTest.InvokeUi_default --ServiceWorker/ExtensionApiCaptureTest.CaptureVisibleTabJpeg/0 --ServiceWorker/ExtensionManagementApiTest.Basics/0 --ServiceWorker/ExtensionManagementApiTest.NoPermission/0 +-ServiceWorker/ExtensionApiCaptureTest.Capture* -ServiceWorker/ExtensionPageCaptureApiTest.Save* --ServiceWorker/InstallReplacementWebAppApiTest.Installable* --ServiceWorker/InstallReplacementWebAppApiTest.NoGesture/0 --ServiceWorker/InstallReplacementWebAppApiTest.NotInstallableWebApp/0 -ServiceWorker/PageActionBrowserTest.PageAction/0 -ServiceWorker/PageActionBrowserTest.UnloadPageAction/0 -ServiceWorker/RuntimeApiTest.GetPlatformInfo/0 --ServiceWorker/WebNavigationApiTestWithContextType.Download/0 -ServiceWorker/WebNavigationApiTestWithContextType.RequestOpenTab/0 -ServiceWorker/WebNavigationApiTestWithContextType.Target* --ServiceWorkerBasedBackgroundTest.EventsAfterRestart --ServiceWorkerBasedBackgroundTest.FilteredEventsAfterRestart --ServiceWorkerBasedBackgroundTest.UpdatePackedExtension -ServiceWorkerBasedBackgroundTest.WindowsBasic --ServiceWorkerPaymentAppFinderBrowserTest.Cross* --ServiceWorkerPaymentAppFinderBrowserTest.InstallablePaymentApp --ServiceWorkerPaymentAppFinderBrowserTest.SupportedOrigin --ServiceWorkerPaymentAppFinderBrowserTest.ThreeRedirectsIsValid --ServiceWorkerPaymentAppFinderBrowserTest.Two* -ServiceWorkerTest.MimeHandlerView --ServiceWorkerTest.Update* -SessionCrashedBubbleViewTest.Invoke* -SessionRestoreTest.NormalAndPopup -SessionRestoreTest.RestoreAfterClosingTabbedBrowserWithAppAndLaunching -SessionRestoreTest.TabWithDownloadDoesNotGetRestored --SettingsA11yBasicV3.Basic* -SettingsA11yEditDictionaryV3.Edit* -SettingsOverriddenDialogViewBrowserTest.Invoke* --SettingsOverriddenParamsProvidersBrowserTest.DialogParamsWithNonDefaultSearch --SharedArrayBufferTest.Transfer* -SharedClipboardBrowserTest.Context* -SharedClipboardUIFeatureDisabledBrowserTest.ContextMenu_UIFeatureDisabled --SharedHighlightingBrowserTest.LinkGenerationTest --SidePanelBookmarksListTest.All -SignedExchangePolicyTest.SignedExchangeDisabled --SigninInterceptFirstRunExperienceDialogBrowserTest.AcceptSync --SigninInterceptFirstRunExperienceDialogBrowserTest.SyncDisabled --SigninReauthTest.Dialog +-SigninInterceptFirstRunExperienceDialogBrowserTest.Accept* +-SigninInterceptFirstRunExperienceDialogBrowserTest.Forced* +-SigninInterceptFirstRunExperienceDialogBrowserTest.ProfileColorPolicy +-SigninInterceptFirstRunExperienceDialogBrowserTest.Sync* +-SigninViewControllerDelegateViewsBrowserTest.InvokeUi_SyncConfirmation +-SigninViewControllerDelegateViewsBrowserTest.Resize* +-SingleProcessBrowserTest.Test -SitePerProcess/TaskManagerOOPIFBrowserTest.CrossSiteIframeBecomesSameSite/0 -SitePerProcess/TaskManagerOOPIFBrowserTest.KillSubframe/0 -SitePerProcess/TaskManagerOOPIFBrowserTest.LeavePageWithCrossSiteIframes/0 @@ -1054,14 +801,13 @@ -SmartSessionRestoreTest.CorrectLoadingOrder -SocketApiTest.SocketMulticast -SpellcheckServiceBrowserTest.DeleteCorruptedBDICT --StartupHelperBrowserTest.ValidateCrx -StartupMetricsTest.ReportsValues -SubAppsServiceImplBrowserTest.EndToEndAdd -SyncAwareCounterTest.AutofillCounter -SyncAwareCounterTest.HistoryCounter -SyncAwareCounterTest.PasswordCounter -SystemNetworkContext/NetworkContextConfigurationDataPacBrowserTest.Data* --SystemNetworkContext/NetworkContextConfigurationFilePacBrowserTest.FilePac/1 +-SystemNetworkContext/NetworkContextConfigurationFilePacBrowserTest.File* -SystemNetworkContext/NetworkContextConfigurationHttpPacBrowserTest.Http* -SystemNetworkContext/NetworkContextConfigurationManagedProxySettingsBrowserTest.Max* -SystemNetworkContext/NetworkContextConfigurationProxySettingsBrowserTest.MaxConnectionsPerProxy/0 @@ -1076,14 +822,11 @@ -TabHoverCardBubbleViewBrowserTest.Widget* -TabRestoreTest.Restore* -TabRestoreTest.TabsFromRestoredWindowsAreLoadedGradually --TabSearchAppTest.All -TabSearchButtonBrowserUITest.InvokeUi_default --TabSearchItemTest.All -TabSearchUIBrowserTest.Close* -TabSearchUIBrowserTest.InitialTabItemsListed -TabSearchUIBrowserTest.SwitchToTabAction -TabStatsTrackerBrowserTest.TabStatsObserverBasics --TabUsageScenarioTrackerBrowserTest.Full* -TaskManagerBrowserTest.Dev* -TaskManagerBrowserTest.HistoryNavigationInNewTab -TaskManagerBrowserTest.IdleWakeups @@ -1091,6 +834,8 @@ -TaskManagerBrowserTest.KillTab -TaskManagerBrowserTest.NavigateAwayFromHungRenderer -TaskManagerBrowserTest.Notice* +-TaskManagerBrowserTest.ReloadExtension +-TaskManagerBrowserTest.SentDataObserved -TaskManagerBrowserTest.ShutdownWhileOpen -TaskManagerBrowserTest.TotalSentDataObserved -TaskManagerBrowserTest.WebWorkerJSHeapMemory @@ -1098,20 +843,19 @@ -TaskManagerViewTest.InitialSelection -TaskManagerViewTest.RestoreBounds -TaskManagerViewTest.TableStartsWithDefaultColumns --ThemeServiceBrowserTest.ThemeDataPackInvalid -ThirdPartyMetricsObserverBrowserTest.OneThirdPartyFrame_OneTimingRecorded -ThirdPartyMetricsObserverBrowserTest.ThreeThirdPartyFrames_ThreeTimingsRecorded -TipMarqueeViewBrowserTest.TipStartsExpanded -TranslateBubbleViewBrowserTest.AlertAccessibleEvent -TranslateBubbleViewBrowserTest.Close* --TranslateBubbleVisualTest.InvokeUi_error +-TranslateBubbleVisualTest.Invoke* -TranslateManagerBrowserTest.Href* -TrustSafetySentimentServiceBrowserTest.Page* -UkmBrowserTest.ConsentAddedButNoSyncCheck -UkmBrowserTest.HistoryDeleteCheck -UkmBrowserTest.IncognitoPlusRegularCheck -UkmBrowserTest.LogProtoData --UkmBrowserTest.MetricsReportingCheck +-UkmBrowserTest.Metrics* -UkmBrowserTest.Multi* -UkmBrowserTest.NetworkProviderPopulatesSystemProfile -UkmBrowserTest.OpenNonSyncCheck @@ -1131,25 +875,27 @@ -UsbChooserBrowserTest.Invoke* -UsbInternalsTest.WebUIValueRenderTest -VariationsSafeModeEndToEndBrowserTest.ExtendedSafeModeEndToEnd --VideoConferencingPictureInPictureWindowControllerBrowserTest.VideoConferencingActions +-VideoPictureInPictureWindowControllerBrowserTest.ControlsVisibility -ViewSourceTest.HttpPostInMainframe -VirtualCardSelectionDialogBrowserTest.InvokeUi_OneCard -WebAppBrowserTest.InScopePWAPopupsHaveCorrectSize -WebAppBrowserTest.OffScopePWAPopupsHaveCorrectSize -WebAppBrowserTest.PWASizeIsCorrectlyRestored -WebAppDeclarativeLinkCapturingBrowserTest.InAppScopeNavigationIgnored --WebAppFrameToolbarBrowserTest_WindowControlsOverlay.WindowControlsOverlayDraggableRegions +-WebAppFileHandlingBrowserTest_FeatureSwitchesOn.OsIntegrationIsAdded +-WebAppFrameToolbarBrowserTest_WindowControlsOverlay.DraggableRegionNotResetByFencedFrameNavigation +-WebAppFrameToolbarBrowserTest_WindowControlsOverlay.PopupFromWcoAppToItself -WebAppIdentityUpdateConfirmationViewBrowserTest.CloseAppIdUpdateDialogOnUninstall -WebAppIdentityUpdateConfirmationViewBrowserTest.InvokeUi_default --WebAppIntegrationBrowserTest.ManifestUpdateScope --WebAppIntegrationBrowserTest.VerifyWindowModeChanged +-WebAppIntegrationBrowserTest.LaunchFromMenuOption +-WebAppIntegrationBrowserTest.Manifest* +-WebAppIntegrationBrowserTest.OpenInChrome -WebAppIntegrationBrowserTest.Web* --WebAppOpaqueBrowserFrameViewTest.Fullscreen --WebAppPictureInPictureWindowControllerBrowserTest.Auto* -WebAppProtocolHandlerIntentPickerDialogInteractiveBrowserTest.InvokeUi_CloseDialog -WebAppUninstallDialogViewInteractiveBrowserTest.InvokeUi_ManualUninstall -WebAudioBrowserTest.VerifyDynamicsCompressorFingerprint -WebSocketBrowserHTTPConnectToTest.Web* +-WebSocketBrowserTest.CheckFileOrigin -WebSocketBrowserTest.FailuresReported -WebSocketBrowserTest.ReuseMainPageBasicAuthCredentialsForWebSocket -WebSocketBrowserTest.SSLConnectionLimit @@ -1157,7 +903,6 @@ -WebSocketBrowserTest.Send* -WebSocketBrowserTest.Web* -WebSocketBrowserTestWithAllowFileAccessFromFiles.CheckFileOrigin --WebUiNtpInterceptionWebRequestAPITest.OneGoogleBarRequestsHidden -WebViewAccessibilityTest.FocusAccessibility -WebViewDPITest.Shim* -WebViewScrollBubbling/WebViewGuestScrollTest.Scroll* @@ -1171,17 +916,15 @@ -WebViewTest.Geolocation* -WebViewTest.Interstitial* -WebViewTest.NoPrerenderer +-WebViewTest.Permissions* -WebViewTest.ReloadAfterCrash -WebViewTest.Shim_TestRemoveWebviewOnExit -WebViewTest.Task* -WebViewTest.TouchpadPinchSyntheticWheelEvents -WebViewWithZoomForDSFTest.Shim* -WebauthnDialogBrowserTest.Invoke* --WebstoreInstallerBrowserTest.WebstoreInstall --WebstoreReinstallerBrowserTest.TestWebstoreReinstall -WindowOpenApiTest.WindowOpenSized -WorkerDevToolsTest.PauseInSharedWorkerInitialization --ZoomBubbleBrowserTest.AnchorPositionsInFullscreen -ZoomBubbleBrowserTest.BubbleSuppressingExtensionRefreshesExistingBubble -ZoomBubbleDialogTest.InvokeUi_default -ZoomControllerBrowserTest.RestoredPageScaleFromNavigation
diff --git a/testing/buildbot/filters/lacros-arm.ozone_unittests.filter b/testing/buildbot/filters/lacros-arm.ozone_unittests.filter new file mode 100644 index 0000000..a6862dfe --- /dev/null +++ b/testing/buildbot/filters/lacros-arm.ozone_unittests.filter
@@ -0,0 +1,29 @@ +# TODO(https://crbug.com/1283076): re-enable the tests when they are fixed. +-XdgVersionStableTest/WaylandDataDragControllerTest.AsyncNoopStartDrag/0 +-XdgVersionStableTest/WaylandDataDragControllerTest.DestroyEnteredSurface/0 +-XdgVersionStableTest/WaylandDataDragControllerTest.DestroyOriginSurface/0 +-XdgVersionStableTest/WaylandDataDragControllerTest.DragToNonToplevelWindows/0 +-XdgVersionStableTest/WaylandDataDragControllerTest.MenuRequestCreatesPopupWindow/0 +-XdgVersionStableTest/WaylandDataDragControllerTest.PopupRequestCreatesPopupWindow/0 +-XdgVersionStableTest/WaylandDataDragControllerTest.StartAndCancel/0 +-XdgVersionStableTest/WaylandDataDragControllerTest.StartDrag/0 +-XdgVersionStableTest/WaylandDataDragControllerTest.StartDragWithCorrectSerial/0 +-XdgVersionStableTest/WaylandDataDragControllerTest.StartDragWithCorrectSerialForDragSource/0 +-XdgVersionStableTest/WaylandDataDragControllerTest.StartDragWithCustomFormats/0 +-XdgVersionStableTest/WaylandDataDragControllerTest.StartDragWithFileContents/0 +-XdgVersionStableTest/WaylandDataDragControllerTest.StartDragWithText/0 +-XdgVersionStableTest/WaylandDataDragControllerTest.StartDragWithWrongMimeType/0 +-XdgVersionV6Test/WaylandDataDragControllerTest.AsyncNoopStartDrag/0 +-XdgVersionV6Test/WaylandDataDragControllerTest.DestroyEnteredSurface/0 +-XdgVersionV6Test/WaylandDataDragControllerTest.DestroyOriginSurface/0 +-XdgVersionV6Test/WaylandDataDragControllerTest.DragToNonToplevelWindows/0 +-XdgVersionV6Test/WaylandDataDragControllerTest.MenuRequestCreatesPopupWindow/0 +-XdgVersionV6Test/WaylandDataDragControllerTest.PopupRequestCreatesPopupWindow/0 +-XdgVersionV6Test/WaylandDataDragControllerTest.StartAndCancel/0 +-XdgVersionV6Test/WaylandDataDragControllerTest.StartDrag/0 +-XdgVersionV6Test/WaylandDataDragControllerTest.StartDragWithCorrectSerial/0 +-XdgVersionV6Test/WaylandDataDragControllerTest.StartDragWithCorrectSerialForDragSource/0 +-XdgVersionV6Test/WaylandDataDragControllerTest.StartDragWithCustomFormats/0 +-XdgVersionV6Test/WaylandDataDragControllerTest.StartDragWithFileContents/0 +-XdgVersionV6Test/WaylandDataDragControllerTest.StartDragWithText/0 +-XdgVersionV6Test/WaylandDataDragControllerTest.StartDragWithWrongMimeType/0 \ No newline at end of file
diff --git a/testing/buildbot/filters/lacros-arm.viz_unittests.filter b/testing/buildbot/filters/lacros-arm.viz_unittests.filter new file mode 100644 index 0000000..165fe8a --- /dev/null +++ b/testing/buildbot/filters/lacros-arm.viz_unittests.filter
@@ -0,0 +1,9 @@ +# TODO(https://crbug.com/1305446): re-enable the tests when they are fixed. +-ExternalStencilPixelTest.RenderSurfacesIgnoreStencil/GL +-ExternalStencilPixelTest.StencilTestDisabled/GL +-ExternalStencilPixelTest.StencilTestEnabled/GL +-RendererPixelTestWithOverdrawFeedback.TranslucentRectangles/GL +-VideoRendererPixelHiLoTest.ClippedYUVRect/GL_true +-VideoRendererPixelHiLoTest.ClippedYUVRect/SkiaGL_true +-VideoRendererPixelHiLoTest.SimpleYUVRect/GL_true +-VideoRendererPixelHiLoTest.SimpleYUVRect/SkiaGL_true \ No newline at end of file
diff --git a/testing/buildbot/internal.chromeos.fyi.json b/testing/buildbot/internal.chromeos.fyi.json index 919fbe9b..cc28eda 100644 --- a/testing/buildbot/internal.chromeos.fyi.json +++ b/testing/buildbot/internal.chromeos.fyi.json
@@ -1125,7 +1125,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R101-14579.0.0", + "cros_img": "octopus-release/R101-14583.0.0", "name": "lacros_fyi_tast_tests_OCTOPUS_RELEASE_LKGM", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1147,7 +1147,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R100-14526.19.0", + "cros_img": "octopus-release/R100-14526.28.0", "name": "lacros_fyi_tast_tests_OCTOPUS_RELEASE_BETA", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1169,7 +1169,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R101-14579.0.0", + "cros_img": "octopus-release/R101-14583.0.0", "name": "ozone_unittests_OCTOPUS_RELEASE_LKGM", "swarming": {}, "test": "ozone_unittests", @@ -1189,7 +1189,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R100-14526.19.0", + "cros_img": "octopus-release/R100-14526.28.0", "name": "ozone_unittests_OCTOPUS_RELEASE_BETA", "swarming": {}, "test": "ozone_unittests", @@ -1217,7 +1217,7 @@ { "args": [], "cros_board": "kevin", - "cros_img": "kevin-release/R101-14579.0.0", + "cros_img": "kevin-release/R101-14583.0.0", "name": "lacros_all_tast_tests_KEVIN_RELEASE_LKGM", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1228,7 +1228,7 @@ { "args": [], "cros_board": "hana", - "cros_img": "hana-release/R101-14579.0.0", + "cros_img": "hana-release/R101-14583.0.0", "name": "lacros_all_tast_tests_HANA_RELEASE_LKGM", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1239,7 +1239,7 @@ { "args": [], "cros_board": "kevin", - "cros_img": "kevin-release/R101-14579.0.0", + "cros_img": "kevin-release/R101-14583.0.0", "name": "ozone_unittests_KEVIN_RELEASE_LKGM", "swarming": {}, "test": "ozone_unittests", @@ -1249,7 +1249,7 @@ { "args": [], "cros_board": "hana", - "cros_img": "hana-release/R101-14579.0.0", + "cros_img": "hana-release/R101-14583.0.0", "name": "ozone_unittests_HANA_RELEASE_LKGM", "swarming": {}, "test": "ozone_unittests", @@ -1259,7 +1259,7 @@ { "args": [], "cros_board": "kevin", - "cros_img": "kevin-release/R101-14579.0.0", + "cros_img": "kevin-release/R101-14583.0.0", "name": "viz_unittests_KEVIN_RELEASE_LKGM", "swarming": {}, "test": "viz_unittests", @@ -1269,7 +1269,7 @@ { "args": [], "cros_board": "hana", - "cros_img": "hana-release/R101-14579.0.0", + "cros_img": "hana-release/R101-14583.0.0", "name": "viz_unittests_HANA_RELEASE_LKGM", "swarming": {}, "test": "viz_unittests",
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index a72f71a..5d0943d1 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -3950,10 +3950,30 @@ }, }, + # TODO(crbug.com/1283076): ozone_unittests and viz_unittests have failures + # remove the filter when the tests are shown to be stable in + # lacros-arm-generic-chrome-fyi + 'lacros_skylab_arm_tests': { + 'lacros_all_tast_tests': { + 'tast_expr': '("group:mainline" && "dep:lacros" && !informational)', + 'timeout_sec': 10800, + }, + 'ozone_unittests': { + 'timeout_sec': 3600, + 'args': [ + '--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.ozone_unittests.filter'] + }, + 'viz_unittests': { + 'timeout_sec': 3600, + 'args': [ + '--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.viz_unittests.filter'] + }, + }, + # create this temporary lacros arm test suites that runs on skylab # TODO(crbug.com/1247425): remove it if it is the same as # lacros_skylab_poc - 'lacros_skylab_arm_tests': { + 'lacros_skylab_arm_tests_fyi': { 'lacros_all_tast_tests': { 'tast_expr': '("group:mainline" && "dep:lacros" && !informational)', 'timeout_sec': 10800, @@ -7319,6 +7339,16 @@ }, # Check go/lacros-on-skylab for details of Skylab configurations. + 'lacros_skylab_arm_fyi': { + 'lacros_skylab_arm_tests_fyi': { + 'variants': [ + 'CROS_KEVIN_RELEASE_LKGM', + 'CROS_HANA_RELEASE_LKGM', + ] + }, + }, + + # Check go/lacros-on-skylab for details of Skylab configurations. 'lacros_skylab_tests_amd64_generic': { 'lacros_skylab_tests': { 'variants': [
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index ff0caed..00723155e 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -875,8 +875,8 @@ 'CROS_ATLAS_RELEASE_LKGM': { 'skylab': { 'cros_board': 'atlas', - 'cros_chrome_version': '101.0.4940.0', - 'cros_img': 'atlas-release/R101-14579.0.0', + 'cros_chrome_version': '101.0.4943.0', + 'cros_img': 'atlas-release/R101-14583.0.0', }, 'enabled': True, 'identifier': 'ATLAS_RELEASE_LKGM', @@ -893,8 +893,8 @@ 'CROS_ATLAS_RELEASE_BETA': { 'skylab': { 'cros_board': 'atlas', - 'cros_chrome_version': '100.0.4896.39', - 'cros_img': 'atlas-release/R100-14526.19.0', + 'cros_chrome_version': '100.0.4896.44', + 'cros_img': 'atlas-release/R100-14526.28.0', }, 'enabled': True, 'identifier': 'ATLAS_RELEASE_BETA', @@ -911,8 +911,8 @@ 'CROS_EVE_RELEASE_LKGM': { 'skylab': { 'cros_board': 'eve', - 'cros_chrome_version': '101.0.4940.0', - 'cros_img': 'eve-release/R101-14579.0.0', + 'cros_chrome_version': '101.0.4943.0', + 'cros_img': 'eve-release/R101-14583.0.0', }, 'enabled': True, 'identifier': 'EVE_RELEASE_LKGM', @@ -929,8 +929,8 @@ 'CROS_EVE_RELEASE_BETA': { 'skylab': { 'cros_board': 'eve', - 'cros_chrome_version': '100.0.4896.39', - 'cros_img': 'eve-release/R100-14526.19.0', + 'cros_chrome_version': '100.0.4896.44', + 'cros_img': 'eve-release/R100-14526.28.0', }, 'enabled': True, 'identifier': 'EVE_RELEASE_BETA', @@ -956,8 +956,8 @@ 'CROS_KEVIN_RELEASE_LKGM': { 'skylab': { 'cros_board': 'kevin', - 'cros_chrome_version': '101.0.4940.0', - 'cros_img': 'kevin-release/R101-14579.0.0', + 'cros_chrome_version': '101.0.4943.0', + 'cros_img': 'kevin-release/R101-14583.0.0', }, 'enabled': True, 'identifier': 'KEVIN_RELEASE_LKGM', @@ -965,8 +965,8 @@ 'CROS_HANA_RELEASE_LKGM': { 'skylab': { 'cros_board': 'hana', - 'cros_chrome_version': '101.0.4940.0', - 'cros_img': 'hana-release/R101-14579.0.0', + 'cros_chrome_version': '101.0.4943.0', + 'cros_img': 'hana-release/R101-14583.0.0', }, 'enabled': True, 'identifier': 'HANA_RELEASE_LKGM', @@ -983,8 +983,8 @@ 'CROS_OCTOPUS_RELEASE_LKGM': { 'skylab': { 'cros_board': 'octopus', - 'cros_chrome_version': '101.0.4940.0', - 'cros_img': 'octopus-release/R101-14579.0.0', + 'cros_chrome_version': '101.0.4943.0', + 'cros_img': 'octopus-release/R101-14583.0.0', }, 'enabled': True, 'identifier': 'OCTOPUS_RELEASE_LKGM', @@ -1001,8 +1001,8 @@ 'CROS_OCTOPUS_RELEASE_BETA': { 'skylab': { 'cros_board': 'octopus', - 'cros_chrome_version': '100.0.4896.39', - 'cros_img': 'octopus-release/R100-14526.19.0', + 'cros_chrome_version': '100.0.4896.44', + 'cros_img': 'octopus-release/R100-14526.28.0', }, 'enabled': True, 'identifier': 'OCTOPUS_RELEASE_BETA',
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index d3087f3..cfadf4b 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -6648,7 +6648,7 @@ 'lacros_version_metadata', ], 'test_suites': { - 'skylab_tests': 'lacros_skylab_arm', + 'skylab_tests': 'lacros_skylab_arm_fyi', }, 'swarming': { 'dimension_sets': [
diff --git a/testing/scripts/wpt_android_lib.py b/testing/scripts/wpt_android_lib.py index 45cd3be..21c6df43 100644 --- a/testing/scripts/wpt_android_lib.py +++ b/testing/scripts/wpt_android_lib.py
@@ -41,6 +41,7 @@ from devil.android import apk_helper from devil.android import device_utils +from devil.android.device_errors import CommandFailedError from devil.android.tools import system_app from devil.android.tools import webview_app @@ -87,6 +88,32 @@ else: return 'wpt_reports_%s.json' % self.options.product + def get_version_provider_package_name(self): + """Get the name of a package containing the product's version. + + Some Android products are broken up into multiple packages with decoupled + "versionName"s. This method should return None to use wpt's best guess of + the product version or a valid package name to override wpt. + + See also: + https://github.com/web-platform-tests/wpt/blob/merge_pr_33203/tools/wpt/browser.py#L850-L864 + """ + return None + + def get_version(self): + """Get the product version, if available.""" + version_provider = self.get_version_provider_package_name() + if self._devices and version_provider: + # Assume emulated devices are identically provisioned. + device = self._devices[0] + try: + version = device.GetApplicationVersion(version_provider) + logger.info('Version of %s is %s', version_provider, version) + return version + except CommandFailedError: + logger.warning('Failed to retrieve version of %s', version_provider) + return None + @property def rest_args(self): rest_args = super(WPTAndroidAdapter, self).rest_args @@ -156,6 +183,10 @@ rest_args.extend(['--log-wptreport', self.wptreport]) + version = self.get_version() + if version: + rest_args.extend(['--browser-version', version]) + if self.options.test_filter: for pattern in self.options.test_filter.split(':'): rest_args.extend([ @@ -329,6 +360,11 @@ parser.add_argument('--webview-provider', help='Webview provider apk to install.') + def get_version_provider_package_name(self): + if self.options.webview_provider: + return apk_helper.GetPackageName(self.options.webview_provider) + return self.WEBLAYER_SUPPORT_PKG + @property def rest_args(self): args = super(WPTWeblayerAdapter, self).rest_args @@ -385,6 +421,11 @@ default=None, help='Using WebView from release channel.') + def get_version_provider_package_name(self): + if self.options.webview_provider: + return apk_helper.GetPackageName(self.options.webview_provider) + return None + @property def rest_args(self): args = super(WPTWebviewAdapter, self).rest_args
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index 1cee901..e8c1c486 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -146,6 +146,10 @@ const base::Feature kPath2DPaintCache{"Path2DPaintCache", base::FEATURE_DISABLED_BY_DEFAULT}; +// Enable by default. This feature is for a kill switch. +const base::Feature kLayoutNGBlockInInline{"LayoutNGBlockInInline", + base::FEATURE_ENABLED_BY_DEFAULT}; + const base::Feature kMixedContentAutoupgrade{"AutoupgradeMixedContent", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h index 5dd9fd0..16aa2ed 100644 --- a/third_party/blink/public/common/features.h +++ b/third_party/blink/public/common/features.h
@@ -50,6 +50,7 @@ BLINK_COMMON_EXPORT extern const base::Feature kDeferredFontShaping; BLINK_COMMON_EXPORT extern const base::Feature kEditingNG; BLINK_COMMON_EXPORT extern const base::Feature kLayoutNG; +BLINK_COMMON_EXPORT extern const base::Feature kLayoutNGBlockInInline; BLINK_COMMON_EXPORT extern const base::Feature kMixedContentAutoupgrade; BLINK_COMMON_EXPORT extern const base::Feature kNavigationPredictor; BLINK_COMMON_EXPORT extern const base::Feature kAnchorElementInteraction;
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl index 607d7429..f202340 100644 --- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl +++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -1542,6 +1542,8 @@ properties # Supports rule text. string text + # Whether the supports condition is satisfied. + boolean active # The associated rule header range in the enclosing stylesheet (if # available). optional SourceRange range
diff --git a/third_party/blink/public/mojom/use_counter/css_property_id.mojom b/third_party/blink/public/mojom/use_counter/css_property_id.mojom index 992b3bb..a1df9d8 100644 --- a/third_party/blink/public/mojom/use_counter/css_property_id.mojom +++ b/third_party/blink/public/mojom/use_counter/css_property_id.mojom
@@ -762,6 +762,7 @@ kFontPalette = 709, kBasePalette = 710, kOverrideColors = 711, + kPageTransitionTag = 712, // 1. Add new features above this line (don't change the assigned numbers of // the existing items). // 2. Run the src/tools/metrics/histograms/update_use_counter_css.py script
diff --git a/third_party/blink/renderer/bindings/generated_in_modules.gni b/third_party/blink/renderer/bindings/generated_in_modules.gni index e21670a..201fed4 100644 --- a/third_party/blink/renderer/bindings/generated_in_modules.gni +++ b/third_party/blink/renderer/bindings/generated_in_modules.gni
@@ -349,6 +349,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_picker_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_system_create_writable_options.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_system_create_writable_options.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_system_create_access_handle_options.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_system_create_access_handle_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_system_flags.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_system_flags.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_system_get_directory_options.cc", @@ -391,6 +393,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_buffer_binding_layout.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_buffer_descriptor.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_buffer_descriptor.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_canvas_compositing_alpha_mode.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_canvas_compositing_alpha_mode.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_canvas_configuration.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_canvas_configuration.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_color_dict.cc", @@ -1084,6 +1088,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_system_handle_kind.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_system_permission_mode.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_system_permission_mode.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_system_write_mode.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_system_write_mode.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_fill_light_mode.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_fill_light_mode.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gamepad_haptic_actuator_type.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_modules.gni b/third_party/blink/renderer/bindings/idl_in_modules.gni index b735187..e3e3ef61 100644 --- a/third_party/blink/renderer/bindings/idl_in_modules.gni +++ b/third_party/blink/renderer/bindings/idl_in_modules.gni
@@ -242,6 +242,7 @@ "//third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.idl", "//third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.idl", "//third_party/blink/renderer/modules/file_system_access/file_system_file_handle.idl", + "//third_party/blink/renderer/modules/file_system_access/file_system_create_access_handle_options.idl", "//third_party/blink/renderer/modules/file_system_access/file_system_get_directory_options.idl", "//third_party/blink/renderer/modules/file_system_access/file_system_get_file_options.idl", "//third_party/blink/renderer/modules/file_system_access/file_system_handle.idl",
diff --git a/third_party/blink/renderer/core/css/css_properties.json5 b/third_party/blink/renderer/core/css/css_properties.json5 index 75519544..2321f62 100644 --- a/third_party/blink/renderer/core/css/css_properties.json5 +++ b/third_party/blink/renderer/core/css/css_properties.json5
@@ -3424,6 +3424,18 @@ computable: false, }, { + name: "page-transition-tag", + field_group: "*", + property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"], + converter: "ConvertPageTransitionTag", + type_name: "AtomicString", + default_value: "AtomicString()", + field_template: "external", + keywords: ["none"], + typedom_types: ["Keyword"], + runtime_flag: "DocumentTransition", + }, + { name: "paint-order", property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"], inherited: true,
diff --git a/third_party/blink/renderer/core/css/css_supports_rule.h b/third_party/blink/renderer/core/css/css_supports_rule.h index c76f45a..3a08cee 100644 --- a/third_party/blink/renderer/core/css/css_supports_rule.h +++ b/third_party/blink/renderer/core/css/css_supports_rule.h
@@ -47,6 +47,10 @@ void SetConditionText(const ExecutionContext*, String); + bool ConditionIsSupported() const { + return To<StyleRuleSupports>(group_rule_.Get())->ConditionIsSupported(); + } + private: CSSRule::Type GetType() const override { return kSupportsRule; } };
diff --git a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc index 3be3928..83a5b2e 100644 --- a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc +++ b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
@@ -47,6 +47,7 @@ #include "third_party/blink/renderer/core/css/style_engine.h" #include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h" #include "third_party/blink/renderer/core/css_value_keywords.h" +#include "third_party/blink/renderer/core/document_transition/document_transition_style_tracker.h" #include "third_party/blink/renderer/core/frame/settings.h" #include "third_party/blink/renderer/core/frame/web_feature.h" #include "third_party/blink/renderer/core/layout/counter_node.h" @@ -5459,6 +5460,28 @@ return MakeGarbageCollected<CSSCustomIdentValue>(style.Page()); } +const CSSValue* PageTransitionTag::ParseSingleValue( + CSSParserTokenRange& range, + const CSSParserContext& context, + const CSSParserLocalContext&) const { + if (range.Peek().Id() == CSSValueID::kNone) + return css_parsing_utils::ConsumeIdent(range); + if (DocumentTransitionStyleTracker::IsReservedTransitionTag( + range.Peek().Value())) { + return nullptr; + } + return css_parsing_utils::ConsumeCustomIdent(range, context); +} + +const CSSValue* PageTransitionTag::CSSValueFromComputedStyleInternal( + const ComputedStyle& style, + const LayoutObject*, + bool allow_visited_style) const { + if (style.PageTransitionTag().IsNull()) + return CSSIdentifierValue::Create(CSSValueID::kNone); + return MakeGarbageCollected<CSSCustomIdentValue>(style.PageTransitionTag()); +} + const CSSValue* PaintOrder::ParseSingleValue( CSSParserTokenRange& range, const CSSParserContext& 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 f319bab..096a061d 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
@@ -1671,6 +1671,17 @@ } } +AtomicString StyleBuilderConverter::ConvertPageTransitionTag( + StyleResolverState& state, + const CSSValue& value) { + if (auto* custom_ident_value = DynamicTo<CSSCustomIdentValue>(value)) + return AtomicString(custom_ident_value->Value()); + DCHECK(DynamicTo<CSSIdentifierValue>(value)); + DCHECK_EQ(DynamicTo<CSSIdentifierValue>(value)->GetValueID(), + CSSValueID::kNone); + return AtomicString(); +} + StyleColor StyleBuilderConverter::ConvertStyleColor(StyleResolverState& state, const CSSValue& value, bool for_visited_link) {
diff --git a/third_party/blink/renderer/core/css/resolver/style_builder_converter.h b/third_party/blink/renderer/core/css/resolver/style_builder_converter.h index fb70c8b9..4e6c2a7 100644 --- a/third_party/blink/renderer/core/css/resolver/style_builder_converter.h +++ b/third_party/blink/renderer/core/css/resolver/style_builder_converter.h
@@ -299,6 +299,9 @@ static void CountSystemColorComputeToSelfUsage( const StyleResolverState& state); + + static AtomicString ConvertPageTransitionTag(StyleResolverState&, + const CSSValue&); }; template <typename T>
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.cc b/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.cc index 165fa8fb..9166e5d 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.cc +++ b/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.cc
@@ -673,6 +673,12 @@ return false; } +// static +bool DocumentTransitionStyleTracker::IsReservedTransitionTag( + const StringView& value) { + return value == RootTag(); +} + void DocumentTransitionStyleTracker::InvalidateStyle() { ua_style_sheet_.reset(); document_->GetStyleEngine().InvalidateUADocumentTransitionStyle();
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.h b/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.h index 40f6d9aa..b157fb41 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.h +++ b/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.h
@@ -113,6 +113,8 @@ return std::move(capture_resource_ids_); } + static bool IsReservedTransitionTag(const StringView& value); + private: class ImageWrapperPseudoElement;
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index 5aac41f..87de615 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -3168,6 +3168,13 @@ if (!style || style->Animations() || style->Transitions() || style->HasVariableReference() || style->HasVariableDeclaration()) return nullptr; + if (style->InsideLink() != EInsideLink::kNotInsideLink) { + // We cannot do the inherited propagation optimization within links, + // since -internal-visited-color is handled in CascadeExpansion + // (which we do not run in that path), and we also have no tracking + // of whether the property was inherited or not. + return nullptr; + } scoped_refptr<ComputedStyle> new_style = ComputedStyle::Clone(*style); new_style->PropagateIndependentInheritedProperties(*parent_style); INCREMENT_STYLE_STATS_COUNTER(GetDocument().GetStyleEngine(),
diff --git a/third_party/blink/renderer/core/dom/element_test.cc b/third_party/blink/renderer/core/dom/element_test.cc index d46f371..1653534 100644 --- a/third_party/blink/renderer/core/dom/element_test.cc +++ b/third_party/blink/renderer/core/dom/element_test.cc
@@ -895,113 +895,110 @@ ASSERT_FALSE(fg12_flags & FocusgroupFlags::kWrapVertically); } -TEST_F(ElementTest, ParseFocusgroupAttrGridCorrectly) { +TEST_F(ElementTest, ParseFocusgroupAttrGrid) { Document& document = GetDocument(); SetBodyContent(R"HTML( - <div id=fg1 focusgroup="grid vertical"> - <div id=fg2 focusgroup=extend></div> - <div> - <div> - <div id=fg3 focusgroup=extend></div> - </div> - </div> - </div> - <div id=fg4 focusgroup="grid horizontal"> - <div id=fg5 focusgroup=extend></div> - </div> - <div id=fg6 focusgroup=grid> - <div id=fg7 focusgroup=extend> - <div id=fg8 focusgroup=extend></div> - </div> - </div> + <div id=e1 focusgroup=grid></div> <!-- Error --> + <table id=e2 focusgroup=grid></table> + <table id=e3 focusgroup="grid wrap"></table> + <table id=e4 focusgroup="grid row-wrap"></table> + <table id=e5 focusgroup="grid col-wrap"></table> + <table id=e6 focusgroup="grid row-wrap col-wrap"></table> + <table id=e7 focusgroup="grid flow"></table> + <table id=e8 focusgroup="grid row-flow"></table> + <table id=e9 focusgroup="grid col-flow"></table> + <table id=e10 focusgroup="grid row-flow col-flow"></table> + <table id=e11 focusgroup="grid row-wrap row-flow"></table> + <table id=e12 focusgroup="grid row-wrap col-flow"></table> + <table id=e13 focusgroup="grid col-wrap col-flow"></table> + <table id=e14 focusgroup="grid col-wrap row-flow"></table> + <table focusgroup=grid> + <tbody id=e15 focusgroup=extend></tbody> <!-- Error --> + </table> + <div id=e16 focusgroup="flow"></div> <!-- Error --> )HTML"); - // 1. The outer focusgroup should only support the vertical axis and have the - // grid flag. - auto* fg1 = document.getElementById("fg1"); - ASSERT_TRUE(fg1); + auto* e1 = document.getElementById("e1"); + auto* e2 = document.getElementById("e2"); + auto* e3 = document.getElementById("e3"); + auto* e4 = document.getElementById("e4"); + auto* e5 = document.getElementById("e5"); + auto* e6 = document.getElementById("e6"); + auto* e7 = document.getElementById("e7"); + auto* e8 = document.getElementById("e8"); + auto* e9 = document.getElementById("e9"); + auto* e10 = document.getElementById("e10"); + auto* e11 = document.getElementById("e11"); + auto* e12 = document.getElementById("e12"); + auto* e13 = document.getElementById("e13"); + auto* e14 = document.getElementById("e14"); + auto* e15 = document.getElementById("e15"); + auto* e16 = document.getElementById("e16"); + ASSERT_TRUE(e1); + ASSERT_TRUE(e2); + ASSERT_TRUE(e3); + ASSERT_TRUE(e4); + ASSERT_TRUE(e5); + ASSERT_TRUE(e6); + ASSERT_TRUE(e7); + ASSERT_TRUE(e8); + ASSERT_TRUE(e9); + ASSERT_TRUE(e10); + ASSERT_TRUE(e11); + ASSERT_TRUE(e12); + ASSERT_TRUE(e13); + ASSERT_TRUE(e14); + ASSERT_TRUE(e15); + ASSERT_TRUE(e16); - FocusgroupFlags fg1_flags = fg1->GetFocusgroupFlags(); - ASSERT_NE(fg1_flags, FocusgroupFlags::kNone); - ASSERT_TRUE(fg1_flags & FocusgroupFlags::kGrid); - ASSERT_FALSE(fg1_flags & FocusgroupFlags::kHorizontal); - ASSERT_TRUE(fg1_flags & FocusgroupFlags::kVertical); + FocusgroupFlags e1_flags = e1->GetFocusgroupFlags(); + FocusgroupFlags e2_flags = e2->GetFocusgroupFlags(); + FocusgroupFlags e3_flags = e3->GetFocusgroupFlags(); + FocusgroupFlags e4_flags = e4->GetFocusgroupFlags(); + FocusgroupFlags e5_flags = e5->GetFocusgroupFlags(); + FocusgroupFlags e6_flags = e6->GetFocusgroupFlags(); + FocusgroupFlags e7_flags = e7->GetFocusgroupFlags(); + FocusgroupFlags e8_flags = e8->GetFocusgroupFlags(); + FocusgroupFlags e9_flags = e9->GetFocusgroupFlags(); + FocusgroupFlags e10_flags = e10->GetFocusgroupFlags(); + FocusgroupFlags e11_flags = e11->GetFocusgroupFlags(); + FocusgroupFlags e12_flags = e12->GetFocusgroupFlags(); + FocusgroupFlags e13_flags = e13->GetFocusgroupFlags(); + FocusgroupFlags e14_flags = e14->GetFocusgroupFlags(); + FocusgroupFlags e15_flags = e15->GetFocusgroupFlags(); + FocusgroupFlags e16_flags = e16->GetFocusgroupFlags(); - // 2. The inner focusgroup should only support the axis orthogonal to its - // parent and have the grid flag even if not specified (because it extends a - // grid focusgroup). - auto* fg2 = document.getElementById("fg2"); - ASSERT_TRUE(fg2); - - FocusgroupFlags fg2_flags = fg2->GetFocusgroupFlags(); - ASSERT_NE(fg2_flags, FocusgroupFlags::kNone); - ASSERT_TRUE(fg2_flags & FocusgroupFlags::kGrid); - ASSERT_TRUE(fg2_flags & FocusgroupFlags::kHorizontal); - ASSERT_FALSE(fg2_flags & FocusgroupFlags::kVertical); - - // 3. Same as the case above, even with the couple of extra divs there are - // between the inner focusgroup and the outer one. - auto* fg3 = document.getElementById("fg3"); - ASSERT_TRUE(fg3); - - FocusgroupFlags fg3_flags = fg3->GetFocusgroupFlags(); - ASSERT_NE(fg3_flags, FocusgroupFlags::kNone); - ASSERT_TRUE(fg3_flags & FocusgroupFlags::kGrid); - ASSERT_TRUE(fg3_flags & FocusgroupFlags::kHorizontal); - ASSERT_FALSE(fg3_flags & FocusgroupFlags::kVertical); - - // 4. The outer focusgroup should only support the horizontal axis and have - // the grid flag. - auto* fg4 = document.getElementById("fg4"); - ASSERT_TRUE(fg4); - - FocusgroupFlags fg4_flags = fg4->GetFocusgroupFlags(); - ASSERT_NE(fg4_flags, FocusgroupFlags::kNone); - ASSERT_TRUE(fg4_flags & FocusgroupFlags::kGrid); - ASSERT_TRUE(fg4_flags & FocusgroupFlags::kHorizontal); - ASSERT_FALSE(fg4_flags & FocusgroupFlags::kVertical); - - // 5. The inner focusgroup should only support the axis orthogonal to its - // parent and have the grid flag even if not specified (because it extends a - // grid focusgroup). - auto* fg5 = document.getElementById("fg5"); - ASSERT_TRUE(fg5); - - FocusgroupFlags fg5_flags = fg5->GetFocusgroupFlags(); - ASSERT_NE(fg5_flags, FocusgroupFlags::kNone); - ASSERT_TRUE(fg5_flags & FocusgroupFlags::kGrid); - ASSERT_FALSE(fg5_flags & FocusgroupFlags::kHorizontal); - ASSERT_TRUE(fg5_flags & FocusgroupFlags::kVertical); - - // 6. The outer focusgroup should only support the horizontal axis even if - // it's not specified (default value) and have the grid flag. - auto* fg6 = document.getElementById("fg6"); - ASSERT_TRUE(fg6); - - FocusgroupFlags fg6_flags = fg6->GetFocusgroupFlags(); - ASSERT_NE(fg6_flags, FocusgroupFlags::kNone); - ASSERT_TRUE(fg6_flags & FocusgroupFlags::kGrid); - ASSERT_TRUE(fg6_flags & FocusgroupFlags::kHorizontal); - ASSERT_FALSE(fg6_flags & FocusgroupFlags::kVertical); - - // 7. The inner focusgroup should only support the axis orthogonal to its - // parent (even if not explicit on the parent) and have the grid flag even if - // not specified (because it extends a grid focusgroup). - auto* fg7 = document.getElementById("fg7"); - ASSERT_TRUE(fg7); - - FocusgroupFlags fg7_flags = fg7->GetFocusgroupFlags(); - ASSERT_NE(fg7_flags, FocusgroupFlags::kNone); - ASSERT_TRUE(fg7_flags & FocusgroupFlags::kGrid); - ASSERT_FALSE(fg7_flags & FocusgroupFlags::kHorizontal); - ASSERT_TRUE(fg7_flags & FocusgroupFlags::kVertical); - - // 8. No focusgroup is allowed to extend an inner grid focusgroup. - auto* fg8 = document.getElementById("fg8"); - ASSERT_TRUE(fg8); - - FocusgroupFlags fg8_flags = fg8->GetFocusgroupFlags(); - ASSERT_EQ(fg8_flags, FocusgroupFlags::kNone); + ASSERT_EQ(e1_flags, FocusgroupFlags::kNone); + ASSERT_EQ(e2_flags, FocusgroupFlags::kGrid); + ASSERT_EQ(e3_flags, + (FocusgroupFlags::kGrid | FocusgroupFlags::kWrapHorizontally | + FocusgroupFlags::kWrapVertically)); + ASSERT_EQ(e4_flags, + (FocusgroupFlags::kGrid | FocusgroupFlags::kWrapHorizontally)); + ASSERT_EQ(e5_flags, + (FocusgroupFlags::kGrid | FocusgroupFlags::kWrapVertically)); + ASSERT_EQ(e6_flags, + (FocusgroupFlags::kGrid | FocusgroupFlags::kWrapHorizontally | + FocusgroupFlags::kWrapVertically)); + ASSERT_EQ(e7_flags, (FocusgroupFlags::kGrid | FocusgroupFlags::kRowFlow | + FocusgroupFlags::kColFlow)); + ASSERT_EQ(e8_flags, (FocusgroupFlags::kGrid | FocusgroupFlags::kRowFlow)); + ASSERT_EQ(e9_flags, (FocusgroupFlags::kGrid | FocusgroupFlags::kColFlow)); + ASSERT_EQ(e10_flags, (FocusgroupFlags::kGrid | FocusgroupFlags::kRowFlow | + FocusgroupFlags::kColFlow)); + ASSERT_EQ(e11_flags, + (FocusgroupFlags::kGrid | FocusgroupFlags::kWrapHorizontally)); + ASSERT_EQ(e12_flags, + (FocusgroupFlags::kGrid | FocusgroupFlags::kWrapHorizontally | + FocusgroupFlags::kColFlow)); + ASSERT_EQ(e13_flags, + (FocusgroupFlags::kGrid | FocusgroupFlags::kWrapVertically)); + ASSERT_EQ(e14_flags, + (FocusgroupFlags::kGrid | FocusgroupFlags::kWrapVertically | + FocusgroupFlags::kRowFlow)); + ASSERT_EQ(e15_flags, FocusgroupFlags::kNone); + ASSERT_EQ(e16_flags, + (FocusgroupFlags::kHorizontal | FocusgroupFlags::kVertical)); } TEST_F(ElementTest, ParseFocusgroupAttrValueRecomputedAfterDOMStructureChange) {
diff --git a/third_party/blink/renderer/core/dom/focusgroup_flags.cc b/third_party/blink/renderer/core/dom/focusgroup_flags.cc index 67a59a1..adca9f6 100644 --- a/third_party/blink/renderer/core/dom/focusgroup_flags.cc +++ b/third_party/blink/renderer/core/dom/focusgroup_flags.cc
@@ -9,6 +9,7 @@ #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/dom/element_traversal.h" #include "third_party/blink/renderer/core/dom/space_split_string.h" +#include "third_party/blink/renderer/core/html/html_table_element.h" #include "third_party/blink/renderer/core/inspector/console_message.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h" #include "third_party/blink/renderer/platform/wtf/text/string_builder.h" @@ -16,6 +17,20 @@ namespace blink::focusgroup { +FocusgroupFlags FindNearestFocusgroupAncestorFlags(const Element* element) { + // TODO(bebeaudr): We should be using FlatTreeTraversal here. + Element* ancestor = Traversal<Element>::FirstAncestor(*element); + while (ancestor) { + FocusgroupFlags ancestor_flags = ancestor->GetFocusgroupFlags(); + // When this is true, we found the focusgroup to extend. + if (ancestor_flags != FocusgroupFlags::kNone) { + return ancestor_flags; + } + ancestor = Traversal<Element>::FirstAncestor(*ancestor); + } + return FocusgroupFlags::kNone; +} + FocusgroupFlags ParseFocusgroup(const Element* element, const AtomicString& input) { DCHECK(RuntimeEnabledFeatures::FocusgroupEnabled()); @@ -25,8 +40,13 @@ bool has_extend = false; bool has_horizontal = false; bool has_vertical = false; - bool has_wrap = false; bool has_grid = false; + bool has_wrap = false; + bool has_row_wrap = false; + bool has_col_wrap = false; + bool has_flow = false; + bool has_row_flow = false; + bool has_col_flow = false; StringBuilder invalid_tokens; SpaceSplitString tokens(input); @@ -38,10 +58,20 @@ has_horizontal = true; } else if (lowercase_token == "vertical") { has_vertical = true; - } else if (lowercase_token == "wrap") { - has_wrap = true; } else if (lowercase_token == "grid") { has_grid = true; + } else if (lowercase_token == "wrap") { + has_wrap = true; + } else if (lowercase_token == "row-wrap") { + has_row_wrap = true; + } else if (lowercase_token == "col-wrap") { + has_col_wrap = true; + } else if (lowercase_token == "flow") { + has_flow = true; + } else if (lowercase_token == "row-flow") { + has_row_flow = true; + } else if (lowercase_token == "col-flow") { + has_col_flow = true; } else { if (!invalid_tokens.IsEmpty()) invalid_tokens.Append(", "); @@ -63,13 +93,256 @@ FocusgroupFlags flags = FocusgroupFlags::kNone; - // 3. Set the axis supported on that focusgroup. + // 2. Apply the extend logic. A focusgroup can extend another one explicitly + // when the author specifies "extend" or implicitly when a focusgroup has the + // "gridcells" role. + FocusgroupFlags ancestor_flags = FocusgroupFlags::kNone; + if (has_extend) { + // Focusgroups should only be allowed to extend when they have a focusgroup + // ancestor and the focusgroup ancestor isn't a grid focusgroup. + ancestor_flags = FindNearestFocusgroupAncestorFlags(element); + if (ancestor_flags != FocusgroupFlags::kNone) { + flags |= FocusgroupFlags::kExtend; + if (ancestor_flags & FocusgroupFlags::kGrid) { + element->GetDocument().AddConsoleMessage( + MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kError, + WebString::FromUTF8( + "Focusgroup attribute value 'extend' present, " + "but grid focusgroups cannot be extended. Ignoring " + "focusgroup."))); + return FocusgroupFlags::kNone; + } + } else { + element->GetDocument().AddConsoleMessage( + MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kError, + WebString::FromUTF8( + "Focusgroup attribute value 'extend' present, " + "but no parent focusgroup found. Ignoring 'extend'."))); + } + } + + // 3. Apply the grid focusgroup logic: + // * 'grid' can only be set on an HTML table element. + // * The grid-related wrap/flown can only be set on a grid focusgroup. + if (has_grid) { + if (has_extend) { + element->GetDocument().AddConsoleMessage( + MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kError, + WebString::FromUTF8( + "Focusgroup attribute values 'extend' and 'grid' present, " + "but grid focusgroup cannot extend. Ignoring focusgroup."))); + return FocusgroupFlags::kNone; + } + + auto* html_table_element = DynamicTo<HTMLTableElement>(element); + if (!html_table_element) { + element->GetDocument().AddConsoleMessage( + MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kError, + WebString::FromUTF8( + "Focusgroup attribute value 'grid' used on an element other " + "than an HTML table. Ignoring focusgroup."))); + return FocusgroupFlags::kNone; + } + + flags |= FocusgroupFlags::kGrid; + + // Set the wrap/flow flags, if specified. + if (has_wrap) { + flags |= + FocusgroupFlags::kWrapHorizontally | FocusgroupFlags::kWrapVertically; + if (has_row_wrap) { + element->GetDocument().AddConsoleMessage( + MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kWarning, + WebString::FromUTF8( + "Focusgroup attribute value 'row-wrap' present, but can be " + "omitted because focusgroup already wraps in both axes."))); + } + if (has_col_wrap) { + element->GetDocument().AddConsoleMessage( + MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kWarning, + WebString::FromUTF8( + "Focusgroup attribute value 'col-wrap' present, but can be " + "omitted because focusgroup already wraps in both axes."))); + } + } else { + if (has_row_wrap) + flags |= FocusgroupFlags::kWrapHorizontally; + if (has_col_wrap) + flags |= FocusgroupFlags::kWrapVertically; + + if (has_row_wrap && has_col_wrap) { + element->GetDocument().AddConsoleMessage( + MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kWarning, + WebString::FromUTF8( + "Focusgroup attribute values 'row-wrap col-wrap' should be " + "replaced by 'wrap'."))); + } + } + + if (has_flow) { + if (flags & FocusgroupFlags::kWrapHorizontally || + flags & FocusgroupFlags::kWrapVertically) { + element->GetDocument().AddConsoleMessage(MakeGarbageCollected< + ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kError, + WebString::FromUTF8( + "Focusgroup attribute value 'flow' present, " + "but focusgroup already set to wrap in at least one axis."))); + } else { + flags |= FocusgroupFlags::kRowFlow | FocusgroupFlags::kColFlow; + if (has_row_flow) { + element->GetDocument().AddConsoleMessage(MakeGarbageCollected< + ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kWarning, + WebString::FromUTF8( + "Focusgroup attribute value 'row-flow' present, but can be " + "omitted because focusgroup already flows in both axes."))); + } + if (has_col_flow) { + element->GetDocument().AddConsoleMessage(MakeGarbageCollected< + ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kWarning, + WebString::FromUTF8( + "Focusgroup attribute value 'col-flow' present, but can be " + "omitted because focusgroup already flows in both axes."))); + } + } + } else { + if (has_row_flow) { + if (flags & FocusgroupFlags::kWrapHorizontally) { + element->GetDocument().AddConsoleMessage( + MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kError, + WebString::FromUTF8( + "Focusgroup attribute value 'row-flow' present, " + "but focusgroup already wraps in the row axis."))); + } else { + flags |= FocusgroupFlags::kRowFlow; + } + } + if (has_col_flow) { + if (flags & FocusgroupFlags::kWrapVertically) { + element->GetDocument().AddConsoleMessage( + MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kError, + WebString::FromUTF8( + "Focusgroup attribute value 'col-flow' present, " + "but focusgroup already wraps in the column axis."))); + } else { + flags |= FocusgroupFlags::kColFlow; + } + } + if (flags & FocusgroupFlags::kRowFlow && + flags & FocusgroupFlags::kColFlow) { + element->GetDocument().AddConsoleMessage( + MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kWarning, + WebString::FromUTF8( + "Focusgroup attribute values 'row-flow col-flow' should be " + "replaced by 'flow'."))); + } + } + + // These values are reserved for linear focusgroups. + if (has_horizontal) { + element->GetDocument().AddConsoleMessage( + MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kError, + WebString::FromUTF8( + "Focusgroup attribute value 'horizontal' present, " + "but no has no effect on grid focusgroups."))); + } + if (has_vertical) { + element->GetDocument().AddConsoleMessage( + MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kError, + WebString::FromUTF8( + "Focusgroup attribute value 'vertical' present, " + "but no has no effect on grid focusgroups."))); + } + + return flags; + } + + // At this point, we are necessarily in a linear focusgroup. Any grid + // focusgroup should have returned above. + + if (has_row_wrap) { + element->GetDocument().AddConsoleMessage( + MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kError, + WebString::FromUTF8( + "Focusgroup attribute value 'row-wrap' present, " + "but no has no effect on linear focusgroups."))); + } + if (has_col_wrap) { + element->GetDocument().AddConsoleMessage( + MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kError, + WebString::FromUTF8( + "Focusgroup attribute value 'col-wrap' present, " + "but no has no effect on linear focusgroups."))); + } + if (has_flow) { + element->GetDocument().AddConsoleMessage( + MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kError, + WebString::FromUTF8( + "Focusgroup attribute value 'flow' present, " + "but no has no effect on linear focusgroups."))); + } + if (has_row_flow) { + element->GetDocument().AddConsoleMessage( + MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kError, + WebString::FromUTF8( + "Focusgroup attribute value 'row-flow' present, " + "but no has no effect on linear focusgroups."))); + } + if (has_col_flow) { + element->GetDocument().AddConsoleMessage( + MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kError, + WebString::FromUTF8( + "Focusgroup attribute value 'col-flow' present, " + "but no has no effect on linear focusgroups."))); + } + + // 4. Set the axis supported on that focusgroup. if (has_horizontal) flags |= FocusgroupFlags::kHorizontal; if (has_vertical) flags |= FocusgroupFlags::kVertical; - // When no axis is specified, it means that the focusgroup should handle both. + // When no axis is specified, it means that the focusgroup should handle + // both. if (!has_horizontal && !has_vertical) flags |= FocusgroupFlags::kHorizontal | FocusgroupFlags::kVertical; @@ -84,99 +357,6 @@ "be omitted."))); } - // 4. Apply the extend logic. - FocusgroupFlags ancestor_flags = FocusgroupFlags::kNone; - if (has_extend) { - // Focusgroups should only be allowed to extend when they have a focusgroup - // ancestor. - Element* ancestor = Traversal<Element>::FirstAncestor(*element); - while (ancestor) { - ancestor_flags = ancestor->GetFocusgroupFlags(); - // When this is true, we found the focusgroup to extend. - if (ancestor_flags != FocusgroupFlags::kNone) { - flags |= FocusgroupFlags::kExtend; - break; - } - - ancestor = Traversal<Element>::FirstAncestor(*ancestor); - } - - if (!(flags & FocusgroupFlags::kExtend)) { - element->GetDocument().AddConsoleMessage( - MakeGarbageCollected<ConsoleMessage>( - mojom::blink::ConsoleMessageSource::kOther, - mojom::blink::ConsoleMessageLevel::kWarning, - WebString::FromUTF8( - "Focusgroup attribute value 'extend' present, " - "but no parent focusgroup found."))); - } - } - - // 5. Set the flag for grid if the value was provided. - if (has_grid || (flags & FocusgroupFlags::kExtend && - ancestor_flags & FocusgroupFlags::kGrid)) { - flags |= FocusgroupFlags::kGrid; - - if (ancestor_flags & FocusgroupFlags::kExtend) { - // We don't support focusgroups that try to extend the grid inner - // focusgroup. - element->GetDocument().AddConsoleMessage( - MakeGarbageCollected<ConsoleMessage>( - mojom::blink::ConsoleMessageSource::kOther, - mojom::blink::ConsoleMessageLevel::kError, - WebString::FromUTF8( - "Focusgroup attribute value 'extend' cannot be " - "used to extend a parent 'grid' focusgroup."))); - return FocusgroupFlags::kNone; - } - - // When in a grid focusgroup, the outer focusgroup should only support one - // axis and its inner focusgroup should support the other one. - if (flags & FocusgroupFlags::kExtend) { - if (ancestor_flags & FocusgroupFlags::kHorizontal) { - if (flags & FocusgroupFlags::kHorizontal) { - element->GetDocument().AddConsoleMessage( - MakeGarbageCollected<ConsoleMessage>( - mojom::blink::ConsoleMessageSource::kOther, - mojom::blink::ConsoleMessageLevel::kWarning, - WebString::FromUTF8( - "Focusgroup attribute value 'horizontal' ignored; parent " - "'grid' focusgroup already specifies 'horizontal' and " - "'vertical' is assumed."))); - } - flags &= ~FocusgroupFlags::kHorizontal; - flags |= FocusgroupFlags::kVertical; - } else { - DCHECK(ancestor_flags & FocusgroupFlags::kVertical); - if (flags & FocusgroupFlags::kVertical) { - element->GetDocument().AddConsoleMessage( - MakeGarbageCollected<ConsoleMessage>( - mojom::blink::ConsoleMessageSource::kOther, - mojom::blink::ConsoleMessageLevel::kWarning, - WebString::FromUTF8( - "Focusgroup attribute value 'vertical' ignored; parent " - "'grid' focusgroup already specifies 'vertical' and " - "'horizontal' is assumed."))); - } - flags |= FocusgroupFlags::kHorizontal; - flags &= ~FocusgroupFlags::kVertical; - } - } else if (flags & FocusgroupFlags::kHorizontal && - flags & FocusgroupFlags::kVertical) { - // In theory, the author needs to specify an axis on the outer focusgroup, - // but if they don't we'll revert to a default value of "horizontal". - flags &= ~FocusgroupFlags::kVertical; - element->GetDocument().AddConsoleMessage( - MakeGarbageCollected<ConsoleMessage>( - mojom::blink::ConsoleMessageSource::kOther, - mojom::blink::ConsoleMessageLevel::kWarning, - WebString::FromUTF8( - "Focusgroup attribute value 'grid' requires an additional " - "'horizontal' or 'vertical' direction value. Using " - "'horizontal' as a default value."))); - } - } - // 6. Determine in what axis a focusgroup should wrap. This needs to be // performed once the supported axes are final. if (has_wrap) {
diff --git a/third_party/blink/renderer/core/dom/focusgroup_flags.h b/third_party/blink/renderer/core/dom/focusgroup_flags.h index 76228fd4..0bcebf9b 100644 --- a/third_party/blink/renderer/core/dom/focusgroup_flags.h +++ b/third_party/blink/renderer/core/dom/focusgroup_flags.h
@@ -11,26 +11,28 @@ class Element; -enum FocusgroupFlags : int8_t { +enum FocusgroupFlags : uint8_t { kNone = 0, kExtend = 1 << 0, kHorizontal = 1 << 1, kVertical = 1 << 2, - kWrapHorizontally = 1 << 3, - kWrapVertically = 1 << 4, - kGrid = 1 << 5, + kGrid = 1 << 3, + kWrapHorizontally = 1 << 4, + kWrapVertically = 1 << 5, + kRowFlow = 1 << 6, + kColFlow = 1 << 7, }; inline constexpr FocusgroupFlags operator&(FocusgroupFlags a, FocusgroupFlags b) { - return static_cast<FocusgroupFlags>(static_cast<int8_t>(a) & - static_cast<int8_t>(b)); + return static_cast<FocusgroupFlags>(static_cast<uint8_t>(a) & + static_cast<uint8_t>(b)); } inline constexpr FocusgroupFlags operator|(FocusgroupFlags a, FocusgroupFlags b) { - return static_cast<FocusgroupFlags>(static_cast<int8_t>(a) | - static_cast<int8_t>(b)); + return static_cast<FocusgroupFlags>(static_cast<uint8_t>(a) | + static_cast<uint8_t>(b)); } inline FocusgroupFlags& operator|=(FocusgroupFlags& a, FocusgroupFlags b) { @@ -42,10 +44,11 @@ } inline constexpr FocusgroupFlags operator~(FocusgroupFlags flags) { - return static_cast<FocusgroupFlags>(~static_cast<int8_t>(flags)); + return static_cast<FocusgroupFlags>(~static_cast<uint8_t>(flags)); } namespace focusgroup { +FocusgroupFlags FindNearestFocusgroupAncestorFlags(const Element* element); // Implemented based on this explainer: // https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/main/Focusgroup/explainer.md FocusgroupFlags ParseFocusgroup(const Element* element,
diff --git a/third_party/blink/renderer/core/frame/attribution_reporting.cc b/third_party/blink/renderer/core/frame/attribution_reporting.cc index 9b80de1..be37efd4 100644 --- a/third_party/blink/renderer/core/frame/attribution_reporting.cc +++ b/third_party/blink/renderer/core/frame/attribution_reporting.cc
@@ -83,8 +83,8 @@ Document* document = GetSupplementable()->document(); AttributionSrcLoader::RegisterResult result = - frame->GetAttributionSrcLoader()->Register(document->CompleteURL(url), - /*element=*/nullptr); + frame->GetAttributionSrcLoader()->RegisterSources( + document->CompleteURL(url)); return HandleRegisterResult(script_state, exception_state, result); }
diff --git a/third_party/blink/renderer/core/frame/attribution_src_loader.cc b/third_party/blink/renderer/core/frame/attribution_src_loader.cc index 24775e2f..21495e2 100644 --- a/third_party/blink/renderer/core/frame/attribution_src_loader.cc +++ b/third_party/blink/renderer/core/frame/attribution_src_loader.cc
@@ -46,9 +46,6 @@ namespace { -// Represents what events are able to be registered from an attributionsrc. -enum class AttributionSrcType { kUndetermined, kSource, kTrigger }; - bool ContainsTriggerHeaders(const HTTPHeaderMap& headers) { return headers.Contains( http_names::kAttributionReportingRegisterEventTrigger) || @@ -67,8 +64,10 @@ public: // `associated_with_navigation` indicates whether the attribution data // produced by this client will need to be associated with a navigation. - ResourceClient(AttributionSrcLoader* loader, bool associated_with_navigation) - : loader_(loader) { + ResourceClient(AttributionSrcLoader* loader, + SrcType type, + bool associated_with_navigation) + : loader_(loader), type_(type) { DCHECK(loader_); DCHECK(loader_->local_frame_); DCHECK(loader_->local_frame_->IsAttached()); @@ -126,7 +125,7 @@ // Type of events this request can register. In some cases, this will not be // assigned until the first event is received. A single attributionsrc // request can only register one type of event across redirects. - AttributionSrcType type_ = AttributionSrcType::kUndetermined; + SrcType type_; // Token used to identify an attributionsrc request in the browser process. // Only generated for attributionsrc requests that are associated with a @@ -149,20 +148,27 @@ visitor->Trace(resource_clients_); } -AttributionSrcLoader::RegisterResult AttributionSrcLoader::Register( - const KURL& src_url, - HTMLImageElement* element) { +void AttributionSrcLoader::Register(const KURL& src_url, + HTMLImageElement* element) { RegisterResult result; - CreateAndSendRequest(src_url, element, /*associated_with_navigation=*/false, - result); + CreateAndSendRequest(src_url, element, SrcType::kUndetermined, + /*associated_with_navigation=*/false, result); +} + +AttributionSrcLoader::RegisterResult AttributionSrcLoader::RegisterSources( + const KURL& src_url) { + RegisterResult result; + CreateAndSendRequest(src_url, /*element=*/nullptr, SrcType::kSource, + /*associated_with_navigation=*/false, result); return result; } absl::optional<WebImpression> AttributionSrcLoader::RegisterNavigation( const KURL& src_url) { RegisterResult result; - ResourceClient* client = CreateAndSendRequest( - src_url, nullptr, /*associated_with_navigation=*/true, result); + ResourceClient* client = + CreateAndSendRequest(src_url, nullptr, SrcType::kUndetermined, + /*associated_with_navigation=*/true, result); if (!client) return absl::nullopt; @@ -176,6 +182,7 @@ AttributionSrcLoader::CreateAndSendRequest( const KURL& src_url, HTMLElement* element, + SrcType src_type, bool associated_with_navigation, RegisterResult& out_register_result) { // Detached frames cannot/should not register new attributionsrcs. @@ -201,19 +208,21 @@ Document* document = window->document(); if (document->IsPrerendering()) { - document->AddPostPrerenderingActivationStep(WTF::Bind( - &AttributionSrcLoader::DoPrerenderingRegistration, - WrapPersistentIfNeeded(this), src_url, associated_with_navigation)); + document->AddPostPrerenderingActivationStep( + WTF::Bind(&AttributionSrcLoader::DoPrerenderingRegistration, + WrapPersistentIfNeeded(this), src_url, src_type, + associated_with_navigation)); out_register_result = RegisterResult::kSuccess; return nullptr; } out_register_result = RegisterResult::kSuccess; - return DoRegistration(src_url, associated_with_navigation); + return DoRegistration(src_url, src_type, associated_with_navigation); } AttributionSrcLoader::ResourceClient* AttributionSrcLoader::DoRegistration( const KURL& src_url, + SrcType src_type, bool associated_with_navigation) { if (!local_frame_->IsAttached()) return nullptr; @@ -230,8 +239,8 @@ params.MutableOptions().initiator_info.name = fetch_initiator_type_names::kAttributionsrc; - auto* client = - MakeGarbageCollected<ResourceClient>(this, associated_with_navigation); + auto* client = MakeGarbageCollected<ResourceClient>( + this, src_type, associated_with_navigation); resource_clients_.insert(client); RawResource::Fetch(params, local_frame_->DomWindow()->Fetcher(), client); return client; @@ -239,8 +248,9 @@ void AttributionSrcLoader::DoPrerenderingRegistration( const KURL& src_url, + SrcType src_type, bool associated_with_navigation) { - DoRegistration(src_url, associated_with_navigation); + DoRegistration(src_url, src_type, associated_with_navigation); } AttributionSrcLoader::RegisterResult @@ -370,21 +380,21 @@ const ResourceResponse& response) { const auto& headers = response.HttpHeaderFields(); - bool can_process_source = type_ == AttributionSrcType::kUndetermined || - type_ == AttributionSrcType::kSource; + bool can_process_source = + type_ == SrcType::kUndetermined || type_ == SrcType::kSource; if (can_process_source && headers.Contains(http_names::kAttributionReportingRegisterSource)) { - type_ = AttributionSrcType::kSource; + type_ = SrcType::kSource; HandleSourceRegistration(response); return; } // TODO(johnidel): Consider surfacing an error when source and trigger headers // are present together. - bool can_process_trigger = type_ == AttributionSrcType::kUndetermined || - type_ == AttributionSrcType::kTrigger; + bool can_process_trigger = + type_ == SrcType::kUndetermined || type_ == SrcType::kTrigger; if (can_process_trigger && ContainsTriggerHeaders(headers)) { - type_ = AttributionSrcType::kTrigger; + type_ = SrcType::kTrigger; HandleTriggerRegistration(response); } @@ -393,7 +403,7 @@ void AttributionSrcLoader::ResourceClient::HandleSourceRegistration( const ResourceResponse& response) { - DCHECK_EQ(type_, AttributionSrcType::kSource); + DCHECK_EQ(type_, SrcType::kSource); mojom::blink::AttributionSourceDataPtr source_data = mojom::blink::AttributionSourceData::New(); @@ -428,7 +438,7 @@ void AttributionSrcLoader::ResourceClient::HandleTriggerRegistration( const ResourceResponse& response) { - DCHECK_EQ(type_, AttributionSrcType::kTrigger); + DCHECK_EQ(type_, SrcType::kTrigger); mojom::blink::AttributionTriggerDataPtr trigger_data = attribution_response_parsing::ParseAttributionTriggerData(response);
diff --git a/third_party/blink/renderer/core/frame/attribution_src_loader.h b/third_party/blink/renderer/core/frame/attribution_src_loader.h index 14a4c235..0ebc941 100644 --- a/third_party/blink/renderer/core/frame/attribution_src_loader.h +++ b/third_party/blink/renderer/core/frame/attribution_src_loader.h
@@ -46,8 +46,10 @@ // Registers an attributionsrc. This method handles fetching the attribution // src and notifying the browser process to begin tracking it. It is a no-op // if the frame is not attached. - RegisterResult Register(const KURL& attribution_src, - HTMLImageElement* element); + void Register(const KURL& attribution_src, HTMLImageElement* element); + + // Like `Register()`, but only allows sources to be registered. + RegisterResult RegisterSources(const KURL& attribution_src); void MaybeRegisterTrigger(const ResourceRequest& request, const ResourceResponse& response); @@ -61,6 +63,9 @@ void Trace(Visitor* visitor) const; private: + // Represents what events are able to be registered from an attributionsrc. + enum class SrcType { kUndetermined, kSource, kTrigger }; + class ResourceClient; enum class RegisterContext { @@ -69,8 +74,10 @@ }; ResourceClient* DoRegistration(const KURL& src_url, + SrcType src_type, bool associated_with_navigation); void DoPrerenderingRegistration(const KURL& src_url, + SrcType src_type, bool associated_with_navigation); // Returns whether the attribution is allowed to be registered. Devtool issue @@ -86,6 +93,7 @@ ResourceClient* CreateAndSendRequest(const KURL& src_url, HTMLElement* element, + SrcType src_type, bool associated_with_navigation, RegisterResult& out_register_result);
diff --git a/third_party/blink/renderer/core/frame/deprecation/deprecation.cc b/third_party/blink/renderer/core/frame/deprecation/deprecation.cc index fa6407e..184a68a 100644 --- a/third_party/blink/renderer/core/frame/deprecation/deprecation.cc +++ b/third_party/blink/renderer/core/frame/deprecation/deprecation.cc
@@ -293,6 +293,18 @@ "'HTMLVideoElement.webkitExitFullscreen()'", "'Document.exitFullscreen()'"); + case WebFeature::kPrefixedVideoEnterFullScreen: + return DeprecationInfo::WithFeatureAndReplacement( + "PrefixedVideoEnterFullScreen", kUnknown, + "'HTMLVideoElement.webkitEnterFullScreen()'", + "'Element.requestFullscreen()'"); + + case WebFeature::kPrefixedVideoExitFullScreen: + return DeprecationInfo::WithFeatureAndReplacement( + "PrefixedVideoExitFullScreen", kUnknown, + "'HTMLVideoElement.webkitExitFullScreen()'", + "'Document.exitFullscreen()'"); + case WebFeature::kPrefixedRequestAnimationFrame: return DeprecationInfo::WithDetails( "PrefixedRequestAnimationFrame", kUnknown,
diff --git a/third_party/blink/renderer/core/frame/frame.cc b/third_party/blink/renderer/core/frame/frame.cc index ac75f350..da12f2f4 100644 --- a/third_party/blink/renderer/core/frame/frame.cc +++ b/third_party/blink/renderer/core/frame/frame.cc
@@ -194,6 +194,10 @@ return !Tree().Parent(); } +bool Frame::IsOutermostMainFrame() const { + return IsMainFrame() && !IsInFencedFrameTree(); +} + bool Frame::IsCrossOriginToMainFrame() const { DCHECK(GetSecurityContext()); const SecurityOrigin* security_origin =
diff --git a/third_party/blink/renderer/core/frame/frame.h b/third_party/blink/renderer/core/frame/frame.h index d3f7fca2..95eab95 100644 --- a/third_party/blink/renderer/core/frame/frame.h +++ b/third_party/blink/renderer/core/frame/frame.h
@@ -138,6 +138,13 @@ // reach out to site-isolation-dev@chromium.org. bool IsMainFrame() const; + // Returns true if this frame is the top-level main frame (associated with + // the root Document in a WebContents). See content::Page for detailed + // documentation. + // This is false for main frames created for fenced-frames. + // TODO(khushalsagar) : Should also be the case for portals. + bool IsOutermostMainFrame() const; + // Returns true if and only if: // - this frame is a subframe // - it is cross-origin to the main frame
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index 5f8068cb..f0789f8 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -4661,7 +4661,7 @@ bool apply_overflow_clip) { DCHECK(frame_->IsLocalRoot()); // This is the top-level frame, so no mapping necessary. - if (frame_->IsMainFrame()) + if (frame_->IsOutermostMainFrame()) return true; bool result = rect.InclusiveIntersect(PhysicalRect( apply_overflow_clip ? frame_->RemoteViewportIntersection() @@ -4680,7 +4680,7 @@ TransformState& transform_state) { DCHECK(frame_->IsLocalRoot()); // This is the top-level frame, so no mapping necessary. - if (frame_->IsMainFrame()) + if (frame_->IsOutermostMainFrame()) return; transform_state.ApplyTransform( TransformationMatrix(GetFrame().RemoteMainFrameTransform()),
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc index 4e2ea1d..52c655cf 100644 --- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc +++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
@@ -1763,7 +1763,7 @@ const absl::optional<VisualProperties>& visual_properties) { // Remote viewports are only applicable to local frames with remote ancestors. // TODO(https://crbug.com/1148960): Should this deal with portals? - DCHECK(ForSubframe()); + DCHECK(ForSubframe() || !LocalRootImpl()->GetFrame()->IsOutermostMainFrame()); if (visual_properties.has_value()) UpdateVisualProperties(visual_properties.value()); @@ -1777,10 +1777,16 @@ void WebFrameWidgetImpl::ApplyViewportIntersection( mojom::blink::ViewportIntersectionStatePtr intersection_state) { - child_data().compositor_visible_rect = - intersection_state->compositor_visible_rect; - widget_base_->LayerTreeHost()->SetVisualDeviceViewportIntersectionRect( - intersection_state->compositor_visible_rect); + if (ForSubframe()) { + // This information is propagated to LTH to define the region for filling + // the on-screen text content. + // TODO(khushalsagar) : This needs to also be done for main frames which are + // embedded pages (see Frame::IsOutermostMainFrame()). + child_data().compositor_visible_rect = + intersection_state->compositor_visible_rect; + widget_base_->LayerTreeHost()->SetVisualDeviceViewportIntersectionRect( + intersection_state->compositor_visible_rect); + } LocalRootImpl()->GetFrame()->SetViewportIntersectionFromParent( *intersection_state); }
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 7698b36d..07499d9 100644 --- a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
@@ -2009,6 +2009,7 @@ std::unique_ptr<protocol::CSS::CSSSupports> supports_object = protocol::CSS::CSSSupports::create() .setText(rule->ConditionTextInternal()) + .setActive(rule->ConditionIsSupported()) .build(); auto it =
diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc b/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc index 656fc758..bca3a26 100644 --- a/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc +++ b/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc
@@ -486,7 +486,8 @@ // Map and clip rect into root element coordinates. // TODO(szager): the writing mode flipping needs a test. const LayoutBox* local_ancestor = nullptr; - if (!RootIsImplicit() || root->GetDocument().IsInMainFrame()) + if (!RootIsImplicit() || + root->GetDocument().GetFrame()->IsOutermostMainFrame()) local_ancestor = To<LayoutBox>(root); unsigned flags = kDefaultVisualRectFlags | kEdgeInclusive |
diff --git a/third_party/blink/renderer/core/layout/build.gni b/third_party/blink/renderer/core/layout/build.gni index 9d9dcdc..a4688ce2 100644 --- a/third_party/blink/renderer/core/layout/build.gni +++ b/third_party/blink/renderer/core/layout/build.gni
@@ -598,6 +598,7 @@ "ng/table/ng_table_borders.h", "ng/table/ng_table_child_iterator.cc", "ng/table/ng_table_child_iterator.h", + "ng/table/ng_table_column_location.h", "ng/table/ng_table_constraint_space_data.h", "ng/table/ng_table_fragment_data.h", "ng/table/ng_table_layout_algorithm.cc",
diff --git a/third_party/blink/renderer/core/layout/ng/table/ng_table_column_location.h b/third_party/blink/renderer/core/layout/ng/table/ng_table_column_location.h new file mode 100644 index 0000000..e468d6b --- /dev/null +++ b/third_party/blink/renderer/core/layout/ng/table/ng_table_column_location.h
@@ -0,0 +1,23 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_TABLE_NG_TABLE_COLUMN_LOCATION_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_TABLE_NG_TABLE_COLUMN_LOCATION_H_ + +#include "third_party/blink/renderer/platform/geometry/layout_unit.h" + +namespace blink { + +struct NGTableColumnLocation { + DISALLOW_NEW(); + LayoutUnit offset; + LayoutUnit size; + bool is_collapsed; +}; + +} // namespace blink + +WTF_ALLOW_MOVE_INIT_AND_COMPARE_WITH_MEM_FUNCTIONS(blink::NGTableColumnLocation) + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_TABLE_NG_TABLE_LAYOUT_ALGORITHM_TYPES_H_
diff --git a/third_party/blink/renderer/core/layout/ng/table/ng_table_constraint_space_data.h b/third_party/blink/renderer/core/layout/ng/table/ng_table_constraint_space_data.h index 67fc663..8e52337 100644 --- a/third_party/blink/renderer/core/layout/ng/table/ng_table_constraint_space_data.h +++ b/third_party/blink/renderer/core/layout/ng/table/ng_table_constraint_space_data.h
@@ -6,6 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_TABLE_NG_TABLE_CONSTRAINT_SPACE_DATA_H_ #include "third_party/blink/renderer/core/layout/geometry/logical_size.h" +#include "third_party/blink/renderer/core/layout/ng/table/ng_table_column_location.h" #include "third_party/blink/renderer/platform/geometry/layout_unit.h" #include "third_party/blink/renderer/platform/text/writing_mode.h" #include "third_party/blink/renderer/platform/wtf/ref_counted.h" @@ -20,24 +21,7 @@ class NGTableConstraintSpaceData : public RefCounted<NGTableConstraintSpaceData> { public: - // Table grid columns are used to compute cell geometry. - struct ColumnLocation { - ColumnLocation(LayoutUnit offset, LayoutUnit inline_size, bool is_collapsed) - : offset(offset), - inline_size(inline_size), - is_collapsed(is_collapsed) {} - - bool operator==(const ColumnLocation& other) const { - return offset == other.offset && inline_size == other.inline_size && - is_collapsed == other.is_collapsed; - } - - const LayoutUnit offset; - const LayoutUnit inline_size; - const bool is_collapsed; - }; - - // Section hold row index information used to map between table and + // |Section| holds the row index information used to map between table and // section row indexes. struct Section { Section(wtf_size_t start_row_index, wtf_size_t row_count) @@ -190,7 +174,7 @@ return true; } - Vector<ColumnLocation> column_locations; + Vector<NGTableColumnLocation> column_locations; Vector<Section> sections; Vector<Row> rows; Vector<Cell> cells; @@ -205,8 +189,6 @@ } // namespace blink -WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS( - blink::NGTableConstraintSpaceData::ColumnLocation) WTF_ALLOW_MOVE_INIT_AND_COMPARE_WITH_MEM_FUNCTIONS( blink::NGTableConstraintSpaceData::Section) WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(
diff --git a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc index eb62377..0899a90c 100644 --- a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc
@@ -234,7 +234,7 @@ const Vector<LayoutUnit>& column_sizes, LayoutUnit inline_border_spacing, bool shrink_collapsed, - NGTableTypes::ColumnLocations* column_locations, + Vector<NGTableColumnLocation>* column_locations, bool* has_collapsed_columns) { *has_collapsed_columns = false; column_locations->resize(column_constraints.data.size()); @@ -267,7 +267,7 @@ scoped_refptr<const NGTableConstraintSpaceData> CreateConstraintSpaceData( const ComputedStyle& style, - const NGTableTypes::ColumnLocations& column_locations, + const Vector<NGTableColumnLocation>& column_locations, const NGTableTypes::Sections& sections, const NGTableTypes::Rows& rows, const NGTableTypes::CellBlockConstraints& cell_block_constraints, @@ -279,12 +279,8 @@ data->is_table_block_size_specified = !style.LogicalHeight().IsAuto(); data->has_collapsed_borders = style.BorderCollapse() == EBorderCollapse::kCollapse; + data->column_locations = column_locations; - data->column_locations.ReserveCapacity(column_locations.size()); - for (const auto& location : column_locations) { - data->column_locations.emplace_back(location.offset, location.size, - location.is_collapsed); - } data->sections.ReserveCapacity(sections.size()); for (const auto& section : sections) data->sections.emplace_back(section.start_row, section.row_count); @@ -411,20 +407,20 @@ }); } - ColumnGeometriesBuilder(const NGTableTypes::ColumnLocations& column_locations, + ColumnGeometriesBuilder(const Vector<NGTableColumnLocation>& column_locations, LayoutUnit table_grid_block_size, const LogicalSize& border_spacing) : column_locations(column_locations), table_grid_block_size(table_grid_block_size), border_spacing(border_spacing) {} NGTableFragmentData::ColumnGeometries column_geometries; - const NGTableTypes::ColumnLocations& column_locations; + const Vector<NGTableColumnLocation>& column_locations; const LayoutUnit table_grid_block_size; const LogicalSize& border_spacing; }; LayoutUnit ComputeTableSizeFromColumns( - const NGTableTypes::ColumnLocations column_locations, + const Vector<NGTableColumnLocation>& column_locations, const NGBoxStrut& table_border_padding, const LogicalSize& border_spacing) { return column_locations.back().offset + column_locations.back().size + @@ -475,7 +471,7 @@ // Final inline size must depend on column locations, because columns can be // hidden. - NGTableTypes::ColumnLocations column_locations; + Vector<NGTableColumnLocation> column_locations; bool has_collapsed_columns; ComputeLocationsFromColumns( *column_constraints, column_sizes, border_spacing.inline_size, @@ -533,7 +529,7 @@ NGTableAlgorithmHelpers::SynchronizeAssignableTableInlineSizeAndColumns( assignable_table_inline_size, is_fixed_layout, *column_constraints); - NGTableTypes::ColumnLocations column_locations; + Vector<NGTableColumnLocation> column_locations; bool has_collapsed_columns; ComputeLocationsFromColumns( *column_constraints, column_sizes, border_spacing.inline_size, @@ -654,7 +650,7 @@ void NGTableLayoutAlgorithm::ComputeRows( const LayoutUnit table_grid_inline_size, const NGTableGroupedChildren& grouped_children, - const NGTableTypes::ColumnLocations& column_locations, + const Vector<NGTableColumnLocation>& column_locations, const NGTableBorders& table_borders, const LogicalSize& border_spacing, const NGBoxStrut& table_border_padding, @@ -732,7 +728,7 @@ // Method also sets LogicalWidth/Height on columns. void NGTableLayoutAlgorithm::ComputeTableSpecificFragmentData( const NGTableGroupedChildren& grouped_children, - const NGTableTypes::ColumnLocations& column_locations, + const Vector<NGTableColumnLocation>& column_locations, const NGTableTypes::Rows& rows, const NGTableBorders& table_borders, const PhysicalRect& table_grid_rect, @@ -797,7 +793,7 @@ const LayoutUnit table_inline_size, const LayoutUnit minimal_table_grid_block_size, const NGTableGroupedChildren& grouped_children, - const NGTableTypes::ColumnLocations& column_locations, + const Vector<NGTableColumnLocation>& column_locations, const NGTableTypes::Rows& rows, const NGTableTypes::CellBlockConstraints& cell_block_constraints, const NGTableTypes::Sections& sections,
diff --git a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.h index a4b329f..d19db5bd 100644 --- a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.h +++ b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.h
@@ -58,7 +58,7 @@ private: void ComputeRows(const LayoutUnit table_grid_inline_size, const NGTableGroupedChildren& grouped_children, - const NGTableTypes::ColumnLocations& column_locations, + const Vector<NGTableColumnLocation>& column_locations, const NGTableBorders& table_borders, const LogicalSize& border_spacing, const NGBoxStrut& table_border_padding, @@ -71,7 +71,7 @@ void ComputeTableSpecificFragmentData( const NGTableGroupedChildren& grouped_children, - const NGTableTypes::ColumnLocations& column_locations, + const Vector<NGTableColumnLocation>& column_locations, const NGTableTypes::Rows& rows, const NGTableBorders& table_borders, const PhysicalRect& table_grid_rect, @@ -82,7 +82,7 @@ LayoutUnit table_inline_size, LayoutUnit minimal_table_grid_block_size, const NGTableGroupedChildren& grouped_children, - const NGTableTypes::ColumnLocations& column_locations, + const Vector<NGTableColumnLocation>& column_locations, const NGTableTypes::Rows& rows, const NGTableTypes::CellBlockConstraints& cell_block_constraints, const NGTableTypes::Sections& sections,
diff --git a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm_types.h b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm_types.h index 287a5b1..eb8c21f 100644 --- a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm_types.h +++ b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm_types.h
@@ -185,12 +185,6 @@ bool is_collapsed; }; - struct ColumnLocation { - LayoutUnit offset; // inline offset from table edge. - LayoutUnit size; - bool is_collapsed; - }; - struct Section { wtf_size_t start_row; wtf_size_t row_count; @@ -229,7 +223,6 @@ using RowspanCells = Vector<RowspanCell>; using Rows = Vector<Row>; using Sections = Vector<Section>; - using ColumnLocations = Vector<ColumnLocation>; }; class NGTableGroupedChildrenIterator; @@ -307,8 +300,6 @@ WTF_ALLOW_MOVE_INIT_AND_COMPARE_WITH_MEM_FUNCTIONS( blink::NGTableTypes::RowspanCell) WTF_ALLOW_MOVE_INIT_AND_COMPARE_WITH_MEM_FUNCTIONS(blink::NGTableTypes::Row) -WTF_ALLOW_MOVE_INIT_AND_COMPARE_WITH_MEM_FUNCTIONS( - blink::NGTableTypes::ColumnLocation) WTF_ALLOW_MOVE_INIT_AND_COMPARE_WITH_MEM_FUNCTIONS(blink::NGTableTypes::Section) #endif // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_TABLE_NG_TABLE_LAYOUT_ALGORITHM_TYPES_H_
diff --git a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm_utils.cc b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm_utils.cc index 3644d1e..90887f1 100644 --- a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm_utils.cc +++ b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm_utils.cc
@@ -159,7 +159,7 @@ const NGBlockNode& row, const LayoutUnit cell_percentage_inline_size, const bool is_table_block_size_specified, - const NGTableTypes::ColumnLocations& column_locations, + const Vector<NGTableColumnLocation>& column_locations, const NGTableBorders& table_borders, wtf_size_t row_index, wtf_size_t section_index, @@ -570,7 +570,7 @@ const NGBlockNode& section, const LayoutUnit cell_percentage_inline_size, const bool is_table_block_size_specified, - const NGTableTypes::ColumnLocations& column_locations, + const Vector<NGTableColumnLocation>& column_locations, const NGTableBorders& table_borders, const LayoutUnit block_border_spacing, wtf_size_t section_index,
diff --git a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm_utils.h b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm_utils.h index 2c0e5f9f..d09a7ee3 100644 --- a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm_utils.h +++ b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm_utils.h
@@ -62,7 +62,7 @@ const NGBlockNode& section, const LayoutUnit cell_percentage_resolution_inline_size, const bool is_table_block_size_specified, - const NGTableTypes::ColumnLocations& column_locations, + const Vector<NGTableColumnLocation>& column_locations, const NGTableBorders& table_borders, const LayoutUnit block_border_spacing, wtf_size_t section_index,
diff --git a/third_party/blink/renderer/core/layout/ng/table/ng_table_row_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/table/ng_table_row_layout_algorithm.cc index 7115a43..2567d68 100644 --- a/third_party/blink/renderer/core/layout/ng/table/ng_table_row_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/table/ng_table_row_layout_algorithm.cc
@@ -61,7 +61,7 @@ table_data.cells[cell_index]; const LayoutUnit cell_inline_size = table_data.column_locations[cell_location_end_column].offset + - table_data.column_locations[cell_location_end_column].inline_size - + table_data.column_locations[cell_location_end_column].size - table_data.column_locations[cell_location_start_column].offset; const LayoutUnit cell_block_size = cell_data.rowspan_block_size != kIndefiniteSize
diff --git a/third_party/blink/renderer/core/loader/build.gni b/third_party/blink/renderer/core/loader/build.gni index 03aba5f..5be28c5 100644 --- a/third_party/blink/renderer/core/loader/build.gni +++ b/third_party/blink/renderer/core/loader/build.gni
@@ -138,6 +138,8 @@ "web_associated_url_loader_impl.h", "web_bundle/script_web_bundle.cc", "web_bundle/script_web_bundle.h", + "web_bundle/script_web_bundle_error.cc", + "web_bundle/script_web_bundle_error.h", "web_bundle/script_web_bundle_rule.cc", "web_bundle/script_web_bundle_rule.h", "web_bundle/web_bundle_loader.cc",
diff --git a/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle.cc b/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle.cc index a540e9f..1ce89b7 100644 --- a/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle.cc +++ b/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle.cc
@@ -40,34 +40,34 @@ Persistent<ScriptWebBundle> script_web_bundle_; }; -ScriptWebBundle* ScriptWebBundle::CreateOrReuseInline( - ScriptElementBase& element, - const String& source_text) { +absl::variant<ScriptWebBundle*, ScriptWebBundleError> +ScriptWebBundle::CreateOrReuseInline(ScriptElementBase& element, + const String& source_text) { Document& document = element.GetDocument(); auto rule = ScriptWebBundleRule::ParseJson(source_text, document.BaseURL()); if (!rule) { - return nullptr; + return ScriptWebBundleError(ScriptWebBundleError::Type::kParseError, + "Failed to parse web bundle: invalid JSON"); } ResourceFetcher* resource_fetcher = document.Fetcher(); if (!resource_fetcher) { - return nullptr; + return ScriptWebBundleError(ScriptWebBundleError::Type::kSystemError, + "Missing resource fetcher."); } SubresourceWebBundleList* active_bundles = resource_fetcher->GetOrCreateSubresourceWebBundleList(); if (active_bundles->GetMatchingBundle(rule->source_url())) { ExecutionContext* context = document.GetExecutionContext(); - if (!context) - return nullptr; - context->AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>( - mojom::blink::ConsoleMessageSource::kOther, - mojom::blink::ConsoleMessageLevel::kWarning, - "A nested bundle is not supported: " + - rule->source_url().ElidedString())); - document.GetTaskRunner(TaskType::kDOMManipulation) - ->PostTask(FROM_HERE, WTF::Bind(&ScriptElementBase::DispatchErrorEvent, - WrapPersistent(&element))); - return nullptr; + if (context) { + context->AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kWarning, + "A nested bundle is not supported: " + + rule->source_url().ElidedString())); + } + return ScriptWebBundleError(ScriptWebBundleError::Type::kSystemError, + "A nested bundle is not supported."); } if (SubresourceWebBundle* found =
diff --git a/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle.h b/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle.h index 4c804279..6df99d3 100644 --- a/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle.h +++ b/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle.h
@@ -5,8 +5,10 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_WEB_BUNDLE_SCRIPT_WEB_BUNDLE_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_WEB_BUNDLE_SCRIPT_WEB_BUNDLE_H_ +#include "third_party/abseil-cpp/absl/types/variant.h" #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h" #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/loader/web_bundle/script_web_bundle_error.h" #include "third_party/blink/renderer/core/loader/web_bundle/script_web_bundle_rule.h" #include "third_party/blink/renderer/core/script/script_element_base.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" @@ -31,8 +33,8 @@ : public GarbageCollected<ScriptWebBundle>, public SubresourceWebBundle { public: - static ScriptWebBundle* CreateOrReuseInline(ScriptElementBase&, - const String& inline_text); + static absl::variant<ScriptWebBundle*, ScriptWebBundleError> + CreateOrReuseInline(ScriptElementBase&, const String& inline_text); ScriptWebBundle(ScriptElementBase& element, Document& element_document,
diff --git a/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle_error.cc b/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle_error.cc new file mode 100644 index 0000000..8a891c6 --- /dev/null +++ b/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle_error.cc
@@ -0,0 +1,26 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/core/loader/web_bundle/script_web_bundle_error.h" +#include "third_party/blink/renderer/platform/bindings/script_state.h" +#include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h" +#include "v8/include/v8.h" + +namespace blink { + +v8::Local<v8::Value> ScriptWebBundleError::ToV8(ScriptState* script_state) { + v8::Isolate* isolate = script_state->GetIsolate(); + switch (type_) { + case ScriptWebBundleError::Type::kParseError: + return V8ThrowException::CreateSyntaxError(isolate, message_); + case ScriptWebBundleError::Type::kSystemError: + return V8ThrowException::CreateError(isolate, message_); + } +} + +ScriptWebBundleError::Type ScriptWebBundleError::GetType() { + return type_; +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle_error.h b/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle_error.h new file mode 100644 index 0000000..1c37de1b --- /dev/null +++ b/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle_error.h
@@ -0,0 +1,41 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_WEB_BUNDLE_SCRIPT_WEB_BUNDLE_ERROR_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_WEB_BUNDLE_SCRIPT_WEB_BUNDLE_ERROR_H_ + +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" +#include "v8/include/v8.h" + +namespace blink { + +class ScriptState; + +class ScriptWebBundleError final { + public: + // TODO: figure out what to show the user when + // the type is kSystemError. + enum class Type { + kParseError, + kSystemError, + }; + + ScriptWebBundleError(Type type, String message) + : type_(type), message_(std::move(message)) { + DCHECK(!message_.IsEmpty()); + } + + ~ScriptWebBundleError() = default; + + v8::Local<v8::Value> ToV8(ScriptState* script_state); + Type GetType(); + + private: + Type type_; + String message_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_WEB_BUNDLE_SCRIPT_WEB_BUNDLE_ERROR_H_
diff --git a/third_party/blink/renderer/core/page/focusgroup_controller_utils.h b/third_party/blink/renderer/core/page/focusgroup_controller_utils.h index 18db2ae..62955f1 100644 --- a/third_party/blink/renderer/core/page/focusgroup_controller_utils.h +++ b/third_party/blink/renderer/core/page/focusgroup_controller_utils.h
@@ -13,7 +13,7 @@ class Element; class KeyboardEvent; -enum FocusgroupFlags : int8_t; +enum FocusgroupFlags : uint8_t; enum class FocusgroupDirection { kNone,
diff --git a/third_party/blink/renderer/core/paint/ng/ng_highlight_overlay.cc b/third_party/blink/renderer/core/paint/ng/ng_highlight_overlay.cc index 93f90e2..58da5c1e 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_highlight_overlay.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_highlight_overlay.cc
@@ -62,7 +62,7 @@ return result.ToString(); } -PseudoId HighlightLayer::PseudoId() const { +enum PseudoId HighlightLayer::PseudoId() const { switch (type) { case HighlightLayerType::kOriginating: return kPseudoIdNone;
diff --git a/third_party/blink/renderer/core/paint/ng/ng_highlight_overlay.h b/third_party/blink/renderer/core/paint/ng/ng_highlight_overlay.h index 42e5f57..44fd2149 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_highlight_overlay.h +++ b/third_party/blink/renderer/core/paint/ng/ng_highlight_overlay.h
@@ -40,7 +40,7 @@ : type(type), name(name) {} String ToString() const; - PseudoId PseudoId() const; + enum PseudoId PseudoId() const; const AtomicString& PseudoArgument() const; int8_t ComparePaintOrder(const HighlightLayer&,
diff --git a/third_party/blink/renderer/core/script/script_loader.cc b/third_party/blink/renderer/core/script/script_loader.cc index 30702ca9..a3b605c 100644 --- a/third_party/blink/renderer/core/script/script_loader.cc +++ b/third_party/blink/renderer/core/script/script_loader.cc
@@ -767,10 +767,36 @@ context_window)); DCHECK(!script_web_bundle_); - script_web_bundle_ = - ScriptWebBundle::CreateOrReuseInline(*element_, source_text); - if (!script_web_bundle_) { - element_->DispatchErrorEvent(); + absl::variant<ScriptWebBundle*, ScriptWebBundleError> + script_web_bundle_or_error = + ScriptWebBundle::CreateOrReuseInline(*element_, source_text); + if (absl::holds_alternative<ScriptWebBundle*>( + script_web_bundle_or_error)) { + script_web_bundle_ = + absl::get<ScriptWebBundle*>(script_web_bundle_or_error); + DCHECK(script_web_bundle_); + } + if (absl::holds_alternative<ScriptWebBundleError>( + script_web_bundle_or_error)) { + ScriptWebBundleError error = + absl::get<ScriptWebBundleError>(script_web_bundle_or_error); + // errors with type kSystemError should fire an error event silently + // for the user, while kParseError should report an exception. + switch (error.GetType()) { + case ScriptWebBundleError::Type::kSystemError: + element_->DispatchErrorEvent(); + break; + case ScriptWebBundleError::Type::kParseError: { + ScriptState* script_state = ToScriptStateForMainWorld( + To<LocalDOMWindow>(element_->GetExecutionContext()) + ->GetFrame()); + if (script_state->ContextIsValid()) { + ScriptState::Scope scope(script_state); + V8ScriptRunner::ReportException(script_state->GetIsolate(), + error.ToV8(script_state)); + } + } + } } return false; }
diff --git a/third_party/blink/renderer/modules/background_sync/periodic_sync_manager.cc b/third_party/blink/renderer/modules/background_sync/periodic_sync_manager.cc index 6be9541b..e37429db 100644 --- a/third_party/blink/renderer/modules/background_sync/periodic_sync_manager.cc +++ b/third_party/blink/renderer/modules/background_sync/periodic_sync_manager.cc
@@ -8,6 +8,8 @@ #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_background_sync_options.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" @@ -106,6 +108,17 @@ ScriptPromiseResolver* resolver, mojom::blink::BackgroundSyncError error, mojom::blink::SyncRegistrationOptionsPtr options) { + DCHECK(resolver); + + ScriptState* const resolver_script_state = resolver->GetScriptState(); + + if (!IsInParallelAlgorithmRunnable(resolver->GetExecutionContext(), + resolver_script_state)) { + return; + } + + ScriptState::Scope script_state_scope(resolver_script_state); + switch (error) { case mojom::blink::BackgroundSyncError::NONE: resolver->Resolve(); @@ -114,21 +127,25 @@ NOTREACHED(); break; case mojom::blink::BackgroundSyncError::STORAGE: - resolver->Reject(MakeGarbageCollected<DOMException>( - DOMExceptionCode::kUnknownError, "Unknown error.")); + resolver->Reject(V8ThrowDOMException::CreateOrDie( + resolver_script_state->GetIsolate(), DOMExceptionCode::kUnknownError, + "Unknown error.")); break; case mojom::blink::BackgroundSyncError::NOT_ALLOWED: - resolver->Reject(MakeGarbageCollected<DOMException>( + resolver->Reject(V8ThrowDOMException::CreateOrDie( + resolver_script_state->GetIsolate(), DOMExceptionCode::kInvalidAccessError, "Attempted to register a sync event without a " "window or registration tag too long.")); break; case mojom::blink::BackgroundSyncError::PERMISSION_DENIED: - resolver->Reject(MakeGarbageCollected<DOMException>( + resolver->Reject(V8ThrowDOMException::CreateOrDie( + resolver_script_state->GetIsolate(), DOMExceptionCode::kNotAllowedError, "Permission denied.")); break; case mojom::blink::BackgroundSyncError::NO_SERVICE_WORKER: - resolver->Reject(MakeGarbageCollected<DOMException>( + resolver->Reject(V8ThrowDOMException::CreateOrDie( + resolver_script_state->GetIsolate(), DOMExceptionCode::kInvalidStateError, "Registration failed - no active Service Worker")); break; @@ -139,6 +156,17 @@ ScriptPromiseResolver* resolver, mojom::blink::BackgroundSyncError error, WTF::Vector<mojom::blink::SyncRegistrationOptionsPtr> registrations) { + DCHECK(resolver); + + ScriptState* const resolver_script_state = resolver->GetScriptState(); + + if (!IsInParallelAlgorithmRunnable(resolver->GetExecutionContext(), + resolver_script_state)) { + return; + } + + ScriptState::Scope script_state_scope(resolver_script_state); + switch (error) { case mojom::blink::BackgroundSyncError::NONE: { Vector<String> tags; @@ -155,12 +183,14 @@ NOTREACHED(); break; case mojom::blink::BackgroundSyncError::STORAGE: - resolver->Reject(MakeGarbageCollected<DOMException>( - DOMExceptionCode::kUnknownError, "Unknown error.")); + resolver->Reject(V8ThrowDOMException::CreateOrDie( + resolver_script_state->GetIsolate(), DOMExceptionCode::kUnknownError, + "Unknown error.")); break; case mojom::blink::BackgroundSyncError::NO_SERVICE_WORKER: - resolver->Reject(MakeGarbageCollected<DOMException>( - DOMExceptionCode::kUnknownError, "No service worker is active.")); + resolver->Reject(V8ThrowDOMException::CreateOrDie( + resolver_script_state->GetIsolate(), DOMExceptionCode::kUnknownError, + "No service worker is active.")); break; } } @@ -168,17 +198,30 @@ void PeriodicSyncManager::UnregisterCallback( ScriptPromiseResolver* resolver, mojom::blink::BackgroundSyncError error) { + DCHECK(resolver); + + ScriptState* const resolver_script_state = resolver->GetScriptState(); + + if (!IsInParallelAlgorithmRunnable(resolver->GetExecutionContext(), + resolver_script_state)) { + return; + } + + ScriptState::Scope script_state_scope(resolver_script_state); + switch (error) { case mojom::blink::BackgroundSyncError::NONE: resolver->Resolve(); break; case mojom::blink::BackgroundSyncError::NO_SERVICE_WORKER: - resolver->Reject(MakeGarbageCollected<DOMException>( - DOMExceptionCode::kUnknownError, "No service worker is active.")); + resolver->Reject(V8ThrowDOMException::CreateOrDie( + resolver_script_state->GetIsolate(), DOMExceptionCode::kUnknownError, + "No service worker is active.")); break; case mojom::blink::BackgroundSyncError::STORAGE: - resolver->Reject(MakeGarbageCollected<DOMException>( - DOMExceptionCode::kUnknownError, "Unknown error.")); + resolver->Reject(V8ThrowDOMException::CreateOrDie( + resolver_script_state->GetIsolate(), DOMExceptionCode::kUnknownError, + "Unknown error.")); break; case mojom::blink::BackgroundSyncError::NOT_FOUND: case mojom::blink::BackgroundSyncError::NOT_ALLOWED:
diff --git a/third_party/blink/renderer/modules/background_sync/sync_manager.cc b/third_party/blink/renderer/modules/background_sync/sync_manager.cc index 2a552708..1c5bce7 100644 --- a/third_party/blink/renderer/modules/background_sync/sync_manager.cc +++ b/third_party/blink/renderer/modules/background_sync/sync_manager.cc
@@ -9,6 +9,8 @@ #include "third_party/blink/renderer/bindings/core/v8/callback_promise_adapter.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/modules/service_worker/service_worker_registration.h" @@ -70,12 +72,23 @@ ScriptPromiseResolver* resolver, mojom::blink::BackgroundSyncError error, mojom::blink::SyncRegistrationOptionsPtr options) { + DCHECK(resolver); + + ScriptState* const resolver_script_state = resolver->GetScriptState(); + + if (!IsInParallelAlgorithmRunnable(resolver->GetExecutionContext(), + resolver_script_state)) { + return; + } + + ScriptState::Scope script_state_scope(resolver_script_state); + // TODO(iclelland): Determine the correct error message to return in each case switch (error) { case mojom::blink::BackgroundSyncError::NONE: if (!options) { resolver->Resolve(v8::Null(resolver->GetScriptState()->GetIsolate())); - return; + break; } resolver->Resolve(); // Let the service know that the registration promise is resolved so that @@ -90,21 +103,25 @@ NOTREACHED(); break; case mojom::blink::BackgroundSyncError::STORAGE: - resolver->Reject(MakeGarbageCollected<DOMException>( - DOMExceptionCode::kUnknownError, "Background Sync is disabled.")); + resolver->Reject(V8ThrowDOMException::CreateOrDie( + resolver_script_state->GetIsolate(), DOMExceptionCode::kUnknownError, + "Background Sync is disabled.")); break; case mojom::blink::BackgroundSyncError::NOT_ALLOWED: - resolver->Reject(MakeGarbageCollected<DOMException>( + resolver->Reject(V8ThrowDOMException::CreateOrDie( + resolver_script_state->GetIsolate(), DOMExceptionCode::kInvalidAccessError, "Attempted to register a sync event without a " "window or registration tag too long.")); break; case mojom::blink::BackgroundSyncError::PERMISSION_DENIED: - resolver->Reject(MakeGarbageCollected<DOMException>( + resolver->Reject(V8ThrowDOMException::CreateOrDie( + resolver_script_state->GetIsolate(), DOMExceptionCode::kNotAllowedError, "Permission denied.")); break; case mojom::blink::BackgroundSyncError::NO_SERVICE_WORKER: - resolver->Reject(MakeGarbageCollected<DOMException>( + resolver->Reject(V8ThrowDOMException::CreateOrDie( + resolver_script_state->GetIsolate(), DOMExceptionCode::kInvalidStateError, "Registration failed - no active Service Worker")); break; @@ -116,6 +133,17 @@ ScriptPromiseResolver* resolver, mojom::blink::BackgroundSyncError error, WTF::Vector<mojom::blink::SyncRegistrationOptionsPtr> registrations) { + DCHECK(resolver); + + ScriptState* const resolver_script_state = resolver->GetScriptState(); + + if (!IsInParallelAlgorithmRunnable(resolver->GetExecutionContext(), + resolver_script_state)) { + return; + } + + ScriptState::Scope script_state_scope(resolver_script_state); + // TODO(iclelland): Determine the correct error message to return in each case switch (error) { case mojom::blink::BackgroundSyncError::NONE: { @@ -134,12 +162,14 @@ NOTREACHED(); break; case mojom::blink::BackgroundSyncError::STORAGE: - resolver->Reject(MakeGarbageCollected<DOMException>( - DOMExceptionCode::kUnknownError, "Background Sync is disabled.")); + resolver->Reject(V8ThrowDOMException::CreateOrDie( + resolver_script_state->GetIsolate(), DOMExceptionCode::kUnknownError, + "Background Sync is disabled.")); break; case mojom::blink::BackgroundSyncError::NO_SERVICE_WORKER: - resolver->Reject(MakeGarbageCollected<DOMException>( - DOMExceptionCode::kUnknownError, "No service worker is active.")); + resolver->Reject(V8ThrowDOMException::CreateOrDie( + resolver_script_state->GetIsolate(), DOMExceptionCode::kUnknownError, + "No service worker is active.")); break; } }
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_create_access_handle_options.idl b/third_party/blink/renderer/modules/file_system_access/file_system_create_access_handle_options.idl new file mode 100644 index 0000000..974a3de --- /dev/null +++ b/third_party/blink/renderer/modules/file_system_access/file_system_create_access_handle_options.idl
@@ -0,0 +1,10 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// https://github.com/WICG/file-system-access/blob/main/AccessHandle.md +enum FileSystemWriteMode { "in-place" }; + +dictionary FileSystemCreateAccessHandleOptions { + required FileSystemWriteMode mode; +};
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.cc b/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.cc index a5c43881..1896d45 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.cc +++ b/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.cc
@@ -9,6 +9,7 @@ #include "third_party/blink/public/mojom/file_system_access/file_system_access_file_writer.mojom-blink.h" #include "third_party/blink/public/mojom/file_system_access/file_system_access_transfer_token.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_file_system_create_access_handle_options.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_file_system_create_writable_options.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/fileapi/file.h" @@ -105,8 +106,8 @@ ScriptPromise FileSystemFileHandle::createSyncAccessHandle( ScriptState* script_state, + const FileSystemCreateAccessHandleOptions* /*options*/, ExceptionState& exception_state) { - // TODO(fivedots): Check if storage access is allowed. if (!mojo_ptr_.is_bound()) { exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, ""); return ScriptPromise();
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.h b/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.h index 0654b270..dfc5d488 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.h +++ b/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.h
@@ -12,6 +12,7 @@ namespace blink { class FileSystemCreateWritableOptions; +class FileSystemCreateAccessHandleOptions; class FileSystemFileHandle final : public FileSystemHandle { DEFINE_WRAPPERTYPEINFO(); @@ -29,9 +30,10 @@ ExceptionState&); ScriptPromise getFile(ScriptState*, ExceptionState&); - // TODO(fivedots): Define if this method should be generally exposed or only - // on files backed by the Origin Private File System. - ScriptPromise createSyncAccessHandle(ScriptState*, ExceptionState&); + ScriptPromise createSyncAccessHandle( + ScriptState*, + const FileSystemCreateAccessHandleOptions* options, + ExceptionState&); mojo::PendingRemote<mojom::blink::FileSystemAccessTransferToken> Transfer() override;
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.idl b/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.idl index eba6655..eba308f 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.idl +++ b/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.idl
@@ -20,7 +20,7 @@ Exposed=DedicatedWorker, RuntimeEnabled=FileSystemAccessAccessHandle, Measure - ] Promise<FileSystemSyncAccessHandle> createSyncAccessHandle(); + ] Promise<FileSystemSyncAccessHandle> createSyncAccessHandle(FileSystemCreateAccessHandleOptions options); [ CallWith=ScriptState,
diff --git a/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc b/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc index ad95a99..b581c71 100644 --- a/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc +++ b/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc
@@ -2493,19 +2493,31 @@ "accept": { "text/plain": ".txt" } + }, + { + "action": "/files4", + "accept": { + "text/csv": ".csv" + }, + "launch_type": "multiple-client" } ] })"); EXPECT_FALSE(IsManifestEmpty(manifest)); EXPECT_FALSE(manifest->file_handlers.IsEmpty()); - ASSERT_EQ(3U, manifest->file_handlers.size()); + ASSERT_EQ(4U, manifest->file_handlers.size()); EXPECT_EQ(mojom::blink::ManifestFileHandler::LaunchType::kMultipleClients, manifest->file_handlers[0]->launch_type); EXPECT_EQ(mojom::blink::ManifestFileHandler::LaunchType::kSingleClient, manifest->file_handlers[1]->launch_type); EXPECT_EQ(mojom::blink::ManifestFileHandler::LaunchType::kSingleClient, manifest->file_handlers[2]->launch_type); - EXPECT_EQ(0u, GetErrorCount()); + // This one has a typo. + EXPECT_EQ(mojom::blink::ManifestFileHandler::LaunchType::kSingleClient, + manifest->file_handlers[3]->launch_type); + ASSERT_EQ(1u, GetErrorCount()); + EXPECT_EQ("launch_type value 'multiple-client' ignored, unknown value.", + errors()[0]); } }
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_canvas_configuration.idl b/third_party/blink/renderer/modules/webgpu/gpu_canvas_configuration.idl index b9709c14..8498313 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_canvas_configuration.idl +++ b/third_party/blink/renderer/modules/webgpu/gpu_canvas_configuration.idl
@@ -4,9 +4,15 @@ // https://gpuweb.github.io/gpuweb/ +enum GPUCanvasCompositingAlphaMode { + "opaque", + "premultiplied", +}; + dictionary GPUCanvasConfiguration : GPUObjectDescriptorBase { required GPUDevice device; required GPUTextureFormat format; GPUTextureUsageFlags usage = 16; // GPUTextureUsage.RENDER_ATTACHMENT + GPUCanvasCompositingAlphaMode compositingAlphaMode; GPUExtent3D size; };
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc index b9f4a1e..baf50bb 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc
@@ -6,6 +6,7 @@ #include "components/viz/common/resources/resource_format_utils.h" #include "third_party/blink/renderer/bindings/core/v8/v8_union_htmlcanvaselement_offscreencanvas.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_canvas_compositing_alpha_mode.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_canvas_configuration.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_union_canvasrenderingcontext2d_gpucanvascontext_imagebitmaprenderingcontext_webgl2renderingcontext_webglrenderingcontext.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_union_gpucanvascontext_imagebitmaprenderingcontext_offscreencanvasrenderingcontext2d_webgl2renderingcontext_webglrenderingcontext.h" @@ -206,9 +207,20 @@ size = Host()->Size(); } + V8GPUCanvasCompositingAlphaMode::Enum alpha_mode = + V8GPUCanvasCompositingAlphaMode::Enum::kPremultiplied; + if (descriptor->hasCompositingAlphaMode()) { + alpha_mode = descriptor->compositingAlphaMode().AsEnum(); + } else { + configured_device_->AddConsoleWarning( + "The default GPUCanvasCompositingAlphaMode will change from \"premultiplied\" to \"opaque\". " + "Please explicitly pass \"premultiplied\" if you would like to " + "continue using that compositing mode."); + } swapchain_ = MakeGarbageCollected<GPUSwapChain>( - this, configured_device_, usage, format, filter_quality_, size); - swapchain_->CcLayer()->SetContentsOpaque(!CreationAttributes().alpha); + this, configured_device_, usage, format, filter_quality_, alpha_mode, + size); + if (descriptor->hasLabel()) swapchain_->setLabel(descriptor->label());
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_swap_chain.cc b/third_party/blink/renderer/modules/webgpu/gpu_swap_chain.cc index f3e12c1..e77c830 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_swap_chain.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_swap_chain.cc
@@ -19,22 +19,82 @@ namespace blink { -GPUSwapChain::GPUSwapChain(GPUCanvasContext* context, - GPUDevice* device, - WGPUTextureUsage usage, - WGPUTextureFormat format, - cc::PaintFlags::FilterQuality filter_quality, - gfx::Size size) +GPUSwapChain::GPUSwapChain( + GPUCanvasContext* context, + GPUDevice* device, + WGPUTextureUsage usage, + WGPUTextureFormat format, + cc::PaintFlags::FilterQuality filter_quality, + V8GPUCanvasCompositingAlphaMode::Enum compositing_alpha_mode, + gfx::Size size) : DawnObjectBase(device->GetDawnControlClient()), device_(device), context_(context), usage_(usage), format_(format), + compositing_alpha_mode_(compositing_alpha_mode), size_(size) { // TODO: Use label from GPUObjectDescriptorBase. swap_buffers_ = base::AdoptRef(new WebGPUSwapBufferProvider( this, GetDawnControlClient(), device->GetHandle(), usage_, format)); swap_buffers_->SetFilterQuality(filter_quality); + + // Note: SetContentsOpaque is only an optimization hint. It doesn't + // actually make the contents opaque. + switch (compositing_alpha_mode) { + case V8GPUCanvasCompositingAlphaMode::Enum::kOpaque: { + CcLayer()->SetContentsOpaque(true); + + WGPUShaderModuleWGSLDescriptor wgsl_desc = { + .chain = {.sType = WGPUSType_ShaderModuleWGSLDescriptor}, + .source = R"( + @stage(vertex) fn vert_main(@builtin(vertex_index) VertexIndex : u32) -> @builtin(position) vec4<f32> { + var pos = array<vec2<f32>, 3>( + vec2<f32>(-1.0, -1.0), + vec2<f32>( 3.0, -1.0), + vec2<f32>(-1.0, 3.0)); + return vec4<f32>(pos[VertexIndex], 0.0, 1.0); + } + + @stage(fragment) fn frag_main() -> @location(0) vec4<f32> { + return vec4<f32>(1.0); + } + )", + }; + WGPUShaderModuleDescriptor shader_module_desc = {.nextInChain = + &wgsl_desc.chain}; + WGPUShaderModule shader_module = GetProcs().deviceCreateShaderModule( + device_->GetHandle(), &shader_module_desc); + + WGPUColorTargetState color_target = { + .format = format_, + .writeMask = WGPUColorWriteMask_Alpha, + }; + WGPUFragmentState fragment = { + .module = shader_module, + .entryPoint = "frag_main", + .targetCount = 1, + .targets = &color_target, + }; + WGPURenderPipelineDescriptor pipeline_desc = { + .vertex = + { + .module = shader_module, + .entryPoint = "vert_main", + }, + .primitive = {.topology = WGPUPrimitiveTopology_TriangleList}, + .multisample = {.count = 1, .mask = 0xFFFFFFFF}, + .fragment = &fragment, + }; + alpha_to_one_pipeline_ = GetProcs().deviceCreateRenderPipeline( + device_->GetHandle(), &pipeline_desc); + GetProcs().shaderModuleRelease(shader_module); + break; + } + case V8GPUCanvasCompositingAlphaMode::Enum::kPremultiplied: + CcLayer()->SetContentsOpaque(false); + break; + } } GPUSwapChain::~GPUSwapChain() { @@ -48,6 +108,10 @@ } void GPUSwapChain::Neuter() { + if (alpha_to_one_pipeline_ != nullptr) { + GetProcs().renderPipelineRelease(alpha_to_one_pipeline_); + alpha_to_one_pipeline_ = nullptr; + } texture_ = nullptr; if (swap_buffers_) { swap_buffers_->Neuter(); @@ -310,6 +374,54 @@ // WebGPUSwapBufferProvider::Client implementation void GPUSwapChain::OnTextureTransferred() { DCHECK(texture_); + // The texture is about to be transferred to the compositor. + // For compositing alpha mode Opaque, clear the alpha channel to + // 1.0. + switch (compositing_alpha_mode_) { + case V8GPUCanvasCompositingAlphaMode::Enum::kOpaque: { + WGPUTextureView attachment_view = + GetProcs().textureCreateView(texture_->GetHandle(), nullptr); + + WGPUDawnEncoderInternalUsageDescriptor internal_usage_desc = { + .chain = {.sType = WGPUSType_DawnEncoderInternalUsageDescriptor}, + .useInternalUsages = true, + }; + WGPUCommandEncoderDescriptor command_encoder_desc = { + .nextInChain = &internal_usage_desc.chain, + }; + WGPUCommandEncoder command_encoder = + GetProcs().deviceCreateCommandEncoder(device_->GetHandle(), + &command_encoder_desc); + + WGPURenderPassColorAttachment color_attachment = { + .view = attachment_view, + .loadOp = WGPULoadOp_Load, + .storeOp = WGPUStoreOp_Store, + }; + WGPURenderPassDescriptor render_pass_desc = { + .colorAttachmentCount = 1, + .colorAttachments = &color_attachment, + }; + WGPURenderPassEncoder pass = GetProcs().commandEncoderBeginRenderPass( + command_encoder, &render_pass_desc); + DCHECK(alpha_to_one_pipeline_); + GetProcs().renderPassEncoderSetPipeline(pass, alpha_to_one_pipeline_); + GetProcs().renderPassEncoderDraw(pass, 3, 1, 0, 0); + GetProcs().renderPassEncoderEnd(pass); + + WGPUCommandBuffer command_buffer = + GetProcs().commandEncoderFinish(command_encoder, nullptr); + GetProcs().queueSubmit(device_->queue()->GetHandle(), 1, &command_buffer); + + GetProcs().renderPassEncoderRelease(pass); + GetProcs().commandEncoderRelease(command_encoder); + GetProcs().commandBufferRelease(command_buffer); + GetProcs().textureViewRelease(attachment_view); + break; + } + case V8GPUCanvasCompositingAlphaMode::Enum::kPremultiplied: + break; + } texture_ = nullptr; }
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_swap_chain.h b/third_party/blink/renderer/modules/webgpu/gpu_swap_chain.h index 3b6a89b..2e43efa 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_swap_chain.h +++ b/third_party/blink/renderer/modules/webgpu/gpu_swap_chain.h
@@ -5,6 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBGPU_GPU_SWAP_CHAIN_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBGPU_GPU_SWAP_CHAIN_H_ +#include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_canvas_compositing_alpha_mode.h" #include "third_party/blink/renderer/modules/webgpu/dawn_object.h" #include "third_party/blink/renderer/platform/graphics/gpu/webgpu_swap_buffer_provider.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" @@ -30,6 +31,7 @@ WGPUTextureUsage, WGPUTextureFormat, cc::PaintFlags::FilterQuality, + V8GPUCanvasCompositingAlphaMode::Enum, gfx::Size); GPUSwapChain(const GPUSwapChain&) = delete; @@ -77,11 +79,13 @@ Member<GPUDevice> device_; Member<GPUCanvasContext> context_; - WGPUTextureUsage usage_; - WGPUTextureFormat format_; + const WGPUTextureUsage usage_; + const WGPUTextureFormat format_; + const V8GPUCanvasCompositingAlphaMode::Enum compositing_alpha_mode_; const gfx::Size size_; Member<GPUTexture> texture_; + WGPURenderPipeline alpha_to_one_pipeline_ = nullptr; scoped_refptr<StaticBitmapImage> SnapshotInternal( const WGPUTexture& texture,
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc index 7d95e60..099d276 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
@@ -981,14 +981,8 @@ // If we cannot use overlay, we have to remove the scanout flag and the // concurrent read write flag. - bool disable_image_scanout = !is_gpu_memory_buffer_image_allowed; -#if !BUILDFLAG(IS_MAC) - // This check is inappropriate on macOS. - // https://crbug.com/1305679 - disable_image_scanout |= - is_accelerated && !capabilities.texture_storage_image; -#endif - if (disable_image_scanout) { + if (!is_gpu_memory_buffer_image_allowed || + (is_accelerated && !capabilities.texture_storage_image)) { shared_image_usage_flags &= ~gpu::SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE; shared_image_usage_flags &= ~gpu::SHARED_IMAGE_USAGE_SCANOUT; }
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc index 5a37d66..adddac3 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc
@@ -611,7 +611,7 @@ } if (RuntimeEnabledFeatures::FixedElementsDontOverscrollEnabled()) { - property_tree_manager.SetOverscrollNodeId( + property_tree_manager.SetOverscrollTransformNodeId( ids.overscroll_elasticity_transform); property_tree_manager.SetFixedElementsDontOverscroll(true); } @@ -690,6 +690,10 @@ int effect_id = property_tree_manager.SwitchToEffectNodeWithSynthesizedClip( effect, clip, layer.draws_content()); + if (RuntimeEnabledFeatures::FixedElementsDontOverscrollEnabled() && + transform.RequiresCompositingForFixedPosition()) + property_tree_manager.SetOverscrollClipNodeId(clip_id); + // We need additional bookkeeping for backdrop-filter mask. if (effect.RequiresCompositingForBackdropFilterMask() && effect.CcNodeId(g_s_property_tree_sequence_number) == effect_id) {
diff --git a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc index 63c46dfb..a90be406 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc
@@ -380,10 +380,14 @@ effect->render_surface_reason = reason; } -void PropertyTreeManager::SetOverscrollNodeId(const int id) { +void PropertyTreeManager::SetOverscrollTransformNodeId(const int id) { transform_tree_.set_overscroll_node_id(id); } +void PropertyTreeManager::SetOverscrollClipNodeId(const int id) { + clip_tree_.set_overscroll_node_id(id); +} + void PropertyTreeManager::SetFixedElementsDontOverscroll(const bool value) { transform_tree_.set_fixed_elements_dont_overscroll(value); }
diff --git a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.h b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.h index 327df5d..5385658 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.h +++ b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.h
@@ -115,7 +115,8 @@ int EnsureCompositorPageScaleTransformNode(const TransformPaintPropertyNode&); // Used to offset the scroll translation during overscroll. - void SetOverscrollNodeId(const int id); + void SetOverscrollTransformNodeId(const int id); + void SetOverscrollClipNodeId(const int id); void SetFixedElementsDontOverscroll(const bool value); // This function is expected to be invoked right before emitting each layer.
diff --git a/third_party/blink/renderer/platform/heap/thread_state.cc b/third_party/blink/renderer/platform/heap/thread_state.cc index d485431..ed418c0 100644 --- a/third_party/blink/renderer/platform/heap/thread_state.cc +++ b/third_party/blink/renderer/platform/heap/thread_state.cc
@@ -49,11 +49,6 @@ return false; } - bool IsRoot(const v8::TracedGlobal<v8::Value>& handle) final { - CHECK(false) << "Blink does not use v8::TracedGlobal."; - return false; - } - // ResetRoot() clears references to V8 wrapper objects in all worlds. It is // invoked for references where IsRoot() returned false during young // generation garbage collections.
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 432d4c89..3f68fb4 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1330,7 +1330,7 @@ { name: "LayoutNGBlockInInline", depends_on: ["LayoutNG"], - status: "test", + status: "stable", }, { // Block fragmentation support in the flex layout algorithm.
diff --git a/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc b/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc index c15a45b..98b5ef6 100644 --- a/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc +++ b/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc
@@ -127,17 +127,20 @@ } gfx::GpuMemoryBufferHandle TakeGpuMemoryBufferHandle() { -#if BUILDFLAG(IS_MAC) +#if BUILDFLAG(IS_MAC) or BUILDFLAG(IS_WIN) // The same GpuMemoryBuffersHandles will be reused repeatedly by the // unaccelerated macOS path. Each of these uses will call this function. // Ensure that this function doesn't invalidate the GpuMemoryBufferHandle // on macOS for this reason. // https://crbug.com/1159722 + // It will also be reused repeatedly if GPU process is unavailable in + // Windows zero-copy path (e.g. due to repeated GPU process crashes). return gmb_resources_->gpu_memory_buffer_handle.Clone(); #else return std::move(gmb_resources_->gpu_memory_buffer_handle); #endif } + void SetGpuMemoryBuffer( std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer) { gmb_resources_->gpu_memory_buffer = std::move(gpu_memory_buffer); @@ -173,6 +176,16 @@ } } + // Public because it may be called after initialization when GPU process + // dies on Windows to wrap premapped GMBs. + void InitializeFromUnsafeShmemRegion(base::UnsafeSharedMemoryRegion region) { + DCHECK(region.IsValid()); + backup_mapping_ = region.Map(); + DCHECK(backup_mapping_.IsValid()); + data_ = backup_mapping_.GetMemoryAsSpan<uint8_t>().data(); + data_size_ = backup_mapping_.size(); + } + private: void InitializeFromSharedMemory(mojo::ScopedSharedBufferHandle handle) { DCHECK(handle.is_valid()); @@ -236,6 +249,11 @@ // Only valid for |buffer_type_ == READ_ONLY_SHMEM_REGION|. base::ReadOnlySharedMemoryMapping read_only_mapping_; + // Only valid for |buffer_type == GPU_MEMORY_BUFFER_HANDLE| + // if on windows, gpu_factories are unavailable, and + // GMB comes premapped from the capturer. + base::WritableSharedMemoryMapping backup_mapping_; + // These point into one of the above mappings, which hold the mapping open for // the lifetime of this object. const uint8_t* data_ = nullptr; @@ -364,6 +382,37 @@ break; } #endif +#if BUILDFLAG(IS_WIN) + // On Windows it might happen that the Renderer process loses GPU + // connection, while the capturer process will continue to produce + // GPU backed frames. + if (!video_capture_impl_.gpu_factories_ || + !video_capture_impl_.media_task_runner_) { + video_capture_impl_.RequirePremappedFrames(); + if (!frame_info_->is_premapped) { + // If the frame isn't premapped, can't do anything here. + return false; + } + if (!buffer_context_->data()) { + auto gmb_handle = buffer_context_->TakeGpuMemoryBufferHandle(); + buffer_context_->InitializeFromUnsafeShmemRegion( + std::move(gmb_handle.region)); + } + DCHECK(buffer_context_->data()); + + frame_ = media::VideoFrame::WrapExternalData( + frame_info_->pixel_format, gfx::Size(frame_info_->coded_size), + gfx::Rect(frame_info_->visible_rect), + frame_info_->visible_rect.size(), + const_cast<uint8_t*>(buffer_context_->data()), + buffer_context_->data_size(), frame_info_->timestamp); + + if (!frame_) { + return false; + } + break; + } +#endif CHECK(video_capture_impl_.gpu_factories_); CHECK(video_capture_impl_.media_task_runner_); // Create GpuMemoryBuffer from handle. @@ -851,10 +900,10 @@ OnFrameDropped( media::VideoCaptureFrameDropReason::kVideoCaptureImplNotInStartedState); GetVideoCaptureHost()->ReleaseBuffer(device_id_, buffer->buffer_id, - media::VideoCaptureFeedback()); + DefaultFeedback()); for (auto& scaled_buffer : scaled_buffers) { GetVideoCaptureHost()->ReleaseBuffer(device_id_, scaled_buffer->buffer_id, - media::VideoCaptureFeedback()); + DefaultFeedback()); } return; } @@ -909,6 +958,14 @@ scaled_frame_preparers.push_back(std::move(scaled_frame_preparer)); } if (!init_successful) { + OnFrameDropped(media::VideoCaptureFrameDropReason:: + kVideoCaptureImplFailedToWrapDataAsMediaVideoFrame); + GetVideoCaptureHost()->ReleaseBuffer( + device_id_, frame_preparer->buffer_id(), DefaultFeedback()); + for (auto& scaled_frame_preparer : scaled_frame_preparers) { + GetVideoCaptureHost()->ReleaseBuffer( + device_id_, scaled_frame_preparer->buffer_id(), DefaultFeedback()); + } return; } @@ -983,11 +1040,10 @@ kVideoCaptureImplFailedToWrapDataAsMediaVideoFrame); // Release all buffers. GetVideoCaptureHost()->ReleaseBuffer( - device_id_, frame_preparer->buffer_id(), media::VideoCaptureFeedback()); + device_id_, frame_preparer->buffer_id(), DefaultFeedback()); for (const auto& scaled_frame_preparer : scaled_frame_preparers) { - GetVideoCaptureHost()->ReleaseBuffer(device_id_, - scaled_frame_preparer->buffer_id(), - media::VideoCaptureFeedback()); + GetVideoCaptureHost()->ReleaseBuffer( + device_id_, scaled_frame_preparer->buffer_id(), DefaultFeedback()); } return; } @@ -1059,6 +1115,9 @@ buffer_context = nullptr; #endif + if (require_premapped_frames_) { + feedback_.require_mapped_frame = true; + } GetVideoCaptureHost()->ReleaseBuffer(device_id_, buffer_id, feedback_); feedback_ = media::VideoCaptureFeedback(); } @@ -1181,6 +1240,16 @@ feedback_ = feedback; } +void VideoCaptureImpl::RequirePremappedFrames() { + require_premapped_frames_ = true; +} + +media::VideoCaptureFeedback VideoCaptureImpl::DefaultFeedback() { + media::VideoCaptureFeedback feedback; + feedback.require_mapped_frame = require_premapped_frames_; + return feedback; +} + base::WeakPtr<VideoCaptureImpl> VideoCaptureImpl::GetWeakPtr() { return weak_this_; }
diff --git a/third_party/blink/renderer/platform/video_capture/video_capture_impl.h b/third_party/blink/renderer/platform/video_capture/video_capture_impl.h index a8366dbd..e6c8eb58 100644 --- a/third_party/blink/renderer/platform/video_capture/video_capture_impl.h +++ b/third_party/blink/renderer/platform/video_capture/video_capture_impl.h
@@ -236,6 +236,13 @@ void SetGpuFactoriesHandleOnIOTaskRunner( media::GpuVideoAcceleratorFactories* gpu_factories); + // Sets fallback mode which will make it always request + // premapped frames from the capturer. + void RequirePremappedFrames(); + + // Generates feedback accounding for premapped frames requirement. + media::VideoCaptureFeedback DefaultFeedback(); + // |device_id_| and |session_id_| are different concepts, but we reuse the // same numerical value, passed on construction. const base::UnguessableToken device_id_; @@ -284,6 +291,8 @@ // Only accessed on the IO thread. media::VideoCaptureFeedback feedback_; + bool require_premapped_frames_ = false; + THREAD_CHECKER(io_thread_checker_); base::OneShotTimer startup_timeout_;
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng index 2625522..ef22101d 100644 --- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng +++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -917,7 +917,6 @@ crbug.com/1145970 inspector-protocol/css/container-queries/* [ Skip ] crbug.com/1145970 inspector-protocol/dom/container-queries/* [ Skip ] crbug.com/1145970 inspector-protocol/overlay/overlay-container-query.js [ Skip ] -crbug.com/1145970 wpt_internal/css/css-conditional/container-queries/* [ Skip ] ### virtual/controls-refresh-hc/ virtual/controls-refresh-hc/* [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 3e650524..d137b67 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -2602,10 +2602,6 @@ crbug.com/1229463 [ Mac ] virtual/oopr-canvas2d/fast/canvas/canvas-largedraws.html [ Crash ] crbug.com/1229486 virtual/oopr-canvas2d/fast/canvas/canvas-incremental-repaint.html [ Failure ] -# Bugs caused by enabling overlay support on OOPR-Canvas on macOS -crbug.com/1305679 [ Mac ] virtual/oopr-canvas2d/fast/canvas/OffscreenCanvas-2d-gradients-in-worker.html [ Failure ] -crbug.com/1305679 [ Mac ] virtual/oopr-canvas2d/fast/canvas/OffscreenCanvas-paths-in-worker.html [ Failure ] - # Temporarily disabled after chromium change crbug.com/492511 [ Mac ] virtual/text-antialias/atsui-negative-spacing-features.html [ Failure ] crbug.com/492511 [ Mac ] virtual/text-antialias/international/arabic-justify.html [ Failure ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index 101d20e..37251c11 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1038,11 +1038,6 @@ "args": ["--js-flags=--experimental-async-stack-tagging-api"] }, { - "prefix": "change-service-worker-priority-when-client-foreground-state-change", - "bases": ["external/wpt/service-workers"], - "args": ["--enable-features=ChangeServiceWorkerPriorityForClientForegroundStateChange"] - }, - { "prefix": "system-color-picker-appearance", "bases": ["fast/forms/color-scheme/color/color-picker-appearance.html"], "args": ["--enable-features=SystemColorChooser"]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/canvas-as-container-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/canvas-as-container-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/canvas-as-container-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/canvas-as-container-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/chrome-bug-1289718-000-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/chrome-bug-1289718-000-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/chrome-bug-1289718-000-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/chrome-bug-1289718-000-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/chrome-bug-1289718-001-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/chrome-bug-1289718-001-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/chrome-bug-1289718-001-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/chrome-bug-1289718-001-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/columns-in-table-001-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/columns-in-table-001-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/columns-in-table-001-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/columns-in-table-001-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/container-type-change-chrome-legacy-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/container-type-change-chrome-legacy-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/container-type-change-chrome-legacy-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/container-type-change-chrome-legacy-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/flex-in-columns-000-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/flex-in-columns-000-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/flex-in-columns-000-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/flex-in-columns-000-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/flex-in-columns-001-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/flex-in-columns-001-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/flex-in-columns-001-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/flex-in-columns-001-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/flex-in-columns-002-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/flex-in-columns-002-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/flex-in-columns-002-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/flex-in-columns-002-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/flex-in-columns-003-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/flex-in-columns-003-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/flex-in-columns-003-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/flex-in-columns-003-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/focus-inside-content-visibility-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/focus-inside-content-visibility-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/focus-inside-content-visibility-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/focus-inside-content-visibility-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/grid-in-columns-000-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/grid-in-columns-000-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/grid-in-columns-000-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/grid-in-columns-000-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/grid-in-columns-001-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/grid-in-columns-001-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/grid-in-columns-001-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/grid-in-columns-001-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/grid-in-columns-002-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/grid-in-columns-002-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/grid-in-columns-002-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/grid-in-columns-002-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/grid-in-columns-003-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/grid-in-columns-003-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/grid-in-columns-003-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/grid-in-columns-003-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/inline-multicol-inside-container-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/inline-multicol-inside-container-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/inline-multicol-inside-container-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/inline-multicol-inside-container-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/inline-with-columns-000-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/inline-with-columns-000-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/inline-with-columns-000-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/inline-with-columns-000-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/inline-with-columns-001-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/inline-with-columns-001-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/inline-with-columns-001-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/inline-with-columns-001-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/input-column-group-container-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/input-column-group-container-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/input-column-group-container-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/input-column-group-container-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/input-placeholder-inline-size-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/input-placeholder-inline-size-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/input-placeholder-inline-size-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/input-placeholder-inline-size-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/math-block-container-child-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/math-block-container-child-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/math-block-container-child-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/math-block-container-child-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/pseudo-container-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/pseudo-container-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/pseudo-container-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/pseudo-container-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/svg-layout-root-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/svg-layout-root-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/svg-layout-root-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/svg-layout-root-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/svg-text-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/svg-text-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/svg-text-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/svg-text-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/table-in-columns-000-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/table-in-columns-000-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/table-in-columns-000-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/table-in-columns-000-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/table-in-columns-001-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/table-in-columns-001-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/table-in-columns-001-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/table-in-columns-001-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/table-in-columns-002-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/table-in-columns-002-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/table-in-columns-002-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/table-in-columns-002-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/table-in-columns-003-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/table-in-columns-003-crash.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/table-in-columns-003-crash.html rename to third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/table-in-columns-003-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/layout-dependent-focus-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/layout-dependent-focus-expected.txt new file mode 100644 index 0000000..c69221b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/layout-dependent-focus-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL Verify that onblur is called on hidden input assert_unreached: Event listener for 'blur' not called Reached unreachable code +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/layout-dependent-focus.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/layout-dependent-focus.html new file mode 100644 index 0000000..a16370a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/layout-dependent-focus.html
@@ -0,0 +1,39 @@ +<!doctype html> +<title>CSS Container Queries: Input losing focus as a result of a size query</title> +<link rel="help" href="https://drafts.csswg.org/css-contain-3/#size-container"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/cq-testcommon.js"></script> +<style> + #container { + container-type: inline-size; + width: 200px; + } + #container.narrow { + width: 100px; + } + @container (width = 100px) { + #inner.hide { visibility: hidden; } + } +</style> +<div id="outer"> + <div id="container"> + <input type="text" id="inner"> + </div> +</div> +<script> + setup(() => assert_implements_container_queries()); + + let hide_test = async_test("Verify that onblur is called on hidden input"); + onload = () => { + inner.addEventListener("blur", () => hide_test.done()); + inner.focus(); + inner.className = "hide"; + container.className = "narrow"; + requestAnimationFrame(() => { + requestAnimationFrame(() => { + hide_test.step(() => assert_unreached("Event listener for 'blur' not called")); + }); + }); + }; +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/visited-inheritance-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/visited-inheritance-ref.html new file mode 100644 index 0000000..64300b1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/visited-inheritance-ref.html
@@ -0,0 +1,14 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>inherited link color when modifying parent</title> +<link rel="author" title="Steinar H. Gunderson" href="mailto:sesse@chromium.org"> +<link rel="help" href="https://www.w3.org/TR/css3-selectors/#selectors"> +<style> + div { color: green; } + a { color: green; } +</style> +<main> + <div id="parentdiv"> + <a href="" id="link">Visited link should be green</a> + </div> +</main>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/visited-inheritance.html b/third_party/blink/web_tests/external/wpt/css/selectors/visited-inheritance.html new file mode 100644 index 0000000..1442307 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/visited-inheritance.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>inherited link color when modifying parent</title> +<link rel="author" title="Steinar H. Gunderson" href="mailto:sesse@chromium.org"> +<link rel="match" href="visited-inheritance-ref.html"> +<link rel="help" href="https://www.w3.org/TR/css3-selectors/#selectors"> +<style> + div { color: red; } + a { color: inherit; } +</style> +<main> + <div id="parentdiv"> + <a href="" id="link">Visited link should be green</a> + </div> + <script> + link.offsetTop; + parentdiv.style.color = 'green'; + </script> +</main>
diff --git a/third_party/blink/web_tests/external/wpt/file-system-access/resources/message-target.js b/third_party/blink/web_tests/external/wpt/file-system-access/resources/message-target.js index 211caeb..175d139 100644 --- a/third_party/blink/web_tests/external/wpt/file-system-access/resources/message-target.js +++ b/third_party/blink/web_tests/external/wpt/file-system-access/resources/message-target.js
@@ -108,7 +108,8 @@ // success to the sender. let success = true; try { - const access_handle = await message_data.file_handle.createSyncAccessHandle(); + const access_handle = await message_data.file_handle + .createSyncAccessHandle({mode: "in-place"}); await access_handle.close(); } catch (error) { success = false;
diff --git a/third_party/blink/web_tests/external/wpt/file-system-access/resources/sync-access-handle-test.js b/third_party/blink/web_tests/external/wpt/file-system-access/resources/sync-access-handle-test.js index ec13ff9a..489eeb8 100644 --- a/third_party/blink/web_tests/external/wpt/file-system-access/resources/sync-access-handle-test.js +++ b/third_party/blink/web_tests/external/wpt/file-system-access/resources/sync-access-handle-test.js
@@ -10,7 +10,8 @@ await cleanupSandboxedFileSystem(); const dir = await navigator.storage.getDirectory(); const fileHandle = await dir.getFileHandle('OPFS.test', {create: true}); - const syncHandle = await fileHandle.createSyncAccessHandle(); + const syncHandle = await fileHandle + .createSyncAccessHandle({mode: "in-place"}); await test(t, syncHandle); await syncHandle.close(); }, description);
diff --git a/third_party/blink/web_tests/external/wpt/file-system-access/sandboxed_FileSystemFileHandle-sync-access-handle-writable-lock.https.tentative.worker.js b/third_party/blink/web_tests/external/wpt/file-system-access/sandboxed_FileSystemFileHandle-sync-access-handle-writable-lock.https.tentative.worker.js index a2ed99d..51e7f63 100644 --- a/third_party/blink/web_tests/external/wpt/file-system-access/sandboxed_FileSystemFileHandle-sync-access-handle-writable-lock.https.tentative.worker.js +++ b/third_party/blink/web_tests/external/wpt/file-system-access/sandboxed_FileSystemFileHandle-sync-access-handle-writable-lock.https.tentative.worker.js
@@ -6,12 +6,12 @@ directory_test(async (t, root_dir) => { const fileHandle = await root_dir.getFileHandle('OPFS.test', {create: true}); - const syncHandle1 = await fileHandle.createSyncAccessHandle(); + const syncHandle1 = await fileHandle.createSyncAccessHandle({mode: "in-place"}); await promise_rejects_dom( - t, 'InvalidStateError', fileHandle.createSyncAccessHandle()); + t, 'InvalidStateError', fileHandle.createSyncAccessHandle({mode: "in-place"})); await syncHandle1.close(); - const syncHandle2 = await fileHandle.createSyncAccessHandle(); + const syncHandle2 = await fileHandle.createSyncAccessHandle({mode: "in-place"}); await syncHandle2.close(); }, 'There can only be one open access handle at any given time'); @@ -19,15 +19,15 @@ const fooFileHandle = await root_dir.getFileHandle('foo.test', {create: true}); const barFileHandle = await root_dir.getFileHandle('bar.test', {create: true}); - const fooSyncHandle = await fooFileHandle.createSyncAccessHandle(); + const fooSyncHandle = await fooFileHandle.createSyncAccessHandle({mode: "in-place"}); t.add_cleanup(() => fooSyncHandle.close()); - const barSyncHandle1 = await barFileHandle.createSyncAccessHandle(); + const barSyncHandle1 = await barFileHandle.createSyncAccessHandle({mode: "in-place"}); await promise_rejects_dom( - t, 'InvalidStateError', barFileHandle.createSyncAccessHandle()); + t, 'InvalidStateError', barFileHandle.createSyncAccessHandle({mode: "in-place"})); await barSyncHandle1.close(); - const barSyncHandle2 = await barFileHandle.createSyncAccessHandle(); + const barSyncHandle2 = await barFileHandle.createSyncAccessHandle({mode: "in-place"}); await barSyncHandle2.close(); }, 'An access handle from one file does not interfere with the creation of an' + ' access handle on another file'); @@ -39,7 +39,7 @@ const fooWritable = await fooFileHandle.createWritable(); t.add_cleanup(() => fooWritable.close()); - const barSyncHandle = await barFileHandle.createSyncAccessHandle(); + const barSyncHandle = await barFileHandle.createSyncAccessHandle({mode: "in-place"}); t.add_cleanup(() => barSyncHandle.close()); }, 'A writable stream from one file does not interfere with the creation of an' + ' access handle on another file'); @@ -48,7 +48,7 @@ const fooFileHandle = await root_dir.getFileHandle('foo.test', {create: true}); const barFileHandle = await root_dir.getFileHandle('bar.test', {create: true}); - const fooSyncHandle = await fooFileHandle.createSyncAccessHandle(); + const fooSyncHandle = await fooFileHandle.createSyncAccessHandle({mode: "in-place"}); t.add_cleanup(() => fooSyncHandle.close()); const barWritable = await barFileHandle.createWritable(); @@ -59,7 +59,7 @@ directory_test(async (t, root_dir) => { const fileHandle = await root_dir.getFileHandle('OPFS.test', {create: true}); - const syncHandle = await fileHandle.createSyncAccessHandle(); + const syncHandle = await fileHandle.createSyncAccessHandle({mode: "in-place"}); await promise_rejects_dom( t, 'InvalidStateError', fileHandle.createWritable()); @@ -74,14 +74,14 @@ const writable1 = await fileHandle.createWritable(); const writable2 = await fileHandle.createWritable(); await promise_rejects_dom( - t, 'InvalidStateError', fileHandle.createSyncAccessHandle()); + t, 'InvalidStateError', fileHandle.createSyncAccessHandle({mode: "in-place"})); await writable1.close(); await promise_rejects_dom( - t, 'InvalidStateError', fileHandle.createSyncAccessHandle()); + t, 'InvalidStateError', fileHandle.createSyncAccessHandle({mode: "in-place"})); await writable2.close(); - const syncHandle = await fileHandle.createSyncAccessHandle(); + const syncHandle = await fileHandle.createSyncAccessHandle({mode: "in-place"}); await syncHandle.close(); }, 'Access handles cannot be created if there are open Writable streams');
diff --git a/third_party/blink/web_tests/external/wpt/web-bundle/subresource-loading/script-invalid-json.https.tentative.html b/third_party/blink/web_tests/external/wpt/web-bundle/subresource-loading/script-invalid-json.https.tentative.html new file mode 100644 index 0000000..57bd82c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/web-bundle/subresource-loading/script-invalid-json.https.tentative.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<title>WebBundle subresource loading with script API and invalid JSON</title> +<link + rel="help" + href="https://github.com/WICG/webpackage/blob/main/explainers/subresource-loading.md" +/> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> + <script> + setup(() => { + assert_true(HTMLScriptElement.supports('webbundle')); + }, {allow_uncaught_exception: true}); + </script> + <script> + promise_test((t) => { + const script = document.createElement("script"); + script.type = "webbundle"; + const json_rule = {"resources": []}; + script.textContent = JSON.stringify(json_rule); + return new Promise(((resolve, reject) => { + script.onload = () => reject(script); + script.onerror = () => reject(script); + window.onerror = function (message, url, line, col, error) { + assert_equals(message, "Uncaught SyntaxError: Failed to parse web bundle: invalid JSON"); + assert_equals(error.name, "SyntaxError"); + resolve(script); + } + document.body.appendChild(script); + })); + }, "Invalid JSON rule should make the script loader report an exception and throw error on the window."); + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/webrtc-svc/RTCRtpParameters-scalability-expected.txt b/third_party/blink/web_tests/external/wpt/webrtc-svc/RTCRtpParameters-scalability-expected.txt new file mode 100644 index 0000000..79d1d575 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webrtc-svc/RTCRtpParameters-scalability-expected.txt
@@ -0,0 +1,30 @@ +This is a testharness.js-based test. +PASS [0] video/VP8 - L1T2 should produce valid video content +PASS [1] video/VP8 - L1T3 should produce valid video content +PASS [2] video/VP9 - L1T2 should produce valid video content +PASS [3] video/VP9 - L1T3 should produce valid video content +PASS [4] video/AV1 - L1T2 should produce valid video content +PASS [5] video/AV1 - L1T3 should produce valid video content +PASS [6] video/AV1 - L2T1 should produce valid video content +PASS [7] video/AV1 - L2T1h should produce valid video content +PASS [8] video/AV1 - L2T1_KEY should produce valid video content +PASS [9] video/AV1 - L2T2 should produce valid video content +PASS [10] video/AV1 - L2T2_KEY should produce valid video content +PASS [11] video/AV1 - L2T2_KEY_SHIFT should produce valid video content +PASS [12] video/AV1 - L3T1 should produce valid video content +PASS [13] video/AV1 - L3T3 should produce valid video content +PASS [14] video/AV1 - L3T3_KEY should produce valid video content +PASS [15] video/AV1 - S2T1 should produce valid video content +PASS Setting and updating scalabilityMode to a legal value should be accepted +PASS Sender capabilities should include at least some scalability modes +PASS Not setting sendEncodings results in no mode info before negotiation +PASS Not setting a scalability mode results in no mode set before negotiation +FAIL Not setting a scalability mode results in some mode set after negotiation assert_true: expected true got false +FAIL Setting a scalability mode to nonsense throws an exception assert_throws_dom: function "() => { + pc.addTransceiver('video', { + sendEncodings: [{scalabilityMode: 'TotalNonsense'}], + }); + }" did not throw +FAIL L3T3 on VP8 should return something other than L3T3 assert_not_equals: got disallowed value "L3T3" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/webrtc-svc/RTCRtpParameters-scalability.html b/third_party/blink/web_tests/external/wpt/webrtc-svc/RTCRtpParameters-scalability.html index 52907af5..c32a128 100644 --- a/third_party/blink/web_tests/external/wpt/webrtc-svc/RTCRtpParameters-scalability.html +++ b/third_party/blink/web_tests/external/wpt/webrtc-svc/RTCRtpParameters-scalability.html
@@ -84,4 +84,81 @@ assert_true(svcSupported); }, `Sender capabilities should include at least some scalability modes`); +promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const { sender } = pc.addTransceiver('video'); + const param = sender.getParameters(); + assert_equals(param.encodings.length, 0); +}, 'Not setting sendEncodings results in no mode info before negotiation'); + +promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const { sender } = pc.addTransceiver('video', { + sendEncodings: [{}], + }); + const param = sender.getParameters(); + const encoding = getFirstEncoding(param); + + assert_true(!('scalabilityMode' in encoding)); +}, 'Not setting a scalability mode results in no mode set before negotiation'); + +promise_test(async t => { + const pc1 = new RTCPeerConnection(); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + t.add_cleanup(() => pc2.close()); + const { sender } = pc1.addTransceiver('video', { + sendEncodings: [{}], + }); + const param = sender.getParameters(); + const encoding = getFirstEncoding(param); + + exchangeIceCandidates(pc1, pc2); + await exchangeOfferAnswer(pc1, pc2); + const param2 = sender.getParameters(); + const encoding2 = getFirstEncoding(param); + assert_true('scalabilityMode' in encoding2); +}, 'Not setting a scalability mode results in some mode set after negotiation'); + +promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + assert_throws_dom('OperationError', () => { + pc.addTransceiver('video', { + sendEncodings: [{scalabilityMode: 'TotalNonsense'}], + }); + }); +}, 'Setting a scalability mode to nonsense throws an exception'); + + +promise_test(async t => { + const v = document.createElement('video'); + v.autoplay = true; + const pc1 = new RTCPeerConnection(); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + t.add_cleanup(() => pc2.close()); + const transceiver = pc1.addTransceiver('video', { + sendEncodings: [{ scalabilityMode: 'L3T3' }], + }); + // Before negotiation, the mode should be preserved. + const param = transceiver.sender.getParameters(); + const encoding = getFirstEncoding(param); + assert_true('scalabilityMode' in encoding); + // If L3T3 is not supported at all, abort test. + assert_implements_optional(encoding.scalabilityMode === 'L3T3'); + // Pick a codec known to not have L3T3 support + const capabilities = RTCRtpSender.getCapabilities('video'); + const codec = capabilities.codecs.find(c => c.mimeType === 'video/VP8'); + assert_true(codec !== undefined); + transceiver.setCodecPreferences([codec]); + exchangeIceCandidates(pc1, pc2); + await exchangeOfferAnswer(pc1, pc2); + const sendParams = pc1.getSenders()[0].getParameters(); + assert_not_equals(sendParams.encodings[0].scalabilityMode, 'L3T3'); +}, 'L3T3 on VP8 should return something other than L3T3'); + + </script>
diff --git a/third_party/blink/web_tests/fast/webgl/texImage-imageBitmap-from-blob-resize-expected.png b/third_party/blink/web_tests/fast/webgl/texImage-imageBitmap-from-blob-resize-expected.png index 96a00e7..3b06f5d 100644 --- a/third_party/blink/web_tests/fast/webgl/texImage-imageBitmap-from-blob-resize-expected.png +++ b/third_party/blink/web_tests/fast/webgl/texImage-imageBitmap-from-blob-resize-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/fast/webgl/texImage-imageBitmap-from-canvas-resize-expected.png b/third_party/blink/web_tests/fast/webgl/texImage-imageBitmap-from-canvas-resize-expected.png index 96a00e7..3b06f5d 100644 --- a/third_party/blink/web_tests/fast/webgl/texImage-imageBitmap-from-canvas-resize-expected.png +++ b/third_party/blink/web_tests/fast/webgl/texImage-imageBitmap-from-canvas-resize-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/fast/webgl/texImage-imageBitmap-from-image-resize-expected.png b/third_party/blink/web_tests/fast/webgl/texImage-imageBitmap-from-image-resize-expected.png index 96a00e7..3b06f5d 100644 --- a/third_party/blink/web_tests/fast/webgl/texImage-imageBitmap-from-image-resize-expected.png +++ b/third_party/blink/web_tests/fast/webgl/texImage-imageBitmap-from-image-resize-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/fast/webgl/texImage-imageBitmap-from-offscreen-canvas-resize-expected.png b/third_party/blink/web_tests/fast/webgl/texImage-imageBitmap-from-offscreen-canvas-resize-expected.png index 96a00e7..3b06f5d 100644 --- a/third_party/blink/web_tests/fast/webgl/texImage-imageBitmap-from-offscreen-canvas-resize-expected.png +++ b/third_party/blink/web_tests/fast/webgl/texImage-imageBitmap-from-offscreen-canvas-resize-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-image-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-image-01-b-expected.png index 9912c71..7cc5f3e 100644 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-image-01-b-expected.png +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-image-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-image-01-b-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-image-01-b-expected.png index 9912c71..7cc5f3e 100644 --- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-image-01-b-expected.png +++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-image-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png new file mode 100644 index 0000000..4d9c5ba --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/webgl/texImage-imageBitmap-from-blob-resize-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/webgl/texImage-imageBitmap-from-blob-resize-expected.png new file mode 100644 index 0000000..3b06f5d --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/webgl/texImage-imageBitmap-from-blob-resize-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png new file mode 100644 index 0000000..4d9c5ba --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/webgl/texImage-imageBitmap-from-blob-resize-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/webgl/texImage-imageBitmap-from-blob-resize-expected.png new file mode 100644 index 0000000..96a00e7 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.14/fast/webgl/texImage-imageBitmap-from-blob-resize-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/images/color-profile-drag-image-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/images/color-profile-drag-image-expected.png index b72d43f..df2c1c12 100644 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/images/color-profile-drag-image-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/images/color-profile-drag-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/filters-image-01-b-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/filters-image-01-b-expected.png index b774321..b80081be 100644 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/filters-image-01-b-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/filters-image-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/filters/feImage-preserveAspectRatio-all-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/filters/feImage-preserveAspectRatio-all-expected.png deleted file mode 100644 index 69c22c71..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/filters/feImage-preserveAspectRatio-all-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/exotic-color-space/images/color-profile-drag-image-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/exotic-color-space/images/color-profile-drag-image-expected.png index b72d43f..df2c1c12 100644 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/exotic-color-space/images/color-profile-drag-image-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/exotic-color-space/images/color-profile-drag-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/gpu-rasterization/images/color-profile-drag-image-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/gpu-rasterization/images/color-profile-drag-image-expected.png index b72d43f..df2c1c12 100644 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/gpu-rasterization/images/color-profile-drag-image-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/gpu-rasterization/images/color-profile-drag-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/images/color-profile-drag-image-expected.png b/third_party/blink/web_tests/platform/mac/images/color-profile-drag-image-expected.png index c8912e9..91ab721d 100644 --- a/third_party/blink/web_tests/platform/mac/images/color-profile-drag-image-expected.png +++ b/third_party/blink/web_tests/platform/mac/images/color-profile-drag-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-image-01-b-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-image-01-b-expected.png index eca6e0c..ffcf368 100644 --- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-image-01-b-expected.png +++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-image-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png deleted file mode 100644 index 2a09fd9..0000000 --- a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-fill-expected.png b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-fill-expected.png deleted file mode 100644 index 8e1fd7d..0000000 --- a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-fill-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png index 47b0fb2..59b3fa8 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-composite-transformclip-expected.png b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-composite-transformclip-expected.png deleted file mode 100644 index 3fd6dde..0000000 --- a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-composite-transformclip-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png deleted file mode 100644 index b3cbc604..0000000 --- a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png deleted file mode 100644 index 8740310..0000000 --- a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-connecting-line-expected.png b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-connecting-line-expected.png deleted file mode 100644 index b4021b6..0000000 --- a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-connecting-line-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png index dc696cf1..5a990a08 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png deleted file mode 100644 index 84989fd4..0000000 --- a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-text-baseline-expected.png b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-text-baseline-expected.png index d487eae..6774bff 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-text-baseline-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-text-baseline-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-zero-length-lineCap-expected.png b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-zero-length-lineCap-expected.png deleted file mode 100644 index b84e40c640..0000000 --- a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-zero-length-lineCap-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/image-object-in-canvas-expected.png b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/image-object-in-canvas-expected.png index a9b1dae..ccaa51b 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/image-object-in-canvas-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/image-object-in-canvas-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/quadraticCurveTo-expected.png b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/quadraticCurveTo-expected.png index 6f4c626..a97034d 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/quadraticCurveTo-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/quadraticCurveTo-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-image-01-b-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-image-01-b-expected.png index e6fa6c9..48fe198 100644 --- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-image-01-b-expected.png +++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-image-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/change-service-worker-priority-when-client-foreground-state-change/README.md b/third_party/blink/web_tests/virtual/change-service-worker-priority-when-client-foreground-state-change/README.md deleted file mode 100644 index 4187166..0000000 --- a/third_party/blink/web_tests/virtual/change-service-worker-priority-when-client-foreground-state-change/README.md +++ /dev/null
@@ -1 +0,0 @@ -This directory is for testing ChangeServiceWorkerPriorityForClientForegroundStateChange (https://crbug.com/1257011).
diff --git a/third_party/blink/web_tests/virtual/change-service-worker-priority-when-client-foreground-state-change/external/wpt/service-workers/service-worker/navigation-timing-extended.https-expected.txt b/third_party/blink/web_tests/virtual/change-service-worker-priority-when-client-foreground-state-change/external/wpt/service-workers/service-worker/navigation-timing-extended.https-expected.txt deleted file mode 100644 index d8073bf..0000000 --- a/third_party/blink/web_tests/virtual/change-service-worker-priority-when-client-foreground-state-change/external/wpt/service-workers/service-worker/navigation-timing-extended.https-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Service worker controlled navigation timing assert_greater_than: workerStart marking should not wait for worker activation to finish expected a number greater than 1634042632175.5 but got 1634042632172.9001 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/virtual/change-service-worker-priority-when-client-foreground-state-change/external/wpt/service-workers/service-worker/worker-interception.https-expected.txt b/third_party/blink/web_tests/virtual/change-service-worker-priority-when-client-foreground-state-change/external/wpt/service-workers/service-worker/worker-interception.https-expected.txt deleted file mode 100644 index dba3694a..0000000 --- a/third_party/blink/web_tests/virtual/change-service-worker-priority-when-client-foreground-state-change/external/wpt/service-workers/service-worker/worker-interception.https-expected.txt +++ /dev/null
@@ -1,18 +0,0 @@ -This is a testharness.js-based test. -FAIL Verify a dedicated worker script request issued from a uncontrolled document is intercepted by worker's own service worker. promise_test: Unhandled rejection with value: undefined -FAIL Verify an out-of-scope dedicated worker script request issued from a controlled document should not be intercepted by document's service worker. assert_equals: expected "worker loading was not intercepted by service worker" but got "worker loading intercepted by service worker" -PASS Verify a shared worker script request issued from a uncontrolled document is intercepted by worker's own service worker. -FAIL Verify a same-origin worker script served by a service worker succeeds in starting a dedicated worker. promise_test: Unhandled rejection with value: undefined -PASS Verify a same-origin worker script served by a service worker succeeds in starting a shared worker. -PASS Verify a cors worker script served by a service worker fails dedicated worker start. -PASS Verify a cors worker script served by a service worker fails shared worker start. -PASS Verify a no-cors cross-origin worker script served by a service worker fails dedicated worker start. -PASS Verify a no-cors cross-origin worker script served by a service worker fails shared worker start. -PASS Register a service worker for worker subresource interception tests. -FAIL Requests on a dedicated worker controlled by a service worker. assert_equals: expected "This load was successfully intercepted." but got "{\"error\": {\"code\": 404, \"message\": \"\"}}" -PASS Requests on a shared worker controlled by a service worker. -FAIL Requests on a dedicated worker nested in a dedicated worker and controlled by a service worker assert_equals: expected "This load was successfully intercepted." but got "{\"error\": {\"code\": 404, \"message\": \"\"}}" -FAIL Requests on a dedicated worker nested in a shared worker and controlled by a service worker assert_equals: expected "This load was successfully intercepted." but got "Unexpected error! Worker is not defined" -PASS Unregister a service worker for subresource interception tests. -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/parsing/page-transition-tag-computed.html b/third_party/blink/web_tests/wpt_internal/document-transition/parsing/page-transition-tag-computed.html new file mode 100644 index 0000000..03d92e9f --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/document-transition/parsing/page-transition-tag-computed.html
@@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Document Transitions: page-transition-tag with computed values</title> +<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org"> +<link rel="help" href="https://github.com/WICG/shared-element-transitions"> +<meta name="assert" content="page-transition-tag supports custom keywords."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/computed-testcommon.js"></script> +</head> +<body> +<div id=target></div> +<div id=scratch></div> +<script> + +test_computed_value("page-transition-tag", "none"); +test_computed_value("page-transition-tag", "foo"); +test_computed_value("page-transition-tag", "bar"); +test_computed_value("page-transition-tag", "baz"); +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/parsing/page-transition-tag-invalid.html b/third_party/blink/web_tests/wpt_internal/document-transition/parsing/page-transition-tag-invalid.html new file mode 100644 index 0000000..31e45d2 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/document-transition/parsing/page-transition-tag-invalid.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Document Transitions: page-transition-tag with invalid values</title> +<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org"> +<link rel="help" href="https://github.com/WICG/shared-element-transitions"> +<meta name="assert" content="page-transition-tag does not support reserved tag names."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +// 'root' is a reserved tag. +test_invalid_value("page-transition-tag", "root"); +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/parsing/page-transition-tag-valid.html b/third_party/blink/web_tests/wpt_internal/document-transition/parsing/page-transition-tag-valid.html new file mode 100644 index 0000000..c554d4f --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/document-transition/parsing/page-transition-tag-valid.html
@@ -0,0 +1,21 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Document Transitions Test: page-transition-tag with valid values</title> +<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-contain/#page-transition-tag"> +<meta name="assert" content="page-transition-tag supports custom tags"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +test_valid_value("page-transition-tag", "none"); +test_valid_value("page-transition-tag", "foo"); +test_valid_value("page-transition-tag", "bar"); +test_valid_value("page-transition-tag", "baz"); +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/intersection-observer.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/intersection-observer.https.html new file mode 100644 index 0000000..121ccb5 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/intersection-observer.https.html
@@ -0,0 +1,53 @@ +<!DOCTYPE html> +<title>Test Intersection Observer in fenced frame</title> +<script src="/common/rendering-utils.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="resources/utils.js"></script> +<script src="/common/utils.js"></script> +<style> +fencedframe { + width: 100px; + height: 100px; + position: fixed; + top: 0px; + left: 0px; + border: unset; +} +</style> + +<body> +<script> +promise_test(async (t) => { + // first entry after observe. + const io_entry_on_registration = token(); + // entry after transform. + const io_entry_on_transform = token(); + // entry with clip. + const io_entry_on_clip = token(); + + const frame = attachFencedFrame(generateURL( + "resources/frame-with-intersection-observer.html", + [io_entry_on_registration, io_entry_on_transform, io_entry_on_clip])); + + let result = await nextValueFromServer(io_entry_on_registration); + assert_equals(result, "0,0,100,100", + "Subscribing to IO dispatches a notification"); + + // Apply a transform to the fencedframe and ensure it gets applied to the + // intersectionRect. + frame.style.transform = 'translate(-10px, -20px)'; + result = await nextValueFromServer(io_entry_on_transform); + assert_equals(result, "10,20,90,80", + "Transform applies to intersection rect"); + + // Now add a clip to the fencedframe which should clip the intersectionRect. + frame.style.clipPath = 'inset(10px)'; + result = await nextValueFromServer(io_entry_on_clip); + assert_equals(result, "10,20,80,70", "Clip applies to intersection rect"); +}, 'Intersection Observer Test'); + +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/frame-with-intersection-observer.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/frame-with-intersection-observer.html new file mode 100644 index 0000000..5e066d3 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/frame-with-intersection-observer.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<script src="/resources/testharness.js"></script> +<script src="utils.js"></script> +<div id="target" style="width: 100px; height: 100px; position: fixed; top: 0px; left: 0px"></div> +<script> +let next_token = 0; +function init() { + const tokens = parseKeylist(); + let observer = new IntersectionObserver((entries) => { + assert_equals(entries.length, 1); + let rect = entries[0].intersectionRect.x + "," + + entries[0].intersectionRect.y + "," + + entries[0].intersectionRect.width + "," + + entries[0].intersectionRect.height; + writeValueToServer(tokens[next_token], rect); + next_token = next_token + 1; + + if (next_token == tokens.length) { + observer.disconnect(); + } + }, {threshold: [0.6, 0.75]}); + observer.observe(document.getElementById("target")); +} + +init(); +</script> +</html>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/frame-with-intersection-observer.html.headers b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/frame-with-intersection-observer.html.headers new file mode 100644 index 0000000..1b63235 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/frame-with-intersection-observer.html.headers
@@ -0,0 +1 @@ +Supports-Loading-Mode: fenced-frame
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-cross-origin-subframe-navigation.html b/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-cross-origin-subframe-navigation.html index a8ac1f9..ed9015e 100644 --- a/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-cross-origin-subframe-navigation.html +++ b/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-cross-origin-subframe-navigation.html
@@ -2,13 +2,14 @@ <script src="/common/get-host-info.sub.js"></script> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="/speculation-rules/prerender/resources/utils.js"></script> <script src="unload-utils.js"></script> +<script src="utils.js"></script> <body> <script type="module"> const params = new URLSearchParams(location.search); const state = params.get('state') || 'start'; -const uid = params.get('uid'); + +const bc = openChannel(); // Test steps: // 1. `start` page starts prerendering `prerendering` page. @@ -20,34 +21,37 @@ // 6. `pagehide`, `visibilitychange`, and `unload` events are handled in // `same-origin-frame` for the resumed navigation. // 7. `cross-origin-frame` is loaded, then `prerendering` quits the test. -sendChannelMessage('load ' + state, uid); +bc.postMessage('load ' + state); if (state === 'start') { - const url = createTestUrl('prerendering', uid); + const url = createTestUrl('prerendering'); startPrerendering(url); // Wait for a message from 'same-origin-frame' that is sent after triggering // cross-origin navigation. - await waitChannelMessage('request activation', uid); + await waitChannelMessage('request activation'); // Activate the 'prerendering' page. document.location = url; } else if (state === 'prerendering') { - const frame = addFrame(createTestUrl('same-origin-frame', uid)); + const frame = addFrame(createTestUrl('same-origin-frame')); + + // Complete the test when the `cross-origin-frame` is loaded. + const message = await waitWindowMessage(); + bc.postMessage(message); + bc.postMessage('Done'); } else if (state === 'same-origin-frame') { - const eventPromise = addEventListeners(state, uid); + addEventListeners('same-origin-frame'); // Run a cross-origin navigation. - document.location = createCrossOriginTestUrl('cross-origin-frame', uid); + document.location = createCrossOriginTestUrl('cross-origin-frame'); // Ask the 'start' page to activate the prerendering page. - sendChannelMessage('request activation', uid); - - // Wait for events fired during activation (e.g., unload). - await eventPromise; + bc.postMessage('request activation'); } else if (state === 'cross-origin-frame') { - // Complete the test when the `cross-origin-frame` is loaded. - window.close(); + // Let the 'prerendering' page know this frame is loaded. + window.parent.postMessage('load ' + state, '*'); } +bc.close(); </script> </body>
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-main-frame-navigation.html b/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-main-frame-navigation.html index 433b6ea..f1c647d 100644 --- a/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-main-frame-navigation.html +++ b/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-main-frame-navigation.html
@@ -1,15 +1,15 @@ <!DOCTYPE html> -<meta name="timeout" content="long"> <script src="/common/get-host-info.sub.js"></script> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="/speculation-rules/prerender/resources/utils.js"></script> <script src="unload-utils.js"></script> +<script src="utils.js"></script> <body> <script type="module"> const params = new URLSearchParams(location.search); const state = params.get('state') || 'start'; -const uid = params.get('uid'); + +const bc = openChannel(); // Test steps: // 1. `start` page starts prerendering `prerendering` page. @@ -22,39 +22,37 @@ // 7. `prerendering` page navigates to `another-page` again. // 8. `pagehide`, `visibilitychange`, and `unload` are handled this time. // 9. `another-page` finishes the test. -sendChannelMessage( - 'load ' + state + (document.prerendering ? ' in prerendering' : ''), uid); +bc.postMessage('load ' + state + + (document.prerendering ? ' in prerendering' : '')); if (state === 'start') { - const url = createTestUrl('prerendering', uid); + const url = createTestUrl('prerendering'); startPrerendering(url); // Wait for a message from `prerendering` to navigate that results in // fallback network navigation as the prerendering is cancelled. - await waitChannelMessage('request fallback', uid); + await waitChannelMessage('request fallback'); // Navigate. document.location = url; } else if (state === 'prerendering') { // unload handler may not be triggered for cancellation. - const eventPromise = addEventListeners('main-frame', uid); + addEventListeners('main-frame'); // Trigger a main frame navigation that will cancel the prerendering. // This navigates successfully if the page isn't prerendered. - document.location = createTestUrl('another-page', uid); + document.location = createTestUrl('another-page'); // Ask the `start` page to navigate if on prerendering. Otherwise, finish // the test. if (document.prerendering) - sendChannelMessage('request fallback', uid); - - // Wait for events fired during activation (e.g., unload). - await eventPromise; + bc.postMessage('request fallback'); } else if (state === 'another-page') { // Reach here after the prerendering is cancelled and fallback request loads // the `prerendering` page with document.prerendering == false. The main // frame navigation will succeed this time. - window.close(); + bc.postMessage('Done'); } +bc.close(); </script> </body>
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-remove-subframe.html b/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-remove-subframe.html index 797d3c9..227bd75b 100644 --- a/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-remove-subframe.html +++ b/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-remove-subframe.html
@@ -2,40 +2,40 @@ <script src="/common/get-host-info.sub.js"></script> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="/speculation-rules/prerender/resources/utils.js"></script> <script src="unload-utils.js"></script> +<script src="utils.js"></script> <body> <script type="module"> const params = new URLSearchParams(location.search); const state = params.get('state') || 'start'; -const uid = params.get('uid'); + +const bc = openChannel(); // Test steps: // 1. `start` page starts prerendering `prerendering` page. // 2. `prerendering` page adds `frame`. // 3. `prerendering` page removes `frame`. // 4. `pageshow`, `pagehide` and `unload` are handled in `frame`. +bc.postMessage('load ' + state); if (state == 'start') { - sendChannelMessage('load ' + state, uid); - startPrerendering(createTestUrl('prerendering', uid)); + startPrerendering(createTestUrl('prerendering')); } else if (state === 'prerendering') { - sendChannelMessage('load ' + state, uid); - const frame = addFrame(createTestUrl('frame', uid)); + const frame = addFrame(createTestUrl('frame')); // Wait until the frame is loaded and requests removal. - await waitChannelMessage('request removal', uid); + await waitChannelMessage('request removal'); + // Set up for waiting the unload message from `frame` and get a promise to + // wait it, then remove the frame. Once the promise is resolved, complete + // the test. + const promise = waitChannelMessage('unload frame in prerendering'); frame.remove(); + await promise; + bc.postMessage('Done'); } else if (state == 'frame') { - const eventPromise = addEventListeners(state, uid); - - // Send load state and a request to remove the frame in bulk to avoid - // reordering. PrerenderChannel#postMessage() doesn't guarantee the message - // order as it internally uses fetch(). - sendChannelMessage(['load ' + state, 'request removal'], uid); - - // Wait for events fired during activation (e.g., unload). - await eventPromise; + addEventListeners('frame'); + bc.postMessage('request removal'); } +bc.close(); </script> </body>
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-same-origin-subframe-navigation.html b/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-same-origin-subframe-navigation.html index 79f6306..6c3f2d8 100644 --- a/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-same-origin-subframe-navigation.html +++ b/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-same-origin-subframe-navigation.html
@@ -2,36 +2,35 @@ <script src="/common/get-host-info.sub.js"></script> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="/speculation-rules/prerender/resources/utils.js"></script> <script src="unload-utils.js"></script> +<script src="utils.js"></script> <body> <script type="module"> const params = new URLSearchParams(location.search); const state = params.get('state') || 'start'; -const uid = params.get('uid'); + +const bc = openChannel(); // Test steps: // 1. `start` page starts prerendering `prerendering` page. // 2. `prerendering` page adds `same-origin-frame1`. // 3. `same-origin-frame1` navigates to `same-origin-frame2`. // 4. `pagehide` and `unload` events are handled. -sendChannelMessage('load ' + state, uid); +bc.postMessage('load ' + state); if (state === 'start') { - startPrerendering(createTestUrl('prerendering', uid)); + startPrerendering(createTestUrl('prerendering')); } else if (state === 'prerendering') { - addFrame(createTestUrl('same-origin-frame1', uid)); + addFrame(createTestUrl('same-origin-frame1')); } else if (state === 'same-origin-frame1') { // unload handler should be triggered after the frame navigation. - const eventPromise = addEventListeners('same-origin-frame1', uid); + addEventListeners('same-origin-frame1'); // Run a same-origin navigation. - document.location = createTestUrl('same-origin-frame2', uid); - - // Wait for events fired during activation (e.g., unload). - await eventPromise; + document.location = createTestUrl('same-origin-frame2'); } else if (state === 'same-origin-frame2') { - window.close(); + bc.postMessage('Done'); } +bc.close(); </script> </body>
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-utils.js b/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-utils.js index 2946a9e..1a4a4c04 100644 --- a/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-utils.js +++ b/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-utils.js
@@ -1,22 +1,21 @@ // Note: Following utility functions are expected to be used from // unload-on-prerender-* test files. -function createTestUrl(nextState, uid) { +function createTestUrl(nextState) { const params = new URLSearchParams(); params.set('state', nextState); - params.set('uid', uid); return location.pathname + '?' + params.toString(); } -function createCrossOriginTestUrl(nextState, uid) { - const path = createTestUrl(nextState, uid); +function createCrossOriginTestUrl(nextState) { + const path = createTestUrl(nextState); const url = new URL(path, location.href); url.host = get_host_info().REMOTE_HOST; return url.href; } -function openChannel(uid) { - return new PrerenderChannel('prerender', uid); +function openChannel() { + return new BroadcastChannel('prerender'); } function addFrame(url) { @@ -26,22 +25,13 @@ return frame; } -function addEventListeners(name, uid) { - return new Promise(resolve => { - const eventsSeen = []; - ['unload', 'pagehide', 'pageshow', 'visibilitychange'].forEach(eventName => { - window.addEventListener(eventName, e => { - eventsSeen.push(eventName + ' ' + name + - (document.prerendering ? ' in prerendering' : '')); - // The `unload` should be the last event. - if (eventName === 'unload') { - resolve(); - // Send the event logs in bulk (not per event) to avoid reordering. - // PrerenderChannel#postMessage() doesn't guarantee the message order - // as it internally uses fetch(). - sendChannelMessage(eventsSeen, uid); - } - }); +function addEventListeners(name) { + ['unload', 'pagehide', 'pageshow', 'visibilitychange'].forEach(eventName => { + window.addEventListener(eventName, e => { + const bc = openChannel(); + bc.postMessage(eventName + ' ' + name + + (document.prerendering ? ' in prerendering' : '')); + bc.close(); }); }); } @@ -52,23 +42,16 @@ }); } -function waitChannelMessage(message, uid) { +function waitChannelMessage(message) { return new Promise(resolve => { - const bc = openChannel(uid); + const bc = openChannel(); bc._messages = []; bc.addEventListener('message', e => { - const data = JSON.parse(e.data); - bc._messages = bc._messages.concat(data); - if (bc._messages[bc._messages.length - 1] === message) { + bc._messages.push(e.data); + if (e.data == message) { bc.close(); resolve(bc._messages); } }); }); } - -function sendChannelMessage(message, uid) { - const bc = openChannel(uid); - bc.postMessage(JSON.stringify(message)); - bc.close(); -}
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-cross-origin-subframe-navigation.html b/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-cross-origin-subframe-navigation.html index beeaaaf..205d7bd 100644 --- a/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-cross-origin-subframe-navigation.html +++ b/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-cross-origin-subframe-navigation.html
@@ -13,17 +13,14 @@ (https://crbug.com/1222551) --> <title>unload event handlers</title> -<meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="/common/utils.js"></script> -<script src="/speculation-rules/prerender/resources/utils.js"></script> <script src="resources/unload-utils.js"></script> <script> promise_test(async t => { - const uid = token(); - const gotMessages = waitChannelMessage('load cross-origin-frame', uid); - const url = `resources/unload-on-prerender-cross-origin-subframe-navigation.html?uid=${uid}`; + const gotMessages = waitChannelMessage('Done'); + const url = + 'resources/unload-on-prerender-cross-origin-subframe-navigation.html'; window.open(url, '_blank', 'noopener'); const result = await gotMessages; @@ -37,6 +34,7 @@ 'visibilitychange same-origin-frame', 'unload same-origin-frame', 'load cross-origin-frame', + 'Done', ]; assert_array_equals(result, expected, 'gotMessages'); }, 'unload after activation on cross origin subframe navigation');
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-main-frame-navigation.html b/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-main-frame-navigation.html index 8ff9141..3055a0fa 100644 --- a/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-main-frame-navigation.html +++ b/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-main-frame-navigation.html
@@ -13,17 +13,13 @@ (https://crbug.com/1222551) --> <title>unload event handlers</title> -<meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="/common/utils.js"></script> -<script src="/speculation-rules/prerender/resources/utils.js"></script> <script src="resources/unload-utils.js"></script> <script> promise_test(async t => { - const uid = token(); - const gotMessages = waitChannelMessage('load another-page', uid); - const url = `resources/unload-on-prerender-main-frame-navigation.html?uid=${uid}`; + const gotMessages = waitChannelMessage('Done'); + const url = 'resources/unload-on-prerender-main-frame-navigation.html'; window.open(url, '_blank', 'noopener'); const result = await gotMessages; @@ -41,6 +37,7 @@ { message: 'visibilitychange main-frame' }, { message: 'unload main-frame' }, { message: 'load another-page' }, + { message: 'Done' }, ]; let offset = 0; assert_less_than_equal(result.length, expected.length); @@ -53,4 +50,4 @@ } assert_equals(offset, result.length); }, 'unload on main frame navigation to cancel prerendering'); -</script> +</script> \ No newline at end of file
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-remove-subframe.html b/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-remove-subframe.html index c522417..20e0528c 100644 --- a/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-remove-subframe.html +++ b/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-remove-subframe.html
@@ -9,17 +9,13 @@ (https://crbug.com/1222551) --> <title>unload event handlers</title> -<meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="/common/utils.js"></script> -<script src="/speculation-rules/prerender/resources/utils.js"></script> <script src="resources/unload-utils.js"></script> <script> promise_test(async t => { - const uid = token(); - const gotMessages = waitChannelMessage('unload frame in prerendering', uid); - const url = `resources/unload-on-prerender-remove-subframe.html?uid=${uid}`; + const gotMessages = waitChannelMessage('Done'); + const url = 'resources/unload-on-prerender-remove-subframe.html'; window.open(url, '_blank', 'noopener'); const result = await gotMessages; @@ -31,6 +27,7 @@ 'pageshow frame in prerendering', 'pagehide frame in prerendering', 'unload frame in prerendering', + 'Done', ]; assert_array_equals(result, expected, 'gotMessages'); }, 'unload on removing subframe');
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-same-origin-subframe-navigation.html b/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-same-origin-subframe-navigation.html index 6b3323e..8bb0564 100644 --- a/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-same-origin-subframe-navigation.html +++ b/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-same-origin-subframe-navigation.html
@@ -9,18 +9,14 @@ (https://crbug.com/1222551) --> <title>unload event handlers</title> -<meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="/common/utils.js"></script> -<script src="/speculation-rules/prerender/resources/utils.js"></script> <script src="resources/unload-utils.js"></script> <script> promise_test(async t => { - const uid = token(); - const gotMessages = waitChannelMessage('load same-origin-frame2', uid); + const gotMessages = waitChannelMessage('Done'); const url = - `resources/unload-on-prerender-same-origin-subframe-navigation.html?uid=${uid}`; + 'resources/unload-on-prerender-same-origin-subframe-navigation.html'; window.open(url, '_blank', 'noopener'); const result = await gotMessages; @@ -31,6 +27,7 @@ 'pagehide same-origin-frame1 in prerendering', 'unload same-origin-frame1 in prerendering', 'load same-origin-frame2', + 'Done', ]; assert_array_equals(result, expected, 'gotMessages'); }, 'unload on same origin subframe navigation');
diff --git a/third_party/rust/cxx/v1/crate/src/cxx.cc b/third_party/rust/cxx/v1/crate/src/cxx.cc index 686b1a9..b2d5ef3f3 100644 --- a/third_party/rust/cxx/v1/crate/src/cxx.cc +++ b/third_party/rust/cxx/v1/crate/src/cxx.cc
@@ -3,67 +3,87 @@ #include <iostream> #include <memory> +#ifndef CXX_RS_EXPORT +#define CXX_RS_EXPORT +#endif +#ifndef CXX_CPP_EXPORT +#define CXX_CPP_EXPORT +#endif + extern "C" { -void cxxbridge1$cxx_string$init(std::string *s, const std::uint8_t *ptr, - std::size_t len) noexcept { +CXX_RS_EXPORT void cxxbridge1$cxx_string$init(std::string *s, + const std::uint8_t *ptr, + std::size_t len) noexcept { new (s) std::string(reinterpret_cast<const char *>(ptr), len); } -void cxxbridge1$cxx_string$destroy(std::string *s) noexcept { +CXX_RS_EXPORT void cxxbridge1$cxx_string$destroy(std::string *s) noexcept { using std::string; s->~string(); } -const char *cxxbridge1$cxx_string$data(const std::string &s) noexcept { +CXX_RS_EXPORT const char * +cxxbridge1$cxx_string$data(const std::string &s) noexcept { return s.data(); } -std::size_t cxxbridge1$cxx_string$length(const std::string &s) noexcept { +CXX_RS_EXPORT std::size_t +cxxbridge1$cxx_string$length(const std::string &s) noexcept { return s.length(); } -void cxxbridge1$cxx_string$clear(std::string &s) noexcept { s.clear(); } +CXX_RS_EXPORT void cxxbridge1$cxx_string$clear(std::string &s) noexcept { + s.clear(); +} -void cxxbridge1$cxx_string$reserve_total(std::string &s, - size_t new_cap) noexcept { +CXX_RS_EXPORT void +cxxbridge1$cxx_string$reserve_total(std::string &s, size_t new_cap) noexcept { s.reserve(new_cap); } -void cxxbridge1$cxx_string$push(std::string &s, const std::uint8_t *ptr, - std::size_t len) noexcept { +CXX_RS_EXPORT void cxxbridge1$cxx_string$push(std::string &s, + const std::uint8_t *ptr, + std::size_t len) noexcept { s.append(reinterpret_cast<const char *>(ptr), len); } // rust::String -void cxxbridge1$string$new(rust::String *self) noexcept; -void cxxbridge1$string$clone(rust::String *self, - const rust::String &other) noexcept; -bool cxxbridge1$string$from_utf8(rust::String *self, const char *ptr, - std::size_t len) noexcept; -bool cxxbridge1$string$from_utf16(rust::String *self, const char16_t *ptr, - std::size_t len) noexcept; -void cxxbridge1$string$drop(rust::String *self) noexcept; -const char *cxxbridge1$string$ptr(const rust::String *self) noexcept; -std::size_t cxxbridge1$string$len(const rust::String *self) noexcept; -std::size_t cxxbridge1$string$capacity(const rust::String *self) noexcept; -void cxxbridge1$string$reserve_additional(rust::String *self, - size_t additional) noexcept; -void cxxbridge1$string$reserve_total(rust::String *self, - size_t new_cap) noexcept; +CXX_RS_EXPORT void cxxbridge1$string$new(rust::String *self) noexcept; +CXX_RS_EXPORT void cxxbridge1$string$clone(rust::String *self, + const rust::String &other) noexcept; +CXX_RS_EXPORT bool cxxbridge1$string$from_utf8(rust::String *self, + const char *ptr, + std::size_t len) noexcept; +CXX_RS_EXPORT bool cxxbridge1$string$from_utf16(rust::String *self, + const char16_t *ptr, + std::size_t len) noexcept; +CXX_RS_EXPORT void cxxbridge1$string$drop(rust::String *self) noexcept; +CXX_RS_EXPORT const char * +cxxbridge1$string$ptr(const rust::String *self) noexcept; +CXX_RS_EXPORT std::size_t +cxxbridge1$string$len(const rust::String *self) noexcept; +CXX_RS_EXPORT std::size_t +cxxbridge1$string$capacity(const rust::String *self) noexcept; +CXX_RS_EXPORT void +cxxbridge1$string$reserve_additional(rust::String *self, + size_t additional) noexcept; +CXX_RS_EXPORT void cxxbridge1$string$reserve_total(rust::String *self, + size_t new_cap) noexcept; // rust::Str -void cxxbridge1$str$new(rust::Str *self) noexcept; -void cxxbridge1$str$ref(rust::Str *self, const rust::String *string) noexcept; -bool cxxbridge1$str$from(rust::Str *self, const char *ptr, - std::size_t len) noexcept; -const char *cxxbridge1$str$ptr(const rust::Str *self) noexcept; -std::size_t cxxbridge1$str$len(const rust::Str *self) noexcept; +CXX_RS_EXPORT void cxxbridge1$str$new(rust::Str *self) noexcept; +CXX_RS_EXPORT void cxxbridge1$str$ref(rust::Str *self, + const rust::String *string) noexcept; +CXX_RS_EXPORT bool cxxbridge1$str$from(rust::Str *self, const char *ptr, + std::size_t len) noexcept; +CXX_RS_EXPORT const char *cxxbridge1$str$ptr(const rust::Str *self) noexcept; +CXX_RS_EXPORT std::size_t cxxbridge1$str$len(const rust::Str *self) noexcept; // rust::Slice -void cxxbridge1$slice$new(void *self, const void *ptr, - std::size_t len) noexcept; -void *cxxbridge1$slice$ptr(const void *self) noexcept; -std::size_t cxxbridge1$slice$len(const void *self) noexcept; +CXX_RS_EXPORT void cxxbridge1$slice$new(void *self, const void *ptr, + std::size_t len) noexcept; +CXX_RS_EXPORT void *cxxbridge1$slice$ptr(const void *self) noexcept; +CXX_RS_EXPORT std::size_t cxxbridge1$slice$len(const void *self) noexcept; } // extern "C" namespace rust { @@ -79,19 +99,20 @@ #endif } -template void panic<std::out_of_range> [[noreturn]] (const char *msg); +template void panic<std::out_of_range>[[noreturn]] (const char *msg); -String::String() noexcept { cxxbridge1$string$new(this); } -String::String(const String &other) noexcept { +CXX_CPP_EXPORT String::String() noexcept { cxxbridge1$string$new(this); } + +CXX_CPP_EXPORT String::String(const String &other) noexcept { cxxbridge1$string$clone(this, other); } -String::String(String &&other) noexcept : repr(other.repr) { +CXX_CPP_EXPORT String::String(String &&other) noexcept : repr(other.repr) { cxxbridge1$string$new(&other); } -String::~String() noexcept { cxxbridge1$string$drop(this); } +CXX_CPP_EXPORT String::~String() noexcept { cxxbridge1$string$drop(this); } static void initString(String *self, const char *s, std::size_t len) { if (!cxxbridge1$string$from_utf8(self, s, len)) { @@ -105,26 +126,28 @@ } } -String::String(const std::string &s) { initString(this, s.data(), s.length()); } +CXX_CPP_EXPORT String::String(const std::string &s) { + initString(this, s.data(), s.length()); +} -String::String(const char *s) { +CXX_CPP_EXPORT String::String(const char *s) { assert(s != nullptr); initString(this, s, std::strlen(s)); } -String::String(const char *s, std::size_t len) { +CXX_CPP_EXPORT String::String(const char *s, std::size_t len) { assert(s != nullptr || len == 0); initString(this, s == nullptr && len == 0 ? reinterpret_cast<const char *>(1) : s, len); } -String::String(const char16_t *s) { +CXX_CPP_EXPORT String::String(const char16_t *s) { assert(s != nullptr); initString(this, s, std::char_traits<char16_t>::length(s)); } -String::String(const char16_t *s, std::size_t len) { +CXX_CPP_EXPORT String::String(const char16_t *s, std::size_t len) { assert(s != nullptr || len == 0); initString(this, s == nullptr && len == 0 ? reinterpret_cast<const char16_t *>(2) @@ -132,7 +155,7 @@ len); } -String &String::operator=(const String &other) &noexcept { +CXX_CPP_EXPORT String &String::operator=(const String &other) &noexcept { if (this != &other) { cxxbridge1$string$drop(this); cxxbridge1$string$clone(this, other); @@ -140,32 +163,32 @@ return *this; } -String &String::operator=(String &&other) &noexcept { +CXX_CPP_EXPORT String &String::operator=(String &&other) &noexcept { cxxbridge1$string$drop(this); this->repr = other.repr; cxxbridge1$string$new(&other); return *this; } -String::operator std::string() const { +CXX_CPP_EXPORT String::operator std::string() const { return std::string(this->data(), this->size()); } -const char *String::data() const noexcept { +CXX_CPP_EXPORT const char *String::data() const noexcept { return cxxbridge1$string$ptr(this); } -std::size_t String::size() const noexcept { +CXX_CPP_EXPORT std::size_t String::size() const noexcept { return cxxbridge1$string$len(this); } -std::size_t String::length() const noexcept { +CXX_CPP_EXPORT std::size_t String::length() const noexcept { return cxxbridge1$string$len(this); } -bool String::empty() const noexcept { return this->size() == 0; } +CXX_CPP_EXPORT bool String::empty() const noexcept { return this->size() == 0; } -const char *String::c_str() noexcept { +CXX_CPP_EXPORT const char *String::c_str() noexcept { auto len = this->length(); cxxbridge1$string$reserve_additional(this, 1); auto ptr = this->data(); @@ -173,128 +196,151 @@ return ptr; } -std::size_t String::capacity() const noexcept { +CXX_CPP_EXPORT std::size_t String::capacity() const noexcept { return cxxbridge1$string$capacity(this); } -void String::reserve(std::size_t new_cap) noexcept { +CXX_CPP_EXPORT void String::reserve(std::size_t new_cap) noexcept { cxxbridge1$string$reserve_total(this, new_cap); } -String::iterator String::begin() noexcept { +CXX_CPP_EXPORT String::iterator String::begin() noexcept { return const_cast<char *>(this->data()); } -String::iterator String::end() noexcept { +CXX_CPP_EXPORT String::iterator String::end() noexcept { return const_cast<char *>(this->data()) + this->size(); } -String::const_iterator String::begin() const noexcept { return this->cbegin(); } +CXX_CPP_EXPORT String::const_iterator String::begin() const noexcept { + return this->cbegin(); +} -String::const_iterator String::end() const noexcept { return this->cend(); } +CXX_CPP_EXPORT String::const_iterator String::end() const noexcept { + return this->cend(); +} -String::const_iterator String::cbegin() const noexcept { return this->data(); } +CXX_CPP_EXPORT String::const_iterator String::cbegin() const noexcept { + return this->data(); +} -String::const_iterator String::cend() const noexcept { +CXX_CPP_EXPORT String::const_iterator String::cend() const noexcept { return this->data() + this->size(); } -bool String::operator==(const String &rhs) const noexcept { +CXX_CPP_EXPORT bool String::operator==(const String &rhs) const noexcept { return rust::Str(*this) == rust::Str(rhs); } -bool String::operator!=(const String &rhs) const noexcept { +CXX_CPP_EXPORT bool String::operator!=(const String &rhs) const noexcept { return rust::Str(*this) != rust::Str(rhs); } -bool String::operator<(const String &rhs) const noexcept { +CXX_CPP_EXPORT bool String::operator<(const String &rhs) const noexcept { return rust::Str(*this) < rust::Str(rhs); } -bool String::operator<=(const String &rhs) const noexcept { +CXX_CPP_EXPORT bool String::operator<=(const String &rhs) const noexcept { return rust::Str(*this) <= rust::Str(rhs); } -bool String::operator>(const String &rhs) const noexcept { +CXX_CPP_EXPORT bool String::operator>(const String &rhs) const noexcept { return rust::Str(*this) > rust::Str(rhs); } -bool String::operator>=(const String &rhs) const noexcept { +CXX_CPP_EXPORT bool String::operator>=(const String &rhs) const noexcept { return rust::Str(*this) >= rust::Str(rhs); } -void String::swap(String &rhs) noexcept { +CXX_CPP_EXPORT void String::swap(String &rhs) noexcept { using std::swap; swap(this->repr, rhs.repr); } -String::String(unsafe_bitcopy_t, const String &bits) noexcept +CXX_CPP_EXPORT String::String(unsafe_bitcopy_t, const String &bits) noexcept : repr(bits.repr) {} -std::ostream &operator<<(std::ostream &os, const String &s) { +CXX_CPP_EXPORT std::ostream &operator<<(std::ostream &os, const String &s) { os.write(s.data(), s.size()); return os; } -Str::Str() noexcept { cxxbridge1$str$new(this); } +CXX_CPP_EXPORT Str::Str() noexcept { cxxbridge1$str$new(this); } -Str::Str(const String &s) noexcept { cxxbridge1$str$ref(this, &s); } +CXX_CPP_EXPORT Str::Str(const String &s) noexcept { + cxxbridge1$str$ref(this, &s); +} -static void initStr(Str *self, const char *ptr, std::size_t len) { +CXX_CPP_EXPORT static void initStr(Str *self, const char *ptr, + std::size_t len) { if (!cxxbridge1$str$from(self, ptr, len)) { panic<std::invalid_argument>("data for rust::Str is not utf-8"); } } -Str::Str(const std::string &s) { initStr(this, s.data(), s.length()); } +CXX_CPP_EXPORT Str::Str(const std::string &s) { + initStr(this, s.data(), s.length()); +} -Str::Str(const char *s) { +CXX_CPP_EXPORT Str::Str(const char *s) { assert(s != nullptr); initStr(this, s, std::strlen(s)); } -Str::Str(const char *s, std::size_t len) { +CXX_CPP_EXPORT Str::Str(const char *s, std::size_t len) { assert(s != nullptr || len == 0); initStr(this, s == nullptr && len == 0 ? reinterpret_cast<const char *>(1) : s, len); } -Str::operator std::string() const { +CXX_CPP_EXPORT Str::operator std::string() const { return std::string(this->data(), this->size()); } -const char *Str::data() const noexcept { return cxxbridge1$str$ptr(this); } +CXX_CPP_EXPORT const char *Str::data() const noexcept { + return cxxbridge1$str$ptr(this); +} -std::size_t Str::size() const noexcept { return cxxbridge1$str$len(this); } +CXX_CPP_EXPORT std::size_t Str::size() const noexcept { + return cxxbridge1$str$len(this); +} -std::size_t Str::length() const noexcept { return this->size(); } +CXX_CPP_EXPORT std::size_t Str::length() const noexcept { return this->size(); } -bool Str::empty() const noexcept { return this->size() == 0; } +CXX_CPP_EXPORT bool Str::empty() const noexcept { return this->size() == 0; } -Str::const_iterator Str::begin() const noexcept { return this->cbegin(); } +CXX_CPP_EXPORT Str::const_iterator Str::begin() const noexcept { + return this->cbegin(); +} -Str::const_iterator Str::end() const noexcept { return this->cend(); } +CXX_CPP_EXPORT Str::const_iterator Str::end() const noexcept { + return this->cend(); +} -Str::const_iterator Str::cbegin() const noexcept { return this->data(); } +CXX_CPP_EXPORT Str::const_iterator Str::cbegin() const noexcept { + return this->data(); +} -Str::const_iterator Str::cend() const noexcept { +CXX_CPP_EXPORT Str::const_iterator Str::cend() const noexcept { return this->data() + this->size(); } -bool Str::operator==(const Str &rhs) const noexcept { +CXX_CPP_EXPORT bool Str::operator==(const Str &rhs) const noexcept { return this->size() == rhs.size() && std::equal(this->begin(), this->end(), rhs.begin()); } -bool Str::operator!=(const Str &rhs) const noexcept { return !(*this == rhs); } +CXX_CPP_EXPORT bool Str::operator!=(const Str &rhs) const noexcept { + return !(*this == rhs); +} -bool Str::operator<(const Str &rhs) const noexcept { +CXX_CPP_EXPORT bool Str::operator<(const Str &rhs) const noexcept { return std::lexicographical_compare(this->begin(), this->end(), rhs.begin(), rhs.end()); } -bool Str::operator<=(const Str &rhs) const noexcept { +CXX_CPP_EXPORT bool Str::operator<=(const Str &rhs) const noexcept { // std::mismatch(this->begin(), this->end(), rhs.begin(), rhs.end()), except // without Undefined Behavior on C++11 if rhs is shorter than *this. const_iterator liter = this->begin(), lend = this->end(), riter = rhs.begin(), @@ -311,27 +357,34 @@ } } -bool Str::operator>(const Str &rhs) const noexcept { return rhs < *this; } +CXX_CPP_EXPORT bool Str::operator>(const Str &rhs) const noexcept { + return rhs < *this; +} -bool Str::operator>=(const Str &rhs) const noexcept { return rhs <= *this; } +CXX_CPP_EXPORT bool Str::operator>=(const Str &rhs) const noexcept { + return rhs <= *this; +} -void Str::swap(Str &rhs) noexcept { +CXX_CPP_EXPORT void Str::swap(Str &rhs) noexcept { using std::swap; swap(this->repr, rhs.repr); } -std::ostream &operator<<(std::ostream &os, const Str &s) { +CXX_CPP_EXPORT std::ostream &operator<<(std::ostream &os, const Str &s) { os.write(s.data(), s.size()); return os; } -void sliceInit(void *self, const void *ptr, std::size_t len) noexcept { +CXX_CPP_EXPORT void sliceInit(void *self, const void *ptr, + std::size_t len) noexcept { cxxbridge1$slice$new(self, ptr, len); } -void *slicePtr(const void *self) noexcept { return cxxbridge1$slice$ptr(self); } +CXX_CPP_EXPORT void *slicePtr(const void *self) noexcept { + return cxxbridge1$slice$ptr(self); +} -std::size_t sliceLen(const void *self) noexcept { +CXX_CPP_EXPORT std::size_t sliceLen(const void *self) noexcept { return cxxbridge1$slice$len(self); } @@ -402,7 +455,8 @@ } extern "C" { -const char *cxxbridge1$error(const char *ptr, std::size_t len) noexcept { +CXX_RS_EXPORT const char *cxxbridge1$error(const char *ptr, + std::size_t len) noexcept { return errorCopy(ptr, len); } } // extern "C" @@ -479,23 +533,24 @@ } // namespace extern "C" { -void cxxbridge1$unique_ptr$std$string$null( +CXX_RS_EXPORT void cxxbridge1$unique_ptr$std$string$null( std::unique_ptr<std::string> *ptr) noexcept { new (ptr) std::unique_ptr<std::string>(); } -void cxxbridge1$unique_ptr$std$string$raw(std::unique_ptr<std::string> *ptr, - std::string *raw) noexcept { +CXX_RS_EXPORT void +cxxbridge1$unique_ptr$std$string$raw(std::unique_ptr<std::string> *ptr, + std::string *raw) noexcept { new (ptr) std::unique_ptr<std::string>(raw); } -const std::string *cxxbridge1$unique_ptr$std$string$get( +CXX_RS_EXPORT const std::string *cxxbridge1$unique_ptr$std$string$get( const std::unique_ptr<std::string> &ptr) noexcept { return ptr.get(); } -std::string *cxxbridge1$unique_ptr$std$string$release( +CXX_RS_EXPORT std::string *cxxbridge1$unique_ptr$std$string$release( std::unique_ptr<std::string> &ptr) noexcept { return ptr.release(); } -void cxxbridge1$unique_ptr$std$string$drop( +CXX_RS_EXPORT void cxxbridge1$unique_ptr$std$string$drop( std::unique_ptr<std::string> *ptr) noexcept { ptr->~unique_ptr(); } @@ -510,65 +565,65 @@ } // namespace #define STD_VECTOR_OPS(RUST_TYPE, CXX_TYPE) \ - std::size_t cxxbridge1$std$vector$##RUST_TYPE##$size( \ + CXX_RS_EXPORT std::size_t cxxbridge1$std$vector$##RUST_TYPE##$size( \ const std::vector<CXX_TYPE> &s) noexcept { \ return s.size(); \ } \ - CXX_TYPE *cxxbridge1$std$vector$##RUST_TYPE##$get_unchecked( \ + CXX_RS_EXPORT CXX_TYPE *cxxbridge1$std$vector$##RUST_TYPE##$get_unchecked( \ std::vector<CXX_TYPE> *s, std::size_t pos) noexcept { \ return &(*s)[pos]; \ } \ - void cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$null( \ + CXX_RS_EXPORT void cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$null( \ std::unique_ptr<std::vector<CXX_TYPE>> *ptr) noexcept { \ new (ptr) std::unique_ptr<std::vector<CXX_TYPE>>(); \ } \ - void cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$raw( \ + CXX_RS_EXPORT void cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$raw( \ std::unique_ptr<std::vector<CXX_TYPE>> *ptr, \ std::vector<CXX_TYPE> *raw) noexcept { \ new (ptr) std::unique_ptr<std::vector<CXX_TYPE>>(raw); \ } \ - const std::vector<CXX_TYPE> \ + CXX_RS_EXPORT const std::vector<CXX_TYPE> \ *cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$get( \ const std::unique_ptr<std::vector<CXX_TYPE>> &ptr) noexcept { \ return ptr.get(); \ } \ - std::vector<CXX_TYPE> \ + CXX_RS_EXPORT std::vector<CXX_TYPE> \ *cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$release( \ std::unique_ptr<std::vector<CXX_TYPE>> &ptr) noexcept { \ return ptr.release(); \ } \ - void cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$drop( \ + CXX_RS_EXPORT void cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$drop( \ std::unique_ptr<std::vector<CXX_TYPE>> *ptr) noexcept { \ ptr->~unique_ptr(); \ } #define STD_VECTOR_TRIVIAL_OPS(RUST_TYPE, CXX_TYPE) \ - void cxxbridge1$std$vector$##RUST_TYPE##$push_back( \ + CXX_RS_EXPORT void cxxbridge1$std$vector$##RUST_TYPE##$push_back( \ std::vector<CXX_TYPE> *v, CXX_TYPE *value) noexcept { \ v->push_back(std::move(*value)); \ destroy(value); \ } \ - void cxxbridge1$std$vector$##RUST_TYPE##$pop_back(std::vector<CXX_TYPE> *v, \ - CXX_TYPE *out) noexcept { \ + CXX_RS_EXPORT void cxxbridge1$std$vector$##RUST_TYPE##$pop_back( \ + std::vector<CXX_TYPE> *v, CXX_TYPE *out) noexcept { \ new (out) CXX_TYPE(std::move(v->back())); \ v->pop_back(); \ } #define RUST_VEC_EXTERNS(RUST_TYPE, CXX_TYPE) \ - void cxxbridge1$rust_vec$##RUST_TYPE##$new( \ + CXX_RS_EXPORT void cxxbridge1$rust_vec$##RUST_TYPE##$new( \ rust::Vec<CXX_TYPE> *ptr) noexcept; \ - void cxxbridge1$rust_vec$##RUST_TYPE##$drop( \ + CXX_RS_EXPORT void cxxbridge1$rust_vec$##RUST_TYPE##$drop( \ rust::Vec<CXX_TYPE> *ptr) noexcept; \ - std::size_t cxxbridge1$rust_vec$##RUST_TYPE##$len( \ + CXX_RS_EXPORT std::size_t cxxbridge1$rust_vec$##RUST_TYPE##$len( \ const rust::Vec<CXX_TYPE> *ptr) noexcept; \ - std::size_t cxxbridge1$rust_vec$##RUST_TYPE##$capacity( \ + CXX_RS_EXPORT std::size_t cxxbridge1$rust_vec$##RUST_TYPE##$capacity( \ const rust::Vec<CXX_TYPE> *ptr) noexcept; \ - const CXX_TYPE *cxxbridge1$rust_vec$##RUST_TYPE##$data( \ + CXX_RS_EXPORT const CXX_TYPE *cxxbridge1$rust_vec$##RUST_TYPE##$data( \ const rust::Vec<CXX_TYPE> *ptr) noexcept; \ - void cxxbridge1$rust_vec$##RUST_TYPE##$reserve_total( \ + CXX_RS_EXPORT void cxxbridge1$rust_vec$##RUST_TYPE##$reserve_total( \ rust::Vec<CXX_TYPE> *ptr, std::size_t new_cap) noexcept; \ - void cxxbridge1$rust_vec$##RUST_TYPE##$set_len(rust::Vec<CXX_TYPE> *ptr, \ - std::size_t len) noexcept; + CXX_RS_EXPORT void cxxbridge1$rust_vec$##RUST_TYPE##$set_len( \ + rust::Vec<CXX_TYPE> *ptr, std::size_t len) noexcept; #define RUST_VEC_OPS(RUST_TYPE, CXX_TYPE) \ template <> \ @@ -603,52 +658,52 @@ #define SHARED_PTR_OPS(RUST_TYPE, CXX_TYPE) \ static_assert(sizeof(std::shared_ptr<CXX_TYPE>) == 2 * sizeof(void *), ""); \ static_assert(alignof(std::shared_ptr<CXX_TYPE>) == alignof(void *), ""); \ - void cxxbridge1$std$shared_ptr$##RUST_TYPE##$null( \ + CXX_RS_EXPORT void cxxbridge1$std$shared_ptr$##RUST_TYPE##$null( \ std::shared_ptr<CXX_TYPE> *ptr) noexcept { \ new (ptr) std::shared_ptr<CXX_TYPE>(); \ } \ - CXX_TYPE *cxxbridge1$std$shared_ptr$##RUST_TYPE##$uninit( \ + CXX_RS_EXPORT CXX_TYPE *cxxbridge1$std$shared_ptr$##RUST_TYPE##$uninit( \ std::shared_ptr<CXX_TYPE> *ptr) noexcept { \ CXX_TYPE *uninit = \ reinterpret_cast<CXX_TYPE *>(new rust::MaybeUninit<CXX_TYPE>); \ new (ptr) std::shared_ptr<CXX_TYPE>(uninit); \ return uninit; \ } \ - void cxxbridge1$std$shared_ptr$##RUST_TYPE##$clone( \ + CXX_RS_EXPORT void cxxbridge1$std$shared_ptr$##RUST_TYPE##$clone( \ const std::shared_ptr<CXX_TYPE> &self, \ std::shared_ptr<CXX_TYPE> *ptr) noexcept { \ new (ptr) std::shared_ptr<CXX_TYPE>(self); \ } \ - const CXX_TYPE *cxxbridge1$std$shared_ptr$##RUST_TYPE##$get( \ + CXX_RS_EXPORT const CXX_TYPE *cxxbridge1$std$shared_ptr$##RUST_TYPE##$get( \ const std::shared_ptr<CXX_TYPE> &self) noexcept { \ return self.get(); \ } \ - void cxxbridge1$std$shared_ptr$##RUST_TYPE##$drop( \ + CXX_RS_EXPORT void cxxbridge1$std$shared_ptr$##RUST_TYPE##$drop( \ const std::shared_ptr<CXX_TYPE> *self) noexcept { \ self->~shared_ptr(); \ } \ static_assert(sizeof(std::weak_ptr<CXX_TYPE>) == 2 * sizeof(void *), ""); \ static_assert(alignof(std::weak_ptr<CXX_TYPE>) == alignof(void *), ""); \ - void cxxbridge1$std$weak_ptr$##RUST_TYPE##$null( \ + CXX_RS_EXPORT void cxxbridge1$std$weak_ptr$##RUST_TYPE##$null( \ std::weak_ptr<CXX_TYPE> *ptr) noexcept { \ new (ptr) std::weak_ptr<CXX_TYPE>(); \ } \ - void cxxbridge1$std$weak_ptr$##RUST_TYPE##$clone( \ + CXX_RS_EXPORT void cxxbridge1$std$weak_ptr$##RUST_TYPE##$clone( \ const std::weak_ptr<CXX_TYPE> &self, \ std::weak_ptr<CXX_TYPE> *ptr) noexcept { \ new (ptr) std::weak_ptr<CXX_TYPE>(self); \ } \ - void cxxbridge1$std$weak_ptr$##RUST_TYPE##$downgrade( \ + CXX_RS_EXPORT void cxxbridge1$std$weak_ptr$##RUST_TYPE##$downgrade( \ const std::shared_ptr<CXX_TYPE> &shared, \ std::weak_ptr<CXX_TYPE> *weak) noexcept { \ new (weak) std::weak_ptr<CXX_TYPE>(shared); \ } \ - void cxxbridge1$std$weak_ptr$##RUST_TYPE##$upgrade( \ + CXX_RS_EXPORT void cxxbridge1$std$weak_ptr$##RUST_TYPE##$upgrade( \ const std::weak_ptr<CXX_TYPE> &weak, \ std::shared_ptr<CXX_TYPE> *shared) noexcept { \ new (shared) std::shared_ptr<CXX_TYPE>(weak.lock()); \ } \ - void cxxbridge1$std$weak_ptr$##RUST_TYPE##$drop( \ + CXX_RS_EXPORT void cxxbridge1$std$weak_ptr$##RUST_TYPE##$drop( \ const std::weak_ptr<CXX_TYPE> *self) noexcept { \ self->~weak_ptr(); \ }
diff --git a/third_party/rust/cxx/v1/patches/0004-Define-exported-cxx-symbols.patch b/third_party/rust/cxx/v1/patches/0004-Define-exported-cxx-symbols.patch new file mode 100644 index 0000000..fb2ddfe0 --- /dev/null +++ b/third_party/rust/cxx/v1/patches/0004-Define-exported-cxx-symbols.patch
@@ -0,0 +1,669 @@ +From b06f18236b6da3233f9bed87531232a68eeac3ef Mon Sep 17 00:00:00 2001 +From: Adrian Taylor <adetaylor@chromium.org> +Date: Wed, 16 Mar 2022 13:58:58 -0700 +Subject: [PATCH 1/2] Define exported cxx symbols. + +This is a version of +https://github.com/dtolnay/cxx/pull/1025 +backported to the version of cxx which we currently use. + +Change-Id: I6a0f76fcf6afb36718d5e939c797e7988826bad1 +--- + third_party/rust/cxx/v1/crate/src/cxx.cc | 314 +++++++++++++---------- + 1 file changed, 184 insertions(+), 130 deletions(-) + +diff --git a/third_party/rust/cxx/v1/crate/src/cxx.cc b/third_party/rust/cxx/v1/crate/src/cxx.cc +index 686b1a9cdaab0..c22ba100733f1 100644 +--- a/third_party/rust/cxx/v1/crate/src/cxx.cc ++++ b/third_party/rust/cxx/v1/crate/src/cxx.cc +@@ -3,67 +3,86 @@ + #include <iostream> + #include <memory> + ++#ifndef CXX_RS_EXPORT ++#define CXX_RS_EXPORT ++#endif ++#ifndef CXX_CPP_EXPORT ++#define CXX_CPP_EXPORT ++#endif ++ + extern "C" { +-void cxxbridge1$cxx_string$init(std::string *s, const std::uint8_t *ptr, +- std::size_t len) noexcept { ++CXX_RS_EXPORT void cxxbridge1$cxx_string$init(std::string *s, ++ const std::uint8_t *ptr, ++ std::size_t len) noexcept { + new (s) std::string(reinterpret_cast<const char *>(ptr), len); + } + +-void cxxbridge1$cxx_string$destroy(std::string *s) noexcept { ++CXX_RS_EXPORT void cxxbridge1$cxx_string$destroy(std::string *s) noexcept { + using std::string; + s->~string(); + } + +-const char *cxxbridge1$cxx_string$data(const std::string &s) noexcept { ++CXX_RS_EXPORT const char * ++cxxbridge1$cxx_string$data(const std::string &s) noexcept { + return s.data(); + } + +-std::size_t cxxbridge1$cxx_string$length(const std::string &s) noexcept { ++CXX_RS_EXPORT std::size_t ++cxxbridge1$cxx_string$length(const std::string &s) noexcept { + return s.length(); + } + +-void cxxbridge1$cxx_string$clear(std::string &s) noexcept { s.clear(); } ++CXX_RS_EXPORT void cxxbridge1$cxx_string$clear(std::string &s) noexcept { ++ s.clear(); ++} + +-void cxxbridge1$cxx_string$reserve_total(std::string &s, +- size_t new_cap) noexcept { ++CXX_RS_EXPORT void ++cxxbridge1$cxx_string$reserve_total(std::string &s, size_t new_cap) noexcept { + s.reserve(new_cap); + } + +-void cxxbridge1$cxx_string$push(std::string &s, const std::uint8_t *ptr, +- std::size_t len) noexcept { ++CXX_RS_EXPORT void cxxbridge1$cxx_string$push(std::string &s, ++ const std::uint8_t *ptr, ++ std::size_t len) noexcept { + s.append(reinterpret_cast<const char *>(ptr), len); + } + + // rust::String +-void cxxbridge1$string$new(rust::String *self) noexcept; +-void cxxbridge1$string$clone(rust::String *self, +- const rust::String &other) noexcept; +-bool cxxbridge1$string$from_utf8(rust::String *self, const char *ptr, +- std::size_t len) noexcept; +-bool cxxbridge1$string$from_utf16(rust::String *self, const char16_t *ptr, ++CXX_RS_EXPORT void cxxbridge1$string$new(rust::String *self) noexcept; ++CXX_RS_EXPORT void cxxbridge1$string$clone(rust::String *self, ++ const rust::String &other) noexcept; ++CXX_RS_EXPORT bool cxxbridge1$string$from_utf8(rust::String *self, ++ const char *ptr, ++ std::size_t len) noexcept; ++CXX_RS_EXPORT bool cxxbridge1$string$from_utf16(rust::String *self, const char16_t *ptr, + std::size_t len) noexcept; +-void cxxbridge1$string$drop(rust::String *self) noexcept; +-const char *cxxbridge1$string$ptr(const rust::String *self) noexcept; +-std::size_t cxxbridge1$string$len(const rust::String *self) noexcept; +-std::size_t cxxbridge1$string$capacity(const rust::String *self) noexcept; +-void cxxbridge1$string$reserve_additional(rust::String *self, +- size_t additional) noexcept; +-void cxxbridge1$string$reserve_total(rust::String *self, +- size_t new_cap) noexcept; ++CXX_RS_EXPORT void cxxbridge1$string$drop(rust::String *self) noexcept; ++CXX_RS_EXPORT const char * ++cxxbridge1$string$ptr(const rust::String *self) noexcept; ++CXX_RS_EXPORT std::size_t ++cxxbridge1$string$len(const rust::String *self) noexcept; ++CXX_RS_EXPORT std::size_t ++cxxbridge1$string$capacity(const rust::String *self) noexcept; ++CXX_RS_EXPORT void ++cxxbridge1$string$reserve_additional(rust::String *self, ++ size_t additional) noexcept; ++CXX_RS_EXPORT void cxxbridge1$string$reserve_total(rust::String *self, ++ size_t new_cap) noexcept; + + // rust::Str +-void cxxbridge1$str$new(rust::Str *self) noexcept; +-void cxxbridge1$str$ref(rust::Str *self, const rust::String *string) noexcept; +-bool cxxbridge1$str$from(rust::Str *self, const char *ptr, +- std::size_t len) noexcept; +-const char *cxxbridge1$str$ptr(const rust::Str *self) noexcept; +-std::size_t cxxbridge1$str$len(const rust::Str *self) noexcept; ++CXX_RS_EXPORT void cxxbridge1$str$new(rust::Str *self) noexcept; ++CXX_RS_EXPORT void cxxbridge1$str$ref(rust::Str *self, ++ const rust::String *string) noexcept; ++CXX_RS_EXPORT bool cxxbridge1$str$from(rust::Str *self, const char *ptr, ++ std::size_t len) noexcept; ++CXX_RS_EXPORT const char *cxxbridge1$str$ptr(const rust::Str *self) noexcept; ++CXX_RS_EXPORT std::size_t cxxbridge1$str$len(const rust::Str *self) noexcept; + + // rust::Slice +-void cxxbridge1$slice$new(void *self, const void *ptr, +- std::size_t len) noexcept; +-void *cxxbridge1$slice$ptr(const void *self) noexcept; +-std::size_t cxxbridge1$slice$len(const void *self) noexcept; ++CXX_RS_EXPORT void cxxbridge1$slice$new(void *self, const void *ptr, ++ std::size_t len) noexcept; ++CXX_RS_EXPORT void *cxxbridge1$slice$ptr(const void *self) noexcept; ++CXX_RS_EXPORT std::size_t cxxbridge1$slice$len(const void *self) noexcept; + } // extern "C" + + namespace rust { +@@ -79,19 +98,20 @@ void panic [[noreturn]] (const char *msg) { + #endif + } + +-template void panic<std::out_of_range> [[noreturn]] (const char *msg); ++template void panic<std::out_of_range>[[noreturn]] (const char *msg); ++ + +-String::String() noexcept { cxxbridge1$string$new(this); } ++CXX_CPP_EXPORT String::String() noexcept { cxxbridge1$string$new(this); } + +-String::String(const String &other) noexcept { ++CXX_CPP_EXPORT String::String(const String &other) noexcept { + cxxbridge1$string$clone(this, other); + } + +-String::String(String &&other) noexcept : repr(other.repr) { ++CXX_CPP_EXPORT String::String(String &&other) noexcept : repr(other.repr) { + cxxbridge1$string$new(&other); + } + +-String::~String() noexcept { cxxbridge1$string$drop(this); } ++CXX_CPP_EXPORT String::~String() noexcept { cxxbridge1$string$drop(this); } + + static void initString(String *self, const char *s, std::size_t len) { + if (!cxxbridge1$string$from_utf8(self, s, len)) { +@@ -105,26 +125,28 @@ static void initString(String *self, const char16_t *s, std::size_t len) { + } + } + +-String::String(const std::string &s) { initString(this, s.data(), s.length()); } ++CXX_CPP_EXPORT String::String(const std::string &s) { ++ initString(this, s.data(), s.length()); ++} + +-String::String(const char *s) { ++CXX_CPP_EXPORT String::String(const char *s) { + assert(s != nullptr); + initString(this, s, std::strlen(s)); + } + +-String::String(const char *s, std::size_t len) { ++CXX_CPP_EXPORT String::String(const char *s, std::size_t len) { + assert(s != nullptr || len == 0); + initString(this, + s == nullptr && len == 0 ? reinterpret_cast<const char *>(1) : s, + len); + } + +-String::String(const char16_t *s) { ++CXX_CPP_EXPORT String::String(const char16_t *s) { + assert(s != nullptr); + initString(this, s, std::char_traits<char16_t>::length(s)); + } + +-String::String(const char16_t *s, std::size_t len) { ++CXX_CPP_EXPORT String::String(const char16_t *s, std::size_t len) { + assert(s != nullptr || len == 0); + initString(this, + s == nullptr && len == 0 ? reinterpret_cast<const char16_t *>(2) +@@ -132,7 +154,7 @@ String::String(const char16_t *s, std::size_t len) { + len); + } + +-String &String::operator=(const String &other) &noexcept { ++CXX_CPP_EXPORT String &String::operator=(const String &other) &noexcept { + if (this != &other) { + cxxbridge1$string$drop(this); + cxxbridge1$string$clone(this, other); +@@ -140,32 +162,32 @@ String &String::operator=(const String &other) &noexcept { + return *this; + } + +-String &String::operator=(String &&other) &noexcept { ++CXX_CPP_EXPORT String &String::operator=(String &&other) &noexcept { + cxxbridge1$string$drop(this); + this->repr = other.repr; + cxxbridge1$string$new(&other); + return *this; + } + +-String::operator std::string() const { ++CXX_CPP_EXPORT String::operator std::string() const { + return std::string(this->data(), this->size()); + } + +-const char *String::data() const noexcept { ++CXX_CPP_EXPORT const char *String::data() const noexcept { + return cxxbridge1$string$ptr(this); + } + +-std::size_t String::size() const noexcept { ++CXX_CPP_EXPORT std::size_t String::size() const noexcept { + return cxxbridge1$string$len(this); + } + +-std::size_t String::length() const noexcept { ++CXX_CPP_EXPORT std::size_t String::length() const noexcept { + return cxxbridge1$string$len(this); + } + +-bool String::empty() const noexcept { return this->size() == 0; } ++CXX_CPP_EXPORT bool String::empty() const noexcept { return this->size() == 0; } + +-const char *String::c_str() noexcept { ++CXX_CPP_EXPORT const char *String::c_str() noexcept { + auto len = this->length(); + cxxbridge1$string$reserve_additional(this, 1); + auto ptr = this->data(); +@@ -173,128 +195,151 @@ const char *String::c_str() noexcept { + return ptr; + } + +-std::size_t String::capacity() const noexcept { ++CXX_CPP_EXPORT std::size_t String::capacity() const noexcept { + return cxxbridge1$string$capacity(this); + } + +-void String::reserve(std::size_t new_cap) noexcept { ++CXX_CPP_EXPORT void String::reserve(std::size_t new_cap) noexcept { + cxxbridge1$string$reserve_total(this, new_cap); + } + +-String::iterator String::begin() noexcept { ++CXX_CPP_EXPORT String::iterator String::begin() noexcept { + return const_cast<char *>(this->data()); + } + +-String::iterator String::end() noexcept { ++CXX_CPP_EXPORT String::iterator String::end() noexcept { + return const_cast<char *>(this->data()) + this->size(); + } + +-String::const_iterator String::begin() const noexcept { return this->cbegin(); } ++CXX_CPP_EXPORT String::const_iterator String::begin() const noexcept { ++ return this->cbegin(); ++} + +-String::const_iterator String::end() const noexcept { return this->cend(); } ++CXX_CPP_EXPORT String::const_iterator String::end() const noexcept { ++ return this->cend(); ++} + +-String::const_iterator String::cbegin() const noexcept { return this->data(); } ++CXX_CPP_EXPORT String::const_iterator String::cbegin() const noexcept { ++ return this->data(); ++} + +-String::const_iterator String::cend() const noexcept { ++CXX_CPP_EXPORT String::const_iterator String::cend() const noexcept { + return this->data() + this->size(); + } + +-bool String::operator==(const String &rhs) const noexcept { ++CXX_CPP_EXPORT bool String::operator==(const String &rhs) const noexcept { + return rust::Str(*this) == rust::Str(rhs); + } + +-bool String::operator!=(const String &rhs) const noexcept { ++CXX_CPP_EXPORT bool String::operator!=(const String &rhs) const noexcept { + return rust::Str(*this) != rust::Str(rhs); + } + +-bool String::operator<(const String &rhs) const noexcept { ++CXX_CPP_EXPORT bool String::operator<(const String &rhs) const noexcept { + return rust::Str(*this) < rust::Str(rhs); + } + +-bool String::operator<=(const String &rhs) const noexcept { ++CXX_CPP_EXPORT bool String::operator<=(const String &rhs) const noexcept { + return rust::Str(*this) <= rust::Str(rhs); + } + +-bool String::operator>(const String &rhs) const noexcept { ++CXX_CPP_EXPORT bool String::operator>(const String &rhs) const noexcept { + return rust::Str(*this) > rust::Str(rhs); + } + +-bool String::operator>=(const String &rhs) const noexcept { ++CXX_CPP_EXPORT bool String::operator>=(const String &rhs) const noexcept { + return rust::Str(*this) >= rust::Str(rhs); + } + +-void String::swap(String &rhs) noexcept { ++CXX_CPP_EXPORT void String::swap(String &rhs) noexcept { + using std::swap; + swap(this->repr, rhs.repr); + } + +-String::String(unsafe_bitcopy_t, const String &bits) noexcept ++CXX_CPP_EXPORT String::String(unsafe_bitcopy_t, const String &bits) noexcept + : repr(bits.repr) {} + +-std::ostream &operator<<(std::ostream &os, const String &s) { ++CXX_CPP_EXPORT std::ostream &operator<<(std::ostream &os, const String &s) { + os.write(s.data(), s.size()); + return os; + } + +-Str::Str() noexcept { cxxbridge1$str$new(this); } ++CXX_CPP_EXPORT Str::Str() noexcept { cxxbridge1$str$new(this); } + +-Str::Str(const String &s) noexcept { cxxbridge1$str$ref(this, &s); } ++CXX_CPP_EXPORT Str::Str(const String &s) noexcept { ++ cxxbridge1$str$ref(this, &s); ++} + +-static void initStr(Str *self, const char *ptr, std::size_t len) { ++CXX_CPP_EXPORT static void initStr(Str *self, const char *ptr, ++ std::size_t len) { + if (!cxxbridge1$str$from(self, ptr, len)) { + panic<std::invalid_argument>("data for rust::Str is not utf-8"); + } + } + +-Str::Str(const std::string &s) { initStr(this, s.data(), s.length()); } ++CXX_CPP_EXPORT Str::Str(const std::string &s) { ++ initStr(this, s.data(), s.length()); ++} + +-Str::Str(const char *s) { ++CXX_CPP_EXPORT Str::Str(const char *s) { + assert(s != nullptr); + initStr(this, s, std::strlen(s)); + } + +-Str::Str(const char *s, std::size_t len) { ++CXX_CPP_EXPORT Str::Str(const char *s, std::size_t len) { + assert(s != nullptr || len == 0); + initStr(this, + s == nullptr && len == 0 ? reinterpret_cast<const char *>(1) : s, + len); + } + +-Str::operator std::string() const { ++CXX_CPP_EXPORT Str::operator std::string() const { + return std::string(this->data(), this->size()); + } + +-const char *Str::data() const noexcept { return cxxbridge1$str$ptr(this); } ++CXX_CPP_EXPORT const char *Str::data() const noexcept { ++ return cxxbridge1$str$ptr(this); ++} + +-std::size_t Str::size() const noexcept { return cxxbridge1$str$len(this); } ++CXX_CPP_EXPORT std::size_t Str::size() const noexcept { ++ return cxxbridge1$str$len(this); ++} + +-std::size_t Str::length() const noexcept { return this->size(); } ++CXX_CPP_EXPORT std::size_t Str::length() const noexcept { return this->size(); } + +-bool Str::empty() const noexcept { return this->size() == 0; } ++CXX_CPP_EXPORT bool Str::empty() const noexcept { return this->size() == 0; } + +-Str::const_iterator Str::begin() const noexcept { return this->cbegin(); } ++CXX_CPP_EXPORT Str::const_iterator Str::begin() const noexcept { ++ return this->cbegin(); ++} + +-Str::const_iterator Str::end() const noexcept { return this->cend(); } ++CXX_CPP_EXPORT Str::const_iterator Str::end() const noexcept { ++ return this->cend(); ++} + +-Str::const_iterator Str::cbegin() const noexcept { return this->data(); } ++CXX_CPP_EXPORT Str::const_iterator Str::cbegin() const noexcept { ++ return this->data(); ++} + +-Str::const_iterator Str::cend() const noexcept { ++CXX_CPP_EXPORT Str::const_iterator Str::cend() const noexcept { + return this->data() + this->size(); + } + +-bool Str::operator==(const Str &rhs) const noexcept { ++CXX_CPP_EXPORT bool Str::operator==(const Str &rhs) const noexcept { + return this->size() == rhs.size() && + std::equal(this->begin(), this->end(), rhs.begin()); + } + +-bool Str::operator!=(const Str &rhs) const noexcept { return !(*this == rhs); } ++CXX_CPP_EXPORT bool Str::operator!=(const Str &rhs) const noexcept { ++ return !(*this == rhs); ++} + +-bool Str::operator<(const Str &rhs) const noexcept { ++CXX_CPP_EXPORT bool Str::operator<(const Str &rhs) const noexcept { + return std::lexicographical_compare(this->begin(), this->end(), rhs.begin(), + rhs.end()); + } + +-bool Str::operator<=(const Str &rhs) const noexcept { ++CXX_CPP_EXPORT bool Str::operator<=(const Str &rhs) const noexcept { + // std::mismatch(this->begin(), this->end(), rhs.begin(), rhs.end()), except + // without Undefined Behavior on C++11 if rhs is shorter than *this. + const_iterator liter = this->begin(), lend = this->end(), riter = rhs.begin(), +@@ -311,27 +356,34 @@ bool Str::operator<=(const Str &rhs) const noexcept { + } + } + +-bool Str::operator>(const Str &rhs) const noexcept { return rhs < *this; } ++CXX_CPP_EXPORT bool Str::operator>(const Str &rhs) const noexcept { ++ return rhs < *this; ++} + +-bool Str::operator>=(const Str &rhs) const noexcept { return rhs <= *this; } ++CXX_CPP_EXPORT bool Str::operator>=(const Str &rhs) const noexcept { ++ return rhs <= *this; ++} + +-void Str::swap(Str &rhs) noexcept { ++CXX_CPP_EXPORT void Str::swap(Str &rhs) noexcept { + using std::swap; + swap(this->repr, rhs.repr); + } + +-std::ostream &operator<<(std::ostream &os, const Str &s) { ++CXX_CPP_EXPORT std::ostream &operator<<(std::ostream &os, const Str &s) { + os.write(s.data(), s.size()); + return os; + } + +-void sliceInit(void *self, const void *ptr, std::size_t len) noexcept { ++CXX_CPP_EXPORT void sliceInit(void *self, const void *ptr, ++ std::size_t len) noexcept { + cxxbridge1$slice$new(self, ptr, len); + } + +-void *slicePtr(const void *self) noexcept { return cxxbridge1$slice$ptr(self); } ++CXX_CPP_EXPORT void *slicePtr(const void *self) noexcept { ++ return cxxbridge1$slice$ptr(self); ++} + +-std::size_t sliceLen(const void *self) noexcept { ++CXX_CPP_EXPORT std::size_t sliceLen(const void *self) noexcept { + return cxxbridge1$slice$len(self); + } + +@@ -402,7 +454,8 @@ static const char *errorCopy(const char *ptr, std::size_t len) { + } + + extern "C" { +-const char *cxxbridge1$error(const char *ptr, std::size_t len) noexcept { ++CXX_RS_EXPORT const char *cxxbridge1$error(const char *ptr, ++ std::size_t len) noexcept { + return errorCopy(ptr, len); + } + } // extern "C" +@@ -479,23 +532,24 @@ void destroy(T *ptr) { + } // namespace + + extern "C" { +-void cxxbridge1$unique_ptr$std$string$null( ++CXX_RS_EXPORT void cxxbridge1$unique_ptr$std$string$null( + std::unique_ptr<std::string> *ptr) noexcept { + new (ptr) std::unique_ptr<std::string>(); + } +-void cxxbridge1$unique_ptr$std$string$raw(std::unique_ptr<std::string> *ptr, +- std::string *raw) noexcept { ++CXX_RS_EXPORT void ++cxxbridge1$unique_ptr$std$string$raw(std::unique_ptr<std::string> *ptr, ++ std::string *raw) noexcept { + new (ptr) std::unique_ptr<std::string>(raw); + } +-const std::string *cxxbridge1$unique_ptr$std$string$get( ++CXX_RS_EXPORT const std::string *cxxbridge1$unique_ptr$std$string$get( + const std::unique_ptr<std::string> &ptr) noexcept { + return ptr.get(); + } +-std::string *cxxbridge1$unique_ptr$std$string$release( ++CXX_RS_EXPORT std::string *cxxbridge1$unique_ptr$std$string$release( + std::unique_ptr<std::string> &ptr) noexcept { + return ptr.release(); + } +-void cxxbridge1$unique_ptr$std$string$drop( ++CXX_RS_EXPORT void cxxbridge1$unique_ptr$std$string$drop( + std::unique_ptr<std::string> *ptr) noexcept { + ptr->~unique_ptr(); + } +@@ -510,65 +564,65 @@ static_assert(sizeof(std::string) <= kMaxExpectedWordsInString * sizeof(void *), + } // namespace + + #define STD_VECTOR_OPS(RUST_TYPE, CXX_TYPE) \ +- std::size_t cxxbridge1$std$vector$##RUST_TYPE##$size( \ ++ CXX_RS_EXPORT std::size_t cxxbridge1$std$vector$##RUST_TYPE##$size( \ + const std::vector<CXX_TYPE> &s) noexcept { \ + return s.size(); \ + } \ +- CXX_TYPE *cxxbridge1$std$vector$##RUST_TYPE##$get_unchecked( \ ++ CXX_RS_EXPORT CXX_TYPE *cxxbridge1$std$vector$##RUST_TYPE##$get_unchecked( \ + std::vector<CXX_TYPE> *s, std::size_t pos) noexcept { \ + return &(*s)[pos]; \ + } \ +- void cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$null( \ ++ CXX_RS_EXPORT void cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$null( \ + std::unique_ptr<std::vector<CXX_TYPE>> *ptr) noexcept { \ + new (ptr) std::unique_ptr<std::vector<CXX_TYPE>>(); \ + } \ +- void cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$raw( \ ++ CXX_RS_EXPORT void cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$raw( \ + std::unique_ptr<std::vector<CXX_TYPE>> *ptr, \ + std::vector<CXX_TYPE> *raw) noexcept { \ + new (ptr) std::unique_ptr<std::vector<CXX_TYPE>>(raw); \ + } \ +- const std::vector<CXX_TYPE> \ ++ CXX_RS_EXPORT const std::vector<CXX_TYPE> \ + *cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$get( \ + const std::unique_ptr<std::vector<CXX_TYPE>> &ptr) noexcept { \ + return ptr.get(); \ + } \ +- std::vector<CXX_TYPE> \ ++ CXX_RS_EXPORT std::vector<CXX_TYPE> \ + *cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$release( \ + std::unique_ptr<std::vector<CXX_TYPE>> &ptr) noexcept { \ + return ptr.release(); \ + } \ +- void cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$drop( \ ++ CXX_RS_EXPORT void cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$drop( \ + std::unique_ptr<std::vector<CXX_TYPE>> *ptr) noexcept { \ + ptr->~unique_ptr(); \ + } + + #define STD_VECTOR_TRIVIAL_OPS(RUST_TYPE, CXX_TYPE) \ +- void cxxbridge1$std$vector$##RUST_TYPE##$push_back( \ ++ CXX_RS_EXPORT void cxxbridge1$std$vector$##RUST_TYPE##$push_back( \ + std::vector<CXX_TYPE> *v, CXX_TYPE *value) noexcept { \ + v->push_back(std::move(*value)); \ + destroy(value); \ + } \ +- void cxxbridge1$std$vector$##RUST_TYPE##$pop_back(std::vector<CXX_TYPE> *v, \ +- CXX_TYPE *out) noexcept { \ ++ CXX_RS_EXPORT void cxxbridge1$std$vector$##RUST_TYPE##$pop_back( \ ++ std::vector<CXX_TYPE> *v, CXX_TYPE *out) noexcept { \ + new (out) CXX_TYPE(std::move(v->back())); \ + v->pop_back(); \ + } + + #define RUST_VEC_EXTERNS(RUST_TYPE, CXX_TYPE) \ +- void cxxbridge1$rust_vec$##RUST_TYPE##$new( \ ++ CXX_RS_EXPORT void cxxbridge1$rust_vec$##RUST_TYPE##$new( \ + rust::Vec<CXX_TYPE> *ptr) noexcept; \ +- void cxxbridge1$rust_vec$##RUST_TYPE##$drop( \ ++ CXX_RS_EXPORT void cxxbridge1$rust_vec$##RUST_TYPE##$drop( \ + rust::Vec<CXX_TYPE> *ptr) noexcept; \ +- std::size_t cxxbridge1$rust_vec$##RUST_TYPE##$len( \ ++ CXX_RS_EXPORT std::size_t cxxbridge1$rust_vec$##RUST_TYPE##$len( \ + const rust::Vec<CXX_TYPE> *ptr) noexcept; \ +- std::size_t cxxbridge1$rust_vec$##RUST_TYPE##$capacity( \ ++ CXX_RS_EXPORT std::size_t cxxbridge1$rust_vec$##RUST_TYPE##$capacity( \ + const rust::Vec<CXX_TYPE> *ptr) noexcept; \ +- const CXX_TYPE *cxxbridge1$rust_vec$##RUST_TYPE##$data( \ ++ CXX_RS_EXPORT const CXX_TYPE *cxxbridge1$rust_vec$##RUST_TYPE##$data( \ + const rust::Vec<CXX_TYPE> *ptr) noexcept; \ +- void cxxbridge1$rust_vec$##RUST_TYPE##$reserve_total( \ ++ CXX_RS_EXPORT void cxxbridge1$rust_vec$##RUST_TYPE##$reserve_total( \ + rust::Vec<CXX_TYPE> *ptr, std::size_t new_cap) noexcept; \ +- void cxxbridge1$rust_vec$##RUST_TYPE##$set_len(rust::Vec<CXX_TYPE> *ptr, \ +- std::size_t len) noexcept; ++ CXX_RS_EXPORT void cxxbridge1$rust_vec$##RUST_TYPE##$set_len( \ ++ rust::Vec<CXX_TYPE> *ptr, std::size_t len) noexcept; + + #define RUST_VEC_OPS(RUST_TYPE, CXX_TYPE) \ + template <> \ +@@ -603,52 +657,52 @@ static_assert(sizeof(std::string) <= kMaxExpectedWordsInString * sizeof(void *), + #define SHARED_PTR_OPS(RUST_TYPE, CXX_TYPE) \ + static_assert(sizeof(std::shared_ptr<CXX_TYPE>) == 2 * sizeof(void *), ""); \ + static_assert(alignof(std::shared_ptr<CXX_TYPE>) == alignof(void *), ""); \ +- void cxxbridge1$std$shared_ptr$##RUST_TYPE##$null( \ ++ CXX_RS_EXPORT void cxxbridge1$std$shared_ptr$##RUST_TYPE##$null( \ + std::shared_ptr<CXX_TYPE> *ptr) noexcept { \ + new (ptr) std::shared_ptr<CXX_TYPE>(); \ + } \ +- CXX_TYPE *cxxbridge1$std$shared_ptr$##RUST_TYPE##$uninit( \ ++ CXX_RS_EXPORT CXX_TYPE *cxxbridge1$std$shared_ptr$##RUST_TYPE##$uninit( \ + std::shared_ptr<CXX_TYPE> *ptr) noexcept { \ + CXX_TYPE *uninit = \ + reinterpret_cast<CXX_TYPE *>(new rust::MaybeUninit<CXX_TYPE>); \ + new (ptr) std::shared_ptr<CXX_TYPE>(uninit); \ + return uninit; \ + } \ +- void cxxbridge1$std$shared_ptr$##RUST_TYPE##$clone( \ ++ CXX_RS_EXPORT void cxxbridge1$std$shared_ptr$##RUST_TYPE##$clone( \ + const std::shared_ptr<CXX_TYPE> &self, \ + std::shared_ptr<CXX_TYPE> *ptr) noexcept { \ + new (ptr) std::shared_ptr<CXX_TYPE>(self); \ + } \ +- const CXX_TYPE *cxxbridge1$std$shared_ptr$##RUST_TYPE##$get( \ ++ CXX_RS_EXPORT const CXX_TYPE *cxxbridge1$std$shared_ptr$##RUST_TYPE##$get( \ + const std::shared_ptr<CXX_TYPE> &self) noexcept { \ + return self.get(); \ + } \ +- void cxxbridge1$std$shared_ptr$##RUST_TYPE##$drop( \ ++ CXX_RS_EXPORT void cxxbridge1$std$shared_ptr$##RUST_TYPE##$drop( \ + const std::shared_ptr<CXX_TYPE> *self) noexcept { \ + self->~shared_ptr(); \ + } \ + static_assert(sizeof(std::weak_ptr<CXX_TYPE>) == 2 * sizeof(void *), ""); \ + static_assert(alignof(std::weak_ptr<CXX_TYPE>) == alignof(void *), ""); \ +- void cxxbridge1$std$weak_ptr$##RUST_TYPE##$null( \ ++ CXX_RS_EXPORT void cxxbridge1$std$weak_ptr$##RUST_TYPE##$null( \ + std::weak_ptr<CXX_TYPE> *ptr) noexcept { \ + new (ptr) std::weak_ptr<CXX_TYPE>(); \ + } \ +- void cxxbridge1$std$weak_ptr$##RUST_TYPE##$clone( \ ++ CXX_RS_EXPORT void cxxbridge1$std$weak_ptr$##RUST_TYPE##$clone( \ + const std::weak_ptr<CXX_TYPE> &self, \ + std::weak_ptr<CXX_TYPE> *ptr) noexcept { \ + new (ptr) std::weak_ptr<CXX_TYPE>(self); \ + } \ +- void cxxbridge1$std$weak_ptr$##RUST_TYPE##$downgrade( \ ++ CXX_RS_EXPORT void cxxbridge1$std$weak_ptr$##RUST_TYPE##$downgrade( \ + const std::shared_ptr<CXX_TYPE> &shared, \ + std::weak_ptr<CXX_TYPE> *weak) noexcept { \ + new (weak) std::weak_ptr<CXX_TYPE>(shared); \ + } \ +- void cxxbridge1$std$weak_ptr$##RUST_TYPE##$upgrade( \ ++ CXX_RS_EXPORT void cxxbridge1$std$weak_ptr$##RUST_TYPE##$upgrade( \ + const std::weak_ptr<CXX_TYPE> &weak, \ + std::shared_ptr<CXX_TYPE> *shared) noexcept { \ + new (shared) std::shared_ptr<CXX_TYPE>(weak.lock()); \ + } \ +- void cxxbridge1$std$weak_ptr$##RUST_TYPE##$drop( \ ++ CXX_RS_EXPORT void cxxbridge1$std$weak_ptr$##RUST_TYPE##$drop( \ + const std::weak_ptr<CXX_TYPE> *self) noexcept { \ + self->~weak_ptr(); \ + } +-- +2.35.1.723.g4982287a31-goog +
diff --git a/tools/clang/scripts/package.py b/tools/clang/scripts/package.py index 38b2bbe..53e32c3 100755 --- a/tools/clang/scripts/package.py +++ b/tools/clang/scripts/package.py
@@ -435,9 +435,6 @@ 'lld': [ ], } - if sys.platform.startswith('linux'): - reclient_inputs['clang'].append('lib/libstdc++.so.6') - reclient_inputs['lld'].append('lib/libstdc++.so.6') # Check that all non-glob wanted files exist on disk. want = [w.replace('$V', RELEASE_VERSION) for w in want] @@ -569,6 +566,15 @@ PackageInArchive(clang_tidy_dir, clang_tidy_dir + '.tgz') MaybeUpload(args.upload, clang_tidy_dir + '.tgz', gcs_platform) + # Zip up clang-format so we can update it (separately from the clang roll). + clang_format_dir = 'clang-format-' + stamp + shutil.rmtree(clang_format_dir, ignore_errors=True) + os.makedirs(os.path.join(clang_format_dir, 'bin')) + shutil.copy(os.path.join(LLVM_RELEASE_DIR, 'bin', 'clang-format' + exe_ext), + os.path.join(clang_format_dir, 'bin')) + PackageInArchive(clang_format_dir, clang_format_dir + '.tgz') + MaybeUpload(args.upload, clang_format_dir + '.tgz', gcs_platform) + # Zip up clang-libs for users who opt into it. We want Clang and LLVM headers # and libs, as well as a couple binaries. The LLVM parts are needed by the # Rust build.
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 12f06292..cbb64fe9 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -51766,6 +51766,7 @@ <int value="-2026156288" label="LookalikeUrlNavigationSuggestionsUI:disabled"/> <int value="-2025367104" label="enable-material-design-ntp"/> + <int value="-2025360412" label="SyncAndroidPromosWithSingleButton:disabled"/> <int value="-2025330968" label="Journeys:disabled"/> <int value="-2024330288" label="RawDraw:enabled"/> <int value="-2023673947" label="TabRestoreSubMenus:disabled"/> @@ -54494,7 +54495,6 @@ label="OmniboxPreserveDefaultMatchAgainstAsyncUpdate:disabled"/> <int value="-164259311" label="ColorProviderRedirectionForThemeProvider:disabled"/> - <int value="-163537782" label="SyncAndroidPromosRevamp:disabled"/> <int value="-162928621" label="ForceStartupSigninPromo:disabled"/> <int value="-161782023" label="AndroidMessagesProdEndpoint:enabled"/> <int value="-160571071" label="InterestFeedV2:enabled"/> @@ -54775,7 +54775,6 @@ <int value="31848187" label="ViewsTaskManager:disabled"/> <int value="32057053" label="EnterpriseReportingInBrowser:disabled"/> <int value="32242305" label="NtpRecipeTasksModule:enabled"/> - <int value="32348093" label="DiagnosticsApp:disabled"/> <int value="32488630" label="EphemeralTab:enabled"/> <int value="32557641" label="HTTPAuthCommittedInterstitials:disabled"/> <int value="33588676" label="TranslateAssistContent:enabled"/> @@ -54853,7 +54852,7 @@ <int value="83422372" label="ChromeHomePersonalizedOmniboxSuggestions:enabled"/> <int value="84911198" label="ScanCardsInWebPayments:disabled"/> - <int value="87886288" label="DiagnosticsApp:enabled"/> + <int value="87306743" label="VariationsFakeCrashAfterStartup:disabled"/> <int value="88249612" label="CalendarView:enabled"/> <int value="88437020" label="FeaturePolicy:enabled"/> <int value="89357752" label="PdfXfaSupport:enabled"/> @@ -55370,7 +55369,6 @@ <int value="446316019" label="enable-threaded-compositing"/> <int value="448463569" label="NewShortcutMapping:disabled"/> <int value="451196246" label="disable-impl-side-painting"/> - <int value="451500573" label="SyncAndroidPromosRevamp:enabled"/> <int value="452139294" label="VrShellExperimentalRendering:enabled"/> <int value="452955571" label="EnableFilesystemInIncognito:disabled"/> <int value="453017472" @@ -55430,6 +55428,7 @@ <int value="491258649" label="UseFirstPartySet"/> <int value="491334698" label="ConditionalTabStripAndroid:enabled"/> <int value="492113129" label="ExperimentalAppBanners:enabled"/> + <int value="492355659" label="SurfaceSyncThrottling:disabled"/> <int value="492849345" label="ImprovedDesksKeyboardShortcuts:disabled"/> <int value="492985975" label="use-monitor-color-space"/> <int value="493758709" label="RestrictGamepadAccess:disabled"/> @@ -55509,6 +55508,7 @@ label="OmniboxAlternateMatchDescriptionSeparator:disabled"/> <int value="547654419" label="CrOSEnforceSystemAecAgc:enabled"/> <int value="548503129" label="ImpulseScrollAnimations:enabled"/> + <int value="548618823" label="SyncAndroidPromosWithSingleButton:enabled"/> <int value="549168649" label="AutofillEnableStickyManualFallbackForCards:disabled"/> <int value="549483647" label="EnableUnifiedMultiDeviceSettings:disabled"/> @@ -56158,6 +56158,7 @@ <int value="1003081697" label="DesktopPWAsUnifiedInstall:enabled"/> <int value="1003612981" label="AutofillAutoTriggerManualFallbackForCards:enabled"/> + <int value="1004141182" label="SurfaceSyncThrottling:enabled"/> <int value="1004263091" label="AdaptiveButtonInTopToolbarCustomizationV2:enabled"/> <int value="1004593833" label="LevelDBPerformRewrite:enabled"/> @@ -59427,6 +59428,7 @@ <int value="709" label="font-palette"/> <int value="710" label="base-palette"/> <int value="711" label="override-colors"/> + <int value="712" label="page-transition-tag"/> </enum> <enum name="MappedEditingCommands"> @@ -71466,6 +71468,7 @@ <int value="1" label="Safe Browsing verdict"/> <int value="2" label="Prediction service"/> <int value="3" label="Default fallback"/> + <int value="4" label="On-Device prediction model"/> </enum> <enum name="PermissionRequestType"> @@ -74426,31 +74429,6 @@ <int value="7" label="Add new signed-in profile from the Profile picker"/> </enum> -<enum name="ProfileAddSignInFlowOutcome"> - <int value="0" label="A consumer account is added and syncing"/> - <int value="1" label="A consumer account is added without sync"/> - <int value="2" - label="A consumer account is added with sync manually configured"/> - <int value="3" label="An enterprise account is added and syncing"/> - <int value="4" label="An enterprise account is added without sync"/> - <int value="5" - label="An enterprise account is added with no link data consent - (deprecated)"/> - <int value="6" - label="An enterprise account is added with sync manually configured"/> - <int value="7" label="An enterprise account is added but sync is disabled"/> - <int value="8" label="An account is added with some login error"> - This includes the case that the account is already syncing in another - profile. - </int> - <int value="9" label="The SAML sign-in flow stated (with unclear outcome)."/> - <int value="10" label="The flow got aborted before successful sign-in."/> - <int value="11" - label="The flow got aborted after sign-in (not in enterprise welcome)."/> - <int value="12" - label="The flow got aborted after sign-in (in enterprise welcome)."/> -</enum> - <enum name="ProfileAllAccountsCategories"> <int value="0" label="Either consumer or enterprise, not both"/> <int value="1" label="Both consumer and enterprise (no sync)"/> @@ -74878,6 +74856,31 @@ <int value="4" label="Triggered reset"/> </enum> +<enum name="ProfileSignedInFlowOutcome"> + <int value="0" label="A consumer account is added and syncing"/> + <int value="1" label="A consumer account is added without sync"/> + <int value="2" + label="A consumer account is added with sync manually configured"/> + <int value="3" label="An enterprise account is added and syncing"/> + <int value="4" label="An enterprise account is added without sync"/> + <int value="5" + label="An enterprise account is added with no link data consent + (deprecated)"/> + <int value="6" + label="An enterprise account is added with sync manually configured"/> + <int value="7" label="An enterprise account is added but sync is disabled"/> + <int value="8" label="An account is added with some login error"> + This includes the case that the account is already syncing in another + profile. + </int> + <int value="9" label="The SAML sign-in flow stated (with unclear outcome)."/> + <int value="10" label="The flow got aborted before successful sign-in."/> + <int value="11" + label="The flow got aborted after sign-in (not in enterprise welcome)."/> + <int value="12" + label="The flow got aborted after sign-in (in enterprise welcome)."/> +</enum> + <enum name="ProfileSync"> <int value="0" label="Signed in to sync"/> <int value="1" label="Signed in to sync from original profile"/> @@ -94465,6 +94468,15 @@ <int value="4" label="Abandoned"/> </enum> +<enum name="WebAuthenticationBLEUserEvents"> + <int value="0" label="BLE was already powered on"/> + <int value="1" + label="BLE needs to be powered on so the user was asked to approve"/> + <int value="2" + label="BLE needs to be powered on, and that can only be done externally"/> + <int value="3" label="BLE needed to be powered on, and was powered on"/> +</enum> + <enum name="WebAuthenticationCableV1DiscoveryEvent"> <int value="0" label="Discovery started"/> <int value="1" label="Adapter found"/>
diff --git a/tools/metrics/histograms/metadata/account_manager/histograms.xml b/tools/metrics/histograms/metadata/account_manager/histograms.xml index e52a4942..62c77b7 100644 --- a/tools/metrics/histograms/metadata/account_manager/histograms.xml +++ b/tools/metrics/histograms/metadata/account_manager/histograms.xml
@@ -49,11 +49,11 @@ </histogram> <histogram name="AccountManager.EduCoexistence.FetchAccessTokenResult" - enum="GoogleServiceAuthError" expires_after="2022-04-10"> - <owner>sinhak@chromium.org</owner> - <owner>anastasiian@chromium.org</owner> + enum="GoogleServiceAuthError" expires_after="2023-04-10"> + <owner>agawronska@chromium.org</owner> + <owner>cros-families-eng@google.com</owner> <summary> - The result of fetching an access token for the child with |accounts.reauth| + The result of fetching an access token for the child with `accounts.reauth` scope in secondary EDU account addition flow. Recorded after parent enters their password. This metric covers both v1 and v2 of EduCoexistence. </summary> @@ -117,7 +117,7 @@ </histogram> <histogram name="AccountManager.NumAccounts" units="count" - expires_after="2022-04-10"> + expires_after="2023-04-10"> <owner>sinhak@chromium.org</owner> <owner>anastasiian@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/enterprise/histograms.xml b/tools/metrics/histograms/metadata/enterprise/histograms.xml index 06dc596..c22226c 100644 --- a/tools/metrics/histograms/metadata/enterprise/histograms.xml +++ b/tools/metrics/histograms/metadata/enterprise/histograms.xml
@@ -2050,7 +2050,7 @@ </histogram> <histogram name="Enterprise.UserSession.Logins" - enum="EnterpriseUserSessionLogins" expires_after="2022-04-24"> + enum="EnterpriseUserSessionLogins" expires_after="2023-04-24"> <owner>xiyuan@chromium.org</owner> <owner>sduraisamy@chromium.org</owner> <summary>Tracks the sign-in events on an enrolled device.</summary>
diff --git a/tools/metrics/histograms/metadata/gpu/histograms.xml b/tools/metrics/histograms/metadata/gpu/histograms.xml index 0b9b445..7977b2cc3 100644 --- a/tools/metrics/histograms/metadata/gpu/histograms.xml +++ b/tools/metrics/histograms/metadata/gpu/histograms.xml
@@ -1145,8 +1145,9 @@ </summary> </histogram> -<histogram name="GPU.Output.HDR" enum="Boolean" expires_after="2022-04-24"> +<histogram name="GPU.Output.HDR" enum="Boolean" expires_after="2023-04-24"> <owner>hubbe@chromium.org</owner> + <owner>cassew@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> Records if any connected monitor is HDR capable. Recorded when the gpu
diff --git a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml index 40e94c7..d6f9edf 100644 --- a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml +++ b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
@@ -4340,20 +4340,6 @@ <affected-histogram name="MobileFre.FragmentInflationSpeed"/> </histogram_suffixes> -<histogram_suffixes name="MobileFreFromLaunchTarget" separator="."> - <suffix name="ActivityInflated" - label="The activity is ready to be drawn, although likely empty."/> - <suffix name="FirstFragmentInflatedV2" - label="The first fragment is ready to be drawn, the first meaningful - paint. Version V2 fixed an issue that previous data was not - recording the time duration from FRE launched."/> - <suffix name="FreCompleted" label="Entire FRE is completed."/> - <suffix name="TosAccepted" label="ToS is accepted."/> - <suffix name="TriggerLayoutInflation" - label="Recorded when layout inflation is triggered."/> - <affected-histogram name="MobileFre.FromLaunch"/> -</histogram_suffixes> - <histogram_suffixes name="ModuleIntegrityVerificationType" separator="."> <suffix name="WithoutByteSet" label="The version of the Module Integrity Verifier that doesn't use a
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml index e3b17b9..238c75b 100644 --- a/tools/metrics/histograms/metadata/media/histograms.xml +++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -417,7 +417,7 @@ </histogram> <histogram name="Media.Audio.Capture.Win.InitError.FormatRelated" - enum="AudioStreamFormatRelatedInitError" expires_after="2022-04-17"> + enum="AudioStreamFormatRelatedInitError" expires_after="2022-10-17"> <owner>guidou@chromium.org</owner> <owner>olka@chromium.org</owner> <summary> @@ -500,7 +500,7 @@ </histogram> <histogram name="Media.Audio.CoreAudioDispatchOverrideInitResult" - enum="CoreAudioDispatchOverrideInitResult" expires_after="2022-04-01"> + enum="CoreAudioDispatchOverrideInitResult" expires_after="2022-10-01"> <owner>guidou@chromium.org</owner> <owner>olka@chromium.org</owner> <summary> @@ -1462,7 +1462,7 @@ </histogram> <histogram name="Media.AudioService.AudioManagerStartupTime" units="ms" - expires_after="2022-04-05"> + expires_after="2022-10-05"> <owner>guidou@chromium.org</owner> <owner>olka@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/mobile/histograms.xml b/tools/metrics/histograms/metadata/mobile/histograms.xml index 85674b935..cdabf9f 100644 --- a/tools/metrics/histograms/metadata/mobile/histograms.xml +++ b/tools/metrics/histograms/metadata/mobile/histograms.xml
@@ -777,15 +777,26 @@ </summary> </histogram> -<histogram base="true" name="MobileFre.FromLaunch" units="ms" +<histogram name="MobileFre.FromLaunch.{Target}" units="ms" expires_after="2022-08-21"> <owner>skym@chromium.org</owner> <owner>wenyufu@chromium.org</owner> <summary> - Android: This suffixed histogram represents the amount of time from when the - FRE intent was initially constructed, until some event in the future occurs. - Not applicable for light weight FRE. + The amount of time between when the FRE intent was initially constructed and + when {Target}. Not emitted for the light-weight FRE. Android chrome only. </summary> + <token key="Target"> + <variant name="ActivityInflated" + summary="the activity is ready to be drawn, although likely empty"/> + <variant name="FirstFragmentInflatedV2" + summary="the first fragment is ready to be drawn, the first + meaningful paint. Version V2 fixed an issue that previous + data was not recording the time duration from FRE launched"/> + <variant name="FreCompleted" summary="the entire FRE is completed"/> + <variant name="TosAccepted" summary="the ToS is accepted"/> + <variant name="TriggerLayoutInflation" + summary="layout inflation is triggered"/> + </token> </histogram> <histogram
diff --git a/tools/metrics/histograms/metadata/omnibox/histograms.xml b/tools/metrics/histograms/metadata/omnibox/histograms.xml index 7c6b56b..eb30868 100644 --- a/tools/metrics/histograms/metadata/omnibox/histograms.xml +++ b/tools/metrics/histograms/metadata/omnibox/histograms.xml
@@ -61,6 +61,19 @@ </summary> </histogram> +<histogram name="Omnibox.AssistedQueryStats.Length" units="chars" + expires_after="2022-08-14"> + <owner>mahmadi@chromium.org</owner> + <owner>chrome-omnibox-team@google.com</owner> + <summary> + Records the length of the aqs= param in the Search Result Page request URLs. + Recorded every time a Search Result Page URL is generated in the + omnibox/realbox. This happens either when the user selects a suggestion in + order to load Search Result Page or when a proactive request is made to + prefetch the Search Result Page. + </summary> +</histogram> + <histogram name="Omnibox.BitmapFetchLatency" units="ms" expires_after="2022-09-11"> <!-- Name completed by histogram_suffixes name="Omnibox.BitmapFetchLatencyCacheSplit" --> @@ -692,6 +705,19 @@ </summary> </histogram> +<histogram name="Omnibox.SearchboxStats.Length" units="chars" + expires_after="2022-08-14"> + <owner>mahmadi@chromium.org</owner> + <owner>chrome-omnibox-team@google.com</owner> + <summary> + Records the length of the gs_lcrp= param in the Search Result Page request + URLs. Recorded every time a Search Result Page URL is generated in the + omnibox/realbox. This happens either when the user selects a suggestion in + order to load Search Result Page or when a proactive request is made to + prefetch the Search Result Page. + </summary> +</histogram> + <histogram name="Omnibox.SearchEngineType" enum="OmniboxSearchEngineType" expires_after="2022-08-07"> <owner>jdonnelly@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/profile/histograms.xml b/tools/metrics/histograms/metadata/profile/histograms.xml index 7e9966d1..6e5b48f4 100644 --- a/tools/metrics/histograms/metadata/profile/histograms.xml +++ b/tools/metrics/histograms/metadata/profile/histograms.xml
@@ -29,7 +29,7 @@ </histogram> <histogram name="Profile.AddSignInFlowOutcome" - enum="ProfileAddSignInFlowOutcome" expires_after="2022-08-07"> + enum="ProfileSignedInFlowOutcome" expires_after="2022-08-07"> <owner>jkrcal@chromium.org</owner> <owner>droger@chromium.org</owner> <summary> @@ -298,6 +298,16 @@ </summary> </histogram> +<histogram name="Profile.LacrosPrimaryProfileFirstRunOutcome" + enum="ProfileSignedInFlowOutcome" expires_after="2022-09-16"> + <owner>dgn@chromium.org</owner> + <owner>droger@chromium.org</owner> + <summary> + Records the outcome of the lacros first run for the primary profile (also in + the case it gets skipped silently). + </summary> +</histogram> + <histogram name="Profile.LiveProfileCount" units="profiles" expires_after="2022-08-21"> <owner>nicolaso@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/tab/histograms.xml b/tools/metrics/histograms/metadata/tab/histograms.xml index 3d77f545..2f379d03 100644 --- a/tools/metrics/histograms/metadata/tab/histograms.xml +++ b/tools/metrics/histograms/metadata/tab/histograms.xml
@@ -1911,33 +1911,6 @@ </summary> </histogram> -<histogram name="Tabs.SadTab.CrashCreated" units="tabs" - expires_after="2022-08-28"> - <owner>sonnyrao@chromium.org</owner> - <owner>jamescook@chromium.org</owner> - <summary> - Cumulative number of times a tab crashed with "Aw, Snap!", - recorded once per tab crash event. For example, a user who crashed 3 tabs - will record a count in the 1 bin, 2 bin, and 3 bin. Thus each bin N is the - number of sessions where users experienced N or more crash events. The user - may not have actually seen the sad tab page, as it might have been an - inactive tab. Compare to Tabs.SadTab.CrashDisplayed. - </summary> -</histogram> - -<histogram name="Tabs.SadTab.CrashDisplayed" units="tabs" - expires_after="2022-08-28"> - <owner>sonnyrao@chromium.org</owner> - <owner>jamescook@chromium.org</owner> - <summary> - Cumulative number of times a tab crashed with "Aw, Snap!" and the - user saw the page, recorded once per tab crash event. For example, a user - who crashed 3 tabs will record a count in the 1 bin, 2 bin, and 3 bin. Thus - each bin N is the number of sessions where users experienced N or more crash - events. Compare to Tabs.SadTab.CrashCreated. - </summary> -</histogram> - <histogram name="Tabs.SadTab.Feedback.Event" enum="SadTabEvent" expires_after="2022-08-28"> <owner>sonnyrao@chromium.org</owner> @@ -1949,89 +1922,6 @@ </summary> </histogram> -<histogram name="Tabs.SadTab.KillCreated" units="tabs" - expires_after="2021-12-05"> - <owner>sonnyrao@chromium.org</owner> - <owner>jamescook@chromium.org</owner> - <summary> - Cumulative number of times a tab was killed with a "He's dead, - Jim!" page, which is usually due to the renderer being killed, recorded - once per tab kill event. For example, a user who loses 3 tabs will record a - count in the 1 bin, 2 bin, and 3 bin. Thus each bin N is the number of - sessions where users experienced N or more kill events. The user may not - have actually seen the sad tab page, as it might have been an inactive tab. - Compare to Tabs.SadTab.KillDisplayed. This can happen due to out of memory, - malformed IPC messages, or a SIGINT/TERM/KILL signal sent by a user. - </summary> -</histogram> - -<histogram name="Tabs.SadTab.KillCreated.OOM" units="tabs" - expires_after="2022-04-24"> - <owner>sonnyrao@chromium.org</owner> - <owner>jamescook@chromium.org</owner> - <summary> - Cumulative number of times a tab was killed with a "He's dead, - Jim!" page due to the kernel out-of-memory killer, recorded once per - tab kill event. For example, a user who loses 3 tabs will record a count in - the 1 bin, 2 bin, and 3 bin. Thus each bin N is the number of sessions where - users experienced N or more kill events. The user may not have actually seen - the sad tab page, as it might have been an inactive tab. Compare to - Tabs.SadTab.KillDisplayed. - </summary> -</histogram> - -<histogram name="Tabs.SadTab.KillDisplayed" units="tabs" - expires_after="2022-08-28"> - <owner>sonnyrao@chromium.org</owner> - <owner>jamescook@chromium.org</owner> - <summary> - Cumulative number of times a tab was killed with a "He's dead, - Jim!" page and the user saw the page, recorded once per tab kill event. - For example, a user who loses 3 tabs will record a count in the 1 bin, 2 - bin, and 3 bin. Thus each bin N is the number of sessions where users - experienced N or more kill events. Compare to Tabs.SadTab.CrashCreated. - </summary> -</histogram> - -<histogram name="Tabs.SadTab.KillDisplayed.OOM" units="tabs" - expires_after="2021-06-01"> - <owner>sonnyrao@chromium.org</owner> - <owner>jamescook@chromium.org</owner> - <summary> - Cumulative number of times a tab was killed with a "He's dead, - Jim!" page due to the kernel out-of-memory killer and the user saw the - page, recorded once per tab kill event. For example, a user who loses 3 tabs - will record a count in the 1 bin, 2 bin, and 3 bin. Thus each bin N is the - number of sessions where users experienced N or more kill events. Compare to - Tabs.SadTab.CrashCreated. - </summary> -</histogram> - -<histogram name="Tabs.SadTab.OomCreated" units="tabs" - expires_after="2020-06-01"> - <owner>wfh@chromium.org</owner> - <summary> - Cumulative number of times a tab crashed with "Aw, Snap!", - recorded once per tab oom event. For example, a user who ran out of memory - in 3 tabs will record a count in the 1 bin, 2 bin, and 3 bin. Thus each bin - N is the number of sessions where users experienced N or more oom events. - The user may not have actually seen the sad tab page, as it might have been - an inactive tab. Compare to Tabs.SadTab.OomDisplayed. - </summary> -</histogram> - -<histogram name="Tabs.SadTab.OomDisplayed" units="tabs" - expires_after="2020-06-01"> - <owner>wfh@chromium.org</owner> - <summary> - Cumulative number of times a tab ran out of memory with "Aw, - Snap!" and the user saw the page, recorded once per tab oom event. For - example, a user who ran out of memory in 3 tabs will record a count in the 1 - bin, 2 bin, and 3 bin. Thus each bin N is the number of sessions where users - experienced N or more oom events. Compare to Tabs.SadTab.OomCreated. - </summary> -</histogram> - <histogram name="Tabs.SadTab.Reload.Event" enum="SadTabEvent" expires_after="2022-08-21"> <owner>sonnyrao@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/webauthn/histograms.xml b/tools/metrics/histograms/metadata/webauthn/histograms.xml index 09bc572f..a2f7d92c 100644 --- a/tools/metrics/histograms/metadata/webauthn/histograms.xml +++ b/tools/metrics/histograms/metadata/webauthn/histograms.xml
@@ -22,6 +22,15 @@ <histograms> +<histogram name="WebAuthentication.BLEUserEvents" + enum="WebAuthenticationBLEUserEvents" expires_after="2022-12-31"> + <owner>agl@chromium.org</owner> + <owner>martinkr@google.com</owner> + <summary> + Records user-visible BLE events that occur during a WebAuthn flow. + </summary> +</histogram> + <histogram name="WebAuthentication.CableV1DiscoveryEvent" enum="WebAuthenticationCableV1DiscoveryEvent" expires_after="2022-07-03"> <owner>agl@chromium.org</owner>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml index f3580fb..0192e1a 100644 --- a/tools/metrics/ukm/ukm.xml +++ b/tools/metrics/ukm/ukm.xml
@@ -15212,6 +15212,12 @@ service was successfully queried. </summary> </metric> + <metric name="PredictionsApiResponse.Heldback" enum="Boolean"> + <summary> + A boolean that records whether the response by the permissions prediction + service was held back. + </summary> + </metric> <metric name="PriorDismissals"> <summary> The number of dismissed prompts for the given (origin, permission) pair,
diff --git a/tools/perf/core/bot_platforms.py b/tools/perf/core/bot_platforms.py index e02f7788..e2cdc315 100644 --- a/tools/perf/core/bot_platforms.py +++ b/tools/perf/core/bot_platforms.py
@@ -498,6 +498,9 @@ ]) _FUCHSIA_ATLAS_PERF_FYI_BENCHMARK_CONFIGS = PerfSuite([ _GetBenchmarkConfig('system_health.common_desktop'), + _GetBenchmarkConfig('rendering.desktop'), + _GetBenchmarkConfig('power.desktop'), + _GetBenchmarkConfig('media.desktop'), _GetBenchmarkConfig('speedometer'), _GetBenchmarkConfig('speedometer2'), _GetBenchmarkConfig('jetstream'),
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index ef80413..a9a4d21 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,16 +5,16 @@ "remote_path": "perfetto_binaries/trace_processor_shell/linux_arm64/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "win": { - "hash": "23170a196634a4ed6915a88e53523bcfda77f0fe", - "remote_path": "perfetto_binaries/trace_processor_shell/win/deac2d35a18ac8a216f70607fcbfe6615445869f/trace_processor_shell.exe" + "hash": "1f86891669f4e4b3a88046dd1fa78d8e9f259c59", + "remote_path": "perfetto_binaries/trace_processor_shell/win/7c9c7d6662bdceb620481ce8826d305ffd24f25e/trace_processor_shell.exe" }, "linux_arm": { "hash": "58893933be305d3bfe0a72ebebcacde2ac3ca893", "remote_path": "perfetto_binaries/trace_processor_shell/linux_arm/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "mac": { - "hash": "95c8bad6c9c29901552cf1adeb31bd1010897df0", - "remote_path": "perfetto_binaries/trace_processor_shell/mac/deac2d35a18ac8a216f70607fcbfe6615445869f/trace_processor_shell" + "hash": "5d82d23fadbbe147410266f39b9a72fbb5391cf7", + "remote_path": "perfetto_binaries/trace_processor_shell/mac/7c9c7d6662bdceb620481ce8826d305ffd24f25e/trace_processor_shell" }, "mac_arm64": { "hash": "c0397e87456ad6c6a7aa0133e5b81c97adbab4ab", @@ -22,7 +22,7 @@ }, "linux": { "hash": "6c5897970b7fe316880c315f4b40a5a68f6a0ddd", - "remote_path": "perfetto_binaries/trace_processor_shell/linux/deac2d35a18ac8a216f70607fcbfe6615445869f/trace_processor_shell" + "remote_path": "perfetto_binaries/trace_processor_shell/linux/6570222e0f7fd09e13b668cdc69d378a75295c29/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/tools/perf/core/shard_maps/fuchsia-perf-atlas-fyi_map.json b/tools/perf/core/shard_maps/fuchsia-perf-atlas-fyi_map.json index 4c2a0c9..9067af5f 100644 --- a/tools/perf/core/shard_maps/fuchsia-perf-atlas-fyi_map.json +++ b/tools/perf/core/shard_maps/fuchsia-perf-atlas-fyi_map.json
@@ -7,14 +7,14 @@ "jetstream2": { "abridged": false }, - "speedometer": { + "media.desktop": { "abridged": false }, - "speedometer2": { + "power.desktop": { "abridged": false }, - "system_health.common_desktop": { - "end": 4, + "rendering.desktop": { + "end": 64, "abridged": false } }, @@ -33,18 +33,27 @@ }, "1": { "benchmarks": { - "system_health.common_desktop": { - "begin": 4, - "end": 33, + "rendering.desktop": { + "begin": 64, + "end": 260, "abridged": false } } }, "2": { "benchmarks": { + "rendering.desktop": { + "begin": 260, + "abridged": false + }, + "speedometer": { + "abridged": false + }, + "speedometer2": { + "abridged": false + }, "system_health.common_desktop": { - "begin": 33, - "end": 67, + "end": 38, "abridged": false } } @@ -52,20 +61,20 @@ "3": { "benchmarks": { "system_health.common_desktop": { - "begin": 67, + "begin": 38, "abridged": false } } }, "extra_infos": { - "num_stories": 87, - "predicted_min_shard_time": 991.0, - "predicted_min_shard_index": 1, - "predicted_max_shard_time": 1093.0, + "num_stories": 457, + "predicted_min_shard_time": 1956.0, + "predicted_min_shard_index": 3, + "predicted_max_shard_time": 1972.0, "predicted_max_shard_index": 2, - "shard #0": 1025.0, - "shard #1": 991.0, - "shard #2": 1093.0, - "shard #3": 992.0 + "shard #0": 1960.0, + "shard #1": 1960, + "shard #2": 1972.0, + "shard #3": 1956.0 } } \ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/fuchsia-perf-atlas-fyi_timing.json b/tools/perf/core/shard_maps/timing_data/fuchsia-perf-atlas-fyi_timing.json index 18e2ca7..f042b00 100644 --- a/tools/perf/core/shard_maps/timing_data/fuchsia-perf-atlas-fyi_timing.json +++ b/tools/perf/core/shard_maps/timing_data/fuchsia-perf-atlas-fyi_timing.json
@@ -8,23 +8,23 @@ "name": "system_health.common_desktop/browse:media:imgur" }, { - "duration": "106.0", + "duration": "108.0", "name": "system_health.common_desktop/browse:media:pinterest:2018" }, { - "duration": "76.0", + "duration": "78.0", "name": "system_health.common_desktop/browse:media:tumblr:2018" }, { - "duration": "16.0", + "duration": "18.0", "name": "system_health.common_desktop/browse:media:youtube:2019" }, { - "duration": "80.0", + "duration": "81.0", "name": "system_health.common_desktop/browse:media:youtubetv:2019" }, { - "duration": "87.0", + "duration": "90.0", "name": "system_health.common_desktop/browse:media:youtubetv_watch:2020" }, { @@ -40,11 +40,11 @@ "name": "system_health.common_desktop/browse:news:hackernews:2020" }, { - "duration": "90.0", + "duration": "92.0", "name": "system_health.common_desktop/browse:news:nytimes:2020" }, { - "duration": "79.0", + "duration": "81.0", "name": "system_health.common_desktop/browse:news:reddit:2020" }, { @@ -52,7 +52,7 @@ "name": "system_health.common_desktop/browse:search:google:2020" }, { - "duration": "37.0", + "duration": "36.0", "name": "system_health.common_desktop/browse:search:google_india:2021" }, { @@ -60,19 +60,19 @@ "name": "system_health.common_desktop/browse:social:facebook_infinite_scroll:2018" }, { - "duration": "69.0", + "duration": "71.0", "name": "system_health.common_desktop/browse:social:tumblr_infinite_scroll:2018" }, { - "duration": "67.0", + "duration": "69.0", "name": "system_health.common_desktop/browse:social:twitter:2018" }, { - "duration": "75.0", + "duration": "76.0", "name": "system_health.common_desktop/browse:social:twitter_infinite_scroll:2018" }, { - "duration": "62.0", + "duration": "61.0", "name": "system_health.common_desktop/browse:tech:discourse_infinite_scroll:2018" }, { @@ -88,7 +88,7 @@ "name": "system_health.common_desktop/browse:tools:earth:2020" }, { - "duration": "9.0", + "duration": "8.0", "name": "system_health.common_desktop/browse:tools:gmail-compose:2020" }, { @@ -108,11 +108,11 @@ "name": "system_health.common_desktop/browse:tools:maps:2019" }, { - "duration": "16.0", + "duration": "18.0", "name": "system_health.common_desktop/browse:tools:photoshop:2021" }, { - "duration": "16.0", + "duration": "18.0", "name": "system_health.common_desktop/browse:tools:photoshop_warm:2021" }, { @@ -144,11 +144,11 @@ "name": "system_health.common_desktop/load:games:lazors" }, { - "duration": "25.0", + "duration": "26.0", "name": "system_health.common_desktop/load:games:miniclip:2018" }, { - "duration": "27.0", + "duration": "28.0", "name": "system_health.common_desktop/load:games:spychase:2018" }, { @@ -156,7 +156,7 @@ "name": "system_health.common_desktop/load:media:9gag" }, { - "duration": "30.0", + "duration": "32.0", "name": "system_health.common_desktop/load:media:dailymotion:2019" }, { @@ -164,11 +164,11 @@ "name": "system_health.common_desktop/load:media:facebook_feed:desktop:2020" }, { - "duration": "24.0", + "duration": "25.0", "name": "system_health.common_desktop/load:media:facebook_photos:2018" }, { - "duration": "26.0", + "duration": "27.0", "name": "system_health.common_desktop/load:media:facebook_photos:desktop:2020" }, { @@ -180,11 +180,11 @@ "name": "system_health.common_desktop/load:media:google_images:2018" }, { - "duration": "24.0", + "duration": "25.0", "name": "system_health.common_desktop/load:media:imgur:2018" }, { - "duration": "26.0", + "duration": "27.0", "name": "system_health.common_desktop/load:media:soundcloud:2018" }, { @@ -212,7 +212,7 @@ "name": "system_health.common_desktop/load:news:hackernews:2018" }, { - "duration": "28.0", + "duration": "29.0", "name": "system_health.common_desktop/load:news:nytimes:2018" }, { @@ -220,11 +220,11 @@ "name": "system_health.common_desktop/load:news:qq:2018" }, { - "duration": "26.0", + "duration": "27.0", "name": "system_health.common_desktop/load:news:reddit:2018" }, { - "duration": "23.0", + "duration": "24.0", "name": "system_health.common_desktop/load:news:wikipedia:2018" }, { @@ -232,11 +232,11 @@ "name": "system_health.common_desktop/load:search:amazon:2018" }, { - "duration": "23.0", + "duration": "22.0", "name": "system_health.common_desktop/load:search:baidu:2018" }, { - "duration": "23.0", + "duration": "24.0", "name": "system_health.common_desktop/load:search:ebay:2018" }, { @@ -244,11 +244,11 @@ "name": "system_health.common_desktop/load:search:flipkart:2018" }, { - "duration": "24.0", + "duration": "25.0", "name": "system_health.common_desktop/load:search:google:2018" }, { - "duration": "23.0", + "duration": "24.0", "name": "system_health.common_desktop/load:search:taobao:2018" }, { @@ -264,11 +264,11 @@ "name": "system_health.common_desktop/load:social:instagram:2018" }, { - "duration": "26.0", + "duration": "27.0", "name": "system_health.common_desktop/load:social:pinterest:2019" }, { - "duration": "24.0", + "duration": "25.0", "name": "system_health.common_desktop/load:social:vk:2018" }, { @@ -276,7 +276,7 @@ "name": "system_health.common_desktop/load:tools:chat:2020" }, { - "duration": "78.0", + "duration": "79.0", "name": "system_health.common_desktop/load:tools:docs:2019" }, { @@ -284,7 +284,7 @@ "name": "system_health.common_desktop/load:tools:drive:2019" }, { - "duration": "9.0", + "duration": "10.0", "name": "system_health.common_desktop/load:tools:gmail:2019" }, { @@ -292,7 +292,7 @@ "name": "system_health.common_desktop/load:tools:stackoverflow:2018" }, { - "duration": "24.0", + "duration": "25.0", "name": "system_health.common_desktop/load:tools:weather:2019" }, { @@ -308,15 +308,15 @@ "name": "system_health.common_desktop/long_running:tools:gmail-background" }, { - "duration": "143.0", + "duration": "145.0", "name": "system_health.common_desktop/long_running:tools:gmail-foreground" }, { - "duration": "16.0", + "duration": "18.0", "name": "system_health.common_desktop/multitab:misc:typical24" }, { - "duration": "139.0", + "duration": "142.0", "name": "system_health.common_desktop/multitab:misc:typical24:2018" }, { @@ -324,7 +324,7 @@ "name": "system_health.common_desktop/play:media:google_play_music" }, { - "duration": "60.0", + "duration": "62.0", "name": "system_health.common_desktop/play:media:soundcloud:2018" }, {
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config index 020c874..87b930f 100644 --- a/tools/perf/expectations.config +++ b/tools/perf/expectations.config
@@ -164,6 +164,11 @@ crbug.com/1230060 [ win-laptop ] rendering.desktop/yahoo_news_2018 [ Skip ] crbug.com/1277970 [ win-laptop ] rendering.desktop/yahoo_sports_2018 [ Skip ] crbug.com/1114664 [ win-laptop ] rendering.desktop/maps_move_2018 [ Skip ] +crbug.com/1306653 [ fuchsia-chrome ] media.desktop/video.html?src=crowd1080_vp9.webm [ Skip ] +crbug.com/1306653 [ fuchsia-chrome ] media.desktop/video.html?src=tulip2.vp9.webm [ Skip ] +crbug.com/1306653 [ fuchsia-chrome ] media.desktop/video.html?src=tulip2.vp9.webm_WiFi [ Skip ] +crbug.com/1306653 [ fuchsia-chrome ] media.desktop/video.html?src=smpte_3840x2160_60fps_vp9.webm&seek [ Skip ] +crbug.com/1306653 [ fuchsia-chrome ] media.desktop/video.html?src=tulip2.vp9.webm&background [ Skip ] # Benchmark: rendering.mobile crbug.com/785485 [ android-webview ] rendering.mobile/kevs_3d [ Skip ]
diff --git a/ui/android/java/res/values-v17/styles.xml b/ui/android/java/res/values-v17/styles.xml index de3f4dab..d492792 100644 --- a/ui/android/java/res/values-v17/styles.xml +++ b/ui/android/java/res/values-v17/styles.xml
@@ -55,6 +55,10 @@ <item name="rippleColor">@color/text_button_ripple_color</item> <item name="buttonRaised">false</item> </style> + <style name="OutlinedButton" parent="TextButton" tools:ignore="UnusedResources"> + <item name="borderWidth">@dimen/button_outlined_border_width</item> + <item name="borderColor">?attr/divider_line_bg_color_dynamic</item> + </style> <!-- Used by Chrome and Content --> <style name="TextAppearance" parent="android:TextAppearance" tools:ignore="UnusedResources" />
diff --git a/ui/android/java/res/values/attrs.xml b/ui/android/java/res/values/attrs.xml index c1d96f2..8a663c6a 100644 --- a/ui/android/java/res/values/attrs.xml +++ b/ui/android/java/res/values/attrs.xml
@@ -19,6 +19,8 @@ android:textAppearance. --> <attr name="buttonTextColor" format="reference"/> <attr name="rippleColor"/> + <attr name="borderColor" format="color"/> + <attr name="borderWidth" format="reference|dimension"/> <!-- Whether the button is elevated. --> <attr name="buttonRaised" format="boolean"/> <!-- The vertical inset of the button background drawable. -->
diff --git a/ui/android/java/res/values/dimens.xml b/ui/android/java/res/values/dimens.xml index 3be44cb..4b116f0 100644 --- a/ui/android/java/res/values/dimens.xml +++ b/ui/android/java/res/values/dimens.xml
@@ -32,6 +32,7 @@ <!-- Button default measures --> <dimen name="button_min_width">88dp</dimen> <dimen name="button_bg_vertical_inset">4dp</dimen> + <dimen name="button_outlined_border_width">1dp</dimen> <!-- Menu footer chip measures--> <!-- ( listPreferredItemHeightSmall(40dp) - text size(12sp) - top and bottom padding(12dp) ) / 2 -->
diff --git a/ui/android/java/src/org/chromium/ui/widget/ButtonCompat.java b/ui/android/java/src/org/chromium/ui/widget/ButtonCompat.java index 117eca2..59252a50 100644 --- a/ui/android/java/src/org/chromium/ui/widget/ButtonCompat.java +++ b/ui/android/java/src/org/chromium/ui/widget/ButtonCompat.java
@@ -69,6 +69,10 @@ a.getResourceId(R.styleable.ButtonCompat_buttonColor, R.color.blue_when_enabled); int rippleColorId = a.getResourceId( R.styleable.ButtonCompat_rippleColor, R.color.filled_button_ripple_color); + int borderColorId = + a.getResourceId(R.styleable.ButtonCompat_borderColor, android.R.color.transparent); + int borderWidthId = a.getResourceId(R.styleable.ButtonCompat_borderWidth, + R.dimen.default_ripple_background_border_size); boolean buttonRaised = a.getBoolean(R.styleable.ButtonCompat_buttonRaised, true); int verticalInset = a.getDimensionPixelSize(R.styleable.ButtonCompat_verticalInset, getResources().getDimensionPixelSize(R.dimen.button_bg_vertical_inset)); @@ -105,8 +109,8 @@ } a.recycle(); - mRippleBackgroundHelper = new RippleBackgroundHelper( - this, buttonColorId, rippleColorId, radii, verticalInset); + mRippleBackgroundHelper = new RippleBackgroundHelper(this, buttonColorId, rippleColorId, + radii, borderColorId, borderWidthId, verticalInset); setRaised(buttonRaised); }
diff --git a/ui/aura/demo/demo_main.cc b/ui/aura/demo/demo_main.cc index c2e8dcd2..9fff7982 100644 --- a/ui/aura/demo/demo_main.cc +++ b/ui/aura/demo/demo_main.cc
@@ -189,7 +189,6 @@ frame_sink_manager.SetLocalClient(&host_frame_sink_manager); auto context_factory = std::make_unique<ui::InProcessContextFactory>( &host_frame_sink_manager, &frame_sink_manager); - context_factory->set_use_test_surface(false); base::PowerMonitor::Initialize( std::make_unique<base::PowerMonitorDeviceSource>());
diff --git a/ui/chromeos/translations/ui_chromeos_strings_az.xtb b/ui/chromeos/translations/ui_chromeos_strings_az.xtb index c7df0d17c..04d39201 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_az.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_az.xtb
@@ -31,6 +31,7 @@ <translation id="1201402288615127009">Növbəti</translation> <translation id="1209796539517632982">Avtomatik ad serverləri</translation> <translation id="1210831758834677569">Laos</translation> +<translation id="1223825810409523901">Chrome artırması</translation> <translation id="1243314992276662751">Yükləyin</translation> <translation id="1249250836236328755">Janr</translation> <translation id="1254593899333212300">Birbaşa İnternet bağlantısı</translation> @@ -80,6 +81,7 @@ <translation id="166439687370499867">Paylaşılmış şəbəkə konfiqurasiyalarının dəyişdirilməsinə icazə verilmir</translation> <translation id="1665611772925418501">Fayl dəyişdirilə bilməz.</translation> <translation id="1673103856845176271">Fayl təhlükəsizlik məqsədilə əldə edilə bilməz.</translation> +<translation id="16762847117768727">ISO şəkli</translation> <translation id="169515659049020177">Shift</translation> <translation id="1715848075824334077">Velosiped sürmə</translation> <translation id="1722487484194605434"><ph name="NUMBER_OF_ITEMS" /> element sıxılır...</translation> @@ -808,6 +810,7 @@ <translation id="7925686952655276919">Sinxronizasiya üçün mobil data istifadə etməyin</translation> <translation id="7928710562641958568">Cihazı çıxarın</translation> <translation id="7943385054491506837">US Colemak</translation> +<translation id="7948417415021769876">7z arxivi</translation> <translation id="7953739707111622108">Bu fayl açıla bilməz, çünki onun fayl sistemi tanınmadı.</translation> <translation id="7969525169268594403">Sloven</translation> <translation id="7972920761225148017">Fransız (İsveçrə)</translation> @@ -857,6 +860,7 @@ <translation id="8372369524088641025">Səhv WEP açarı</translation> <translation id="8372852072747894550">Yunan</translation> <translation id="8386903983509584791">Skan tamamlandı</translation> +<translation id="8387733224523483503"><ph name="FILE_NAME" /> çıxarılıb.</translation> <translation id="8395901698320285466">Ölçülər</translation> <translation id="8408068190360279472"><ph name="NETWORK_TYPE" /> şəbəkəsi, qoşulur</translation> <translation id="8425213833346101688">Dəyişin</translation> @@ -951,6 +955,7 @@ <translation id="9174050671906956834">Zibil qutusundakı elementlər 30 gün sonra həmişəlik silinir.</translation> <translation id="9183302530794969518">Google Sənəd</translation> <translation id="9189836632794948435">Qazax</translation> +<translation id="9200427192836333033"><ph name="NUMBER_OF_ITEMS" /> element çıxarılıb.</translation> <translation id="9213073329713032541">Quraşdırma uğurla başladı.</translation> <translation id="9219103736887031265">Şəkillər</translation> <translation id="9219908252191632183">Qəməri</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_be.xtb b/ui/chromeos/translations/ui_chromeos_strings_be.xtb index e93cf44c0..fb88945 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_be.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_be.xtb
@@ -824,6 +824,7 @@ <translation id="8042602468072383151">Аўдыяфайл фармату <ph name="AUDIO_TYPE" /></translation> <translation id="8045462269890919536">Румынская</translation> <translation id="8049184478152619004">Увядзіце PUK-код</translation> +<translation id="807187749540895545">Вымаецца файл "<ph name="FILE_NAME" />"...</translation> <translation id="8079530767338315840">Паўтараць</translation> <translation id="8087576439476816834">Спампаваць, <ph name="PROFILE_NAME" /></translation> <translation id="8106045200081704138">Абагуленае са мной</translation> @@ -875,6 +876,7 @@ <translation id="8484284835977497781">Выбірайце са сваіх нядаўніх фота.</translation> <translation id="8487700953926739672">Даступна па-за сеткай</translation> <translation id="8492972329130824181">Хатняя сетка недаступная. Каб устанавіць падключэнне, трэба ўключыць роўмінг перадачы даных.</translation> +<translation id="8499098729323186194">Вымаюцца элементы (<ph name="NUMBER_OF_ITEMS" />)...</translation> <translation id="8521441079177373948">Вялікабрытанія</translation> <translation id="8525306231823319788">Поўнаэкранны рэжым</translation> <translation id="853494022971700746">Французская (Францыя)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb index 1d093b9..943548c 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb
@@ -824,6 +824,7 @@ <translation id="8042602468072383151"><ph name="AUDIO_TYPE" /> অডিও</translation> <translation id="8045462269890919536">রোমানিয়</translation> <translation id="8049184478152619004">'পার্সোনাল আনব্লকিং কী' (PUK) লিখুন</translation> +<translation id="807187749540895545"><ph name="FILE_NAME" /> এক্সট্র্যাক্ট করা হচ্ছে...</translation> <translation id="8079530767338315840">পুনরাবৃত্তি করুন</translation> <translation id="8087576439476816834"><ph name="PROFILE_NAME" />, ডাউনলোড করুন</translation> <translation id="8106045200081704138">আমার সাথে শেয়ার করা</translation> @@ -875,6 +876,7 @@ <translation id="8484284835977497781">আপনার সাম্প্রতিক ফটো থেকে বেছে নিন।</translation> <translation id="8487700953926739672">অফলাইনে উপলব্ধ</translation> <translation id="8492972329130824181">হোম নেটওয়ার্ক উপলভ্য নেই। কানেক্ট করতে, মোবাইলে ডেটা রোমিং অবশ্যই চালু থাকতে হবে।</translation> +<translation id="8499098729323186194"><ph name="NUMBER_OF_ITEMS" />টি আইটেম এক্সট্র্যাক্ট করা হচ্ছে...</translation> <translation id="8521441079177373948">যুক্তরাজ্য</translation> <translation id="8525306231823319788">পূর্ণ স্ক্রীণ</translation> <translation id="853494022971700746">ফরাসি (ফ্রান্স)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb index 3b1db8e99..2f0f9c6 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb
@@ -825,6 +825,7 @@ <translation id="8042602468072383151">Àudio <ph name="AUDIO_TYPE" /></translation> <translation id="8045462269890919536">Romanès</translation> <translation id="8049184478152619004">Introdueix la clau de desbloqueig personal (PUK)</translation> +<translation id="807187749540895545">S'està extraient <ph name="FILE_NAME" />...</translation> <translation id="8079530767338315840">Repeteix</translation> <translation id="8087576439476816834">Baixa, <ph name="PROFILE_NAME" /></translation> <translation id="8106045200081704138">Compartit amb mi</translation> @@ -876,6 +877,7 @@ <translation id="8484284835977497781">Tria de les teves fotos recents.</translation> <translation id="8487700953926739672">Disponible sense connexió</translation> <translation id="8492972329130824181">La xarxa domèstica no està disponible. La itinerància de dades mòbils ha d'estar activada per poder connectar-t'hi.</translation> +<translation id="8499098729323186194">S'estan extraient <ph name="NUMBER_OF_ITEMS" /> elements...</translation> <translation id="8521441079177373948">Regne Unit</translation> <translation id="8525306231823319788">Pantalla completa</translation> <translation id="853494022971700746">Francès (França)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_cs.xtb b/ui/chromeos/translations/ui_chromeos_strings_cs.xtb index 46791ca..2e1fbbe 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_cs.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_cs.xtb
@@ -824,6 +824,7 @@ <translation id="8042602468072383151">Zvuk <ph name="AUDIO_TYPE" /></translation> <translation id="8045462269890919536">rumunština</translation> <translation id="8049184478152619004">Zadejte kód PUK</translation> +<translation id="807187749540895545">Rozbalování souboru <ph name="FILE_NAME" />…</translation> <translation id="8079530767338315840">Opakovat</translation> <translation id="8087576439476816834">Stáhnout, <ph name="PROFILE_NAME" /></translation> <translation id="8106045200081704138">Sdíleno se mnou</translation> @@ -875,6 +876,7 @@ <translation id="8484284835977497781">Vyberte ze svých posledních fotek.</translation> <translation id="8487700953926739672">Dostupné offline</translation> <translation id="8492972329130824181">Domácí síť není k dispozici. K připojení musí být zapnutý roaming pro mobilní data.</translation> +<translation id="8499098729323186194">Rozbalování položek (<ph name="NUMBER_OF_ITEMS" />)…</translation> <translation id="8521441079177373948">Britská klávesnice</translation> <translation id="8525306231823319788">Celá obrazovka</translation> <translation id="853494022971700746">francouzština (Francie)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_da.xtb b/ui/chromeos/translations/ui_chromeos_strings_da.xtb index f01467d..d91c8f4b 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_da.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_da.xtb
@@ -825,6 +825,7 @@ <translation id="8042602468072383151"><ph name="AUDIO_TYPE" />-lyd</translation> <translation id="8045462269890919536">Rumænsk</translation> <translation id="8049184478152619004">Angiv PUK-kode</translation> +<translation id="807187749540895545">Udtrækker <ph name="FILE_NAME" />…</translation> <translation id="8079530767338315840">Gentag</translation> <translation id="8087576439476816834">Download, <ph name="PROFILE_NAME" /></translation> <translation id="8106045200081704138">Delt med mig</translation> @@ -876,6 +877,7 @@ <translation id="8484284835977497781">Vælg blandt dine seneste billeder.</translation> <translation id="8487700953926739672">Tilgængelig offline</translation> <translation id="8492972329130824181">Hjemmenetværket er ikke tilgængeligt. Dataroaming med mobildata skal være aktiveret, før du kan oprette forbindelse.</translation> +<translation id="8499098729323186194">Udtrækker <ph name="NUMBER_OF_ITEMS" /> elementer…</translation> <translation id="8521441079177373948">Britisk</translation> <translation id="8525306231823319788">Fuld skærm</translation> <translation id="853494022971700746">Fransk (Frankrig)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb b/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb index 655a089..3f89c8d9 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb
@@ -31,6 +31,7 @@ <translation id="1201402288615127009">Next</translation> <translation id="1209796539517632982">Automatic name servers</translation> <translation id="1210831758834677569">Lao</translation> +<translation id="1223825810409523901">Chrome extension</translation> <translation id="1243314992276662751">Upload</translation> <translation id="1249250836236328755">Genre</translation> <translation id="1254593899333212300">Direct Internet connection</translation> @@ -80,6 +81,7 @@ <translation id="166439687370499867">Changing shared network configurations is not allowed</translation> <translation id="1665611772925418501">The file could not be modified.</translation> <translation id="1673103856845176271">The file could not be accessed for security reasons.</translation> +<translation id="16762847117768727">ISO image</translation> <translation id="169515659049020177">Shift</translation> <translation id="1715848075824334077">Cycling</translation> <translation id="1722487484194605434">Zipping <ph name="NUMBER_OF_ITEMS" /> items…</translation> @@ -811,6 +813,7 @@ <translation id="7925686952655276919">Do not use mobile data for sync</translation> <translation id="7928710562641958568">Eject device</translation> <translation id="7943385054491506837">US Colemak</translation> +<translation id="7948417415021769876">7z archive</translation> <translation id="7953739707111622108">This device cannot be opened because its file system was not recognised.</translation> <translation id="7969525169268594403">Slovenian</translation> <translation id="7972920761225148017">French (Switzerland)</translation> @@ -860,6 +863,7 @@ <translation id="8372369524088641025">Bad WEP key</translation> <translation id="8372852072747894550">Greek</translation> <translation id="8386903983509584791">Scan completed</translation> +<translation id="8387733224523483503"><ph name="FILE_NAME" /> extracted.</translation> <translation id="8395901698320285466">Dimensions</translation> <translation id="8408068190360279472"><ph name="NETWORK_TYPE" /> network, connecting</translation> <translation id="8425213833346101688">Change</translation> @@ -954,6 +958,7 @@ <translation id="9174050671906956834">Items in the bin are deleted forever after 30 days.</translation> <translation id="9183302530794969518">Google Docs</translation> <translation id="9189836632794948435">Kazakh</translation> +<translation id="9200427192836333033"><ph name="NUMBER_OF_ITEMS" /> items extracted.</translation> <translation id="9213073329713032541">Installation successfully started.</translation> <translation id="9219103736887031265">Images</translation> <translation id="9219908252191632183">Lunar</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb b/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb index 36c586a..dabb517 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb
@@ -825,6 +825,7 @@ <translation id="8042602468072383151">Audio <ph name="AUDIO_TYPE" /></translation> <translation id="8045462269890919536">Rumano</translation> <translation id="8049184478152619004">Ingresa la clave personal de desbloqueo (PUK).</translation> +<translation id="807187749540895545">Extrayendo <ph name="FILE_NAME" />…</translation> <translation id="8079530767338315840">Repetir</translation> <translation id="8087576439476816834">Descargar, <ph name="PROFILE_NAME" /></translation> <translation id="8106045200081704138">Compartidos conmigo</translation> @@ -876,6 +877,7 @@ <translation id="8484284835977497781">Elige una de tus fotos recientes.</translation> <translation id="8487700953926739672">Disponible sin conexión</translation> <translation id="8492972329130824181">La red doméstica no está disponible. Debes habilitar el roaming de datos móviles para tener conexión.</translation> +<translation id="8499098729323186194">Extrayendo <ph name="NUMBER_OF_ITEMS" /> elementos...</translation> <translation id="8521441079177373948">Inglés (Reino Unido)</translation> <translation id="8525306231823319788">Pantalla completa</translation> <translation id="853494022971700746">Francés (Francia)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_es.xtb b/ui/chromeos/translations/ui_chromeos_strings_es.xtb index 827726d..b08e83a1 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_es.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_es.xtb
@@ -825,6 +825,7 @@ <translation id="8042602468072383151">Audio <ph name="AUDIO_TYPE" /></translation> <translation id="8045462269890919536">Rumano</translation> <translation id="8049184478152619004">Escribe el código PUK</translation> +<translation id="807187749540895545">Extrayendo <ph name="FILE_NAME" />...</translation> <translation id="8079530767338315840">Repetir</translation> <translation id="8087576439476816834">Descargar, <ph name="PROFILE_NAME" /></translation> <translation id="8106045200081704138">Compartido conmigo</translation> @@ -876,6 +877,7 @@ <translation id="8484284835977497781">Elige entre tus fotos recientes.</translation> <translation id="8487700953926739672">Disponible sin conexión</translation> <translation id="8492972329130824181">La red doméstica no está disponible. Para conectarte, debes habilitar el roaming de datos móviles.</translation> +<translation id="8499098729323186194">Extrayendo <ph name="NUMBER_OF_ITEMS" /> elementos...</translation> <translation id="8521441079177373948">Reino Unido</translation> <translation id="8525306231823319788">Pantalla completa</translation> <translation id="853494022971700746">Francés (Francia)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb b/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb index 4ea4d5b..2d95c306 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb
@@ -826,6 +826,7 @@ <translation id="8042602468072383151">Audio <ph name="AUDIO_TYPE" /></translation> <translation id="8045462269890919536">Roumain</translation> <translation id="8049184478152619004">Entrer la clé personnelle de déblocage</translation> +<translation id="807187749540895545">Extraction de <ph name="FILE_NAME" /> en cours…</translation> <translation id="8079530767338315840">Répéter</translation> <translation id="8087576439476816834">Téléchargement : <ph name="PROFILE_NAME" /></translation> <translation id="8106045200081704138">Partagés avec moi</translation> @@ -877,6 +878,7 @@ <translation id="8484284835977497781">Choisissez parmi vos photos récentes.</translation> <translation id="8487700953926739672">Offert en ligne</translation> <translation id="8492972329130824181">Le réseau domestique n'est pas accessible. L'itinérance sur réseau cellulaire doit être activée pour établir la connexion.</translation> +<translation id="8499098729323186194">Extraction de <ph name="NUMBER_OF_ITEMS" /> éléments en cours…</translation> <translation id="8521441079177373948">R.-U.</translation> <translation id="8525306231823319788">Plein écran</translation> <translation id="853494022971700746">Français (France)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fr.xtb b/ui/chromeos/translations/ui_chromeos_strings_fr.xtb index c8155f18..b7e7ec7 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fr.xtb
@@ -825,6 +825,7 @@ <translation id="8042602468072383151">Fichier audio <ph name="AUDIO_TYPE" /></translation> <translation id="8045462269890919536">Roumain</translation> <translation id="8049184478152619004">Saisissez le code de déblocage personnel (PUK)</translation> +<translation id="807187749540895545">Extraction de <ph name="FILE_NAME" />…</translation> <translation id="8079530767338315840">Répéter</translation> <translation id="8087576439476816834">Télécharger, <ph name="PROFILE_NAME" /></translation> <translation id="8106045200081704138">Partagés avec moi</translation> @@ -876,6 +877,7 @@ <translation id="8484284835977497781">Sélectionnez vos photos récentes.</translation> <translation id="8487700953926739672">Disponible hors connexion</translation> <translation id="8492972329130824181">Le réseau domestique n'est pas disponible. Pour vous y connecter, vous devez activer l'itinérance des données mobiles.</translation> +<translation id="8499098729323186194">Extraction de <ph name="NUMBER_OF_ITEMS" /> éléments...</translation> <translation id="8521441079177373948">Royaume-Uni</translation> <translation id="8525306231823319788">Plein écran</translation> <translation id="853494022971700746">Français (France)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_gl.xtb b/ui/chromeos/translations/ui_chromeos_strings_gl.xtb index 1de5982..00b9256 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_gl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_gl.xtb
@@ -824,6 +824,7 @@ <translation id="8042602468072383151">Audio <ph name="AUDIO_TYPE" /></translation> <translation id="8045462269890919536">Romanés</translation> <translation id="8049184478152619004">Mete a clave de desbloqueo persoal (PUK)</translation> +<translation id="807187749540895545">Extraendo <ph name="FILE_NAME" />…</translation> <translation id="8079530767338315840">Repetir</translation> <translation id="8087576439476816834">Descargar, <ph name="PROFILE_NAME" /></translation> <translation id="8106045200081704138">Compartido comigo</translation> @@ -875,6 +876,7 @@ <translation id="8484284835977497781">Escolle unha das túas fotos recentes.</translation> <translation id="8487700953926739672">Dispoñible sen conexión</translation> <translation id="8492972329130824181">A rede doméstica non está dispoñible. Para conectarte, debes ter activada a itinerancia de datos móbiles.</translation> +<translation id="8499098729323186194">Extraendo <ph name="NUMBER_OF_ITEMS" /> elementos…</translation> <translation id="8521441079177373948">RU</translation> <translation id="8525306231823319788">Pantalla completa</translation> <translation id="853494022971700746">Francés (Francia)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb index 4475beb..70b4710 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb
@@ -823,6 +823,7 @@ <translation id="8042602468072383151"><ph name="AUDIO_TYPE" /> ઑડિયો</translation> <translation id="8045462269890919536">રોમાનિયન</translation> <translation id="8049184478152619004">પર્સનલ અનબ્લૉકિંગ કી (PUK) દાખલ કરો</translation> +<translation id="807187749540895545"><ph name="FILE_NAME" />ને એક્સટ્રેક્ટ કરી રહ્યાં છીએ...</translation> <translation id="8079530767338315840">પુનરાવર્તન કરો</translation> <translation id="8087576439476816834"><ph name="PROFILE_NAME" /> ડાઉનલોડ કરો</translation> <translation id="8106045200081704138">મારી સાથે શેર કરેલા</translation> @@ -874,6 +875,7 @@ <translation id="8484284835977497781">તમારા તાજેતરના ફોટામાંથી પસંદ કરો.</translation> <translation id="8487700953926739672">ઑફલાઇન ઉપલબ્ધ</translation> <translation id="8492972329130824181">હોમ નેટવર્ક ઉપલબ્ધ નથી. કનેક્ટ કરવા માટે મોબાઇલ ડેટા રોમિંગની સુવિધા ચાલુ કરવી આવશ્યક છે.</translation> +<translation id="8499098729323186194"><ph name="NUMBER_OF_ITEMS" /> આઇટમને એક્સટ્રેક્ટ કરી રહ્યાં છીએ...</translation> <translation id="8521441079177373948">યુકે</translation> <translation id="8525306231823319788">પૂર્ણ સ્ક્રીન</translation> <translation id="853494022971700746">ફ્રેન્ચ (ફ્રાન્સ)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_is.xtb b/ui/chromeos/translations/ui_chromeos_strings_is.xtb index 4849b0ca..1b5b7d9c 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_is.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_is.xtb
@@ -824,6 +824,7 @@ <translation id="8042602468072383151"><ph name="AUDIO_TYPE" /> hljóð</translation> <translation id="8045462269890919536">Rúmenskt</translation> <translation id="8049184478152619004">Sláðu inn PUK-númer</translation> +<translation id="807187749540895545">Dregur út <ph name="FILE_NAME" />...</translation> <translation id="8079530767338315840">Endurtaka</translation> <translation id="8087576439476816834">Sækja, <ph name="PROFILE_NAME" /></translation> <translation id="8106045200081704138">Deilt með mér</translation> @@ -875,6 +876,7 @@ <translation id="8484284835977497781">Veldu úr nýlegum myndum.</translation> <translation id="8487700953926739672">Í boði án nettengingar</translation> <translation id="8492972329130824181">Netkerfi heimilisins er ekki í boði. Kveikja verður á reiki farsímagagna til að tengjast.</translation> +<translation id="8499098729323186194">Dregur út <ph name="NUMBER_OF_ITEMS" /> atriði...</translation> <translation id="8521441079177373948">Breskt</translation> <translation id="8525306231823319788">Allur skjárinn</translation> <translation id="853494022971700746">Franska (Frakkland)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb index b99893a..d9151203 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
@@ -826,6 +826,7 @@ <translation id="8042602468072383151">קובץ אודיו בפורמט <ph name="AUDIO_TYPE" /></translation> <translation id="8045462269890919536">רומנית</translation> <translation id="8049184478152619004">יש להזין מפתח אישי לביטול חסימה (PUK)</translation> +<translation id="807187749540895545">מתבצע חילוץ של הקובץ <ph name="FILE_NAME" />…</translation> <translation id="8079530767338315840">חזרה</translation> <translation id="8087576439476816834">הורדה, <ph name="PROFILE_NAME" /></translation> <translation id="8106045200081704138">בשיתוף איתי</translation> @@ -877,6 +878,7 @@ <translation id="8484284835977497781">אפשר לבחור פריטים מתוך התמונות האחרונות.</translation> <translation id="8487700953926739672">זמין אופליין</translation> <translation id="8492972329130824181">הרשת הביתית אינה זמינה. יש להפעיל נדידה בחבילת גלישה כדי להתחבר.</translation> +<translation id="8499098729323186194">מתבצע חילוץ של <ph name="NUMBER_OF_ITEMS" /> פריטים…</translation> <translation id="8521441079177373948">בריטניה</translation> <translation id="8525306231823319788">מסך מלא</translation> <translation id="853494022971700746">צרפתית (צרפת)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ka.xtb b/ui/chromeos/translations/ui_chromeos_strings_ka.xtb index 26ab4f3..f62d6c3f 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ka.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ka.xtb
@@ -31,6 +31,7 @@ <translation id="1201402288615127009">შემდეგი</translation> <translation id="1209796539517632982">ავტომატური სახელის სერვერები</translation> <translation id="1210831758834677569">ლაოსური</translation> +<translation id="1223825810409523901">Chrome გაფართოება</translation> <translation id="1243314992276662751">ატვირთვა</translation> <translation id="1249250836236328755">ჟანრი</translation> <translation id="1254593899333212300">პირდაპირი ინტერნეტ კავშირი</translation> @@ -80,6 +81,7 @@ <translation id="166439687370499867">ზიარი ქსელების კონფიგურაციების შეცვლა დაუშვებელია</translation> <translation id="1665611772925418501">ფაილის შეცვლა შეუძლებელია.</translation> <translation id="1673103856845176271">ფაილზე წვდომა ვერ ხერხდება უსაფრთხოების გამო.</translation> +<translation id="16762847117768727">ISO იმიჯი</translation> <translation id="169515659049020177">Shift</translation> <translation id="1715848075824334077">ველოსიპედით სეირნობა</translation> <translation id="1722487484194605434">მიმდინარეობს <ph name="NUMBER_OF_ITEMS" /> ერთეულის დაარქივება…</translation> @@ -810,6 +812,7 @@ <translation id="7925686952655276919">არ გამოიყენოთ მობილური მონაცემები სინქრონიზაციისთვის</translation> <translation id="7928710562641958568">ამოიღეთ მოწყობილობა</translation> <translation id="7943385054491506837">US Colemak</translation> +<translation id="7948417415021769876">7z არქივი</translation> <translation id="7953739707111622108">ამ მოწყობილობის გახსნა შეუძლებელია, რადგან მისი ფაილური სისტემა არ არის ამოცნობილი.</translation> <translation id="7969525169268594403">სლოვენიური</translation> <translation id="7972920761225148017">ფრანგული (შვეიცარია)</translation> @@ -859,6 +862,7 @@ <translation id="8372369524088641025">ცუდი WEP გასაღები</translation> <translation id="8372852072747894550">ბერძნული</translation> <translation id="8386903983509584791">სკანირება დასრულდა</translation> +<translation id="8387733224523483503"><ph name="FILE_NAME" /> ამოღებულია.</translation> <translation id="8395901698320285466">ზომები</translation> <translation id="8408068190360279472"><ph name="NETWORK_TYPE" /> ქსელი, მიმდინარეობს დაკავშირება</translation> <translation id="8425213833346101688">შეცვლა</translation> @@ -953,6 +957,7 @@ <translation id="9174050671906956834">წაშლილებში არსებული ერთეულები სამუდამოდ წაიშლება 30 დღეში.</translation> <translation id="9183302530794969518">Google Docs</translation> <translation id="9189836632794948435">ყაზახური</translation> +<translation id="9200427192836333033"><ph name="NUMBER_OF_ITEMS" /> ერთეული ამოღებულია.</translation> <translation id="9213073329713032541">ინსტალაცია წარმატებით დაიწყო.</translation> <translation id="9219103736887031265">გამოსახულებები</translation> <translation id="9219908252191632183">მთვარისმიერი</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb index 12ee7e1..5dcfd2b 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb
@@ -825,6 +825,7 @@ <translation id="8042602468072383151"><ph name="AUDIO_TYPE" /> garso įrašas</translation> <translation id="8045462269890919536">Rumunų</translation> <translation id="8049184478152619004">Įveskite asmeninį blokavimo panaikinimo raktą (PUK)</translation> +<translation id="807187749540895545">Išarchyvuojamas failas „<ph name="FILE_NAME" />“...</translation> <translation id="8079530767338315840">Kartoti</translation> <translation id="8087576439476816834">Atsisiųsti „<ph name="PROFILE_NAME" />“</translation> <translation id="8106045200081704138">Bendrinama su manimi</translation> @@ -876,6 +877,7 @@ <translation id="8484284835977497781">Pasirinkite iš naujausių nuotraukų.</translation> <translation id="8487700953926739672">Pasiekiama neprisijungus</translation> <translation id="8492972329130824181">Namų tinklas nepasiekiamas. Norint prisijungti turi būti įgalintas tarptinklinis duomenų ryšys mobiliesiems.</translation> +<translation id="8499098729323186194">Išarchyvuojami elementai (iš viso: <ph name="NUMBER_OF_ITEMS" />)...</translation> <translation id="8521441079177373948">JK</translation> <translation id="8525306231823319788">Viso ekrano režimas</translation> <translation id="853494022971700746">Prancūzų k. (Prancūzija)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lv.xtb b/ui/chromeos/translations/ui_chromeos_strings_lv.xtb index e82c289..04312d2 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_lv.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_lv.xtb
@@ -825,6 +825,7 @@ <translation id="8042602468072383151"><ph name="AUDIO_TYPE" /> audio</translation> <translation id="8045462269890919536">Rumāņu valoda</translation> <translation id="8049184478152619004">Ievadiet personīgo atbloķēšanas atslēgu (PUK)</translation> +<translation id="807187749540895545">Notiek faila “<ph name="FILE_NAME" />” izvilkšana...</translation> <translation id="8079530767338315840">Atkārtot</translation> <translation id="8087576439476816834">Lejupielādēt, profils <ph name="PROFILE_NAME" /></translation> <translation id="8106045200081704138">Kopīgots ar mani</translation> @@ -876,6 +877,7 @@ <translation id="8484284835977497781">Izvēlieties no saviem jaunākajiem fotoattēliem.</translation> <translation id="8487700953926739672">Pieejams bezsaistē</translation> <translation id="8492972329130824181">Mājas tīkls nav pieejams. Lai izveidotu savienojumu, jāiespējo mobilo datu viesabonēšana.</translation> +<translation id="8499098729323186194">Notiek <ph name="NUMBER_OF_ITEMS" /> vienumu izvilkšana...</translation> <translation id="8521441079177373948">Lielbritānijas</translation> <translation id="8525306231823319788">Pilnekrāna režīms</translation> <translation id="853494022971700746">Franču (Francija)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sv.xtb b/ui/chromeos/translations/ui_chromeos_strings_sv.xtb index 7b94858b..c99bd5ff 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sv.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sv.xtb
@@ -825,6 +825,7 @@ <translation id="8042602468072383151"><ph name="AUDIO_TYPE" />-ljud</translation> <translation id="8045462269890919536">rumänska</translation> <translation id="8049184478152619004">Ange PUK-kod (Personal Unblocking Key)</translation> +<translation id="807187749540895545"><ph name="FILE_NAME" /> extraheras …</translation> <translation id="8079530767338315840">Upprepa</translation> <translation id="8087576439476816834">Ladda ned, <ph name="PROFILE_NAME" /></translation> <translation id="8106045200081704138">Delade med mig</translation> @@ -876,6 +877,7 @@ <translation id="8484284835977497781">Välj bland dina senaste foton.</translation> <translation id="8487700953926739672">Tillgänglig offline</translation> <translation id="8492972329130824181">Hemnätverket är inte tillgängligt. Dataroaming med mobildata måste aktiveras för anslutningen.</translation> +<translation id="8499098729323186194"><ph name="NUMBER_OF_ITEMS" /> objekt extraheras …</translation> <translation id="8521441079177373948">Storbritannien</translation> <translation id="8525306231823319788">Helskärm</translation> <translation id="853494022971700746">franska (Frankrike)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sw.xtb b/ui/chromeos/translations/ui_chromeos_strings_sw.xtb index 185015e..6aa6471 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sw.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sw.xtb
@@ -825,6 +825,7 @@ <translation id="8042602468072383151">Faili ya sauti ya <ph name="AUDIO_TYPE" /></translation> <translation id="8045462269890919536">Kiromania</translation> <translation id="8049184478152619004">Weka Nambari Binafsi ya Kufungua (PUK)</translation> +<translation id="807187749540895545">Inatoa <ph name="FILE_NAME" /> ...</translation> <translation id="8079530767338315840">Rudia</translation> <translation id="8087576439476816834">Pakua, <ph name="PROFILE_NAME" /></translation> <translation id="8106045200081704138">Zilizoshirikiwa na mimi</translation> @@ -876,6 +877,7 @@ <translation id="8484284835977497781">Chagua miongoni mwa picha zako za hivi majuzi.</translation> <translation id="8487700953926739672">Kinapatikana nje ya mtandao</translation> <translation id="8492972329130824181">Mtandao wa nyumbani haupatikani. Ni lazima uwashe kipengele cha matumizi ya data kwenye mitandao ya simu ya ng'ambo ili uweze kuunganisha.</translation> +<translation id="8499098729323186194">Inatoa vipengee <ph name="NUMBER_OF_ITEMS" /> ...</translation> <translation id="8521441079177373948">Kiingereza cha Uingereza</translation> <translation id="8525306231823319788">Skrini nzima</translation> <translation id="853494022971700746">Kifaransa (Ufaransa)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_th.xtb b/ui/chromeos/translations/ui_chromeos_strings_th.xtb index 1dd9dad..df58a40 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_th.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_th.xtb
@@ -825,6 +825,7 @@ <translation id="8042602468072383151">เสียง <ph name="AUDIO_TYPE" /></translation> <translation id="8045462269890919536">โรมาเนีย</translation> <translation id="8049184478152619004">ป้อนคีย์การเลิกบล็อกส่วนตัว (PUK)</translation> +<translation id="807187749540895545">กำลังแตกข้อมูลของ <ph name="FILE_NAME" />...</translation> <translation id="8079530767338315840">เล่นซ้ำ</translation> <translation id="8087576439476816834">ดาวน์โหลด <ph name="PROFILE_NAME" /></translation> <translation id="8106045200081704138">ที่แชร์กับฉัน</translation> @@ -876,6 +877,7 @@ <translation id="8484284835977497781">เลือกจากรูปภาพล่าสุด</translation> <translation id="8487700953926739672">ใช้งานแบบออฟไลน์ได้</translation> <translation id="8492972329130824181">เครือข่ายในบ้านไม่พร้อมใช้งาน ต้องเปิดใช้การโรมมิ่งอินเทอร์เน็ตมือถือเพื่อเชื่อมต่อ</translation> +<translation id="8499098729323186194">กำลังแตกข้อมูล <ph name="NUMBER_OF_ITEMS" /> รายการ...</translation> <translation id="8521441079177373948">สหราชอาณาจักร</translation> <translation id="8525306231823319788">เต็มหน้าจอ</translation> <translation id="853494022971700746">ฝรั่งเศส (ฝรั่งเศส)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb index 80851e0..898bef7 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
@@ -825,6 +825,7 @@ <translation id="8042602468072383151"><ph name="AUDIO_TYPE" /> ses</translation> <translation id="8045462269890919536">Rumence</translation> <translation id="8049184478152619004">Kişisel Engelleme Kaldırma Anahtarını (PUK) girin</translation> +<translation id="807187749540895545"><ph name="FILE_NAME" /> çıkarılıyor...</translation> <translation id="8079530767338315840">Tekrarla</translation> <translation id="8087576439476816834">İndir, <ph name="PROFILE_NAME" /></translation> <translation id="8106045200081704138">Benimle paylaşılanlar</translation> @@ -876,6 +877,7 @@ <translation id="8484284835977497781">Son fotoğraflarınızdan seçin.</translation> <translation id="8487700953926739672">Çevrimdışı kullanılabilir</translation> <translation id="8492972329130824181">Ev ağı kullanılamıyor. Bağlanmak için mobil veri dolaşımı etkinleştirilmelidir.</translation> +<translation id="8499098729323186194"><ph name="NUMBER_OF_ITEMS" /> öğe çıkarılıyor...</translation> <translation id="8521441079177373948">İngiltere</translation> <translation id="8525306231823319788">Tam ekran</translation> <translation id="853494022971700746">Fransızca (Fransa)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_uk.xtb b/ui/chromeos/translations/ui_chromeos_strings_uk.xtb index 124136b..7fa09808d 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_uk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_uk.xtb
@@ -825,6 +825,7 @@ <translation id="8042602468072383151">Аудіо <ph name="AUDIO_TYPE" /></translation> <translation id="8045462269890919536">Румунська</translation> <translation id="8049184478152619004">Введіть PUK-код</translation> +<translation id="807187749540895545">Видобування файлу "<ph name="FILE_NAME" />"…</translation> <translation id="8079530767338315840">Повторити</translation> <translation id="8087576439476816834">Завантажити профіль <ph name="PROFILE_NAME" /></translation> <translation id="8106045200081704138">Відкриті для мене</translation> @@ -876,6 +877,7 @@ <translation id="8484284835977497781">Вибирайте зі своїх нещодавніх фотографій.</translation> <translation id="8487700953926739672">Доступ у режимі офлайн</translation> <translation id="8492972329130824181">Домашня мережа недоступна. Щоб підключитися, потрібно ввімкнути роумінг мобільних даних.</translation> +<translation id="8499098729323186194">Видобування елементів (<ph name="NUMBER_OF_ITEMS" />)…</translation> <translation id="8521441079177373948">Англійська (Велика Британія)</translation> <translation id="8525306231823319788">На весь екран</translation> <translation id="853494022971700746">Французька (Франція)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ur.xtb b/ui/chromeos/translations/ui_chromeos_strings_ur.xtb index 5cc9711..b3b2e2a 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ur.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ur.xtb
@@ -824,6 +824,7 @@ <translation id="8042602468072383151"><ph name="AUDIO_TYPE" /> آڈیو</translation> <translation id="8045462269890919536">رومنی</translation> <translation id="8049184478152619004">غیر مسدود کرنے کی ذاتی کلید درج کریں (PUK)</translation> +<translation id="807187749540895545"><ph name="FILE_NAME" /> کو اخذ کیا جا رہا ہے…</translation> <translation id="8079530767338315840">دہرائیں</translation> <translation id="8087576439476816834">ڈاؤن لوڈ کریں، <ph name="PROFILE_NAME" /></translation> <translation id="8106045200081704138">میرے ساتھ اشتراک کردہ</translation> @@ -875,6 +876,7 @@ <translation id="8484284835977497781">اپنی حالیہ تصاویر سے منتخب کریں۔</translation> <translation id="8487700953926739672">آف لائن دستیاب ہے</translation> <translation id="8492972329130824181">ہوم نیٹ ورک دستیاب نہیں ہے۔ منسلک ہونے کیلئے موبائل ڈیٹا رومنگ کو فعال کرنا ہوگا۔</translation> +<translation id="8499098729323186194"><ph name="NUMBER_OF_ITEMS" /> آئٹمز کو اخذ کیا جا رہا ہے…</translation> <translation id="8521441079177373948">UK</translation> <translation id="8525306231823319788">پوری اسکرین</translation> <translation id="853494022971700746">فرانسیسی (فرانس)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb index d55ecec..a520cfa 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb
@@ -820,6 +820,7 @@ <translation id="8042602468072383151"><ph name="AUDIO_TYPE" /> 音频</translation> <translation id="8045462269890919536">罗马尼亚语</translation> <translation id="8049184478152619004">输入个人解锁密钥 (PUK)</translation> +<translation id="807187749540895545">正在提取 <ph name="FILE_NAME" />…</translation> <translation id="8079530767338315840">重复播放</translation> <translation id="8087576439476816834">下载,<ph name="PROFILE_NAME" /></translation> <translation id="8106045200081704138">与我共享</translation> @@ -871,6 +872,7 @@ <translation id="8484284835977497781">从您的近期照片中选择。</translation> <translation id="8487700953926739672">可离线使用</translation> <translation id="8492972329130824181">无法使用家庭网络。必须启用移动数据漫游才能联网。</translation> +<translation id="8499098729323186194">正在提取 <ph name="NUMBER_OF_ITEMS" /> 个项目…</translation> <translation id="8521441079177373948">英国英语</translation> <translation id="8525306231823319788">全屏</translation> <translation id="853494022971700746">法语(法国)</translation>
diff --git a/ui/color/color_provider_manager.cc b/ui/color/color_provider_manager.cc index ee572e2..fd2f2537 100644 --- a/ui/color/color_provider_manager.cc +++ b/ui/color/color_provider_manager.cc
@@ -42,6 +42,10 @@ } // namespace +ColorProviderManager::InitializerSupplier::InitializerSupplier() = default; + +ColorProviderManager::InitializerSupplier::~InitializerSupplier() = default; + ColorProviderManager::Key::Key() : Key(ColorMode::kLight, ContrastMode::kNormal, @@ -49,11 +53,12 @@ FrameType::kChromium, nullptr) {} -ColorProviderManager::Key::Key(ColorMode color_mode, - ContrastMode contrast_mode, - SystemTheme system_theme, - FrameType frame_type, - scoped_refptr<InitializerSupplier> custom_theme) +ColorProviderManager::Key::Key( + ColorMode color_mode, + ContrastMode contrast_mode, + SystemTheme system_theme, + FrameType frame_type, + scoped_refptr<ThemeInitializerSupplier> custom_theme) : color_mode(color_mode), contrast_mode(contrast_mode), elevation_mode(ElevationMode::kLow),
diff --git a/ui/color/color_provider_manager.h b/ui/color/color_provider_manager.h index af64d735..45d576dd 100644 --- a/ui/color/color_provider_manager.h +++ b/ui/color/color_provider_manager.h
@@ -12,6 +12,7 @@ #include "base/callback_list.h" #include "base/component_export.h" #include "base/containers/flat_map.h" +#include "base/memory/weak_ptr.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/gfx/color_utils.h" @@ -54,14 +55,30 @@ kNative, }; - // Threadsafe not because ColorProviderManager requires it but because a - // concrete subclass does. - class InitializerSupplier - : public base::RefCountedThreadSafe<InitializerSupplier> { + class COMPONENT_EXPORT(COLOR) InitializerSupplier { public: + InitializerSupplier(); // Adds any mixers necessary to represent this supplier. virtual void AddColorMixers(ColorProvider* provider, const Key& key) const = 0; + + base::WeakPtr<InitializerSupplier> get_weak_ref() { + return weak_factory_.GetWeakPtr(); + } + + protected: + virtual ~InitializerSupplier(); + + private: + base::WeakPtrFactory<InitializerSupplier> weak_factory_{this}; + }; + + // Threadsafe not because ColorProviderManager requires it but because a + // concrete subclass does. + class COMPONENT_EXPORT(COLOR) ThemeInitializerSupplier + : public InitializerSupplier, + public base::RefCountedThreadSafe<ThemeInitializerSupplier> { + public: // The mixers may need access to the raw colors from the theme. virtual bool GetColor(int id, SkColor* color) const = 0; // The mixers will also need access to the tints provided by the theme. @@ -71,10 +88,10 @@ virtual bool HasCustomImage(int id) const = 0; protected: - virtual ~InitializerSupplier() = default; + ~ThemeInitializerSupplier() override = default; private: - friend class base::RefCountedThreadSafe<InitializerSupplier>; + friend class base::RefCountedThreadSafe<ThemeInitializerSupplier>; }; struct COMPONENT_EXPORT(COLOR) Key { @@ -83,7 +100,7 @@ ContrastMode contrast_mode, SystemTheme system_theme, FrameType frame_type, - scoped_refptr<InitializerSupplier> custom_theme); + scoped_refptr<ThemeInitializerSupplier> custom_theme); Key(const Key&); Key& operator=(const Key&); ~Key(); @@ -92,14 +109,19 @@ ElevationMode elevation_mode; SystemTheme system_theme; FrameType frame_type; - scoped_refptr<InitializerSupplier> custom_theme; + scoped_refptr<ThemeInitializerSupplier> custom_theme; + base::WeakPtr<InitializerSupplier> app_controller; bool operator<(const Key& other) const { - return std::make_tuple(color_mode, contrast_mode, elevation_mode, - system_theme, frame_type, custom_theme) < - std::make_tuple(other.color_mode, other.contrast_mode, - other.elevation_mode, other.system_theme, - other.frame_type, other.custom_theme); + const auto lhs = + std::make_tuple(color_mode, contrast_mode, elevation_mode, + system_theme, frame_type, custom_theme); + const auto rhs = std::make_tuple(other.color_mode, other.contrast_mode, + other.elevation_mode, other.system_theme, + other.frame_type, other.custom_theme); + if (lhs == rhs) + return app_controller.get() < other.app_controller.get(); + return lhs < rhs; } };
diff --git a/ui/color/color_provider_source.h b/ui/color/color_provider_source.h index 12fe544..9edf7fa 100644 --- a/ui/color/color_provider_source.h +++ b/ui/color/color_provider_source.h
@@ -26,8 +26,8 @@ ColorProviderSource(); virtual ~ColorProviderSource(); - // Implementations should return the ColorProviderInstance associated with - // this source. + // Returns the ColorProvider associated with the Key returned by + // GetColorProviderKey(); virtual const ColorProvider* GetColorProvider() const = 0; void AddObserver(ColorProviderSourceObserver* observer); @@ -41,6 +41,11 @@ return observers_; } + protected: + // Implementations should return the ColorProviderManager::Key associated with + // this source. + virtual ColorProviderManager::Key GetColorProviderKey() const = 0; + private: base::ObserverList<ColorProviderSourceObserver> observers_; };
diff --git a/ui/color/color_provider_source_observer_unittest.cc b/ui/color/color_provider_source_observer_unittest.cc index 4ed1648b..dab824a5 100644 --- a/ui/color/color_provider_source_observer_unittest.cc +++ b/ui/color/color_provider_source_observer_unittest.cc
@@ -15,6 +15,10 @@ class MockColorProviderSource : public ColorProviderSource { public: + MOCK_METHOD(ColorProviderManager::Key, + GetColorProviderKey, + (), + (const, override)); MOCK_METHOD(const ColorProvider*, GetColorProvider, (), (const, override)); };
diff --git a/ui/compositor/test/in_process_context_factory.cc b/ui/compositor/test/in_process_context_factory.cc index 8f51014..9c8414c0 100644 --- a/ui/compositor/test/in_process_context_factory.cc +++ b/ui/compositor/test/in_process_context_factory.cc
@@ -15,7 +15,6 @@ #include "base/threading/thread.h" #include "build/build_config.h" #include "cc/base/switches.h" -#include "cc/test/pixel_test_output_surface.h" #include "components/viz/common/features.h" #include "components/viz/common/frame_sinks/begin_frame_args.h" #include "components/viz/common/frame_sinks/begin_frame_source.h" @@ -62,89 +61,6 @@ // This should not conflict with ids from RenderWidgetHostImpl or WindowService. constexpr uint32_t kDefaultClientId = std::numeric_limits<uint32_t>::max() / 2; -// An OutputSurface implementation that directly draws and swaps to an actual -// GL surface. -class DirectOutputSurface : public viz::OutputSurface { - public: - explicit DirectOutputSurface( - scoped_refptr<InProcessContextProvider> context_provider) - : viz::OutputSurface(context_provider) { - capabilities_.output_surface_origin = - context_provider->ContextCapabilities().surface_origin; - } - - DirectOutputSurface(const DirectOutputSurface&) = delete; - DirectOutputSurface& operator=(const DirectOutputSurface&) = delete; - - ~DirectOutputSurface() override {} - - // viz::OutputSurface implementation. - void BindToClient(viz::OutputSurfaceClient* client) override { - client_ = client; - } - void EnsureBackbuffer() override {} - void DiscardBackbuffer() override {} - void BindFramebuffer() override { - context_provider()->ContextGL()->BindFramebuffer(GL_FRAMEBUFFER, 0); - } - void Reshape(const gfx::Size& size, - float device_scale_factor, - const gfx::ColorSpace& color_space, - gfx::BufferFormat format, - bool use_stencil) override { - context_provider()->ContextGL()->ResizeCHROMIUM( - size.width(), size.height(), device_scale_factor, - color_space.AsGLColorSpace(), gfx::AlphaBitsForBufferFormat(format)); - } - void SwapBuffers(viz::OutputSurfaceFrame frame) override { - DCHECK(context_provider_.get()); - if (frame.sub_buffer_rect) { - context_provider_->ContextSupport()->PartialSwapBuffers( - *frame.sub_buffer_rect, 0 /* flags */, base::DoNothing(), - base::DoNothing()); - } else { - context_provider_->ContextSupport()->Swap( - 0 /* flags */, base::DoNothing(), base::DoNothing()); - } - gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL(); - gpu::SyncToken sync_token; - gl->GenUnverifiedSyncTokenCHROMIUM(sync_token.GetData()); - - context_provider_->ContextSupport()->SignalSyncToken( - sync_token, base::BindOnce(&DirectOutputSurface::OnSwapBuffersComplete, - weak_ptr_factory_.GetWeakPtr())); - } - uint32_t GetFramebufferCopyTextureFormat() override { - auto* gl = static_cast<InProcessContextProvider*>(context_provider()); - return gl->GetCopyTextureInternalFormat(); - } - bool IsDisplayedAsOverlayPlane() const override { return false; } - unsigned GetOverlayTextureId() const override { return 0; } - bool HasExternalStencilTest() const override { return false; } - void ApplyExternalStencil() override {} - unsigned UpdateGpuFence() override { return 0; } - void SetUpdateVSyncParametersCallback( - viz::UpdateVSyncParametersCallback callback) override {} - void SetDisplayTransformHint(gfx::OverlayTransform transform) override {} - gfx::OverlayTransform GetDisplayTransform() override { - return gfx::OVERLAY_TRANSFORM_NONE; - } - - private: - void OnSwapBuffersComplete() { - // Metrics tracking in OutputSurfaceClient expects non-null SwapTimings - // so we provide dummy values here. - base::TimeTicks now = base::TimeTicks::Now(); - gfx::SwapTimings timings = {now, now}; - client_->DidReceiveSwapBuffersAck(timings, - /*release_fence=*/gfx::GpuFenceHandle()); - client_->DidReceivePresentationFeedback(gfx::PresentationFeedback()); - } - - raw_ptr<viz::OutputSurfaceClient> client_ = nullptr; - base::WeakPtrFactory<DirectOutputSurface> weak_ptr_factory_{this}; -}; - } // namespace // TODO(rivr): This class is managed heavily by InProcessTransportFactory. @@ -243,16 +159,7 @@ InProcessContextFactory::InProcessContextFactory( viz::HostFrameSinkManager* host_frame_sink_manager, viz::FrameSinkManagerImpl* frame_sink_manager) - : InProcessContextFactory(host_frame_sink_manager, - frame_sink_manager, - features::IsUsingSkiaRenderer()) {} - -InProcessContextFactory::InProcessContextFactory( - viz::HostFrameSinkManager* host_frame_sink_manager, - viz::FrameSinkManagerImpl* frame_sink_manager, - bool use_skia_renderer) : frame_sink_id_allocator_(kDefaultClientId), - use_test_surface_(true), disable_vsync_(base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kDisableVsyncForTests)), host_frame_sink_manager_(host_frame_sink_manager), @@ -261,8 +168,6 @@ DCHECK_NE(gl::GetGLImplementation(), gl::kGLImplementationNone) << "If running tests, ensure that main() is calling " << "gl::GLSurfaceTestSupport::InitializeOneOff()"; - if (use_skia_renderer) - renderer_settings_.use_skia_renderer = true; #if BUILDFLAG(IS_APPLE) renderer_settings_.release_overlay_resources_after_gpu_query = true; // Ensure that tests don't wait for frames that will never come. @@ -302,60 +207,15 @@ if (!data) data = CreatePerCompositorData(compositor.get()); - scoped_refptr<InProcessContextProvider> context_provider; - if (renderer_settings_.use_skia_renderer) { - // SkiaRenderer doesn't need a ContextProvider per ui::Compositor so just - // use the shared main thread context. - SharedMainThreadContextProvider(); - DCHECK(shared_main_thread_contexts_); - context_provider = shared_main_thread_contexts_; - } else { - gpu::ContextCreationAttribs attribs; - attribs.alpha_size = 8; - attribs.blue_size = 8; - attribs.green_size = 8; - attribs.red_size = 8; - attribs.depth_size = 0; - attribs.stencil_size = 0; - attribs.samples = 0; - attribs.sample_buffers = 0; - attribs.fail_if_major_perf_caveat = false; - attribs.bind_generates_resource = false; - - constexpr bool support_locking = false; - context_provider = InProcessContextProvider::Create( - attribs, &gpu_memory_buffer_manager_, &image_factory_, - data->surface_handle(), "UICompositor", support_locking); - - auto context_result = context_provider->BindToCurrentThread(); - DCHECK_EQ(context_result, gpu::ContextResult::kSuccess); - } - - std::unique_ptr<viz::OutputSurface> display_output_surface; - std::unique_ptr<viz::DisplayCompositorMemoryAndTaskController> - display_dependency; - - if (renderer_settings_.use_skia_renderer) { - auto skia_deps = std::make_unique<viz::SkiaOutputSurfaceDependencyImpl>( - viz::TestGpuServiceHolder::GetInstance()->gpu_service(), - gpu::kNullSurfaceHandle); - display_dependency = - std::make_unique<viz::DisplayCompositorMemoryAndTaskController>( - std::move(skia_deps)); - display_output_surface = viz::SkiaOutputSurfaceImpl::Create( - display_dependency.get(), renderer_settings_, &debug_settings_); - } else if (use_test_surface_) { - // The |context_provider| will contain an InProcessCommandBuffer, which will - // make a gpu::GpuTaskSchedulerHelper if one is not provided. - gfx::SurfaceOrigin surface_origin = gfx::SurfaceOrigin::kBottomLeft; - display_output_surface = std::make_unique<cc::PixelTestOutputSurface>( - context_provider, surface_origin); - } else { - // The |context_provider| will contain an InProcessCommandBuffer, which will - // make a gpu::GpuTaskSchedulerHelper if one is not provided. - display_output_surface = - std::make_unique<DirectOutputSurface>(context_provider); - } + auto skia_deps = std::make_unique<viz::SkiaOutputSurfaceDependencyImpl>( + viz::TestGpuServiceHolder::GetInstance()->gpu_service(), + gpu::kNullSurfaceHandle); + auto display_dependency = + std::make_unique<viz::DisplayCompositorMemoryAndTaskController>( + std::move(skia_deps)); + std::unique_ptr<viz::OutputSurface> output_surface = + viz::SkiaOutputSurfaceImpl::Create(display_dependency.get(), + renderer_settings_, &debug_settings_); auto overlay_processor = std::make_unique<viz::OverlayProcessorStub>(); @@ -375,13 +235,13 @@ } auto scheduler = std::make_unique<viz::DisplayScheduler>( begin_frame_source.get(), compositor->task_runner().get(), - display_output_surface->capabilities().pending_swap_params, + output_surface->capabilities().pending_swap_params, /*hint_session_factory=*/nullptr); data->SetDisplay(std::make_unique<viz::Display>( &shared_bitmap_manager_, renderer_settings_, &debug_settings_, compositor->frame_sink_id(), std::move(display_dependency), - std::move(display_output_surface), std::move(overlay_processor), + std::move(output_surface), std::move(overlay_processor), std::move(scheduler), compositor->task_runner())); frame_sink_manager_->RegisterBeginFrameSource(begin_frame_source.get(), compositor->frame_sink_id()); @@ -391,7 +251,7 @@ auto layer_tree_frame_sink = std::make_unique<DirectLayerTreeFrameSink>( compositor->frame_sink_id(), frame_sink_manager_, data->display(), - context_provider, shared_worker_context_provider_, + SharedMainThreadContextProvider(), shared_worker_context_provider_, compositor->task_runner(), &gpu_memory_buffer_manager_); compositor->SetLayerTreeFrameSink(std::move(layer_tree_frame_sink), data);
diff --git a/ui/compositor/test/in_process_context_factory.h b/ui/compositor/test/in_process_context_factory.h index 29df1f18..b33e266 100644 --- a/ui/compositor/test/in_process_context_factory.h +++ b/ui/compositor/test/in_process_context_factory.h
@@ -33,15 +33,11 @@ class InProcessContextFactory : public ContextFactory { public: // Both |host_frame_sink_manager| and |frame_sink_manager| must outlive the - // ContextFactory. The constructor without |use_skia_renderer| will use - // SkiaRenderer if the feature is enabled. + // ContextFactory. // TODO(crbug.com/657959): |frame_sink_manager| should go away and we should // use the LayerTreeFrameSink from the HostFrameSinkManager. InProcessContextFactory(viz::HostFrameSinkManager* host_frame_sink_manager, viz::FrameSinkManagerImpl* frame_sink_manager); - InProcessContextFactory(viz::HostFrameSinkManager* host_frame_sink_manager, - viz::FrameSinkManagerImpl* frame_sink_manager, - bool use_skia_renderer); InProcessContextFactory(const InProcessContextFactory&) = delete; InProcessContextFactory& operator=(const InProcessContextFactory&) = delete; @@ -52,12 +48,6 @@ return frame_sink_manager_; } - // If true (the default) an OutputSurface is created that does not display - // anything. Set to false if you want to see results on the screen. - void set_use_test_surface(bool use_test_surface) { - use_test_surface_ = use_test_surface; - } - // Set refresh rate will be set to 200 to spend less time waiting for // BeginFrame when used for tests. void SetUseFastRefreshRateForTests(); @@ -96,7 +86,6 @@ cc::TestTaskGraphRunner task_graph_runner_; viz::FrameSinkIdAllocator frame_sink_id_allocator_; viz::SubtreeCaptureIdAllocator subtree_capture_id_allocator_; - bool use_test_surface_; bool disable_vsync_ = false; double refresh_rate_ = 60.0; const raw_ptr<viz::HostFrameSinkManager> host_frame_sink_manager_;
diff --git a/ui/compositor/test/in_process_context_provider.cc b/ui/compositor/test/in_process_context_provider.cc index b130545..008c9c8 100644 --- a/ui/compositor/test/in_process_context_provider.cc +++ b/ui/compositor/test/in_process_context_provider.cc
@@ -29,19 +29,6 @@ namespace ui { // static -scoped_refptr<InProcessContextProvider> InProcessContextProvider::Create( - const gpu::ContextCreationAttribs& attribs, - gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, - gpu::ImageFactory* image_factory, - gpu::SurfaceHandle window, - const std::string& debug_name, - bool support_locking) { - return new InProcessContextProvider(attribs, gpu_memory_buffer_manager, - image_factory, window, debug_name, - support_locking); -} - -// static scoped_refptr<InProcessContextProvider> InProcessContextProvider::CreateOffscreen( gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, @@ -62,23 +49,18 @@ attribs.enable_gles2_interface = !is_worker; attribs.enable_oop_rasterization = is_worker; return new InProcessContextProvider(attribs, gpu_memory_buffer_manager, - image_factory, gpu::kNullSurfaceHandle, - "Offscreen", is_worker); + image_factory, is_worker); } InProcessContextProvider::InProcessContextProvider( const gpu::ContextCreationAttribs& attribs, gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, gpu::ImageFactory* image_factory, - gpu::SurfaceHandle window, - const std::string& debug_name, bool support_locking) : support_locking_(support_locking), attribs_(attribs), gpu_memory_buffer_manager_(gpu_memory_buffer_manager), - image_factory_(image_factory), - window_(window), - debug_name_(debug_name) { + image_factory_(image_factory) { DCHECK(main_thread_checker_.CalledOnValidThread()); context_thread_checker_.DetachFromThread(); } @@ -107,7 +89,6 @@ auto* holder = viz::TestGpuServiceHolder::GetInstance(); if (attribs_.enable_oop_rasterization) { - DCHECK_EQ(window_, gpu::kNullSurfaceHandle); DCHECK(!attribs_.enable_gles2_interface); DCHECK(!attribs_.enable_grcontext); @@ -124,7 +105,7 @@ bind_result_ = gles2_context_->Initialize( viz::TestGpuServiceHolder::GetInstance()->task_executor(), /*surface=*/nullptr, - /*is_offscreen=*/window_ == gpu::kNullSurfaceHandle, window_, attribs_, + /*is_offscreen=*/true, gpu::kNullSurfaceHandle, attribs_, gpu::SharedMemoryLimits(), gpu_memory_buffer_manager_, image_factory_, /*gpu_task_scheduler=*/nullptr, /*display_controller_on_gpu=*/nullptr,
diff --git a/ui/compositor/test/in_process_context_provider.h b/ui/compositor/test/in_process_context_provider.h index 831f7cf0..77f18c5 100644 --- a/ui/compositor/test/in_process_context_provider.h +++ b/ui/compositor/test/in_process_context_provider.h
@@ -42,14 +42,6 @@ public viz::ContextProvider, public viz::RasterContextProvider { public: - static scoped_refptr<InProcessContextProvider> Create( - const gpu::ContextCreationAttribs& attribs, - gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, - gpu::ImageFactory* image_factory, - gpu::SurfaceHandle window, - const std::string& debug_name, - bool support_locking); - // Uses default attributes for creating an offscreen context. If `is_worker` // is true then the context will support locking and OOP-R (through // RasterInterface) and won't support GLES2 or GrContext. @@ -91,8 +83,6 @@ const gpu::ContextCreationAttribs& attribs, gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, gpu::ImageFactory* image_factory, - gpu::SurfaceHandle window, - const std::string& debug_name, bool support_locking); ~InProcessContextProvider() override; @@ -118,8 +108,6 @@ gpu::ContextCreationAttribs attribs_; raw_ptr<gpu::GpuMemoryBufferManager> gpu_memory_buffer_manager_; raw_ptr<gpu::ImageFactory> image_factory_; - gpu::SurfaceHandle window_; - std::string debug_name_; base::Lock context_lock_;
diff --git a/ui/compositor/test/test_context_factories.cc b/ui/compositor/test/test_context_factories.cc index 6e8ab4b..60aec31 100644 --- a/ui/compositor/test/test_context_factories.cc +++ b/ui/compositor/test/test_context_factories.cc
@@ -15,11 +15,7 @@ namespace ui { -TestContextFactories::TestContextFactories(bool enable_pixel_output) - : TestContextFactories(enable_pixel_output, - features::IsUsingSkiaRenderer()) {} -TestContextFactories::TestContextFactories(bool enable_pixel_output, - bool use_skia_renderer) { +TestContextFactories::TestContextFactories(bool enable_pixel_output) { auto* command_line = base::CommandLine::ForCurrentProcess(); if (command_line->HasSwitch(switches::kEnablePixelOutputInTests)) enable_pixel_output = true; @@ -30,8 +26,7 @@ viz::FrameSinkManagerImpl::InitParams(shared_bitmap_manager_.get())); host_frame_sink_manager_ = std::make_unique<viz::HostFrameSinkManager>(); implicit_factory_ = std::make_unique<InProcessContextFactory>( - host_frame_sink_manager_.get(), frame_sink_manager_.get(), - use_skia_renderer); + host_frame_sink_manager_.get(), frame_sink_manager_.get()); implicit_factory_->SetUseFastRefreshRateForTests(); // Directly connect without using Mojo. @@ -45,8 +40,4 @@ return implicit_factory_.get(); } -void TestContextFactories::SetUseTestSurface(bool use_test_surface) { - implicit_factory_->set_use_test_surface(use_test_surface); -} - } // namespace ui
diff --git a/ui/compositor/test/test_context_factories.h b/ui/compositor/test/test_context_factories.h index a665a1f..2709f36 100644 --- a/ui/compositor/test/test_context_factories.h +++ b/ui/compositor/test/test_context_factories.h
@@ -29,7 +29,6 @@ class TestContextFactories { public: explicit TestContextFactories(bool enable_pixel_output); - TestContextFactories(bool enable_pixel_output, bool use_skia_renderer); ~TestContextFactories(); TestContextFactories(const TestContextFactories&) = delete; @@ -37,11 +36,6 @@ ContextFactory* GetContextFactory() const; - // See InProcessContextFactory::set_use_test_surface(). - // If true (the default) an OutputSurface is created that does not display - // anything. Set to false if you want to see results on the screen. - void SetUseTestSurface(bool use_test_surface); - private: std::unique_ptr<gl::DisableNullDrawGLBindings> disable_null_draw_; std::unique_ptr<viz::ServerSharedBitmapManager> shared_bitmap_manager_;
diff --git a/ui/gfx/color_conversion_sk_filter_cache.cc b/ui/gfx/color_conversion_sk_filter_cache.cc index 14d53702..4a31ee39 100644 --- a/ui/gfx/color_conversion_sk_filter_cache.cc +++ b/ui/gfx/color_conversion_sk_filter_cache.cc
@@ -21,7 +21,7 @@ namespace { const base::Feature kImageToneMapping{"ImageToneMapping", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; // Additional YUV information to skia renderer to draw 9- and 10- bits color. struct YUVInput { @@ -87,7 +87,7 @@ if (!effect) { gfx::ColorTransform::Options options; - options.tone_map_pq_and_hlg_to_sdr = !key.dst.IsHDR(); + options.tone_map_pq_and_hlg_to_sdr = dst_max_luminance_relative == 1.f; options.sdr_max_luminance_nits = key.sdr_max_luminance_nits; // TODO(https://crbug.com/1286076): Ensure that, when tone mapping using // `dst_max_luminance_relative` is implemented, the gfx::ColorTransform's @@ -170,10 +170,26 @@ /*sampleCount=*/0, kTopLeft_GrSurfaceOrigin, /*surfaceProps=*/nullptr, /*shouldCreateWithMips=*/false); + // It is not guaranteed that kRGBA_F16_SkColorType is renderable. If we fail + // to create an SkSurface with that color type, fall back to + // kN32_SkColorType. + if (!surface) { + DLOG(ERROR) << "Falling back to tone mapped 8-bit surface."; + image_info = image_info.makeColorType(kN32_SkColorType); + surface = SkSurface::MakeRenderTarget( + context, SkBudgeted::kNo, image_info, + /*sampleCount=*/0, kTopLeft_GrSurfaceOrigin, + /*surfaceProps=*/nullptr, + /*shouldCreateWithMips=*/false); + } } else { surface = SkSurface::MakeRaster(image_info, image_info.minRowBytes(), /*surfaceProps=*/nullptr); } + if (!surface) { + DLOG(ERROR) << "Failed to create SkSurface color conversion."; + return nullptr; + } sk_sp<SkColorFilter> filter = Get(image_color_space, gfx::ColorSpace(*target_color_space),
diff --git a/ui/native_theme/native_theme.cc b/ui/native_theme/native_theme.cc index d359277..c11b1081 100644 --- a/ui/native_theme/native_theme.cc +++ b/ui/native_theme/native_theme.cc
@@ -38,7 +38,7 @@ #endif ColorProviderManager::Key NativeTheme::GetColorProviderKey( - scoped_refptr<ColorProviderManager::InitializerSupplier> custom_theme, + scoped_refptr<ColorProviderManager::ThemeInitializerSupplier> custom_theme, bool use_custom_frame) const { return ColorProviderManager::Key( (GetDefaultSystemColorScheme() == ColorScheme::kDark)
diff --git a/ui/native_theme/native_theme.h b/ui/native_theme/native_theme.h index 7e5e569..3b9c884 100644 --- a/ui/native_theme/native_theme.h +++ b/ui/native_theme/native_theme.h
@@ -388,7 +388,8 @@ // Use `use_custom_frame` == true when Chromium renders the titlebar. // False when the window manager renders the titlebar (currently GTK only). ColorProviderManager::Key GetColorProviderKey( - scoped_refptr<ColorProviderManager::InitializerSupplier> custom_theme, + scoped_refptr<ColorProviderManager::ThemeInitializerSupplier> + custom_theme, bool use_custom_frame = true) const; // Returns a shared instance of the native theme that should be used for web
diff --git a/ui/views/bubble/bubble_dialog_delegate_view.cc b/ui/views/bubble/bubble_dialog_delegate_view.cc index 5dcc62b..7173338 100644 --- a/ui/views/bubble/bubble_dialog_delegate_view.cc +++ b/ui/views/bubble/bubble_dialog_delegate_view.cc
@@ -89,7 +89,7 @@ return anchor ? anchor->GetThemeProvider() : Widget::GetThemeProvider(); } - ui::ColorProviderManager::InitializerSupplier* GetCustomTheme() + ui::ColorProviderManager::ThemeInitializerSupplier* GetCustomTheme() const override { const Widget* const anchor = GetAnchorWidget(); return anchor ? anchor->GetCustomTheme() : Widget::GetCustomTheme();
diff --git a/ui/views/examples/examples_main_proc.cc b/ui/views/examples/examples_main_proc.cc index 567df51..f2b77a6 100644 --- a/ui/views/examples/examples_main_proc.cc +++ b/ui/views/examples/examples_main_proc.cc
@@ -123,7 +123,6 @@ // The ContextFactory must exist before any Compositors are created. auto context_factories = std::make_unique<ui::TestContextFactories>(under_test); - context_factories->SetUseTestSurface(false); base::i18n::InitializeICU();
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc index c480049..35cb9c3 100644 --- a/ui/views/widget/widget.cc +++ b/ui/views/widget/widget.cc
@@ -870,7 +870,8 @@ : nullptr; } -ui::ColorProviderManager::InitializerSupplier* Widget::GetCustomTheme() const { +ui::ColorProviderManager::ThemeInitializerSupplier* Widget::GetCustomTheme() + const { return nullptr; } @@ -1776,13 +1777,18 @@ //////////////////////////////////////////////////////////////////////////////// // Widget, ui::ColorProviderSource: -const ui::ColorProvider* Widget::GetColorProvider() const { +ui::ColorProviderManager::Key Widget::GetColorProviderKey() const { ui::ColorProviderManager::Key key = GetNativeTheme()->GetColorProviderKey(GetCustomTheme()); #if BUILDFLAG(IS_CHROMEOS_ASH) key.elevation_mode = background_elevation_; #endif - return ui::ColorProviderManager::Get().GetColorProviderFor(key); + return key; +} + +const ui::ColorProvider* Widget::GetColorProvider() const { + return ui::ColorProviderManager::Get().GetColorProviderFor( + GetColorProviderKey()); } ////////////////////////////////////////////////////////////////////////////////
diff --git a/ui/views/widget/widget.h b/ui/views/widget/widget.h index 39490b0..1e5665b9 100644 --- a/ui/views/widget/widget.h +++ b/ui/views/widget/widget.h
@@ -765,7 +765,8 @@ // Returns a custom theme object suitable for use in a // ColorProviderManager::Key. If this is null, the window has no custom theme. - virtual ui::ColorProviderManager::InitializerSupplier* GetCustomTheme() const; + virtual ui::ColorProviderManager::ThemeInitializerSupplier* GetCustomTheme() + const; ui::NativeTheme* GetNativeTheme() { return const_cast<ui::NativeTheme*>( @@ -1115,6 +1116,9 @@ void SetHeight(int height); void SetVisible(bool visible); + // ui::ColorProviderSource: + ui::ColorProviderManager::Key GetColorProviderKey() const override; + private: // Type of ways to ignore activation changes. enum class DisableActivationChangeHandlingType {
diff --git a/url/gurl.cc b/url/gurl.cc index 8fe812cf..fd8e35c 100644 --- a/url/gurl.cc +++ b/url/gurl.cc
@@ -110,17 +110,17 @@ // removed from a "foo:hello #ref" URL (see http://crbug.com/291747). GURL test_url(spec_, RETAIN_TRAILING_PATH_WHITEPACE); - DCHECK(test_url.is_valid_ == is_valid_); - DCHECK(test_url.spec_ == spec_); + DCHECK_EQ(test_url.is_valid_, is_valid_); + DCHECK_EQ(test_url.spec_, spec_); - DCHECK(test_url.parsed_.scheme == parsed_.scheme); - DCHECK(test_url.parsed_.username == parsed_.username); - DCHECK(test_url.parsed_.password == parsed_.password); - DCHECK(test_url.parsed_.host == parsed_.host); - DCHECK(test_url.parsed_.port == parsed_.port); - DCHECK(test_url.parsed_.path == parsed_.path); - DCHECK(test_url.parsed_.query == parsed_.query); - DCHECK(test_url.parsed_.ref == parsed_.ref); + DCHECK_EQ(test_url.parsed_.scheme, parsed_.scheme); + DCHECK_EQ(test_url.parsed_.username, parsed_.username); + DCHECK_EQ(test_url.parsed_.password, parsed_.password); + DCHECK_EQ(test_url.parsed_.host, parsed_.host); + DCHECK_EQ(test_url.parsed_.port, parsed_.port); + DCHECK_EQ(test_url.parsed_.path, parsed_.path); + DCHECK_EQ(test_url.parsed_.query, parsed_.query); + DCHECK_EQ(test_url.parsed_.ref, parsed_.ref); } } #endif
diff --git a/url/third_party/mozilla/url_parse.cc b/url/third_party/mozilla/url_parse.cc index 8a2d9d9d..a3dcd23 100644 --- a/url/third_party/mozilla/url_parse.cc +++ b/url/third_party/mozilla/url_parse.cc
@@ -692,6 +692,11 @@ } // namespace +COMPONENT_EXPORT(URL) +std::ostream& operator<<(std::ostream& os, const Component& component) { + return os << '{' << component.begin << ", " << component.len << "}"; +} + Parsed::Parsed() : potentially_dangling_markup(false), inner_parsed_(NULL) {} Parsed::Parsed(const Parsed& other)
diff --git a/url/third_party/mozilla/url_parse.h b/url/third_party/mozilla/url_parse.h index b662022..34a0d45d 100644 --- a/url/third_party/mozilla/url_parse.h +++ b/url/third_party/mozilla/url_parse.h
@@ -5,6 +5,8 @@ #ifndef URL_THIRD_PARTY_MOZILLA_URL_PARSE_H_ #define URL_THIRD_PARTY_MOZILLA_URL_PARSE_H_ +#include <iosfwd> + #include "base/component_export.h" namespace url { @@ -47,6 +49,10 @@ int len; // Will be -1 if the component is unspecified. }; +// Permit printing Components by CHECK macros. +COMPONENT_EXPORT(URL) +std::ostream& operator<<(std::ostream& os, const Component& component); + // Helper that returns a component created with the given begin and ending // points. The ending point is non-inclusive. inline Component MakeRange(int begin, int end) {