M120 stage 6

This commit is contained in:
Alexander Frick 2024-01-22 14:27:02 -06:00
parent f40e146854
commit 99e2749d54
45 changed files with 463 additions and 342 deletions

View file

@ -39,4 +39,4 @@ ThoriumOS Flex > ThoriumOS
made possible by Thorium > Chromium
Experiments > Thorium Experiments
Make download warning blocker actually work
Make download warning blocker actually work!

View file

@ -77,6 +77,7 @@ enable_vr = true
enable_platform_hevc = true
enable_hevc_parser_and_hw_decoder = true
enable_platform_ac3_eac3_audio = true
enable_platform_ac4_audio = true
enable_platform_dolby_vision = true
enable_platform_encrypted_dolby_vision = true
enable_platform_mpeg_h_audio = true

View file

@ -91,6 +91,7 @@ enable_vr = true
enable_platform_hevc = true
enable_hevc_parser_and_hw_decoder = true
enable_platform_ac3_eac3_audio = true
enable_platform_ac4_audio = true
enable_platform_dolby_vision = true
enable_platform_encrypted_dolby_vision = true
enable_platform_mpeg_h_audio = true

View file

@ -91,6 +91,7 @@ enable_vr = true
enable_platform_hevc = true
enable_hevc_parser_and_hw_decoder = true
enable_platform_ac3_eac3_audio = true
enable_platform_ac4_audio = true
enable_platform_dolby_vision = true
enable_platform_encrypted_dolby_vision = true
enable_platform_mpeg_h_audio = true

View file

@ -83,6 +83,7 @@ enable_vr = true
enable_platform_hevc = true
enable_hevc_parser_and_hw_decoder = true
enable_platform_ac3_eac3_audio = true
enable_platform_ac4_audio = true
enable_platform_dolby_vision = true
enable_platform_encrypted_dolby_vision = true
enable_platform_mpeg_h_audio = true

View file

@ -83,6 +83,7 @@ enable_vr = true
enable_platform_hevc = true
enable_hevc_parser_and_hw_decoder = true
enable_platform_ac3_eac3_audio = true
enable_platform_ac4_audio = true
enable_platform_dolby_vision = true
enable_platform_encrypted_dolby_vision = true
enable_platform_mpeg_h_audio = true

View file

@ -84,6 +84,7 @@ enable_vr = true
enable_platform_hevc = true
enable_hevc_parser_and_hw_decoder = true
enable_platform_ac3_eac3_audio = true
enable_platform_ac4_audio = true
enable_platform_dolby_vision = true
enable_platform_encrypted_dolby_vision = true
enable_platform_mpeg_h_audio = true

View file

@ -86,6 +86,7 @@ enable_vr = true
enable_platform_hevc = true
enable_hevc_parser_and_hw_decoder = true
enable_platform_ac3_eac3_audio = true
enable_platform_ac4_audio = true
enable_platform_dolby_vision = true
enable_platform_encrypted_dolby_vision = true
enable_platform_mpeg_h_audio = true

View file

@ -1,4 +1,4 @@
# Copyright 2023 The Chromium Authors and Alex313031
# Copyright 2024 The Chromium Authors and Alex313031
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

View file

@ -1,6 +1,6 @@
#!/bin/bash
#
# Copyright 2023 The Chromium Authors and Alex313031
# Copyright 2024 The Chromium Authors and Alex313031
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
@ -80,21 +80,15 @@ function gen_config_files() {
}
function update_readme() {
local IFS=$'\n'
# Split git log output '<date>\n<commit hash>' on the newline to produce 2
# array entries.
local vals=($(git -C "${SRC}" --no-pager log -1 --format="%cd%n%H" \
--date=format:"%A %B %d %Y"))
local revision=$(git -C "${SRC}" --no-pager log -1 --format="%H")
sed -E -i.bak \
-e "s/^(Date:)[[:space:]]+.*$/\1 ${vals[0]}/" \
-e "s/^(Revision:)[[:space:]]+[a-f0-9]{40}/\1 ${vals[1]}/" \
-e "s/^(Revision:)[[:space:]]+[a-f0-9]{40}/\1 ${revision}/" \
${BASE}/README.chromium
rm ${BASE}/README.chromium.bak
cat <<EOF
README.chromium updated with:
Date: ${vals[0]}
Revision: ${vals[1]}
Revision: ${revision}
EOF
}
@ -204,5 +198,6 @@ update_readme
# git cl format > /dev/null \
# || echo "WARNING: 'git cl format' failed. Please run 'git cl format' manually."
echo "NOTE: 'You may want to run \`git cl format\` manually."
cleanup

View file

@ -79,6 +79,7 @@ enable_vr = true
enable_platform_hevc = true
enable_hevc_parser_and_hw_decoder = true
enable_platform_ac3_eac3_audio = true
enable_platform_ac4_audio = true
enable_platform_dolby_vision = true
enable_platform_encrypted_dolby_vision = true
enable_platform_mpeg_h_audio = true

View file

@ -77,6 +77,7 @@ enable_vr = true
enable_platform_hevc = true
enable_hevc_parser_and_hw_decoder = true
enable_platform_ac3_eac3_audio = true
enable_platform_ac4_audio = true
enable_platform_dolby_vision = true
enable_platform_encrypted_dolby_vision = true
enable_platform_mpeg_h_audio = true

View file

@ -77,6 +77,7 @@ enable_vr = true
enable_platform_hevc = true
enable_hevc_parser_and_hw_decoder = true
enable_platform_ac3_eac3_audio = true
enable_platform_ac4_audio = true
enable_platform_dolby_vision = true
enable_platform_encrypted_dolby_vision = true
enable_platform_mpeg_h_audio = true

View file

@ -65,6 +65,7 @@ enable_vr = true
enable_platform_hevc = true
enable_hevc_parser_and_hw_decoder = true
enable_platform_ac3_eac3_audio = true
enable_platform_ac4_audio = true
enable_platform_dolby_vision = true
enable_platform_mpeg_h_audio = true
enable_platform_dts_audio = true

View file

@ -74,6 +74,7 @@ enable_vr = true
enable_platform_hevc = true
enable_hevc_parser_and_hw_decoder = true
enable_platform_ac3_eac3_audio = true
enable_platform_ac4_audio = true
enable_platform_dolby_vision = true
enable_platform_encrypted_dolby_vision = true
enable_platform_mpeg_h_audio = true

View file

@ -72,6 +72,7 @@ enable_vr = true
enable_platform_hevc = true
enable_hevc_parser_and_hw_decoder = true
enable_platform_ac3_eac3_audio = true
enable_platform_ac4_audio = true
enable_platform_dolby_vision = true
enable_platform_encrypted_dolby_vision = true
enable_platform_mpeg_h_audio = true

View file

@ -77,6 +77,7 @@ enable_vr = true
enable_platform_hevc = true
enable_hevc_parser_and_hw_decoder = true
enable_platform_ac3_eac3_audio = true
enable_platform_ac4_audio = true
enable_platform_dolby_vision = true
enable_platform_encrypted_dolby_vision = true
enable_platform_mpeg_h_audio = true

View file

@ -78,6 +78,7 @@ enable_vr = true
enable_platform_hevc = true
enable_hevc_parser_and_hw_decoder = true
enable_platform_ac3_eac3_audio = true
enable_platform_ac4_audio = true
enable_platform_dolby_vision = true
enable_platform_encrypted_dolby_vision = true
enable_platform_mpeg_h_audio = true

View file

@ -77,6 +77,7 @@ enable_vr = true
enable_platform_hevc = true
enable_hevc_parser_and_hw_decoder = true
enable_platform_ac3_eac3_audio = true
enable_platform_ac4_audio = true
enable_platform_dolby_vision = true
enable_platform_encrypted_dolby_vision = true
enable_platform_mpeg_h_audio = true

View file

@ -77,6 +77,7 @@ enable_vr = true
enable_platform_hevc = true
enable_hevc_parser_and_hw_decoder = true
enable_platform_ac3_eac3_audio = true
enable_platform_ac4_audio = true
enable_platform_dolby_vision = true
enable_platform_encrypted_dolby_vision = true
enable_platform_mpeg_h_audio = true

View file

@ -1,4 +1,4 @@
# Copyright 2023 The Chromium Authors and Alex313031.
# Copyright 2024 The Chromium Authors and Alex313031
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

View file

@ -1,4 +1,4 @@
# Copyright 2023 The Chromium Authors and Alex313031
# Copyright 2024 The Chromium Authors and Alex313031
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
@ -110,6 +110,7 @@ if (current_toolchain == default_toolchain) {
"is_monochrome",
"is_trichrome",
"lint_baseline_file",
"lint_gen_dir",
"lint_min_sdk_version",
"lint_suppressions_file",
"static_library_provider",
@ -150,10 +151,15 @@ if (current_toolchain == default_toolchain) {
"java/res_base/xml/network_security_config.xml",
"java/res_chromium_base/drawable/themed_app_icon.xml",
"java/res_chromium_base/mipmap-hdpi/app_icon.png",
"java/res_chromium_base/mipmap-hdpi/layered_app_icon.png",
"java/res_chromium_base/mipmap-mdpi/app_icon.png",
"java/res_chromium_base/mipmap-mdpi/layered_app_icon.png",
"java/res_chromium_base/mipmap-xhdpi/app_icon.png",
"java/res_chromium_base/mipmap-xhdpi/layered_app_icon.png",
"java/res_chromium_base/mipmap-xxhdpi/app_icon.png",
"java/res_chromium_base/mipmap-xxhdpi/layered_app_icon.png",
"java/res_chromium_base/mipmap-xxxhdpi/app_icon.png",
"java/res_chromium_base/mipmap-xxxhdpi/layered_app_icon.png",
"java/res_chromium_base/values/channel_constants.xml",
]
}
@ -254,6 +260,7 @@ if (current_toolchain == default_toolchain) {
"//components/externalauth/android:google_delegate_public_impl_java",
"//components/language/android:ulp_delegate_public_java",
"//components/signin/public/android:account_email_domain_displayability_java",
"//components/webauthn/android:delegate_public_java",
"//content/public/android:identity_credentials_public_impl_java",
]
}
@ -280,7 +287,6 @@ if (current_toolchain == default_toolchain) {
"$google_play_services_package:google_play_services_tasks_java",
"$google_play_services_package:google_play_services_vision_common_java",
"$google_play_services_package:google_play_services_vision_java",
"//base:jni_java",
"//cc:cc_java",
"//cc/mojom:mojom_java",
"//chrome/android/features/keyboard_accessory:public_java",
@ -302,6 +308,7 @@ if (current_toolchain == default_toolchain) {
"//chrome/browser/android/browserservices/metrics:java",
"//chrome/browser/android/browserservices/verification:java",
"//chrome/browser/android/common:java",
"//chrome/browser/android/content:java",
"//chrome/browser/android/crypto:java",
"//chrome/browser/android/customtabs/branding:java",
"//chrome/browser/android/intents:java",
@ -532,10 +539,10 @@ if (current_toolchain == default_toolchain) {
"//components/paint_preview/browser/android:java",
"//components/paint_preview/player/android:java",
"//components/password_manager/core/browser:password_manager_java_enums",
"//components/password_manager/core/common:password_manager_common_java_enums",
"//components/payments/content/android:java",
"//components/payments/content/android:service_java",
"//components/payments/mojom:mojom_java",
"//components/permissions/android:core_java",
"//components/permissions/android:java",
"//components/policy/android:policy_java",
"//components/power_bookmarks/core:proto_java",
@ -607,7 +614,6 @@ if (current_toolchain == default_toolchain) {
"//skia/public/mojom:mojom_java",
"//third_party/android_deps:chromium_play_services_availability_java",
"//third_party/android_deps:com_google_code_findbugs_jsr305_java",
"//third_party/android_deps:com_google_guava_listenablefuture_java",
"//third_party/android_deps:dagger_java",
"//third_party/android_deps:guava_android_java",
"//third_party/android_deps:javax_inject_javax_inject_java",
@ -637,6 +643,7 @@ if (current_toolchain == default_toolchain) {
"//third_party/blink/public/mojom:android_mojo_bindings_java",
"//third_party/blink/public/mojom:mojom_platform_java",
"//third_party/gif_player:gif_player_java",
"//third_party/jni_zero:jni_zero_java",
"//third_party/kotlin_stdlib:kotlin_stdlib_java",
"//third_party/metrics_proto:metrics_proto_java",
"//ui/accessibility:ax_base_java",
@ -741,8 +748,10 @@ if (current_toolchain == default_toolchain) {
}
if (enable_supervised_users) {
deps +=
[ "//chrome/browser/supervised_user:website_parent_approval_java" ]
deps += [
"//chrome/browser/supervised_user:website_parent_approval_java",
"//components/supervised_user/android:supervised_user_preferences_java",
]
}
if (page_info_use_internal_android_resources) {
@ -777,6 +786,7 @@ if (current_toolchain == default_toolchain) {
deps = [
":chrome_java",
"//chrome/android/features/keyboard_accessory:internal_java",
"//chrome/browser/android/content:java",
"//chrome/browser/android/httpclient:java",
"//chrome/browser/commerce/merchant_viewer/android:java",
"//chrome/browser/content_creation/notes/internal/android:java",
@ -786,6 +796,7 @@ if (current_toolchain == default_toolchain) {
"//chrome/browser/password_check:internal_java",
"//chrome/browser/password_edit_dialog/android:java",
"//chrome/browser/password_entry_edit/android/internal:java",
"//chrome/browser/password_manager/android/add_username_dialog:java",
"//chrome/browser/recent_tabs/internal:java",
"//chrome/browser/tabmodel/internal:java",
"//chrome/browser/touch_to_fill/android/internal:java",
@ -923,6 +934,7 @@ if (current_toolchain == default_toolchain) {
"//chrome/browser/android/browserservices/verification:java",
"//chrome/browser/android/browserservices/verification:junit_test_support",
"//chrome/browser/android/common:java",
"//chrome/browser/android/content:java",
"//chrome/browser/android/crypto:java",
"//chrome/browser/android/customtabs/branding:junit",
"//chrome/browser/android/httpclient:junit_tests",
@ -1078,6 +1090,7 @@ if (current_toolchain == default_toolchain) {
"//chrome/browser/uid/android:junit",
"//chrome/browser/usb/android:junit",
"//chrome/browser/user_education:java",
"//chrome/browser/user_education:junit",
"//chrome/browser/util:java",
"//chrome/browser/util:junit_tests",
"//chrome/browser/version:java",
@ -1165,7 +1178,9 @@ if (current_toolchain == default_toolchain) {
"//components/signin/core/browser:signin_enums_java",
"//components/signin/public/android:java",
"//components/signin/public/android:signin_java_test_support",
"//components/supervised_user/android:supervised_user_preferences_java",
"//components/sync/android:sync_java",
"//components/sync/protocol:protocol_java",
"//components/sync_device_info:sync_device_info_java",
"//components/translate/content/android:junit",
"//components/ukm/android:java",
@ -1191,7 +1206,6 @@ if (current_toolchain == default_toolchain) {
"//services/media_session/public/mojom:mojom_java",
"//services/service_manager/public/java:service_manager_java",
"//third_party/android_deps:chromium_play_services_availability_shadows_java",
"//third_party/android_deps:com_google_guava_listenablefuture_java",
"//third_party/android_deps:com_googlecode_java_diff_utils_diffutils_java",
"//third_party/android_deps:dagger_java",
"//third_party/android_deps:espresso_java",
@ -1295,7 +1309,6 @@ if (current_toolchain == default_toolchain) {
":chrome_app_java_resources",
"//base:base_java",
"//base:base_java_test_support",
"//base:jni_java",
"//build/android:build_java",
"//cc:cc_java",
"//chrome/android:chrome_java",
@ -1309,6 +1322,7 @@ if (current_toolchain == default_toolchain) {
"//chrome/test/android:chrome_java_integration_test_support",
"//components/payments/content/android:java",
"//components/payments/content/android:java_resources",
"//components/payments/content/android:payments_java_test_support",
"//components/payments/content/android:service_java",
"//components/payments/mojom:mojom_java",
"//content/public/android:content_java",
@ -1322,6 +1336,7 @@ if (current_toolchain == default_toolchain) {
"//third_party/androidx:androidx_test_monitor_java",
"//third_party/blink/public/mojom:android_mojo_bindings_java",
"//third_party/hamcrest:hamcrest_java",
"//third_party/jni_zero:jni_zero_java",
"//third_party/junit:junit",
"//ui/android:ui_no_recycler_view_java",
"//url:gurl_java",
@ -1358,7 +1373,7 @@ if (current_toolchain == default_toolchain) {
"javatests/src/org/chromium/chrome/browser/crypto/CipherFactoryTest.java",
"javatests/src/org/chromium/chrome/browser/customtabs/CustomTabBottomBarViewUnitTest.java",
"javatests/src/org/chromium/chrome/browser/customtabs/CustomTabLaunchCauseMetricsTest.java",
"javatests/src/org/chromium/chrome/browser/customtabs/features/minimizedcustomtab/MinimizedCardCoordinatorTest.java",
"javatests/src/org/chromium/chrome/browser/customtabs/features/minimizedcustomtab/MinimizedCardDialogFragmentTest.java",
"javatests/src/org/chromium/chrome/browser/customtabs/features/minimizedcustomtab/MinimizedCardViewBinderTest.java",
"javatests/src/org/chromium/chrome/browser/download/DownloadForegroundServiceManagerTest.java",
"javatests/src/org/chromium/chrome/browser/download/DownloadForegroundServiceTest.java",
@ -1392,7 +1407,6 @@ if (current_toolchain == default_toolchain) {
":chrome_unit_test_util_java",
"//base:base_java",
"//base:base_java_test_support",
"//base:jni_java",
"//chrome/android:base_module_java",
"//chrome/android:chrome_java",
"//chrome/browser/android/browserservices/intents:java",
@ -1401,6 +1415,7 @@ if (current_toolchain == default_toolchain) {
"//chrome/browser/android/intents:java",
"//chrome/browser/browser_controls/android:java",
"//chrome/browser/commerce/android:java",
"//chrome/browser/commerce/price_tracking/android:java",
"//chrome/browser/commerce/subscriptions/android:subscriptions_java",
"//chrome/browser/contextmenu:java",
"//chrome/browser/download/android:download_java_tests",
@ -1423,6 +1438,7 @@ if (current_toolchain == default_toolchain) {
"//chrome/browser/ui/android/theme:java",
"//chrome/browser/ui/android/toolbar:java",
"//chrome/browser/ui/messages/android:java",
"//chrome/browser/user_education:java",
"//chrome/test/android:chrome_java_integration_test_support",
"//chrome/test/android:chrome_java_unit_test_support",
"//components/autofill/android:main_autofill_java",
@ -1474,6 +1490,7 @@ if (current_toolchain == default_toolchain) {
"//third_party/androidx:androidx_browser_browser_java",
"//third_party/androidx:androidx_coordinatorlayout_coordinatorlayout_java",
"//third_party/androidx:androidx_core_core_java",
"//third_party/androidx:androidx_fragment_fragment_java",
"//third_party/androidx:androidx_test_core_java",
"//third_party/androidx:androidx_test_monitor_java",
"//third_party/androidx:androidx_test_runner_java",
@ -1481,6 +1498,7 @@ if (current_toolchain == default_toolchain) {
"//third_party/blink/public:blink_headers_java",
"//third_party/hamcrest:hamcrest_core_java",
"//third_party/hamcrest:hamcrest_library_java",
"//third_party/jni_zero:jni_zero_java",
"//third_party/junit",
"//third_party/mockito:mockito_java",
"//ui/android:ui_full_java",
@ -1523,7 +1541,7 @@ if (current_toolchain == default_toolchain) {
"//base:base_java",
"//base:base_java_test_support",
"//base:base_java_test_support_uncommon",
"//base:jni_java",
"//base/test:public_transit_java",
"//base/test:test_support_java",
"//build/android:build_java",
"//cc:cc_java",
@ -1542,6 +1560,7 @@ if (current_toolchain == default_toolchain) {
"//chrome/browser/android/browserservices/verification:java",
"//chrome/browser/android/browserservices/verification:javatests",
"//chrome/browser/android/common:java",
"//chrome/browser/android/content:java",
"//chrome/browser/android/crypto:java",
"//chrome/browser/android/customtabs/branding:java",
"//chrome/browser/android/httpclient:javatests",
@ -1638,6 +1657,7 @@ if (current_toolchain == default_toolchain) {
"//chrome/browser/tab_group:java",
"//chrome/browser/tabmodel:java",
"//chrome/browser/tabmodel/internal:java",
"//chrome/browser/tabpersistence:flatbuffer_java",
"//chrome/browser/tabpersistence:java",
"//chrome/browser/thumbnail:java",
"//chrome/browser/thumbnail:javatests",
@ -1677,6 +1697,7 @@ if (current_toolchain == default_toolchain) {
"//chrome/test:test_support_java",
"//chrome/test/android:chrome_java_integration_test_support",
"//chrome/test/android:chrome_java_test_pagecontroller",
"//chrome/test/android:chrome_java_transit",
"//chrome/test/android/test_trusted_web_activity:test_trusted_web_activity_java",
"//components/autofill/android:autofill_features_java",
"//components/autofill/android:autofill_java",
@ -1768,6 +1789,7 @@ if (current_toolchain == default_toolchain) {
"//components/password_manager/core/browser:password_manager_java_enums",
"//components/password_manager/core/browser:unified_password_manager_proto_java",
"//components/payments/content/android:java",
"//components/payments/content/android:payments_java_test_support",
"//components/payments/content/android:service_java",
"//components/payments/mojom:mojom_java",
"//components/permissions/android:core_java",
@ -1776,6 +1798,7 @@ if (current_toolchain == default_toolchain) {
"//components/policy/android:policy_java_test_support",
"//components/power_bookmarks/core:proto_java",
"//components/prefs/android:java",
"//components/privacy_sandbox/android:javatests",
"//components/profile_metrics:browser_profile_type_enum_java",
"//components/query_tiles:java",
"//components/query_tiles:test_support_java",
@ -1824,7 +1847,6 @@ if (current_toolchain == default_toolchain) {
"//services/network/public/mojom:url_loader_base_java",
"//services/service_manager/public/java:service_manager_java",
"//third_party/android_deps:com_google_code_findbugs_jsr305_java",
"//third_party/android_deps:com_google_guava_listenablefuture_java",
"//third_party/android_deps:espresso_java",
"//third_party/android_deps:guava_android_java",
"//third_party/android_deps:material_design_java",
@ -1852,6 +1874,7 @@ if (current_toolchain == default_toolchain) {
"//third_party/blink/public/mojom:mojom_platform_java",
"//third_party/flatbuffers:flatbuffers_java",
"//third_party/hamcrest:hamcrest_java",
"//third_party/jni_zero:jni_zero_java",
"//third_party/junit",
"//third_party/metrics_proto:metrics_proto_java",
"//third_party/mockito:mockito_java",
@ -2123,10 +2146,15 @@ if (current_toolchain == default_toolchain) {
sources = [
"java/res_chromium_base/drawable/themed_app_icon.xml",
"java/res_chromium_base/mipmap-hdpi/app_icon.png",
"java/res_chromium_base/mipmap-hdpi/layered_app_icon.png",
"java/res_chromium_base/mipmap-mdpi/app_icon.png",
"java/res_chromium_base/mipmap-mdpi/layered_app_icon.png",
"java/res_chromium_base/mipmap-xhdpi/app_icon.png",
"java/res_chromium_base/mipmap-xhdpi/layered_app_icon.png",
"java/res_chromium_base/mipmap-xxhdpi/app_icon.png",
"java/res_chromium_base/mipmap-xxhdpi/layered_app_icon.png",
"java/res_chromium_base/mipmap-xxxhdpi/app_icon.png",
"java/res_chromium_base/mipmap-xxxhdpi/layered_app_icon.png",
"java/res_chromium_base/values/channel_constants.xml",
]
@ -2425,7 +2453,6 @@ if (current_toolchain == default_toolchain) {
"$google_play_services_package:google_play_services_gcm_java",
"//base:base_java",
"//base:base_java_test_support",
"//base:jni_java",
"//build/android:build_java",
"//chrome/browser/download/android:java",
"//chrome/browser/prefetch/android:java",
@ -2438,6 +2465,7 @@ if (current_toolchain == default_toolchain) {
"//content/public/test/android:content_java_test_support",
"//third_party/android_deps:protobuf_lite_runtime_java",
"//third_party/androidx:androidx_annotation_annotation_java",
"//third_party/jni_zero:jni_zero_java",
"//third_party/junit",
"//url:android_test_helper_java",
"//url:gurl_java",
@ -2464,8 +2492,8 @@ if (current_toolchain == default_toolchain) {
"//components/sync:test_support",
"//content/test:test_support",
"//net:test_support",
"//url",
"//url:android_test_helper",
"//url:gurl_android",
]
}
@ -2569,7 +2597,6 @@ if (current_toolchain == default_toolchain) {
"$google_play_services_package:google_firebase_firebase_messaging_java",
"$google_play_services_package:google_play_services_gcm_java",
"//base:base_java",
"//base:jni_java",
"//chrome/browser/download/android:file_provider_java",
"//chrome/browser/flags:java",
"//chrome/browser/language/android:base_module_java",
@ -2584,6 +2611,7 @@ if (current_toolchain == default_toolchain) {
"//third_party/android_deps:playcore_java",
"//third_party/androidx:androidx_annotation_annotation_java",
"//third_party/androidx:androidx_collection_collection_java",
"//third_party/jni_zero:jni_zero_java",
"//ui/android:ui_no_recycler_view_java",
# Deps needed for child processes.
@ -2627,6 +2655,18 @@ if (current_toolchain == default_toolchain) {
resources_package = "org.chromium.chrome.base"
}
if (android_64bit_target_cpu) {
_main_monochrome_public_bundle_target = "monochrome_32_64_public_bundle"
_main_monochrome_public_apk_target = "monochrome_32_64_public_apk"
_main_trichrome_chrome_bundle_target = "trichrome_chrome_32_64_bundle"
_main_trichrome_library_apk_target = "trichrome_library_32_64_apk"
} else {
_main_monochrome_public_bundle_target = "monochrome_public_bundle"
_main_monochrome_public_apk_target = "monochrome_public_apk"
_main_trichrome_chrome_bundle_target = "trichrome_chrome_bundle"
_main_trichrome_library_apk_target = "trichrome_library_apk"
}
if (android_64bit_target_cpu && skip_secondary_abi_for_cq) {
group("trichrome_library_apk") {
deps = [ ":trichrome_library_64_apk" ]
@ -2635,7 +2675,15 @@ if (current_toolchain == default_toolchain) {
deps = [ ":monochrome_64_public_apk" ]
}
} else {
chrome_public_apk_or_module_tmpl("monochrome_public_apk") {
if (android_64bit_target_cpu) {
alias_with_wrapper_script("trichrome_library_apk") {
alias_target = ":trichrome_library_32_64_apk"
}
alias_with_wrapper_script("monochrome_public_apk") {
alias_target = ":monochrome_32_64_public_apk"
}
}
chrome_public_apk_or_module_tmpl(_main_monochrome_public_apk_target) {
is_monochrome = true
apk_name = "MonochromePublic"
target_type = "android_apk"
@ -2645,7 +2693,7 @@ if (current_toolchain == default_toolchain) {
}
}
trichrome_library_apk_tmpl("trichrome_library_apk") {
trichrome_library_apk_tmpl(_main_trichrome_library_apk_target) {
apk_name = "TrichromeLibrary"
if (android_64bit_target_cpu) {
@ -2658,8 +2706,7 @@ if (current_toolchain == default_toolchain) {
"expectations/trichrome_library_apk.AndroidManifest.expected"
}
if (enable_libs_and_assets_verification) {
expected_libs_and_assets =
"expectations/$target_name.$target_cpu.libs_and_assets.expected"
expected_libs_and_assets = "expectations/trichrome_library_apk.$target_cpu.libs_and_assets.expected"
}
}
@ -2731,6 +2778,8 @@ if (current_toolchain == default_toolchain) {
"//chrome/browser/back_press/android:unit_device_javatests",
"//chrome/browser/content_creation/notes/internal/android:unit_device_javatests",
"//chrome/browser/download/internal/android:unit_device_javatests",
"//chrome/browser/hub:unit_device_javatests",
"//chrome/browser/hub/internal:unit_device_javatests",
"//chrome/browser/image_descriptions:unit_device_javatests",
"//chrome/browser/loading_modal/android:unit_device_javatests",
"//chrome/browser/optimization_guide/android:unit_device_javatests",
@ -2768,6 +2817,7 @@ if (current_toolchain == default_toolchain) {
"//components/translate/content/android:unit_device_javatests",
"//components/url_formatter/android:unit_device_javatests",
"//components/variations/android:unit_device_javatests",
"//components/webapps/browser/android:unit_device_javatests",
"//ui/android:ui_unit_device_javatests",
]
@ -2929,7 +2979,7 @@ if (current_toolchain == default_toolchain) {
"$root_build_dir/apks/MonochromePublic64.apk.mapping"
}
} else {
apk_under_test = ":monochrome_public_apk"
apk_under_test = ":$_main_monochrome_public_apk_target"
if (!is_java_debug) {
proguard_mapping_path =
"$root_build_dir/apks/MonochromePublic.apk.mapping"
@ -2991,7 +3041,8 @@ if (current_toolchain == default_toolchain) {
"$root_build_dir/apks/MonochromePublic64.aab.mapping"
}
} else {
apk_under_test = "//chrome/android:monochrome_public_bundle_apks"
apk_under_test =
"//chrome/android:${_main_monochrome_public_bundle_target}_apks"
if (!is_java_debug) {
proguard_mapping_path =
"$root_build_dir/apks/MonochromePublic.aab.mapping"
@ -3048,7 +3099,8 @@ if (current_toolchain == default_toolchain) {
}
} else {
apk_under_test = "//chrome/android:trichrome_chrome_bundle_apks"
additional_apks = [ "//chrome/android:trichrome_library_apk" ]
additional_apks =
[ "//chrome/android:$_main_trichrome_library_apk_target" ]
if (!is_java_debug) {
proguard_mapping_path =
"$root_build_dir/apks/TrichromeChrome.aab.mapping"
@ -3102,7 +3154,7 @@ if (current_toolchain == default_toolchain) {
assert(disable_android_lint)
}
if (!disable_android_lint) {
deps = [ ":monochrome_public_bundle__lint" ]
deps = [ ":${_main_monochrome_public_bundle_target}__lint" ]
if (defined(additional_chrome_lint_targets)) {
deps += additional_chrome_lint_targets
}
@ -3117,9 +3169,18 @@ if (current_toolchain == default_toolchain) {
deps = [ ":trichrome_chrome_64_bundle" ]
}
} else {
if (android_64bit_target_cpu) {
alias_with_wrapper_script("monochrome_public_bundle") {
alias_target = ":monochrome_32_64_public_bundle"
}
alias_with_wrapper_script("trichrome_chrome_bundle") {
alias_target = ":trichrome_chrome_32_64_bundle"
}
}
# Public webview targets don't work with non-public sdks.
# https://crbug.com/1000763
chrome_public_bundle("monochrome_public_bundle") {
chrome_public_bundle(_main_monochrome_public_bundle_target) {
is_monochrome = true
bundle_name = "MonochromePublic"
@ -3129,6 +3190,11 @@ if (current_toolchain == default_toolchain) {
enable_lint = true
lint_baseline_file = "expectations/lint-baseline.xml"
lint_suppressions_file = "expectations/lint-suppressions.xml"
# Since this target's name changes if we are 32 or 64 bit, we want to keep
# the gen_dir the same for the lint baseline files.
lint_gen_dir = "$target_gen_dir/monochrome_public_bundle__lint"
add_view_trace_events = true
if (android_64bit_target_cpu) {
@ -3141,15 +3207,14 @@ if (current_toolchain == default_toolchain) {
"expectations/monochrome_public_bundle.proguard_flags.expected"
}
if (enable_libs_and_assets_verification) {
expected_libs_and_assets =
"expectations/$target_name.$target_cpu.libs_and_assets.expected"
expected_libs_and_assets = "expectations/monochrome_public_bundle.$target_cpu.libs_and_assets.expected"
}
}
if (is_official_build) {
# Used for binary size monitoring.
create_app_bundle_minimal_apks("monochrome_public_minimal_apks") {
deps = [ ":monochrome_public_bundle" ]
deps = [ ":$_main_monochrome_public_bundle_target" ]
bundle_path = "$root_build_dir/apks/MonochromePublic.aab"
}
@ -3177,10 +3242,10 @@ if (current_toolchain == default_toolchain) {
}
}
chrome_public_bundle("trichrome_chrome_bundle") {
chrome_public_bundle(_main_trichrome_chrome_bundle_target) {
is_trichrome = true
bundle_name = "TrichromeChrome"
static_library_provider = ":trichrome_library_apk"
static_library_provider = ":$_main_trichrome_library_apk_target"
add_view_trace_events = true
art_profile_path = "//chrome/android/baseline_profiles/profile.txt"
if (android_64bit_target_cpu) {
@ -3193,14 +3258,13 @@ if (current_toolchain == default_toolchain) {
expected_android_manifest = "expectations/trichrome_chrome_bundle__base.AndroidManifest.expected"
}
if (enable_libs_and_assets_verification) {
expected_libs_and_assets =
"expectations/$target_name.$target_cpu.libs_and_assets.expected"
expected_libs_and_assets = "expectations/trichrome_chrome_bundle.$target_cpu.libs_and_assets.expected"
}
}
# Creates .zip of .apk splits suitable for the Android system image.
system_image_apks("trichrome_chrome_system_zip") {
apk_or_bundle_target = ":trichrome_chrome_bundle"
apk_or_bundle_target = ":$_main_trichrome_chrome_bundle_target"
input_apk_or_bundle = "$root_out_dir/apks/TrichromeChrome.aab"
output = "$root_out_dir/apks/TrichromeChromeSystem.zip"
stub_output = "$root_out_dir/apks/TrichromeChrome-Stub.apk"
@ -3208,7 +3272,7 @@ if (current_toolchain == default_toolchain) {
# Combines all splits into a single .apk for the Android system image.
system_image_apks("trichrome_chrome_system_apk") {
apk_or_bundle_target = ":trichrome_chrome_bundle"
apk_or_bundle_target = ":$_main_trichrome_chrome_bundle_target"
input_apk_or_bundle = "$root_out_dir/apks/TrichromeChrome.aab"
output = "$root_out_dir/apks/TrichromeChromeSystem.apk"
fuse_apk = true
@ -3269,13 +3333,13 @@ if (current_toolchain == default_toolchain) {
} else {
# Used for binary size monitoring.
create_app_bundle_minimal_apks("trichrome_chrome_minimal_apks") {
deps = [ ":trichrome_chrome_bundle" ]
deps = [ ":$_main_trichrome_chrome_bundle_target" ]
bundle_path = "$root_build_dir/apks/TrichromeChrome.aab"
}
group("trichrome_32_minimal_apks") {
deps = [
":$_main_trichrome_library_apk_target",
":trichrome_chrome_minimal_apks",
":trichrome_library_apk",
"//android_webview:trichrome_webview_minimal_apks",
]
}
@ -3419,7 +3483,6 @@ generate_jni("chrome_jni_headers") {
"java/src/org/chromium/chrome/browser/ServiceTabLauncher.java",
"java/src/org/chromium/chrome/browser/ShortcutHelper.java",
"java/src/org/chromium/chrome/browser/WarmupManager.java",
"java/src/org/chromium/chrome/browser/WebContentsFactory.java",
"java/src/org/chromium/chrome/browser/about_settings/AboutSettingsBridge.java",
"java/src/org/chromium/chrome/browser/announcement/AnnouncementNotificationManager.java",
"java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java",
@ -3429,13 +3492,13 @@ generate_jni("chrome_jni_headers") {
"java/src/org/chromium/chrome/browser/autofill/AutofillExpirationDateFixFlowBridge.java",
"java/src/org/chromium/chrome/browser/autofill/AutofillLogger.java",
"java/src/org/chromium/chrome/browser/autofill/AutofillNameFixFlowBridge.java",
"java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java",
"java/src/org/chromium/chrome/browser/autofill/AutofillSaveCardBottomSheetBridge.java",
"java/src/org/chromium/chrome/browser/autofill/AutofillSnackbarController.java",
"java/src/org/chromium/chrome/browser/autofill/CardUnmaskBridge.java",
"java/src/org/chromium/chrome/browser/autofill/CreditCardScannerBridge.java",
"java/src/org/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePrompt.java",
"java/src/org/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePromptController.java",
"java/src/org/chromium/chrome/browser/autofill/fp/FacilitatedPaymentBottomSheetBridge.java",
"java/src/org/chromium/chrome/browser/autofill/settings/AutofillPaymentMethodsDelegate.java",
"java/src/org/chromium/chrome/browser/autofill/settings/SettingsLauncherHelper.java",
"java/src/org/chromium/chrome/browser/autofill/settings/VirtualCardEnrollmentFields.java",
@ -3465,7 +3528,6 @@ generate_jni("chrome_jni_headers") {
"java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java",
"java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java",
"java/src/org/chromium/chrome/browser/compositor/scene_layer/ToolbarSwipeSceneLayer.java",
"java/src/org/chromium/chrome/browser/content/ContentUtils.java",
"java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java",
"java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchContext.java",
"java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java",
@ -3632,7 +3694,6 @@ source_set("chrome_test_util") {
"//chrome/browser",
"//chrome/browser/profiles:profile",
"//components/variations",
"//url:gurl_android",
"//url:url",
]
}
@ -3676,7 +3737,6 @@ group("jni_headers") {
"//chrome/browser/ui/android/hats/internal:jni_headers",
"//chrome/browser/ui/android/logo:jni_headers",
"//chrome/browser/ui/android/omnibox:jni_headers",
"//chrome/browser/ui/android/page_insights:jni_headers",
"//chrome/browser/ui/android/plus_addresses:jni_headers",
"//chrome/browser/ui/android/toolbar:jni_headers",
"//chrome/browser/ui/android/webid:jni_headers",
@ -3888,10 +3948,9 @@ if (current_toolchain == default_toolchain &&
deps = []
if (enable_libs_and_assets_verification) {
deps += [
":monochrome_public_bundle_validate_libs_and_assets",
":trichrome_chrome_bundle_validate_libs_and_assets",
":trichrome_library_apk_validate_libs_and_assets",
"//android_webview:trichrome_webview_bundle_validate_libs_and_assets",
":${_main_monochrome_public_bundle_target}_validate_libs_and_assets",
":${_main_trichrome_chrome_bundle_target}_validate_libs_and_assets",
":${_main_trichrome_library_apk_target}_validate_libs_and_assets",
]
if (android_64bit_target_cpu) {
deps += [
@ -3901,21 +3960,35 @@ if (current_toolchain == default_toolchain &&
":trichrome_library_32_apk_validate_libs_and_assets",
":trichrome_library_64_32_apk_validate_libs_and_assets",
":trichrome_library_64_apk_validate_libs_and_assets",
"//android_webview:trichrome_webview_32_64_bundle_validate_libs_and_assets",
"//android_webview:trichrome_webview_32_bundle_validate_libs_and_assets",
"//android_webview:trichrome_webview_64_32_bundle_validate_libs_and_assets",
"//android_webview:trichrome_webview_64_bundle_validate_libs_and_assets",
]
} else {
deps += [
"//android_webview:trichrome_webview_bundle_validate_libs_and_assets",
]
}
}
if (enable_manifest_verification) {
deps += [
":monochrome_public_bundle_validate_manifests",
":monochrome_public_bundle_validate_proguard_config",
":trichrome_chrome_bundle__base_bundle_module_validate_android_manifest",
":trichrome_library_apk_validate_android_manifest",
":${_main_monochrome_public_bundle_target}_validate_manifests",
":${_main_monochrome_public_bundle_target}_validate_proguard_config",
":${_main_trichrome_chrome_bundle_target}__base_bundle_module_validate_android_manifest",
":${_main_trichrome_library_apk_target}_validate_android_manifest",
]
if (android_64bit_target_cpu) {
deps += [
"//android_webview:system_webview_32_64_base_bundle_module_validate_android_manifest",
"//android_webview:trichrome_webview_32_64_base_bundle_module_validate_android_manifest",
]
} else {
deps += [
"//android_webview:system_webview_base_bundle_module_validate_android_manifest",
"//android_webview:trichrome_webview_base_bundle_module_validate_android_manifest",
]
}
}
}
}

View file

@ -1,4 +1,4 @@
# Copyright 2023 The Chromium Authors and Alex313031
# Copyright 2024 The Chromium Authors and Alex313031
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
@ -174,6 +174,10 @@ template("chrome_common_apk_or_module_tmpl") {
_version_code = chrome_version_code
}
if (defined(invoker.version_code)) {
_version_code = invoker.version_code
}
# Need to apply override explicitly to have it apply to library version.
if (android_override_version_code != "") {
_version_code = android_override_version_code

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2023 The Chromium Authors, Alex313031 and gz83
Copyright 2024 The Chromium Authors, Alex313031, and gz83
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2023 The Chromium Authors, Alex313031 and gz83
Copyright 2024 The Chromium Authors, Alex313031, and gz83
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->

View file

@ -1,4 +1,4 @@
// Copyright 2023 The Chromium Authors and Alex313031
// Copyright 2024 The Chromium Authors and Alex313031
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

View file

@ -1,4 +1,4 @@
// Copyright 2023 The Chromium Authors and Alex313031
// Copyright 2024 The Chromium Authors and Alex313031
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

View file

@ -208,6 +208,9 @@ CHAR_LIMIT guidelines:
<message name="IDS_COOKIE_CONTROLS_IPH_MESSAGE" desc="In-context Product Help - Appears right under the page info icon to highlight the Cookie Controls entrypoint.">
Site not working? Third-party cookies are blocked
</message>
<message name="IDS_COOKIE_CONTROLS_REMINDER_IPH_MESSAGE" desc="In-context Product Help - Appears right under the page info icon to highlight the Cookie Controls entrypoint. This message is a reminder.">
Site not working? Try temporarily allowing third-party cookies
</message>
<!-- Main Preferences -->
<message name="IDS_PREFS_SECTION_BASICS" desc='Title of "Basics" section of preferences. [CHAR_LIMIT=32]'>
@ -525,9 +528,24 @@ CHAR_LIMIT guidelines:
<message name="IDS_AUTOFILL_CREDIT_CARD_EDITOR_NICKNAME" desc="Label for text input field containing the nickname on a credit card. [CHAR_LIMIT=25]">
Card nickname
</message>
<message name="IDS_AUTOFILL_CREDIT_CARD_EDITOR_EXPIRATION_DATE_HINT" desc="Hint for text input field containing the expiration date on a credit card. [CHAR_LIMIT=25]">
MM / YY
</message>
<message name="IDS_AUTOFILL_CREDIT_CARD_EDITOR_SECURITY_CODE" desc="Label for text input field containing the security code on a credit card. [CHAR_LIMIT=25]">
Security code
</message>
<message name="IDS_AUTOFILL_CREDIT_CARD_EDITOR_INVALID_NICKNAME" desc="Label for text input field containing the nickname on a credit card. [CHAR_LIMIT=25]">
Nickname cant include numbers
</message>
<message name="IDS_AUTOFILL_CREDIT_CARD_EDITOR_INVALID_EXPIRATION_DATE" desc="Error label shown to the user in the expiration date field when the expiration date is invalid. [CHAR_LIMIT=25]">
Invalid date
</message>
<message name="IDS_AUTOFILL_CREDIT_CARD_EDITOR_EXPIRED_CARD" desc="Error label shown to the user in the expiration date field when the expiration date has already passed. [CHAR_LIMIT=25]">
Card expired
</message>
<message name="IDS_AUTOFILL_OPTIONAL_TAG" desc="The placeholder/label text to show for the autofill security code text field to indicate that the user can optionally enter a card security code.">
Optional
</message>
<message name="IDS_AUTOFILL_CARD_HOLDER_NAME" desc="Label for text input field containing the name on a credit card. [CHAR_LIMIT=32]">
Cardholder name
</message>
@ -537,12 +555,6 @@ CHAR_LIMIT guidelines:
<message name="IDS_AUTOFILL_CREDIT_CARD_EDITOR_EXPIRATION_DATE" desc="Label for text input field containing a credit card expiration date. [CHAR_LIMIT=32]">
Expiration date
</message>
<message name="IDS_AUTOFILL_CREDIT_CARD_EDITOR_EXPIRATION_MONTH" desc="Accessibility label for a spinner input field containing a list of expiration months for a credit card. [CHAR_LIMIT=32]">
Expiration month
</message>
<message name="IDS_AUTOFILL_CREDIT_CARD_EDITOR_EXPIRATION_YEAR" desc="Accessibility label for a spinner input field containing a list of expiration years for a credit card. [CHAR_LIMIT=32]">
Expiration year
</message>
<message name="IDS_AUTOFILL_CREDIT_CARD_EDITOR_BILLING_ADDRESS" desc="Label for a spinner input field containing a list of billing addresses for a credit card. [CHAR_LIMIT=32]">
Billing address
</message>
@ -937,9 +949,6 @@ For example, some websites may respond to this request by showing you ads that a
</message>
<!-- Privacy Sandbox Settings. Used by //chrome/browser/privacy_sandbox. -->
<message name="IDS_PREFS_PRIVACY_SANDBOX" desc="Title for the 'Privacy Sandbox' page. 'Privacy Sandbox' is a noun phrase (title case).">
Privacy Sandbox
</message>
<message name="IDS_PRIVACY_SANDBOX_STATUS_ENABLED" desc="Status text, displayed when the Privacy sandbox APIs are enabled.">
Trial features are on
</message>
@ -952,67 +961,6 @@ For example, some websites may respond to this request by showing you ads that a
<message name="IDS_SETTINGS_AD_PRIVACY_RESTRICTED_LINK_ROW_SUB_LABEL" desc="A string that describes 'Ad privacy', the label that appears just above it. This is the version of IDS_SETTINGS_AD_PRIVACY_PAGE_TOPICS_LINK_ROW_LABEL for restricted users.">
Manage info used by sites to measure ad performance
</message>
<message name="IDS_PRIVACY_SANDBOX_TRIALS_TITLE" desc="The title of the settings page on which the user can find all Privacy Sandbox trials. When launched, this page will appear at chrome://settings/privacySandbox. To get there: 1) go to Thorium settings 2) From the main menu (top left of the page) choose “Security and privacy” 3) At the bottom of the page, choose “Privacy Sandbox” There are 3 cards on this page that are presented as features. Only the first includes controls the user can manage, but we want to convey that Privacy Sandbox includes all of the things on this page.">
Trials
</message>
<message name="IDS_PRIVACY_SANDBOX_DESCRIPTION" desc="The page description that appears beneath the page title. * “can” is important: When trials ara on, any site the user visits may or may not be using one of the trial APIs. The chances that the user is in an active trial on any given page are low. * “less cross-site tracking”: We cant promise the complete elimination of cross-site tracking. Privacy Sandbox is about blocking cross-site tracking as much as possible, but sites can still use fingerprinting to try and identify users from one site to the next.">
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. Well add new trials as theyre ready to test.
</message>
<message name="IDS_PRIVACY_SANDBOX_ABOUT_AD_PERSONALIZATION_LINK" desc="Learn more link * Unfolds content within the page * The text that appears describes 2 ways in which a site can target ads: the “Topics API” and the “FLEDGE API”. You can see what those are at www.privacysanbox.com or theyre described for the users benefit in other text. * “ad personalization” can mean different things in different contexts. Here, were using it as a simple noun. In other words, its not the name of a control but a descriptive term used to describe the personalization of ads in the Thorium browser. This “ad personalization” shouldnt be confused with the setting in the Google Account called “Ad personalization”.">
About Browser-based ad personalization
</message>
<message name="IDS_PRIVACY_SANDBOX_AD_PERSONALIZATION_TITLE" desc="The title of card 1 of 3. * Title of the setting to control “Browser-based ad personalization”.">
Ad personalization
</message>
<message name="IDS_PRIVACY_SANDBOX_AD_PERSONALIZATION_SUMMARY" desc="The description of card 1 of 3. * “browsing history”: we define this as “a record of sites youve visited using Thorium on this device.” By “recent”, we mean the last 3 weeks (also defined later in the UI). * “affects the ads you see”: We think were stating the obvious. The ads the user sees are affected by the things they do online, like browsing the web.">
Your browsing history affects the ads you see
</message>
<message name="IDS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DESCRIPTION_TRIALS_ON" desc="A paragraph beneath the card title. Note that this paragraph is written so that it describes both the Topics API and the FLEDGE API. Some things are described slightly differently for this reason. Version 1 of 3 of this paragraph. 1) The first line is written with the assumption that the user a) has Privacy Sandbox trials turned on and b) has been randomly selected by Thorium to be in an active experiment. As a result of both conditions, this user should have data on this page (a list of interests and a list of sites). 2) NOT THE CASE FOR THIS STRING: A different version of this first line is written for the case that a user has the Privacy Sandbox trials turned on but they havent been randomly selected to be in a trial. 3) NOT THE CASE FOR THIS STRING: A different version of this first line is written for the case that a user doesnt have the Privacy Sandbox trials turned on. * “browsing history”: “a record of sites youve visited using Thorium on this device.” * “affects the ads you see and the interests as estimated below”: browsing history leads to Thorium establishing user interests leads to 1) the ads you see are different, and 2) the list of things on this page changes based on what Thorium establishes.* “To protect your privacy”: Today, most data is kept for long periods of time. This new Topics API doesnt retain estimated topics for more than 3 weeks. The only reason for this feature is to protect the users privacy. * “auto”: isnt strictly necessary, but it conveys that this feature is an ongoing part of the service. This isnt describing, for example, a one-time deletion. * “rolling basis each month”: Information associated with Topics and FLEDGE are deleted on a rolling basis at least once per month. Its simpler to talk about “once per month” rather than 3 weeks for Topics and 4 weeks for FLEDGE. * “Interests can refresh…”: We intend for this line to cover both Topics and FLEDGE. Its slightly messy, because there is a suggestion that this line is more about Topics than FLEDGE (“interests” is more prominent in the Topics subtitle).">
Your browsing history affects the ads you see and the interests as estimated below. To protect your privacy, Thorium auto-deletes your interests on a rolling basis each month. Interests can refresh unless you remove them.
</message>
<message name="IDS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DESCRIPTION_NO_ITEMS" desc="A paragraph beneath the card title. Note that this paragraph is written so that it describes both the Topics API and the FLEDGE API. Some things are described slightly differently for this reason. Version 3 of 3 of this paragraph. 1) NOT THE CASE FOR THIS STRING: A different version of this first line is written for the case that a user has Privacy Sandbox trials turned on AND that theyve been randomly selected for a trial. 2) NOT THE CASE FOR THIS STRING: A different version of this first line is written for the case that a user has the Privacy Sandbox trials turned on but they havent been randomly selected to be in a trial. 3) The first line is written with the assumption that the user a) doesnt have Privacy Sandbox trials turned on. b) Because of this, they cant be randomly selected for a trial. This explains why the user doesnt have data shown on the page. * “browsing history”: “a record of sites youve visited using Thorium on this device.” * “affects the ads you see and the interests as estimated below”: browsing history leads to Thorium establishing user interests leads to 1) the ads you see are different, and 2) the list of things on this page changes based on what Thorium establishes. * “To protect your privacy”: Today, most data is kept for long periods of time. This new Topics API doesnt retain estimated topics for more than 3 weeks. The only reason for this feature is to protect the users privacy. * “auto”: isnt strictly necessary, but it conveys that this feature is an ongoing part of the service. This isnt describing, for example, a one-time deletion. * “rolling basis each month”: Information associated with Topics and FLEDGE are deleted on a rolling basis at least once per month. Its simpler to talk about “once per month” rather than 3 weeks for Topics and 4 weeks for FLEDGE. * “Interests can refresh…”: We intend for this line to cover both Topics and FLEDGE. Its slightly messy, because there is a suggestion that this line is more about Topics than FLEDGE (“interests” is more prominent in the Topics subtitle).">
If Thorium has randomly placed you in an active trial, your browsing history affects the ads you see and the interests as estimated below. To protect your privacy, Thorium deletes your interests on a rolling basis each month. Interests refresh unless you remove them.
</message>
<message name="IDS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DESCRIPTION_TRIALS_OFF" desc="A paragraph beneath the card title. Note that this paragraph is written so that it describes both the Topics API and the FLEDGE API. Some things are described slightly differently for this reason. Version 2 of 3 of this paragraph. 1) NOT THE CASE FOR THIS STRING: A different version of this first line is written for the case that a user has Privacy Sandbox trials turned on AND that theyve been randomly selected for a trial. 2) The first line is written with the assumption that the user 1) has Privacy Sandbox trials turned on but 2) has NOT been randomly selected by Thorium to be in an active experiment. This explains why the user doesnt have data shown on the page. 3) NOT THE CASE FOR THIS STRING: A different version of this first line is written for the case that a user doesnt have the Privacy Sandbox trials turned on. * “browsing history”: “a record of sites youve visited using Thorium on this device.” * “affects the ads you see and the interests as estimated below”: browsing history leads to Thorium establishing user interests leads to 1) the ads you see are different, and 2) the list of things on this page changes based on what Thorium establishes. * “To protect your privacy”: Today, most data is kept for long periods of time. This new Topics API doesnt retain estimated topics for more than 3 weeks. The only reason for this feature is to protect the users privacy. * “auto”: isnt strictly necessary, but it conveys that this feature is an ongoing part of the service. This isnt describing, for example, a one-time deletion. * “rolling basis each month”: Information associated with Topics and FLEDGE are deleted on a rolling basis at least once per month. Its simpler to talk about “once per month” rather than 3 weeks for Topics and 4 weeks for FLEDGE.* “Interests can refresh…”: We intend for this line to cover both Topics and FLEDGE. Its slightly messy, because there is a suggestion that this line is more about Topics than FLEDGE (“interests” is more prominent in the Topics subtitle).">
When trials are on and if Thorium has randomly placed you in an active trial, your browsing history affects the ads you see and the interests as estimated below. To protect your privacy, Thorium deletes your interests on a rolling basis each month.
</message>
<message name="IDS_PRIVACY_SANDBOX_AD_MEASUREMENT_TITLE" desc="The title of card 2 of 3. * The title of a Privacy Sandbox API used by advertisers to measure the effectiveness of ads.">
Ad measurement
</message>
<message name="IDS_PRIVACY_SANDBOX_AD_MEASUREMENT_DESCRIPTION_TRIALS_ON" desc="A description of the Ad measurement API. * “Ad measurement” is the name of an API in this context. We dont use “API” with the user, but they need to know that there is something called “A measurement” and what it does. * “sites you visit”: call the API to get information. The actor is the site, not Thorium. * “restricts cross-site tracking”: Today, with 3rd-party cookies, ad measurement technologies can inadvertently (and intentionally) share considerable information from one site to another). This feature restricts that sharing in order to improve the users privacy. * “your browsing history”: points to chrome://history/ * “You can control…”: The user can “control” this data by clearing their browser data at chrome://history/">
Ad measurement allows sites you visit to request information from Thorium 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.
When you delete your browsing history — all or for a specific site — you also delete associated measurement info. See <ph name="BEGIN_LINK">&lt;link&gt;</ph>your browsing history<ph name="END_LINK">&lt;/link&gt;</ph>.
</message>
<message name="IDS_PRIVACY_SANDBOX_AD_MEASUREMENT_DESCRIPTION_TRIALS_OFF" desc="A description of the Ad measurement API. * “Ad measurement” is the name of an API in this context. We dont use “API” with the user, but they need to know that there is something called “A measurement” and what it does. * “sites you visit”: call the API to get information. The actor is the site, not Thorium. * “restricts cross-site tracking”: Today, with 3rd-party cookies, ad measurement technologies can inadvertently (and intentionally) share considerable information from one site to another). This feature restricts that sharing in order to improve the users privacy. * “your browsing history”: points to chrome://history/ * “You can control…”: The user can “control” this data by clearing their browser data at chrome://history/">
When trials are on, Ad measurement allows sites you visit to request information from Thorium 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.
When you delete your browsing history — all or for a specific site — you also delete associated measurement info. See <ph name="BEGIN_LINK">&lt;link&gt;</ph>your browsing history<ph name="END_LINK">&lt;/link&gt;</ph>.
</message>
<message name="IDS_PRIVACY_SANDBOX_AD_MEASUREMENT_SUMMARY" desc="The description of card 2 of 3 * The description of a Privacy Sandbox API used by advertisers to measure the effectiveness of ads.">
Advertisers can understand how ads perform
</message>
<message name="IDS_PRIVACY_SANDBOX_SPAM_FRAUD_TITLE" desc="The title of card 3 of 3. * “reducation”: dont use a word that sounds more like “elimination”. We cant promise the complete removal of spam.">
Spam &amp; fraud reduction
</message>
<message name="IDS_PRIVACY_SANDBOX_SPAM_FRAUD_SUMMARY" desc="The description of card 3 of 3. * “help”: This API is one way that sites can fight fraud. Dont suggest that sites must use this API to fight fraud. * “distinguish bots from people”: This touches on just one aspect of fraud but we hope it helps the user understand the purpose of this API, and that is to distinguish real users from malicious players." >
Help sites fight fraud and distinguish bots from people
</message>
<message name="IDS_PRIVACY_SANDBOX_SPAM_FRAUD_DESCRIPTION_TRIALS_ON" desc="The first of 3 paragraphs on the spam &amp; fraud card. This is a behind-the-scenes upgrade to Thorium. There arent any user controls or data to interact with, at least not yet. * “private state tokens”: explained in the next paragraph * “help”: This feature is one way that sites can fight fraud. Dont suggest that sites must use this API to fight fraud. * “distinguish bots from people”: This touches on just one aspect of fraud but we hope it helps the user understand the purpose of this API, and that is to distinguish real users from malicious players. * “interaction”: is broad. Its not just viewing a site but also how you interact with it, like by signing in * “Later”: is important to convey the passage of time. We dont want to convey how much time (it could be tiny). Whats important is that the user understands this is essentially a two-step process. A private state token is issued. Sometime in the future, when hyou visit a different site, that private state token might get used. ">
Spam &amp; fraud reduction relies on private state 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 private state token to your browser. Later, if other sites you visit check for and find a valid private state token, theyre more likely to treat you like a person and not a bot.
Private state tokens improve privacy on the web and cant be used to find out who you are.
</message>
<message name="IDS_PRIVACY_SANDBOX_SPAM_FRAUD_DESCRIPTION_TRIALS_OFF" desc="The first of 3 paragraphs on the spam &amp; fraud card. This is a behind-the-scenes upgrade to Thorium. There arent any user controls or data to interact with, at least not yet. * “private state tokens”: explained in the next paragraph * “help”: This feature is one way that sites can fight fraud. Dont suggest that sites must use this API to fight fraud. * “distinguish bots from people”: This touches on just one aspect of fraud but we hope it helps the user understand the purpose of this API, and that is to distinguish real users from malicious players. * “interaction”: is broad. Its not just viewing a site but also how you interact with it, like by signing in * “Later”: is important to convey the passage of time. We dont want to convey how much time (it could be tiny). Whats important is that the user understands this is essentially a two-step process. A private state token is issued. Sometime in the future, when hyou visit a different site, that private state token might get used. ">
When trials are on, Spam &amp; fraud reduction relies on private state 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 private state token to your browser. Later, if other sites you visit check for and find a valid private state token, theyre more likely to treat you like a person and not a bot.
Private state tokens improve privacy on the web and cant be used to find out who you are.
</message>
<message name="IDS_PRIVACY_SANDBOX_LEARN_MORE_DESCRIPTION_TOPICS_1" desc="TOPICS API Bullet 1 of 3 that appear beneath the “Your interests as estimated by Thorium” subtitle. We break the description into the 3 pieces users most care about: 1) what data, 2) why this data, 3) what can I do about it? * “What data is used:” is bold and serves as a label to help people skimming the page. * “Your browsing history”: The users browsing history is available beneath the “History” menu at Thoriums top level. The Topics API estimates topics of interest based on sites in the users browsing history that are participating in the trials.">
<ph name="BEGIN_BOLD">&lt;b&gt;</ph>What data is used:<ph name="END_BOLD">&lt;/b&gt;</ph> Your browsing history, a record of sites youve visited using Thorium on this device.
</message>
@ -1031,66 +979,12 @@ Private state tokens improve privacy on the web and cant be used to find out
<message name="IDS_PRIVACY_SANDBOX_LEARN_MORE_DESCRIPTION_FLEDGE_3" desc="FLEDGE API Bullet 3 of 3 that appear beneath the “Sites you visit that define your interests” subtitle. We break the description into the 3 pieces users most care about: 1) what data, 2) why this data, 3) what can I do about it? * “How you can manage your data:” is bold and serves as a label to help people skimming the page. * “To protect your privacy”: Today, most data is kept for long periods of time. This new Topics API doesnt retain estimated topics for more than 3 weeks. The only reason for this feature is to protect the users privacy. * “auto”: isnt strictly necessary, but it conveys that this feature is an ongoing part of the service. This isnt describing, for example, a one-time deletion. * “older than 4 weeks”: Were trying to convey a rolling delete. Imagine a user opens a browser for the very first time. As the user browses, sites can store info with Thorium for up to 4 weeks. So in week 1, the user visits site A. When week 5 starts, site A is removed from the list of sites. * “a site you visit…”: If a user visits site A every week for months on end, that site will remain on the users list of sites for months on end. * “Or you can…”: Say a user strongly dislikes www.siteB.com. But that user might visit siteB.com as part of their job, or just to see how bad it really is. The user can stop siteB from defining interests for them. This block lasts indefinitely.">
<ph name="BEGIN_BOLD">&lt;b&gt;</ph>How you can manage your data:<ph name="END_BOLD">&lt;/b&gt;</ph> To protect your privacy, we auto-delete sites from the list that are older than 4 weeks. A site you visit again might appear on the list again. Or you can remove a site if you dont want that site to ever define interests for you.
</message>
<message name="IDS_PRIVACY_SANDBOX_LEARN_MORE_TITLE" desc="Title of the settings page to explain ad personalization in the Privacy Sandbox.">
About ad personalization
</message>
<message name="IDS_PRIVACY_SANDBOX_ADD_INTEREST_BUTTON_DESCRIPTION" desc="Content description for button that adds an ad interest for the Topics API of the Privacy Sandbox.">
Add <ph name="INTEREST">%1$s<ex>Acting and Theater</ex></ph>
</message>
<message name="IDS_PRIVACY_SANDBOX_ADD_SITE_BUTTON_DESCRIPTION" desc="Content description for button that adds an ad interest for the FLEDGE API of the Privacy Sandbox.">
Add <ph name="SITE">%1$s<ex>example.com</ex></ph>
</message>
<message name="IDS_PRIVACY_SANDBOX_ADD_INTEREST_SNACKBAR" desc="Text on a snackbar after an ad personalization interest was added to the Topics API of the Privacy Sandbox.">
Thorium can consider this interest
</message>
<message name="IDS_PRIVACY_SANDBOX_ADD_SITE_SNACKBAR" desc="Text on a snackbar after an ad personalization interest was added to the FLEDGE API of the Privacy Sandbox.">
Site can define interests
</message>
<message name="IDS_PRIVACY_SANDBOX_REMOVE_INTEREST_BUTTON_DESCRIPTION" desc="Content description for button that removes an ad interest for the Topics API of the Privacy Sandbox.">
Remove <ph name="INTEREST">%1$s<ex>Acting and Theater</ex></ph>
</message>
<message name="IDS_PRIVACY_SANDBOX_REMOVE_SITE_BUTTON_DESCRIPTION" desc="Content description for button that removes an ad interest for the FLEDGE API of the Privacy Sandbox.">
Remove <ph name="DOMAIN">%1$s<ex>example.com</ex></ph>
</message>
<message name="IDS_PRIVACY_SANDBOX_REMOVE_INTEREST_SNACKBAR" desc="Text on a snackbar after an ad personalization interest was removed from the Topics API of the Privacy Sandbox.">
Interest removed
</message>
<message name="IDS_PRIVACY_SANDBOX_REMOVE_INTEREST_TITLE" desc="Title of the settings page to configure interests that were removed from ad personalization in the Privacy Sandbox.">
Interests you removed
</message>
<message name="IDS_PRIVACY_SANDBOX_REMOVE_SITE_SNACKBAR" desc="Text on a snackbar after an ad personalization interest was removed from the FLEDGE API of the Privacy Sandbox.">
Site removed
</message>
<message name="IDS_PRIVACY_SANDBOX_REMOVE_SITES_TITLE" desc="Title of the settings page to configure sites that were removed from ad personalization in the Privacy Sandbox.">
Sites you removed
</message>
<message name="IDS_PRIVACY_SANDBOX_REMOVE_INTEREST_DESCRIPTION" desc="A paragraph beneath the card title. The page title explains why things appear on this page. This string explains why the user might want to “un-remove” or “re-allow” an item from the list. If a user does choose “Allow” for an item, there wont be any immediate change in the interface because the item simply becomes eligible again. So, for example, the user previously blocked the interest “Horror movies.” Today, they “allow” “Horror movies” because theyve decided that as about horror movies are actually OK to see. It might take another week or longer, based on the users browsing history, for “Horror movies” to appear in the list of interests again as an active interest within the last 3 weeks. * “Allow”: This aligns with the button label titled “allow”. It wouldnt make much sense if the user couldnt see the Allow button on the card.">
Allow an interest or site if you think ads related to the item would be useful to you
</message>
<message name="IDS_PRIVACY_SANDBOX_AD_PERSONALIZATION_SUBTITLE" desc="Subtitle of page where the user controls thier Browser-based ad personalization settings.">
Browser-based ad personalization
</message>
<message name="IDS_PRIVACY_SANDBOX_TOPIC_INTERESTS_SUBTITLE" desc="TOPICS API A sub title that describes the first of 2 ways a site can get info from Thorium in order to target ads to the user. Topics of interest include things like “Live comedy” and “Rock music”. Thorium estimates these interests based on the sites users visit. * “Your”: we need to convey a sense of ownership, even if the user didnt explicitly choose the interests were talking about. Without the “your”, it could sound like Thorium is simply building a generic library of interests. * “estimated”: Its an “estimation”, and we dont want to suggest that we know with certainty the users interests. Avoid words like “guess”, “establish”, “define”, etc. (in place of “estimate”). * “by Thorium”: This is new behavior for a browser (Thorium) to take an active role in processing user data for the purposes of showing ads. Its important to convey “chrome”, the actor in this case.">
Your interests as estimated by Thorium
</message>
<message name="IDS_PRIVACY_SANDBOX_FLEDGE_INTERESTS_SUBTITLE" desc="FLEDGE API. A sub title that describes the second of 2 ways a site can get info from Thorium in order to target ads to the user.">
Sites you visit that define your interests
</message>
<message name="IDS_PRIVACY_SANDBOX_TOPIC_EMPTY_STATE" desc="Summary shown when no interests for ad personlization are available for the Topics API of the Privacy Sandbox.">
A list of interests will appear here as you browse the web
</message>
<message name="IDS_PRIVACY_SANDBOX_REMOVED_TOPICS_EMPTY_STATE" desc="Summary shown when no interests for ad personlization were removed from the Topics API of the Privacy Sandbox.">
Interests you removed will appear here
</message>
<message name="IDS_PRIVACY_SANDBOX_REMOVED_SITES_EMPTY_STATE" desc="Summary shown when no interests for ad personlization were removed from the FLEDGE API of the Privacy Sandbox.">
Sites you removed will appear here
</message>
<message name="IDS_PRIVACY_SANDBOX_FLEDGE_SUBTITLE" desc="FLEDGE API A sub title that describes the second of 2 ways a site can get info from Thorium in order to target ads to the user.">
Sites you visit that define your interests
</message>
<message name="IDS_PRIVACY_SANDBOX_FLEDGE_EMPTY_STATE" desc="Summary shown when no interests for ad personlization are available for the FLEDGE API of the Privacy Sandbox.">
A list of sites will appear here as you browse the web
</message>
<!-- Privacy Sandbox dialog. -->
<message name="IDS_PRIVACY_SANDBOX_DIALOG_NO_BUTTON" desc="A button that allows the user to decline joining the Privacy Sandbox trials. If the user chooses “No thanks” this consent page disappears and the flow is complete.">
@ -1150,9 +1044,6 @@ Private state tokens improve privacy on the web and cant be used to find out
<message name="IDS_PRIVACY_SANDBOX_NOTICE_SHEET_TITLE" desc="CONTEXT: there are updates to the Thorium browser each month. Just after the user accepts the latest update, this message will appear. The title of the page. * “Help us” is intended to convey a sense of collaboration. Privacy Sandbox is an ongoing multi-year effort. There are sites participating to help us and we also need users to agree to these trials so that we can measure the effectiveness of the features we're building. * “build” is intended to convey that this is a process. The user is agreeing to an effort rather than a stable set of features. Something like “make” doesn't have the same nuance. * See www.privacysandbox.com for more context.">
Help us build a better web
</message>
<message name="IDS_PRIVACY_SANDBOX_NOTICE_SHEET_DESCRIPTION" desc="* “Thorium is finding new ways”: “finding” is meant to convey a work in progress, like “build” in the title. The features are live and functional, but still in beta. So we want a verb thats stronger than “exploring” but weaker than “launching”. * “reduce tracking”: This used to read “reduce cross-site tracking”, but weve dropped “cross-site” because it makes the idea unnecessarily complicated. * “estimate your interests”: Topics of interest include things like “Live comedy” and “Rock music”. Thorium estimates these interests based on the sites users visit. Its an “estimation”, and we dont want to suggest that we know with certainty the users interests. Avoid words like “guess”, “establish”, “define”, etc. (in place of “estimate”). * “Then” is an important keyword. It suggests some amount of time later. The first step is that interests are generated. Later (minutes or weeks), a different site might request interests.">
Thorium is finding new ways to reduce tracking and keep you even safer as you browse. Thorium also <ph name="BEGIN_LINK">&lt;link&gt;</ph>estimates your interests<ph name="END_LINK">&lt;/link&gt;</ph> and enables you to manage them. Then, sites you visit can ask Thorium for your interests to show you ads.
</message>
<!-- Privacy Sandbox v4 - Consent & Notice Flow -->
<message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_BULLET_2" desc="* This is 2 of 2 bullets that site beneath the sentence: 'Were launching new ways to limit what sites can learn about you when they show you personalized ads, for example:' * 'ad measurement' is the name of a new setting we're launching and that appears on the Ad privacy page of Thorium settings. * 'limited types of data': This setting helps an advertiser associate a user's actions on one site with their actions on another. For example, a user sees an ad on one site and then later buys that product from the company that sells the product. The ad measurement setting allows Thorium to help a company make the association between the two sites so that the first site can be fairly compensated for showing an ad. Compared with third-party cookies, very little info is shared between sites to support this functionality. **** CONTEXT PRIVACY SANDBOX **** Thoriums Privacy Sandbox initiative 1) deprecates third-party cookies in Thorium, 2) supports free and open content on the web (by finding better ways to support ads online), 3) while providing stronger privacy protections for users. You can see a high-level description of this public project at www.privacysanbox.com. **** CONTEXT EEA NOTICE **** 1) This screen provides notice to Thorium users in the European Economic Area (EEA). It follows guidelines established by the GDPR. 2) This screen is the second of 2 screens. This second screen describes 2 settings: “Site-suggested ads” and “Ad measurement”. The first screen describes the “Ad topics” setting. ">
@ -1655,19 +1546,21 @@ Your Google account may have other forms of browsing history like searches and a
When you tap or type in the address bar or search box, you'll see suggestions from your default search engine. This is off in Incognito.
</message>
<message name="IDS_PRIVACY_GUIDE_SEARCH_SUGGESTIONS_ITEM_TWO" desc="Second bullet point that describes the details of the search suggestions toggle.">
What you type in the address bar or search box is sent to your default search engine
As you type, Thorium sends the content of the address bar or search box to your default search engine
</message>
<message name="IDS_PRIVACY_GUIDE_SEARCH_SUGGESTIONS_ITEM_THREE" desc="Third bullet point that describes the details of the search suggestions toggle.">
Depending on your settings, Thorium may also send cookies and your current URL
Depending on your settings, Thorium may also send cookies, your current URL, and your location
</message>
<message name="IDS_PRIVACY_GUIDE_SEARCH_SUGGESTIONS_ITEM_FOUR" desc="Fourth bullet point that describes the details of the search suggestions toggle.">
When off, youll still see suggestions that Thorium provides locally
</message>
<!-- Tracking protection -->
<!-- TODO(b/295926938): Update the strings once finalized. -->
<message name="IDS_TRACKING_PROTECTION_TITLE" desc="" translateable="false">
<message name="IDS_TRACKING_PROTECTION_TITLE" desc="Tracking Protection preference item title.">
Tracking protection
</message>
<message name="IDS_TRACKING_PROTECTION_SUMMARY" desc="" translateable="false">
Protection from trackers (third-party cookies, IP tracking, invasive scripts, and more)
<message name="IDS_TRACKING_PROTECTION_SUMMARY" desc="Tracking Protection preference item summary.">
Manage third-party cookies and tracking protections
</message>
<!-- Safety check -->
@ -2685,12 +2578,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_CONTEXTMENU_SEARCH_IMAGE_WITH_GOOGLE_LENS" desc="Context sensitive menu item for deep linking into google lens. [CHAR_LIMIT=30]">
Search image with Google Lens <ph name="BEGIN_NEW">&lt;new&gt;</ph>New<ph name="END_NEW">&lt;/new&gt;</ph>
</message>
<message name="IDS_CONTEXTMENU_SEARCH_IMAGE_WITH_GOOGLE_LENS_ALT_TEXT_1" desc="ALT TXT 1: Context sensitive menu item for deep linking into google lens. [CHAR_LIMIT=44]">
Search image with Google <ph name="BEGIN_NEW">&lt;new&gt;</ph>New<ph name="END_NEW">&lt;/new&gt;</ph>
</message>
<message name="IDS_CONTEXTMENU_SEARCH_IMAGE_WITH_GOOGLE_LENS_ALT_TEXT_2" desc="ALT TXT 2: Context sensitive menu item for deep linking into google lens. [CHAR_LIMIT=30]">
Search inside image with Google <ph name="BEGIN_NEW">&lt;new&gt;</ph>New<ph name="END_NEW">&lt;/new&gt;</ph>
</message>
<message name="IDS_CONTEXTMENU_TRANSLATE_IMAGE_WITH_GOOGLE_LENS" desc="Context sensitive chip for deep linking into google lens for translate results. [CHAR_LIMIT=30]">
Translate image with Google Lens <ph name="BEGIN_NEW">&lt;new&gt;</ph>New<ph name="END_NEW">&lt;/new&gt;</ph>
</message>
@ -3568,6 +3455,19 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_NTP_DISCOVER_OFF_BRANDED" desc="Title in the feed header when the feed is turned off and the default search engine is not Google. Please use the branded term for Discover, as listed under Product Names in the Google Glossary Manager (TC ID 1799975766543019278).">
Discover by Google - off
</message>
<message name="IDS_SUPERVISED_USER_NTP_DISCOVER_ON" desc="Title in the feed header when the feed is turned on for a supervised user. Please use the branded term for Discover, as listed under Product Names in the Google Glossary Manager (TC ID 1799975766543019278).">
Content for young minds
</message>
<message name="IDS_SUPERVISED_USER_NTP_DISCOVER_ON_BRANDED" desc="Title in the feed header when the feed is turned on for a supervised user and the default search engine is not Google. Please use the branded term for Discover, as listed under Product Names in the Google Glossary Manager (TC ID 1799975766543019278).">
Content by Google for young minds
</message>
<message name="IDS_SUPERVISED_USER_NTP_DISCOVER_OFF" desc="Title in the feed header when the feed is turned off for a supervised user. Please use the branded term for Discover, as listed under Product Names in the Google Glossary Manager (TC ID 1799975766543019278).">
Content for young minds - off
</message>
<message name="IDS_SUPERVISED_USER_NTP_DISCOVER_OFF_BRANDED" desc="Title in the feed header when the feed is turned off for a supervised user and the default search engine is not Google. Please use the branded term for Discover, as listed under Product Names in the Google Glossary Manager (TC ID 1799975766543019278).">
Content by Google for young minds - off
</message>
<message name="IDS_NTP_FOLLOWING"
meaning="Title for content - e.g. Followed sites"
desc="Title in the feed header for user-customized following feed. This feed is composed of articles and content from sites that the user has followed">Following</message>
@ -3692,6 +3592,12 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_CUSTOM_TAB_SIDE_SHEET_MINIMIZE" desc="The accesibility text for minimize button in side-sheet custom tab.">
Collapse to side view
</message>
<message name="IDS_CUSTOM_TAB_MINIMIZE" desc="The accessibility text for minimize button for custom tabs.">
Minimize tab
</message>
<message name="IDS_CUSTOM_TAB_MINIMIZE_BUTTON_IPH_BUBBLE_TEXT" desc="The message on the text bubble shown to educate the user about the minimize button on the custom tab toolbar.">
Minimize tab to return to it later
</message>
<message name="IDS_ADAPTIVE_TOOLBAR_BUTTON_PREFERENCE_NEW_TAB" desc="Title name for the new tab option in the preference.">
New tab
</message>
@ -4059,27 +3965,51 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_SORT_BY_MANUAL" desc="Option in the bookmarks manager to sort manually. [CHAR_LIMIT=24]">
Sort by manual order
</message>
<message name="IDS_SORT_BY_MANUAL_ANNOUNCEMENT" desc="Accessibility announcement in the bookmarks manager when sorting manually.">
Sorting by manual order
</message>
<message name="IDS_SORT_BY_NEWEST" desc="Option in the bookmarks manager to sort by newest. [CHAR_LIMIT=24]">
Sort by newest
</message>
<message name="IDS_SORT_BY_NEWEST_ANNOUNCEMENT" desc="Accessibility announcement in the bookmarks manager when sorting by newest.">
Sorting by newest
</message>
<message name="IDS_SORT_BY_OLDEST" desc="Option in the bookmarks manager to sort by newest. [CHAR_LIMIT=24]">
Sort by oldest
</message>
<message name="IDS_SORT_BY_OLDEST_ANNOUNCEMENT" desc="Accessibility announcement in the bookmarks manager when sorting by newest.">
Sorting by oldest
</message>
<message name="IDS_SORT_BY_LAST_OPENED" desc="Option in the bookmarks manager to sort by last opened. [CHAR_LIMIT=24]">
Sort by last opened
</message>
<message name="IDS_SORT_BY_LAST_OPENED_ANNOUNCEMENT" desc="Accessibility announcement in the bookmarks manager when sorting by last opened.">
Sorting by last opened
</message>
<message name="IDS_SORT_BY_ALPHA" desc="Option in the bookmarks manager to sort alphabetically. A and Z should be substituted with the first/last letter in the localized language. [CHAR_LIMIT=24]">
Sort by A to Z
</message>
<message name="IDS_SORT_BY_REVERSE_ALPHA" desc="Option in the bookmarks manager to sort alphabetically. A and Z should be substituted with the first/last letter in the localized language. [CHAR_LIMIT=24]">
<message name="IDS_SORT_BY_ALPHA_ANNOUNCEMENT" desc="Accessibility announcement in the bookmarks manager when sorting alphabetically. A and Z should be substituted with the first/last letter in the localized language.">
Sorting from A to Z
</message>
<message name="IDS_SORT_BY_REVERSE_ALPHA" desc="Option in the bookmarks manager to sort reverse alphabetically. A and Z should be substituted with the first/last letter in the localized language. [CHAR_LIMIT=24]">
Sort by Z to A
</message>
<message name="IDS_SORT_BY_REVERSE_ALPHA_ANNOUNCEMENT" desc="Accessibility announcement in the bookmarks manager when sorting reverse alphabetically. A and Z should be substituted with the first/last letter in the localized language.">
Sorting from Z to A
</message>
<message name="IDS_VISUAL_VIEW" desc="Option in the bookmarks manager to show the visual view with expanded rows and images. [CHAR_LIMIT=24]">
Visual view
</message>
<message name="IDS_VISUAL_VIEW_ANNOUNCEMENT" desc="Accessibility announcement in the bookmarks manager when the visual view with expanded rows and images is selected.">
Showing visual view
</message>
<message name="IDS_COMPACT_VIEW" desc="Option in the bookmarks manager to show the compact view with smaller rows and favicons. [CHAR_LIMIT=24]">
Compact view
</message>
<message name="IDS_COMPACT_VIEW_ANNOUNCEMENT" desc="Accessibility announcement in the bookmarks manager when the compact view with smaller rows and favicons is selected.">
Showing compact view
</message>
<message name="IDS_CREATE_NEW_FOLDER" desc="Option in the bookmarks manager to show the create a new folder in the current context. [CHAR_LIMIT=24]">
Create new folder
</message>
@ -5041,9 +4971,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_SEND_TAB_TO_SELF_MANAGE_DEVICES_LINK" desc="Text with a link to a page where the user can manage the devices they can share a tab to.">
<ph name="BEGIN_LINK">&lt;link&gt;</ph>Your devices<ph name="END_LINK">&lt;/link&gt;</ph> · <ph name="EMAIL">%1$s<ex>foo@gmail.com</ex></ph>
</message>
<message name="IDS_SEND_TAB_TO_SELF_WHEN_SIGNED_IN_UNAVAILABLE" desc="Instructions for the user to enable the feature when it's currently unavailable.">
You can send tabs between devices that are signed in with the same Google Account
</message>
<message name="IDS_SEND_TAB_TO_SELF_ANDROID_NO_TARGET_DEVICE_LABEL" desc="Text shown when a user with no available target devices attempts to use send-tab-to-self.">
To send this tab to another device, sign in to Thorium there
</message>
@ -5764,24 +5691,66 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_ACCOUNT_SELECTION_SHEET_CLOSED" desc="Accessibility string read when the Account Selection bottom sheet showing a list of the user's accounts is closed." is_accessibility_with_no_ui="true">
Sign in bottom sheet is closed.
</message>
<message name="IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_BODY" desc="Body for mismatch dialog which is shown to prompt the user to sign in to a website using an account from an identity provider." translateable="false">
<message name="IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_BODY" desc="Body for mismatch dialog which is shown to prompt the user to sign in to a website using an account from an identity provider.">
You can use your <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE">%1$s<ex>idp.com</ex></ph> account on this site. To continue, sign in to <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE">%1$s<ex>idp.com</ex></ph>.
</message>
<message name="IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_CONTINUE" desc="Title of the button that allows the user to continue with signing in to an account from an identity provider." translateable="false">
<message name="IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_CONTINUE" desc="Title of the button that allows the user to continue with signing in to an account from an identity provider.">
Continue
</message>
<message name="IDS_SIGNIN_ERROR_DIALOG_GOT_IT_BUTTON" desc="The button text on the error dialog for the user to acknowledge that an error has occurred in their attempt to sign in with an account from an identity provider." translateable="false">
<message name="IDS_SIGNIN_ERROR_DIALOG_GOT_IT_BUTTON" desc="The button text on the error dialog for the user to acknowledge that an error has occurred in their attempt to sign in with an account from an identity provider.">
Got it
</message>
<message name="IDS_SIGNIN_ERROR_DIALOG_MORE_DETAILS_BUTTON" desc="The button text on the error dialog for the user to get more details about an error that has occurred in their attempt to sign in with an account from an identity provider." translateable="false">
More details
</message>
<message name="IDS_SIGNIN_GENERIC_ERROR_DIALOG_SUMMARY" desc="Summary of generic error upon user failing to sign in with an account from an identity provider." translateable="false">
<message name="IDS_SIGNIN_GENERIC_ERROR_DIALOG_SUMMARY" desc="Summary of generic error upon user failing to sign in with an account from an identity provider.">
Can't continue with <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE">%1$s<ex>idp.example</ex></ph>
</message>
<message name="IDS_SIGNIN_GENERIC_ERROR_DIALOG_DESCRIPTION" desc="Description of generic error upon user failing to sign in with an account from an identity provider." translateable="false">
<message name="IDS_SIGNIN_GENERIC_ERROR_DIALOG_DESCRIPTION" desc="Description of generic error upon user failing to sign in with an account from an identity provider.">
Something went wrong
</message>
<message name="IDS_SIGNIN_UNAUTHORIZED_CLIENT_ERROR_DIALOG_SUMMARY" desc="Summary of unauthorized client error upon user failing to sign in with an account from an identity provider.">
<ph name="SITE_ETLD_PLUS_ONE">%1$s<ex>rp.example</ex></ph> can't continue using <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE">%2$s<ex>idp.example</ex></ph>
</message>
<message name="IDS_SIGNIN_UNAUTHORIZED_CLIENT_ERROR_DIALOG_DESCRIPTION" desc="Description of unauthorized client error upon user failing to sign in with an account from an identity provider.">
This option is unavailable right now.
</message>
<message name="IDS_SIGNIN_INVALID_REQUEST_ERROR_DIALOG_SUMMARY" desc="Summary of invalid request error upon user failing to sign in with an account from an identity provider.">
<ph name="SITE_ETLD_PLUS_ONE">%1$s<ex>rp.example</ex></ph> can't continue using <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE">%2$s<ex>idp.example</ex></ph>
</message>
<message name="IDS_SIGNIN_INVALID_REQUEST_ERROR_DIALOG_DESCRIPTION" desc="Description of invalid request error upon user failing to sign in with an account from an identity provider.">
This option is unavailable right now.
</message>
<message name="IDS_SIGNIN_ACCESS_DENIED_ERROR_DIALOG_SUMMARY" desc="Summary of access denied error upon user failing to sign in with an account from an identity provider.">
Check that you chose the right account
</message>
<message name="IDS_SIGNIN_ACCESS_DENIED_ERROR_DIALOG_DESCRIPTION" desc="Description of access denied error upon user failing to sign in with an account from an identity provider.">
Check if the selected account is supported.
</message>
<message name="IDS_SIGNIN_SERVER_ERROR_DIALOG_SUMMARY" desc="Summary of server error upon user failing to sign in with an account from an identity provider.">
Check your internet connection
</message>
<message name="IDS_SIGNIN_SERVER_ERROR_DIALOG_DESCRIPTION" desc="Description of server error upon user failing to sign in with an account from an identity provider.">
If you're online but this issue keeps happening, you can try other ways to continue on <ph name="SITE_ETLD_PLUS_ONE">%1$s<ex>rp.example</ex></ph>.
</message>
<message name="IDS_SIGNIN_TEMPORARILY_UNAVAILABLE_ERROR_DIALOG_SUMMARY" desc="Summary of temporarily unavailable error upon user failing to sign in with an account from an identity provider.">
Try again later
</message>
<message name="IDS_SIGNIN_TEMPORARILY_UNAVAILABLE_ERROR_DIALOG_DESCRIPTION" desc="Description of temporarily unavailable error upon user failing to sign in with an account from an identity provider.">
<ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE">%1$s<ex>idp.example</ex></ph> isn't available right now.
</message>
<message name="IDS_SIGNIN_ERROR_DIALOG_MORE_DETAILS_PROMPT" desc="Prompt user to get more details about an error that has occurred in their attempt to sign in with an account from an identity provider.">
<ph name="BEGIN_LINK">&lt;link_more_details&gt;</ph>Get more information<ph name="END_LINK">&lt;/link_more_details&gt;</ph> from <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE">%1$s<ex>idp.example</ex></ph>.
</message>
<message name="IDS_SIGNIN_ERROR_DIALOG_TRY_OTHER_WAYS_PROMPT" desc="Prompt user to try other ways of signing in after an error has occurred in their attempt to sign in with an account from an identity provider.">
You can try other ways to continue on <ph name="SITE_ETLD_PLUS_ONE">%1$s<ex>rp.example</ex></ph>.
</message>
<message name="IDS_SIGNIN_ERROR_DIALOG_MORE_DETAILS_RETRY_PROMPT" desc="Prompt user to get more details about an error if it continues to occur after their first attempt to sign in with an account from an identity provider.">
If this issue keeps happening, <ph name="BEGIN_LINK">&lt;link_more_details&gt;</ph>get more information<ph name="END_LINK">&lt;/link_more_details&gt;</ph> from <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE">%1$s<ex>idp.example</ex></ph>.
</message>
<message name="IDS_SIGNIN_GENERIC_ERROR_DIALOG_MORE_DETAILS_PROMPT" desc="Prompt user to get more details about a generic error that has occurred in their attempt to sign in with an account from an identity provider.">
<ph name="BEGIN_LINK">&lt;link_more_details&gt;</ph>More details<ph name="END_LINK">&lt;/link_more_details&gt;</ph>
</message>
<message name="IDS_SIGNIN_ERROR_DIALOG_TRY_OTHER_WAYS_RETRY_PROMPT" desc="Prompt user to try other ways of signing in after an error if it continues to occur after their first attempt to sign in with an account from an identity provider.">
If this issue keeps happening, you can try other ways to continue on <ph name="SITE_ETLD_PLUS_ONE">%1$s<ex>rp.example</ex></ph>.
</message>
<message name="IDS_VERIFY_SHEET_TITLE_AUTO_REAUTHN" desc="Header for verify sheet for auto re-authentication.">
Signing you in…
</message>
@ -5817,10 +5786,10 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
Always use secure connections
</message>
<message name="IDS_SETTINGS_HTTPS_FIRST_MODE_SUMMARY" desc="Secondary, continued explanation of HTTPS-First Mode in settings.">
Upgrade navigations to HTTPS and warn you before loading sites that dont support it
Use HTTPS whenever possible and get warned before loading sites that dont support it
</message>
<message name="IDS_SETTINGS_HTTPS_FIRST_MODE_WITH_ADVANCED_PROTECTION_SUMMARY" desc="Secondary, continued explanation of HTTPS-Only Mode in Security settings when the user can't change the setting">
Upgrade navigations to HTTPS and warn you before loading sites that dont support it. You cant change this setting because you have Advanced Protection enabled.
Use HTTPS whenever possible and get warned before loading sites that dont support it. You cant change this setting because you have Advanced Protection enabled.
</message>
<!-- Auto-darken web content -->
@ -5993,6 +5962,9 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_PASSWORD_GENERATION_BOTTOM_SHEET_USE_PASSWORD_BUTTON" desc="Appears on the button, which reflects the user agreement to user the generated strong password.">
Use password
</message>
<message name="IDS_PASSWORD_GENERATION_BOTTOM_SHEET_USE_PASSWORD_BUTTON_CONTENT" desc="The string is announced by the TalkBack service, when the field containing the generated password is focused.">
Use password <ph name="PASSWORD">%1$s</ph>
</message>
<message name="IDS_PASSWORD_GENERATION_BOTTOM_SHEET_DISMISS_BUTTON" desc="Appears on the button, which reflects that the user has rejected the proposed generated password and decided to continue with creating their own password.">
Create my own
</message>
@ -6000,45 +5972,18 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
Please wait…
</message>
<!-- Read Aloud ("Listen to this page") player strings -->
<message name="IDS_READALOUD_CLOSE_PLAYER_BUTTON_CONTENT_DESCRIPTION" desc="Accessibility string for the button that closes the 'Listen to this page' player.">
Tap to close “Listen to this page”.
<!-- Add username dialog -->
<message name="IDS_ADD_USERNAME_DIALOG_TITLE" desc="Title of the dialog, which proposes the user to add a username when the password is being automatically saved and the username could not be captured.">
Add your username
</message>
<message name="IDS_READALOUD_PLAYER_NAME" desc="Name of the Read Aloud player for accessiblity.">
“Listen to this page” player.
<message name="IDS_ADD_USERNAME_DIALOG_ADD_USERNAME" desc="The positive button caption for the user to save the username entered in the dialog. The dialog is displayed when the password is being automatically saved and the username could not be captured.">
Add username
</message>
<message name="IDS_READALOUD_PLAYER_OPENED_AT_FULL_HEIGHT" desc="Accessibility string spoken when the 'Listen to this page' player bottom sheet expands to its full height.">
“Listen to this page” player opened at full height.
<message name="IDS_ADD_USERNAME_DIALOG_CANCEL" desc="The negative button caption in the dialog. The dialog is displayed when the password is being automatically saved and the username could not be captured.">
Cancel
</message>
<message name="IDS_READALOUD_PLAYER_MINIMIZED" desc="Accessibility string spoken when the 'Listen to this page' player bottom sheet shrinks to its minimized height.">
“Listen to this page” player minimized.
</message>
<message name="IDS_READALOUD_CHROME_NOW_PLAYING" desc="Text in 'Listen to this page' player appearing before the title of the currently playing page.">
Thorium now playing
</message>
<message name="IDS_READALOUD_REPLAY" desc="Accessibility string for the button that rewinds 'Listen to this page' playback by the specified number of seconds.">
Back <ph name="NUMBER_OF_SECONDS">%1$s<ex>10</ex></ph> seconds
</message>
<message name="IDS_READALOUD_FORWARD" desc="Accessibility string for the button that seeks 'Listen to this page' playback forward by the specified number of seconds.">
Forward <ph name="NUMBER_OF_SECONDS">%1$s<ex>30</ex></ph> seconds
</message>
<message name="IDS_READALOUD_PLAY" desc="Accessibility string for the 'Listen to this page' play button.">
Play
</message>
<message name="IDS_READALOUD_PAUSE" desc="Accessibility string for the 'Listen to this page' pause button.">
Pause
</message>
<message name="IDS_READALOUD_SPEED_MENU_BUTTON" desc="Accessibility string for the 'Listen to this page' playback speed menu button.">
Playback speed: <ph name="PLAYBACK_SPEED">%1$s<ex>1.0</ex></ph>. Click to change.
</message>
<message name="IDS_READALOUD_OPTIONS_MENU_BUTTON" desc="Accessibility string for the 'Listen to this page' options menu button.">
More options
</message>
<message name="IDS_READALOUD_PLAYBACK_ERROR" desc="Message displayed when an error occured during 'Listen to this page' playback.">
Playback is unavailable for this page.
</message>
<message name="IDS_READALOUD_PLAYBACK_LOADING" desc="Message displayed when 'Listen to this page' playback is buffering.">
Loading…
<message name="IDS_ADD_USERNAME_DIALOG_TEXT" desc="The content of the dialog explaining the user the purpose of the dialog.">
To help Google Password Manager save your sign-in info, add your username for this site
</message>
<!-- Touch To Fill No Passkeys Sheet -->
@ -6063,6 +6008,11 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_NO_PASSKEYS_SHEET_USE_ANOTHER_DEVICE" desc="Label for the button that allows users to starts a flow allowing them to use a passkey from another device to sign into ths site.">
Use another device
</message>
<!-- Plus Address accessibility strings: TODO(crbug.com/1467623): Replace with final versions -->
<message name="IDS_PLUS_ADDRESS_BOTTOM_SHEET_CONTENT_DESCRIPTION" desc="Accessibility string read when the plus address bottom sheet is opened." is_accessibility_with_no_ui="true">
Lorem Ipsum
</message>
</messages>
</release>
</grit>

View file

@ -1,4 +1,4 @@
// Copyright 2023 The Chromium Authors and Alex313031
// Copyright 2024 The Chromium Authors and Alex313031
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

View file

@ -38,12 +38,15 @@
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/send_tab_to_self/send_tab_to_self_bubble.h"
#include "chrome/browser/ui/tabs/organization/tab_organization_service.h"
#include "chrome/browser/ui/tabs/organization/tab_organization_service_factory.h"
#include "chrome/browser/ui/tabs/organization/tab_organization_session.h"
#include "chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_keyed_service.h"
#include "chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_service_factory.h"
#include "chrome/browser/ui/tabs/tab.h"
#include "chrome/browser/ui/tabs/tab_enums.h"
#include "chrome/browser/ui/tabs/tab_group.h"
#include "chrome/browser/ui/tabs/tab_group_model.h"
#include "chrome/browser/ui/tabs/tab_model.h"
#include "chrome/browser/ui/tabs/tab_strip_model_delegate.h"
#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
#include "chrome/browser/ui/tabs/tab_utils.h"
@ -217,34 +220,6 @@ DetachedWebContents::DetachedWebContents(
DetachedWebContents::~DetachedWebContents() = default;
DetachedWebContents::DetachedWebContents(DetachedWebContents&&) = default;
///////////////////////////////////////////////////////////////////////////////
// Tab
// An object to own a WebContents that is in a tabstrip, as well as other
// various properties it has.
class TabStripModel::Tab : public TabBase<content::WebContents> {
public:
explicit Tab(std::unique_ptr<content::WebContents> content)
: TabBase<content::WebContents>(std::move(content)) {}
// Changes the WebContents that this Tab tracks.
std::unique_ptr<content::WebContents> ReplaceWebContents(
std::unique_ptr<content::WebContents> contents);
WebContents* web_contents() { return contents(); }
void WriteIntoTrace(perfetto::TracedValue context) const {
auto dict = std::move(context).WriteDictionary();
dict.Add("web_contents", contents());
dict.Add("pinned", pinned());
dict.Add("blocked", blocked());
}
};
std::unique_ptr<content::WebContents> TabStripModel::Tab::ReplaceWebContents(
std::unique_ptr<content::WebContents> contents) {
return ReplaceContents(std::move(contents));
}
// Holds all state necessary to send notifications for detached tabs.
struct TabStripModel::DetachNotifications {
DetachNotifications(WebContents* initially_active_web_contents,
@ -323,6 +298,30 @@ void TabStripModel::RemoveObserver(TabStripModelObserver* observer) {
observers_.RemoveObserver(observer);
}
int TabStripModel::GetIndexOfTab(TabHandle tab_handle) const {
const TabModel* tab_model = tab_handle.Get();
if (tab_model == nullptr) {
return kNoTab;
}
const auto is_same_tab = [tab_model](const std::unique_ptr<TabModel>& other) {
return other.get() == tab_model;
};
const auto iter =
std::find_if(contents_data_.cbegin(), contents_data_.cend(), is_same_tab);
if (iter == contents_data_.cend()) {
return kNoTab;
}
return iter - contents_data_.begin();
}
TabHandle TabStripModel::GetTabHandleAt(int index) const {
CHECK(ContainsIndex(index));
return contents_data_[index]->GetHandle();
}
bool TabStripModel::ContainsIndex(int index) const {
return index >= 0 && index < count();
}
@ -357,7 +356,7 @@ std::unique_ptr<content::WebContents> TabStripModel::ReplaceWebContentsAt(
TabStripSelectionChange selection(GetActiveWebContents(), selection_model_);
WebContents* raw_new_contents = new_contents.get();
std::unique_ptr<WebContents> old_contents =
contents_data_[index]->ReplaceWebContents(std::move(new_contents));
contents_data_[index]->ReplaceContents(std::move(new_contents));
// When the active WebContents is replaced send out a selection notification
// too. We do this as nearly all observers need to treat a replacement of the
@ -431,7 +430,7 @@ std::unique_ptr<DetachedWebContents> TabStripModel::DetachWebContentsImpl(
for (auto& observer : observers_) {
observer.OnTabWillBeRemoved(
contents_data_[index_at_time_of_removal]->web_contents(),
contents_data_[index_at_time_of_removal]->contents(),
index_at_time_of_removal);
}
@ -450,7 +449,7 @@ std::unique_ptr<DetachedWebContents> TabStripModel::DetachWebContentsImpl(
UngroupTab(index_at_time_of_removal);
std::unique_ptr<Tab> old_data =
std::unique_ptr<TabModel> old_data =
std::move(contents_data_[index_at_time_of_removal]);
contents_data_.erase(contents_data_.begin() + index_at_time_of_removal);
@ -477,7 +476,7 @@ std::unique_ptr<DetachedWebContents> TabStripModel::DetachWebContentsImpl(
}
}
auto owned_contents = old_data->ReplaceWebContents(nullptr);
auto owned_contents = old_data->ReplaceContents(nullptr);
auto* contents = owned_contents.get();
return std::make_unique<DetachedWebContents>(
index_before_any_removals, index_at_time_of_removal,
@ -500,8 +499,8 @@ void TabStripModel::SendDetachWebContentsNotifications(
TabStripModelChange::Remove remove;
for (auto& dwc : notifications->detached_web_contents) {
remove.contents.push_back({dwc->contents, dwc->index_before_any_removals,
dwc->remove_reason, dwc->id});
remove.contents.emplace_back(dwc->contents, dwc->index_before_any_removals,
dwc->remove_reason, dwc->id);
}
TabStripModelChange change(std::move(remove));
@ -646,9 +645,10 @@ WebContents* TabStripModel::GetWebContentsAt(int index) const {
int TabStripModel::GetIndexOfWebContents(const WebContents* contents) const {
for (size_t i = 0; i < contents_data_.size(); ++i) {
if (contents_data_[i]->web_contents() == contents)
if (contents_data_[i]->contents() == contents) {
return i;
}
}
return kNoTab;
}
@ -709,9 +709,10 @@ void TabStripModel::CloseWebContentsAt(int index, uint32_t close_types) {
bool TabStripModel::TabsAreLoading() const {
for (const auto& data : contents_data_) {
if (data->web_contents()->IsLoading())
if (data->contents()->IsLoading()) {
return true;
}
}
return false;
}
@ -749,7 +750,7 @@ int TabStripModel::GetIndexOfLastWebContentsOpenedBy(const WebContents* opener,
continue;
break;
}
opener_and_descendants.insert(contents_data_[i]->web_contents());
opener_and_descendants.insert(contents_data_[i]->contents());
last_index = i;
}
return last_index;
@ -780,8 +781,7 @@ void TabStripModel::SetTabBlocked(int index, bool blocked) {
return;
contents_data_[index]->set_blocked(blocked);
for (auto& observer : observers_)
observer.TabBlockedStateChanged(contents_data_[index]->web_contents(),
index);
observer.TabBlockedStateChanged(contents_data_[index]->contents(), index);
}
int TabStripModel::SetTabPinned(int index, bool pinned) {
@ -1344,6 +1344,9 @@ bool TabStripModel::IsContextMenuCommandEnabled(
delegate()->CanMoveTabsToWindow(indices);
}
case CommandOrganizeTabs:
return true;
case CommandFollowSite:
case CommandUnfollowSite: {
std::vector<int> indices = GetIndicesForCommand(context_index);
@ -1508,7 +1511,7 @@ void TabStripModel::ExecuteContextMenuCommand(int context_index,
std::vector<int> indices = GetIndicesForCommand(context_index);
DCHECK(indices.size() == 1);
Browser* browser =
chrome::FindBrowserWithWebContents(GetWebContentsAt(indices.front()));
chrome::FindBrowserWithTab(GetWebContentsAt(indices.front()));
UserNotesController::InitiateNoteCreationForTab(browser, indices.front());
break;
}
@ -1560,6 +1563,16 @@ void TabStripModel::ExecuteContextMenuCommand(int context_index,
break;
}
case CommandOrganizeTabs: {
base::RecordAction(UserMetricsAction("TabContextMenu_OrganizeTabs"));
const Browser* const browser =
chrome::FindBrowserWithTab(GetWebContentsAt(context_index));
TabOrganizationService* const service =
TabOrganizationServiceFactory::GetForProfile(profile_);
service->StartRequest(browser);
break;
}
case CommandFollowSite: {
base::RecordAction(UserMetricsAction("DesktopFeed.FollowSite"));
FollowSites(GetIndicesForCommand(context_index));
@ -1675,6 +1688,9 @@ bool TabStripModel::ContextMenuCommandToBrowserCommand(int cmd_id,
case CommandCloseTab:
*browser_cmd = IDC_CLOSE_TAB;
break;
case CommandOrganizeTabs:
*browser_cmd = IDC_ORGANIZE_TABS;
break;
default:
*browser_cmd = 0;
return false;
@ -1829,7 +1845,8 @@ int TabStripModel::InsertWebContentsAtImpl(
// since the old contents and the new contents will be the same...
WebContents* active_contents = GetActiveWebContents();
WebContents* raw_contents = contents.get();
std::unique_ptr<Tab> data = std::make_unique<Tab>(std::move(contents));
std::unique_ptr<TabModel> data =
std::make_unique<TabModel>(std::move(contents));
data->set_pinned(pin);
if ((add_types & ADD_INHERIT_OPENER) && active_contents) {
if (active) {
@ -2018,7 +2035,7 @@ bool TabStripModel::CloseWebContentses(
WebContents* TabStripModel::GetWebContentsAtImpl(int index) const {
CHECK(ContainsIndex(index))
<< "Failed to find: " << index << " in: " << count() << " entries.";
return contents_data_[index]->web_contents();
return contents_data_[index]->contents();
}
TabStripSelectionChange TabStripModel::SetSelection(
@ -2064,8 +2081,7 @@ TabStripSelectionChange TabStripModel::SetSelection(
// if the user backgrounds an audible tab.
if (selection.old_contents &&
selection.old_contents->IsCurrentlyAudible()) {
Browser* browser =
chrome::FindBrowserWithWebContents(selection.old_contents);
Browser* browser = chrome::FindBrowserWithTab(selection.old_contents);
DCHECK(browser);
browser->window()->MaybeShowFeaturePromo(
feature_engagement::kIPHTabAudioMutingFeature);
@ -2160,8 +2176,8 @@ void TabStripModel::MoveWebContentsAtImpl(int index,
CHECK_LT(index, static_cast<int>(contents_data_.size()));
CHECK_LT(to_position, static_cast<int>(contents_data_.size()));
std::unique_ptr<Tab> moved_data = std::move(contents_data_[index]);
WebContents* web_contents = moved_data->web_contents();
std::unique_ptr<TabModel> moved_data = std::move(contents_data_[index]);
WebContents* web_contents = moved_data->contents();
contents_data_.erase(contents_data_.begin() + index);
contents_data_.insert(contents_data_.begin() + to_position,
std::move(moved_data));
@ -2224,7 +2240,7 @@ void TabStripModel::AddToNewGroupImpl(const std::vector<int>& indices,
if (!group_model_)
return;
DCHECK(!base::Contains(contents_data_, new_group, &Tab::group));
DCHECK(!base::Contains(contents_data_, new_group, &TabModel::group));
group_model_->AddTabGroup(new_group, absl::nullopt);
// Find a destination for the first tab that's not pinned or inside another
@ -2393,8 +2409,8 @@ absl::optional<tab_groups::TabGroupId> TabStripModel::UngroupTab(int index) {
// Update the tab.
contents_data_[index]->set_group(absl::nullopt);
for (auto& observer : observers_) {
observer.TabGroupedStateChanged(
absl::nullopt, contents_data_[index]->web_contents(), index);
observer.TabGroupedStateChanged(absl::nullopt,
contents_data_[index]->contents(), index);
}
// Update the group model.
@ -2421,8 +2437,8 @@ void TabStripModel::GroupTab(int index, const tab_groups::TabGroupId& group) {
}
contents_data_[index]->set_group(group);
for (auto& observer : observers_) {
observer.TabGroupedStateChanged(
group, contents_data_[index]->web_contents(), index);
observer.TabGroupedStateChanged(group, contents_data_[index]->contents(),
index);
}
group_model_->GetTabGroup(group)->AddTab();
@ -2480,7 +2496,7 @@ int TabStripModel::SetTabPinnedImpl(int index, bool pinned) {
}
for (auto& observer : observers_) {
observer.TabPinnedStateChanged(this, contents_data_[index]->web_contents(),
observer.TabPinnedStateChanged(this, contents_data_[index]->contents(),
index);
}
@ -2570,15 +2586,15 @@ void TabStripModel::FixOpeners(int index) {
continue;
// Ensure a tab isn't its own opener.
data->set_opener(new_opener == data->web_contents() ? nullptr : new_opener);
data->set_opener(new_opener == data->contents() ? nullptr : new_opener);
}
// Sanity check that none of the tabs' openers refer |old_contents| or
// themselves.
DCHECK(!base::ranges::any_of(
contents_data_, [old_contents](const std::unique_ptr<Tab>& data) {
contents_data_, [old_contents](const std::unique_ptr<TabModel>& data) {
return data->opener() == old_contents ||
data->opener() == data->web_contents();
data->opener() == data->contents();
}));
}

View file

@ -1,4 +1,4 @@
// Copyright 2023 The Chromium Authors and Alex313031
// Copyright 2024 The Chromium Authors and Alex313031
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

View file

@ -1,4 +1,4 @@
// Copyright 2023 The Chromium Authors and Alex313031
// Copyright 2024 The Chromium Authors and Alex313031
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

View file

@ -1,4 +1,4 @@
// Copyright 2023 The Chromium Authors, Alex313031, and gz83
// Copyright 2024 The Chromium Authors, Alex313031, and gz83
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@ -543,7 +543,8 @@ bool Tab::OnMousePressed(const ui::MouseEvent& event) {
}
bool Tab::OnMouseDragged(const ui::MouseEvent& event) {
controller_->ContinueDrag(this, event);
// TODO: ensure ignoring return value is ok.
std::ignore = controller_->ContinueDrag(this, event);
return true;
}

View file

@ -1,4 +1,4 @@
// Copyright 2023 The Chromium Authors and Alex313031
// Copyright 2024 The Chromium Authors and Alex313031
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@ -1454,7 +1454,6 @@ void TabStrip::AddSelectionFromAnchorTo(Tab* tab) {
void TabStrip::CloseTab(Tab* tab, CloseTabSource source) {
const absl::optional<int> index_to_close =
tab_container_->GetModelIndexOfFirstNonClosingTab(tab);
if (index_to_close.has_value())
CloseTabInternal(index_to_close.value(), source);
}
@ -1613,11 +1612,32 @@ void TabStrip::MaybeStartDrag(
TabSlotView::ViewType::kTabGroupHeader);
drag_context_->MaybeStartDrag(source, event, original_selection);
has_reported_tab_drag_metrics_ = false;
}
TabSlotController::Liveness TabStrip::ContinueDrag(
views::View* view,
const ui::LocatedEvent& event) {
// We enter here when dragging really happens.
// Note that `MaybeStartDrag()` is invoked as soon as mouse pressed.
if (!has_reported_tab_drag_metrics_) {
base::TimeTicks drag_time = base::TimeTicks::Now();
if (mouse_entered_tabstrip_time_.has_value()) {
UmaHistogramMediumTimes("TabStrip.Dragging.TimeFromMouseEntered",
drag_time - mouse_entered_tabstrip_time_.value());
}
tab_drag_count_30min_++;
tab_drag_count_5min_++;
if (last_tab_drag_time_.has_value()) {
UmaHistogramLongTimes("TabStrip.Dragging.TimeFromLastDrag",
drag_time - last_tab_drag_time_.value());
}
last_tab_drag_time_ = drag_time;
has_reported_tab_drag_metrics_ = true;
}
return drag_context_->ContinueDrag(view, event);
}
@ -1651,11 +1671,12 @@ void TabStrip::OnMouseEventInTab(views::View* source,
// Record time from cursor entering the tabstrip to first tap on a tab to
// switch.
if (mouse_entered_tabstrip_time_.has_value() &&
!has_reported_time_mouse_entered_to_switch_ &&
event.type() == ui::ET_MOUSE_PRESSED && views::IsViewClass<Tab>(source)) {
UMA_HISTOGRAM_MEDIUM_TIMES(
"TabStrip.TimeToSwitch",
base::TimeTicks::Now() - mouse_entered_tabstrip_time_.value());
mouse_entered_tabstrip_time_.reset();
has_reported_time_mouse_entered_to_switch_ = true;
}
}
@ -1860,6 +1881,25 @@ void TabStrip::Init() {
// So we only get enter/exit messages when the mouse enters/exits the whole
// tabstrip, even if it is entering/exiting a specific Tab, too.
SetNotifyEnterExitOnChild(true);
tab_drag_count_timer_5min_ = std::make_unique<base::RepeatingTimer>(
FROM_HERE, base::Minutes(5),
base::BindRepeating(
[](TabStrip* tab_strip) {
base::UmaHistogramCounts100("TabStrip.Dragging.Count5Min",
tab_strip->tab_drag_count_5min_);
tab_strip->tab_drag_count_5min_ = 0;
},
base::Unretained(this)));
tab_drag_count_timer_30min_ = std::make_unique<base::RepeatingTimer>(
FROM_HERE, base::Minutes(30),
base::BindRepeating(
[](TabStrip* tab_strip) {
base::UmaHistogramCounts100("TabStrip.Dragging.Count30Min",
tab_strip->tab_drag_count_30min_);
tab_strip->tab_drag_count_5min_ = 0;
},
base::Unretained(this)));
}
void TabStrip::NewTabButtonPressed(const ui::Event& event) {
@ -1889,10 +1929,16 @@ void TabStrip::NewTabButtonPressed(const ui::Event& event) {
return;
}
}
const int tab_count = GetTabCount();
controller_->CreateNewTab();
if (event.type() == ui::ET_GESTURE_TAP)
TouchUMA::RecordGestureAction(TouchUMA::kGestureNewTabTap);
if (GetTabCount() != tab_count + 1) {
UMA_HISTOGRAM_ENUMERATION("TabStrip.Failures.Action",
TabFailureContext::kNewTabOpen,
TabFailureContext::kMaxValue);
}
}
bool TabStrip::ShouldHighlightCloseButtonAfterRemove() {
@ -2139,6 +2185,7 @@ void TabStrip::TabContextMenuController::ShowContextMenuForViewImpl(
void TabStrip::OnMouseEntered(const ui::MouseEvent& event) {
mouse_entered_tabstrip_time_ = base::TimeTicks::Now();
has_reported_time_mouse_entered_to_switch_ = false;
}
void TabStrip::OnMouseExited(const ui::MouseEvent& event) {

View file

@ -1,4 +1,4 @@
// Copyright 2023 The Chromium Authors and Alex313031
// Copyright 2024 The Chromium Authors and Alex313031
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

View file

@ -1,4 +1,4 @@
// Copyright 2023 The Chromium Authors and Alex313031
// Copyright 2024 The Chromium Authors and Alex313031
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

View file

@ -1,4 +1,4 @@
// Copyright 2023 The Chromium Authors, Alex313031 and gz83
// Copyright 2024 The Chromium Authors, Alex313031, and gz83
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

View file

@ -1,4 +1,4 @@
// Copyright 2023 The Chromium Authors and Alex313031
// Copyright 2024 The Chromium Authors and Alex313031
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

View file

@ -1,4 +1,4 @@
// Copyright 2023 The Chromium Authors and Alex313031
// Copyright 2024 The Chromium Authors and Alex313031
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@ -37,6 +37,7 @@
#include "components/variations/pref_names.h"
#include "components/variations/proto/variations_seed.pb.h"
#include "components/variations/seed_response.h"
#include "components/variations/variations_safe_seed_store_local_state.h"
#include "components/variations/variations_seed_simulator.h"
#include "components/variations/variations_switches.h"
#include "components/variations/variations_url_constants.h"
@ -336,7 +337,8 @@ VariationsService::VariationsService(
std::make_unique<VariationsSeedStore>(
local_state,
MaybeImportFirstRunSeed(client_.get(), local_state),
/*signature_verification_enabled=*/true),
/*signature_verification_enabled=*/true,
std::make_unique<VariationsSafeSeedStoreLocalState>(local_state)),
ui_string_overrider) {
DCHECK(client_);
DCHECK(resource_request_allowed_notifier_);

View file

@ -3,6 +3,7 @@
<!--
about:version template page
-->
<!-- Copyright (c) 2024 Alex313031 -->
<html id="t" dir="$i18n{textdirection}" lang="$i18n{language}">
<head>

View file

@ -1,4 +1,4 @@
// Copyright 2023 The Chromium Authors, Alex313031, and Midzer
// Copyright 2024 The Chromium Authors, Alex313031, and Midzer
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@ -197,6 +197,7 @@ bool IsAudioCodecProprietary(AudioCodec codec) {
case AudioCodec::kDTS:
case AudioCodec::kDTSXP2:
case AudioCodec::kDTSE:
case AudioCodec::kAC4:
return true;
case AudioCodec::kFLAC:
@ -266,8 +267,8 @@ bool IsAV1Supported(const VideoType& type) {
}
bool IsMPEG4Supported() {
#if BUILDFLAG(IS_CHROMEOS_ASH)
return true;
#if BUILDFLAG(IS_CHROMEOS) && BUILDFLAG(USE_PROPRIETARY_CODECS)
return base::FeatureList::IsEnabled(kCrOSLegacyMediaFormats);
#else
return false;
#endif
@ -324,9 +325,10 @@ bool IsDefaultSupportedVideoType(const VideoType& type) {
#endif
switch (type.codec) {
case VideoCodec::kTheora:
return IsBuiltInVideoCodec(type.codec);
case VideoCodec::kH264:
case VideoCodec::kVP8:
case VideoCodec::kTheora:
case VideoCodec::kMPEG2:
return true;
case VideoCodec::kAV1:
@ -372,6 +374,7 @@ bool IsDefaultSupportedAudioType(const AudioType& type) {
case AudioCodec::kGSM_MS:
case AudioCodec::kALAC:
case AudioCodec::kMpegHAudio:
case AudioCodec::kAC4:
case AudioCodec::kUnknown:
return false;
case AudioCodec::kDTS:
@ -395,7 +398,7 @@ bool IsDefaultSupportedAudioType(const AudioType& type) {
bool IsBuiltInVideoCodec(VideoCodec codec) {
#if BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS)
if (codec == VideoCodec::kTheora)
return true;
return base::FeatureList::IsEnabled(kTheoraVideoCodec);
if (codec == VideoCodec::kVP8)
return true;
#if BUILDFLAG(USE_PROPRIETARY_CODECS)

View file

@ -1,4 +1,4 @@
// Copyright 2023 The Chromium Authors, Alex313031, and Midzer
// Copyright 2024 The Chromium Authors, Alex313031, and Midzer
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@ -425,10 +425,10 @@ bool AVCodecContextToAudioDecoderConfig(const AVCodecContext* codec_context,
}
#endif
// Verify that AudioConfig.bits_per_channel was calculated correctly for
// Verify that AudioConfig.bytes_per_channel was calculated correctly for
// codecs that have |sample_fmt| set by FFmpeg.
DCHECK_EQ(av_get_bytes_per_sample(codec_context->sample_fmt) * 8,
config->bits_per_channel());
DCHECK_EQ(av_get_bytes_per_sample(codec_context->sample_fmt),
config->bytes_per_channel());
return true;
}

View file

@ -1,4 +1,4 @@
# Copyright 2023 The Chromium Authors and Alex313031
# Copyright 2024 The Chromium Authors and Alex313031
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
@ -71,6 +71,10 @@ declare_args() {
# on-device decoding and bitstream passthrough as supported by device.
enable_platform_ac3_eac3_audio = proprietary_codecs
# Enables AC4 audio handling in chromium. This includes demuxing,
# on-device decoding and bitstream passthrough as supported by device.
enable_platform_ac4_audio = proprietary_codecs
enable_platform_mpeg_h_audio = proprietary_codecs
# Enables DTS/DTSX audio handling in chromium. This includes demuxing,
@ -143,6 +147,8 @@ assert(!enable_hls_demuxer || proprietary_codecs,
"proprietary_codecs required for enable_hls_demuxer")
assert(!enable_platform_ac3_eac3_audio || proprietary_codecs,
"proprietary_codecs required for enable_platform_ac3_eac3_audio")
assert(!enable_platform_ac4_audio || proprietary_codecs,
"proprietary_codecs required for enable_platform_ac4_audio")
assert(!enable_platform_mpeg_h_audio || proprietary_codecs,
"proprietary_codecs required for enable_platform_mpeg_h_audio")
assert(!enable_mse_mpeg2ts_stream_parser || proprietary_codecs,
@ -220,7 +226,7 @@ declare_args() {
declare_args() {
# Enables host verification for CDMs.
# Windows and Mac.
enable_cdm_host_verification = is_chrome_branded
enable_cdm_host_verification = is_chrome_branded && !is_chrome_for_testing_branded
# Enable Storage ID which is used by CDMs. This is only available with chrome
# branding, but may be overridden by other embedders.
@ -234,9 +240,13 @@ declare_args() {
alternate_cdm_storage_id_key = ""
}
assert(!enable_cdm_host_verification || is_mac || target_os == "win",
assert(!enable_cdm_host_verification || is_mac || is_win || target_os == "win",
"CDM host verification is only supported on Mac and Windows.")
# https://crbug.com/1475137#c37
assert(!is_chrome_for_testing_branded || !enable_cdm_host_verification,
"Chrome for Testing is incompatible with CDM Host Verification.")
# Default |mojo_media_services| and |mojo_media_host| on various platforms. See
# comments below for valid values. Can be overridden by gn build arguments from
# the --args command line flag.
@ -250,6 +260,7 @@ if (is_cast_media_device) {
_default_mojo_media_services = [
"cdm",
"audio_decoder",
"audio_encoder",
"video_decoder",
]
_default_mojo_media_host = "gpu"

View file

@ -1,4 +1,4 @@
// Copyright 2023 The Chromium Authors, Alex313031, qcasey and icepie
// Copyright 2024 The Chromium Authors, Alex313031, qcasey and icepie
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@ -188,7 +188,7 @@ void NativeThemeGtk::OnThemeChanged(GtkSettings* settings,
ui::NativeTheme::GetInstanceForNativeUi()->set_preferred_color_scheme(CalculatePreferredColorScheme());
ui::NativeTheme::GetInstanceForNativeUi()->NotifyOnNativeThemeUpdated();
// Brute force Web to update
// Brute force Web Contents to update
ui::NativeTheme::GetInstanceForWeb()->set_use_dark_colors(color_utils::IsDark(window_bg_color));
ui::NativeTheme::GetInstanceForWeb()->set_preferred_color_scheme(CalculatePreferredColorScheme());
ui::NativeTheme::GetInstanceForWeb()->NotifyOnNativeThemeUpdated();

View file

@ -77,6 +77,7 @@ enable_vr = true
enable_platform_hevc = true
enable_hevc_parser_and_hw_decoder = true
enable_platform_ac3_eac3_audio = true
enable_platform_ac4_audio = true
enable_platform_dolby_vision = true
enable_platform_encrypted_dolby_vision = true
enable_platform_mpeg_h_audio = true